成为卓越程序员的首要条件
2011年1月17日 by Max Kanat-Alexander
我研究软件设计的主要目标之一,是希望能够通过简单的教育和少量经验,将“糟糕的程序员”或普通程序员转变为优秀甚至卓越的程序员。我想知道——必须教会一个人哪些根本性的东西,才能让他成为伟大的程序员?如果有人编程多年却毫无进步,你该如何帮助他们?他们缺失了什么?
为此我写了很多相关文章,特别是在最近的一些作品中。然而,在一个人开始成为更好软件开发者的道路之前,有一个前提必须成立:要成为卓越的程序员,你首先必须想要成为卓越的程序员。任何培训都无法让不想变得卓越的人成为卓越的程序员。
如果你是对软件开发充满热情的人——或者只是喜欢做好本职工作的人——可能很难理解那些根本不想进步的人的观点。要完全理解这一点,可以想象自己尝试学习某个你个人并不想擅长的领域。
例如,虽然我钦佩运动员,喜欢踢足球,有时也喜欢观看体育比赛,但我从未渴望成为伟大的运动员。无论读多少书或接受多少教育,都无法让我成为伟大的运动员,因为我根本不想成为运动员。我甚至一开始就不会去读那些书。如果你强迫我参加一些课程或研讨会,知识一进入我的大脑就会消失,因为我根本不想了解这些数据。即使我以每天运动为生,我也会想:“唉,我对体育没有热情,所以这些信息对我根本不重要。总有一天我会做其他工作,或者退休后就不必关心了,在此之前我做这些只是因为能拿到报酬,比饿死强。”
尽管这难以想象,但当你告诉许多“糟糕”程序员应该如何或为何编写更好的代码时,他们心里正是这么想的。如果他们不是真心想成为最好的程序员,那么无论你给他们多少教育、纠正他们多少次,或者他们参加多少研讨会,他们都不会进步。
那么你该怎么做?公平地说,我可能不是最好的咨询对象——如果我要做某事,我觉得应该尽力做好。也许你能做的最好的事情就是鼓励人们遵循这个概念。你可以对他们说:“既然你反正要做,为什么不好好做呢?如果你更熟练,做这件事会不会至少更愉快?如果其他人对你的工作印象深刻,那会是什么感觉?一天结束时回家感到自己做好了某件事,会不会很好?你的生活会比现在更好吗,哪怕只是一点点?你的生活会变差吗?”
在最坏的情况下,你可以请某人列出“成为伟大程序员”的所有后果,直到他们对此感到释怀或开始以不同方式看待这个想法。你可以问他们:“如果你成为伟大的程序员会发生什么?”并不断要求更多答案,直到他们感觉好些或开始真正看到卓越的好处。你不必用正面或负面的评论回应他们的答案,只需倾听并礼貌地承认他们说的话。目的是让他们有机会真正为自己审视这种可能性,也许能自己得出一些新的有趣的结论——不是通过你告诉他们该想什么或反驳他们的答案,而是通过与你交流如果他们变得卓越会发生什么。
无论你怎么做,底线是人们必须对提升自己感兴趣才能进步。你如何让他们达到这种兴趣水平并不重要,只要他们在你浪费大量时间给他们提供他们一听就忘的教育之前达到那个水平。
-Max
评论精选
Jolie 2011年1月17日下午3:53 哇!清晰有用。事实上你可以将其推广到任何工作。很好。
Max Kanat-Alexander 回复:
谢谢!是的,我同意,这几乎适用于任何追求卓越的领域。
Ahmed 2011年1月17日下午11:13 Max,这是成为伟大程序员的优秀起点(欲望)。很多程序员有这个欲望但仍然是普通程序员,因为他们不知道道路。希望你发布一篇关于初学者成为伟大程序员的步骤的文章。我的建议是:个人项目、博客、阅读代码、每年学习新语言/框架……
Max Kanat-Alexander 回复:
谢谢Ahmed!确实,很多人想变得卓越但还没找到方法!我知道的最佳道路是我在《为什么程序员很烂》文章中概述的要点。那篇文章有很多信息,所以有些人错过了接近结尾的要点,但那些是文章最重要的部分!
目前的问题是,其中一个要点——理解软件设计的基础——几乎不可能,因为它们从未被编撰成文!所以这正是博客其他部分的主要内容,但更重要的是,这将是我正在写的一本书的主题,这样人们才能真正拥有和理解这些基础,然后继续前进。
Dale 2011年2月18日下午4:53 我觉得这令人兴奋且希望容易学习!谢谢你!
技术延伸思考
AI代理输出的质量决定因素
目前我认为AI代理能成功输出的数量和质量取决于:
- 模型质量
- 代理质量
- 输入质量(如提示或其他上下文)
- 代理能独立运行的确定性客观验证质量
除非你是模型开发者,否则目前我认为最重要的部分是“确定性客观验证”。简单来说,如果你告诉AI做某事,它需要某种方式能够自行验证是否做对了。在软件中,这通常意味着运行测试、linter等,如果系统做错了就会失败。
这意味着你的测试和验证工具越好,从模型获得的输出就越好。这不仅仅是测试数量的问题。它们必须是好的测试,具有智能断言和良好的错误信息。
这也意味着代理成功涉及如何将任务分解成可以通过自动化测试、linter等客观验证的单个部分。
需要注意的是,输入质量也很重要且在我们控制之下。如果我们编写更好的文档和更清晰的代码,代理会表现得更好。令人惊讶的是,几乎所有帮助人类编写代码的东西也能帮助代理。
技术债务的真相
认为技术债务有价值的想法大多是个神话。当你做出糟糕的软件工程决策时,它会在几小时、几天或几周内拖慢你的速度。这是上限。许多人认为需要数月或数年才能看到在软件设计上偷工减料的影响,但这根本不正确。它几乎立即开始。
做正确事的成本通常是几个小时,也许一天,而且你几乎总是立即收回那个时间。也就是说,做对事通常花费与做错事相同的时间。“等等,什么?这怎么可能?我们偷工减料是为了节省时间!”结果几乎总是它根本不会节省你的时间!它使处理变更更加困惑。它使代码审查时间更长。它在测试期间以更令人困惑的方式失败,需要更长时间调试。它几乎从未节省你的实际时间。
偶尔,你的路径上会有一些如此巨大的“岩石”,你根本无法移动它。没有人应该花三个月设计一个新工具,只是为了交付一个一次性的一天功能。但这是技术债务决策中极小极小的一部分。
这变得更加疯狂,因为如果你在过程中一切都做对(你总是重构系统,使其看起来像是被设计成现在所做的样子),那么一切在整个过程中都保持相对容易。但如果你偷工减料,一切都会变得越来越困难,直到你产生没有人能移动的“岩石”。复杂性不是某种线性的东西,你可以后来投入线性时间修复。你绝对可以让自己陷入如此糟糕的境地,以至于公司中没有人有时间或专业知识来修复它。
这一切感觉如此无辜:“让我们偷工减料吧,它将帮助我们满足这个截止日期”(这个截止日期通常是虚构的,你可以推迟几周而没有任何后果)。“很难弄清楚如何做对这件事,我们可以推迟吗?”然后砰,很快你发现自己陷入沼泽,一切都很困难,“我们不知道为什么!”
我最后留给你一件事:当我每天直接编码时,我在这方面完全 uncompromising。我基本上无法忍受糟糕的代码——我必须重构它,否则我无法工作。不知何故,在我整个职业生涯的那部分中,我从未错过一个截止日期。
网络建议的筛选原则
我估计我每看到或听到一万条坏建议,才会收到一条好建议。互联网充满坏建议,因为文明充满坏建议。文明充满坏建议,因为全球的教育大多不教人们思考、研究或确定什么是真实的。相反,它教人们 memorizing 和重复事实,其中大多数是不重要、不真实或无用的。
所以总的来说,我们不应该惊讶互联网(尤其是社交媒体)充满不重要、不真实或无用的信息。并非全部如此——我在网上学到了大量非常有用的东西。有大量有价值的内容。我会说,人们对事物的看法,无论是在报纸、博客文章、论坛还是其他什么地方,很少具有那种价值。
那么重点是什么?嗯,最好有一些方法在开始依赖或向他人重复某事之前确定它是否重要或有用的。最简单的工具是说:“它有效吗?”这条数据是否可靠地帮助你完成某事?它100%有效,还是更少?
对于许多帖子,你会发现:这些数据根本无助于你做任何事。