什么样才算是牛逼的程序员

[创客100编者按]做系统,确实不提倡“重复发明轮子”。但注意,是不提倡“重复发明”,不是不提倡“重新制造”。如果你一点不懂理论,还是应该学点的。对于系统性能的设计上,算法和数据结构就像在自己手头的钱一样,它们不是万能的,但不懂是万万不行的。

计算机科学有两类根本问题。一类是理论:算法,数据结构,复杂度,机器学习,模式识别,等等等。一类是系统:操作系统,网络系统,分布式系统,存储系统,游戏引擎,等等等等。

理论走的是深度,是在追问在给定的计算能力约束下如何把一个问题解决得更快更好。而系统走的是广度,是在追问对于一个现实的需求如何在众多的技术中设计出最多快好省的技术组合。

搞ACM的人,只练第一类。像你这样的更偏向于第二类。其实挺难得的,但很可惜的是第二类能力没有简单高效的测量考察方法,不像算法和数据结构有ACM竞赛,所以很多系统的苗子都因为缺少激励和正确引导慢慢就消隐了。

所以比尔盖茨才会说,看到现在学编程的人经常都把编程看作解各种脑筋急转弯的问题,他觉得很遗憾。

做系统,确实不提倡“重复发明轮子”。但注意,是不提倡“重复发明”,不是不提倡“重新制造”。恰恰相反的,我以为,系统的编程能力正体现在“重新制造”的能力。

能把已有的部件接起来,这很好。但当你恰好缺一种关键的胶水的时候,你能写出来吗?当一个已有的部件不完全符合你的需求的时候,你能改进它吗?如果你用的部件中有bug,你能把它修好吗?在网上繁多的类似功能的部件中,谁好谁坏?为什么?差别本质吗?一个开源代码库,你能把它从一个语言翻译到另一个语言吗?从一个平台移植到另一个平台吗?能准确估计自己翻译和移植的过程需要多少时间吗?能准确估计翻译和移植之后性能是会有提升还是会有所下降吗?

系统编程能力体现在把已有的代码拿来并变成更好的代码,体现在把没用的代码拿来并变成有用的代码,体现在把一个做好的轮子拿来能画出来轮子的设计蓝图,并用道理解释出设计蓝图中哪些地方是关键的,哪些地方是次要的,哪些地方是不容触碰的,哪些地方是还可以改进的。

如果你一点不懂理论,还是应该学点的。对于系统性能的设计上,算法和数据结构就像在自己手头的钱一样,它们不是万能的,但不懂是万万不行的。

在这里,创客100君也收录到一个由伯乐在线翻译的,Quora 网友的一个提问,

Google之类公司的代码质量如何?

这是 Quora 网友的一个提问,他还补充说:

我经常在想,像谷歌这样的公司,它们的代码质量如何呢?根据我在两个大公司的工作经历来说,我感觉代码质量和公司年龄成反比。

Google 程序员 Jeremy Hoffman 的回复:

我没有怎么去比对过,但我认为Google的代码质量是非常高的。Google的软件工程文化是原因之一(感谢 Kevin X Chang 给建议):

代码审查。

在你提交任何代码改动之前,你得找去代码“主人”签字确认。为了实现,评审者(被鼓励去)建议大修代码,而不是让它成为根本没有经过思考的“图章”代码。

按语言可读性要求坚持代码风格指南(请参阅这里)。

除了让我们代码有统一的外观(所以我们能快速认出方法、成员等),我们的风格指南禁止了一些复杂、混乱、易出错的 C++ 特性(比如:class 类型的静态和全局变量)。

整个团队都致力于提供我们代码库的质量,维护我们的核心库,不断给我们做更好的工具。

一个活跃的“代码健康”课题组。

发布软件时,不对外部期限负有义务。

一般而言,这让我们可以正确做事,而非为了期限把东西拼凑起来。

“Fixits.”

例如,一个工程师或许说,“我认为我们真应该别再用过时的 CruftMap 类(class)了。我打算在 1 月 20 日组织一次 Fixit。” 当 1 月 20 日来临时,大家应当暂停其正常运作,把他们代码中的 CruftMaps 都换掉。在 1 月 21 日,Google 就永远和 CruftMap 说拜拜了!不过最近,核心库团队已经很优秀了,貌似没有啥东西可再值得类似的 fixit 了。

测试文化。

单元测试覆盖率可能接近 100%,我们有持续构建/整合/测试,还有知名的 ”Testing on the Toilet”[责任编辑/吴梦雄]

以上内容来自知乎网友刘贺、伯乐在线,创客100略作整编

创客100创投基金成立于2015年,直通硅谷,专注于TMT领域早期项目投资。LP均来自政府、互联网IT、传媒知名企业和个人。创客100创投基金对IT、通信、互联网、IP等有着自己独特眼光和丰富的资源。决策快、投资快是创客100基金最显著的特点。
相关文章
什么样才算是牛逼的程序员
什么样才算是牛逼的程序员