关于编程的胡扯

一年一度的高中毕业生填简历的日子即将就要到了,又有很多人问计算机专业的事情。其实我从心底里觉得,高考后才来问这个,已经完了一大半了。当然另一小半十分有前途的人可以在大学四年赶上来,不过估计他们还是要读个研究生,才能把自己训练成能用的码农。

    编程是一件很难的事情。当然我的意思跟那篇著名的《编程是一件很难的事情》不一样。想把代码写好,本来就是一件非常困难的事情。我大三的时候训练一个大一 的老乡,就光是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有很多,譬如说当你决定要添加一个比较复杂的功能,也可以迅速知道怎么做而不用动到架构啦;譬如说你觉得你的代码越来越顺眼 啦;譬如说你因为架构不行决定重写的时候,你发现前一个版本的代码可以捡起来继续用的部分越来越多啦。

    写到这里,我想起很多人都问过我,程序要怎么写才能写得好,或者说设计模式要怎么写,之类的问题。如果把学习编程花费的精神代价做标准的话,捷径是没有 的。但是如果仅仅把时间作为标准的话,捷径显然是有的。怎样才能加速你学习的过程呢?答案就是,先写再看书。对于像编译原理这种略微高深的知识,总要自己 写过几遍,吃了一些苦头,才能知道为什么书里非要把算法那么设计结构那么安排。对于像设计模式这种需要大量经验才可以领悟到的知识,如果你从来没独立写过 一个上万行的程序,你觉得你能理解设计模式在讲什么吗?我觉得这种时候能做的也就是背下来,理解什么的都是扯淡。诸如此类,学习程序,如果要加速那个过 程,肯定要花大量的时间写代码。当你把项目做得越大、越复杂、算法越扭曲、界面越华丽、尺寸已经大到你觉得不学习新的方法论就肯定会让代码失控的时候,这 个时候你来看设计模式的书,保证是每看到一个模式都觉得人家说到你心坎里去了。那你不仅可以迅速理解,而且以后还可以不由自主的想起来使用它。

    当然,如果你不是一个喜欢写代码的人,那这个方法肯定没有用,因为中途放弃什么的太多了。这种时候,只能怪你没缘分,设计模式不渡你了。如果你最后撑下来 了,虽然你自己觉得你也花费了相当的努力,但是别人反正是看不到你的努力的,就会开始觉得你有捷径了。为什么呢?因为效率高啊,时间花得短啊。

    光写代码也是没用的。同人于野一篇讲成年人还能不能进步的博客说得很好,知识分为舒适区,学习区和恐慌区。舒适区的意思就是,你很容易就可以做完。学习区 的意思就是,你需要花费大量的智力才可以做完。恐慌区的意思就是,你根本不知道如何下手。当你在为了练习编写大量的代码的时候,你要尽量把题目都安排在学 习区这里,这样才能让你进步快的同时,还不会被问题打倒,可以继续积累成就感了。

    学生做这个最方便了,工作之后,如果刚好遇上个黑心公司要你天天加班,你反而没时间做学习区的内容了,公司给你的肯定是舒适区的苦力活。

    说到这里,如果你还有时间练习的话,千万不要去想:“我每一个程序都要跨平台”,“我只做这个语言”等等。反正将来,语言你都要会,平台的差异你都要知 道,为什么要断送自己了解这些东西的机会呢?你真的以为不知道垃圾收集的原理,和一些底层的可以通过C++的练习而得到的的操作,你真的可以在某些关键时 刻操纵好C#吗?当然有些人会觉得,我估计一辈子不会遇到这些问题的,所以我还是不管他了。人各有志嘛,C#不渡你,也是你自己的事情。如果你真的可以一 辈子都在一个平台上用一种语言做同一种程序做到退休,那真是幸福的生活啊。

    胡扯到这里也差不多了,这就是月经贴,时不时,总是要发一下的。