编译方向是个值得考虑的选择

标签: 程序员生活 编程技术 编译器相关招聘信息 职业发展 | 发表时间:2011-09-18 14:59 | 作者:erlv kylexlau
出处:http://www.lingcc.com

写这篇文章,是为了纠正上篇关于编译技术职业发展的帖子中自己的观点可能带来的误导。
尽量让面临硕士、博士选方向的学弟学妹了解编译知识在未来计算机技术职业生涯中的重要性,以及光明的未来方向。

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多岁的年纪,习得一技之长,于三、四十岁厚积薄发。前提是不可死读书。

您可能也喜欢:
关于并行貌似正确的废话-程序语言发展的启示
zz Linux内核 编程风格
CUDA编程模型概述
计算机系统结构方向的顶尖会议
今日记录-091117
无觅

相关文章:

相关 [编译 方向 值得] 推荐:

编译方向是个值得考虑的选择

- kylexlau - 编译点滴
写这篇文章,是为了纠正上篇关于编译技术职业发展的帖子中自己的观点可能带来的误导. 尽量让面临硕士、博士选方向的学弟学妹了解编译知识在未来计算机技术职业生涯中的重要性,以及光明的未来方向. 2 三十年河东,三十年河西. 要想挣的多,就要有一个独门秘籍,才是养家糊口的根本. 都要有别人做不到,只有你才能做到的,才行.

七个值得设计师关注的方向

- - 雷锋网
【编者按】本文作者 @爱奇艺_晓生,本文针对一些从事设计工作三到五年后对未来的发展方向感到迷茫的设计师. 而无论是在设计方面的风格、从业的技能进一步选择还是从业的可发展方向,作者就以自己日常设计工作中的经验为大家提出了七个值得关注的方向,让大家作为参考. 对WP7手机本身没有好感,Metro风格有些超前,自身还存在不少缺陷,但微软将这一风格衍生到其他产品,特别是Win8.

android apk反编译

- - CSDN博客推荐文章
3.查看Jar包的GUI工具. apk文件其实就是一个MIME为zip的压缩包,可以用winrar软件打开看到里面的文件结构. 解压缩后找到里面的classes.dex文件,classes.dex文件就是java文件编译再通过Dalvik须立即提供的dx打包工具打包而成的,接下来就用2个工具来逆向导出java源文件.

java编译原理

- - 编程语言 - ITeye博客
1. 关于动态加载机制 . 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分. 很多人都能背出来Java语言的特点,所谓的动态加载机制等等. 当然概念往往是先记住而后消化的,可有多少人真正去体会过动态加载的机制,试图去寻找过其中的细节呢? 提供大家一个方法: 在命令行窗口运行Java程序的时候,加上这个很有用的参数: java verbose *.class .

Ubuntu 编译 Linux 3.0-rc4

- zyhong17 - Wow! Ubuntu
Linux 内核经过漫长的 2.6 版本之后终于主版本+1了,现在已放出 3.0 RC4 版,最近又有消息称 3.0 会比 2.6.39 快,喜欢折腾的你又不介意当小白鼠的话不妨试试下载 Linux Kernel 3.0 的源代码自己编译. 下面简单讲一下在 Ubuntu 10.10 编译 Linux Kernel 3.0 RC4 的过程.

加速Linux程序编译

- jin - 李凡希的Blog
  项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情. Research了一下,找到以下可以帮助提高速度的方法,总结一下.   有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话.

C语言编译器 Cilk

- Le - 开源中国社区最新软件
Cilk多线程编程技术最早由MIT开 发,是一个基于Gcc编译器的开源项目. 后来开发者创建了一个创业公司,推出改进的私有版本,整合到Windows下的多种编译器中. 之后它被英特尔公司 收购,整合进英特尔的编译器中. 现在,它再次成为一个开源项目,成为Gcc 4.7下的一个分支. Cilk Plus允许C和C++程序员能高效利用多核处理器的并行处理能力.

Java JIT编译技术

- - 小彰
        JIT是just in time,即时编译技术. 使用该技术,能够加速java程序的执行速度. 下面,就对该技术做个简单的讲解.         首先,我们大家都知道,通常javac将程序源代码编译,转换成java字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译.

【Thrift一】Thrift编译安装

- - 开源软件 - ITeye博客
上面这段话选自Apache对Thrift的一句话介绍,Thrift是一个高性能的RPC服务框架. 在技术选型时,有如下三方面的需求时,考虑使用Thrift. 2.请求和响应的数据传输量大. 个人认为在没有特别strong的理由情况下,慎用Thrift. HTTP请求通常都能够满足需求,使用Thrift带来很多开发上的额外的工作量,一个简单的服务,就要写客户端代码,.thrift接口定义以及服务器端的服务响应代码,简单的事情复杂化.

[原]Java动态编译

- - 文武天下
下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用). 本文来探索下当程序已经开始执行,但在.class甚至.java还未就绪的情况下,程序如何获得指定的实现. 这就是我们下面的主题,动态编译. JavaCompiler: 负责读取源代码,编译诊断,输出class.