把代码写好是一件值得你一生追求的事情
编程是一件很难的事情。当然我的意思跟那篇著名的《编程是一件很难的事情》不一样。想把代码写好,本来就是一件非常困难的事情。我大三的时候训练一个大一的老乡,就光是C++,长达四年后她还搞不清楚范本元编程究竟是什么。而且还有C语言学会了转C++会把坏习惯带进来啦,C++的人转做C#之后发现很多C++的好技巧到了C#都只会让程序变得更慢啦,很多写动态语言的人不理解类型的好处还在那里胡扯啦,还有C#和javascript明明放着大好的函数式风格不用,非要把代码写的超长(本来光是这样没什么问题的,只是有某些人不肯学习新知识)。可见,就算把自己训练了好多年,最终进入了工作岗位,想把代码写好,也是一件非常困难的事情。
当然有些人说,如今只有产品做得好才能赚钱,代码写的好有个屁用。这只能是人各有志,有些人就不喜欢钻研代码,这本来也没什么。但是这些人老是跳出来忽悠别人,也只会让编程变得更难。只是幸好,我的单位并不会跟某些单位一样说一些“把代码写得那么好有什么用,搞的我们还非得学东西才能看你的代码,赶紧做点新feature啦”的这种话,我已经觉得很好了。
写得好这个东西还是比较抽象。我认为其中一条就是代码要好维护。我一直以为,只有代码写得好维护,好改,清晰易懂,这样加新的弁鄐~会容易,不出事情,顺利发布软件。后来我发现我错了,腾讯不也是QQ一版一版的发吗,原来加班也是一种方法,啊哈哈哈。如果在一个单位里面,不加班别人就会找你麻烦的话,我相信你也不会花心思把代码写好的,反正都要加班。
不过对于志向就是写代码的那一些人,最好还是不要受到这些外来信息的干扰。最近跟我们组里的一个test manager聊天,他是一个菲律宾人,说是从纸带时代开始就写代码了(不过看起来好年轻……),工作的时候还觉得C语言是一个崭新的语言。后来他跟我说,如果一个人有志向与,代码一条路走到黑,最好就去学习一下怎么当architect。他说道,Architect的知识构架是由各种pattern组成的,然后就说了自己年轻的时候的很多故事来作证这个道理。然后还讲了微软的其中一个创始人到现在还坚持一线写代码的事情,不过没告诉我是谁。
在这之前,刚好MSR的Daan Leijen因为来北京参加programming language相关的conference,就来我们这里参观了一下。后来我看他做过GUI,做过parser combinator,发明实现过语言,就前去搭讪,结果发现他读书的时候的导师竟然是Erik Meijer。按照他的话说,“then we are connected”,如果说成中文,就是有缘分吧。接着就跟他讨论了一些parser combinator和类型系统之类的东西。我说我之前也搞过这些东西,最后还贡献了一部分给公司,换了个组之后还开了讲座什么的。他讲到他读书的时候,也是学校没教自己自学的这些东西,后来周围也没什么人做,但是并没有让他丧失动力。然后就说了一句话让我印象很深刻:“原来你也做这些东西啊,我应该可以看到为什么你要从产品组跳到MSRA来了。”他直到今天,头发都基本上掉光了,还在那里继续研究programming language的东西,还给了我几篇论文。我觉得很好,人就该像他那样。
有些时候,人就得有那个信念,才能把可行但是难度大的东西,也最终搞出来。我自己写了11年的程序,其实并没有接触过十分广泛的东西,因为很多时间都花在重写我的一些idea上面了。譬如说编译器就写了五六个,GUI库就写了八遍,还有些杂七杂八的。不过从这个过程之中,可以明显感觉到自己什么时候比以前更进一步。这种signal有很多,譬如说当你决定要添加一个比较复杂的弁遄A也可以迅速知道怎么做而不用动到构架啦;譬如说你觉得你的代码越来越顺眼啦;譬如说你因为构架不行决定重写的时候,你发现前一个版本的代码可以捡起来继续用的部分越来越多啦。
写到这里,我想起很多人都问过我,程序要怎么写才能写得好,或者说设计模式要怎么写,之类的问题。如果把学习编程花费的精神代价做标准的话,捷径是没有的。但是如果仅仅把时间作为标准的话,捷径显然是有的。怎样才能加速你学习的过程呢?答案就是,先写再看书。对于像编译原理这种略微高深的知识,总要自己写过几遍,吃了一些苦头,才能知道为什么书里非要把算法那么设计结构那么安排。对于像设计模式这种需要大量经验才可以领悟到的知识,如果你从来没独立写过一个上万行的程序,你觉得你能理解设计模式在讲什么吗?我觉得这种时候能做的也就是背下来,理解什么的都是扯淡。诸如此类,学习程序,如果要加速那个过程,肯定要花大量的时间写代码。当你把项目做得越大、越复杂、算法越扭曲、界面越华丽、尺寸已经大到你觉得不学习新的方法论就肯定会让代码失控的时候,这个时候你来看设计模式的书,保证是每看到一个模式都觉得人家说到你心坎里去了。那你不仅可以迅速理解,而且以后还可以不由自主的想起来使用它。
当然,如果你不是一个喜欢写代码的人,那这个方法肯定没有用,因为中途放弃什么的太多了。这种时候,只能怪你没缘分,设计模式不渡你了。如果你最后撑下来了,虽然你自己觉得你也花费了相当的努力,但是别人反正是看不到你的努力的,就会开始觉得你有捷径了。为什么呢?因为效率高啊,时间花得短啊。
光写代码也是没用的。同人于野一篇讲成年人还能不能进步的博客说得很好,知识分为舒适区,学习区和恐慌区。舒适区的意思就是,你很容易就可以做完。学习区的意思就是,你需要花费大量的智力才可以做完。恐慌区的意思就是,你根本不知道如何下手。当你在为了练习编写大量的代码的时候,你要尽量把题目都安排在学习区这里,这样才能让你进步快的同时,还不会被问题打倒,可以继续积累成就感了。
学生做这个最方便了,工作之后,如果刚好遇上个黑心公司要你天天加班,你反而没时间做学习区的内容了,公司给你的肯定是舒适区的苦力活。
说到这里,如果你还有时间练习的话,千万不要去想:“我每一个程序都要跨平台”,“我只做这个语言”等等。反正将来,语言你都要会,平台的差异你都要知道,为什么要断送自己了解这些东西的机会呢?你真的以为不知道垃圾收集的原理,和一些底层的可以通过C++的练习而得到的的操作,你真的可以在某些关键时刻操纵好C#吗?当然有些人会觉得,我估计一辈子不会遇到这些问题的,所以我还是不管他了。人各有志嘛,C#不渡你,也是你自己的事情。如果你真的可以一辈子都在一个平台上用一种语言做同一种程序做到退休,那真是幸福的生活啊。
扯了那么多,也扯个小结:
1.学电脑要趁早,电脑要从娃娃抓起。
2.把代码写好是一件非常困难的事情。
3.不喜欢钻研代码的人不要跳出来忽悠别人。
4.代码写得好其中一条就是代码要好维护。
5.活到老,写到老,“把代码写好”可以作为一生的追求。
6.写出好代码,需要有信念;码写百遍,其义自见。
7.写出好代码,没有捷径;写万行码,行万里路。
8.光写代码是没用的,你需要花量大量的智力写代码。
9.写代码不要局限于某种语言,某个平台。要做到“万码皆一码,无码胜有码”。