编程巨星的唯一秘诀
在软件的所有法则之前,在软件的目的之前,在软件设计科学本身之前,有一个单一的事实决定了软件开发者的成功或失败。这个事实区分了似乎能在一天内掌握新语言的高级工程师和挣扎十年只为挣薪水、编程他人设计且从未改进到足以获得晋升的初级开发者。它区分了糟糕的程序员和优秀的程序员,优秀的程序员和伟大的程序员,以及伟大的程序员和那些凭借技能建立了数十亿美元帝国的“摇滚明星”程序员。
这并不复杂,也不是难以知晓的事情。它不是只有天生具备特殊才能或“编程魔法能力”的人才能做到的事情。个人的天性并不决定他们是否会成为优秀的程序员或糟糕的程序员。
只有一个单一的事实:你对所做的事情理解得越好,你就会做得越好。
摇滚明星程序员对他们所做的事情的理解远远优于普通或平庸的程序员。仅此而已。
要成为优秀的程序员,你只需要完全理解你所做的事情。
有些人可能会说他们已经理解了一切。测试在于他们是否能应用它。他们是否构建了维护起来令人愉悦的优美架构系统?他们是否以几乎让普通程序员难以想象的速度解决编程问题?当被求助时,他们是否用简单的概念清晰地解释一切?那么他们就是优秀的程序员,他们理解得很好。
然而,比相信他们“无所不知”更常见的是,许多程序员(包括我自己)常常感觉像是被锁在一场与压倒性信息海洋的史诗般的战斗中。有太多要知道的东西,一个人 literally 可以花余生学习,却仍然只掌握所有计算机知识数据的90%。
在这场史诗般的战斗中的秘密武器,计算知识的Excalibur,就是理解。你对领域最基础层次理解得越好,学习下一层次就越容易。你对那一层次理解得越好,再下一层次就会更容易,依此类推。然后,一旦你从最基础的简单性走到了最高级的复杂性,你可以重新开始,并惊人地发现在最底层还有更多要知道的东西。
这似乎简单得不像真的,但事实确实如此。成为优秀程序员的道路就是完全和彻底的理解,从深刻掌握基础开始,逐步发展到对最先进数据的牢固控制。
我不会骗你——这有时是一条漫长的道路。但它是值得的。在道路的尽头,你可能会发现自己突然成为那个令人惊叹的高级工程师,每个人都来寻求建议。你可能是那个解决一切问题并被所有同行钦佩的不可思议的程序员。你甚至可能成为一个“摇滚明星”,拥有数百万美元和极其成功的产品。谁知道呢?我不能告诉你该做什么或成为什么。我只能指出一些我发现真实且有价值的信息。你用它做什么取决于你自己。
-Max
评论
Antonio Marcus 说: 2009年11月10日下午3:50
他们还必须真正热爱他们的手艺。承认吧,他们热爱它。他们以它为生,呼吸它。这是他们的全部存在。哈哈。但是是的,理解更多……以及理解软件行业的游戏……真的对摇滚明星有贡献。
回复
jolie 说: 2009年11月10日下午5:37
很好。比很好更多。天才!!!!!!!!!!!!!
回复
Max Kanat-Alexander 说: 2009年11月11日晚上10:30
谢谢!-Max
回复
Tbee 说: 2009年11月11日凌晨3:08
我完全同意;这就是为什么我相信编译器和操作系统内部是任何软件开发教育中最重要的课程之一。因为真正理解你的代码最终是如何执行的(知道触发器可能有点太详细),最终指令如何分配内存,字节如何通过网络传输……每一段代码都归结到那个层次,一旦你理解它是如何工作的,就很容易将不同的方法映射到那个基础知识上。
不幸的是,大多数教育都在取消这种“原始”课程,转而支持例如GUI设计技术。也相关,当然,但不是代替。
回复
Max Kanat-Alexander 说: 2009年11月11日晚上10:30
是的,知道计算机如何工作很重要。我想当我进入开发世界时,我有那个优势,因为在那之前我做了很长时间的IT。但还有更重要的基础,这是我下一篇博客要谈论的事情。-Max
回复
Fred 说: 2009年11月11日中午12:11
等等……存在维护起来令人愉悦的优美架构系统吗?有人能用简单的概念清晰地解释某事吗?!哇,我想我知道我的位置了。
回复
Max Kanat-Alexander 说: 2009年11月11日晚上10:29
哈哈哈,别害怕,我的朋友。很少有人能创建这样的系统或做这样的解释——这就是我首先有这个博客的原因之一!-Max
回复
Vladimir Dzhuvinov 说: 2009年11月27日下午2:58
我过去11年一直在编程。
在这一点上,我可以说:
- 是的,经验确实重要
- 我现在写得更好、更漂亮的代码,但尽管如此,整体上我并没有变得显著更有效
- 编程并没有变得更容易
回复
Max Kanat-Alexander 说: 2009年11月27日下午3:03
嗯,哇。我实际上发现编程变得更容易了——至少,我 consistently 变得更快了。我认为在一个领域待了很长时间后,开始有点停滞是容易的——我经常回去阅读软件开发的基础和原则,只是看看我能从基础中学到更多。当然,我总是尝试学习新技术,等等,我认为这甚至帮助了我对已知技术的理解和能力。-Max
回复
Vladimir Dzhuvinov 说: 2009年11月27日晚上10:36
也许,我应该写“工作并没有变得更容易”。
我现在可能是一个更好的程序员。但我仍然会制造bug。我仍然会对我的决定产生巨大的怀疑时刻。我有时仍然必须非常努力地思考。我变得 more laid back,但工作整体上肯定没有变得放松。
我有这个项目,我想为 businesses 创建一个组织平台,运行起来很像社交网络,基于对等协调和报酬。程序编译并运行稳定。但就为潜在用户工作而言,它仍然不能令人满意。我了解到,这是工作程序的最终衡量标准。不是bug数量或是否构建。所以现在我正在进行重写,希望下次我能做得更好。
回复
Max Kanat-Alexander 说: 2010年11月4日晚上11:12
好的,我完全明白你的意思。也许发生的是,你很好地学习了编程的事实,但没有学习足够的软件设计背后的理论。当你对编程本身(编程语言、算法等)了解很多时,你可以制作很多有效的程序,但如果不了解软件设计的基本理论,总会有一些新情况难以理解且难以摆脱。
我认为处理软件的一个问题是,它如此复杂,以至于一个程序员需要一生或更长时间才能通过自己的工作推导出所有软件设计的法则。最终,在某种程度上,我们必须从他人的理论和经验中学习,尽管当然我们仍然必须用自己的判断来决定什么是对错。-Max
回复
Ape 说: 2010年6月12日凌晨2:52
每个程序员都应该理解什么是寄存器,以及它是如何使用的。有些人甚至到了用简单的电门和时钟东西构建寄存器的程度。
即使是像Java这样的语言,虽然不直接与CPU寄存器接口,但在幕后使用了一种形式的寄存器。
更高级的用户应该被介绍不同类型的寄存器。我最喜欢的是循环寄存器。它让我着迷,因为它由于考虑函数和参数的常见局部性而保持空间的方式是高效的。
回复
Max Kanat-Alexander 说: 2010年6月12日中午12:44
我同意程序员应该理解什么是寄存器,他们应该理解计算机在底层如何工作。然而,我也要警告开发者,在用高级语言编写或设计时,不要花太多时间思考计算机如何工作。花太多时间担心计算机如何工作往往会导致过早优化。
我实际上不知道循环寄存器是什么,Google也没有太大帮助。能 enlighten 我吗?-Max
回复
notarockstar 说: 2016年8月22日晚上11:44
我不同意,我从未需要知道或使用寄存器……这是为了吹嘘和愚蠢的面试测试。或在博客评论中吹嘘。
摇滚明星程序员努力工作, consistent,不介意做无聊的事情,能 retain 很多,是的,他们可能学得快或有很好的记忆力,但先生,那是遗传……
摇滚明星程序员在项目经理愚蠢或玩政治时继续前进,摇滚明星程序员更慢,因为他们不走捷径来 impress 老板,摇滚明星程序员 often 不被认可也不被奖励。“天生极客”
回复
Darth Continent 说: 2010年9月10日凌晨3:54
我从做PC网络过渡到.NET和SQL开发,我同意低级知识不是软件开发的核心要求。然而,它有时可能会有帮助。
有时,我在IT世界其他领域的知识派上了用场。我能够 rescue 一些 already focused on some task 的同事,他们 overlook 了对我来说明显但对他们 unclear 的事情, mainly because they were intent on solving the problem, but also because the nature of that problem slipped under their troubleshooting radar.
我认识一些开发者,他们 embrace 并 fluent in 高级设计和架构方面,比如WCF服务,但不知道命令提示符是什么。虽然表面上这些似乎无关,但如果WCF服务被控制台应用程序客户端使用,而创建者将 blame 放在服务上呢?帮助你更好地理解和做你试图做的事情,如你所建议的,包括了解你编码的平台及其各种子系统。
发人深省的帖子!已 bookmark。
回复
Max Kanat-Alexander 说: 2010年11月4日晚上11:39
是的,谢谢你,我完全同意你关于所有这些事情!!你完全 spot on,这些是 exactly 为什么拥有广泛的知识很重要的优秀例子!我也是从IT领域出来的,作为开发者,我总是 shocked 于一些程序员并不真正深刻理解计算机实际如何工作,或真实人们有什么样的IT情况。-Max
回复
florin 说: 2011年7月26日上午7:02
标题 misleading。文章以及随后的对话指向三个基本要求:理解好,执行好,沟通好。嘿,难以抵抗 catchy。
回复
Max Kanat-Alexander 说: 2011年7月26日晚上9:53
你知道,你的观点 interesting,但我实际上 disagree。虽然我同意所有这些事情都是重要的事情要做(对于“沟通好”,在团队环境中比独自一人更重要,但它仍然可以重要),我会说优秀的执行来自优秀的理解。这就是文章的重点。所以它真的只是理解是唯一的秘密。-Max
回复
florin 说: 2011年7月27日上午7:24
Max,我再次 disagree。
根据定义,摇滚明星全是关于在特定受众中的 popularity。如果你闪耀却没有人能看到,你更可能是 hidden gem。因此摇滚明星需要有效地“沟通”他/她的 awesomeness。我猜这就是你通过这个博客做的事情。更多时间“理解”摇滚明星领域会让你到达那里。双关 intended。
回复
Max Kanat-Alexander 说: 2011年7月27日晚上11:51
嗨 Florin。你误解了上下文中的“摇滚明星”一词。短语“摇滚明星程序员”是一个习语。这里的第二个定义适用:http://www.urbandictionary.com/define.php?term=Rockstar%20Programmer
回复
matt 说: 2011年7月26日中午12:40
Google搜索是摇滚明星编程的秘密。
回复
Max Kanat-Alexander 说: 2011年7月26日晚上9:53
哈哈哈!至少,这 certainly 是我获得许多理解的方式。
回复
Alessandro 说: 2011年7月26日晚上7:00
我热爱编程,但我 struggle to come out with a good code。我1999年毕业于计算机科学。这里的大学,在巴西,不是那么好,当你开始在一些公司工作时,你意识到计算的基础,你根本没有,正在让你成为一个平庸的程序员。我学习了ASP、ASP.NET、HTML、JavaScript、C#、Java、PHP、Actionscript、PLSQL、TSQL,但没有做出真正伟大的代码。只是基于某人 engineered 的框架的CRUD-like系统。我正在考虑离开编程,尝试项目管理或软件需求。当我的 some friends 交付惊人的软件,并且以 fast fashion 时,我被迷住了。我不知道我是否能 recover 在编程上失去的时间。也许我以错误的方式做了事情,我不知道。但我 sure 那是 frustrating。抱歉我的 poor english。好文章,Max。
回复
Max Kanat-Alexander 说: 2011年7月26日晚上9:55
那 so interesting,Alessandro!我正在写一本书,我认为可以帮助你的情况。这本书叫 Code Simplicity,应该在今年晚些时候出版。我认为,如果你想成为一个真正伟大的程序员,最重要的事情之一是回去真正很好地理解基础。如果有什么 way back when 你没有 quite “get”,回去尝试真正理解那件事,直到你 fully get it,可以非常有价值。不只是“哦我 sort of get this and I think I could copy it into my code,”而是真的,完全理解它。我有一个测试我的理解是“如果别人问我,我能向别人解释这个吗?”那不是理解的唯一测试(有时你 just know that you “got” it),但它可以是一个有帮助的。-Max
回复
Alessandro 说: 2011年7月27日凌晨3:55
Max,基础是什么?现在,你会说: shame on you,Alessandro!我同意。哪些概念或书籍可以 rebirth 一个程序员?摇滚明星编码器是如何锻造的?谢谢,Max!我在等你的书!
回复
编程巨星的唯一秘诀 – The Singular Secret of the Rockstar Programmer « huanghuangde 说: 2011年8月7日下午4:42
[…] 我不会骗你——这有时是一条漫长的道路。但它是值得的。在道路的尽头,你可能会发现自己突然成为那个令人惊叹的高级工程师,每个人都来寻求建议。你可能是那个解决一切问题并被所有同行钦佩的不可思议的程序员。你甚至可能成为一个“摇滚明星”,拥有数百万美元和极其成功的产品。谁知道呢?我不能告诉你该做什么或成为什么。我只能指出一些我发现真实且有价值的信息。你用它做什么取决于你自己。(来源)[…]
回复
编程巨星的唯一秘诀 - 神仙岛 说: 2011年8月7日下午6:39
[…] 八 8 业界科技 本文是从 The Singular Secret of the Rockstar Programmer […]
回复
外刊IT评论:编程巨星的唯一秘诀 | 重剑无锋 说: 2011年8月9日晚上9:56
[…] The Singular Secret of the Rockstar Programmer […]
回复
成为编程巨星的唯一秘诀 | 众里寻“她” 说: 2011年8月11日下午5:39
[…] 本文是从《The Singular Secret of the Rockstar Programmer》这篇文章翻译而来。译文来自外刊IT评论《编程巨星的唯一秘诀》。[…]
回复
wangmeng 说: 2011年8月16日上午7:52
it’s truth ! i like this article
回复
Rongqi Fan 说: 2011年8月19日上午6:22
但这篇文章没有告诉我们如何理解问题。
我认为最重要的事情是高效理解问题的方式。
回复
Mike W. 说: 2017年7月24日下午1:44
对于初学者,你应该知道你在所选语言中使用的_每一个_符号和标记在该语言中的实际含义。
我最喜欢的例子是shell脚本中的引用(单引号和双引号)。大多数编写shell脚本的人没有意识到,通过NOT使用引号,他们正在调用单词分割和全局扩展,当那根本不是他们 intended 的行为时。https://unix.stackexchange.com/q/131766/135943
回复
Michael 说: 2011年11月18日晚上7:34
虽然学习计算机如何在低级执行你的指令有优势,特别是对于系统和微控制器编程,但最好的程序员更 consistently 拥有的技能是抽象问题复杂性 away 并在更高层次解决问题的能力。好的程序员让事情对自己容易,因为当你必须一次在头脑中保持大量状态时,你会犯导致bug的错误。提供好的抽象也使你的代码更容易被他人维护和扩展。
正如一位发帖人也提到的,经验 matters。我与领域中最优秀和最聪明的人一起工作(免责声明:我是Google的软件工程师),我想不出一个在这里编码少于十年的人。我自己已经编码19年——我生命的大部分时间。没有替代投入时间和编写代码。阅读书籍不是编写代码的替代品。阅读他人的代码可以教你宝贵的教训并给你 insights,但除非你编写代码使用它们,否则它们会 quickly fade。
最终,编码是一个直观的过程。掌握不是来自从书籍或他人学习规则和模式,而是来自内化解决问题所需的思维模式,到你可以 without thinking 设计大多数解决方案的程度。过了一段时间,你 just know how to do it。是编写真实代码和解决真实问题的实践让你到达那里。
回复
mars 说: 2012年4月23日凌晨2:52
max,好文章!
你对所做的事情理解得越好,你就会做得越好。
享受它,更好地理解它,并成为摇滚明星程序员!
回复
Plabmedia.com » 一个程序员的自白——成为一位身家百万程序员的秘密 说: 2012年7月20日上午7:46
[…] 来源:The Singular Secret of the Rockstar Programmer […]
回复
Aragorn Young 说: 2013年12月2日凌晨12:34
同意并 badly 同意!这就是我近年来理解的编程。非常感谢你总结它!
回复
抛弃jQuery:Why? | 易鸣 说: 2014年12月21日下午5:09
[…] the better you will do it.对所做的事情理解越深,你就会做的越好。——引自 The Singular Secret of the Rockstar Programmer / […]
回复
1p – The Singular Secret of the Rockstar Programmer – Exploding Ads 说: 2015年2月16日晚上8:48
[…] http://www.codesimplicity.com/post/the-singular-secret-of-the-rockstar-programmer/ […]
回复
抛弃jQuery:Why? | @wizcabbit 说: 2015年4月7日晚上7:09
[…] the better you will do it. 对所做的事情理解越深,你就会做的越好。 ——引自 The Singular Secret of the Rockstar Programmer / […]
回复
Softbiz Solutions 说: 2016年4月19日凌晨1:29
人们