如何成为牛逼的程序员

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:vczh
链接:http://zhuanlan.zhihu.com/p/19796639
来源:知乎

我有一个想法,不一定对。

第一篇文章(第一篇文章就贡献给投票了 - vczh的日常 - 知乎专栏)果然给了我灵感耶,标题的图片就是从评论里截出来的。为了以后回答那些层出不穷的月经问题,我决定写下这么一篇文章,讲一下我对牛逼的程序员的理解。为什么我要讲这个呢,当然首先我还是觉得自己是很牛逼的,不然我就不会讲这个了(误

一个牛逼的程序员和一个不牛逼的程序员的区别到底是什么呢?懂的算法多就牛逼吗?懂的API多就牛逼吗?或者懂的工具多机会牛逼吗?其实牛逼不能用这些简单的指标来定义。我们觉得一个人牛逼,通常指的是那个人懂的东西非常多。不过懂的东西多而写出来的程序很蠢的话,或者半天搞不定一个问题,我们就会开始怀疑我们的判断了。那到底什么是牛逼呢?

其实这就跟聪明区别于傻逼一样——直觉准!

直觉一半来自于举一反三,举一反三一半来自于那个一,而当你对很多问题都有那个一的时候显然是因为你这些问题都碰过,碰过问题跟只学会知识还不一样,你还要解决他们。那如何才能碰过并解决大量的问题呢?唯一的方法就是熬过那一大段时间,通常是十几二十年。你光是聪明,可以学会很多东西,但是由于实践的时间不够,仍然不足已成为一个牛逼的程序员。所以牛逼本身不是一个可以速成的东西,它是知识和经验的积累,然后是运用你的知识和经验的熟练程度。

我一直都跟别人推荐这篇文章(成年人的思想还能进步么? « 学而时嘻之)讲的就是如何变成一个牛逼的人的。上面说到要变牛逼首先一定要花费这么多的时间。那这么多的时间难道光刷那些傻逼ACM题目就可以变牛逼吗?你刷半年可以,刷十年呢?显然刷ACM题目只能让你从傻逼变成菜鸟,后面还是有很长的路要走的。文章给我们的一个重要的结论就是,你自己在利用这一大段时间练习的时候,每次都要给自己足够难但是又刚好可以做出来的题目来做。等到你把这个题目做出来,你就会觉得很多问题便容易了,这个时候你重复的解决他们只能得到很小的锻炼,于是你要自己寻找更难的题目,一个足够难但是又刚好可以做出来的题目。当然找到一个好的题目也不是那么容易的,反正年轻的时候时间都是不值钱的,等你试图做几个题目发现自己根本做不出来的时候,你就知道什么叫做刚好可以做出来了

于是逼自己过了这么多年,就算跟我一样整天搞windows,遇到需要用linux的时候也只是问问人看看说明书(不过linux好像没有说明书)的事情了。因为本质困难的东西你都会了,剩下的这些操作问题,只是熟练不熟练的区别而已。

不过到底什么是足够难又刚好可以做出来呢?其实我觉得我小时候编程的学习过程就是很好的一个例子。刚开始自学的时候的确难度是很大,学会了while循环半年后我还总是控制不住自己通过复制代码来做循环的事情,这种感觉就跟哑巴英语一样,你知道那个东西,但是用的时候就是想不起来。当然随着训练的逐步加深,这是可以克服的。

当时我是沿着这么一个路线来走的。首先会用函数画几个图做做模糊啊锐化之类的简单滤镜,其实有算法抄那就是几行代码的实情。然后就开始学习如何写出高性能的程序。自己觉得性能差不多了就开始折腾怎么实现一个RPG。每一步大概都花费了几个月,而且步与步之间的跨越是很大的。当然具体到我当时的情况,难免最后会弄失败,这主要是由于思路的问题,因为没人告诉我要怎么做。我记得很清楚初三的时候做一个RPG,结果在VB6里面试图用Picture控件去搞,不死就怪了。过了两年我终于知道什么是靠谱的方法了,于是就做出了这个(作品:《天地传》)。这个链接还能下载到我当初的Delphi写的代码,小时候的代码就是烂,尽管看起来也有点复杂了,啊哈哈哈。

游戏做完了不能满足于做完,就要开始想模块化的问题了。怎么做一个游戏用的GUI库?怎么做一个游戏用的脚本引擎?怎么给他们制作工具?怎么写一个游戏引擎?怎么写一个RPG Maker?每一个问题想做简单也可以做简单,想做复杂也可以做的很复杂。于是当我问题一个一个的解决之后,都已经来了M$RA了,这也是我为什么后来会做GacUI 和各种奇怪的编译器研究各种奇怪的类型系统的原因了。当然现在做到这地步都不是仅仅为了游戏而做,当时当你做出一个游戏可以用得东西之后,你就要开始想怎么把它做成通用的,使得开发软件也可以用。每一个问题都最终上升了一个台阶,而你觉得容易的问题就不要浪费时间去解决了

我觉得这应该给大家指出了一个道路,这也是为什么我觉得那些花费那么大精力去研究工具的人很浪费时间的原因了。工作要用的事情就应该占用工作时间去研究,课余的时间当然是花在提高自己的元编程水平上:大概就是算法啊、架构啊、设计模式啊、单元测试啊各种任何语言都用得上的东西了。不过为了训练这些能力,你总得通过真刀真枪的解决什么困难的问题来得到。于是最好的选择就是big clean problem了。这些问题都是定义很清晰但是非常复杂的问题,譬如说我大四尝试并最终成功的一个问题——怎么把C语言编译成x86。当然这只是一个问题,如果你想把它做得实用,要么你要知道怎么写PE文件,要么你要知道怎么跟C++的数据结构和函数指针无缝的结合起来,这就不那么clean了。解决这些边角问题纯粹靠资料,而跟你的水平是没有关系的,如果没有兴趣的话完全没有需要去解决它。当然解决它也不是没有好处的,因为解决了你就弄明白了,你就可以用这些知识来解决你未来的工作里可能会遇到的牛角尖问题了。不过这永远不应该成为你课余学习编程的动力,这就像附加的好处一样。

说到这里我们可以明白,牛逼的程序员,在于它的元编程水平很高的同时,还知道很多奇怪的知识,以便于你在遇到一个真正的工程问题的时候,能正确地在已经掌握的浩如烟海的知识里面联想到正确的那一个小片段,从而经过简短的研究从而立刻解决它。这也是为什么我们觉得牛逼的人知识很多,因为这是一个必要条件。这也是为什么我们觉得牛逼的人写程序很快,因为这是牛逼的结果。

当然对于刚入门的菜鸟来讲,他们还处于连一个工具都没用好的状况,那自然应该花点时间去熟悉工具。不过当你已经掌握了C++、C#、Haskell、Erlang之后再花相当多的精力研究什么Go和Swift,就很划不来了。因为Go和Swift所需要研究的问题其实已经包含在前面的C++、C#、Haskell和Erlang的时间里面了,因此在你使用Go的时候,就应该直接用,万一踩到了坑你跳出来也是相当容易的事情,根本无需花时间去研究Go的细节。当然对于只会写几行php和python的人,花时间研究Go也是好的,因为他们仍然处于连一个工具都没用好的状况。那自然应该花点时间去熟悉工具。

当你至少掌握了一个general purpose的编程语言和一个系统上的API之后,你就不需要花大量的时间去研究另一个类似的general purpose的编程语言和另一个系统的API了,因为这属于举一反三的内容,只要看文档就可以立刻精通了。倘若是完全不同的两门语言,譬如说C#和Haskell,你学会了一门之后还是可以去花时间研究另一门的。

这些事情都不是绝对的。你需要花时间做什么,取决于这个问题是不是够难,是不是刚刚好你可以做出来,再难一点点你就做不出来了。只要你保持这种训练方法长达十年,想不牛逼都难。

想到这里,不禁回忆起小时候的一些傻逼想法。初三的时候曾经试图用Visual Basic 6.0去做一个Basic的解释器,当然最后做出来了,只是性能巨低,因为我把语法树都保存在表格控件里了……不过在当时的知识下面,能用傻逼方法解决这么个问题,也算是进步了不少。

时间: 2024-10-13 11:47:40

如何成为牛逼的程序员的相关文章

【转】如何成为一个牛逼的程序员

来自:http://www.cnblogs.com/preacher/p/4205277.html   说的很有道理!!! 上边这个网站不是原文网站,,,原文网站地址:http://blog.csdn.net/foruok/article/details/42061247 该作者应该是主要为程序员职业规划知道,,,相关的  程序员漫谈系列  值得一看!!! ------------------------------------------------ 作为程序员,身边总是有牛逼的前辈.后辈或者

成为牛逼的程序员

Tip 1 要方法而不是记忆 我的一个程序员朋友常跟我说记住超过200个C++函数是多么的有帮助."我从来不必去查找函数的定义,因此我可以比其他程序员编程快上50%."他自豪的说.可结果是什么? 难道他不知道编译器的代码自动完成功能可以节约大量查找函数及输入函数的时间吗,另外当C#发布出来后,他在记忆函数上面的努力就白费了.当然,编程中对函数的熟记是一件 必需的事情,但是你应当花费更多的时间在学习做事的方法上,比如说创建一个数据库连接,如何产生RSS源等,然后是关注于代码是如何实现的.

如何成为一个牛逼的程序员

“成为一个杰出的程序员!”,每个程序员都是这么想的,虽然嘴上不说!这是一个人人自称“屌丝”,骨子里却都认为自己是“高富帅”(或者认为自己终究会成为高富帅)的年代! 大部分时候,我们一直在努力成为一名优秀的程序员.但是,更多的时候,我们并不知道如何成为一个优秀的程序员! 怎样成为一个优秀的程序员? 完美主义?注重细节?懂用户需求?恩,听起来都有道理,但又觉得很虚,难以实施! 选(fang)择(fa)比努力重要,一味只会埋头苦干的人,注定成不了杰出的程序员,有时候,我们需要停下来:思考! 我不是一个

多少牛逼的程序员毁在low逼的英文发音上(JAVA)

最最常用的关键词及音标 数据类型:boolean.byte.short.int.long.double.char.float.double. 包引入和包声明:import.package. 用于类和接口的声明:class.extends.implements.interface. 流程控制:if.else.switch.do.while.case.break.continue.return.default.while.for. 异常处理:try.catch.finally.throw.throw

无奈,苦逼的程序员如何拿回自己的劳动所得

大家好,我是一名工作4年多的苦逼程序员,和大部分程序员一样,我单纯善良,喜欢写代码,喜欢加班研究东西,但是接下来我要讲的事情和技术无关,和办公室政治有关,并且此时我还被困在这里,希望大家看完能给我帮助,如果最后和公司沟通不行,我只能用法律来维护自己的利益了. 我2013年11月入职这家公司,劳动合同写的是每月10号发工资,可进来后才知道实际是每月20多号后才发工资,好吧,晚20多天也就算了,毕竟公司可能也有难处,身为一个善良单纯的程序员,我愿意和公司共同度过这段难关.但是接下来的发生的事情真的让

十个能让你成为牛逼前端程序猿的特征

如果能够做一些炫酷的网站, 并且能够写一手的好html/css/javascript的话,你是不是就觉得你是牛逼的前端程序猿了?  如果不确认的话,请看看如下几个能够被称作牛逼程序猿的特征吧: 精通一个成熟前端框架 虽然也许尝试开发过前端框架,但是对于重复造轮子这件事来说,其实意义不大,使用现成的成熟框架好处在于拥有更多的开发者支持,你能快速的帮助别人或者请求别人来帮助你解决深层次的技术问题.一个好的框架能够帮助你显著的降低代码书写量,及其高效管理代码模块,并且让你可以清楚的了解一些代码书写的最

如何成为一个牛逼的程序猿

这个题目的噱头太大,要真的写起来, 足够写一本书了. 本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路. 每个人的情况不一样,我下面的描述可能并不适合每一个看到这篇文章的人. 一.C/C++语言 如果你的基础很差, 建议不要一开始就学C++语言,从C开始学起,对程序有个初步的认识,循序渐进.C语言的书嘛,先买一本 300 页以内的,把书中的每一个例子都通过键盘敲打进去到 Visual studio里面去,然后单步执行,逐行调试去看各个变量的值.或者自行添加一些printf语句去输

一个牛逼的程序

1.源码 1 e100 33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1 2 e11b 6 57 b8 11 1 bb 21 13 89 7 4b 4b 48 79 f9 ad 86 e0 8b c8 bd ff ff e8 20 3 e134 0 3d 0 1 74 1a 7f 3 aa eb f3 2d ff 0 50 e8 f 0 5a f7 d8 8b d8 26 8a 1 aa 4 e14f

苦逼的程序员 如果你想离职 关于离职 想转行 想裸辞的你, 可以看看这些 拂去你各种疑难杂症 包括但不限于 想要裸辞怎么办, 不想上班了怎么办, 想换工作了压力大怎么办, 没有动力上班怎么办? 想转行但又不知道干什么 想离职又不知道干什么 想离职但是又没钱怎么办....

关于离职 想转行 想裸辞的你, 可以看看这些   拂去你各种疑难杂症 包括但不限于 想要裸辞怎么办, 不想上班了怎么办, 想换工作了压力大怎么办,  没有动力上班怎么办?想转行但又不知道干什么想离职又不知道干什么想离职但是又没钱怎么办....值得借鉴 思考 离职365天,“家里蹲”的他们过得还好吗?O网页链接O目前有多少人 离职的 家里蹲的 举个手目前有多少人 离职的 家里蹲的 举个手辞职了家里蹲快四个月,无所事事O网页链接离职前你必须面对(想好)的几个问题 O网页链接离职前你必须要面对或是想清