看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

点击上方“码农突围”,马上关注

这里是码农充电第一站,回复“666”,获取一份专属大礼包

真爱,请设置“星标”或点个“在看”

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

那个时候还是 21 世纪的第一年,正处于上网费用巨贵无比、Google 还刚起来没多久基本没人知道的时候,学习编程要比现在困难很多。当时想寻找什么知识,因特网基本上是没什么指望的,所以我就有了一个没事去书店的爱好。

没过多久我就找到了一本《Visual Studio高级图形程序设计教程》。这本书我很喜欢,插图十分漂亮,而且还是使用 Visual Basic 编程绘制的,更是爱不释手。可惜内容过于高深,所以后来就有了初三的时候自学学会初步的立体解析几何,以及高三上课不听讲仅凭自己看数学分析后来还被我看明白了的故事。

中间因为试图使用编程绘制很多复杂的图形和对图像进行各种复杂的变换,于是每当写程序之前都要在纸上推导长长的公式。如果程序的运行结果不对了,根本无从调试,只好重新推导,借以希望可以发现公式的几个 bug 以解释为什么会出现错误。

从此以后我对符号运算就十分拿手。而且做数学物理作业也好,为了编程推导公式也好,需要计算的东西太多懒得到处寻找废纸,从而便获得了心算复杂过程的本领(可惜现在已经丧失了)。这顺带还给我带来了一个好处,就是高考数学选择题在发卷后不许动笔的 10 分钟内就被我全部心算出答案,而且全对了。

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

后来我就萌发了解释高级语言的想法。这是我整个编程历史上的第一个转折点。那个时候我数据结构只会用链表,而且编译原理也好,设计模式也好,都还没听过。那个时候去解释高级语言自然是比较困难的。因此我经过很多天的苦思冥想自己想出了一个如今称之为一遍编译(也就是很烂)的方法来把一个简单的高级语言重新处理成一个简单的指令集语言,就跟汇编长得差不多。

那个时候已经高三了,所以其实也没多少时间可以投入在编程上面,因此做出来的第一个原型是一个简化后的 Pascal 的解释器,用 Delphi 开发的。现在想起来,里面肯定有巨多内存泄露和性能问题,不过当时根本不知道这些东西是什么。在高中毕业之后的三个月无所事事的日子里,我就重新把这个东西设计了一遍,得到了一个几十页的计划。由于后来没来得及做完,就打印出来带去了华南理工大学。

大学

刚进了大学没几天,就听一个大四的师姐说我们的班主任陈健老师是教编译原理的,于是我就把这一叠纸拿给了她看。她什么也没说(现在回想起来,只能是那一份设计实在是不堪入目……),就给了我一本编译原理的课本。我很快就看完了,然后用了里面的知识做了第一个真正意义上的脚本引擎,语法山寨了 Java 语言的一些简单的部分,还添加了一个编译的时候自动把模板参数都改成 Object 类型的语法,起了个名字叫 Jove。后来上了 Java 的课,发现 Java 竟然真的这么干了,让我觉得好生奇怪。

后来我陆陆续续写了很多脚本引擎。大一的时候做的 Jove 是第一个我觉得还能见人的脚本引擎。第二个就是大二失败了一整年吸取了很多教训之后,于大三开发出的动态语言,名字叫 Free(可以在我的博客 http://www.cppblog.com/vczh 上找到)。最近正在打算将其更新到 3.0 来配合一个正在开发中的显卡加速的 GUI 类库 GacUI。接下来就是在去微软上海的 WCFTools 组实习的那一段时间里面,利用每天晚上的时间完成的一门纯函数式语言叫 KernelFP,这后来成为了我的毕业设计。

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

在这里我想可以回答一个月前不能很好地回答师弟师妹们的一个问题了。如何能够在微软找到工作为我把我上面做的这些东西都写进了简历。同时如果你们到了大四才来问这个,就已经太迟了……

值得一提的是,我从大三开始指导一名基础几乎是零的、比我低两个年级的软件学院的一位学生学习编程。为了让对方在接受我为期 3 年的训练之后有扎实的 C++ 基础、熟练的单元测试编写水平以及能够靠直觉给出一些不算太差的设计,我回顾了许多关于 C++ 的内容,特别是给指针的几节课备课了好几天,并且每一天都要出一个作业。在这个过程中我深刻的感觉到,如果要快速提高自己的编程水平的话,你必须总是去做一些你做得出来,但是难度大到只要再难一点点你就做不出来的事情。再这么坚持好些年之后,肯定会进入高手的行列。

因此我在安排作业的过程中,有意推迟了关于指针的内容。首先让对方接受变量和分支循环,然后要养成一个好的风格(譬如说不能老是用一个字母给变量命名之类),然后学会操作数组,接下来才是关于没有强制类型转换的指针的一些操作,并且在一个月之内做出一个带单元测试的字符串类。指针的重点是要对方深刻的理解,“指针本身就是一个指向位置的数字”这么一个概念。为此我特别设计(但没有实现)了一门只带有一个全局无限长数组的汇编语言来讲述指针背后一些复杂的概念。之后就是一些关于面向对象的知识、设计模式的知识、还有跟脚本引擎有关的一些东西。

该学生的毕业设计是一个简单的动态语言的脚本引擎,并且该脚本引擎的实现正确地运行了我在上面模仿 Linq 的一个列表处理函数库。这个实现闭包一层套一层,到处都在给一个物体添加删除函数,创建各种延迟执行的迭代器,很是能够考验一个脚本引擎的实现。对方毕业后被网易招去了,并且在待遇上给予了一些人文关怀。

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

这个经历让我感受到了开发一个严谨的界面是多么地不容易。另一个感受是关于需求变更的。设计模式的存在就是为了抵御需求变更,这个真理我直到工作之后才能明白。你必须把一个软件的架构设计得如此之好,才能在需求大规模变更之后,还能在整体上让你的代码是漂亮的、易于修改的、高性能的、并且是安全的。每一次改动都不能是打补丁,你总是需要重构来使得你的代码在任何一刻都在整体上是好的。为了达到这个目标,就需要熟练掌握并使用设计模式来开发项目。

微软的跟别的公司比起来罕有一个好处就是他会给你很多时间,让你慢慢把软件做好。而这个好的定义,当然是以功能和可维护性为重点。倘若一段代码以非常精妙的方法来高速完成一个任务,但是却复杂到哪怕写遍了注释也不能让后续维护的人看懂的话,那这段代码是没有实用价值的。一段好的代码,不在于它的设计有多么巧妙,不在于它的算法有多么高深,而在于它可以被几千个人同时开发 10 年,并且在持续添加功能的过程中,不会因为过于混乱而导致出现了重写的需要。

跳槽

后来我因为一些原因申请了到微软亚洲研究院(MSRA)的人事调动。2011年1月份我在获得了经理的批准之后,从上海前往北京参加研究院的面试。这一次面试仍然有五轮。这次面试很难,其中一个面试官因为在我的简历上发现了很多跟编译器有关的东西之后,决定让我实现一个 strncpy 函数,要求是 CPU 对内存的访问次数要最少。这包含了很多诸如带宽、对齐和二进制字节位移操作等各种问题。方法本身就已经很繁琐,再加上纸上写代码总是免不了要犯错误,所以我依然没有时间把整个程序写完。另一个面试官老外在年轻的时候也做过一些编译器的事情,让我出乎意料的是他在面试的过程中没有跟我出题目,反而就编译器的各种算法和问题聊了整整一个小时,基本上我会的知识全部都因为要回答问题而说了出来。之后我跟这个人产生了深厚的友谊。

不久之后我就获得了调动的批准。在做了一些包括给上海的SQL Server团队建立单元测试标准之类的收尾工作之后,我于2011年的4月份前往北京,正式成为微软亚洲研究院的一员,做一些跟分布式系统相关的研究。

Microsoft Research Asia

研究院的工作比较特殊,主要是由于我没有加入什么长期的项目,都是跟着几个 Researcher 干活。第一个项目做的主要是一个动态分析的项目,判断一个C/S架构的程序会不会死锁,以及给出一些报告,帮助程序员弄明白问题的根源,进一步修改调试自己的程序。后来就跟着他们做了一下图像搜索引擎、分布式图数据库,临走前帮他们做了几个爬虫来充实微软自己的 knowledge graph 项目的数据等等。

在研究院的这几年,其实除了增长了一些技术上的见识,和学会了如何成为一个老油条以外,技术上主要的成长仍然来源于自己开发的 项目。研究院的结构是非常适合我这种喜欢把玩复杂(但不一定是新)技术程序员的。而且我在研究院的直属老板还是邹欣,让我深刻的明白了一位好的领导是多么的重要。

已经写了四年半了。写 GacUI 的初衷是,想给自己的语言做 IDE,但是只有 C++ 写parser才写的爽,之前又试验过 C# 写 UI,C++ 写智能提示算法的项目。

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

不得不说,当初由于不喜欢数据库所以跳槽到了研究院,结果研究院看我是从 SQL Server来的,弄了很多数据库的东西给我做。后来我找了老板说能不能弄点别的啊板问我那你想做什么,我说弄点编译器的东西试试是老板后来安排我给另一帮研究院,替他们做一个分布式图数据库的 query language。不过这种东西本来就是超级简单的,很快弄完之后,我又变成做数据库的了。于是这让我明白了一个道理,多半研究院是没有我喜欢的东西的了。

于是又过了一些年,由于我对北京(主要)和研究院(次要)的不慢逐渐增加,于是我赶紧弄了个老婆之后,就触过了。

其实跟普通的面试是一样的:

  • 找到你想要去的组

  • 联系他的老板,把简历给他

  • 看他是否因为经济危机或者收购案件什么的,正在裁员或者无法招人

  • 然后面试

  • 拿 offer(这是肯定的)

  • 办签证

这个过程让我不由得感叹,美帝的面试官就是没有见过世面啊。竞争压力太小了,搞出来的题目都超级容易,得让他们来中国呆一呆,面一面,不然美帝迟早药丸。不过我觉得另一个方面是,我给 Office 做跨平台 GUI 的那个组看了一下我做的 GacUI,估计他们觉得还不错吧,就随便面了一下我,这也是有可能的。

在这里不得不提到微软照顾员工真是无微不至,不仅帮我提供优质的搬家服务,在我到了美帝之后还给我安排了一位大妈,负责帮我融入现代社会。还说如果我觉得自己牛逼不需要这些东西,就给我两万刀。这些就算在谷歌,也只有被公司强行安排到美帝(而不是员工自己想出国)的那些人才有。最重要的是,微软员工买 BMW 还能打折,真开心。

虽然牛逼的人在中国和美帝拿的工资并没有太大差距,但是撇去美帝的IT地区跟北上广相似的房价以外,美帝除了汽车和电器的其他东西贵得一逼啊,总体来讲幸福感还是下降了。不过幸好中国IT发达地区空气污染太严重,不仅抵消了这个缺点,反而让我觉得穷一点过得更爽了。于是自从翻了墙,每天就过着再也没空把玩电子产品的日子,有空就开车,没空就上班,爽的不行。

果然站在风口猪都会飞啊。明明其它行业的工资中国比美帝低那么多,但是程序员居然只有1-3 倍的差距。果然中国还是需要大量的、专门训练来添补社会主义发展过程中的缺口的、专业的程序员的。

Microsoft Office

这次跳槽刚好遇到了微软要开除诺基亚的人,搞到大部分的组都冻结名额了,只有财大气粗的Office能招人,因此我也就只能来Office了。本来我的目标是想给Edge弄JS引擎,或者去VS组搞搞编译器什么的,无奈他们都太穷了,只好作罢。

在Office的工作让我大开眼界,算是体验了一把一万个人写了三十年的、一个repo的snapshot就有几百G代码的软件是怎么弄出来的。由于机器实在太贵,所以平时修改代码的时候,只能在本机编译,因此我们基于msbuild弄出来的这套CI,还包含了如果需要链接的lib/dll的代码在硬盘里面没有的话,就去服务器找当前checkpoint的编译好的缓存,下载下来编译的功能。因此偶尔build farm挂掉的那几天,由于网络连接断了,本机编译也没办法弄。

尾声

回顾一下自己的编程之路,学生时期大概就是从一开始写游戏,到写游戏引擎,到专门搞游戏引擎需要的图形、GUI 库和脚本引擎,最终由于精力的关系生下了 GUI 库和编译器。我从一开始设计脚本引擎的时候就很注意脚本如何暂停的问题——其实基本就是源自于游戏的需要——于是人肉做了 coroutine 的各种奇怪的实现方式。到了最后终于学习到了正统的方法,于是本来可以很简单的完成的问题,由于后来需求就是复杂了那么一丁点(说白了就是要让脚本也可以 customize(或者说 hack)coroutine 相关的类型系统的一部分内容),导致了需要用无限复杂的方法来实现 coroutine。人类为什么要互相伤害/p>

到了工作,基本就是

  • 本来冲着去弄 Visual Studio 的,而且学生时期还不喜欢 SQL,结果工作的时候由于经济危机的关系给我弄到 SQL 去了,工作的内容包含了学习专业的数据库知识和拖控件。

  • 但是我做了几年还是觉得不喜欢 SQL,就跳槽到了 MSRA,结果 MSRA 拼命让我搞数据库的东西。也不想想本来我就是不喜欢弄这个才走的……

  • 后来我想好吧,反正编译器没得搞了,那我还是拖控件吧。于是我就告诉Office的人说,你看我做 GacUI 多屌不屌!Office 的人说,屌!于是把我招了进来,专门负责组里面不是 GUI 的那部分。

  • 过了半年老板开始安排工作了,我想了个办法表达了一下我还是喜欢弄别的东西。于是终于干起了老本行——给Office的程序员开发内部的编译器了。

总算最后还是做了喜欢的工作。


说句题外话,有不少人想加鱼哥微信,鱼哥姑且放出来,但是坑位有限哦

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

有热门推荐

1、字节跳动 CEO 张一鸣炮轰 HR , “按这要求我自己都进不来!”

2、因为一个YYYY-MM-dd的Bug,我被老板骂的狗血淋头!

3、离职10天,面了4家公司,我的感受…

4、5种将死的编程语言

看完知乎轮子哥的编程之路,我只想说,收下我的膝盖。。。

来源:码农突围

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月13日
下一篇 2020年1月13日

相关推荐