原文地址:http://www.lingcc.com/2011/09/18/11728/

1 要有独门秘籍

要想挣的多,就要有一个独门秘籍,才是养家糊口的根本。不管是自己开公司,卖产品。还是打工,挣钱。都要有别人做不到,只有你才能做到的,才行。

别人给你开较高的薪水,是因为你能给别人带来价值。之所以给你开最高的薪水,是因为只有你才能创造某些价值。薪水的高低,要看你的技术能否满足社会的需要,是不是社会所必须的。比如,曾经会点MFC,能做个简单的网站,就能找到很不错的工作。但现在可能,Android系统开发,网络(协议栈),手机应用开发更加火爆。而且一定要学的精,才有好的薪水,才能开能活下来,赚到钱的公司。

那些不可或缺的,高精尖的技术,是首选。比如,最底层的微波,电路相信谁都知道它的重要性,不可或缺。大学本科时,师兄说过一句玩笑话:搞微波的,玩多高的频率,就能挣多少钱。不过学过电磁场理论的人都知道有多痛苦。参考中的链接1和2也能说明这个。其中参考2,针对复旦大学毕业生就业的分析,有下面一段话:

硕士毕业生的实际薪水排名前三位的专业依次是国际法、电路与系统、电磁场与微波技术,调查发现,这三个专业的实际薪水比期望薪水高

编译就是这样一种独门秘籍。难,有很高的门槛,而又不可或缺。总要有人写程序。有人要性能更好的程序,但又不想多写代码,不想错误百出,不想调优。编译器,或者更大点,一个好的编程环境是所有程序员最欢迎的。

2 三十年河东,三十年河西

在计算机行业,这个可能要缩短到20年。并行计算,在计算机刚刚出现的时候,也非常热门。不过自从上世纪九十年代到04年左右,有关并行计算的研究就非常少了。因为CPU的频率增加,使得串行程序只要换换CPU就能跑的更快了。但今天,并行计算又成了重要的研究方向。

CPU的结构,从单发射、顺序执行的标量处理器,到多发射、流水线、乱序执行的超标量处理器,曾经给处理器性能带来了很大的提升。但今天,功耗问题、成品率、芯片面积等问题,使得几乎所有的众核处理器又回到了顺序执行的模式。

向量机 90年代的时候也很火爆,但随着标量处理器的性能提升,渐渐被冷落了。但如今,GPU、Intel的AVX2,又隐隐约约看到了一点向量机的影子。

整个产业界处在不断的变化,更新之中。技术和方法基本就那么多,至少不同的历史时期,需要不同的排列组合方式,把他们放到一起,再加上不断的技术革新。只有一个因素永远不会变,就是使用计算机的人。而编译器正是供计算机从业人员使用(虽然Office软件,浏览器也是)。另外一个因素,目前来看也还没怎么变,就是计算机的执行模型。而编译器的最后结果是提供给执行模型的。所以编译器这个技术,是个铁饭碗。尤其是体系结构比较乱的今天。

3 要练好内功。

内功是最上乘的武功,有了它,学起别的易如反掌。计算机科学的内功:就是算法和体系结构

算法,不用多说。实际中遇到的问题,如何利用计算机这种确定的、有限状态的、非连续的工具去解决,就是算法要研究的问题。当然这个算法中,还包括数据结构,好的数据结构才能更好的对现实问题做建模,以便供算法处理。

体系结构方面,目前来看,基本就没有变化,依然是冯-诺依曼的结构,不过多核和众核的并行执行模式,可能会带来一些新的变化,这也是为什么最近并行研究如此的热。有了体系结构这种内功,你就知道如何使用计算机。体系结构包括底层相关的,不仅仅是CPU、主存、cache、硬盘,还包括上层的操作系统和编译器。虽然说执行模型很简单,但操作系统和编译器里的学问也很大。操作系统牵涉到资源的分配问题,编译器牵涉到人与机器的交互问题。

其他神马,从计算机技术的角度看,都是浮云。

比如,上层语言经历了从汇编,到宏编程,到命令式语言(C),到面向对象编程(C++),到脚本语言(Python),以及编译+解释语言(Java)的大致演进过程。语言五花八门,我们不去争论应该学哪个,不该学哪个。最后这些语言,都要用那些指令在CPU上执行起来。不管上层扯什么语言特性,什么编译执行或者解释执行。最后,都是一系列的算术、逻辑、跳转指令;以及一系列的寄存器。语言到指令的过程,就是编译器和解释其(JVM)要做的工作。语言标准只是一些具体的规定语言如何实现而已。

比如,了解了Java所有对象都基于Object类,C#为底层CPU指令支持的数据类型,如整型,单/双精度浮点类型生成更直接的CIL代码,你就知道为什么使用C++的模板会生成很大的可执行文件,为什么Java的模板实现代码会比C#的模板代码性能略差一些。

什么基于C语言的Glibc标准库,基于C++的boost代码库,基于Python的Django网站架构,基于Java的J2EE web架构。除去上层的整个系统的结构设计,算法设计外,其他堆砌代码的工作居多。(搞编译,调bug最多)

当然计算机作为一种工具,最终还是要给人用的,这就是计算机应用技术要干的事情,将计算机应用在各个方面,比如图像处理、语音识别、搜索等等。这些技术基本都是应用领域的知识、算法和体系结构综合起来的结果。应用领域的知识也是一方面的内功,

4 厚积薄发

前不久,听张晓东老师介绍Mapreduce,台下一个老师发问:“数据库方向的研究专家许多年前就意识到需要更大的存数据的软件,研究了这么多年好像都没有太显著的进展。为什么一个搞搜索的互联网公司,却能发明这种Map 加 Reduce的机制来应对大规模的数据存取。“ 张晓东老师的回答是,Google的创始人从函数式语言中得到的灵感。MapReduce机制的两位发明人 Jeffrey Dean 和 Sanjay Ghemawat,一个是做程序设计语言的, 一个是研究面向对象数据库的。

前不久,听 Yuanyuan Zhou 老师讲座。周老师也是华人计算机学术界的榜样之一,其领导的研究组在国际上是绝对数一数二的,在最顶级的会议上每年都有数篇高质量的论文。
不仅仅如此,她们还在将成果做成产品,比如 Pattern Insight.这个公司致力于应用机器学习的方式来协助程序员编写程序,发现代码bug。这里面有意思的工作包括:结合代码注释发现bug利用机器学习的方法来寻找操作系统中许多复制粘贴代码中的bug利用条件分支语句的逻辑推导增强软件中的log输出,以便得到更丰富的log信息等等。可以从这里找到许多她们所从事的研究工作。可以看到许多针对源代码的分析工作,都能看到很多编译的影子,她们的工作应该偏向于利用语法和语义方面的技术。她们的很多工作都是在实际的开源项目,如Linux内核、浏览器、apache、mysql中寻找bug,因此公司比较欢迎这种实用的技术创新。当然,挣钱也就不成问题了。

屠龙之技是很难,并且的确龙不多。但掌握了屠龙之技,屠别的都会游刃有余。
虽然,其他还有很多可以选择的方向。但当你迷茫,不知道要学点什么的时候,又想以后从事计算机方向的技术类工作时,编译是个值得考虑的选择。

做编译器本身,工作有是有不少的,参考这个网站: Compiler Jobs

20多岁的年纪,习得一技之长,于三、四十岁厚积薄发。前提是不可死读书。