我们能够从C语言的创造者身上学到什么东西?

fmms 12年前
     <div style="text-align:center;">               <img title="我们能够从C语言的创造者身上学到什么东西?" border="0" alt="我们能够从C语言的创造者身上学到什么东西?" src="https://simg.open-open.com/show/975a6f7ab3f7b27453bbb2632fbe0251.jpg" width="248" height="287" />     <br />    </div>     UNIX 的奠基者之一、C语言的创建者,丹尼斯·里奇(Dennis Ritchie)上周去世了。尽管我感觉计算机科学和相关领域的许多人都了解里奇的重要性—一切与计算有关的东西,其成长和发展都跟里奇息息相关,但是我认为,回顾他的成就,把他高高放进    <a href="/misc/goto?guid=4958195001654785184" rel="external nofollow" target="_blank">Lovelace</a> 和    <a href="/misc/goto?guid=4958195002403019338" rel="external nofollow" target="_blank">图灵</a>以及最近去世的乔布斯(尽管这一说法会引起争议,但起码等到历史有公论再说吧)早已入住的计算机科学先贤祠上会更有价值。    <p> UNIX 是最早的多用户操作系统之一,它使得科学家和研究人员得以分享计算机的时间,而这种设备在传统上是以批处理的方式操作的。多用户及多任务的概念之所以会引起研究人员极大的兴趣,仅仅是因为批处理程序所需的编写、运行以及收到输出所需的时间。而在批处理模式下,计算机的时间是非常昂贵的,从这里的一则奇闻轶事中可见一斑:</p>    <blockquote>     <p>1969年,在仔细考虑了操作系统的问题之后,汤普森(Ken·Thompson,Unix 创造者之一)利用闲暇时间开发出一个名为“太空旅行”的计算机游戏。该游戏模拟了太阳系行星的运动。玩家可以在行星之间漫游,享受其中的风景,甚至让飞船登陆到行星和月球上。</p>     <p>起初的时候,这款游戏是在 <a href="/misc/goto?guid=4958195003139198167" rel="external nofollow" target="_blank">Multics</a> 上面写出来的,然后再被编译成了 <a href="/misc/goto?guid=4958195003876399178" rel="external nofollow" target="_blank">Fortran</a> 语言,在一台加载 GECOS 操作系统的 GE 635 计算机上面跑。但是游戏的显示很不稳定,也很难控制,因为玩家必须输入命令来控制飞船。还有,在这台庞大的 GE 635 机器上,其所占用的 CPU 时间需要花费掉75美元,这样的成本是难以承受的。</p>    </blockquote>    <p> 玩一次游戏要花掉75美元,尤其是按照上世纪六十年代的货币水平,对于一名黑客来说,从中就几乎找不到丝毫的乐趣了。里奇和汤普森于是一起开发出了 UNIX,让它成为黑客的乐园,在那里可以对小程序进行测试并分享其结果。他是一位专业的物理学家和数学家,但却在一个恰当的时间进入到了大型机和微型计算机的混沌初期世界里。上世纪六七十年代正是计算与世界的交互发生巨变之时。然而当时的普遍看法是“这些该死的计算机快要把我的电话账单给搞砸了”,事实上,计算机破坏了当时的现状。短短几年的时间里,纸面记录的地盘慢慢地被计算、电话交换机所侵蚀,从忙乱、蒸汽朋克的八爪章鱼慢慢变成准机械式的由路由器和终端构成的系统。贝尔实验室活跃在最前沿,承担着用铜线连接世界的任务。最重要的是,他所做的事情是非常困难的,这种困难,在今天用拖拽和自动完成功能的 IDE 搞开发的我们已经遗忘了。</p>    <p> UNIX 的关键是共享概念。该操作系统始于1969年,是对贝尔实验室关闭了汤姆森和里奇都非常喜欢的操作系统 Multics 做出的反应。在包括 MIT 在内的多个组织的配合下,新泽西贝尔实验室的4人程序员组在一台疏于管理的 PDP-7机器上开始了工作,他们在这台机器上移植了太空旅行,然后为了保存游戏又建立了一个文件系统。慢慢地,围绕着这一文件系统,一个对现代 Linux 熟悉的人都能够理解的命令结构就增生成形了。UNIX 这个词慢慢地就从一小撮原始用户嘴里点点滴滴地透露了出来,1971年的时候,贝尔实验室专利申请办公室开始用它来排版文档,以便用 nroff(将文本文件格式化为打印机所需要的格式的 UNIX 命令)来打印。</p>    <p> 李纳斯·托沃兹(Linus Torvalds,LINUX 创造者)是在1969年出生的,注意到这一点也很重要,这让他成为从所谓的 UNIX 时代获得好处的主要候选者。<strong>出生自一个新行业骚动喧嚣的时代很重要</strong>,盖茨、托沃兹,还有里奇都是极佳的证明。</p>    <p> 里奇继续做出了若干其他的改进,并在开发这款C写成的操作系统时,为世界提供了首份多机器、交叉兼容的编码标准,这份标准让任何一个人,从白发苍苍的机器语言老手,到赫尔辛基的年轻学生,都能够理解和使用。即便 AT&T拒绝提供给教育机构,但是此后 UNIX 源码还是像圣经一样从一位程序员之手传到了另一位程序员之手。这份源码是用C语言编写的,为了节省时间和周期,更重要的是,为了里奇和汤普森在思想交流中孜孜不倦的教诲—保持优雅,其中的部分核心组件则是由机器语言完成。没有一个人,甚至包括里奇本人在内,能够理解那头野兽的复杂性,最后它成为了 UNIX,设计如此。其目标是,简单在前,复杂性在后,这是一个搞计算的人都能很好地效仿的模式。</p>    <p> 实现清晰和优雅的美好理想,这种渴求也很重要。“在编码技巧上,随着更好或更多的基本观念的出现,同辈的压力和简单的荣耀使得代码块被重写或丢弃”,UNIX 团队成员之一的 Doug McIlroy 写道:“同业相争和保护地盘几乎是闻所未闻:出现了那么多的好东西,以至于没有人需要对创新申请专利”。</p>    <p> 问题是,在开发我们自己的产品时,我们能够从这位计算机界的巨人身上学到些什么东西呢?<strong>首先,里奇和汤普森想要获得乐趣。</strong>他们没有要去赚钱的原生动力,实际上,他们的目标是省钱,或者起码是把自己的游戏藏起来到一台成本低一点的机器上。</p>    <p> <strong>其次是走出你的舒适区进行工作的必要性。</strong>里奇是一位物理学家和数学家。然而,他成为了一名程序员。尽管很显然,正如 Bjarne Stroustrup(C++之父)所述,他的背景在做出 UNIX 和C的过程中给予了他极大的帮助,里奇并不惧怕在新的、不熟悉的领域中进行尝试。“如果丹尼斯那十年决定把时间花在晦涩的数学上,Unix 也许就胎死腹中了”,他写道。</p>    <p> <strong>第三是对于创新无为而治的重要性。</strong>里奇是幸运的,贝尔实验室有钱也有人,让他可以躲在朋友的阴影背后,根据自己的时间安排做自己想做的东西。Google 似乎已经学会了这一招,与此有异曲同工之妙,他们20%的项目是内部试验项目,加上其实验室产品,这些都会慢慢地演变成为主流工具。Google 创始人几乎在该公司成立之初就允许这20%的存在,可谓是汤姆森和里奇方法论的见证。有工头在监视住的时候,大家做的都是些中庸的东西,等工头离开之后,大家就用自己的设备做出杰作来。</p>    <p> <strong>最后,分享也很重要。</strong>一些小型的初创企业把自己的产品严严实实地藏在 NDA(禁止披露协议)之后,或者,有一些创业家对网络错误地过分热情,每每看到这些都会让我忍俊不禁。出现这种情况,很显然说明他们的想法不够新颖,也不会特别成功,其态度也不会有利于成长。我要说的是,许多最近成功的创业家并不成功,因为他们说得天花乱坠,因为他们只会玩一种花样。</p>    <p> 可以说,当今世界上最重要的软件项目 Linux 之所以重要,是因为其极佳的广泛性和开放性。有一些人说开放不是利润的同义词,不过这些人往好处说属于悲观主义者,往坏处说简直就是蠢蛋。</p>    <p> 最后,里奇教育我们,计算机界并不是一个秘密社团,需要长年服务和特别的咒语才能够加入。他对知识的慷慨解囊显而易见,在我们网上做的所有事情上都有体现,尽管他的害羞是出了名的,而他却仍然充当一名讲解员,给我们留下了海量的注释和在线说明。尽管我们当中没有人能够取得他和 Bell/AT&T团队那样的成就,尤其是考虑到他们当时的环境,所处的相对是信息时代起源的时间背景,现在取得不了那样的成就也没关系。毕竟,正如我们这些年来从 UNIX 源码所学到的东西那样:</p>    <p> <em>*你不需要去理解它。</em></p>    <p> 只需在它上面做就行了。<br />       <br />        来自: <a id="link_source2" href="/misc/goto?guid=4958195004625962054" target="_blank">www.36kr.com</a></p>    <p> Via:<a href="/misc/goto?guid=4958193870947750185" rel="external nofollow" target="_blank">TC</a></p>