糟糕程序员的编程风格
有一种说法是,“一个伟大的程序员相当于10个平庸的程序员”。没有人愿意被贴上了糟糕程序员的标签,但一个可悲的事实是,很多开发人员没有意识到他们自己就属于这一群体。没有人愿意问自己:我是一个糟糕的开发人员吗?
糟糕的开发人员
如果你还是编程新手,并且担心自己编写的是糟糕的代码,那么可能你还不是高手。不过,你也不用因此灰心丧气,因为只要你不是无可救药的,那就都还有改进的余地。
首先让我们先来了解关于糟糕的开发人员的两种主要类型:
- 牛仔/女程序员(为了阅读方便,后面我会统称“牛仔”来指代这种类型)
- 平庸的开发人员
从本质来看,这两者是相同的,但是它们通常表现出不同的行为。
牛仔程序员
牛仔程序员会毁掉一个团队,他们喜欢单枪匹马的做项目,并且项目往往都很短命。
那些从来没有受到过任何编写可用代码的指导,自学成才的程序员通常会有成为牛仔程序员的危险,并且很多优秀的,有经验的程序员有可能在他们的编码职业生涯的初期,就是一个牛仔程序员。那么,什么是牛仔程序员的关键属性呢?
1.编码速度非常快
通常,这种类型的不良开发者开发新功能的速度要远远快过平均值,然而,不幸的是,那么不懂代码的人,因此会认为这些“快枪手”很牛掰(这只会进一步让这些牛仔程序员在自我膨胀的道路上越走越远)。这类开发人员在独自工作的时候最佳,在客户对时间要求特别紧迫只要尽快实现功能的时候最适合。
牛仔程序员编码速度非常快——这意味着,他们的代码没有对可维护性有任何规划。所以这就会导致……
2.凌乱、不可读的代码
快速代码设计创建出来的项目常常会乱得一塌糊涂(或者更确切地说,他们就没有进行代码设计)。这种混乱的代码,通常被称为“意大利面条式代码”,这指的是它的形状,而不是味道。意大利面条式代码难于理解,并且通常没有必要那么庞大和复杂,从而导致了其他人难于理解程序员的所作所为,因此这种代码通常是维护的噩梦。这意味着如果有人不幸和一个牛仔程序员一起工作,那么整体生产力就会大幅度下降。
凌乱的代码会导致……
3.Bug,无处不在的bug
如果一家公司的软件在变大和变得更加复杂之后,他们的代码仍然是一堆意大利面条,那么它就会成为一个等待爆炸的定时炸弹。在最坏的情况下,其后果甚至会像丰田汽车意外加速一样严重。众所周知,丰田汽车召回是一场灾难。
更重要的是,意大利面条式代码是不可扩展的。这意味着如果增加新功能,那么这种代码就像行走在雷区上——不知道什么时候,就会爆炸。这通常是因为牛仔程序员将每个功能都混合在一起,于是任何变化都可能会破坏软件。如果有更好的代码设计和/或单元测试,或许就能阻止这种情况,但是,牛仔程序员不在乎他们的代码是否是可用的,也不想编写测试(因为需要时间)。更甚者,从糟糕的设计决策衍生出的代码结构方式,通常是不可测试的,甚至是无法调试的。在牛仔程序员身上,还有一种常见的情况是,在他们迅速“修复”一些bug的同时,创造出了更多的bug。因此他们总是感觉很忙,就像英勇的消防员,疲于到处灭火。
总而言之,每一个糟糕开发人员创造的bug和错误都会导致消耗生产力。哪怕刚开始的时候,他们看上去很牛,总是能按时完成其他开发人员不敢轻易允诺的编码任务,但是这是以各种意外错误频频降临为代价的,而这原本可以通过优秀开发人员的精心设计和简洁代码编程扼杀在襁褓中。
如果你超过80%的开发时间都花在了调试自己的代码上,并且调试过程像一场噩梦的话(即这边解决了一个bug,那边又出来了另一个bug),那么说明代码库不佳,并且你需要改进你的代码。
自大
有的牛仔程序员并不坏,因为他们只是根据管理/客户不可能的期限要求,才生产出了意大利面条式代码(但是,那些重视自己代码的开发人员会选择离开这样的公司或拒绝这样的客户)。很多初学者和初级开发人员是因为没有编码计划,因而生产出了一堆有bug的代码,但有时是因为他们缺乏问题的经验,从而做出了错误的决定。
这些初学者通过接受来自于资深的优秀的开发者的指导,是可以改正的。但是,如果他们的身边尽是和他们一样或平庸的开发人员,那么他们就会陷入自我感觉良好的错觉中。
只要你愿意为自己的错误承担责任,只要你愿意从错误中学习,那么你就不算是一个糟糕的开发人员。
使得这些程序员变得糟糕的最重要的属性,是自大。
糟糕的程序员认为他们的代码是完美的,只会归咎于是客户的愚蠢导致了程序的崩溃,而不是反思——为什么他们做的软件会崩溃。牛仔程序员通常是自私的开发者,因为他们不会对那些不得不为他们“擦屁股”的开发人员抱有一丝同情心。
更为重要的是,这些自大的程序员总是认为自己的智力高人一等,总是自认为别人没有注释不行,总是认为那些不明白他们代码的人是因为太愚蠢,但从来不曾想想为什么大家不理解他们的代码。这种一直坚定不移地认为他们自己是对的,总是认为自己高人一等的结果就是,没有与人好好沟通就自作主张地构建了可能会给团队带来很多问题和麻烦的功能。还有的人由于(毫无正当理由地)深信自己的代码更好,因而有时候甚至会回避“最佳做法”或“标准”。
最糟的是,糟糕的程序员都不愿意听别人说教,不愿意从错误中学习,因为他们不承认他们犯了错误,正如前面提到的,他们通常会推卸责任。
请注意,这并不意味着牛仔程序员在现实中就是难相处或低智商的人——也许他们就是你遇到过的最和蔼亲切的人——但是,在他们面对批评的时候,却有着一种根深蒂固的自大和不愿意承担过错责任的心态。
平庸的开发者
这里我指的平庸意味着“不能胜任”。在某些方面,平庸的开发者比牛仔程序员更糟,因为他们知道自己不能够胜任,却不愿意去努力,满足于停留在技能阶梯的底层。
不像牛仔程序员,平庸的开发者通常对编程缺乏兴趣,因此在理解编程概念方面有困难。他们需要很长的时间来创建一些东西,同时生产的代码欠佳并且充满问题。他们通常对编码毫无没有激情/兴趣可言,他们在学习新技术时进展缓慢,或通常没有实际的操作经验。
也许平庸的开发者不像牛仔程序员那样具有破坏性,这是因为他们处在一个团队中,但他们绝对不会为团队带来任何好处,并且他们提出的解决办法总是劣于优秀的开发人员(他们常常会因为错误的决策,导致满是bug/低效的代码)。
关于平庸的开发者,我就不再多说什么了。最差的估计是,他们可能会拖累整个团队,最好的情况是,他们勉勉强强也算是在最后期限内完成了任务。
问题的核心
促使开发者盘踞“糟糕”宝座的核心是因为他们缺乏成为一个更好的程序员的愿望。糟糕的程序员对目前的行为方式感到满意和舒适。更糟的是,牛仔程序员和平庸的程序员通常自认为知道那些其实他们不知道的东西。
更重要的是,糟糕程序员往往对学习新事物不感兴趣,因此不会有意地去改进自己。
这也是为什么在糟糕程序员的代码上经常可以发现大量复制&粘贴的东西,因为他们基本上不会去搞清楚为什么有些地方这些代码奏效而有些地方不奏效。复制&粘贴本身并不是坏事,但只有在下面这些情况下:
- 你知道你正在在做什么(很多糟糕的开发人员会自以为他们知道自己在做什么)
- 确信复制&粘贴的代码会有效工作
- 只用于测试/检验
糟糕的开发者通常只会复制粘贴StackOverflow代码,而不是去理解它,或者调整解决方案以匹配他们自己的代码。
此外,那些始终坚持所谓的“最佳做法”而不去理解为什么这些做法会被认为是“最好”的程序员也可以被归类为糟糕的程序员。
总而言之,也许你并不需要知道一个大型的复杂框架的每一个细节的工作原理。但是,你至少应该弄清楚你使用的部分是如何工作的。
糟糕的程序员从来不会从自己的错误中吸取教训,要么是因为不承认他们犯了错误,要么是因为他们缺乏学习的欲望,要么两者皆有。
每个人都会犯错,每个程序员都会制造bug,这没有什么大不了。但是,如果你总是在重复相同的错误,那就意味着你是一个不学习的糟糕的开发者。
优秀的开发人员
经过漫谈有关与糟糕开发者的相关特征,你可能对是什么造就了优秀开发人员已经有了一个模糊的想法。优秀的开发人员是开发队伍的中坚力量,并且他们通常具有以下特征。
有着一种山外有山人外有人的谦逊认识,愿意为错误承担责任,从错误中学习,写出的代码是可读的、结构化的、经过可靠设计的、可被轻松调试的,努力理解事物的工作原理,和团队中的其他人有着良好的沟通/协作,虚心接受批评和开放对待不同的方法,保持学习新技术的心态,乐于解决问题等等。
的确,关于何为高质量代码是很难衡量的(这就是为什么我没有将它包含在特征中,但是这确实是组成开发人员“优秀”的一个重要方面)。
那么我们怎么知道自己写的代码是否良好呢?请看漫画中的完美解释。
真正优秀的开发人员
下面这两种类型的开发人员,才是真正能够帮助团队的开发人员:
- MVP
- 乐于助人的开发人员
MVP
MVP型开发者不希望只是简单地解决问题,他们会努力寻找解决问题的最佳方法。他们能应付挑战,因此在困难的任务面前总是表现出色——这也是为什么MVP型开发者比大多数开发人员更富有生产力的原因。正是由于这种爱挑战的冒险心态,所以如果雇主分配给他们的工作太容易或太平庸的话,可能会留不住他们,因为一旦他们感到厌倦的话,可能就会选择离开。
由于MVP型开发者对自己工作的自豪感,因此他们常常会在质量和性能上吹毛求疵。事实上,他们会考虑很多边缘情况,在发生之前就仔细斟酌。在某些情况下,他们是自己的QA工程师,会在用户之前先检验自己的代码。他们不会因为所谓的“最佳实践”,就盲目地去做TDD,但是他们会设计程序,从而大大减少调试的时间。因此,一个MVP型程序员的生产效率至少是一个糟糕程序员的10倍。
MVP型开发者有着强烈的好奇心,会不惜一切代价地去寻找事物“为什么”工作或不工作的原因。他们会花很多时间来阅读有关编程的内容,以便于跟上新技术,但却不会随大流,因为他们更感兴趣的是靠自己去找出问题的根源。他们非常热爱编码,所以经常在业余时间编程,或者是捣鼓业务项目,或者是尝试新的技术、工具和语言。
最后,MVP型开发者自信且谦逊,因为他们始终牢记,三人行必有我师,他们喜欢和更优秀的人才一起合作,因为他们能从这些更好的开发人员身上学习。
总结
要想成为一个优秀的,甚至是伟大的开发人员,最重要的因素是自己。也许这需要天赋和一种真正与生俱来的激情,才能成为顶尖的程序员,但只要对编程有兴趣,任何人都可以是一个“好”的程序员。如果你不想成为一个优秀的程序员,那么没有人,可以帮你实现。你才是自己最大的敌人和对手,你的目标应该始终是成为一个比现在更好的程序员。
译文链接:http://原网站已经失效/article/bad-programming-style.html
英文原文:Everything you need to know about bad programming styles
翻译作者:码农网 – 小峰