程序猿生存定律这系列的文件夹在这里:程序猿生存定律--文件夹
喜欢从头瞄的,能够移步。
-------------------------------------------------------------------------------
一个关于项目经理的故事
1 项目经理的养成日记
L在2001年毕业之后增加到了福建实达公司。
在今天这个公司差点儿是非常少有人听说了,但在当年实达还是在IT这片江湖里有些地位的。
当年实达的产品线非常全。有网络、有电脑还有外设。外设里面就包含了终端、打印机和POS机。
当然也还做过VCD。只是即使在2001年VCD这一笔也是作为失败案例来提的。
当年L选择了到外部设备公司去做激光打印机驱动程序。那时候实达外设试图开发一款自己的中端激光打印机。因此须要全线配备软硬件人员,正是借助这个机会。L增加了激光打印机这个团队。
如今想来这个决定有点狂妄。无论是自己还是实达。
随着iPad这类平板的兴起,人们的打印需求越来越少,所以激光打印机这类东西越来越不受关注,似乎要被被强塞到旧纸堆里了。但无论它火不火,单纯从技术难度上看,这东西绝对照手机难做。虽然世界上全部做打印机的厂商加起来市值也不一定有苹果高。
激光打印机包含如今的多功能一体机属于是精密机械。机械、光学仪器、硬件、软件、甚至图形字体都搅在一起十分难搞。没有绝大的投资。绝对啃不下来。
激光打印机等利润最丰厚的部分是面向企业的各种机型。目前这块市场始终在富士施乐、佳能、理光等少数几家厂商手中,国内并没有厂商介入这一领域非常可能是和介入壁垒过高有关。在2012年,非常多日本有名的大公司都巨亏。但做激光打印机的还能支持。我想这也和这一领域壁垒过高,竞争对手不多有一定关系。
当时做这个项目的时候,团队里的人员都非常痛苦。L这个做驱动的尤其痛苦。
微软为打印机提供了标准的驱动程序叫Unidrv,假设基于这个来做,虽然也麻烦,但基本不用编程,主要工作是调整配置文件。
之后这个驱动负责帮你生成打印机能认识的用专门语言描写叙述的页面数据,那时最主流的页面描写叙述语言有HP的PCL和著名的PostScript。
但用Unidrv坏处是这样一来你能定制的东西就非常少,非常easy的六合一功能都没有。所以假设真的自己开发产品。那驱动程序最好要自己从头写。
但L当时没认识到自己写事实上是不太可能的。
L当时的水平大概是这么个状况:C++基本会用,但达不到非常高的水准,熟读《Windows核心编程》,但大部分书中讲的内容没实用过,反倒是MFC用的比較熟练,但非常可惜的是做驱动的时候MFC用不上。
通过了高级程序猿考试。所以各种通用算法和数据结构没什么太大问题。
而从头做驱动须要什么呢,你要了解Windows提供的DDI接口,要了解图形图像、字体、页面描写叙述语言、色彩的知识。
打印机驱动中最好做的是UI。基本上用Win32即可了,最难的是做页面渲染。也就是把GDI描写叙述的页面转换成对应页面描写叙述语言(PCL)描写叙述的页面。这一过程非常繁杂。根本不是0基础程序猿能搞定的。当中不说别的难点,一个图像二值化就能憋死非常多0基础程序猿。彩色页面打到黑白打印机上,要把彩色图转为用黑白两色表示的灰度图。这东西那那么好弄的。
简单来讲是,L当时是两眼一抹黑,差距太大。
能够举个最简单的样例来形象说明这样的差距大到什么程度:L当时基本的调试也不会,仅仅能用OutputDebugString()输出用DbgView抓Log,来看程序那里有问题。
有人可能非常奇怪说2001年时,VC6的调试器不非常好用么。
秘密在于。Win98的打印机驱动是16位的,VC6全然不好使。直到后来找到SoftICE才攻克了这个问题。
一边做驱动的开发,L一边把Unidrv搞定了,这样基本上不耽误其它硬件开发工作。同一时候L疯狂补各种知识,单仅仅为了把C++搞通就啃了数本书,当中最难啃的反倒是《C++程序设计语言》。这书即厚又不好懂,那时候那明确什么叫不充分的抽象。但回头想来,读这些书事实上对工作帮助不大。打根基的东西总是见效慢。
这就和高烧40度要赶紧挂水一样,吃中药慢慢熬。就是没有立竿见影的效果。当你须要搞定矢量图形怎样转换时,设计原则、面向对象这些东西对你能不能做出来一点帮助也没有,仅仅有当你能做出来了,这些东西能够帮你把事情做好倒是真的。
做了一年多后,大家都发现这活实在不是一个人能干的,团队中就又加了2个人,所以L勉强算是个小头目了。
但即使如此,总体进展仍然不太好,这和公司的策略有关,这家公司的核心产品,事实上是针式打印机。并非针式打印机,实达有着自主研发的整套针式打印机技术。
而激光打印机实际上处在摸石头过河的状况,但偏偏这是个资本密集,技术密集的领域,这样一来,进展不顺也就在情理之中了。
如今想来最好的解决方法事实上是买套代码。在上面定制。
等到Win2000成为操作系统的主流。借助DDK的样例,这个问题一定程度上得到了解决。
讲到这里要抛开技术,说下大环境。要不然无法说明L的幸运。当时实达集团有三家子公司:实达网络专攻网络设备,如Modem、路由器等。实达设备专攻外设,如终端、打印机和Pos,实达电脑则主攻PC。
当时这三家公司是冰火三重天的状况:实达网络日子非常好过,发展也非常快。实达外设则稳步发展。实达电脑则活的非常不easy。总体来看实达实际上是处在下滑期,顶着ST的帽子让公司非常难受,新的利润增长点又没找到。尤其是电脑部分。利润是必定是越来越薄。
在实达的三年里L的工资居然没有一点调整,只是L当时没太注意这些,还是在研究驱动。借Win2000 DDK的启示,发如今打印处理器那个环节能够做非常多事情,这样针对页面的各种操作就都能够自己来做了。
正当L把这个工作作出点进展的时候,家里出了点事情。于是跳槽,到了苏州一家也是做打印机驱动的公司。这纯粹是种幸运而不是种安排。假设不是家里有事,L未必会换工作,而在開始衰落的公司里做非主营项目真未必是什么好事情。
在此前整整三年里,L理清了打印机驱动的体系结构。打下了语言、平台的各种基础。确定了基本开发方法。找到了适合的二值化算法,但真没做出什么太大的贡献。
换到苏州这家公司后,借助过去的经验,职位有所提升,是以Leader的Title入职的,实际上是项目经理。只是一进公司,L非常惊讶,当年从头开发驱动只是也就三个人,这里维护现有驱动搞了快20号人,主要做的事情就是改动现有的驱动程序,每次代码变更量不大。绝对的八旗子弟。
只是麻烦事也出现了,曾经那有那么多报告,如今需求的确认,日程的确认,合同的确认,记录的跟踪,问题的总结全都要做。一天到晚大事没有小事不断,会议数目直线上升。再加上外语这一层障碍。还常常出现说半天对方还没明确的状况。
L信奉适者生存,開始积极转型,把PPT写好,把Excel写好,文档里不能有小错误,读项目管理书籍,读估算书籍。把口语练好。
过往的技术经验和基础还是非常有帮助的,这让L能够比較快的把握各种需求的规模、难度等。
直到有一天。原来的老大离职了,L被提升成了部门经理,開始带自己的队伍。
公司由于处在成长期。团队的规模也就在不断扩大。而L的责任范围也就随之逐渐扩张。这时候L的工作又发生了变化,曾经是关注一个项目,如今要关注多个项目,也要关心兄弟们的士气。
L这时候技术基础还行。也试图坚持写代码,可发现挺难的仅仅能负责那种时限不是非常严的,独立性比較强的模块。由于你不知道接下来会发生什么。出差、来客人、兄弟们吵架、流程出问题、暂时分配的其它工作等等。
在经历了最初的几次失败之后,L的队伍逐渐成熟,项目成功的几率逐步提高。如今L比較自信。觉得自己是一个比較合格的经理了。虽然不能讲不论什么一个项目到手里之后,都能保证它绝对成功,但至少能够尽可能保证它成功的几率较高。
可惜的是,L发现自己累积的技术基础一点点荒废。基本程序虽然看的懂。但写起程序来变的非常慢,每一行代码调用每个方法都要去细致查找帮助文档。
2 感悟程序人生
我们还是回到之前一直提到的几个维度:
价值 x 实现程度(表达力,稀缺性,公司平台)= 职场成就
从L的经历能够看出来。技术是根本,即使你想做管理,即使你学了可能用不上那么那怕是当敲门砖用,你也要在恰当的领域里有一定的技术基础,这是价值的根本。要不然你可能没有做管理的机会。
不论什么一个企业招一个人都希望这个人能尽快为公司创造价值。这点和大学绝对不一样,企业不负责再培养你四年。因此,一个人非常难对企业说:我什么都不会,我就会做项目管理,你招我吧。一般人非常难遇到这么疯狂的企业。
第二点是你增加处在那个阶段的公司非常关键,假设L一直坚守在第一家公司,L是不可能有所提升的。原因非常多,但当中最关键的一点是在整个产品线中,驱动程序是在一个配套的地位上,而在第二家公司驱动程序则是公司最核心的业务。这点影响非常大。
第三点是做可流动区域小的工作时,要特别当心。短期来看L运气还好,大致攻克了自己的生存发展问题,但事实上假设以20年为尺度来看,问题仍然存在,对打印机驱动从业人员的需求永远不可能像对站点开发者那么强烈。其划定的区域也就非常有限。
实际上这点在L的同事身上有了一定体现:你做的事情相对照较生僻。而你在这一领域上又沉淀了非常久,一旦走出这个领域,又仅仅有年纪大的劣势。而没有优势,这会导致一个人非常艰难。
但以L而言,确实又因此而受益,正由于此领域有经验的人员稀少。L才有机会获得较快的提升。
第四点是一定要避免增加处于衰落期的公司。
假设说,领域想对照较生僻,但公司能够为此支付一定的溢价。那也是有得有失。仅仅要没有欺骗,当事人由于合适的薪资而选择了一个流动性不好的工作。这合情合理。风险理应由自己承担。但关键是L的第一家公司处在衰落期,三年不调整工资基本等价于降薪。假设L不是碰巧离开了。那么纯经济的角度看损失还是要大,一旦正好赶到房价暴涨后买房,那对人生的影响就不是一点半点。
第五点则是关于管理技能的可流动性。虽然说管理技能的大部分是共通的,但由于L的技术背景是驱动开发,L将非常难成为电商类项目的经理人。
L的经历里还潜藏着一个冷幽默,当L不会做驱动的时候。他被分配去做驱动。当L不会做项目经理的时候,他被分配去做项目经理。当L不会做部门经理时,他被分配去做部门经理。
大致上是在做自己能力不足以匹配的事情,L的人生仍然再继续,不知道此后的人生是否仍然会符合这条规律。
一个技术牛人的成长经历
1 杭州李云的技术牛人之路
李云是《专业嵌入式软件开发》一书的作者,后来去了阿里。阿里并购了UC后,老李应该在主要负责UC浏览器的开发。大家能够去微博上找他。为了为后来人提供參考,把自己的经历非常详细的写了下来,在我看来。李云的经历非常的有价值,因此在这里与大家做一点分享。因篇幅太长,引入的时候去掉了部分内容。以下是李云的故事。原文參见:http://blog.csdn.net/hzliyun/article/details/8144320
故事的開始得从大学曾经開始。从小受“学好数理化。走遍天下都不怕”观念的影响,我觉得仅仅要学好数理化即可了,所以偏科非常严重,高二时英语还考过29分。
那时也不爱读书,高三时,别的同学在复习,我却在看《晶体管技术》这类电子技术书。
这样的状态,直接的结果就是第一次高考落榜了。
落榜的那个暑假,父母为我的出路没少操心。在一天早晨刷牙时。当我妈对我说希望我去复读时,我当时脑海里想“能象表哥那样考上大学那该多好啊!
”,在这个念头驱使下,我答应了去复读。从那天開始,我顿悟了。真正知道自己要什么了。
在复读的一年里,我学到的一种重要能力是自学,这为以后大学乃至职场学习打下了非常好的基础。正因如此,我想给出我的职场第一感悟:自学能力是竞争力之本。
经过复读,高考总成绩提高了100多分,但也仅仅够专科线。终于,我被南昌水利水电高等专科学校录取,专业是“供用电技术”。
这个专业相信非常多人不知其所以然,事实上就是电力自动化的变种专业,其专业内容主要是电站、发电厂高电压的继电保护技术。
大学读书期间,我開始有与人在成绩上一争高下的念头了,加上复读一年所获得的自学能力。以及自己的努力。学习相当轻松,尤其是仅仅要与电子技术沾边的课程,都能轻松地胜出。三年共六个学期的学习,我拿了五个一等奖学金,一个二等奖学金。毕业时。我是系里唯一的一名优秀毕业生。期间通过了大学英语四级考试和计算机二级考试,获得了江西省电子技能比赛一等奖。须要提及的是,在大学期间所学的与计算机相关的课程仅仅有:《电子技术基础》、《计算机组成原理》、《计算机软件基础》、《单片机技术》和《Basic编程语言》。
在大学期间。我完毕了人生非常重要的一件事 --- 找好了如今的妻子。由于她是浙江人。所以毕业时工作地点毫不犹豫地选择了杭州。
那时非常多同学的工作还是包分配的。而我来到了杭州的人才市场进行双向选择,那时找一份工作还是相对轻松的(注:我们大学录取那年的招生人数是90多万)。投出一份简历就找好了工作。第一个工作单位是一家不到100人、地处杭州花港观鱼对面(三台山)的电力设备制造民企。
虽然选择去这家民企后立刻到公司去做了实地调查,但由于没有社会经验,加上被问的人没如实反应,所以进入这家民企后所了解的情况让人大跌眼镜。
另外也了解到单位会通过一些不入流的做法控制我们的户口,不让我们跳槽(那会儿的户口还是相当重要的,结婚要户口证明,有同事就由于户口被控制而登记不了)。
而我们在进入这家单位时签订了六年的劳动合同。在这样的小企业干上六年意味着什么?!当时与家人打电话告知这一状况时,我都哭出来了(就在如今杨公堤与虎跑路交叉的、现早已不存在的一个电话亭里,记忆犹新呀!)。
虽然前途是那样的渺茫。但带有“优秀毕业生光环”的我仍坚信自己能做得比别人更好,由于有我的职场第二感悟:自信能让你与众不同,虽然有时的自信有点莫名其妙。
在这个企业一開始的工作职责是电站设备的电气设计project师,须要用AutoCAD(到单位后学的)设计电气图纸。并指导工人终于完毕电气设备装配及调试。期间。企业经营范围扩大。须要从事电子设备的生产,因此我開始有机会接触电子技术方面的设计工作。
在兄弟单位一同事的帮助下。在一个星期内我掌握了怎样用Tango(后来更名为Protel,如今的名称是Altium Designer)进行原理图和PCB线路板设计。并且,这一个星期的设计结果终于成为了电气产品的一个部件。对于一个毕业不到一年的我来说。这是不小的进步。
那时知道了什么是网络表、过孔、焊盘等。掌握了非常多电子原件的工作原理(有的还自己用面包板做实验)。明确了做电路板的大致业务流程,还能动手焊接电路板。熟练运用示波器和万用表进行调试。那段时间,我对电子技术的兴趣帮上了大忙,学习起来远比别人快。当我精通电路原理。能自如运用示波器和万用表调试电子产品时,别人却还不明确我的调试动机。我的职场第三感悟:兴趣是学习效率的催化剂,培养自己的职业兴趣。
第一次真正对编程感兴趣是从知道PLC(Programming Logic Controller)開始的。
当时的电站设备採用了三菱的PLC,为了配合这一电气产品的须要,企业社招了一名懂PLC编程的project师。由于老板操心我们相互学技术而“翅膀变硬”。所以明确提出project师所掌握的技能不能互通有无。
当时看到这位兄弟能通过“梯形图”改变PLC的行为,真是觉得他太奇妙了,敬仰不已。
后来通过这位兄弟的私下帮助,我晚上偷偷地在厂房里面学习PLC编程。为了获得良好的学习效果,我设定了对电气产品的PLC程序进行重写的目标。且终于达成了这一目标(当然。由于这个目标不能让老板知道,所以我的PLC程序不能用于商用)。
我的职场第四感悟:学习应给自己设置虚拟的项目目标,以做项目的形式提升学习效果,仅仅有这样学到的内容才会深入而实用,切忌无目标地学到哪算哪。
一年多的功夫。我成为了某电气产品的技术负责人,对整个产品的全部技术细节都了如指掌。我带领了其它几个project师实现了该产品的“自主研发”。有趣的一件事是,老板当时并不知道我已经“翅膀硬了”。想抵赖答应过的8000元项目奖金,年轻气盛的我在与之拍完桌子之后对其它project师下令:“没有我的同意,谁也不能将电气图纸和电路原理图用于生产”。对抗的结果以老板兑现承诺而告终。
这时我隐约地有了我的职场第五感悟:话语权首先来自能力,而不是职位权力。
我那时还学会了CRC算法并将之运用于PLC的串口通讯中。由于对计算机怎样通过串口与PLC通讯获得採集数据存在非常大的好奇心,所以想到了学习编程语言。并计划做一个能在计算机上实时显示PLC所採集数据的软件。
在向负责PLC编程的兄弟表达了这一想法后,他给我的建议是:学习C语言比較难,Basic语言则更easy。
于是。我毫不犹豫地选择了自学C语言,由于我深信我的职场第六感悟:难学的技能一旦掌握更具竞争优势。
也正是从那时開始,我真正開始了成为软件project师的自学之路。
那时比較幸运的是,单位专为我配备了工作电脑。所以具备了自学的硬件条件。
由于那时Internet还不普及。学习书籍都来自浙江大学的科海书店(后来眼见着它的店面越来越小,这也是进入电子商务时代的一个缩影)。那时隔三叉五地到科海去找书,生活最大的花费就在于购书(那时这方面的书不少是质次价高)。
当然,学习的过程或多或少还得瞒着老板。那段时间,别人午休我就编程,除了看书和做书后的习题,还一直朝实现自己的计算机监控软件这个目标迈进(參见我的职场第四感悟)。终于有一天,我用Turbo C在DOS环境下实现了具有串口通讯功能的、基于图形界面的监控软件(假设你用如今的眼光看那个软件,一定会说“非常土”)。当我乐此不疲地向他人演示时,你能够想象我那时有多高兴和自豪!
这样的小小的成功助长了我的信心。也让我得到了我的职场第七感悟:用阶段性成果不断增强自己的自信,但终于支持自信的是能力。而不是自大。尝到了成功甜头的我随后拓展了自己软件开发方面的学习内容。
那时的我已经下定决心要向软件开发方向发展。这样的选择是由于我的职场第八感悟:做自己喜欢的事,假设那是自己的兴趣最好。
1999年的某月。在企业拖欠了一个月工资的情形下,“蓄谋”逃离企业束缚的我们(共19个project师)经过几个月的劳动仲裁后。与企业解除了劳动合同。在离开这家民企的第二天。1999年11月的某天。我在浙江大立机电技术开发公司(即如今的大立科技。后面都简称为大立公司)找到了第一份专职的软件开发工作。我逃离束缚后能非常快地找到新的支点,全然得感谢我的职场第九感悟:不论身处多么困难的环境。即使觉得前途渺茫,也不要放弃学习,否则就是“自断筋脉”。
在大立公司所參与的第一个软件项目,是使用Visual C++从事Windows某变电站图像监控桌面软件的开发。虽然我之前自学过C++语言。但那时并未全然掌握面向对象编程,尤其是当中的多态。我在该桌面软件中借鉴微软的演示样例软件DrawCli,独立地实现了电子地图功能。正是通过掌握这个演示样例软件的设计与实现。我真正领悟到了面向对象设计的优点。也通过该图像监控桌面软件的开发经历,掌握了Windows VxD驱动开发、socket通讯、多线程编程、图像处理(锐化、伪彩处理、图像字符识别和图像对照等)、ODBC数据库编程(用的是SQL Server)等。
在妻子进入大立公司不久。由我担纲了新版图像监控软件的又一次开发,这是我第一次担任软件项目负责人。在这个项目上,我能够尽情发挥。将我在老版本号软件上所示设计不足全然克服。
也正是通过这个软件项目。我的面向对象编程能力有了非常大的提高,并且完整地做过了一个软件产品。
用我如今的眼光来看:那时的开发工作除了引入了版本号控制软件外,是不折不扣的作坊式软件开发。至于管理技能的提高。也能够说是微乎其微。
2000年底,大立公司由于业务拓展的须要,需开发嵌入式图像监控系统(系统中的前端产品是后来数字硬盘录象机的前身)。为此。公司社招了一位比我年长十岁的资深硬件开发project师。他在进公司时已经有基于AMD的Elan SC520 x86嵌入式微控制器的硬件开发经验。他在进公司之初与章总交谈时指出:“做这类嵌入式产品。须要软件功底非常强的人”,章总的回答是:“你放心好了。我一定找一个最好的人与你搭档”(这是章总后来告诉我的)。
是的,所找的那个人就是我。而事实上那时我仅仅实用Visual C++从事Windows桌面软件的开发经验。可见公司领导对我能力之信任!我的职场第十一感悟:机遇非常重要,但你得有能力才干抓住它。
我当时所面临的技术挑战,读者能够想象。
要知道,在2000年时基于x86微控制器的嵌入式系统的开发者国内还非常少。我的自学能力、电子爱好的兴趣在这样的挑战面前又帮了大忙。
事实上,做嵌入式系统开发最基本的是參考各种资料以便掌握各类技术细节,这得通过大量地阅读芯片手冊、用户手冊。以及研究AMD在其官网上所提供的演示样例程序。在这个过程中。就技术困惑坚持探究和养成各种好的工作习惯(思考习惯、笔记习惯、总结习惯、阅读习惯)非常重要。我的职场第十二感悟:职场首先比拼的不是智商。而是坚持与好习惯。
我独自完毕了该嵌入式前端产品上的软件开发工作。当中包含的大致技术内容有:从编程的角度精通x86处理器架构。 PCI、IDE硬盘、网卡、串口、闪存等总线或外设的驱动;实时操作系统内核的移植工作;MINUX操作系统的文件系统的移植。 XINU操作系统的TCP/IP协议栈的移植工作。移植工作往往会碰到各种技术细节问题,等移植工作完毕,对被移植模块的实现和背后的原理也已了如指掌。正应如此,这一时期的工作让我对操作系统的实现原理有了非常深的理解。
除了软件方面的进步。我在大立公司时硬件知识也得到了非常强扩充。不仅能轻松地阅读数字电路原理图,还自学了VHDL语言,使得拿到逻辑器件CPLD的VHDL程序就能调试软件(通过VHDL程序。能够了解编程所需的译码port、相关信号的操作时序等)。还学会了怎样使用逻辑分析仪辅助软件调试工作。
前面提到的这位兄长式硬件project师调侃我说:“你让我看到了中国软件的希望!
”,而我将这话当成了对自己的鼓舞。另外,这期间还考入了浙江大学专升本的通讯project专业,给自己充电(2001年入学,2004年毕业。获多学期“优秀学生”和“优秀毕业设计”)。
由于大立公司是浙江省測试技术研究所的子公司,它或多或少带有事业单位的气息。加上公司的技术舞台有限。以及妻子也在同一家公司工作。我于2003年4月份左右离开了大立公司。在我离开之前,浙江省科委已批复了公司的申请,分配给我一套福利房。在我离开之时。房子仍在建,不少同事对于我的离职非常是不解。也劝我拿到房再走。但我有我的职场第十三感悟:当短期利益与长远利益无法得兼时,选择长远利益。
在大立公司工作期间,非常希望自己能入职UTStarcom这样的通讯企业(那时的UTStarcom是多么地辉煌!
)。计划离开大立公司之际。我向UTStarcom提交了求职简历。这次求职開始好像非常顺利,但我真正入职UTStarcom的过程却非常是曲折。
一開始当我收到UTStartcom的面试通知时,可能太希望能进入这个公司了,在没有非常深入了解这个岗位的前提下。就去面试了,且立即拿到了Offer。但后来才了解到,我拿到的是生产部測试开发岗位,与实际研发部门是有差别的。 当时非常纠结 — 这是我想进的公司,但却不是我想要的岗位。假设拒绝生产部的Offer,我非常有可能与UTStarcom无缘。考虑再三,我还是选择了拒绝(參见我的职场第十三感悟),并又一次向研发部门投了简历。
经过度日如年的一个多月等待(那会儿刚好发生了SARS疫情),在觉得入职UTStarcom研发部门无望的情况下,我入职了另外一家小公司。令人意外的是,在入职那家公司的第二天,我收到了UTStarcom研发部门的面试通知。在HR面试的那一轮中,HR对我说:“你是我所面试的人中最有工作激情的”。那时的技术面试官中。当中一位是我日后入职后的上司 — 夏青(如今是恒生电子通讯事业部的总经理),他是我的伯乐。
由于我的学历问题。在技术面试通过后。别人仅仅要一位VP面试通过即可,我却须要两位。我的职场第十四感悟:学历是非常重要的敲门砖,即便你的能力非常强。学历虽然非常重要,但能力才是终于的通行证。
2003年6月份左右,我正式入职UTStarcom研发部,从事小灵通基站控制器(后面简称为基站控制器)的软件开发工作,也从此踏入通讯行业。在入职之初。由于自觉得对于操作系统的原理非常精通。又完整地做过软件项目,有点飘飘然,觉得自己是个“小牛牛”。
然而,入职后一接触工作就发现,内容没有想象的那么简单。
首先。基站控制器的软件规模比我曾经主导开发的项目要大非常多。并且须要熟悉通讯行业的相关信令。其次。虽然我那时精通x86处理器,基站控制器用的却是PowerPC 8250,这意味着我得又一次掌握它。再次,实时操作系统用的是前美国军方的、开源的RTEMS。那是我第一次接触这个系统。最后,UTStarcom的工作语言是英语。写文档和邮件都得用英语。
虽然我那时能无障碍地阅读MSDN和各类芯片手冊。但要着手写,却是一大挑战(口语不作要求,由于不需直接接触老外)。
一入职所分配的工作是网元网管部分告警抑制软件模块的开发。虽然PowerPC处理器和RTEMS操作系统技术细节的掌握与否并不影响日常开发工作,但我仍将掌握它们作为自己的努力目标,这是我的职场第十五感悟:技术细节掌握得越深,解决这个问题时就越能游刃有余。
那时工作时间应付日常开发工作,业余时间则先将精力集中放在熟读PowerPC 8250处理器相关的技术手冊上(晚上还得上夜大)。加起来超过2000页的英文资料。我读了不少于3遍。随着时间的推移,当我对PowerPC 8250处理器非常有感觉之后,我将工作重点转移到了熟悉RTEMS操作系统的实现细节上。先处理器后操作系统的学习安排,是基于我以往在x86处理器上的工作经验而得出的,也是由于我的职场第十六感悟:技能的发展应採取深度先于广度且交替进行的方式,仅仅有这样,面对大量的新知识才干更淡定。
RTEMS是一个类UNIX的实时操作系统。也正由于接触这个操作系统我才意识到了自己在软件设计能力上存在非常大的提升空间。
虽然我对操作系统的实现原理胸有成竹,但却无力于构建一个象RTEMS那样的操作系统,也真切地体会到了RTEMS的设计之美。那时基站控制器上执行的RTEMS操作系统是由美国的新泽西研发中心移植好的,杭州研发中心仅仅需在之上做应用开发。为了就RTEMS操作系统获得更好的学习效果,我又一次运用了我的职场第四感悟。设定了自己完毕RTEMS新版本号移植这一目标。
RTEMS新版本号的移植工作虽不在公司的日常工作范围内。但却得到了上司的支持。由于那时RTEMS还在开发新的功能,并非非常稳定,在移植过程中碰到各种奇怪的问题,有些问题还与GNU的binutils工具集有关(binutils中包含nm、ld、objdump等工具。
RTEMS是用GCC编译的)。
在无法确认是GNU工具集的问题之前,我甚至还向Wind River公司(其知名产品是VxWorks实时操作系统)寻求过帮助,由于那时用的是它的JTAG仿真器。移植工作虽曲折,但终于还是成功了(我所移植的版本号并没有运用到产品中,后来的同事又做过了RTEMS4.6.0pre4的移植,且运用于产品中)。这一移植经历,让我对GNU的binutils、RTEMS操作系统的实现有了更为深入地掌握。
在UTStarcom工作的前期,我大多从事的是RTEMS操作系统相关的代码维护工作,工作内容除了OS内核。还包含FTP、Telnet等协议。
直到中期转为做E-Box产品的互联网接入模块的开发工作。
E-Box是一个企业级电话交换产品,当中还存在一块基于ADSL的互联网接入数据板(与如今的ADSL猫功能一样),用于实现企业网对互联网的数据接入功能,这一数据板使用的是VxWorks5.5.0实时操作系统(PNE 2.0),处理器是Intel的XScale IXP425。那时VxWorks的IP协议栈还是基于BSD的。但Wind River对之做了一定增强。这段时期我的工作重点全在IP协议栈上(《TCP/IP详细解释》这套书帮上了大忙)。这一时期的开发经历,让我对PNE的Bridge、FastPath、MUX、PPPoE协议、Radix路由算法和VLAN协议非常熟悉,也学会了用SmartBit仪器和Chariot软件做网络性能測试。总之。让我在IP(v4)协议栈方面的知识上和软件实现上有了长足的进步。
E-Box产品数据板上的开发工作进行了半年后,管理层决定放弃,于是我被调到了E-Box产品的软件平台组。那时平台组刚好面临一个比較麻烦的问题 --- 在命令行上执行reboot命令后,有时会出现整个系统挂起,而不是期望的重新启动。平台组的同事花了一个多星期的时间仍没有解决这一问题。
进入平台组之际,相同是在没有不论什么人安排的情况下。我自动承担解决reboot命令功能异常的工作。在我的职业生涯中。我一直热衷于去解决别人难以解决的技术问题,这是由于我的职场第十七感悟:越难的技术问题,其所蕴藏的知识越丰富,也越具学习价值。
经过一天半的时间。问题被攻克了。
其根源在于。reboot之前没有禁用CPM协处理器。我能那么快地解决这一问题,全然是由于之前熟读过PowerPC8250处理器的资料。
我在UTStarcom工作的后期,致力于ACE在E-Box产品中的一些应用。借助ACE的网络通信功能帮助实如今Windows平台上通过Visual Studio调试E-Box产品。
我在《专业嵌入式软件开发》一书的《可开发性设计,一种高效且经济的开发模式》一章中所阐述的内容事实上就是这一工作经历的总结与延伸。
另外。我还在E-Box产品上做过难度比較大的一个特性是。利用PowerPC 8250的MMU功能在VxWorks操作系统上实现了对任务栈的保护 --- 当一个任务被调度而处于执行状态时。它的栈就处于可读写状态,而其它任务的栈全处于仅仅读状态(VxWorks5.5.0内核中,还没有RealTime Process的概念,这一概念是从6.0開始有的,所以那时我所做的这一特性非常具实用性)。通过这一特性,能够有效地防止任务栈被意外篡改(比方野指针操作),即便出现篡改也能尽早发现根源。这个功能的实现过程须要调试VxWorks内核,那时VxWorks的源代码虽对公司提供,但Wind River公司对所提供的GNU的binutils做了特殊处理,使得无法为内核代码生成调试所需的信息。结果是无法对内核进行源代码级程序调试。由于我之前的RTEMS操作系统移植经历让我对binutils非常熟悉,通过使用一定的方法(说来话长了)绕过了Wind River公司所设置的障碍,成功地实现了对VxWorks的源代码级程序调试。
在职场中。我不时能成功解决复杂问题和克服技术障碍。这与我的职场第十八感悟是分不开的:每次积累的点滴知识,一定会在将来不知不觉地发挥效能。
2006年4月份左右,我离开了UTStarcom。在UTStarcom所学到的,不仅仅是前面所介绍的那些技术知识,更让我知道了软件开发的“正规军”是怎样的,与小公司相比,UTStarcom的软件开发流程要正规得多;也经历了英文写作的“挤牙膏”时期过渡到轻松时期(好友周海东在我的英语学习中帮了不少忙);看到了好友于善成怎样通过大量阅读成为一个知识渊博的人(他的阅读量如今仍是我的学习模范)。还有上司夏青的技术敏感度到如今仍让我为之称道,是我职场至今所见过的二位具有良好技术敏感度的技术管理者之中的一个(还有一位是我在Motorola工作期间认识的,后面会谈到他)。团队实力之强使得开发出的E-Box产品在我离开UTStarcom后不时能听到正面的评价。
讲到这里有补充一点。我在大立公司工作时期。就非常注重软件设计文档的编写。并且在我离开之时。不仅完好了全部文档,还为后继同事做了全面的培训。我始终坚守我的职场第十九感悟:通过文档化的方式传承知识给后继者是你的基本责任,由于你作为后继者时也希望如此,这也是对自己负责的一种表现。
在UTStarcom工作期间,我进一步形成了将自己的技术想法写成文章与大家分享的习惯(那时同事贺旭东称我为“作家”。而我则称他为“点评家”),也由于自己在嵌入式软件开发技术上的长期点滴积累,開始有了写书的想法。
离开UTStarcom后。我入职了杭州华数集团旗下的雷科通技术(杭州)有限公司。公司当时的意向是安排我负责某宽带接入产品的软件开发工作。
在这个公司,虽然仅仅有两个月的时间但也做了些事。
除了一个月内完毕了宽带接入产品以太网交换芯片在VxWorks操作系统上的驱动开发。并使得产品支持VLAN功能外,还攻克了好几个影响整个产品系统稳定性的严重遗留缺陷。这两个月的工作不光让我在技术团队中非常快地树立了自己的威望,也使得公司高层管理者真切地看到了我的能力而在我提出离开时极力地挽留。这短暂两个月的工作经历带给我职场第二十感悟:别人对你价值的认可。事实上不是简单地依据你的自身能力,而是依据你对他人和团队的贡献。
入职2006年初在杭州成立的Motorola研发中心的故事得从面试開始。
在入职雷科通不久,我收到了猎头的电话,虽然那时并没有换工作的想法,但也没有拒绝猎头投简历。随后我收到了Motorola的面试电话。那次面试过程记得非常清楚,由于那是我所经历的第一次英语口语技术面试。虽然工作中从没有锻炼过英语口语,好在对于自己做过的技术知识非常熟悉,也常常须要查阅英文资料,所以对于所做过的内容还能用英语勉强解释清楚。
在面试的最后。我对印裔技术面试官说,“如今我的英语口语不好。但我相信仅仅要有合适的环境,能非常快地提高”。印裔技术面试官最后将我领到HR那,说了一声“Yes” — 我的技术面试通过了!
面试结束的第二天,收到了Motorola HR的电话,告知Offer的相关信息(我的入职级别是E09。E09及以上的人在整个Motorola杭州研发中心占比大约为10%)。
那时由于并没有换工作的想法,所以拒绝了Offer。
想法非常easy,由于曾在UTStarcom这样的公司呆过了,所以对外企的工作并非非常向往,反而觉得在雷科通这样的小公司更能施展。在我拒绝了Motorola的Offer后,我将这件事告诉了身边的同事,他们的反馈差点儿都是“你应当去Motorola”。
幸运的是,还有一名HR再一次致电给我,试图说服我增加Motorola。她当时说“你一旦增加Motorola,以后离开时所示就是HP或IBM这样的大公司”。也正是这句话打动了我。
之后的经历证明。增加Motorola是非常正确的一个选择。
2006年7月6日。我正式入职Motorola杭州研发中心。增加的初期是大量的内部培训。培训内容包含技术方面的、流程方面的和英语。Motorola有着成熟的企业文化。通过培训能够让project师非常快地融入企业,使人行事象是Motorolan(摩托罗拉人)。在经历了约半年的培训和学习后,2006年底。我開始參与WiMAX产品线上的CLA中间件软件项目。
虽然我在CLA项目上没有详细的工作(比方,没有缺陷修复工作会分配给我,也没有新的特性开发工作会挂在我的名下),但对整个团队所从事的技术工作都得负责。我的日常工作主要是设计方案评审、代码审查、帮助或带领团队解决技术难题等。
在CLA项目上工作了一个月左右,2007年春节之后,我被第一位派到Motorola的芝加哥研发中心做为期二个月的现场技术支持。
之前虽然在公司有过英语培训,但要非常好地听与说还是存在非常大的障碍,加上芝加哥那边一起工作的是口音较重的印度人和巴基斯坦人。挑战能够想象。在芝加哥研发中心除了做现场技术支持。还得为兴许人员的到来做铺垫。比方,租好房子、车子。准备好生活所需的一些家当(当时由于预算有限。我们住的是公寓,还得自己烧饭)。
那段时间虽然由于语言的问题倍感压力,但在全英文的环境中,我的听说能力进步也明显。之后几乎相同每年一次的出国,见到曾经认识的外国同事,总会有人对我说“Your English is getting better”。对于自觉得英语听说能力不行的同仁。请记住我的职场第二十一感悟:英语的听说能力仅仅要有合适的环境,并勇于张嘴练习的情况下能高速地提高,不必操心。
CLA软件在技术上属于执行于Linux操作系统上的一个中间件,它存在多个进程用于帮助通讯设备网元(包含WiMAX基站和接入网关)实现网管功能。由于软件架构的特点。使得CLA团队不时会碰到由于其它团队没实用好CLA而产生的技术问题,这类问题開始大多难以定位是属于CLA的、还是不属于CLA的,因而查错过程非常低效。
在CLA项目的后期,我希望通过引入新的软件设计方案帮助团队提高软件的查错能力,并改善软件质量。引入新设计须要增加非常多代码。怎样让管理层不操心由此而引入很多其它的缺陷是我着力这事时首先要考虑和解决的问题。
在这样的背景下,我在CLA项目引入了单元測试,寄希望于通过单元測试提高新增代码的质量,以使管理层更具信心而获得他们强有力的支持。终于结果表明。在新增了近一万行代码的情况下,代码在终于公布后总共仅仅发现了一个软件缺陷。
这个项目上的工作经历让我第一次真正尝到了单元測试的甜头。在《专业嵌入式软件开发》一书中。单元測试方面的内容非常多源于我在这一项目上的成功经验。我在CLA上新增设计中的AED(Abnormal Exiting Detection)功能,在我离开CLA项目之后,还帮助团队发现了非常隐蔽的多线程问题。
当通过AED功能发现这一问题的同事高兴地跑过来对我说这个功能管用时,我的高兴劲写满了整张脸。这个项目的经历。也让我更加坚信我的职场第二十二感悟:在软件开发活动中,应设法通过有效的技术途径去解决project困境。
2009年初。Motorola杭州研发中心迎来了一个重量级项目 --- WiMAX产品线的接入网关ASN-GW,我被安排到该项目,角色是软件开发架构师。初期我的架构师一职仅仅是杭州研发中心单方面的角色安排,而非全球性的(当时该产品由美国、印度和中国三个研发中心共同參与)。
在ASN-GW项目上与我一同共事的经理,是曾在Motorola美国研发中心呆了近十年、后来暂时转到国内来工作的华人李亮(后面简称亮,习惯了)。他之前在美国工作时做过架构师、软件公布经理(Release Manager)等职,是一个对技术非常有敏感度的管理者(我前面提到过的两位有技术敏感度的管理者之中的一个)。我在此之后的成长。全然离不开他的支持与信任,以及他为我所创造的职场发展环境。能与他共事让我倍感荣幸和感激。
我从亮身上学到的第一个内容是怎样与美国管理层打交道。总体说来,Motorola在软件开发管理方面非常是四平八稳,其管理存在两大特色。一是争夺项目的全部权(Ownership),还有一个是质疑(Challenge)。前者使得各团队职责清楚,不easy出现突发问题或状况找不到负责人;后者使得团队在工作中有所作为,不至于让人浑水摸鱼。
在面对美国团队的质疑时,我曾经看到的大多管理者都非常紧张,总想一味地达到美国方面的要求,但亮在这方面的表现却明显不同。他告诉我们(包含Team Leader):“假设美国提的要求不合理。直接与他们‘掰’”。后来我认识到,美国方面做事事实上非常讲逻辑。仅仅要我们对于他们所质疑的问题能给出合理的解释。非常多异常事件根本就没什么大不了。
我的职场第二十三感悟:不要用沉默的方式一味地迎合别人的要求,据理力争也许才是作为的表现。
參与ASN-GW的呼叫处理子系统的开发工作后,整个团队经历了大约半年的成长痛苦。
痛苦有几个根源,一是对WiMAX无线接入技术相关的国际标准不熟悉,另外则是对ASN-GW产品的现有实现不了解,并且产品的复杂度的确非常大(当中一个技术指标是:必须达到99.999%的容错能力)。
在半年的痛苦期中,我非常重要的一个工作职责是帮助团队成长,作为亮这类管理层与基层project师间的桥梁。比方,为团队起草《开发者指南》和《測试指南》这样的文档,且要求和引导project师通过文档化的形式沉淀经验与教训,以便提高工作效率(虽然文档化方法的实施过程须要我不断地提醒,但这一方法被证明在这样的时期非常有效)。我也会在例会上毫不留情地指出project师的哪些行为影响了工作效率。
我的职场第二十四感悟:流程、文档的作用,不仅仅是引导我们做完事,更能规范我们的行为和帮助培养工作习惯。
亮在项目进展的过程中,一直向美国方面主张杭州团队必须设置架构师一职。也正是由于亮的一再争取。美国方面终于努力地帮助我向这个方向发展,不断为我分派属于架构师工作的任务(如更新产品架构模型、參与需求管理、參与系统设计文档的评审、完毕新特性开发工作评估等)。
亮那时告诉我,我应是杭州研发中心第一个真正从事架构师工作的人。
刚接触架构师方面的工作时,事实上还是不大自信的,虽然我那时掌握了软件架构师所需的基础技术技能(比方,我的软件设计能力非常强、UML从1998年開始接触加上之后的持续学习所以功底也非常好)。但对于软件研发管理方面的内容,以及WiMAX无线接入技术知识的系统性认识还是相对单薄的。那时与美国同事接触下来的感觉是,他们的综合能力都非常强,似乎随便一个人都知道怎样做架构师,不少人有做GSM、iDen和CDMA产品的经验,并且长期工作于无线接入技术领域。随着很多其它地參与架构师方面的工作,不仅逐渐建立了自信。对Motorola的软件研发管理也有了更为深入地认识与理解。所示不仅仅是产品技术本身的复杂度。更有开发活动运作管理方面的复杂度。
终于,我成为了整个ASN-GW产品的架构师。
在2009年,我考入了浙江大学的MBA,同一时候还開始着手写自己的处女作《专业嵌入式软件开发》。
在之后长达近两年的工作、学习和写作的三重压力下,我在时间管理上有非常大的进步,抗压能力也得到了非常好的锻炼,这时我的职场第十二感悟(指当中的坚持)又让我终于渡过了这段最为艰难的时期。(注:《专业嵌入式软件开发》一书事实上不仅仅专注于嵌入式。当中绝大部分内容是C/C++开发者应当掌握的。
当时书名中採用“嵌入式”三个字全然是由于给书定位的须要,害怕书名不详细而使人难以选书。当然,也正由于“嵌入式”三个字。使人觉得面太窄了。有利有弊吧!
该书在各大网上书店都归类于“软件project及软件方法学”,而非“嵌入式系统”)
2010年中期,NSN宣布收购我所在的Motorola网络部门,收购活动直到2011年的4月份才结束。同一时候由于WiMAX市场的不景气,美国不少系统架构师转到了FDD-LTE产品线上,我也由于这一缘故担任了大约半年的系统架构师,主要负责WiMAX技术的移动性与网络安全方面的工作。
2012年7月份。由于WiMAX产品线裁员。我转到了NSN的WCDMA产品线。也从此開始离开了Motorola的研发管理环境,而真正步入了NSN的研发管理环境。
真感谢你花时间读到这。虽然我们常将“职业规划”挂在嘴边。实际上职场发展真的是一种“布朗运动”。你不知道下一站会是哪、也不知道后面将要从事什么工作、更不清楚后面会碰到怎样的老板。在众多不确定因素面前。也许參照我一路走来所总结出的职场感悟能让你不断地朝好的方向发展。
2 感悟程序人生
上面的文字比較长,当中记录了李云成长过程中的各种细节。当中非常让人感动的是李云的这样的永不放弃的精神,从文字中我们能够看到李云从来没有停止自己前进的脚步。
这是非常可贵的。李云的成绩中差点儿没有运气成分。全然的靠自己的双手把握自己的人生。
我们还是回到之前一直提到的几个维度:
价值 x 实现程度(表达力,稀缺性,公司平台)= 职场成就
在这一公式下,你会发现李云道路的主旋律就是在一个技术路径长的领域里增值、增值再增值。不论是最初的PLC还是后来的WiMax都能够比較笼统的归到一个叫软硬结合的软件领域,这个领域技术路径比較长,和基于ASP.net做信息管理系统全然不是一个难度。从事这类工作其知识必须贯通软硬件,否则寸步难行。一个一直做纯软件的人,在这类领域中听都听不懂相关project师在说什么。
今天之所以非常多程序猿能够缺乏硬件知识也能做软件开发,关键在于Window送,Java这类平台屏蔽了大量细节,而做上述这类工作时等价于须要撕掉这样的屏蔽。又一次面对软件最本来的面目。所以这天生是个技术路径长的领域。
在这样的领域中达到一定高度后,稀缺性会非常自然的呈现出来。。与此同一时候,公司平台的切换也使李云所站的位置越来越高,稀缺性越来越好。
李云的经历相同也说明了人生确实须要一种永动的势能,否则一旦他安于现状比方停留在大立公司,停止了自己在技术上的追求,那么也不会有如今的高度,而是会在某个环境下上过着相对照较稳定的生活。
在李云身上表达力起到了一定的作用,但作用暂时并不明显,技术的不断提高和积极的精神使李云并没有碰到这方面上的瓶颈。
假设与第一个故事里的主人公老A相对照就能够发现很多其它的事情。两者年纪相差不大,但却走出了截然相反的人生道路。
同北大、清华、浙大这类顶级学校相比。李云的学校实在是差的一塌糊涂,假设在九几年两个人刚毕业的时候让企业进行选择,李云绝对是一点机会都没有,夸张点讲李云根本就不会有和老A并列在一起的机会。
但在2011年,经过十几年的奋斗之后,形式全然逆转,老A不再有和李云并列在一起的机会了。李云能够在各大公司间选择比較适合自己的工作,而老A仅仅能被外包公司被动选择。
形象点讲,老A出身名门。但人生一路下滑。李云毕业于专科学校,但靠自己的努力创造了命运。
也许有刁钻的人会说。李云这样有什么好,马云什么技术都不懂,阿里系一样千亿市值。这么想就危急了,所谓一念天堂,一念地狱即是如此。恰如人不能寄希望于中彩票一样。对于人生而言,理想能够远大,但手里要有看得见的适合自己的路径。崇拜马云先生能够,但马云先生自有其自身的艰辛和机缘,而大多时候这类成功全然不可复制。
不详细了解这些,而单纯由于虚无缥缈的远大,而荒了如今,那就是好高骛远。
------------------------------------------------------------------------------
关于我自己的各种信息。在左边栏可找到,想了解下写这书的人是不是骗子和大忽悠的能够瞄。
最后希望感兴趣的支持 V众投 ,感觉上这应该是国内最靠谱的 生活 购物等的问答社区了吧,都是朋友给朋友做的答案,同一时候实行一人一号,一人一票制度,想找什么答案 关注公众号:vzhongtou(左側有二维码)即可了 。