非计算机类专业毕业生五年程序员职业生涯的回顾和思考

0.前言
看到过几篇程序员的职业生涯过程,我也来当一回写手吧,希望对和我一样曾经磕磕碰碰过的人有帮助。谨以此文纪念大学毕业五周年。
(《如何优化程序员的内部培训》,这篇东西for六周年)

1.从校园启程
我的大学专业全称是无机非金属材料工程,这专业多与玻璃、水泥、陶瓷打交道,高大上一点的是各种珠宝,前沿一点的是纳米材料。想先声明的是,我不是在黑自己的专业,只是每个人都会有自己喜欢和适合自己的工作和生活状态。我尝试过为了完成一个程序而废寝忘食后就爱上了这个职业,即使知道这是个加班如家常便饭的工作也义无反顾。而且后来我发现材料工程的学习经历并没有白费,不少 通用的知识技能 在此专业会收获更多,所以跨领域实践中我反而会在某些方面具有优势,这个后面会再提到。
我的程序员生涯起始于校园招聘,那时我的第一个东家来我学校宣讲,它是做笔记本电脑代工的台企,世界500强之一。在校园网看到有要求材料工程的职位我就去了,可是在宣讲会上却被告知无机材料工程的岗位已招满。在大家准备走的时候,我看到还有招聘“软体工程师” (台企的称呼,即软件工程师) 的岗位,因为不想白来,我就在简历顶部写了这段话然后投了这个岗位:
虽然我不是计算机专业毕业的,但我有很多计算机相关的知识和实践经历,请认真看看我的简历,谢谢。
(简历上一些的地方还标记了大圈圈)
午饭后,我同学看到简历筛选结果的海报上有我的名字来给我报喜,那时候我确实喜出望外。先是笔试,专业知识+英语。两个我都有80分左右,又通过了。到了面试,面试官告诉我,就是看到简历上那句话才让我去笔试的,结果笔试成绩也不错,所以让我来面试。也许这是意料之外的事情,本来没抱着希望也就不怕失望,因此我很淡定,面试表现很好。我还指出自己成绩单上仅有的两门和计算机有关的课程,C语言和微机原理,都很高分。就这样,我得到了offer。
是不是好奇我的简历上有什么打动了面试官?其实 都是些我无聊时候做的事,基于兴趣,却无心插柳柳成荫: 平时帮同学们修电脑装系统;自学了VB、VBA、C++、VC++/MFC;考了全国计算机三级证书;当了几个月学生协会的网络部部长;在淘宝倒卖手机和笔记本电脑……
坚持你的兴趣并深入学习,那就是一项技能,说不定哪天还能成为你的谋生手段。

2.第一站:硬件BIOS研发
2009年7月11日,我去公司报到了,就这样开始了程序员的生涯。虽然名为软体工程师,但实际上和硬件打交道更多,工作内容是笔记本电脑主板的BIOS开发(当年EFI BIOS开始普及)。熟悉计算机底层的人会知道,BIOS是PC机架构中驱动程序和硬件的中间层,所以工作内容也会多和相邻的这两层有交集。依然是无心之举带来惊喜,经常装系统和买卖硬件的我对上下这两层的基础知识很熟悉,学BIOS也就相对于其他同事轻松多了。更幸运的是,我遇到四个很好的师傅,给予了我很多的指导。加上我疯狂地补习汇编语言和阅读硬件的规范文档(specification,可理解为电路级的说明书),对这工作很快就上手了,得到大家的肯定。
虽名为研发,实则是从测试做起。刚开始时没权限接触BIOS代码,但要写工具来辅助测试,还需要去生产线澄清各种无法开机或蓝屏的问题。硬件的软件端测试案例都是数以万计的,出现Failed的情况就得协助真正写代码的老员工去定位问题。这些案例我现在大多数忘记是什么了,但其精细程度却让我印象非常深刻。硬件不同于软件可以很容易升级,出厂以后很可能会保持原样直到报废,所以必须在交货前通过无数的测试。在我后来的职业生涯中,我发现我必须感激这个经历,因为计算机生产的严密性深深印在我脑海,在我日后写代码时都会习惯性地想出多个测试案例来,从而在编码阶段防御了bug——这是我写代码少bug的原因之一。
入职半年后的某天,我在宿舍里继续看英文的硬件文档,看着看着觉得很烦躁。我发现这并不是我想象中的软件世界,因为看文档学习到了新知识而很兴奋,可是手痒了想实践却无法动手。想调试硬件当然就需要硬件了,但所需的东西出了公司大门就没有了。简单来说,做底层开发的成就感不如做高层软件来得快和直接,所以那时起我萌生了退意。 即使后来我做了纯软件的工作,这第一份工作学到的硬件知识没白费。我比一般程序员对底层有更清晰的认知,从而对软件如何工作有更深刻的理解,这种理解正是编写高效程序的基础。
2010年3月,在我生日那天,我向部门主管提出了辞职,以此算是给自己的生日礼物,我要去追求自己喜欢的工作。当时我做好了最坏的打算,如果找不到,我就去参加北大青鸟之类的软件培训班,即使半年脱产我也要坚持。为了留多点钱去应对最坏的情况,我离职时没有请完所有的同事吃个饭,现在想想还有点遗憾。
在第一家公司我看到了世界500强的管理制度,并且出于好奇所以有过很认真的观察,再加上在推进员工职业化的e-learning在线学习系统读了一系列课程,这都为我日后做管理奠定了基础,并且起点很高。
还有一个收 获是,在一个30000人以上的大工厂里干活,你更发现自己的微不足道。对比生产线上的工人们,你更清楚什么叫知识改变命运。
(给网友解惑:我的大学是普通的一本,非名校。这家工厂不是富士康。为了避免麻烦,所有公司不会透露名字哈。)

3.第二站:系统集成
那次我都是投C/C++软件工程师的岗位,不分行业。 再次让我意外的是,新工作不难找。也许是因为挂着在世界500强工作过的名号,投出去的简历有20%左右的回复率。是的,出于非计算机专业毕业,出于编程技能的不熟练和不全面,当时的我可谓自卑,期望很低,任何意料之外的收获我都会欣喜不已。最后我去了一家做展览展示方向的多媒体互动系统小公司。因为公司想研发一个新技术,需要很懂硬件知识,有这背景的我就被看中了。
不得不说,我还是幸运的。这公司当时只有十几个人,3个合伙人开始分裂,技术副总即将出走,很多事处于交接状态,没有管事的技术主管。刚入职的我算是没人监督的,前两周都很悠闲。因为上一份工作习惯了C和汇编,所以我在这两周内恶补C++(上班时间也看《C++ Primer》),自学Windows SDK、OpenGL、SVN工具、Visual Studio环境,并且要熟悉公司的代码。也许老总忙完后发现了我的无所事事,给了我第一个任务,升级公司加密狗并增加硬件信息的算法。不复杂,只是要花些时间搞懂加密狗的SDK,比较轻松地完成了。有了这个任务的缓冲,我也比较熟悉了公司的主打产品——没有任何文档,全凭使用它和看代码。过了不久,技术副总正式离开,不知道怎地我就成了接手维护这个产品核心模块的人。
入职满一个月,公司就给我转正了,老板在面谈时说我的能力不错,我还记得当时的心里感受:真愧不敢当,只能说足够勤奋和现学现用的能力不错而已。这个面谈里有一个意外让我的职业生涯过早地加入了管理因素,我无意中跟老板说了些建议,想把上家公司里学到的完善制度搬一些过来。我想老板就因为这事觉得我有管理意识,所以让我去带新来的实习生。然而经过我观察,这个实习生有很多东西不懂,公司也没人有精力去指导他,所以在他的考核评估中我建议不通过。老板让我去告诉他“明天不用来上班了”,唉,感觉是我自己炒掉了一个人,当时心里很不是滋味。
2010年8月,再有一名合伙人出走,剩下老板独大,他不懂技术。当时做软件技术的有5个人,除了我都没在大公司工作过,所以老板看中了我的阅历,想把最年轻又最迟入职的我提拔成经理做管理。我想潜心发展技术,也出于不自信而觉得没那威信去管好老员工,所以婉拒。不过我也能理解那种情形下老板这样的选择虽属无奈但却是对的,所以我答应了作为代经理,并提出希望可以外聘一个有经验的人来当经理。可是老板因为害怕再有技术老大辞职这样的事令公司动荡,所以没再聘任,四个月后还是让我正名当了经理。
这个头衔给我带来了极大的压力,现在回想,还是很感激这种压力,因为它也给了我极大的动力。为了满足这个岗位,我拼命啃书、上网看资料,以常人好几倍的速度成长。因为身为经理,自己的时间相对可以自由支配,我先花了很多时间去做程序优化重构,边学习边做实践,由此打下了坚实的基础。我暗自较劲,用4个月的时间去追赶读了计算机专业4年的人,并逐渐获取同事们的认可。他们也许会觉得我好像本来就学了很多计算机知识。
在公司做了两个月,才知道我们做的软件属于系统集成领域。虽然是编程,但同样要和硬件打交道,只是不用再看电路规范,而是看SDK文档。加密狗、蓝牙、红外摄像头、PFID、可编程串口继电器、投影机、多通道输出显卡,这些东东我都摆弄过,放在今天也许可以去做智能硬件了。软件知识就接触更多了 Directshow、多线程、COM、XML、MFC、OpenGL、C#/WinForm、Windows Mobile(这个碰巧为我得到下份工作的offer加分了)、C++与Flash交互、同步和异步TCP、UDP组播……
我不想当经理的原因之一是要做一些与技术无关的事情。因为呆在小公司,一人会身兼多职,所以工作内容跨了好多个领域:招聘(从发布招聘要求到出题考核、面试录用)、项目经理(制定计划、跟踪进度)、产品经理(从商务部同事中获取大体要求,自己制定最后的方案,和美工部门确定UI,自己提优化增加新功能等)、测试经理、需求分析、架构设计、工作流程制定与培训。这些事其实也不是完全在做无用功,随着阅历增长,会发现如果能从老板的角度来看问题,你能工作得更好。当然,一个最多7人的团队,这些工作不会做得像大公司那样面面俱到,但即使只是管中窥豹,日后想问题的思路已大大开阔了。
我在这家工作干了11个月,确定有好的接班人后就辞职了。原因很简单,就算自己学习能力多么强,还是阅历不够,无法看清 自己以及公司技术业务 以后 的发展,这依然需要有多年工作经验的人来带。既然我已经是这公司里面的技术老大(那时候我连设计模式都不懂啊),那我还能怎样成长?
这11个月,我的工资涨了67%。算上我之后的经历,都在印证着这话(据说出自新东方):如果从一开始就选择可以自我实现的工作,并对所钟爱的工作全心投入,只要公司体制完善,机制健康,加薪晋职这些物质和精神的收获,变成了随之而来的副产品。
有时候想想觉得很有趣:不少新人会先谦虚说自己不会,然后请前辈们指导和自学再赶上来;而我选择先撒个慌然后拼命靠学习和实践来圆谎,从头到尾都不像新人。把谎言当做成长的动力,你觉得是傻b还是变态?自我解嘲一下:“只有偏执狂才能生存”(此话出自英特尔前总裁)。当然,今天的我已不再使用这招,并且也不建议别人这样做。包括对IT界各位名人的名言我也是持一致的态度:无非成王败寇,成功了的人说什么都似乎是对的,但不一定适合自己。

4.第三站:移动开发
为了增长阅历,我带着归零的心态再次去找工作,在简历上甚至没写我是部门经理。但就算不写,这11个月的高强度锻炼,技能的提升和知识范围的扩展是显著的,给我带来很大的优势。这一次只找有一定影响力的公司,投了23份简历获得6个面试,回复率超过25%,还有4个公司我没投但通过搜索简历找到我去面试。我只去了7个面试拿到5个offer。最后我选了一家移动互联网公司做手机软件开发,因为我大学时就用它的产品。
在新公司里重新当小卒,并且后来有机会做管理我也婉拒了,到现在还是小卒。小卒有小卒的快乐,相对自由,并且因为当过老大,也知道如何更好地当小卒。 因为表现优异,我提前了一个月转正。那时我刚好毕业2周年,工资是刚毕业时的3倍。从提心吊胆让公司选我,到后来我挑选公司,这一过程的变化是用艰苦奋斗换来的。那些抱怨难找工作的同学们,你真的尽力了吗?
刚入职的那段时间,我还是一如既往地疯狂看书,补充新工作所需要的知识。在新公司的第一年,我在公司附近租房住,从出门到打卡只需要7分钟,所以我可以工作到11点后才回去,经常是最后一个走的。有了之前的经历总算不是一般的菜鸟了,我发现新知识很容易上手,几乎所有的任务都能轻松完成。既是偶然也是必然,我得到机会去参与一个iOS的新项目,并且在完成第一版后成为了这个项目的负责人。在一段时间里也算带过团队,只是从不想去争取要什么头衔。出于挑战心理,后来主动申请在同一项目内换组。在新组里我本来想再当回小卒,可是碰巧新组的两个原负责人一个离职一个调动,于是再带了新队伍一段时间。最后因为项目解散,2013年6月,我被调去做Android,总算如愿再安心地当小卒,直到今天。
从入职到现在3年多,公司从800人发展到2000多人,而我在7个team工作过,从iOS做到Android(相信这么热门的领域就不需要我再多费口舌介绍了),我所学到的东西都分享在博客里了。随着自身和公司的发展,接触到越来越多的大牛。渐渐地也会明白,所谓物以类聚,大牛们终究多喜欢神一样的队友。所以想和高富帅做朋友的话,既然改变不了高和帅,那就的变富吧,在知识和技能上!“万有引力定律告诉我们,吸引别人的最好方法是去充实自己”  ^_^
在这家公司里,实现了我从上个东家离职的愿望,极大地开阔了 视野。 渐渐地弄清楚自己的境地,摆脱了不是科班出身的阴影,勇于发挥所长,造就自信。在员工多、分工更细的公司,自然会接触到更高大上的事物:设计模式、敏捷开发、各种开发测试的工具和自动化系统、各种事务跟踪系统、对文档和沟通能力的更高要求、时间管理、行业信息关注和交流、开源与知识分享,还有各种更高级的管理理论等。同时也因为足够勤奋,能直接接触到总监级的老大们,近距离地观察他们的待人处事方式,一睹专职管理型人才的风采。其实身为小卒,更贴近一线员工,还能更客观地去反思管理的各种问题。

5.思考
在同事和同行中,也认识了一些不是计算机类专业毕业的,他们都有着一些特殊的品质而在程序员群体中较为出色。他们都是因为热爱编程而奋斗到今天,光想着赚钱而转行做程序员的人是很难到达这境地的。和我同级同专业的一个同学,考了思科的证书,现在在一家游戏公司当运维部门的主管。
那么材料工程的经历在程序员职业生涯上帮助了我什么?
(除了谦卑) 首先是严谨的态度。不像软件那样很容易推倒重来,化工生产的失败就意味着废品,同时生产过程的不严谨还可能产生事故,严重的可以涉及人命。所以我编程会考虑很周全,很少出bug。正如软件工程提倡的,花很多的时间先考虑设计,而编码是轻而易举的过程。
其次是流程化的思想、分解细节的思路。工业生产过程都划分为一道道工序,组成生产流程。在硬件领域,也有流程化的实例,常见的表现为“量产”。当一种硬件可以脱离实验室进入量产阶段,那就是表示要流水线生产化。流程标准化是其表现之一,这需要设计人员去分解问题、透析、总结、再组合。需求分析和架构设计不都是对这些能力的运用吗?正如《人月神话》里的观点,把传统行业的思维方式应用到软件工程,你也许会神奇地发现运作得不错!
最后但不是最不重要的一点是对工作的热忱和敬业。这是我从一位大学老师身上感受到的,他是教我电子显微镜的。 对陪伴了他几十年的电子显微镜,他是那样的热爱。 在授课的时候,他的语气和用词都像在介绍着自己的好朋友。很多内向的程序员在讲代码时也能滔滔不绝,原因就是他们热爱编程。因为这股热忱,乐意花费时间去学习,去探索更多。
其实经历了三份工作后,再加上眼见耳闻,会发现并没有绝对的好工作。 做硬件相对比做软件的工作轻松,但资历深的人同样会高薪;小公司的团队氛围更好,上班会说说笑笑,下班更多一起活动。供求平衡会令价值评估趋于合理,所以通常多劳都会多得。天道酬勤是对的,但也要注意努力的方向。 不要过多抱怨现在怎么不好,现在你所做的,也许都在为日后的惊喜做着铺垫。

-------------------------------------------------------------
1 .要一直不做管理吗?
适当的时候会做的,我知道管理需要面对和做什么,我只是还不想停止编程。还编程的管理者是对团队的不负责,因为管理者肯定有比编程更重要的事情做,所以干脆就别当管理者。当然,这需要公司有合适的制度支持你走纯技术路线。
2.关于如何选择前路:
这是职业生涯规划的问题,如果真的难决定,建议买些这方面的书看看,应该对你会有启发的。对于程序员如何发展的书就更多了,个人推荐这本《程序员成长路线图 从入门到优秀》适合将要入职场或进入不久的人。
3.那家500强的管理制度好在哪?
这个问题太大,我说两件小事来代表吧。一个是入职培训的时候,讲师会教导员工把纸杯在手里抓扁了才扔进垃圾桶,这样桶里就能装更多东西,节约塑料垃圾袋,环保。另一个是我去找一位比较高层的主管签单领硬件材料,主管找了一下笔后签了字,然后跟我说:“你以后可以随身带着笔,不只是跑这些流程,对你其他工作都会有用,这样能提高工作效率”。
工作那么多年了,我依然保持这里得来的习惯,离开座位就把凳子推进桌子下,避免挡道。
4.500强的笔试题?
差不多忘光了,有考硬件知识、行业信息(如下哪些是计算机信息类网站)。最后一道问答题是考如何用光盘安装windows系统直到正常使用,这道题即使放在今天还是很多坑的,你可别回答一键ghost。有兴趣的话可以在评论里试答这道题。
5.前两份工作我都没有做超过一年,可谓进入了频繁跳槽的行列。但从今天去看,这两次跳槽都对。第一次是弄清楚了个人的目标,要去追求喜欢的事物;第二次是追求更快更健康的成长,希望舞台更大。我个人觉得,只要不是为了钱的跳槽都是合适的,不在于跳得快不快,而在于现状能否满足你的需要。所以理所当然的也是要知道新的环境能满足你才好跳,人生没有太多试错的机会。
6.一个同事说,领悟能力很重要。我想结果是这样的,但领悟能力并非天生。材料工程有很多思维能运用到软件工程上,而且一些方法的层次高度远比软件工程高,所以可能我的学习方法和一般的程序员并不同。我在第一家公司,学到了这三个东西:六西格玛、IE七大手法、QC七大手法,这是工业企业里常提的理论(不解释了,请自己问谷歌),但仔细去思考,会发现和很多软件工程的思想是类似的。他们告诉了你如何分析问题、如何保证和评估质量等。当你把多个领域的事物做一下类比并总结,你对这些领域的东西都会有新的和更高层次的认识。就像你掌握C++后去学Java或C#(或像我一样掌握了iOS后去做Android),你能总结出他们有什么相同的设计和为什么这样设计吗?
7.毫无疑问,英语很重要。在台企里一半以上的工作邮件都是英文的;移动开发领域越底层的东西就越少中文资料。

--------------------------------------------
2016年2月的补充:
客观地看,这样的经历很少人能做到。观察和学习能力是必须的,我只是最大程度地发挥了这两个特长。请一定要甄别好该模仿的点在哪里,还是我帮大家总结好些:坚持去追求你想要的东西,发挥自己的长处,发掘所有达成目标的途径并做判别和尝试,懂得取舍,常做反省总结。
既然本文是为了励志,那就做到底吧:第三站的公司已被收购,跟随上市了,IT行业市值第一。

你可能感兴趣的:(管理,我的2014)