编译方向是个值得考虑的选择
写这篇文章,是为了纠正上篇关于编译技术职业发展的帖子中自己的观点可能带来的误导。
尽量让面临硕士、博士选方向的学弟学妹了解编译知识在未来计算机技术职业生涯中的重要性,以及光明的未来方向。
Table of Contents
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多岁的年纪,习得一技之长,于三、四十岁厚积薄发。前提是不可死读书。
5 参考
您可能也喜欢: |
关于并行貌似正确的废话-程序语言发展的启示 |
zz Linux内核 编程风格 |
CUDA编程模型概述 |
计算机系统结构方向的顶尖会议 |
今日记录-091117 |
无觅 |