轮子哥:回顾我走过的编程之路

作者简介:vczh,本名陈梓瀚,因知乎的个人信息介绍上写有“专业造轮子”,所以江湖人称“轮子哥”。vczh 大学时代就在微软实习,毕业后即加入微软。开始时是在微软上海,后来进入北京的微软亚洲研究院。现已移居美国西雅图,在 Office 组做工程师。

正文

2

  图形编程做久了,就想起了当初的理想,于是就搞游戏去了。那会儿看到了成都金点工作组开发的《圣剑英雄传》,点燃了我开发 RPG 的热情。在经历了几次失败之后,我终于在高二的正月初一那一天完成了《天地传》的所有编码工作,没过多久就上传到了 GameRes 的网站上。

  这是我第一个行数过万的程序。为了顺利完成它,我悟到了很多道理,包括为什么要面向对象,为什么要划分模块减少互相依赖。这也成为我后来开发自绘图形界面和脚本引擎的契机。后来我试图用 OpenGL 做 3D 游戏,但是由于很难找到有共同爱好的美工跟我一起做,便作罢了。但是这却让我获得了很多时间,可以投入到图形界面和脚本引擎之中去。

4

  提交了毕业设计之后,我又在毕业前的几个月时间里面完成了 CMinus。这不是编译原理课程设计上的那个简单到没法再简单的 CMinus,而是一个完整的 C 语言编译器(其中函数指针的语法被我改掉了,但是仍然支持)。其编译结果是保存到内存中的一段 X86 二进制代码,可以将函数的起始地址强制转换成函数指针直接在 C++ 程序中使用,这是因为我在生成指令的时候遵守了 Visual C++ 中的一些在 MSDN 里描述得很清楚的约定。

  毕业后我又雄心勃勃地做了 NativeX,是一个带泛型以及 concept mapping 的 C 语言。前几个月我又试图山寨 C#,但是无奈 C# 实在是太复杂,所以转而去做 GacUI。图形界面(GUI)类库我也写了不少。继高中的时候为 RPG 而开发的两个控件类库之后,在上大学的过程中使用 OpenGL 开发的两次 GUI 类库均告失败。后来还封装了一次 Windows 的 API(Vczh GUI),试图让其易用性接近 VCL 或 WinForm。

  毕业后我又尝试发了若干次基于渲染的 GUI,换了几次架构,一直到现在正在开发的 GacUI 才感觉走上了正轨。我在这个过程中得到的一个结论就是:Windows Presentation Foundation 的设计实在是太完美了……在做这些东西之余,我还开发了三次三维物体的软件渲染程序,前两个是在毕业前做的,最后一个是一年前因为一下子不知道要如何利用业余时间来充实生活而开发出来的,目的是用于打发时间。

6

  自己的编程历程不仅包括自己在业余时间内做的这些程序,而且也包括在微软实习和工作的过程。高中的时候就听说了华南理工大学有微软俱乐部的事情,再加上自己对微软也持有一定的向往,因此在入学之后,除了学院的学生会以外,我就一直在密切关注着微软俱乐部的招新,并且忽略其它所有社团。不过说实话在学生会和微软俱乐部的工作也纯属打酱油,没干过什么正事儿。

  大二的时候微软搜索技术中心(STC)来微软俱乐部收简历的时候,我在路上碰到了陈健老师,也就是之前提到的班主任,就跟她说了这个事情。后来由于对方说我年龄太小而作罢,因为其它人全部都是研究生。到了大三的时候,陈健老师就跟我提到她可以找老同学帮我投微软的实习简历,因此我于 2008 年 3 月份接到了微软上海的电话面试。电话面试有两次,第一次对方是一位 HR,第二次则是一位软件工程师。在第二次电话面试的过程中,我们聊了上面提到的 FreeScript,还针对一些数据结构和框架设计的问题进行了热情洋溢的讨论。没过几天,我就收到了面试通知,前往上海闵行区的紫竹数码信息港面试。那是我人生中的第一次面试。

实习

  微软的面试安排精确到秒,这跟某些公司比起来要人性化许多,不会动辄浪费别人数个小时的时间。实习的面试一共有三轮,对话全部使用英语,尽管里面只有一个是外国人。我还依稀记得被那个年轻的老外面试的时候由于过于紧张,而导致一道简单的问题没有给出最优解的事情。不过他们最终还是让我进入微软位于上海的一个 WCF Tools 小组实习。

  这个小组有一位让我十分尊敬的软件开发主管葛子昂先生。葛先生是一位热爱敏捷并且经常投身于实践中的人。他在我长达 4.5 个月的实习过程中,教给了我很多软件工程上的东西,而其中最重要的、让我受益匪浅的则是关于单元测试的内容。

  除此之外,我也体验了快速迭代、Scrum 会议、结对编程以及基于源代码版本管理系统(我们使用的是 TFS)进行多人协作开发的流程。在经历了为 TechEd 大会修改 PetShop 制作 WCF的Demo、为 Visual Studio 2010 的 WCF 开发工具修 bug 和开发一个具有高度可扩展性的配置文件编辑器之后,我于 2008 年 12 月份结束了在微软的实习。经过了这次实习,我对源代码的掌控能力也得到了提高,并且直接体现在我利用业余时间开发的项目的代码质量上。

转正

  在实习结束之前,我获得了一次面试全职员工(FTE)的机会。当时形势十分严峻。2008 年美国的次贷危机于 10 月份正式影响微软上海,公司在那一段时间决定减少全职员工的招聘数量。而我是 11 月份进行转正的面试,结果这件事情令我十分紧张。后来葛先生表示他的个人建议是希望我毕业后留下来继续工作,让我吃了一颗定心丸。

  实习生转全职员工的面试一共有五轮。其中令我印象非常深刻的是有一轮的面试官问了我很多非常复杂的问题,最后还考了我一道关于线索二叉树在线更新的问题,不过我已经记不清楚具体是什么内容了。我只记得我花了很长时间终于想到了一个正确的算法之后,时间就结束了,根本来不及在白板上写代码。后来我终于通过了面试,少数的几个名额里面终于被我拿走了一个。不过听说几个月后限制开始放宽,没有我面试的时候那么困难了。

  在实习和面试的过程中,我觉得华南理工大学软件学院开设的很多课程其实都是十分有用的,特别是关于数据结构、设计模式和软件测试的内容。这些都是在工作中十分有用的知识,并且也需要在今后的工作中继续积累这些东西的经验。只不过因为学院学生人数众多,而一个新的学院总是免不了缺乏一些师资力量,所以我有很多同学都表示很难体会到课本中所提到内容的作用。想必如今应该比我们那几年要改善许多了。

Microsoft SQL Server

  面试结束到获得 offer 中间隔了几十天,最后HR的通知在除夕的那一天终于到来了。之后的半年时间我就在学校里面继续做自己的事情,偶尔参加几个活动介绍经验等等,还有就是跟一些人出去游玩。毕业后动身前往上海微软。中间发生了一些事情,因为名额变动的问题,我虽然拿的是WCF Tools的offer,但是最后却被安排到SQL Server组,在此之前我并没有收到通知。由于我比较不喜欢数据库,对SQL Server了解很浅,所以我做了一年半的SQL Server Management Studio(也就是传说中的“界面”)的开发。在这期间我跟同事们传播了一些关于单元测试、界面开发、设计模式、Linq和语法分析器的知识。

  这一年半的经历让我成长了许多,主要是比起实习,正式工作的时候总是免不了经常要跟别的团队、公司、民族、国家和物种进行热情洋溢的广泛交流,而且还占用了不少的时间。有些时候还要坐飞机前往美帝,感受一下社会主义的优越性。正式软件的界面部分十分复杂,不仅要在操作系统的 DPI 变动以及本地化(大部分内容是把界面上的文字翻译成别的语言)的过程中界面的布局需要自动调整,以便不让一些文字或者按钮只显示一半,还要照顾各式各样的残疾人(特别是失去视力的人群),并且对于某些自绘的复杂内容还要提供一些运行时的接口,使得自动测试团队可以完成他们的工作。

8

  后来我干脆就想,要是整个都能用 C++ 来写多好啊。但是 C++ 的 GUI 库对 MVVM 的支持都是垃圾,于是就有了 GacUI。但是做一个 GUI 库工作量实在是有点大,我又追求要有良好的开发体验,因此就做了这么久。今年应该可以出 1.0 了……

  通过开发 GacUI,不仅理顺了之前那么多年做的 7 个天国的 GUI 库的经验教训,还学会了如何最小代价开发跨平台的客户端程序。其实写一个跨平台的程序一点都不难,不知道为什么网上有那么多人搞的鸡飞狗跳。GacUI 给我带来的另一个好处是,基本全部复习了一遍设计模式的内容,而且由于体积庞大,我还弄了一个专门在不同 git repo 之间实现偏序依赖的小工具——用来把一整个 repo 下的 C++ 代码打包成两个文件,以便于其它repo直接使用。本来想试试 submodule 的,无奈 submodule 只能实现树形依赖,实在太烂。

  GacUI 最后还复习了之前学过的编译原理的内容。因为 GacUI 在编译 XML 的过程中,实际上是把所有的东西都翻译成了一个脚本引擎的字节码,最后要么直接运行这个脚本,要么把脚本翻译成 C++(正在开发)。因此为了实现这一点,写一个编译器在所难免,而且编译出来的东西还要能跟 C++ 那边的类相互沟通,从而又复习了一遍 COM 的内容(尽管我并没有使用它,我只是尝试做了一个一样的东西)。

  等 C++ 生成搞定之后,我就要继续写去年就开始的 GacJS了,把 GacUI 搬上浏览器,全方位运行我的 IDE。适合使用 C++ 的那些领域真是博大精深啊!

翻墙

9

  不得不说,当初由于不喜欢数据库所以跳槽到了研究院,结果研究院看我是从 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>

到了工作,基本就是:

  1. 本来冲着去弄 Visual Studio 的,而且学生时期还不喜欢 SQL,结果工作的时候由于经济危机的关系给我弄到 SQL 去了,工作的内容包含了学习专业的数据库知识和拖控件。
  2. 但是我做了几年还是觉得不喜欢 SQL,就跳槽到了 MSRA,结果 MSRA 拼命让我搞数据库的东西。也不想想本来我就是不喜欢弄这个才走的……
  3. 后来我想好吧,反正编译器没得搞了,那我还是拖控件吧。于是我就告诉 Office 的人说,你看我做 GacUI 多屌不屌!Office 的人说,屌!于是把我招了进来,专门负责组里面不是 GUI 的那部分。
  4. 过了半年老板开始安排工作了,我想了个办法表达了一下我还是喜欢弄别的东西。于是终于干起了老本行——给 Office 的程序员开发内部的编译器了。

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


转载声明:本文转自「菜鸟教程」,轮子哥:回顾我走过的编程之路。

来源:CG国斌

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

上一篇 2017年9月1日
下一篇 2017年9月1日

相关推荐