2

中国第一代程序员潘爱民的30年程序人生 – 在线阅读 – 完整版

 3 years ago
source link: https://www.geekzl.com/china-programming-life-30years.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

中国第一代程序员潘爱民的30年程序人生

程序员 PROGRAMMER

程序员杂志潘爱民程序人生专刊

程序员特别专题
CSDN
免费 (会员免费)

相关分类: 杂志

国内知名操作系统专家潘爱民的程序人生精彩分享。每十年一篇总结和深思,从大学、到职场;从技术到科研再到工业;从求职到高管再到创业,程序人生的三十年精彩故事。相信每个年龄段的读者,都能从中感受到曾经的困惑,并从中国第一代程序员老兵身上得到极大启迪。

国内知名操作系统专家、指令集创始人兼CEO潘爱民博士生于70年代,起于BASIC编程,师从汉字激光照排系统之父王选院士,从北大计算机研究所、微软亚洲研究院到任职盛大创新院专家顾问, 又先后任阿里YunOS、阿里安全、飞猪、阿里业务平台首席架构师,进入物联网时代创立指令集深耕并亲自主导物联网操作系统研发,历经中国互联网行业从星火到移动、AI、大数据、loT等各种燎原,几乎可以算作是中国互联网发展的一大缩影。

作者: CSDN
版权方: CSDN《程序员》
出版日期:2020年06月
ISBN: 1111111111114

[编者按]

中国第一代程序员潘爱民的30年程序人生

搞技术是一件极其幸运的事情,不仅是我们迎来了最好的时代,亦在于我们的祖师爷大多还都健在甚至健谈,比如Linux之父Linus Torvalds、Python之父Guido van Rossum,而中国第一代程序员们也都还在折腾,首推UCDOS发明人鲍岳桥、超级解霸创始人梁肇新, 以及今天我们的主人公--国内知名操作系统专家、指令集创始人兼CEO潘爱民博士。

潘爱民博士生于70年代,起于BASIC编程,师从汉字激光照排系统之父王选院士,从北大计算机研究所、微软亚洲研究院到任职盛大创新科学院首席科学家,又先后任阿里YunOS、阿里安全、飞猪、阿里业务平台首席架构师,进入物联网时代创立指令集深耕并亲自主导物联网操作系统研发,历经中国互联网行业从星火到移动、AI、大数据、loT等各种燎原,几乎可以算作是中国互联网发展的一大缩影。

浮生多变化,万事有盈虚。当国内程序员们忧于[35岁职业坎、45岁屈服现实、55岁就得隐退」之时,透过潘爱民博士的30年程序人生,我们不仅能够看到一一个中国第一代程序员死磕技术,又深邃思考技术如何落地与产业融合,更能从他的身体力行中看到,后浪奔涌,老兵如何不息!

我的程序生涯 | 2000

作者/潘爱民

这段时间我回顾了一下我的程序生涯,发现我的程序生涯在某种程度上反映了中国软件十几年来的发展历程。
我上高中后才听说计算机的,幸运的是,我所在的嘉兴第一中学有个很好的微机实验室,当时的微机常被称为“娃娃机”,现在看起来这个叫法也还确切。由于我的数学成绩突出,在高中-一年级获准参加计算机兴趣小组。所以我的程序生涯就从这里开始了。

中学--程序之初

中学时候还谈不上软件开发,只是凭兴趣编制一些小程序,偶尔也编几个稍大一点的程序。有两件事情特别值得一提。
当时我们只用BAISC,它有一种很特别的程序叫“一行程序”,也就是说,在一 行内完成一个程序。因为BASIC语句一行只能容纳254个字符,而且一行内不许使用跳转与判断语句,所以一行程序不能完成很复杂的功能,但是有些有一定规律但又不很规则的图案打印或者计算任务可以由一行程序来完成。这是一种很好的游戏活动,非常适合于中学生的智力开发和锻炼。不知道现在是否还有类似这种形式的活动。
中学期间我编过几个规模稍大一些的软件,BASIC代码行达到几千行(当时的16位机器内存加起来只有64K,用户程序可用内存不超过30K)。有意思的是,我在程序中还调用了自己写的一段汇编,这段汇编直接操作图形显示缓冲区,实现图形的快速移动,
Apple II机器使用6502处理器,当时也没有学过任何微机和操作系统知识,我那时候不明白寄存器的概念,但是居然也能写出可以运行的汇编代码来,现在想来有点不可思议。
不过从这件事情上,我也想到,我们经常听到有关青少年计算机奇迹的事情都是有可能的。他们可以自己编写代码制造病毒,可以攻击网络系统。青少年的想象力很丰富,潜力很大。
中学期间,虽然没有像样的成绩,甚至还影响了我的功课,但是在计算机方面所做的许多工作使我非常充实。不过,因为计算机的神秘性对我已经不再存在,所以我上大学还是选择了当时非常钟情的数学--免试进入南开大学数学系。

大学一一兴趣

我在大学期间,花在计算机方面的精力要比数学方面多得多,在大二时,我有幸进入了南开计算机系模式识别实
验室从事软件方面的工作。当时有一 台286机器可供我使用,良好的工作条件使我有机会打下扎实的基础。

学习汇编语言

汇编语言在当时很盛行,我写了不少的汇编程序,连界面(下拉菜单)都用汇编来写,对于10h中断和21h中断中常用的功能非常熟,不需要查参考书就可以写出功能调用来。当时我在对一块图像卡编程时需要访问扩展内存(地址0xa00000), 所以我研究了286保护模式的编程技术,主要阅读15h中断的汇编代码,最终解决了保护模式的切换和编程问题。
保护模式与实模式的切换在今天已经意义不大,但在当时的话,由于DOS是实模式下运行的操作系统,保护模式往往是可望而不可及的。

PASCAL语言

PASCAL语言作为一种结构化编程语言,加上Turbo Pascal友好的集成开发环境,当时确实风靡一时。
对于我来说,汇编语言再加上Turbo Pascal开发环境,确实是无往而不利。PASCAL语言具有很好的可读性,加上Turbo Pascal实现了单元管理功能,是学生最为喜欢的编程语言。我使用的Turbo Pascal最高版本为5.0,据说到6.0已经成了面向对象的Pascal语言了。
大学时代我主要靠自学的手段学习计算机软件知识,几乎没有与别人交流的机会。
但是南开很好的学习上机条件使我在DOS操作系统、汇编语言、PASCAL语言以及80286保护模式编程这些方面得到了很大的提高。
我很怀念那段时光,那是我学习生涯中最美好的一个阶段。当我临近毕业的时候,Turbo C 2.0逐渐传播开来,我开始从Turbo Pascal转向Turbo C。

研究生一一狂学

虽然我在大学期间已经很了解清华了,但真正让我认识清华还是在自动化系读研究生这段疯狂的学习和工作的时间里。大学期间扎实的基础足以让我应付任何一个编程难题,我很快转到Turbo C上来, 有了这些工具,作为清华的学生,干点课余之事就很正常了。
我当时在一家数据工程公司兼职,该公司云集了清华计算机系一群高手,我跟他们一起工作,受益匪浅。这些高手们每个人都有独挡一面之才华,对于汇编和C语言都非常精通。由于DOS操作系统的简单性和开放性,在DOS平台上我们几乎可以完成任何一件事情,再底层的难题我们都有办法解决,我想那个时代的每一个高手都会有这样的经历和体会。
这几年我和这些朋友们失去了联系,不知道他们现在怎么样,我想他们都会很不错。

群体的作用对我帮助很大,我在软件方面的知识面逐渐开阔起来。在商业公司这样的环境中,我接触到了许多其他的编程技术,如FoxBase、汉字处理、简单的网络编程等,有些技术在当时非常新,比如多媒体编程,包括声卡、视频卡、触摸屏等编程技术。
很快Borland C3.1流行开来,这是DOS平台,上最优秀的开发工具。Borland C的集成开发环境加上相关的一些辅助工具,如Turbo Debugger等,是一 个功能很强大的软件开发工具。从C语言到C++语言是一个很自然的迁移过程,尽管当时很多人在使用BC,但他们往往不涉及到面向对象编程,我则很快领会了面向对象的思想,建立了一套自己的界面工具类库,我这一套界面工具类库很小,参照Turbo Vision的思想,模仿Windows3.1的风格(当然功能上差远了),大约只有2000多行代码,而且支持汉字的显示。尽管规模很小,但也包括消息机制,下拉菜单、窗口、对话框、按钮、编辑框等界面元素,在随后的毕业论文工作中我用到了这套工具,然后弃之不用了,因为我又转向Windows编程了,倒是我几个同学用这套工具做了些程序。
研究生期间是我对计算机开发技术最有热情的一段时间,学习效果很好。清华大学的风气比较注重实用,在技术的选择上比较超前,群体气氛又好,这是我学习最有成效的一 段时间。当然,我并没有因为这些事情而耽误论文工作,这两者是相辅相成的。我想清华现在的学生会做得更好、学得更好吧。

职业生涯一一致远

从清华毕业我来到了一墙之隔的北大, 在北大计算机研究所,我开始了计算机软件开发的职业生涯。尽管我以前一直没有把计算机当作自己的本职专业,但事实。上我一直偏向于软件开发。最终我还是选择了职业软件开发工作。我在北大计算机研究所的软件开发经历可以分为两个阶段:

(一)1994年到1997年

这一段时间我精力集中在应用开发上。职业开发人员与学生一 个很大的区别是,你对技术、平台和工具的选择必须符合应用开发的需要,不能像学生那样随心所欲,我在这三年的开发过程中,基本上仅局限于Windows平台、Visual C以及MFC. 幸好我的工作面比较宽,涉及到系统的多个方面,所以我对Visual C以及MFC的使用比较全面,三年工作下来后,我对于Windows应用开发已经非常明白了,由于我们使用VC和MFC比较早,当时基本上没有资料,我一直鼓励其他人去读一 读VC自带的一本《开发者指南》,这本书包含在VC的联机帮助中,据说是Inside Visual C++的前身,从内容上看是有可能的。当时我没有看过其他的书,平时碰到问题往往通过MFC的源码、VC的例子程序以及联机帮助来解决。

现在学习VC和MFC要方便多了,书店里这方面的书琳琅满目,身边往往高手如云。尽管我从MFC的源码中学到了很多东西,这是在没有办法的情况下而为之,我不太赞成研究源码,除非是为了学习的目的。

(二)1997年到1999年

由于健康的原因,我被迫从开发人员的岗位上撤了下来,从1997年下半年开始,我不再从事直接的开发工作,改做技术支持工作,对开发人员提供技术支持,不是对最终用户的技术支持。
这是我程序生涯中最暗淡的日子,但我还是努力让自己吸取营养,来填充自己对知识的渴望和需求。
这段时间,我考虑的焦点问题是如何把软件做得更好,具体来说,就是组件化程序设计,进一步具体化,我研究COM,并设法把COM技术应用到其他的开发组中,为其他人提供这方面的技术支持。
我的工作做得不是很成功,COM的应用不是那么直截了当的,这在当时的条件下是很难克服的。
我有必要再次强调群体的好处,北大计算机研究所内部高手如云,大家都是同事关系,所以交流起来比较方便,在这样的环境下,技术上的长进可以快得多。我又一次得益于环境的优势。
从学校环境来讲,我从南开到清华再到北大,尽管三个学校的校园都很优美,南开有新开湖和马蹄湖,清华有水木和荷塘,北大有未名湖和博雅塔。但是在我的职业程序生涯中,未名湖给了我很多启迪,当我从事开发工作或者写作时,我经常在夜晚到未名湖畔散步,从她幽静而深沉的气息中汲取灵感。

我是一名普通的程序员,在软件开发队伍中算一名老兵了,以上所介绍的经历是我十几年的路,走的路很长,但是没有值得一提的成绩。也许我的介绍中有一些偏颇之处,请大家不必挑刺,因为这只是我的一点感受,真实的感受,它所反映的仅仅是一个侧面。

我的程序感悟 | 2002

作者/潘爱民

自从2000年上半年我在csdn.net和vchelp.net两个网站上发表了“我的程序生涯"以来,时间已经过去将近两年。
期间收到了许多朋友的来信,与我讨论技术问题,或者对于软件技术和计算机图书的看法。面对大家的热情,我深感心有余而力不足,很想找个机会表达一下我的心声。

从编程走向研究1997年,我由于健康的原因被迫从软件开发的岗位上撤下来,此后的两年时间里,我一直在钻研软件设计技术,到1999年中的时候,完成了《COM原理与应用》。1999年下半年开始寻找新的研究方向, 当时的想法是,放弃对软件技术的研究,拓宽思路,走更远的路。经过半年的摸索,终于确定了“网络与信息安全"这个很热门的方向。
所以,这两年时间我正在远离程序,可能有些朋友们仍然能够感觉到我活跃在这个领域,那是因为我禁不住诱惑又翻译了几本比较有彩响力的原著。实际上我已经不再钻研相关的技术了,只是吃吃老本而已。虽然是利用业余时间做这些翻译,但事实上还是会影响到我的正常研究工作,毕竟人的精力太有限了。
做程序和做研究其实是不可分割的,我得益于曾经在程序上所下的功夫,因而能够较快地领会网络和操作系统方面的基本知识,再加上大学时代在信息、数学科目上打下的基础,所以渐渐地进入到信息安全领域中来。反过来,我从另一个角度来思考程序,思考软件技术,又领会到了原来身在其中所不能感悟到的发现。所以,我又把这些知识和体会组织在一 起,在北大计算机系开设了一门讲述软件技术的课程。

程序与图书

我走上写作和译作的道路纯属偶然,1997年底的时候有机会翻译"Inside Visual C++"(4th Edition),这是我的第一本书译作。一年之后著写了《COM原理与应用》。这两本书的影响远远超出了我的期望。我只是认认真真地把书写好,在能力范围之内尽可能地对得起读者,也希望为自己的程序技术做一个总结。
那两年的图书市场确实很混乱,难得有认真写书的,我拣了个便宜,居然得到了读者的广泛认可。其实我的文字功力非常不足,对于出版也一窍不通,我自己几乎不读这些技术类的图书,也不会关注哪家出版社或者哪位作者、译者出版了哪些书。这两年对于图书有了比较浓厚的感情,但也只局限于一些专业教材或者自己著译的相关书箱,对于其他图书仍然不很关注。所以,有时候收到读者来信希望我推荐书籍,我很难做到,因为我了解得太少,总不能老是推荐自己的那几本书吧,这些书对于有些读者不见得合适。因此,我也没有资格写书评。但是,对于我自己写的图书,每一本书我都会写一个序,这个序代表了我对这本书的看法,也可以算作是书评吧。
不过,这两年的图书市场大有好转,好书多起来了,差书也有机会受到大家的批评。最重要的是, 作者和编辑的责任心被调动起来了,渐渐地出现了一些优秀的作者和译者,虽然我这几年写了一些书,有了一定的基础,但是自身缺乏优秀作者所需要的素质,所以逐渐开始转移兴趣。然而,作为一名读者和IT从业人员,我仍然期望在接下去的一两年之内能找到更多的好书,期望会有一 批国内的品牌作家诞生。

如何看待程序技术

在过去的5年中,技术的发展和更新太快了,我相信大多数人都会有这样的体会。如何跟上技术的发展潮流,这是每一个人面临的问题。以我对技术的理解,以及这几年的经验来看,学习技术要有所选择,千万不能盲目追求一些新技术。现在大多数的技术都跟某些厂商有关,所以对技术的炒作也逐渐流行,这就更需要我们明辨是非
于技术人员而言,每一项技术都应该有一定的定位,比如基础技术、应用技术、集成技术等等。每个人的精力都很有限,到底我们应该把有限的精力花在哪些技术上呢? 我的建议是尽可能地学习一些基础技术,只要有了很好的基础,掌握应用技术会非常容易。
另一方面,程序员千万不能沉溺于技术本身。程序技术是一门应用性很强的技术,每一个细微之处都针对特定的应用背景。我见过有一些人非常追求技术的华丽,而忽略了一些很基本的要点,这种观点和做法最终会导致软件的设计或实现中看不中用。在技术上对美的追求并没有错,但是我们不能偏离它的主导思想。
如果有可能的话,程序员可以跳出程序来看待程序,跳出技术来看待技术。你会发现,程序的本质其实很简单,技术的思想也非常清楚。到了这个层次,再善加思考,那么,对于所有的技术,一览众山小,还有你看不清楚的吗?
感谢过去几年中众多朋友的厚爱和信任。我只是普普通通地总结了一些技术,翻译了几本书籍。这些作品能够对大家有所帮助,这是我最大的乐趣。我希望每一一个人都立足于现在,展望美好的未来,从而走更远的路。

祝愿大家在新的一年里,快乐,健康,事业有成。

我的成长故事 | 2010

作者/潘爱民

到2010年,我接触计算机已经有25年了,从最初仅仅将计算机当作兴趣,发展到后来将计算机当作专业,最后把计算机当作职业,不经意间,走过了十多年的计算机职业生涯。这篇文章记录了我在校园生活中的成长历程(包括在学校里当一名老师的历程)。

接触计算机

我生于农村,长于农村,到初中才有机会去了一趟县城。那是参加县里的数学竞赛,意外获得第2名,之后有机会到嘉兴参加省级数学竞赛,又意外获得省二等奖(大约是第5名),在嘉兴地区应该是第1名。我没有受过赛前培训,完全靠一点点数学直觉,竟然胜出于众多受训多月的同学们,真正纯属意外。从农村到城市,差别很大,有那么多商店、那么多汽车,还有柏油马路(我们那儿的公路是石子路),真是羡慕城里人。

我几乎没怎么努力,就从一所乡村中学,升到了省重点中学一一嘉兴市第一中学。那时候,嘉兴第一 中学在我们县每年招5~6个学生,往往是中考成绩最好的几名学生,因为这是优先录取的。虽然到了一所重点中学读高中,但是我的户口依然是农村户口。那时候,国家给城镇户口的居民每个月发粮票,所以他们可以换米或买米饭吃。

我没有粮票,农村不发粮票,所以我要么自己背一 袋米到学校,要么想办法弄粮票。对我和我的家庭来说,这是一个客观上的困难,也让我内心感觉人与人之间的差异。这带来一 点点自卑感,但基本不影响我跟同学的交往。

由于我数学成绩突出,在高中第一年就有机会参加计算机兴趣小组。那真的是兴趣小组,教一点BASIC的知识,做一些简单得不能再简单的作业,然后上机试试。在我的印象中,像"A=A+B"这样的BASIC语句, 理解起来真的很困难。因为在数学上,“A=A+B"约简以后就是"0=B"。不知道是我太笨,还是别人也这样。总之,这对我当时是一个坎。

那时候学BASIC编程,基本上在练各种技巧,比如,交换两个变量的值,规定不许使用临时变量。我就像解数学题一样来思考这个问题,很快给出了一个方案,“A=A*B B=A/B A=A/B",今天的程序员看了这个解法一定会觉得好笑。一旦有一个数为零,这个解法就不成立。而且,用乘除法显然没有用加减法好。但我当时只想到了乘除法,事后经提醒才想到用加减法更好。这件事情对我触动很大,至今尚记忆犹新。我意识到自己思维中的不足,
我解了一个问题,但可能不是最优的。这让我考虑问题总是小心翼翼,唯恐再发生此类情形。虽然常常有人夸我聪明,但我自己丝毫不敢这么认为。聪明的人应该直接想到用加减法来交换变量,而不是乘除法,我始终这样认为。我现在的一个推测是,当时大概也在学一 些数论方面的知识,所以我从质因子分解和组合的角度来思考这个问题,于是便想到了用乘除法,

除了做一些算术运算,BASIC也擅长绘制各种图形, 只要是有规律的图案,都可以很方便地用程序来实现。虽然那个时候还无法理解一些奇妙的图案(比如分形图案),但简单地绘制一些有规律可循的图形,并不困难。然而,让我们挑战的是一种特殊的程序写法,即一行程序。在一个单行程序中绘制出相对复杂的图案。单行程序的设计难度在于:首先,代码字符数不得超过254个字符,这限制了代码的长度;其次,在程序中几乎不能使用循环和条件语句,因为它们涉及到自动换行。我们就像玩游戏一样编写一行程序,有时候甚至还要比一比谁的程序更短。
BASIC语言确实简单,我们当时纯粹是玩BASIC程序。除了计算类型的程序、图形绘制程序以外,我们也编写音乐播放程序,以及一些综合算法程序,比如冒泡排序法、表达式解析程序。记得当时做的一个算是复杂和有难度的程序是自动计算24点,即给定4个1~10之间的数,利用加减乘除运算,得到24,求出所有的解法。今天从网络上可以找到各种程序语言版本的解法,但当时对我们着实是个挑战。
我们基本上把BASIC当作一种特殊的数学语言, 今天看起来很幼稚,但那时候我们玩得不亦乐乎。数学是根本,不仅在高考中占有很大的比重,而且在我们中学参加数学竞赛也是一个教学重点。计算机只是兴趣,虽然偶尔也有编程竞赛,但以那时候的教学水平,基本上是玩玩而已,可以认为不务正业。我的高中生涯有相当一部分时间在不务正业,尤其到后期一年多时间,由于写程序越来越顺手,跟老师渐渐熟悉起来,在机房里能找到的各种外部设备和电脑资料都有机会借来使用或阅读。由于有了这一 层便利,我的不务正业又前进了一个层次,玩的花样突破了常规兴趣班的内容。具体表现在两个方面:

第一,那时候用的计算机是Apple II,这是一种使用6502处理器的机器,更确切的称呼是娃娃机。 机房里绝大多数机器连软盘驱动器都没有,更别提硬盘驱动器了。这意味着每次上机所输入的程序仅限于当时有效,机器关闭或重新启动,所有的代码都不复存在。这就限定了我们每次只能玩一些简单的程序。然而,恰好机房里有极少数机器(大概也就1~2台) 可以通过录音机来存储程序,找一个有计数功能的录音机,记下自己的程序位于磁带的哪个地方,就可以保存和恢复一个程序。这是一一个很大的突破,意味着我们可以写大程序了, 至少可以把今天的代码保存下来明天接着玩弄,还可以与同学共享程序了。虽然我没有使用过录音机,但对录音机的工作方式并不觉得神秘,无非把声音录下来,然后再播放出来。声音的信息记录在磁带上。但我好奇的是,程序的声音是怎样的呢?好听吗?我不期望录音机能把A、B、C念出来,但想知道把程序放出来会是什么样的声音。结果是令人失望的,除了一些吱吱声,根本毫无意义。据说,国外有人能听着这种吱吱声,把程序记录下来。当时觉得外国人真了不起,自己太普通了。现在想来,这种能力只有外星人会有。

其次,对BASIC语言,因为玩得太熟,再编一 些小程序已经兴趣不大。而且对于程序的性能也开始有一点认识,知道绘制复杂的图形很慢。从老师的办公室里淘到了一 些随机赠送的资料,其中包括Apple II的6502汇编语言材料。自学汇编语言并不容易,绝大多数概念基本上不能清楚地理解,但我依然能根据书中的提示,编写出一些很小的汇编代码,并且在BASIC程序中调用。利用这点非常有限的汇编语言知识,我编写了两个至今想来仍觉得很有意思的程序:一个是地球旋转程序,另一个是华容道游戏程序。地球旋转不是很容易能实现,我仅实现了一个世界地图自动左右旋转的程序。有两个功能用到了汇编代码。一是图形初始化。首先在图纸上描好图案,然后编码成字节位图,再硬编码到程序中,这样,在程序中通过位图拷贝的做法,直接将硬编码位图传输到显示缓存区,从而实现了图形初始化。二是图形区域的移动。我的做法是直接操纵图形缓冲区,将一个区域中的像素移动到指定的位置。由于使用了汇编代码,图形操作的效率非常高,这是BASIC语言的代码所无法做到的。我对自己编写的华容道游戏颇为得意,图形移动非常平滑,提供了回退功能,内置了几种标准解法。华容道俗称百步华容道,我自己想出来的解法需要96步,而当时最优的解法是79步,我从一本杂志上查到了这一解法。这又一次说明了我的解虽然正确,但不是最优的。

高中最后一年,对绝大多数同学来说是最辛苦的一年,于我则是最轻松的一年,尤其最后一学期,因为我确定不用参加高考。这一年对计算机的兴趣不如原来了,偶尔也去机房和老师办公室看看。老师则忙着指导低年级的兴趣学生,他们当中更是不乏佼佼者。有印象的是,老师办公室里有一台机器带软盘驱动器,老师有一次拿出了几张5寸软盘片,给我介绍并演示了PASCAL语言的编程。这并没有提起我多大兴趣,我那时候的兴趣回到数学上了,我确定要上南开大学数学系,所以也从图书馆借一些高等数学的书来看看。总之,这一年漫无目的地轻松度过。

中学时代留给人的记忆总是美好居多,我也不例外。计算机是我的兴趣,占据了我大量的时间,但并没有带给我实际的好处,反而间接地影响了我的学业。幸好,我如愿进入南开大学数学系。在专业选择方面,我仍然钟情于数学,而非计算机。

玩转计算机

高中的生活,既单纯,也充满了学习的乐趣。相比之下,大学的生活,则浪漫而又有情趣。在学习方面,自由而又针对性强。在20世纪80年代,校园的围墙不仅是物理,上的隔离,更是精神上的隔离,它把大学生的生活与社会隔绝开来。我的大学生活几乎是脱离社会生活的,完全在象牙塔中度过。幸好我可以自由自在地学习各门感兴趣的功课,并且在课外钻研一些技术。
上大学后,我的户口落到了南开大学,每个月享受国家供给的粮票,和补助。我是保送生,可以获得一笔新生奖学金,这大大减轻了家庭经济负担。我的大学生活比较简单,宿舍、食堂、图书馆、机房, 占据了绝大多数时间,偶尔去天南街(连通天津大学和南开大学的一条街,毕业后我再去南开校园,发现这条街已不复从前)逛逛,周六晚上有时候还看看露天电影,周日偶尔去天津东北角的新华书店逛逛。这些构成了我大学生活的主体。

大学第一年几乎是荒废的,数学系的基础课程当然是数学。我在第一学期免修了三门数学课:数学分析、高等代数和立体几何。所谓免修,是指在学期的前两周通过任课老师的测验。这基本上意味着,我在前两周学完了这三本课程的要求内容。这学期剩下的时间在无所事事中度过,同学们上课去了,我在宿舍睡觉。很可惜,这学期就这样浪费了,也没想着学学英语或者文科的科目。第二学期更好不到哪儿去,虽然课程没有免修,但课堂上很少认真听讲。到4月份,学生运动(93年)波及到南开大学校园,5月份以后,正常的教学次序被打乱,课程都停了,直至9月份,学校才复课。我的第一年就这样过去了。在计算机方面,第二学期数学系开设了一门FORTRAN语言课程,带上机实习。我学了FORTRAN语言,但并没有多大兴趣,按部就班地上课、上机,只知道for1、for2的编译一些简单程序,完全不明所以。那时候机房里有一 些IBM PC机,绝大多数没有硬盘, 我们使用5寸软盘来存放编译工具和作业程序。在我的程序生涯中,FORTRAN语言是唯一正儿八经通过课堂来学习的课程,也是学完之后便不再有机会使用的计算机语言。

学生运动对我的心理有非常重要的影响。我很难清楚地描述出这种影响,但表现在学业上,则是来了个180度转变,从不爱学习、不认真学习变成了好学无比,而且学习跨度大大超越了基本的课程要求。二年级秋季学期,我不仅选修了计算机系的一些课程,而且还选修了数学系比我高一年级的课程。北方的秋天很萧条,但恰恰也是学习的最佳时机,我用各种课程填满了课表。我记得共有9门课,基本上把周一 到周五的白天时间占满了,晚上到教室上自习。这学期过得很充实。我上课并不是按部就班地记笔记和听老师讲课,通常情况下,我自学的效率比
听讲要高。然而,只要上课时间没有冲突, 我总是会到课堂上。我选的课程要么在数学楼,要么在主楼。每天上午的前两节和后两节课之间,经常要在这两个楼之间穿梭,我相信南开大学数学系的很多同学都有这种体会,因为我们的很多公共课(比如英语)在主楼,而专业课基本上都在数学楼。春季学期没有再选这么多课程,相比之下有了更多的上机机会。

大二学了一些计算机课程,包括计算机原理和程序设计方法等。那个时期的计算机科学系往往还没有全面的教学设施和培养计划,能开出的课程也有限。南开大学的计算机系由数学、物理和电子系的一 些老师组建而形成,相对而言,开设的课程较为全面。印象深刻的是计算机原理和汇编语言课程。计算机原理讲的内容很初级,但很有用。实验环境基于M6800处理器平台,我总算明白了像寄存器、时钟中断之类的概念。我跟着计算机系的同学一起做实验,居然每次都早早完成实验,然后跟实验老师聊天,或者帮着他照顾别的组。由此他对我印象深刻,期未时计算机系模式识别实验室的一位教授要招实习生,他便把我介绍给了那位教授。这让我从大学二年级开始就有机会进入到一个实验室,跟着教授做事情。我对汇编语言课程非常有兴趣,学得很认真。因为通过汇编语言可以控制一个处理器做任何它能够完成的事情,我编写了很多小的汇编程序来实现各种基本功能,比如键盘输入、屏幕输出、切换到图形模式、文件操作等。这些内容超越了课程和教科书的要求,有些来自于杂志和报纸。其实做起来很简单,把书本或杂志。上的例子程序加工改造一下基本上就归为己有了。

大二下学期一方面学习课程,另一方面到教授的实验室实现一些图形处理算法。那时候我基本上是孤独的,计算机系的学生会组织了一些兴趣活动,以探讨编程技术为主,比如如何编写TSR(Terminate and Stay Resident)程序、介绍病毒的原理以及如何手工清除病毒等。我时任数学系学生会干部,对计算机系的学生活动并不热心,但偶尔也会参与这些兴趣活动,还会发言。由于有了底层的基础,并且在实验室有专用的一台80286机器,这让我很自信,也有一种优越感,再加上年少轻狂,有时会口出狂言,比如,一切病毒皆可杀。

到了大三,我最自然的想法是修一个计算机专业的二学位,即双学位。这原本是一件顺理成章的事情,因为历史上计算机系就招收来自像物理、数学和电子系的双学位学生,比我高一届的学生就有申请成功的。但是,意外地,这一年计算机系不再招收双学位学生。据说,计算机系因为教学资源紧张,便以此为条件要挟学校主管部门以获得更多的教学资源(比如教室、实验室)。我们这一 批申请双学位的学生成了牺牲品。10月份我获知申请双学位没戏了,沮丧之下想到了另一个方案,那便是申请提前一年毕业并继续读研究生。我迅速实施这一方案,首先联系北京的院校,最终落定在清华大学自动化系的模式识别专业。由于某些原因,免试推荐的路子没有成功,我毅然决定参加研究生统一入学考试。用三个月的时间来准备考研,同时兼修两个年级的课程,这看起来是一个挑战,但实际上并不很困难。我顺利地做到了,唯一的要点是,安排好时间。到大三的春季学期,阳光明
媚,我的心情轻松许多,顺利通过考研,分数还很高。毕业也已不成问题。

在计算机技术的钻研方面,这一年又有了精进。像数据结构、C语言、操作系统课程是在这一年学的,并且都是数学系的课程,但它们几乎没留给我什么印象,似乎没学到多少扎实的东西。相反,我在计算机系实验室的工作让我收获很大,为了控制一块图形卡,我不得不深入到80286保护模式下进行编程。基于有限的参考资料,我实现了实模式和保护模式之间的切换,并且写成了一一个独立的汇编模块在高级语言中调用。那时候我使用的高级语言是PASCAL,对C语言只是有所了解,并没有真正使用。到最后一个学期,教授建议我把这些编程的工作写成文章发表,于是便有了以下这篇技术文章:
“80286实方式和保护方式切换的模块化编程技术”,计算机世界月刊,1992年第1期。

大学三年就这样过去了,我身在数学系,在完成数学专业学习的同时,也打下了计算机专业的底子, 并最终考上了清华大学自动化系研究生。尽管第一年没好好学习,但后两年的学习则是卓有成效的。我曾经在二年级的夏天到北京一家公司实习过一个假期,做的事情是在DBASE川中编写一套界面工具,由于我那时已经玩熟了汇编语言和PASCAL,再使用DBASE非常顺手, 没有多大挑战。然而,在实习过程中,我接触到了清华大学计算机系的一群大学生,他们在程序方面的驾驭能力让我看到了另一个世界,这也促使我在申请双学位失败以后立刻想到早一年去北京进一步发展,校园生活丰富多彩,天津是一个有悠久历史和北方文化传统的大城市,南开大学又是一个在近代教育史上有重要地位的高等学府,这些都深深地滋润着我,极大地满足了我的求知欲。除了课堂学习和机房实习,我经常去学校的图书馆,先是到新开湖北岸的老图书馆看一些数学书,后来又常去当时刚落成的新图书馆看外文书。我喜欢在阅览室看书,一方面不用担心这些书会被人借走,另一方面阅览室的氛围可以让人专注地看书,学习效率较高。

大学期间我写过的程序不少,基本,上是汇编语言和上层界面程序,譬如,当时流行的下拉菜单,我至少写过三个版本:汇编语言、PASCAL和DBASE。我不厌其烦地写这些程序,似乎毫无意义,但至少我培养了与代码的感情。对BASIC语言的感情依然存在,而且,唯一一 个有实用价值的程序是用BASIC来编写的。我记得在大二春季学期,为了备考英语四级考试,我伙同另外两位同学设计和实现了一个周易预测算法,程序部分我负责,我选择了较为顺手的BASIC语言。基本的思路是把六爻预测算法量化和程序化,并尽可能地考虑多方面的因素。算法和程序应该是相当成功的,但结局有一点悲壮。我们中的一位大仙在天蒙蒙亮的凌晨,到经管学院的14层楼顶(当时南开大学的最高处)以最虔诚的心态为每一 个客观题摇卦。由于题目数量不少,摇卦又不能赶时间,并且还必须在天大亮之前摇,所以,大仙两次登顶摇卦。就这样,我们在考试之前就准备了一份标准答案,当时不乏感兴趣的同学来向我们要这份答案。毕竟,这是中国传统文化和高科技的结晶。

本来成功可以预期了,一个疏漏导致了最后的溃败。大仙摇卦没考虑到A/B卷,临考前, 老师明确了要分A、B卷,这使得我们将一份答案拆成两份(记不清当时的拆分原则了)。我又运用了我们的专业知识,将答案编码成数字。有些同学不想背答案,就把这些数字写在考试用的铅笔上。这是安全的,铅笔上记的是数字,而答案是字母A、B、C、D。在考场上,这些数字又被解码成了A、B、C、D。监考老师丝毫没有怀疑这些铅笔。

说结局吧,大仙是中国传统文化的忠实追随者,实在不擅长英语,他把宝全压在这套答案上,这次考试没通过,且分数较低。我做了两手准备,既写程序,也不放松考前准备,考试顺利通过,离优秀线仅差几分。另外有一位同学,一直在认真复习备考,考前得到了我们的答案, 对我们的做法将信将疑。当考试时,两个听力题做下来,他发现我们的答案都是正确的。于是,深刻地相信了我们的预测能力,所以,在后面的题目中,大力地参考我们的答案。结果,他以几分之差未能通过考试。

我事后进行了认真思考。罪魁祸首是A、B卷,大仙摇卦是虔诚的,所以,直接以卦象得到的答案应该对应于大仙的那份考卷。我们后来的失误在于,对这份答案作了拆分和修正,导致很多人为因素加入进来。这件事情以后,没有人再相信我们的算法和做法。程序和算法都没有保存下来。凭心而论,我们设计的这套算法比如今网络上流传的很多预测软件或服务,要精致得多。毕竟我们不是以玩的心态来做事的,尤其是大仙,那是真的全身心投入的。我们也反复地拿书上的样题来测试和调整算法中的参数。当时有些同学不相信我们,我们请他在习题书或模拟试卷上指定一个题目,然后大仙当场摇卦并算出答案。我们不作弊,往往真的能算对答案,但不能保证总是正确的。大仙也在这个过程中修正算法和参数。遗憾的是,这件事情最终成了笑谈。

继续提升计算机技能

来到清华大学以后,我在计算机和数学两方面的优势让我如鱼得水,虽然我缺乏工科的训练,也不懂清华大学本科生所擅长的诸如制图、金工等技艺, 但我选择的专业--模式识别和智能控制一一并不需要这些技艺,因而研究生期间的学习异乎寻常地轻松,那时候我已经从PASCAL转到C语言了,使用Turbo C编程环境。为了快速地转到一门新语言,我的做法是,用新语言写几个自己熟悉的程序,比如下拉菜单。实际,上相当于在脑子里把这几个程序移植到新语言环境下。

Turbo C编程环境很好用,我很快就掌握了。然后又从C语言转向C++,由Turbo C++, 自然跟随到Borland C++。在DOS环境下,最理想的版本是Borland C++3.1,可谓登峰造极的DOS程序集成开发环境。

在研究生学习期间,第一年以课程为主,我选了几门数学课,像线性代数、随机过程等,既轻松,学分又多。我在清华大学唯一选修的一门计算机课程是图形学, 上这门课的感觉实在不好。首先,课上使用BASIC语言,实质性的内容很少,基本上没学到什么东西;其次,老师大概糊涂时候多,明白时候少,课上如此,课下也如此,我明明选修了这门课,居然不给我成绩。临毕业前夕,检查学分的时候,我才发现老师居然没给我成绩。最后,我拿着自己做的一个很漂亮的程序,同时在Borland C++集成环境中向老师演示了一段绘图程序,老师给我补了个成绩“通过”。在清华大学上过好的课程也有,像李衍达老师的现代信号处理、边肇祺老师的模式识别,收获非常大,此外,我还旁听了吴麒老师的控制理论课程。数学课也不错,不过对我来说,只是浅浅地复习了一遍,没别
的感觉。

C是自学的。那时候,学C是过渡性质的。大家都是先有C语言的基础,会用C来写程序,然后写几个类(class),这就过渡到C了。用C也是过渡性的,很多人在Turbo C或Borland C中编C程序, 会用集成环境中的功能了,然后在程序中使用一 些跟class有关的代码,这样就是在用C了。虽然我们今天到处能看到纯粹的C代码,但那个时候真正的C代码很少。即使有些程序用到了class,往往也只是简单地进行数据封装而已。大多数介绍C语言的书也是如此, 至少2/3的篇幅在讲C语言,临到最后提一下class,给一点例子和描述,这就算是C了。在图书市场上看不到国外的C名著,90年代国外出版了大量C++经典作品,而相当一部分是在进入新世纪后才被引进到国内的。这差不多反映了我们在计算机程序语言方面的落后。

我用C编写了一套界面库, 练习了C中许多以class为基础的特性,像类的继承、虚函数,甚至纯虚函数等,所以,在学习C方面,我算是较早进入C境界的。有了语言的基础,再加上像Borland C++这样好用的集成开发环境,我在那几年过得很舒服。经常还能够帮助别人解决一些程序难题。

校园生活只是一部分,我另有相当一部分时间在中关村的一家数据处理公司。公司的主体是一群清华人,其中软件技术人员以清华大学计算机系的一群学生为主。我与他们共事,开发一些实际项目或产品所需要的软件。这是一群很优秀的技术人,受过良好的专业教育和训练,又有开放的心态,而我是长期靠自学的,跟他们在一起,让我受益匪浅。后来,由于公司新技术发展的需要,我从事相对研究性质的方向,这样可以兼顾到学校和公司两边的要求。

那两年,中关村的电子市场尚在发展初期,做各种生意的利润空间都很大。比如说,卖软盘、 卖打印机这样的电脑配件也很赚钱。光驱和光盘尚未流行起来,硬盘空间也不大,好一点的PC机有40MB硬盘。软盘以5寸盘为主流,大小为1.2MB。盗版软件的载体是软盘,拷贝一 套软件少则几片软盘,多则10多片,甚至20多片软盘。像Windows 3.1大约6~7片,Borland C++3.1大约18片。 其他一些软件,如AutoCAD、Novell、中文字库等,也往往需要一盒软盘才能装下。清华大学有些学生常常背着几盒软盘,骑着自行车混迹于中关村,他们给人装电脑,或者帮人解决一些软硬件方面的实际问题。我认识这样的同学,所以也能拿到一些软件,但我自己还是以钻研技术为主。有一个很常用的工具PC TOOLS, 在DOS时代可谓电脑爱好者的瑞士军刀,我们使用它来修改系统、破
解软件、修复软硬盘和修改游戏等。不过,到了Windows时代以后,它逐渐没落了。我曾经有一一次机会到河北的一个贫困县,帮他们县委配置一 台PC机,连上打印机,装上汉字系统和字处理软件,然后指导一名秘书如何排版和输出文件(使用科印排版软件)。 当他们看到从针式打印机上打印出第一份书面文件时,那份迎接高科技的热情和惊喜让我也很受鼓舞。

研究生期间在宿舍里写程序

在读研究生期间,我受数据处理公司的委派到深圳工作了一个暑期。深圳很热:不仅天气很热,人们做事情(主要是挣钱)也充满热情。而且深圳在引进国外产品和技术方面比中关村要领先得多。我在深圳做的事情是,开发一套基于多媒体界面的信息查询系统,需要使用音频卡、视频卡和触摸屏的功能。这种信息查询系统今天已经非常普及了,像在机场、饭店、银行等都可以看到,但当时还是很新鲜的,尤其是触摸屏。这项目没有多大的技术挑战性,因为我并不需要自己写底层的驱动代码,而是直接在厂商提供的驱动库的基础上实现应用层需要的功能。我在深圳的工作有某种程度的创业成分,虽艰苦,但非常投入并且有干劲。当时的深圳还是一个淘金的城市,各类型的人来到深圳,工作和生活节奏快得难以想象。在马路上,所有的人都在快步走动,没见过慢吞吞的。让我最为感触的是,虽然深圳地方不大,但这里的人在做全国的市场,把香港、台湾的先进技术和产品推广到内地。譬如,把多媒体技术往内地的主要城市推广和实用化。
我在研究生班上是最后一批毕业的,一直坚持到满三年。清华大学的好学生有一种非常相近的模式,又红又专,响应学校的号召,积极承担学校、系里布置的各项任务,尤其是在学生工作中表现突出。我未能适应这种模式,在争取上进方面彻底失败。三年中无任何奖项,还差点被处分。所以,到第三年时,我非常消停,不再做任何出格的事情,而是专心于技术和毕业论文。

静下来就会有收获。我把放出去的心收回来,认真地思考技术和前途。我始终认为自己在玩计算机,对计算机纯粹是一种兴趣,从来没有认真地把它当作专业或职业。另外,我也开始追求上进,虽然我知道在清华大学改变形象为时已晚,但努力表现总是值得鼓励的。于是, 通过班级党支部获得了在清华大学党校听课的机会。我珍惜好不容易得来的听课机会,每次都认真去听。而其中一次讲座改变了我后来的职业规划。在党校组织的报告活动中,我听到了王选老师介绍他从事激光照排研究的经历,以及当时正在进行的产业化发展机会。我意识到,这才是在做事业。王老师从数学在计算机领域中的作用开始讲起,娓娓道来,展示了一个巨大的发展空间。

我原来计划回到数学上,攻读博士学位,但自从听了王老师的报告以后,我看到了另一条路可以走。于是,我联系了王老师,很快得到了肯定的回复。那时候分配工作受各种限制,我申请北大的工作岗位并不顺利。说实话,清华大学人事部门对学生的出路毫不留情,我不幸撞上,让本来顺理成章的事情变得曲折无比。所幸的是,最后我得以顺利毕业并分配到北京大学参加工作。
最后一年,在技术方面,我也开始总结和反思。DOS已经玩得差不多了,而且我也清楚地意识到,做创新性的工作才是真正的出路,懂系统和会写程序只是基础。我以前写过的程序价值不高。我整理了一份界面代码,并且参考当时已经开始流行的Windows界面风格, 再附带上一套汉字库,因而在界面中支持汉字。这是利用Borland C开发的在DOS环境下模仿Windows界面的工具, 并无多大创意,只是一份C实现和封装而已。另一方面,我认真阅读了Windows SDK的一套手册, 思考了它的消息机制和窗口管理逻辑。BorlandC++ 3.1也支持Windows应用程序的开发,但不如对DOS程序支持得好,我基本上参考Windows SDK的手册和指南来理解Windows的编程模型。

在DOS时代,以及Windows时代的早期,有一 类国内土生土长的软件值得特别提及,那便是中文系统。中文系统通常由一些汉字输入法、显示字库及打印字库构成。我只会使用拼音输入法,但发音又不准,这造成了汉字输入上的不方便,所以,那时候我写文章、写论文都用纸笔。不过有些中文系统中内置的南方拼音或模糊拼音让我很喜欢,因为它们缓解了这一不便。当转到Windows平台以后,我不再依赖这种懒惰拼音,而是认真地记下正确的拼音,并试图纠正自己的发音。经过一段时间以后,常用字词的拼音都能熟练地掌握,但南方口音实在改不过来。

在清华大学读书三年,我去学校机房的时间很少, 但经常到图书馆看书。我很幸运,入学刚一个月,新图书馆便落成并开馆,我经常在图书馆的阅览室自习,阅读外文期刊或图书。如果把图书馆比作知识的海洋,那我就是知识海洋中游荡的一条小鱼,贪婪地汲取着各种知识。

开始职业生涯

我确信在北京大学计算机研究所跟着王选老师是可以有所作为的,我带着这样的信念来到北京大学。在研究所的工作环境中真的很受鼓舞,我知道我们每个人都有机会创造未来。当时我被安排在地理信息系统研究组,首要的任务是解决地图录入和出版的问题,其次考虑建立空间数据库。我缺乏地理方面的背景知识,于是去北大地理系(当时已改名为城市环境系)旁听地图制图课程。我上大学以来第一次这么认真地听课,学到了很多知识。以前看地图从来没想到过的一些问题,比如,如何把地球的球面展开成平面的地图,这一次算有了深刻体会。

天有不测风云,正当我兴致勃勃准备大展鸿图的时候, 一场疾病降临,此后的五、六年间我一直受疾病困扰,只能从事一些非关键业务,或辅助性的研究或开发工作。总结起来,我阶段性地做了以下一些事情:

  • 用半年时间,在半工作半休息的状态下,完成了第一 版的地图出版系统。我经常在下午或晚上到未名湖边上散步,想好算法的思路,第二天再编写代码,实现算法和功能。地图出版涉及很多图形算法,所幸的是,我几乎能清楚地记得平面几何中的各种公式和定理,用代码实现毫不费力。
  • 学习和掌握了Microsoft的组件对象模型(COM),并指导其他项目组使用COM技术。最初的需求是为了在Lotus Notes中集成方正已有的数字采编功能, 后来其他一些部门也需要用到COM技术。我个人的成果是完成了本书《COM原理与应用》,由清华大学出版社出版。
  • 当了一年多辅助的网络管理员,实际、上这个职位并不需要,只不过我在业务部门没地方可去。这正好是Windows NT 4.0不断推出补丁的时期,因此我对WindowsNT有了深刻的认识,知道Windows 2000操作系统的重要性,提一下在编程方面的长进。为了开发Windows应用程序, 我先用过MSC 7.0(有一个集成环境称为Quick C),后来使用Microsoft Visual C1.0。 其中16位Windows应用程序的最佳开发工具是Visual C 1.5。自那以后,我便彻底离开了Borland的阵营,转而使用Microsoft的开发工具系列。由于我有C的基础,并且自己整理过一个模仿Windows 界面的代码库,所以,使用Visual C的MFC类库非常得心应手。切换过来没多久,我就可以编写各种界面风格的程序。那时候最主要的学习材料是VisualC的联机帮助,以及一份讲述VisualC编程的指南。

学习COM没那么容易,毕竟COM的底层有一套复杂的管理机制在支撑着。我学习COM绕了一个大弯子,先从LotusNotes支持的组件对象开始摸索, 然后回到Microsoft的OLE(对象链接和嵌入)模型, 最后才回归到COM标准模型。这是一个由复杂到简单的过程,开始时很艰苦,有点云里雾里,但渐渐豁然开朗。然而,实际工作中并不需要太多底层的控制,这些关于COM核心的知识对于理解自己的程序以及在什么样的环境下能正确地发挥作用有帮助。此期间主要的参考书是《Inside COM》和《Inside OLE》(2nd Edition)。

当我终于意识到自己在软件研发方面很难再有机会亲身实践时,便考虑如何让自己的技术积累还能有点用。在机缘巧合之下我接手了《Inside Visual C++》(4th Edition)的翻译工作,由于是第一次做翻译,我格外认真,而且一直抢进度,唯恐落后于既定的时间。我只用4个月便翻译完成,但交给编辑以后,将近一年后才出版。这本书中的内容对我来说,就像我自己在写总结一样,虽然以前并未认真读过这本书的内容,但绝大多数章节介绍的编程技术我在实践中都用到过,所以理解这些内容毫不费力。另外,我使用的语言比较朴实,基本上跟程序员之间平时的交流语言差不多,这大概是这本书自出版以后一直备受欢迎的原因。

2010年2月作者与儿子在海南合影

另外,便是将所学的COM知识写成了《COM原理与应用》,这是一本介于《Inside COM》和《Inside OLE》(2nd Edition)之间的书。它较为系统地阐述了COM的基本原理,以及COM底层基础设施中的核心技术。写作这本书的动机非常简单,市面上很少有关于COM的书,而COM又是一项很好的技术,恰好我有所积累,于是便将其整理出来。为了将一些技术主题描述清楚,我写了一些例子程序,或者找现成的例子或代码。书里毫无炫耀,我也不期望它能带来多少收益。实际的市场效果出乎我的意料,居然十年之后出版社还在重印。

由于这几年在工作中一直处于边缘位置,我的心态逐渐发生变化。不再狂妄、不再心急,能够心平气和地看待一些社会现象和自身遭遇。在技术方面,我逐渐培养起对软件技术的大局观,可以这么说,以前我懂得把一个程序做成一个独立模块,并且很精致地设计好接口, 以便在各种场合下可以方便地重用这一模块,而现在我更加知道软件设计的重要性,系统化的组件设计是建立复杂系统的基础和实现软件可扩展性的必由之路。对于类型、接口、函数实现、代码重用、解耦合等程序设计中的概念有了更加清晰的认识。

到2000年时,我看到了《设计模式》(by GoF)这本书。尽管书中例子程序的语言和背景我并不熟悉,但我很快看完了这本书,并且对大多数模式倍感亲切。实际上,像MFC类库和COM组件模型正是大量地运用了这些模式。模式的奥妙正在于此,让有经验的人一看到就似曾相识,让新手可以快速地吸收前人的经验。我一直期望有人能改编这本书,使用国内流行的计算环境来阐释这些模式,但似乎这本书太经典了,以至于无人正面碰触其内容。

从2000年秋季开始,我以在职身份攻读北京大学计算机系博士学位,师从王选院士。三年后我顺利拿到学位。这三年间,我既是老师,也是学生。由于博士生的身份,我必须要听课、考试,像英语课和政治课是必须要学的;在专业课方面,由于北京大学计算机系没有任何课程要求,所以我也就乐得不选专业课了。作为老师,我既指导研究生从事科研工作,也在计算机系和软件学院开设课程。这期间我从事网络与信息安全方向的研究工作,先后承接了3个863项目。尽管这几年我在程序设计方面并没有直接的经验积累,但是在研究项目执行过程中,对技术深度和广度的更高要求培养了我的技术全面观,让我更能够从系统的角度来看待程序技术,以及从安全的角度来看待系统。

从2000年以后,我经常有机会在北京大学和清华大学开设课程,既有研究生课程,也有本科生课程。设计一门课程需要花费很大的精力,从内容取舍,课时安排,到每一 次课程讲义的准备,再到作业设计,以及准备考题等。这比写一本书要求还高。我在北京大学计算机系开设的“组件技术"课程以COM组件为主线索,辅以C++程序设计基础、设计模式、CORBA等作为课程相关主题,力求让听课的学生对于组件技术有深刻的理解。“网络与信息安全"课程侧重于网络与系统,并结合了像密码学、网络攻防以及操作系统安全等内容。这些课程的容量大,只要学生认真学习,一定会很有收获。

教研究生的课程其实相对容易一些,因为老师总是可以假设学生已经会了这个,或者会了那个;本科生低年级的课程则不能如此。真正让我自己收获巨大的课程是给清华大学软件科学实验班讲授的"程序设计与算法基础"课。这是一个特殊的班级,目的是培养世界一流的人才,设计的课程也要瞄准国外一流的大学。我为这门课定义的目标是,计算机科学系的本科生只需上这一 门课就能在编程方面过关,以后做研究或工程项目可以直接上手。为了设计好这门课,我必须对程序设计和基础算法有通透的理解才行,所以,借着讲授这门课的机会,我自己又把基础补了补。在程序设计方面,我有足够的经验和技巧, 但受限于成长环境,我缺乏正规的基础训练,所以通过这门课程,我自己先得到了计算机基础训练。有时候我跟人开玩笑说,上了这门课以后我才觉得有科班生的感觉。

除了课程,我也经常有机会做一些技术讲座, 每次讲座我都会认真准备,唯恐在讲座过程中卡壳。如果在讲到一个话题时突然想不起来一些东西,或者自己脑子转糊涂了,圆场并不难,但我还是不希望发生这样的状况。如果要介绍的题目是自己真正吃透的,甚至是自己的研究成果, 这种情形基本上不会发生。但若是现学现卖,或者由于某些原因自己还一知半解,那么避免卡壳的最好办法是做好充足的准备。我差不多每隔半年到一年,会准备一个主题,找机会讲一讲。我选择的主题都是技术性的,有的侧重于基础,有的与我的研究工作有关。我自己从这些技术中获益,也希望介绍给更多的人,这是我选题的基本出发点。

教与学是相辅相成的,我在教的过程中也获得知识,并且强化了基础。我很幸运,总是有机会做自己愿意做的事情。

我的成长历程在70年代的人中算是一种典型:从兴趣出发走进计算机领域,在学校里获得计算机知识,并且在工业界的实践活动中形成自己的专业和职业方向。如果说有一点特色的话,那就是当我的很多同龄人走上管理或领导岗位时,我仍然在钻研技术,对技术依然保持浓厚的兴趣。我们这代人赶,上了IT业发展的大好时机,在物质方面得到了富足的回报,从而有条件追求一些超现实的东西,比如更精致的程序。

我的程序人生之第三个10年 | 2020

作者/潘爱民

我第一次写程序人生是2000年, 当时有很多编程实践,刚刚开始有系统性的思考; 第二次是2010年写了我的成长故事(发表在《程序员》杂志上),当时即将从微软亚洲研究院毕业,准备进入国内工业界。到2020年,又10年过去了。回顾这10年,我一直在工业界努力,经历了三家公司:盛大、阿里巴巴和杭州指令集,亲历了移动互联网的发展,以及物联网时代的兴起。

在计算机技术飞速发展的年代,10年是一个很大的跨度,足以发生翻天覆地的变化。我有幸在正值壮年之际,又一次经历了中国互联网产业的蓬勃发展。本文记录我在这10年中的职业经历、技术感悟,以及从技术转向业务、与产业融合的实践与思考。

2010年夏天,我离开微软亚洲研究院,踏上了南下到上海的旅程,加入盛大创新院。当时的感受是,在经历过北京大学的教学科研以及微软亚洲研究院的系统研究以后,非常渴望回到国内的企业或机构进行基础软件的研发。经过多方考察,我选择了盛大创新院作为职业生涯的下一站。

盛大创新院

对于程序员来说,盛大创新院是一个理想的创新机构,有老板的大力支持,有大量互联网人才,正赶上移动互联网蓬勃发展的大好时机。有一批优秀的项目脱颖而出,涉及到语音、短视频、云计算、云笔记、LBS、智能手机等很多领域,其中有不少项目在盛大创新院解散以后还在延续并且做成功了。当时我带领的方向是移动操作系统 - VisionOS。为什么要做移动操作系统,以及如何做、技术路径如何选择,这是在立项阶段反复思考和推敲的问题。我至今认为,那是发展自有移动操作系统的最佳时期,Android尚未占据市场垄断地位,并且Android手机的体验和性能离iOS还有显著差距,自研系统有机会快速赶上来。

如果把微软亚洲研究院看作企业象牙塔的话,那么在盛大创新院则感受到了国内工业界的创新活跃氛围。在盛大做终端操作系统,游戏作为应用生态中的一个重要组成部分,是独特的优势。当时手机游戏尚处于早期摸索阶段,但很多页游已经商业化运营了。VisionOS选择支持Flash和HTML5 (H5),作为对于手机终端小游戏的基础平台。尽管当时有Flash和H5谁是未来的争论,作为基础系统平台,面对大量存量的Flash内容,VisionOS必须做好支持;同时基于前几年我对Web技术的研究,未来我更看好H5。因此VisionOS对于Flash的策略是兼容支持;对于Web则从系统底层打造形成一个应用平台(Web Runtime)。

这是我第一次组建并带领一个操作系统研发团队,自己做架构师,从Linux操作系统到应用层技术栈,再到云端服务,都涉及到了。VisionOS的技术架构跟Windows比起来,简化太多了,所以我在VisionOS的架构设计与技术选型上都能得心应手。得益于盛大创新院良好的技术创新氛围以及相对优厚的待遇,我组建了一个非常优秀的团队,有玩Linux的,有精通图形引擎的,有精通软件工程的,有精通多媒体编解码的,也有擅长系统安全的,共十多个人,用一年多时间建立了一个性能优异的基于Linux/WebKit的移动操作系统。我从一开始就没考虑跟Android兼容,而是走自建生态的道路。VisionOS从立项到决定解散,差不多两年时间, 对我来说,就像一次创业经历,做出了一个原型系统,但未能实现商业化。

离开盛大创新院,我休息了两个月,拿到了华为和阿!里巴巴的操作系统首席架构师的Offer,最终命运使然,2013年初,我来到杭州,加入了阿里云OS。当时阿里云OS是阿里云下属的一个部门,所以,确切来说,我加入了阿里云。杭州是我家乡的省城,一向以风景优美著称, 当时还算不上互联网技术人才聚集地,但我时有耳闻,很多前端工程师经常在杭州聚会,技术的氛围正在浓厚起来。
我在阿里巴巴工作了将近六年,主要分三个阶段:云0S(后更名为阿里YunOS)、集团安全部,以及飞猪和业务平台部。在云OS工作的两年间,正赶上云0S蓬勃发展的时期,从一个以Android BSP为基础的兼容Android应用的移动操作系统,演变为一个自主移动操作系统。作为云OS首席架构师,最大的挑战是确定新的架构,并且推动各个开发组接受新的架构。我同时也带领了核心系统模块的研发组。基于盛大VisionOS的研发经验和教训,我在设计新架构以及核心模块的技术选型方面,有足够的把握让新的云OS符合未来发展。

两年间,云OS技术团队已经非常强大了,聚集了国内大量的系统工程师。我一心想做成云OS,然而,天时、地利、人和很难三者得兼,最终我还是放弃了继续努力, 转到了阿里巴巴安全部。当时正赶上阿里的电商业务全面从PC互联网转向移动互联网,安全能力也势必要跟着升级。我一方面支持阿里业务的移动安全,另一方面带领一个架构师团队来梳理和重构阿里巴巴的安全体系。经过两年的安全领域实践以后,我希望能到业务部门学习和锻炼,于是选择了阿里飞猪。我认为这是一 个小而美的业务部门,既有平台属性,也有行业属性。虽然飞猪的业务体量相对淘宝和天猫的总量小得多,但旅游是一 一个发展中的行业,业务空间大,创新的机会也多。

最后赶上中台战略下的部门调整与合并,我来到了业务平台部门。我突然发现,加入阿里巴巴时满怀着做成一个移动操作系统的梦想,但现实中却发展成为了企业中的老白兔。结合自己最后两年对于业务的认知,以及物联网行业发展的判断,也感受到杭州这块互联网热土,最终我决定离开阿里巴巴,建立一家创业公司。

杭州指令集

在杭州,从阿里巴巴出来创业的前员工是一 个广泛的群体,并且不乏成功者。我估计杭州一半以上的科技创业公司的合伙团队中都有前阿里员工的身影。在这样的群体氛围中,我选择出来创业,也就丝毫不奇怪了。

我创立指令集有两个初衷: 一、物联网是后移动互联网时代能看得到的一个大趋势,而这个产业还处于零散发展的阶段,除了一些嵌入式操作系统演变为物联网设备的操作系统以外,还缺乏基础性的系统软件,所以我认为有机会做物联网场景的系统软件(解决一些共性的基础功能需求); 二、感受到了智慧园区/智慧楼宇的发展与变迁,以阿里巴巴西溪园区为例,2013年启用时就是一 个普通的安装了很多智能设备的园区,但经过几年的发展,园区内的很多设施,越来越智能,包括门禁闸机、灯、空调、停车、电视屏等,这一 切都源于背后有一套系统,将所有相关的设备连接到一起,并且与企业信息系统打通,从而实现了这些有良好体验的智慧功能。

我坚信物联网时代需要这样的系统软件。经过一 年的研发和运营,指令集公司于2019年6月发布了商业智能操作系统1.0版本,可用于楼宇、园区等商业场景。并且通过跟大量的目标客户和合作伙伴交流,确实看到了广泛的市场前景。更进一步,在跟伙伴交流的过程中,我也看到了在工业制造场景下更加需要这样的物联网操作系统软件,因此指令集公司也把工业智能操作系统作为第二一个重要的发展方向。

一旦加入创业大军,每天工作的重点以及思考问题的方式跟以往在大企业工作不一样了。某种程度上,这是一个身份的转变,原来是专业工作者,现在是企业经营主。尽管如此,我仍然努力做到对技术保持关注,特别是新兴的技术趋势。我坚持写技术文章,通过写文章来理清思路,对相关技术进行全面的整理,并结合实践提出一些观点。

从2010到2020年这10年,我们经历了移动互联网的蓬勃发展、人工智能的再次复兴、大数据的各种应用,以及物联网技术在各行各业的应用。我作为一 名从业者,有机会在大公司的平台上经历了这些技术的发展与应用,并且也有机会亲自主导一个物联网操作系统的研发和推广,实属幸运。

移动系统技术

早在2005年,我就选择了将来往系统技术方向发展,当时还在微软亚洲研究院工作。我的想法是,在微软工作最有价值的,应该是钻研Windows操作系统,这是独有的机会,所以我从Windows性能诊断分析作为切入点,研究Windows的内部机理,将Windows线程调度、内存管理、I/O等最核心的模块剖析了一遍,并形成了一套系统性的诊断方法。有了这些基础以后,我又进一步考虑应用层的性能问题,以浏览器的渲染引擎作为研究对象,分析渲染引擎的整个计算过程,挖掘可优化的空间。核心的思想是,在计算流程中尽可能把重复的计算移除掉。

从而保持整个响应过程的高效。这些研究工作为我后来做操作系统打下了扎实的基础。2010年,我在盛大创新院有机会设计一个新的移动操作系统VisionOS。基本的思路是,在移动设备上, 用Linux加一个Web渲染引擎来支撑一个Web运行环境(Web Runtime),既可以运行本地的Web应用,也可以运行在线应用,并且通过插件的形式运行Flash控件。我调研了Linux平台上可使用的各种图形软件,最终决定自行开发一套适合于移动设备的图形库,与WebKit高效对接。Linux社区有许多开源的图形库,也有像Qt这类比较成熟的跨平台图形窗口系统,但它们首先为了兼容性的目的牺牲了效率,其次为了提升效率又做了很多优化,从而软件变得很复杂。在移动设备上不需要复杂的图形功能和窗口管理能力,我当时的想法是,借鉴Windows图形窗口系统的思想,简化到极致,只需要基本的图形能力和简单窗口管理,就可以支撑VisionOS的底层图形需求。移动应用内部的控件管理由WebKit自身来完成即可。

在当时的智能手机硬件环境下,要想做到流畅的触控体验,必须进行深入的优化,其中有一点至关重要,即把芯片的图形加速能力启用起来。由于我们选择了原生的Linux系统,C库采用glibc,那就要找到芯片厂商提供的硬件加速库,才能完成这一优化。然而我接触了四五家芯片厂商,发现当时的移动芯片厂商基本上只提供Android的BSP,几乎不再提供Linux BSP,除非有足够采购量来提出特殊需求。在没有得到芯片厂商支持的情况下,我们做了一个高难度的折中方案,将Android BSP中的硬件加速库移植到VisionOS中,也就是说,将非glibc环境下的一个二进制代码库链接到glibc中,供上层模块调用。我团队中的同事足够优秀,将这些工作做得很漂亮,VisionOS比当时同机配的Android系统要明显高效,并且也很稳定。

跨进程通信是一个操作系统非常重要的能力,它让应用与应用之间、应用与系统之间便捷、高效地相互调用功能。系统底层往往有很多琐碎的细节要处理,包括应用数据到底层二进制数据的转换、共享缓冲区的管理等。作为一个面向终端用户的操作系统,必须要提供一套便于开发者使用的跨进程通信机制。VisionOS选择了自研方案,在Linux提供的跨进程通信基础上包装了一 套可解析应用语义的系统机制。(Android对应有一 套binder机制,用于应用与系统、应用与应用之间进行通信。)

除了支持Web应用和Flash内容,我们也移植了一 些Linux原生应用。此外,有几个系统应用(包括桌面和相册应用)也是原生开发的。在当时的硬件条件下,Web版本的相册应用与原生版本的相册应用有显著的性能差异。因此,对原生应用的支持也是VisionOS的一个特点。事实上,我调研了当时Android手机上的某一一家应用市场中排名前一千个Android应用,大部分应用包含了原生版本的核心模块(譬如图形处理、 多媒体处理、重力模型、加解密等),Java代码只是搭建了应用的框架而已。这些核心模块是以.so文件格式打包在应用发行包中, 导致非ARM处理器的其他手机或移动终端根本用不了这些应用。我曾经接触过一家MIPS芯片商, 尽管他们也支持Android操作系统,但当时环境下他们的终端设备无法直接运行市场上的这些Android应用。

我做移动操作系统将近五年时间,先是做了VisionOS,后来两年又做了云OS, 在技术发挥上可谓淋漓尽致,但遗憾的是,因为种种原因没有真正意义上建立起一个移动操作系统的生态。而随着Android系统越来越先进,其生态粘性越来越强,再要建立一个对标的移动操作系统, 可能性微乎其微了,除非某种特定的产业结构需求出现。

架构师之路

最近这10年,我的技术角色定为架构师可能是最合适的,虽然我自己最喜欢的称呼是系统程序员。架构师是一个泛称,在具体场景中,往往对应了一个规模或大或小的系统,可以是软件系统,也可以是软硬件结合的系统。
比如一个应用软件,需要有一个架构师;一个操作系统,对应有一个架构师;一个业务模块,可能也有一个架构师。
随着互联网技术和业务的快速发展,架构师这一 职业也跟着在互联网行业风生水起。我谈谈对软件架构师,特别是系统软件架构师的职责的理解。

  • 软件基本架构首先要合理,所谓合理,指采用当时相对成熟的软件技术来实现系统功能。一方面,架构师要对相关的软件技术有足够的了解或精通,才能做好基础的选型工作; 另一方面也要了解技术发展趋势,对软件架构的扩展能力和前瞻性有清晰的判断。现实中的绝大多数问题在业界都有一些参考方案,或者有一些成型的模式可供参考。
  • 对软件,特别是系统软件的性能,有充分的理解。性能包含多方面的指标,有关于资源使用方面的,譬如存储使用、网络带宽使用等,也包括异常情况下的表现、对大并发量的容忍、延迟等。在设计阶段有针对性能的预估,在系统上线后有对性能的监控,确保软件,系统健康运行。
  • 稳定性,软件的质量保障是一个工程过程,在软件发布以前经过充分测试,包括功能测试和性能测试。软件升级迭代流程要充分考虑到兼容性要求,常见的做法是,先采用灰度发布再全量发布,并且系统具有回滚能力。
  • 成本控制和预测。高性能和稳定可靠(以及安全性)都是以成本为基础的。在技术选型、性能和稳定性保障方面所做的决策,都需要考虑到成本因素。成本是一个综合考虑,涉及到业务需求、商业价值、技术方案等多方面因素。

从软件工程师(或程序员)到成为合格的架构师需要技术积累,有足够广阔的知识面,更需要大系统经验的积累。大系统经验是难能可贵的,如果在客观的工作场景中找不到,也可以从剖析一些软件系统入手,来积累对复杂系统的认知和把控能力。系统程序员在这方面有天然的优势,因为系统程序员往往精通底层工作原理,所以在系统性能、稳定性、安全性等方面能直接看到问题的本质。但是,从系统程序员到架构师有一 道坎,须放下对底层技术的执念,接受上层应用或中间件的各种妥协,包括一些不优雅或不精巧的习惯做法。

这10年间,我的架构师生涯也分几段经历。在移动操作系统方向上,我核心工作在架构设计上,带领一些核心模块的开发小组。得益于早年在Windows操作系统和Web渲染引擎方向的深入研究,我能够提出比较合理、先进的系统架构。最具挑战性的部分是如何构建应用生态,包括应用开发语言和环境的选择,以及是否或如何兼容市场上已有的应用。

  • 在互联网业务安全方向上,依托阿里巴巴集团的业务背景,我有机会全面地梳理和构建企业服务安全体系: 从系统攻防,到业务平台的安全,再到情报收集,到研发流程中植入安全要求等。特别值得一提的是,阿里业务安全的背后是大数据能力和对计算平台的需求。我曾经负责过某一年双11防刷单的业务,本质上这是一个大流量场景下恶意流量的识别与阻断问题,背后的技术要求是,长期的数据积累,再加上实时计算与响应。
  • 在阿里业务线做架构。电商是典型的互联网业务,从PC互联网到移动互联网,既有技术挑战(比如支撑频繁的促销活动),又有大量的数据和服务需要拓展(比如旅行服务)。阿里巴巴的技术体系具有代表性,其基础平台结合了云计算的各种技术应用。我正好赶.上了阿里的中台战略:业务中台+数据中台,期间收获很多。其中有一段时间,我一直在研究与思考:如何将学术界关于软件工程的研究成果与阿里的场景结合起来。阿里业务平台的工程实践在有些方面超前学术界很多,但学术界的很多研究成果并未在阿里实践中发挥作用。
  • 在物联网方向,我从产业现状出发,看到一一个潜在的系统需求:能够将一 个物联网场景中的各种IoT设备连接起来并协同发挥作用的系统或平台。我将这样的系统软件称为物联网操作系统,而对应的运行在设备上的系统软件称为IOT设备操作系统。指令集公司正是做这样一 一个物联网操作系统,其核心能力是连接设备、数据汇聚与处理、业务支撑平台。设备连接面对的是各种IoT设备和广泛的协议;数据汇聚解决从数据采集,到数据存储、分析和处理的全流程;业务支撑平台主要将设备和数据的共性服务暴露给上层应用。

架构师解决的最核心问题是软件的复杂性。首先要对软件复杂性有深刻的认识,否则容易出现"过于畏惧系统而不敢下手"或者"对系统不敬畏而导致犯不该犯的错误"的情形;其次,要有足够的经验来应对软件中的复杂性。如上文所说,系统程序员更有优势成为架构师,因为系统底层往往需要提供基础的手段来克服一些本质困难,比如单机操作系统的内存管理与线程调度、分布式系统中的一致性算法等。

思考成为一种习惯

胡适曾经在赠给大学生的文章中提到"总得时时找一 两个值得研究的问题”。作为IT技术人,虽然已经离开学校,但身处快速发展的产业中,更应该时时思考一 些问题。下面列举一些我在过去十多年曾经思考过或实践过的技术题目。

  • 内存跨机调度。还在PC互联网时期,曾经有一 -段时期桌面P2P(peer-to-peer)技术很流行。我注意到,有些机器的内存很富余,而有的机器限于当时1GB或者2GB内存配置而导致性能低下。于是很自然的想法是,让空闲机器的物理内存放出来供忙机器使用,通过千兆局域网络,把忙机器发生page fault的页面按规则调度到空闲机器上。通过改Windows内核的做法,我和实习生实现了一个原型系统。最终的效果没有预期的那么理想,但此过程中我们学到了很多,掌握了页面调度的算法和路径,并且在内核中实现了高效的网络传输。
  • 快速反汇编。反汇编是逆向工程的基础,但是在x86二进制可执行文件中,反汇编难以做到100%正确,原因是代码段中总有一些空隙,并且指令又是变长的,按顺序反汇编很快就会丢失线索。我改变思路,从原始的程序入口和符号表线索入手,层层递进,不断挖掘新的线索;若没有确定性的线索了,我们再从未反汇编的代码区找出疑似的线索进行尝试,直至代码段全部反汇编出来。最终实验的结果非常理想,比商用的反汇编器达到的覆盖面还要大。在调试过程中,我们也见识到某些商业软件使用花指令(很少听说吧)做了代码混淆。
  • 一切计算均用查表来解决。这是一 个异想天开的主意,原始的想法是,既然计算机的本质是计算,每天有大量的计算在不断发生,其中必定有大量的计算是重复的,对于重复的计算,是不是只要算一次,下次直接查表就可以了。进一步的想法是,只要在云端部署一 个大计算机,所有的计算都交给云端查表来完成。这其实也是函数式编程的思想,但我们不知道如何框定一 个可计算的范围。这种想法也仅限于想想而已。这一思路我和实习生后来用在Web渲染引擎的性能优化上,把渲染树上的重复计算识别出来剔除掉,确实能显著提高渲染性能。
  • 一个安全问题的解决办法。有一次碰到一一个做云安全的朋友,想在云主机里加一些防护措施,但他的方案和思路没有得到技术老大的认可。后来,一支烟的功夫,我跟他讨论了这个方案,如何把风险降到最小, 尝试着建立一个最小的代码基让技术老大审核。功能性的代码可以动态加载。据说后来这个方案被接受了。这个方案就是Windows保护模式的变种,也是一些安全软件采用的手段,。红绿灯配时优化问题。坐车或开车的时候经常等红灯,脑子里就想着是不是合理,能不能优化;等电梯也是如此。终于今年4月份我在查阅了一些专业论文以后,系统性地整理了一下思路,将一路绿灯作为目标,进行了概率意义上的分析。并且,进一步以减少停车次数为目标,在红绿灯不能控制的情况下,是否通过控制车速来做到车协同路,变相地实现车路协同。

计算使这个世界的运行变得更加高效,我们的生活也为之发生变化。电脑的计算只是低级(机械)的计算,人脑的才是最聪明的计算;把平时的闲暇时刻用来做一 些发散性的思考,说不定会有意外的收获。曾经有一位我很尊敬的老师说过,脑子越用越灵光,对此我深信不疑。程序员受编程思想的影响,平时的思考往往是程序化的,我也逃不脱这种思维的禁锢,

在10年以前,我还是纯粹的技术人,以深入钻研技术为乐趣。最近这10年,我的职业生涯发生了很大变化。其中最重要的是,开始接触业务,贴近业务,并且也开始思考产业,最终走向了技术创业。

技术转向业务

我的经历是一段极其缓慢地从纯技术岗位走向业务的过程。先是在学校里工作,我职业初期做过一一个地图编辑产品,并进一步搭建地理信息系统,但很快就走上了教学科研岗位,脱离了业务需求。接着在微软亚洲研究院工作,比在学校里还纯粹钻研技术。这是一段非常幸福的时光,大部分时间可以海阔天空地思考技术,做实验。能做成原型就不错了。

进入工业界做移动操作系统和安全保障这一阶段开始接触业务,前者需要运营一个移动操作系统,后者要支撑阿里移动业务的安全。实际的需求来自于运营方或业务方,我的职责是做好技术和实施方案。如果把这些工作也看成业务的话,则它们属于后台支撑性的业务,我在阿里后期阶段的工作跟业务(旅行电商)结合越来越紧密,也参与一些业务发展会议。除了做一 些技术决策以外,还需要在业务需求基础上平衡和分配技术资源。如果有人问我,在阿里最值得学习的是什么,我的答案是
阿里做业务的方法,包括如何制定目标、拆解目标,以及如何运营一个业务(特别是利用数据来运营业务,这是阿里的优势)。虽然很多书或者:文章也会讲这些方法,但再多书面的学习都抵不上亲身参与一个业务周期更为有效。

产业的思考

能将自己的工作融入到一个产业中,这是扩大视野最好的做法。有些技术或产品天然要从产业的角度来看待,操作系统就是这样的典型产品。做移动操作系统要结合移动互联网产业的发展来思考,上游有芯片厂商,下游有手机厂商和移动服务商,可能中间还有设计公司或系统服务商。2012年我曾经访问过多家移动芯片厂商,了解到芯片厂商对于移动操作系统的态度和技术支持,知道自研独立系统的困难,并且从一些关键点上探索可能的技术方案。另外,通用市场和垂直领域各有不同的要求,其对应的产业链不一定是相同的。最终如何形成生态,包括硬件产业的生态、移动应用的开发者生态,决定了一个移动操作系统应该使用什么架构、如何运营。我花了五年时间想做成一个移动操作系统,有这样的机会是非常幸运的,但最终没有做成却是遗憾的。然而我个人获得了成长,这是一个额外的收获。

2018年我转到物联网领域,再次赶上了一个快速发展的产业。尽管物联网被提出并发展有很多年了,但是其发展空间仍然广阔。我们在各行各业都能看到设备在联网和升级,智能家居、汽车、监控摄像头、空调、电梯、人车通行道闸、工业生产设备等等,都以各种方式连接。上网络。基于对众多设备连接网络的技术路径和整体软件结构的分析,我认为除了设备上的操作系统,还需要一个针对物联网场景的系统软件,它解决该场景中的设备连接和数据共享的需求,让这些设备形成一个整体来协同工作。从物体联网的角度来讲,这才是真正的物联网操作系统。产业界既有的做法是建立共享的物联网平台, 然而大量的业务场景中这种共享平台并不能满足需要; 另一方面,在许多业务领域中已经在以各种方式来解决设备连接和数据共享的问题,但往往是一些局部的非通用方案。

跟上一个产业的发展,比跟踪一项技术的发展,要困难得多。这需要不断学习,不断思考。产业中的很多知识和经验并没有那么高科技,它们来源于实践者的日常活动中,包括失败的和成功的各种尝试。这10年间,我接触到了一些引领产业发展的人物,从他们身上学到了很多,也开始从产业发展的角度来思考问题。

技术创业感悟

从2018年我选择了加入创业大军,最深刻的体会是:离开大平台了,你就什么都不是了。经历了两年不到的创业历程,说几点感悟:

  • 技术创业,要快速搭建出目标软件,并找到试用客户。这一步是把创业的"故事"变成看得见、感受得到的场景,产品可以不完善,但要体现出核心理念。此步骤既可以验证可行性,也会接收到试用客户的初期反馈。创业前期是个不断试错的过程,每走好一步都可以增强支持者(包括股东、投资者,或合作伙伴等)的信心,也让团队更有信心。为了减小试错的代价,快是最有效的手段。
  • 聚焦。用技术来赚钱有各种途径,越贴近用户需求的技术或产品,相对而言变现容易得多。底层技术和产品要获得市场认可的周期则长得多。我们经常面临各种诱惑,比如有客户希望做一些他们的应用需求(像小程序之类的),或者客户已有的系统有遗留的问题需要解决一下。承接这样的需求可以快速地赚到钱,但影响主线产品的研发进度。作为初创的技术公司,一定要抵挡住诱惑,学会拒绝。做系统软件产品,更要耐得住寂寞。
  • 时刻保持危机感。在大平台上工作,危机感源于自己的职业价值;而一旦开始创业,危机感来自于公司的生死存亡。这种危机感可以把一个人或一 个团队的潜能发挥出来。做好技术是一种聪明,而面对内心中的危机感,需要的是智慧。
  • 信任团队。技术人创业,有大量知识需要补充,涉及财务、法务、品牌、市场、商务等,自己不可能在每个方向都成为专家,所以要依靠团队,信任团队。有了凝聚的、可信任的团队,企业才能走得远。

程序人生又10年,但这10年我实际。上跟程序代码的接触并不多。曾经有一次,我团队中的架构师给我讲代码实现,他怕我听不懂,就用以前DOS时代或者Windows时代的系统机制打比方,向我解释当前的架构方案。感谢这些架构师对我的贴心,确实软硬件技术发展都很快,编程的理念也有不小的变化。用10年的跨度来看技术进步,老程序员的知识结构是需要升级的。在国内IT企业市场,程序员35岁是一个职业坎,45岁很多程序员就屈服于现实了,55岁绝大多数就得退群了。

我在20年前写第一篇程序人生时,提到了我是软件开发队伍中的老兵,那时一方面是由于身体的垮塌,另一方面也是感受到了后浪的力量。最近这10年,我还培养了一个辅助习惯一一跑步,跑的距离从5公里开始,到10公里,再到半程马拉松(约21公里), 然后到全程马拉松(约42公里)。跑得不快,但能坚持下来。我希望自己的程序人生还能有至少两次续篇,写代码不一定多,但仍然保持跟代码的接触。

更多内容请关注 潘爱民个人博客:

https://blog.csdn.net/panaimin

5 / 5 ( 4

votes )


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK