整理电脑文档,又看到以前搜集的文章,这是潘爱民的文章。读了之后,还是觉得可以借鉴学习。继续努力吧。

潘爱民个人经历

原文如下:

https://blog.csdn.net/ComDev/article/details/656321

读完特意又搜了一下,发现还有一篇更新的潘爱民的文章如下:

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

https://blog.csdn.net/panaimin/article/details/106846846

潘爱民个人经历
     
中学——程序之初
  中学时候还谈不上软件开发,只是凭兴趣编制一些小程序,偶尔也编几个稍大一点的程序。有两件事情特别值得一提:

(1)当时我们只用BAISC,它有一种很特别的程序叫“一行程序”,也就是说,在一行内完成一个程序。因为BASIC语句一行只能容纳254个字符,而且一行内不许使用跳转与判断语句,所以一行程序不能完成很复杂的功能,但是有些有一定规律但又不很规则的图案打印或者计算任务可以由一行程序来完成。这是一种很好的游戏活动,非常适合于中学生的智力开发和锻炼。不知道现在是否还有类似这种形式的活动。

(2)中学期间我编过几个规模稍大一些的软件,BASIC代码行达到几千行(当时的16位机器内存加起来只有64K,用户程序可用内存不超过30K)。有意思的是,我在程序中还调用了我自己写的一段汇编,这段汇编直接操作图形显示缓冲区,实现图形的快速移动。AppleII机器使用6502处理器,当时也没有学过任何微机和操作系统知识,我记得那时一直不明白寄存器的概念,但是居然也能写出可以运行的汇编代码来,现在想来有点不可思议。不过从这件事情上,我也想到,我们经常听到有关青少年计算机奇迹的事情都是有可能的。他们可以自己编写代码制造病毒,可以攻击网络系统。青少年的想象力很丰富,潜力很大。
   中学期间,虽然没有象样的成绩,而且还直接影响了我的功课,但是在计算机方面所做的许多工作使我非常充实。不过,因为计算机的神秘性对我已经不再存在,所以我上大学还是选择了我当时非常钟情的数学——免试进入南开大学数学系。

大学——兴趣
  我在大学期间,花在计算机方面的精力要比数学方面多得多,在二年级时候,我有幸进入了南开计算机系模式识别实验室从事软件方面的工作。当时有一台286机器可供我使用,良好的工作条件使我有机会打下扎实的基础。
   (1)学习汇编语言。汇编语言在当时很盛行,我写了不少的汇编程序,连界面(下拉菜单)都用汇编来写,对于10h中断和21h中断中常用的功能非常熟,不需要查参考书就可以写出功能调用来。当时我在对一块图像卡编程时需要访问扩展内存(地址0xa00000),所以我研究了286保护模式的编程技术,主要阅读15h中断的汇编代码,最终解决了保护模式的切换和编程问题。保护模式与实模式的切换在今天已经意义不大,但当时来讲,由于DOS是实模式下运行的操作系统,保护模式往往是可望而不可及的。
   (2)PASCAL语言。PASCAL语言作为一种结构化编程语言,加上Turbo Pascal友好的集成开发环境,当时确实风靡一时。对于我来说,汇编语言再加上Turbo Pascal开发环境,确实是无往而不利。PASCAL语言具有很好的可读性,加上Turbo Pascal实现了单元(unit)管理功能,是学生最为喜欢的编程语言。我使用的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 C++ 3.1流行开来,这是DOS平台上最优秀的开发工具。Borland C++的集成开发环境加上相关的一些辅助工具,如Turbo Debugger等,是一个功能很强大的软件开发工具。从C语言到C++语言是一个很自然的迁移过程,尽管当时很多人在使用BC,但他们往往不涉及到面向对象编程,而我则很快领会了面向对象的思想,建立了一套自己的界面工具类库。我这一套界面工具类库很小,参照Turbo Vision的思想,模仿Windows 3.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年
   由于健康的原因,我被迫从开发人员的岗位上撤了下来,从97年下半年开始,我不再从事直接的开发工作,改做技术支持工作,是对开发人员的技术支持,不是最终用户的技术支持。这是我程序生涯中最暗淡的日子,但我还是努力让自己吸取营养,来填充自己对知识的渴望和需求。 这段时间,我考虑的焦点问题是如何把软件做得更好,具体来说,就是组件化程序设计,进一步具体化,我研究COM,并设法把COM技术应用到其他的开发组中,为其他人提供这方面的技术支持。我的工作做得不是很成功,COM的应用不是那么直截了当的,这在当时的条件下是很难克服的。
   我有必要再次强调群体的好处,北大计算机研究所内部高手如云,大家都是同事关系,所以交流起来比较方便,在这样的环境下,技术上的长进可以快得多。我又一次得益于环境的优势。 从学校环境来讲,我从南开到清华再到北大,尽管三个学校的校园都很优美,南开有新开湖和马蹄湖,清华有水木和荷塘,北大有未名湖和博雅塔。但是在我的职业程序生涯中,未名湖给了我很多启迪,当我从事开发工作或者写作时,我经常在夜晚到未名湖畔散步,从她幽静而深沉的气息中汲取灵感。

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

《Visual C++ .NET技术内幕(第6版)》定价:¥108.00     《Effective Java中文版》定价:¥39.00     《C++ Primer (3RD)中文版》定价:¥128.00
《COM本质论》定价:¥49.00     《深入解析ATL》定价:¥69.00     《Visual C++ 技术内幕(第四版)》定价:¥96.00
《COM原理与应用》定价:¥39.00     《深入理解Microsoft Windows2000分布式服务》定价:¥31.00     《深入理解COM+》定价:¥25.00
          [潘爱民译作][潘爱民著作]

本文由CSDN首发

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

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

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

我第一次写程序人生是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是阿里云下属的一个部门,所以,确切来说,我加入了阿里云。杭州是我家乡的省城,一向以风景优美著称,当时还算不上互联网技术人才聚集地,但我时有耳闻,很多前端工程师经常在杭州聚会,技术的氛围正在浓厚起来。

我在阿里巴巴工作了将近六年,主要分三个阶段:云OS(后更名为阿里YunOS)、集团安全部,以及飞猪和业务平台部。在云OS工作的两年间,正赶上云OS蓬勃发展的时期,从一个以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系统越来越先进,其生态粘性越来越强,再要建立一个对标的移动操作系统,可能性微乎其微了,除非某种特定的产业结构需求出现。

二、架构师之路

    0年,我的技术角色定为架构师可能是最合适的,虽然我自己最喜欢的称呼是系统程序员。架构师是一个泛称,在具体场景中,往往对应了一个规模或大或小的系统,可以是软件系统,也可以是软硬件结合的系统。比如一个应用软件,需要有一个架构师;一个操作系统,对应有一个架构师;一个业务模块,可能也有一个架构师。

随着互联网技术和业务的快速发展,架构师这一职业也跟着在互联网行业风生水起。我谈谈对软件架构师,特别是系统软件架构师的职责的理解。

  • 软件基本架构首先要合理,所谓合理,指采用当时相对成熟的软件技术来实现系统功能。

一方面,架构师要对相关的软件技术有足够的了解或精通,才能做好基础的选型工作;另一方面也要了解技术发展趋势,对软件架构的扩展能力和前瞻性有清晰的判断。现实中的绝大多数问题在业界都有一些参考方案,或者有一些成型的模式可供参考。

  • 对软件,特别是系统软件的性能,有充分的理解。性能包含多方面的指标,有关于资源使用方面的,譬如存储使用、网络带宽使用等,也包括异常情况下的表现、对大并发量的容忍、延迟等。在设计阶段有针对性能的预估,在系统上线后有对性能的监控,确保软件系统健康运行。
  • 稳定性,软件的质量保障是一个工程过程,在软件发布以前经过充分测试,包括功能测试和性能测试。软件升级迭代流程要充分考虑到兼容性要求,常见的做法是,先采用灰度发布再全量发布,并且系统具有回滚能力。
  • 成本控制和预测。高性能和稳定可靠(以及安全性)都是以成本为基础的。在技术选型、性能和稳定性保障方面所做的决策,都需要考虑到成本因素。成本是一个综合考虑,涉及到业务需求、商业价值、技术方案等多方面因素。

从软件工程师(或程序员)到成为合格的架构师需要技术积累,有足够广阔的知识面,更需要大系统经验的积累。大系统经验是难能可贵的,如果在客观的工作场景中找不到,也可以从剖析一些软件系统入手,来积累对复杂系统的认知和把控能力。

系统程序员在这方面有天然的优势,因为系统程序员往往精通底层工作原理,所以在系统性能、稳定性、安全性等方面能直接看到问题的本质。但是从系统程序员到架构师有一道坎,须放下对底层技术的执念,接受上层应用或中间件的各种妥协,包括一些不优雅或不精巧的习惯做法。

这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公里)。跑得不快,但能坚持下来。我希望自己的程序人生还能有至少两次续篇,写代码不一定多,但仍然保持跟代码的接触。

中国第一代程序员潘爱民的程序人生相关推荐

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

    作者 | 潘爱民 出品 | 程序员大本营 [编者按]搞技术是一件极其幸运的事情,不仅是我们迎来了最好的时代,亦在于我们的祖师爷大多还都健在甚至健谈,比如 Linux 之父 Linus Torvalds ...

  2. 中国第一代程序员简史:中国龙简晶的程序人生

    [CSDN编者按]本文的作者是CSDN的好朋友林兴陆,笔名小林.而文章的主人公则是18年前,CSDN的<程序员杂志>(2001年第五期)的封面人物简晶. 简晶的软件作品无论是广受好评的「中 ...

  3. 中国第一代程序员简史:中国龙简晶的程序人生 | CSDN 人物志

    [CSDN编者按]本文的作者是CSDN的好朋友林兴陆,笔名小林.而文章的主人公则是18年前,CSDN的<程序员杂志>(2001年第五期)的封面人物简晶. 简晶的软件作品无论是广受好评的「中 ...

  4. 中国第一代白手起家创业者联想柳总等格局,附联想国企变民企史(赞赏后公号回复“联想格局”下载PDF典藏资料)

    中国第一代白手起家创业者联想柳总等格局,附联想国企变民企史(赞赏后公号回复"联想格局"下载PDF典藏资料) 原创: 秦陇纪 科学Sciences 今天 科学Sciences导读:中 ...

  5. 【职业规划】第一篇:程序员分级之初级程序员

    程序员分级标准与需要的技能 首先声明下,Java程序员的分级并没有统一的标准,以下列举出来的只是我所理解的关于Java工程师的划分标准,不喜勿喷,如有建议,欢迎评论或私信. 我理解的Java程序员的分 ...

  6. 25岁程序员 VS 35岁程序员,太真实!

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 25岁程序员 VS 35岁程序员 其中的酸甜苦辣 你中了几条 经常有人说:35岁是程 ...

  7. IBM总架构师寇卫东:话说程序员的职业生涯-IT程序人生-职业生涯规划

    初级程序员和高级程序员时期,都属于职业生涯发展的第一阶段,我们可以称之为黄金时期.这阶段程序员的年龄在20~35岁之间,因为年轻,所以更善于学习,而且体力充沛,很多走过这个阶段的程序员有过通宵工作的经 ...

  8. 学习C语言的教材、如何成为一名优秀的C程序员、激发程序员创意的6本书、国外程序员推荐:每个程序员都应读的书

    学习C语言的教材 我的C语言是自学的,这些年看过不少教材. 下面,我对其中一些教材做个点评. 1. How to Think Like a Computer Scientist: C version ...

  9. 优秀的程序员和一般的程序员差别在哪?

    在我平时所见到的程序员中,如果纯以编码能力来看,个人觉得可以分为五类,依次是: 1.拷贝型 拷贝型选手就是传说中的"代码拷贝员"了,他们对实现功能几乎没有思路,所作的事情就是从网上 ...

  10. 总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告

    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告  走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的 ...

最新文章

  1. java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口
  2. 计算机视觉不可能凉!
  3. textview 垂直居中_在Textview左边或右边添加图标 ,换行不错位
  4. YZYZ菜鸟编程小助手
  5. WinsockExpert+NC抓包上传之拿WEBSHELL
  6. 【CV】一文讲懂图像处理中的低通、高通、带阻和带通滤波器
  7. Day11多态部分-6 【1.5 多态的好处和弊端】
  8. EPUB.js 解决图片裁剪问题(缩放问题)
  9. 人工智能与深度学习概念(3)——目标分类-CNN
  10. 解读制造业数字化转型的六大因素
  11. 文科生学大数据分析吃力吗
  12. 转转支付网关之注解式HTTP客户端
  13. word2013怎么去掉所有文字下面的波浪线
  14. LMG3422R030RQZR 600V GaN晶体管LMG3425R030RQZR电路图
  15. cannt connect to db!_分贝db以及在语音的用途
  16. CS:APP二进制炸弹phase5
  17. scikit-learn学习笔记-bili莫烦
  18. 对Socket CAN的理解(1)——【CAN总线原理】
  19. Outlook2010客户端—搜索/检索不到近期的邮件
  20. 【数据可视化应用】绘制词云图(附Python代码)

热门文章

  1. 阿里云负载均衡的配置和使用场景
  2. 【实用篇】Python操作word
  3. 「四年总结」一名程序猿的打怪升级之路
  4. Unity shader系列:好用的IDE--JetBrain Rider
  5. java 自动化报表_SpringMvc JDBC jQWidgets项目案例JasperReport自动化报表系统
  6. 知道这些网站,能让你的工作效率提高2000%!
  7. 2017-11-11 白银下跌简要分析
  8. 轻松使用中移物联网平台Onenet,MQTT协议快速接入实验,使用Onenet平台MQTT协议开发个人智能设备的解决方案
  9. Mac怎么切换主显示器 Mac设置主显示器
  10. 请选择要安装的mac os 磁盘