start from simple

昨天晚上喝的有点多了,说了一些比较莫名其妙的话,但是我相信point还是比较清楚的。早起泡了一杯茶,又想到了一些东西,那就继续写下来吧;D

start from simple. 这是我随便翻译的,所以如果你没有看懂,非常正常。如果你没有看懂并且英语是精通的话,那么请鄙视我吧。我想表达的意思是,从一些小事情做起。作为一个软件开发者,这点应该是常识了。假设同样一个本科毕业生吧,一个人可以希望自己编写巨牛逼的编译器,一个则希望自己编写好用的twitter客户端,相比这下,我更看好后者的发展,因为后者成长path可能会更加顺利。从一些小事情做起,做好它,不断地获得反馈,改进它,然后取得成功,开发者可以从这种经历中学到很多事情。而前者目标太大,不说本科毕业生,即使对于一个博士生来说,这个目标也是很难消化的。这就好比一个婴儿想吃面包片一样,第一种办法是让他整片地吃下然后等着噎住,第二种办法则是将面包片切小一片片吃下。

看,把目标设置太高太大,反而让你没有办法做好一件事情。那么摆在你的面前有两条路,一是把这个目标分解开来,然后有目标地逐个逐个地解决;二则不要将自己的注意力太过于放在这个目标本身上,而是放在一些和目标相关但是却非常有趣的项目上,像沙滩上收拾贝壳一样,一个一个项目实践起来。大多数人能够想到的只有第一种办法,这里比较一下两种办法。第一种办法类似DFS(depth first), 非常有针对性,能够快速地做出很多深入的工作,但是缺点也非常明显,就是它要求你对这个目标有非常清楚的认识。第二种办法类似BFS(breadth first), 可以认为是第一种办法的contrary, 通过这种方式学习到的知识通常不太深入,如果你想通过这种办法达到目标的话,花费的时间也非常长。好处则是可以通过实践的方式摸清楚这个领域可能所需要的知识,从而对目标有清晰的认识。但是无论如何,如果最终还是要转到方式1上。

写完之后,结论就非常简单了,还是以编写编译器举例。如果你毕业很幸运地进入IBM或是Apple开始做编译器方面的开发,那么你可以按照方式1来做。因为你周围环境都是这方面的人才,是在工业界混了几十年的大师,自然你可以通过像他们请教,来快速地对编译器各个问题有清楚认识。自然他们也会告诉你哪些地方值得做,哪些地方不值得做,有什么辅助工具,以及瓶颈在哪里。或者,如果你毕业很幸运地跟着虎书作者做研究,方式1也是理想选择。

可是如果你不幸地像我一样,毕业之后投身互联网浪潮,工作内容基本上和编译器开发沾不上一点关系(偶尔地,你可以了解一些编译优化知识,但是amateur vs. professional) 那么只能选择方式2. 具体事情来说,比如你可以试着阅读一些编译器代码TCC,以及为一个简单的DSL绑定LLVM等,这些不大不小的项目开始入手。注意我这里只是举个例子,我也是业余的,上面这两件事情是否值得做,其实我也不确定。可是不管怎么样,即便你最后还是不搞编译器,做的这些小项目对于个人发展还是很有帮助的。

anyway, 不管是1还是2,最重要的是让自己开心,让自己全身心投入其中,学到一点东西。