一个多月前,我刚开始担任软件开发人员的第一份工作。我所学到的有关OOP,SOLID,DRY,YAGNI,设计模式,SRP等的所有信息都可以扔到窗外。

他们使用C#.NET Webforms并使用很少有外部类,绝对不能称为对象。他们确实使用自定义控件并重复使用它们。关于使用的唯一对象是实体框架。他们为每个客户端重用代码隐藏。他们有400行长的方法来处理所有类型的工作。对于新客户,他们选择aspx和aspx.cs并剥离客户代码,然后开始添加新的特定于客户的代码。

他们的第一个借口是增加了额外的维护,并且更多的代码是更多维护。这是一家包括我在内的三个开发商的小商店。一个开发人员拥有30多年的经验,而另一个则拥有20多年的经验。一个曾经是游戏开发人员,另一个曾经一直使用C和C ++工作。

这在软件行业中有多普遍?我如何确保自己掌握OOP和相关原则?我在业余时间进行练习,我觉得我真的需要在一个经验丰富的开发人员下工作,以更好地进行OOP。

评论

我已经打开了关于聊天标题的讨论:chat.stackexchange.com/transcript/message/40126879#40126879请加入我。

评论不作进一步讨论;此对话已移至聊天。

#1 楼


您在问题中引用的原则就是……原则。它们不是命令,法律或命令。
提出这些原则的人非常聪明,但他们不是绝对的权威。他们只是提供见解和指导的人。


没有“正确”的编程方法。事实证明,我们的“接受”方式已经随着时间的流逝而发生了根本的变化,并且还在不断变化。
发货通常比“正确”的方法优先。这是一种非常普遍的做法,它的名字叫:技术债务。
一些常用的软件体系结构并不理想。最佳实践正在从大型的整体应用程序发展为松散耦合的模块集合。
上下文很重要。只有当您使用大型程序或特定领域时,许多架构原则才证明其价值。例如,继承对于受益于深度嵌套,紧密耦合的安排的UI层次结构和其他结构最有用。

那么,您如何遵循“正确”的路径,即原则性的路径,因此您可以从旷野走出来吗?




研究适当性而不是正确性。在软件开发中执行任何操作的“正确”方法是最有效地满足您的特定要求的方法。

研究权衡。软件开发中的一切都是一个折衷。您想提高速度还是减少内存使用量?您是想要一种只需要很少的从业人员的表达能力很强的编程语言,还是很多开发人员都知道的表达能力较低的语言?
研究永恒性。一些原则经受了时间的考验,并且将永远是相关的。类型系统是通用的。一流的功能是通用的。数据结构是通用的。
学习实用主义。务实很重要。如果您不能运输,那么数学上的纯正,水晶大教堂的建筑和象牙塔的原理就没用了。最好的软件开发人员是知道规则的人,然后知道在合理的时候如何打破规则。他们是仍然知道如何解决问题并自己思考的人。他们使用原则来告知和指导他们的选择,而不是指示他们。

编写代码。很多。在您编写大量代码并开发出如何正确应用它们的本能之前,软件设计原则是过早的优化。


评论


评论不作进一步讨论;此对话已移至聊天。

– yannis
17年9月22日在8:50

在没有指导的情况下,我可以从哪里系统地获得这些见解?

– OKer
17年9月22日在17:47

不仅要了解最佳实践是什么,而且还要了解最佳实践的切实好处。可以让您将最佳实践与适当性联系起来,还可以确保在应用最佳实践时具有最佳效果。如果您只是说最佳实践可以实现“关注点分离”,那么您可能无法确定自己正在寻找正确的方法来获取实践的好处。

– AaronLS
17-09-22在18:45

#2 楼

这并不少见。要意识到的一件事是,软件行业是极其多样化的。一些公司处于领先地位。领先的大学和创新的软件公司(甚至还有大型实验室!)以及四人帮等有福的人或团体分析了常见的做事方式和发明新的语言,机器,工具和模式的问题。新公司(通常是分拆公司)会尝试将其用于商业用途,有时会取得惊人的成功。想想Facebook或Google。我主要在运输行业(汽车和铁路)工作,经验混杂。但是它们都不在“前沿”附近。有时他们不能做到;与安全相关的软件取决于经过严格审查的工具(我们目前使用的是1990年代经过验证的C ++编译器)。有时他们没有合适的人。通常,软件是由其他领域的工程师开发的,而当软件变得越来越重要时,他们恰巧进入了公司的软件开发。不能指望他们了解或使用软件工程原理。

要考虑的另一件事是在现实世界中工程师重要的事情。从字面上看,手头的任务通常不是火箭科学。非软件公司中的头疼问题可以通过适度的软件手段解决。造就一个有用的,甚至是优秀的软件工程师的部分原因是造就一个优秀的通用工程师的部分:负责地组织和记录您的工作;合作进行良好的成本和时间估算(估算的有效性比实际成本和时间更重要!);了解您可以做什么和不能做什么。这里明显缺少的是“了解并使用最新的工具和过程”。您所描述的是一家已经建立了一套适用于他们的工具集和流程的公司。他们可能永远不会产生任何性感或非凡的东西,但它们能够满足客户的需求,足以产生稳定的收入来源。那可能就是工程学的定义;-)。

所以是的:您在大学学到的东西实际上在很多领域并不常见。想要增加一点安慰,或者增加乐观的音符。您学到的东西不应丢到窗外。您可以在日常工作中应用更好的原则,以免破坏工作。也许会有机会引入新的工具或设计模式。当旧的工作方式对同事不满意,或者他们在管理复杂性或维护方面遇到问题(创新解决的两个最致命的问题)时,机会是最好的。有机会时准备好进行改进。产生积极影响并逐步改进方法和工具;将知识传播到值得赞赏的地方。

评论


@nocomprende:没有任性……您是说普通人更普通,而不幸的是,非凡的是非凡的吗?还是说共同点不是特别好?嗯,是。

–彼得-恢复莫妮卡
17年9月21日在17:41

“在大学里学到的东西实际上在很多领域并不常见”-这似乎是关键……

–布赖恩·诺伯劳赫(Brian Knoblauch)
17年9月21日在20:16

我的意思是,软件领域像世界其他地区一样,拥有拥有全方位人才,全方位专业知识的人员,拥有全方位准备能力,各类问题的公司等等。在这些方面,软件与其他领域没有任何不同。该问题可能是在任何SE网站中提出的。

–user251748
17-09-21在20:33



“与安全相关的软件取决于经过严格审查的工具(我们目前使用的是1990年代经过验证的C ++编译器)”对我来说听起来很前沿!

– Hovercouch
17年9月21日在21:26

@ PeterA.Schneider这是一个愚蠢的笑话,说明实际上审核您的工具有多么先进。 ;)

– Hovercouch
17-09-22在19:36

#3 楼


他们使用C#.Net Webforms并执行代码中的几乎所有内容
背后的外部类非常少


那里有您的解释。如果您不知道,那么开箱即用的Web窗体代码几乎与OOP,SOLID,DRY,YAGNI,Design Patterns,SRP等完全相反。甚至几年前Microsoft的官方示例今天会让你畏缩。

Web窗体将自身推向程序流程,其中一些虚假的“事件”是由控件单击等触发的。花费大量时间进行Web表单开发的开发人员通常也似乎也不愿意离开它,这可能是因为他们花了很多时间来学习页面生命周期以及如何进行动态呈现的控件,以至于他们讨厌现在就把这些知识扔掉面对更新/更好的方法。沉没成本谬论的无意识版本。这些开发人员花了多年的时间学习如何处理Web窗体,但现在不会轻易脱离这些专业知识,因此他们谈论“维护”时间。

这在.NET Web中很常见。顺便说一句。

评论


很高兴解决技术堆栈中提到的问题

– jasonoriordan
17年9月21日在15:46

谁想要遍历20个嵌套并互相调用的类,以弄清楚选中或取消选中复选框后会发生什么?只有疯狂的人,或者认为大学教授是神的人。

–developerwjk
17年9月21日在21:41

实际上,当创建WebForm时,行业标准做法是不同的(或不存在),并且当开始采用“新的酷炫的处理方式”时,已经存在的应用程序将永远无法进行重构。这就是为什么您会看到许多WebForm代码混乱不堪的原因。编程原理与您正在使用的技术堆栈背道而驰,因此它们甚至可以应用于WebForms,Cobol,Assembly等。

– BgrWorker
17-09-22在6:52

是真的。您的ViewState有多少MB?奇怪的是,我认为服务器端控件倾向于将业务逻辑引入UI。但是,程序员总是容易犯错,因为他们很容易与asp.net的“货物狂热”编程废话放在一起。因此:太多的事件导致业务对象无法进入正确的状态。总线。由于UI耦合,对象无法互相调用。然后:哦,看莫!我们可以“断开连接”! nyuck,nyuck,nyuck。实际数据量使您的应用程序陷入停顿,因为asp.net类假装成数据库引擎。但是我们避免了磨损的连接!

– radarbob
17/09/22在7:39



所有这些骂都是对的。。。我已经看到了这篇关于WebForms应用程序的文章中描述的太多内容,这让我觉得这些应用程序比一些高中生投掷能量饮料的一些PHP脚本要好一些-它被认为是企业级软件!

– Greg Burghardt
17-09-22在20:08



#4 楼


这在软件行业中有多普遍?


很常见。这与水管工破坏您的水管,木匠运送垃圾或廉价裁缝制作不合适的西装一样普遍。也就是说,这全都是人类。这些人主要不是问题,而是通常与该公司的软件开发结构有关。例如,一家公司可能有很多实习生来开发他们的内部软件。即使这些实习生很聪明而且知识渊博,他们也只会在这里呆上几周或几个月,所有权也会经常转换。

或者在该领域中很出色的人,但不是程序员,可能会一起破解一些VBA等应用程序,因为一开始似乎很容易。否则,一个制作精良的应用程序会在维护阶段结束,所有优秀的开发人员都会继续前进,然后继续由很少了解该应用程序,没有文档的人(最坏的情况:一个)来开发它。


如何确保我始终站在OOP和相关原则之上?我在业余时间进行练习,我觉得我真的需要在更有经验的开发人员下工作,以更好地进行OOP。 />
:要么与您的老板讨论此事,并确保您进入干净的项目。如果不可能的话,找一个新老板。
或者:自己为此承担责任。这意味着您可以自己做-在您的业余时间,或者在公司中,如果可能的话,但是要靠自己(不太可能)来驱动。我向您保证不是。在家中拥有木工商店的木匠肯定会比没有木匠的木匠更好。

例如,对于某些人来说,例如深入研究Ruby之类的新语言,不仅学习语法,而且还深入学习该语言的特殊面向对象方面,这是绝对有可能的,并且会带来很多乐趣,并且真的可以深入研究。所有这些都在您的业余时间,与您的工作没有任何关系。这只是一种业余爱好,但是作为您自己的专业培训,它可能和坐在某个主要开发人员旁边并遵循他们的工作一样有效(或更有效)。然后,这将完全适合您的个人发展和您自己的乐趣。如果您没有这样做的乐趣,或者您发现自己根本无法获得任何理解,请从头开始,然后返回第一个答案。

正在培训您的首席开发人员很有可能正是以这种方式学到的东西...

评论


因此,只雇用合格,训练有素且热心的人来做……好吧,什么都可以。我们为什么不这样做呢?这就引出了一个问题:没有资格,没有受过良好训练,没有热情的人们应该如何生活?查尔斯·狄更斯(Charles Dickens)报告了这一答案:如果不是那么好。

–user251748
17年9月21日在16:05

@nocomprende,您正在表达自己的观点,我并不是暗示您以任何方式写的内容。我正在解释OP注意到这一事实的原因。

– AnoE
17年9月21日在17:17



我只是一直在想着上帝保佑你的罗斯沃特先生,科特·冯内古特(Kurt Vonnegut)提出的问题:“人们到底在干什么?”

–user251748
17年9月21日在20:31

@nocomprende,如果我说的是“未经训练的人”,我并不是说人们很愚蠢,而是说无论出于何种原因,一个人从事的工作都没有经过良好的培训。经理的错很可能是他给了他错误的工作。或有情况(即同事生病),或您能想到的各种原因。与我们只应聘用优秀人才无关。如果我必须修理房屋中的管道,您可以肯定会弄得一团糟,尽管我擅长于其他方面的工作。

– AnoE
17-09-22在8:39



人类学有一个古老的观念,那就是像古埃及人这样的奴隶制社会比帮助人们“蓬勃发展”的社会少了很多人。这就是为什么资本主义比中世纪文化更好。理想情况下,每个人都可以使其蒸蒸日上,然后我们将获得每个人的全部利益,每个人也将获得社会的全部利益。资本主义还不足以确保这一点,所以我们还需要更多。有证据表明,人们做的工作少于最佳工作,因为如果资本主义是完美的,那就不会发生。

–user251748
17/09/22在15:39

#5 楼

我认为在西班牙这是一个常数,因为当开发人员在公司任职多年后,他(或她)通常会被提升到更多的管理领域,例如分析和项目管理。结果,没有同行评审,并且代码通常是由经验不足的人编写的。

这些经验丰富的人的失败永远不会得到纠正:相反,他们专注于完成工作。结果,代码中累积了越来越多的错误做法。

最终,一些聪明的驴子说,最好的“解决方案”是转换为新兴技术,该技术将生成更干净,更可维护的代码,并创建一个新的应用程序。好像技术本身可以做到那样。

再次,没有经验的程序员开始使用这种新技术,没有人审查代码,并且圈子又一次封闭了。

评论


与西班牙无关。这是彼得的原则-人们从出色的职位中提拔出来,直到他们到达自己不喜欢的职位并被困在那里为止,因为没有什么可以提拔他们的。

– Jan Hudec
17年9月21日在8:38

还有一个事实,即软件行业仍在增长,因此经验相对较少的人更多。而且许多公司根本没有经验丰富的人,因为它们是新公司,而且价格太便宜,以至于无法聘请资深人士,他们认为从大学里买来的一堆新角green就可以了,而事实却并非如此。

– Jan Hudec
17年9月21日在8:40

@JanHudec我不知道,我觉得我宁愿有一个刚从大学毕业的年轻人,而不是原始海报所谈论的那些具有20多年经验的人中的一个

–米奇鼠标
2017年9月21日9:00



@MikeyMouse,是的,很多人没有20年的经验,而是20年1年的经验。他们带来了很大的麻烦。

– Jan Hudec
17年9月21日在10:03

“ ..彼得原则..”;特别是在政府机构中,这是一种更加自觉的现象。我称其为“管理近交计划”。通常,好/坏编码者之间会保持平衡,但是当MIP强化无能时,这才是恐怖。几年后,当某些jr。程序员现在是部门负责人,他们继而不会提拔比他们更好的任何人,好人和想法会离开或被迫退出。这家商店已经成为无能的篮子。坚持与人相处的文化,在大型机上进行编程的“残余背景辐射思维定式”。

– radarbob
17年9月21日在23:31

#6 楼

您在学校学习的一些“最佳实践”在实际项目中既不实用也不具有成本效益。我注意到的最大变化之一是格式和注释。我的大多数教授都强调了广泛编写代码的重要性,但在现实世界中,好的代码通常(并非总是如此)是不言而喻的,更重要的是,许多老板不想为您付出更多的时间在编写上评论。

有时您会看到程序员迫不及待地想要使用快捷方式和反模式,而这些快捷方式和反模式所需的模板要比质量解决方案少。我注意到许多团队和项目都不愿意学习新事物。与我交谈过的许多较老的程序员的职业生涯始于软件工程的“狂野西部”时期,当时,资格考试开始并结束时就愿意编写代码。他们通常主修完全不同的领域,并在机会出现时跳入编程,很少或没有正规教育(例如,他们的雇主没有程序员,需要有人学习才能构建内部软件)。这些老式的自学成才的程序员中的一些从不努力学习现代编码实践,而是继续以他们几十年前学到的任何风格进行编码。当他们由于资历而最终负责新项目时,往往会拖延项目并损害整体代码质量。

当然,以上内容并不适用于所有较老的程序员,而新一代编码器可能同样有罪。我曾与许多年轻的程序员一起工作,他们从大学毕业就挑选了一些工具和库,然后完全停止学习。他们将下载一次IDE或库,除非他们的公司要求,否则从不对其进行更新(您有时可以根据其库的过时程度来猜测程序员毕业的那一年)。他们没有跟上所选语言的新功能,也从不学习新语言。他们不会学习新的编程策略,并且可能会滥用模式或范式,因为他们不知道更合适的选择(哦,MVC,您被滥用了多少)。随着时间的流逝,他们的工作流变得越来越过时,并且他们变得比资产更重要的是负债。或不完整的知识。不幸的是,对这两个问题的责任都可能落在老板或CTO身上,他们必须确保截止日期是切合实际的,并且员工必须掌握最新的知识和技能。如果老板对良好的编程习惯一无所知,那么您能做的最好的就是尝试建议更改,并希望他们愿意接受建议。不幸的是,他们可能倾向于相信不懂OOP并且喜欢编写10,000行类的更高级的程序员。

评论


我真的不喜欢这样的神话:好的代码是不言自明的,注释已过时。好的代码最多只能告诉您发生了什么。但是,它没有说明为什么在做某事,或者即使它是正确的。注释您的代码,以使其将来的维护者不必猜测为什么要对foo而不是bar进行修饰。

–所有工人都是必不可少的
17/09/21在13:16



我不同意你的第一段。记录代码(例如带有注释)至少和上大学时一样重要。不同之处在于,没有专业人士会评论生产线在做什么-他们会记录为什么。可以从源代码中读取正在发生的事情。为什么往往是几分钟到几小时的思考的结果。

–阿拉霍
17年9月21日在14:23



很少有理由写出代码为什么要做的事情,并且大多数时候可以用更好的方法名来解释它。面对现实吧,我们通常编写的大多数代码都很简单,不值得注释。

– BgrWorker
17年9月22日在6:57

那又如何呢?代码只写一次,然后读很多遍。撰写评论,从长远来看,您将节省时间。我猜@BgrWorker取决于人。我经常编写算法,我认为它们值得评论(最近是符号数学分析器……肯定需要评论)

–person27
17-09-22在7:14



我认为单元测试比注释更有价值。我经常看到这种情况,其中代码已更新,并且注释不再适用。在这种情况下,过时的注释会更难弄清发生了什么。单元测试记录了原始程序员的意图,如果您的CI系统在签入时运行单元测试,则您必须维护它们。

–bikeman868
17-09-22在7:38



#7 楼

一些不良的编程习惯是由于必须使用几十年前开始开发的旧版软件而导致的。如果有庞大的复杂软件,则可能无法重写所有内容。理解代码实际上正在做的一切甚至可能非常困难。最好的选择可能是在不破坏任何内容的情况下,复制有效的方法,同时尝试集成更好的编程实践。

评论


失败通常也不是一种选择。

–user251748
17/09/22在17:32

#8 楼

我认为重要的是,不仅要对错,而且要知道每一个对与错背后的原因。当您知道原因时,您可以预测后果。为什么使用这个或那个原理,不是因为在一本书中已经描述了它,而是因为我们知道它是如何帮助的以及应该打破它究竟会发生什么。如果您知道何时会发生什么,则可以权衡利弊并做出决定。这也将帮助您每次争论自己的立场。 SOLID和OOP如果使用得当,也可以减少维护。请勿过度使用。
我们的教科书和教程在某种程度上是一个大问题,因为他们经常尝试在没有正当理由的情况下推广思想。 OOP也有其缺点。许多原理和范式相互矛盾。您不需要处于最高位置,您需要使所有事情都合理,合理,优雅和简单。但是话又说回来,他们可能不是很艰巨的任务而受到信任,这些任务不需要太多的技能就可以完成,而技能较差的廉价编码员则可以降低工资。这就是经济学的原理。每个工作场所都不一样。

我了解您的感受。不要惊慌您将需要知道的信息,也许不是立即需要,但是它将为您提供帮助。也许在不同的工作场所,也许在某些场合。您还有时间可以走得更远。