代码写得越多,程序员就能当王者?| 技术头条
作者 | 郭芮
出品 | CSDN(ID:CSDNnews)
程序员是不是从业时间越久,代码水准就越高?同理论之,是不是写得代码越多,编程技术就越高?——关于这一点,本文有话说。
近日,Hacker News 上的一篇文章引起了开发者的热烈关注。
在其博文《Programming:doing it more vs doing it better(编程数量和质量如何抉择?)》中,作者 Kevin Martin Jose 就以一则小故事为引,发表了自己关于“代码质量VS代码数量”的认识,并直言“编写更多代码并不会让你成为更好的程序员”!
以下内容节选自他的博客:
几年前我刚开始学习编程时,听到过一个故事:
一位陶瓷老师在开学当天宣布,他将把班级同学分为两组:一部分人将仅根据他们制作的作品数量进行评分,另一部分则仅依靠其质量。他的规则很简单:在课程的最后一天,他会带上秤来评定“数量”组的学习成果——五十磅重的罐子评为“A”,四十磅的评为“B”,依此类推。然而,那些以“质量”为衡量标准的同学只要能做出最完美的一个罐子就可以获得“A”。
然后,评分结果出现了:最高质量的作品都是由数量组同学产生的!看来,虽然数量组一直忙着制作成堆的作品,但是却一直从错误中吸取教训并不断改进;而质量组只有完美的理论知识,却没有能力实现最终的努力成果。
——这就是杰夫阿特伍德的观点:“数量永远胜过质量”。
这个小故事对我的软件工程工作产生了巨大的影响。
我一直确信,在软件工程方面做得更好的最好方法就是编写更多软件。我小心翼翼,努力编写可读、可维护的代码,避免任何错误。然而,其实我内心深处最希望的是,有一天我能够不假思索地编写出很漂亮的代码,就像呼吸一样毫不费力。 重构代码是新手们才需要烦恼的事儿,而我,这个已经能够生产出足够陶瓷罐的人,是不会被困扰的。
因此,我一直在制作陶瓷罐,直到将来某一天我能够到达那个水平。
不过三年后,我仍然处在学徒水准。我不仅没有学会毫不费力地编程,反而学会了如何成为一名“合格”的编程人员:我会更彻底地检查我的代码以避免重构;每次我的PUSH请求经过另一轮审查时我都会感到内疚和失望;当新功能延迟两天发布时我就会显得很沮丧——作为一名合格的工程师,我只想要尽可能快地制作出正确的功能。
但是今天,我偶然发现的一篇文章改变了一直以来的想法:
曾经有学生们向我吹嘘他们写论文的速度有多快,我就会告诉他们,伟大的德国小说家托马斯曼说,作家是一个比其他人更难写作的人。最好的作家写得比其他人要慢得多,而且写得越好,写作就越慢。詹姆斯·乔伊斯写了 20 世纪最伟大的小说《尤利西斯》,但每天只写了大约一百字。
——William Deresiewicz,《孤独与领导》。
这些话给我造成了很大的冲击,我甚至强烈地预感到,我经常反复阅读我写的东西然后不断修改,其实归根到底只是在重复这个过程,事实上,我没有任何进步!虽然将我与“最优秀的作家”相提并论有点滑稽,但其实我也注意到了,往往我写得越慢的时候,代码质量就写得越好。
软件工程中往往需要遵循这些规则:
- 更多地考虑系统的设计;
- 可以自由重构;
- 需要进行彻底测试;
- 项目慢慢进行。
是的,当你有实际的业务目标需要尽快达成时,这些要求几乎是不可能实现的。但是,正如詹姆斯·乔伊斯没有说过“我们要在圣诞节之前发货!”,好的工程项目也需要长期以来一直的努力——毕竟,慢工出细活。
这对我有什么影响?之前的观念不复存在,编写更多的软件并不会让我成为更好的程序员。
对于编程“Quantity vs Quality(数量 vs 质量)”的争议,开发者们也进行了热烈的讨论。
@kragen:
一个已经编程了三年的人仍然是初学者水准?不过基于他文章中的内容,作者肯定比我刚编程三年时厉害多了。
对于我这个从事了 38 年编程工作的人来说,我确实发现很多编程的东西都很容易,但这并不意味着我只是付出了时间却没有给到足够的思考。我说的容易只是相对的,并不意味着我编写的代码就不需要重构。也许我的设计比以前更好了,但通常是因为我通过重构不断在进步。
作者提到了有时候自己项目完成的不好也会感到焦虑和内疚,我认为这就是最大的改进:只要其他人愿意给你反馈,对自身而言就是非常快速的改进方法。当然,有时候不可避免地会被分配到一些没挑战性的任务,其实辩证地看,它会促使你避免风险,并推动其他人不要求你做你能力极限的事情。
@sinuhe69:
我想有一个词可以阐明这些轶事:刻意练习。
无数的文献和研究指出,单纯重复性的努力不会带来太大的改善,但找出不足并针对性的实践,则是实现最佳表现的最佳方式,无论是在运动、音乐还是其他领域。就像想要学习象棋的人一样,每次只是玩很多,每天都会缓慢地提高他的水平,但是在一段时间之后就会遭遇瓶颈。相反,寻求指导、学习和练习来修复弱点并完善技术的人将在相同的时间内大大改善。我觉得在编程和软件工程领域应该不会有所不同。
编写数千个草率游戏的人可能已经学会了如何更快地(也许更好地)完成它们,但他仍然没有学到更多关于复杂系统或安全系统的知识。只有通过深入的学习和实践,他才能有效地掌握这些东西。
@jondubois:
迄今为止,我生命中一半以上的时间都用在了编程上——我已经有接近 16 年的经验了。没错,我也一直和作者一样在密集编程:我在大学学习软件工程,之前还在学校时写游戏,然后我在 14 家不同的公司工作(包括一些创业公司,分处 10 个不同的行业,以至少 7 种不同的编程语言完成的项目)。我也一直在晚上和周末做些小项目,大多是开源的。
我对陶瓷事件的看法很复杂,因为我确实遇到过一些长时间编码并产生大量代码的人,质量并不高。要编写高质量的代码,不仅需要具备适应性,还要接触到许多不同类型的项目和管理文化。
另外,最令人沮丧的是,通常证明自己需要一整年的时间。由于这种影响,我们的行业目前处于不利状态。与一些可用的替代方案相比,许多流行的大型技术堆栈都是平庸的,因此存在很多错误的信息和错误的炒作。
而大多数有权做出招聘决定的人都不够擅长编码,所以优秀的程序员往往会被大多数的工作压力搞到窒息......
那么身为程序员的你,会如何选择两者的平衡呢?