分类:
2009-11-26 10:40:12
一天,博文视点的周筠老师忽然在gtalk上跟我说:写写你自己的故事吧。
我一怔:我有什么故事呢?我是个再普通不过的工程师,虽然经历过小小的波折,总的来讲生活平淡无奇。
周老师说:就当是写给你儿子看的。
我有一个十四个月大的儿子。每每看着他我都暗下决心要做出一番事业来,让他为老爸感到自豪,但每每这样的决心都被懒惰和琐事所淹没。看着他,有时我会生出一种奇怪的联想:三十年前,我的父亲,是不是也曾这样的望着我……
如果我还有一点故事,这个故事一定是从我的父亲开始的。
男孩,父亲和计算机
和计算机结缘,完全是因为我的父亲。
我的父亲是个真正的传奇人物:北京人,清华大学无线电专业毕业,却因为三十多年前的那场浩劫,被半“流放”到山东农村,委身在和电子学毫无关联的水泥厂。父亲是个对命运从不妥协的人。水泥厂恶劣的工作条件和落后的生产方式促使他开创了“水泥生产自动化”这个当时全新的工业自动化领域。他1984年就辞职下海,创立了自己的企业和研究所,在水泥自动化领域成为全国的佼佼者。1988年和1995年,他又两次创业,辗转青岛和北京,始终坚守自主创新和低成本技术改造的方向。不过遗憾的是,社会大环境的改变和他个人的性格,并没有给他再次成功的条件。
我读小学的时候由外公外婆抚养,只有寒暑假会去和父母团聚。小学二年级的暑假,我第一次在父亲的工作室里看到了计算机——一台R1微型计算机,2KB内存,单色显示器,只有BASIC语言。父亲专门为我买了这台机器,因为做了一辈子电子工程师的他,坚信这台小小的机器将来一定会改变人们的生活。于是我和计算机的第一次亲密接触,就从25年前的那个炎热的夏天开始。不过说老实话,当时我对计算机完全没有感觉,甚至相当的抵触。让我没有想到的是,这一接触,就是二十多年……
大学志愿——和心爱的计算机分手
一晃十年过去,我和计算机也熟络起来。中学六年我把大部分业余时间都给了这个奇妙的小机器。我最喜欢编写的,是绘图和游戏程序。也许,我的技术之路,已经从那时起,悄悄启航了?
由于成绩出色,高三毕业前我被保送同济大学。但是在填报志愿的时候,我的第一个波折出现了。
按我的意见,计算机、电子工程或者自动化这些专业是我的不二选择。但是父亲有着不同的见解。他认为我应该去同济最好的土木建筑专业。计算机、电子这些技术,在他看来都是工具,只有和具体行业相结合才会产生效果。父子之间第一次出现了重大的分歧。最后,还是对父亲的尊重占了上峰,我选择了同济大学工业与民用建筑工程专业,从此与心爱的程序作别。
进入同济之后,我也曾试图让自己喜欢上土木结构,也曾花了很大力气去学,但结果总是差强人意。我的成绩总在中游徘徊,更严重的是一直找不到非常“想学”的那种感觉——就像中学学习编程时的那种感觉。这种状况就变成了一个恶性循环,成绩每况愈下,而就像李笑来在《把时间当作朋友》里说的那样,越不擅长,我也就越发对土木没有兴趣。
唯一的例外,是《计算机绘图》这门课——教学生怎样通过编程来控制计算机绘图。这门课才真正让我有如鱼得水的感觉,我的出色表现也让授课老师,工程制图教研室主任谢步瀛教授注意到了我。不过这门课只是大一的一门副课,在拿到大学里为数不多的一个优之后,我又回头去啃我的结构力学、混凝土设计,从未想过这一生还会有机会再次与我的计算机梦相拥。
第一次考研和第一次工作
2000年,世纪之交。对我而言,这一年是我将走出大学,踏上社会的一年。而讽刺的是,经过了五年的大学学习,我竟然不想做一个土木工程师。和许多对自己的专业不满意,又没有足够勇气踏上社会的年轻人一样,我决定选择考研——更多是逃避现实,而不是寻求发展——考谢教授的“建筑工程CAD”方向,因为只有这个方向能让我离计算机近一点,又不至于彻底浪费大学学到的专业知识。
造物弄人,虽然总分远远高出录取线,我的数学成绩却离及格线差了一分。这一分之差残忍的把我挡在了研究所门外。
事后想想,我还是很感谢这次失败。如果不是这次失败迫使我经历了以后的一些事情,从没出过校门的我也许就会对学校这个环境产生过强的依赖。和社会、企业相比,学校里是个太舒服,太容易迷失自我滋生惰性的地方。
我打算重新准备,再考一年。而且我不想工作,因为我不喜欢自己的专业。父亲却不认为考研是解决我职业方向问题的根本方法。他更愿意我在接触社会的过程中慢慢调整自己的方向。他把我硬塞到一个生意伙伴那里,一家北京郊区的房地产公司。但是这个安排遭到我极力的抵制:一方面我不想工作,特别是不想做与建筑有关的工作;另一方面我也不喜欢北京,我想回青岛。但是家长的权威再一次占了上风,父亲要我先工作几个月,然后看情况考虑是否允许我全职复习考研。就这样,一纸派遣通知,把我送到了北京。
到了那家公司,我才发现我到了一个以前从来没有接触过的世界,一个真实的社会。那是一家民营企业,企业里上上下下都充满着阿谀奉承、推诿扯皮、人浮于事的风气。没有人真正关心技术、关心企业。从领导到同事,我跟谁都没有交集。如果说原先我还抱着一丝融入社会、爱岗奉献的希望的话,现实让我连这一丝希望都放弃了。每天我就是闷在办公室里跟谁都不接触,最开心的日子就是领导安排我画图——正规训练的底子还是在的。我画的图所有人都交口称赞。而我内心只有苦笑:连在学校做作业的时候我们都是用计算机画图了,而这个所谓的工程部里,连部电脑都没有……
矛盾的积累总有爆发的那一天。终于我忍不住向父亲提出,我要离职,全职复习考研。父亲拗不过我,向我的公司老板提出要求,不料被老板一口回绝,并以他们之间的债务纠纷相威胁。看着父亲为难的样子,我再也不能忍受让别人来操纵我的命运!第二天,我把工牌丢在经理的桌子上,头也不回的离开了这家我刚刚呆了三个月的公司。
那天,走出公司,我踯躅在过街天桥上,看着桥下车水马龙,反复的问自己,自己的未来在哪里,我的一生,究竟怎样才能像父亲一样,留下属于自己的印记?
初识《程序员》
离开公司以后,我就加入浩浩荡荡的考研大军,每日奔波于各大高校的研复班之间。日子过得倒也平静,但是关于人生意义的设问并未因为考研而变得明确。直到有一天,在北航门口的报摊上,我看到了三个字——《程序员》。
那是《程序员》的创刊号。
《程序员》对我有非凡的意义。在此之前虽然我也编程编了很多年,但都是个业余爱好者。我不知道真正的程序员在做什么、学什么、想什么。《程序员》为我打开了通往业界的一扇窗户。在地铁上、在家里、在课堂上,复习间隙我总是拿出《程序员》,一面读一面想,这就是我想要的生活,而且,我能做到。
通过《程序员》杂志,我认识了《深入浅出MFC》和它的作者,侯捷先生。书本身对我的提点自不待言,侯先生的经历对我有着特别的借鉴作用——侯先生也是学土木出身的。有了榜样的力量,我觉得目标明确了:我就是要做一名专业程序员。虽然我承认父亲的话是对的,程序开发只是工具,但是只有善用工具的人,才能发挥出工具最大的功效。像侯先生说的那样,我要做修车厂的师傅,而不是后座上的车主。
于是,在复习考研之外,我有了另一项任务:重拾荒疏多日的计算机,重新历练自己的编程功底。从最简单的C++程序开始,我要用专业程序员的标准要求自己的编程风格和技巧。虽然我并非科班出身,但是我自信可以做到。
那一年,我顺利的考回了同济,投入谢教授门下。虽然仍然是一个和计算机不怎么有关的专业,但是我的心态已经大不一样。但是没想到,在去原来单位转户口的时候,还是被单位要去了一大笔违约金。关键时刻还是父亲伸出援手:只要你觉得你的选择是对的,钱的事不用你操心。
在北京的一年,我才了解到父亲的公司已经遇到严重的经营问题,每一笔钱对他来说都是很宝贵的。即使如此,父亲仍愿意倾力来弥补由于我的幼稚和固执造成的问题。我无言以对,心里默默发誓:父亲,我要让你以我为荣。
走进绚烂的图形天地
读研是我另外一段美好的时光。功课对我而言都很轻松,多数时间是泡在研究室或者家里写代码,正好是我喜欢的方式。谢老师治学严谨,而且对技术有很高的热情。但是专业方面,我并没有机会接触太多国际领先的东西。直到研二的时候,因为项目的原因,需要3D实时渲染方面的知识。我已经接触过一点OpenGL,非常希望能多了解一点当时刚刚推出的、号称具有划时代意义的Direct3D 8。我在技术选择上有绝对的自主权,于是我便投入到对D3D的研究中去。
微软的D3D 8 第一次引入programmable pipeline的概念,把GPU强大的运算能力开放给开发者自行使用。这是第一次在消费级PC中出现CPU之外的另一个强大的可编程运算部件,可以说是后来的GPGPU以及今天的 GPU Computing的滥觞。而在当时,我只是迷醉于电脑游戏的诱人效果当中不能自拔,幻想着有一天能自己开发出媲美Quake3的游戏引擎——我相信99%的编程爱好者都曾经幻想过类似的事情。我觉得这是件好事情:知道自己的努力在极限情况下会得到什么样的结果,努力就有了目标,也自然乐在其中。
整个一个夏天,我都泡在计算机前面,把D3D的API一个一个试过来。和通常的编程模型不同,计算机图形学是有一点点门槛的。你必须首先具备基本的图形学算法和数学基础,再把不同API背后映射的渲染流水线烂熟于胸,然后才能如臂使指般的自如组合各种API创造各种眩目效果。那个夏天的成果是:我把D3D渲染流水线的每一个stage都摸了个遍。这个“笨”功夫的老本让我一直吃到现在。
今天我想告诉学弟学妹:在某个领域做出成绩最简单的捷径就是下笨功夫。坚持三个月,你的人生就可能从此不同。我这样说的原因是,我发现大多数人都不愿意去下笨功夫。:)
慢慢地,我觉得计算机图形学可能就是我命定的职业方向。但我还是不很确定,是应该继续读博士深造,还是应该找一份工作。每当在前途道路上感到迷茫的时候,虽然每每与我意见相左,我还是希望首先听听父亲的意见。
想不到的是,这次我听不到了……
子欲养而亲不待
2003年夏天的一天,我接到母亲从北京打来的电话:父亲去了。
父亲是累死的。本身就有严重的心脏病,为了事业奔波劳碌,又欠下巨额债务,终于让他不堪重负。父亲是个心很大的人,他一生因为社会动荡几起几落,却从未对国家和社会有过什么怨言。相反,他人生的最后岁月里,很大精力都放在为中国民族工业和科技事业发展建言献策上。从他的身上,我读到了中国传统知识分子传诵百年的精神:先天下之忧而忧,后天下之乐而乐。
与一般父子相比,我和父亲更像同事。本来就聚少离多,在一起的时候也多半以讨论技术问题和时事要闻作消遣。我和父亲都是不苟言笑的人,加上后来分歧渐多,仿佛一直隔膜着什么。但是当父亲离开的时候,我才痛心的意识到:在价值观上最理解我、给我影响最大的,还是我的父亲。
从北京处理完父亲的后事回到上海,我便马不停蹄的开始找工作。我已经成为这个家庭的顶梁柱,有些事情必须由我来做。
作为一个“非科班”的学生,我的选择机会并不很多。一个偶然的机会,我看到一家名叫“Trident Multimedia”的公司招3D Graphics Architecture Engineer,职责是负责GPU的体系架构设计与验证。这个工作让我眼前一亮:我对计算机图形学有很好的了解,随父亲的耳濡目染我对电子电路设计也并不陌生,而且我一直对底层的兴趣超过应用层。当然,Trident的名声也让我特别有好感:作为最早开发计算机显示芯片的公司之一,Trident在386的时代几乎就是显卡的代名词。虽然进入3D时代以后Trident衰落了,但是在中国居然有研发GPU这样顶尖IC产品的公司还是让我倍感兴奋。于是我毫不犹豫的投出了简历,并且顺利通过面试,拿到了offer。
拿到offer的那晚我失眠了。我想到了我的父亲。他虽然一直都表现得不太愿意我走计算机、电子工程学这条路,觉得这条他走了一辈子的路太辛苦,但我知道他其实内心很希望有人能继承他的衣钵。而我经过八年的大学生活,一度离这条路非但没有走近,反而渐行渐远。经过了多少波折之后,仿佛宿命的轮回一般,如今我又回到了这条路上。我是多么希望让他知道,他的儿子没有让他失望;可惜,他看不到了。我多么希望听他说:儿子,我错了,你就是天生该做个电子工程师的;可惜,我听不到了。但我相信,父亲一定在天上某个地方看着我,眷顾着我。
在Start-up中成长
上班以后才知道,Trident已经把它的GPU设计部门卖给了一家台湾的start-up公司XGI。虽然是台湾公司,但管理风格完全是美式的。
我的第一个任务,是为GPU的光栅化模块写测试用例和帮助硬件工程师debug。因为光栅化是相当成熟的算法,所以我并没有特别用心去读每一行代码,只是见招拆招,倒也相安无事。一次小组例会上,经理让我给大家讲解一下光栅化的算法。在我介绍了大略的算法框架之后,经理问到几个细节问题,把我问得张口结舌。会后,经理单独留下我谈话,严肃的指出:做工程师永远要记住细节是魔鬼,只有在细节上充分积累的工程师才会在技术上有成长的空间。经理的一席话,让我汗流浃背。
这一次,我没有像第一次工作那样与周围格格不入,而是悉心的向周围的每一个人学习。我的同事Samuel是个非常仔细的人。做事情之前他会逐一列出每一个步骤以备核对。试验数据等他都会做一个很漂亮的Excel表格把数据归纳起来。他还不止一次的劝我学习一种脚本语言来提高工作效率……从Samuel身上我学到了精益求精、注重细节的工程态度。现在我和Samuel仍在同一家公司。他领导着一个软件团队。我相信以他扎实严谨的态度,他的团队的产品质量一定是上乘的。
慢慢地,工作开始得心应手起来。而我以前在D3D API上下过的“笨”功夫,也让我在大局观方面领先一步。领导对我的工作成绩给予了充分的肯定,给我的任务也越来越重要。有一段时间我每天都工作到很晚才回家,满脑子都是游戏图像和代码,以至于当我和太太到九寨沟度蜜月的时候,我指着山间潺潺的溪水不假思索的说:“这不就是3DMark03 GT4(一个GPU性能基准测试程序,绘制的也是山间流水的场景)嘛。”走火入魔,一至于斯。
2005年,我工作的第二个年头。在新一代GPU的设计过程中,我已被任命为team lead,负责带领一些工程师进行设计工作。刚刚入行不久就接触到最核心的技术工作,我一面深感任重道远,一面也深深的高兴,因为这是对我工作成绩的肯定和能力的信任。我是多么希望看到自己亲手设计的产品出现在市场上啊。但是没想到,我们的产品永远没有机会上市了。
NVIDIA为什么强大?
就在新的项目开展得如火如荼的时候,公司的财务状况却每况愈下。最终,XGI把上海和美国的设计部门出售给了全球第二大的GPU厂商ATi。而我则在这个时候选择了离开,转投全球最大的GPU厂商NVIDIA,成为NVIDIA中国GPU研发部门的第一个本土员工。
我承认我的选择是有目的的。首先是NVIDIA重视技术、作风激进的风格更吸引我;其次,作为一个部门的创始员工,我会有更大的发展空间。事后想来,这次选择是正确的。
在NVIDIA的四年,我做了很多的项目。如果说在XGI的经历锻炼了我的全面性,那么NVIDIA就增强了我的系统性。在NVIDIA我学到的最重要的东西,是认识到流程的重要。NVIDIA有很多内部的流程,也有很多内部的工具来保证甚至强迫工程师按流程办事。刚从startup一人包打天下的状态转过来的我,一开始还真的很不适应。但是时间久了,我慢慢开始发觉,也许流程会抑制工程师的一些个性,但是从工程的角度,流程确保了产品的质量,也节省了工程师“从头造轮子”的时间。NVIDIA能以每6个月推出一代产品的速度引领GPU发展的方向,与它重视流程的风格是分不开的。
在NVIDIA学到的另一样东西,就是沟通。和基本由华人构成的XGI不同,NVIDIA是一个国际化的公司,公司里聚集了来自世界各地的精英,英语是通用的工作语言。在进NVIDIA之后不久,我参与了一个美国牵头的项目。这是一个我从未接触过的领域,中国又和美国总部有十几个小时的时差,加上我的lead是一个口音很重的印度人,我很不愿意打电话给他,通过email又不时有说不清楚的地方,项目进展得很不顺利。很多时候我觉得每天都很忙,但是一天下来不知道自己做了些什么。我的lead也渐渐对我失去耐心。终于有一天他打电话给我,很客气的问我:我可以做点什么帮助你更快的把工作做完。当时我已经是资深工程师,还负责指导一些初级工程师,被我的lead这样challenge真的让我始料未及。而仔细想想,自己确实没有做好沟通的工作,没有让lead及时了解我的进展和困难。最后我的lead要求我每天向他汇报一次(通常情况下是每周一次),之后情况就大为好转。这次“后进生”的经历让我认识到:作为一个海外部门的员工,与总部的及时沟通是多么重要。
在外企工程师做久了,深深的感到外企对细节和沟通的重视。每一个决策的背后,都有细致的数据和充分的沟通做基础。中国工程师习惯的用猜测、估计和方向性的概括描述问题的方式,在外企是行不通的。另一方面,中国工程师在沟通方面往往不够主动,一方面是由于语言的差异,另一方面是“说不清楚,做出来给你看你就明白了”的习惯思维。而外国工程师倾向于在动手之前,先用数据和事实来论证方案的可行性,以期达到以最小的投入换取最大的产出。在这方面我本人和我的团队都有很多正面的经验和反面的教训,而这,也许是另外一个话题了。
从今年开始,我开始做一部分管理工作,负责高性能计算和内部工具开发两个团队的建设。至于我今后的发展方向,我更多关注高性能计算,尤其是基于GPU的并行计算的发展。GPU并行计算把传统超级计算机才能提供的计算能力送到了每一个人触手可及的地方,这必将极大的颠覆很多科学计算、工程设计乃至日用软件的设计方法论。每个程序员都应该准备好迎接这个机遇和挑战。恭逢其盛,我非常希望能为这一技术在中国的普及与发展略尽绵薄——尽管一直在外企打拼,作为深受传统文化熏陶的一代,我仍然和我的父亲一样,深深眷恋着脚下这片土地。
心在远方,路在脚下
我的故事结束了。很普通的一个故事。和很多朋友一样,我也是非科班出身,因为热爱而投身这个行业。可能不同的是,我比大多数人幸运。
我想告诉和我一样,已经在社会上历练过一段时间的朋友们:请保持理想主义。请相信我们做的事情,无论多琐碎,或多或少,或迟或久,一定会影响和改变人类的生活。我们每天起床上班,不是为了赚钱糊口,而是因为喜欢和使命感。
在结束这篇文章的时候,我还是想起了我的父亲。父亲对我的一生影响太大了,而这种影响随着时间的推移愈发明显。我不知道这种影响会不会转移到我的儿子身上。也许会吧,这是一种遗传,一个工程师世家的遗传:以热情对待技术,以坚韧对待困难,以敏锐对待机遇,以豁达对待社会