Matthew Note

回顾我的第一份工作

0x00 序

2012年研究生毕业,我就来到了SonicWALL,当时自己是一个通信专业毕业但是很想去互联网开始第一份职业生涯的人,但是非科班出身的背景和毫无实习经历的我,在寻找第一个工作的时候并没有拿到我特别期待的BAT的Offer,PPS, 中兴,阿朗,SonicWALL成了我最终的候选公司,权衡了多次还是选择去SonicWALL这家看起来不大的做网络安全的外企,后来庆幸决策是对的,四个月后SonicWALL被戴尔收购,变成Dell Security,还加薪了,当时觉得感觉超好,然而悲剧在后面等着你。

想想当时被面试,到后来面试别人,发现确实仅仅通过聊天和写几个程序是完全没办法衡量一个人的潜质的,但是又没有其他更好的办法,所以即便我自认为学习能力很强,但是这种没有任何可以佐证的口号没人相信你,当然也有很怪的公司,比如宝信,竟然在你研究生毕业的时候问你的高考分数,当你报了一个很高的高考分数的时候,对你的态度全变,感觉就不用继续面下去了,就已经过了。

总结这些,我还是想对那些即将毕业的同学们说,别怕得罪你的导师,尽量去外面找实习,公司越大越好,500强,BAT。。。,等你找工作的时候即便笔试面试都不那么出众,也可以相对轻松的拿到Offer。

0x01 工作

工作内容是开发一个远程接入设备(Secure Mobile Access Appliance 也叫Aventail), 是一个Debian based server,这份工作的开始对我来说既是机遇,也是一个挑战,机遇在于这是一个全新的组,刚刚成立,开始接手本来在美国的服务器端的开发,组里只有四个人,并且没有专门的PM带,服务器里数十个Daemon,和数十个Kernel module,每个代码量从近万行到10几万行不等,几乎处于个无从下手的情况。

调试和读代码

当时由于无知,费尽心思想找到一个像VS一样的IDE,让我能够在Linux系统里用单步调试一点点的去跟踪代码,但是尝试了各种,发现都是不可能的,那是一整套基于服务的系统,每一个都是一个本地socket,你想用GDB单步调试都不可能,因为block时间多一点,其他服务就认为你超时,就放弃重连,所以最终我还是回到了最开始我很不屑的打log的方法。对于我这种没有人带的完全home-grown的码农,我自己找到一套适合调试的方法:

  • 打log
  • 加abort, 然后分析core dump
  • 抽出局部代码伪造错误case,试图复现

我至今都不知道行业有没有更高明的办法,处理这种依赖程度超强的大型系统的debug方法,但是我现在经常用的这三招,基本上帮助了我解决所有简单或者复杂的bug,当然精通gdb是必须的,并且要有些汇编的功底,要了解linkage的过程,和ELF文件格式,这是前提,在处理coredump的时候非常有用。

对于读代码,我也尝试了各种工具,包括被大家广为推崇的VIM,Emacs, sublime, vsc等等等等,Emacs实在是太难的,键盘的映射都要改,所以直接放弃,VIM在配了一堆插件之后确实会变成一个比较好的阅读器和编辑器,我也有自己写了一个自动化的配置脚本MyVim, 直到我碰到了source insight。

Source Insight是个非常古老的软件,甚至他连C++11的新关键字和语法都不支持,最新的一版似乎是在2015年3月更新的,也仅仅是打了个patch,但是他确实是一个Windows下看代码的神器,自动哦建立一个相当准确的索引。读代码炒鸡爽。

搞了这么多,我现在也是在vim,vsc, si之间来回的换着用,各有不同的用处,对于一个home-grown的码农来说,够了。

学习和进步

最开始我也是一个对英语过敏的人,虽然身在外企,还要经常和米国人开会,csdn和google是我最多使用的东西,后来渐渐的我发现,网上大把大把收到的博文和帖子对于问题的处理大多仅仅处于处理问题,对于问题的原因解释不清,我希望我能看到最本质的东西,但是尝试去看一些源代码又太过高难,后来我发现stackoverflow上面的东西老外的回答却是精彩,而且针针见血,所以我开始集中在stackoverflow上尝试解决问题,并且发现他们引用的东西就是相关的官方文档,一点点的我开始忍住恶心看各种我用到的库或者框架的英文文档,很多东西是有中文文档的,但是在我看来中文文档要么老,要么翻译的怪,我甚至要在脑子里把它翻译成英文才能正确理解他的意思,所以我索性只看英文文档,而且我发现这些官方的Get started都写的非常清楚易懂,非常适合我们去读,当然man也是一个好东西,我不会记住每个系统调用或者标准库函数的具体参数,我也记不住,每次用的时候就man一下。

这样下来,久而久之,英语阅读越来越流畅了,也不觉得痛苦了,我觉得除了读书,官方文档是最佳的学习的地方,他会提示你所有可能用错的地方。

代码风格

刚刚入职的时候,我只是一个能编程的人,但是并不是一个合格的工程师,好的代码风格,编写思路是一个好的工程师必备的能力,这几年来,我发现写代码并不是一个难事,难得是维护代码,一个写的很糟糕的代码是让人很难理解的,你即便读懂了每一行内容,但是却不知道他究竟在干什么,所以代码的可读性非常重要,当然好的文档也非常重要。
但是有的时候,代码的可读性和效率是矛盾的,一些时候你可以用一些精妙的方法获得一个非常好的效率提升,但是这会导致你的代码变得难以理解,这个时候衡量可读性和效率就是你要考虑的了,当效率并没成为瓶颈的时候,也就是说你写的优化的代码并没显著提升整个程序的运行速度,那么可读性应该是你第一要保证的,因为代码以后可能不是你来维护,你要让每一个人都能理解你的代码,以至于他不会犯错误。大大降低维护成本,而且现在的计算能力越来越廉价,效率有的时候没必要放的特别重,当然我也不是说你可以乱用内存,粗暴的使用CPU,只是说要学会平和代码的可读性和效率。

开发文档

我们特别注重开发文档,以至于我们在一个release要花费60-70%的时间在推敲开发文档上面,最终代码实现非常的快,这其实是有好处的,看似你花费了很多时间在一个不必要的事情上,但是这也给你大量的时间反复的设计你的软件,和系统架构,要比草草的实现,然后在重构要好很多,但是这似乎并不匹配中国的开发节奏,所以。。。理想总是骨感的。

让脚本帮你忙

我们是一个linux based server,所以开发机通常是虚拟机,各种虚拟机,所以在开发不同版本,或者去解不同版本的bug的时候,你就需要一个完整的配置好的虚拟机,这样才能尝试复现问题,那么下载镜像->创建虚拟机->安装镜像->完成初始化配置这一系列动作通常会耗费我大量的时间,而且是重复劳动,我完全可以像一个异步系统一样在这个时候去做其他事情,这个时候各种脚本的价值就凸显了。

Shell和Python是我的最爱,我自己写了脚本可以让整个创建虚拟机的这个过程自动化,我只需运行我的脚本,告诉他我要的版本号,他就会自动的去下载镜像,创建虚拟机,完成初始化配置,而你只要安心的去做其他事情,过个10分钟回来就可以直接用了,所以当你经常在做一个繁琐的事情的时候,考虑让脚本拉你一把。

做一切能做的事

在这次的几次面试中,几次被问到,你似乎还做运维的工作? 我什么都做,只要我能做,我觉得工作中,任何一个需要解决的问题都是工作的一部分,所以我基本上不会求IT帮我,除非我没权限,搭实验室的时候我自己学着配三层交换机,opengear,甚至自己做网线,能够自己做的事情尽量自己做,都是一种积累,修理变砖的设备也不是我一个开发应该干的,正常流程是返厂,但是我自己还是尝试自己去修,也帮sales省下了大把的销售周期,虽然这跟我没有任何关系,但是我学到了这样一个设备到底是怎么启动并且保证固件不被恶意篡改的,两全其美。

0x02 导师

我非常庆幸我能在这个公司遇到两个非常好的导师,实际上也不是导师了,只是我和他们共事,Chris D PetersonWilliam M Perry,他们年龄都很大了,基本上和我父亲同龄,所以他在工作上给我的指导非常有价值。

Chris 1986年从MIT毕业的时候我才刚刚出生,他参与了Linux X windows这个项目的开发,他所开发的模块至今还在所有Linux发行版上使用,他是一个在C++和unix系统开发上相当专注的人,他给了我非常好的编码建议和思路,让我在这四年间受益匪浅,也许是他也很信任我,他把整个系统最核心的由他开发的模块给了我维护,并不断的给我各种建议,我真的感谢他,付出了大量的精力辅导我这么一个小白。

Bill也是很厉害,他是那种真正的全栈,也是整个Aventail的创始人之一,上从CSS下到linux kernel module他全能开发,他给我的职业生涯提供了广度,他的持续学习也深深的影响了我,快50的人了,依然在不断的学习新东西,而且不用很长时间就能上手,我想这是一个程序员的职业精神吧。

我离开Dell最舍不得的就是这两个人,真的对我影响非常之大,我由衷的崇拜和感谢他们,希望我们有机会上海或者西雅图再见面。

0x03 说说戴尔

再来说说戴尔这个公司吧,总的评价是负面的,首先他不是一个科技公司,他只是个销售公司,他不知道应该怎么做研发,怎么尊重工程师,在戴尔中国,工程师的平均薪资是远远低于销售的,而且最开始被戴尔收购的时候戴尔竟然是用你写了多少行代码,删了多少行代码来评价你的performance的真是无语,戴尔在这种无知的状态下运营了我们4年,导致整个SonicWALL产品线错位,最后又收购了EMC出售了整个软件集团,更恶心的时候竟然不想赔违约的钱,所以对戴尔没什么好评价的,戴尔不是科技公司,以后任何和戴尔相关的公司都慎入,EMC的同志们,小心了。

0x04 在说说中美市场

我们是一款VPN产品,那么在中国最大的竞争对手是深信服,我有研究过深信服的产品,并没有比我们强大,但是中国市场讲究的是尽可能的满足客户需求,但是米国人并不这么认为,因为他们觉得非标准化的东西是没必要提供的,然而我们恰恰就是卡在这里了,想打开市场,就要改变这个,然而,米国人不愿意,同时米国的节奏也完全的慢半拍,他们的生活确实是和工作平衡的非常好,我也承认那才是生活,但是对于customer issue也慢半拍就会搞得中国客户很不满,毕竟我只负责一部分的开发,我确实尽快解决客户的问题,但是那些由美国和印度开发的模块就完全不受控制了,所以经常说外企在中国水土不服原来越严重不是没有道理的,这根本上是价值观的不同。

0x05 推荐书

  • 代码大全
  • C++ premier
  • 鸟叔的Linux私房菜
  • TCP/IP详解
  • HTTP权威指南
  • Learning Python
  • Python Programming
  • UNIX网络编程
  • UNIX环境高级编程
  • JavaScript权威指南
  • 深入理解Linux内核
  • 程序员的自我修养
  • Effective C++/STL

0x06 总结

四年来我亲手接过了四个模块的核心开发,搭建了上海的Performance lab,解决了无数bug,也帮sales修了许多台被玩坏了了的设备,但是很不幸的是,我走的时候,还没有任何人能够接手我的位置,我觉得我这一走,上海的server开发就要清零了,我是感到无比的可惜,那毕竟是我亲手一点点建立起来的,包括技术,包括信任,那都是我的心血啊,今天去实验室和我亲手搭起来的实验室见了最后一面,我走之前,大概不会再去弄他了,希望其他人可以take care them,我很想把我的所有技能传授给其他留下的人,但是有些东西真的是只能意会不能言传。

总之无奈,离开也并不是我所期待,但是真的是这四年间,戴尔毁了整个公司的节奏,加之这次出售风波,公司的前景在我看来更加不明朗了,Shanghai Site VP很努力的在帮我们争取各种利益,但是结果都是不尽人意,他在这期间苍老了很多,看着很令人心疼,真的非常感谢他,但是无奈,我也没有办法,再见了SonicWALL,再见Aventail,我会在思科或者阿里开始一个全新的职业生涯。