查尔斯.西蒙尼

charles
charles

人物介绍

1948年9月10日,查尔斯·西蒙尼(Charles Simonyi)出生于匈牙利布达佩斯。上高中时,他开始接触计算机和编程,父亲安排他给一名从事计算机工作的工程师当助手,当时计算机在匈牙利屈指可数。

1966年,查尔斯高中毕业,同时也完成了他的第一个编译器。凭借开发编译器时积累的经验,他在丹麦哥本哈根的A/S Regnecentralen公司谋得了一个职位。

1968年,他离开丹麦进入美国加州大学伯克利分校学习,并于1972年获得理学学士学位,1977年获得斯坦福大学博士学位。

西蒙尼曾先后在加州大学伯克利分校计算机中心、伯克利计算机公司、ILLIAC 4项目和施乐PA R C工作。自1981年以来,他一直供职于微软公司。在施乐公司,他开发了Alto个人电脑的Bravo和Bravo X程序。在微软,他组建了应用软件小组,并领导开发出Multiplan、Microsoft Word、Microsoft Excel等广受欢迎的应用软件。

编程的步骤

编程的第一步是想象。就是要在脑海中对来龙去脉有极为清晰的把握。在这个初始阶段,我会使用纸和铅笔。我只是信手涂鸦,并不写代码。我也许会画些方框或箭头,但基本上只是涂鸦,因为真正的想法在我脑海里。我喜欢想象那些有待维护的结构,那些结构代表着我想编码的真实世界。一旦这个结构考虑得相当严谨和明确,我便开始写代码。我会坐到终端前,或者换在以前的话,就会拿张白纸,开始写代码。这相当容易。我只要把头脑中的想法变换成代码写下来,我知道结果应该是什么样的。大部分代码会水到渠成,不过我维护的那些数据结构才是关键。我会先想好数据结构,并在整个编码过程中将它们牢记于心。

团队大小

让多名程序员开发一个程序,开发速度会更快吗? 不一定。编写同一个程序的人员越多,人均产出的实际代码量越少。结果,总的代码产出一开始会更多,之后实际上可能会减少。以两个人为例,也许单位时间只能多写百分之五十的代码。

顺便提一下,代码的效率还会随着开发同一个程序的人员数量的增加而有所降低。最高效的程序往往是一个人写的。唯一的问题是,它可能需要写上一辈子,而这显然是无法接受的。因此你需要找上三五十个,甚或好几百个人开发一个项目

巴特勒.兰普森

butterler
butterler

人物介绍

巴特勒·兰普森(Butler Lampson),目前在加州帕洛阿尔托数字设备公司(Digital Equipment Corporation,下文简称DEC①公司)系统研究中心担任高级工程师,他曾是加州大学伯克利分校计算机科学副教授、伯克利计算机公司创始人、施乐PA R C计算机科学实验室的高级研究员。

兰普森是业界最受敬重的专家之一,在许多计算机设计和研究领域都颇有建树。他开发过硬件系统,如以太网局域网和Alto、Dorado个人电脑;操作系统,如SDS 940和Alto;编程语言,如LISP和Mesa;应用程序,如Bravo编辑器和Star办公系统;还有网络服务器,如Dover打印机和Grapevine邮件系统。

物理、数学和计算机科学的联系

就物理学和数学而言,一如其他正统的学科,要想有所成就,必须能够清晰地思考。这就是计算机行业的许多成功人士都来自这些领域的原因所在。而现在人们通常一直待在计算机系,要有所成就会更加困难,因为这是一门非常浅显的学科,无法驱使你全力发挥出自己的聪明才智。

通过数学,你学会逻辑推理。你还会学到如何证明,以及怎么处理抽象要素。通过物理学等实验科学或人文学科,你学会如何应用这些抽象在现实中建立联系。

复杂性与简单性

一切都应该尽可能简单。但要做到这一点你必须掌握复杂性。

控制复杂性有一些基本技巧。从根本上,我会分而治之,把事情分解开,并准确描述各个部分应该实现什么功能。这会变成接下来如何行事的纲要。如果你还没想清楚怎么写规格,那表明你不明白具体是怎么回事。接着,你有两种选择:要么退回到你真正理解的另外某个问题上,要么更努力地思考。

此外,系统的描述不应该太庞大。也许你必须从多个较小部分的角度来考虑一个大系统。这有点像解数学题:你写的书可以包含许多有用的提示,但不能直接给出算法

约翰.沃诺克

john
john

人物介绍

约翰·沃诺克(John Warnock)出生于1940年,在犹他州长大,就读于犹他大学,并获得了数学学士和硕士学位,以及计算机科学博士学位。 沃诺克担任Adobe公司的CEO,除了Adobe公司,沃诺克还曾担任Ebrary、MongoNet、Knight-Ridder、Netscape等公司董事,目前仍然是Salon媒体集团董事会主席。他亦曾是圣何塞市创新科技馆的主席,目前还在美国电影协会和圣丹斯协会担任理事。

编程的诀窍

不要早作绑定,尽可能推迟决定时间。眼界放宽一些,设计要比你自认为需要的程度更加灵活,因为从长远看你最终会需要这样。快速让某样东西工作起来,然后还能弃之不用。

从小的开始实验而不是大的入手学习。不要一头扎进周期长达两年且中间不出什么成果的开发当中。最好每两个月就要出点成果,这样你才能进行评估、重组和重新开始。

程序员经常在一开始时过度定义他们的方法。他们可能会从一个中心构思着手,从第一天就开始编码。然后他们发现自己陷入重围,每件东西都开始膨胀,因为它们依赖于太多其他因素。应当反其道而行之,如果让过程较为宽松,保持一定的自由度,并在最后阶段加快速度,长远来说,你会做出更好的产品。

加里.基尔戴尔

gary
gary

人物介绍

作为数字化研究所(DRI)的创始人和董事会主席,加里·A. 基尔代尔(Gary A. Kildall)于1972年到1973年间开发了第一个微机操作系统。他把那个系统称为CP/M(控制程序/监控程序)操作系统,后来成为他们公司的第一款产品。此外,他为IBM个人计算机设计了DR Logo编程语言,并开发出微机上最早的高级计算机语言之一,PL/1。

基尔代尔是西雅图人,生于1942年5月19日。他于1972年获得华盛顿大学计算机科学博士学位,随后加入了海军,并且执教于加利福尼亚州蒙特雷的美国海军研究生院,讲授计算机科学。从海军退役后他仍旧在那里继续执教。

基尔代尔于1984年创建了一家名为Activenture的新公司(最近已更名为KnowledgeSet公司),以探索光盘出版业的潜力。Activenture公司于1985年宣布,他们将出版光盘版的《格罗利尔多媒体百科全书》。基尔代尔在担任KnowledgeSet公司总裁的同时,仍旧担任着数字化研究所董事会主席一职。

编程风格

我遵循非常明确的、适合自己的流程,虽然这些流程可能并不适合别人。我会先画数据结构,然后花很长时间思考数据结构。在开始编程前,我会一直思考整个程序的流程。

在确定数据结构之后,我就开始写一些小段的代码,并不断地改善和监测。在编码过程中进行测试可以确保所做的修改是局部的,并且如果有什么问题的话,能够马上发现。整个迭代改进的过程是需要速度的,至少对我来说,一个快速的编辑、执行和调试周期是非常重要的。

编程是否可以练习

嗯,在某种意义上是可以练习的。计算机语言(标识语)的发明家西摩·佩伯特(Seymour Papert)认为孩子们可以通过摆弄齿轮等机械小玩意而变得具有创造性。通过这种玩耍而学习和练习的技能会转移到其他领域。佩伯特的观点正是我童年的经历。我父亲是一名技艺精湛的工匠。我常常待在旁边看他干活,一看就是好几个小时,然后跑到外面,拿起锤子和钉子模仿他。

作为编程基础的数据结构,从本质上看是机械的,就像我儿时玩的东西。所以,在这个意义上讲,我是可以练习编程的。最大的不同是,木制或铁制的东西需要花好几个小时来建造,如果做得不正确,必须回去重新做。而程序可以在瞬间完成修改。

程序员积累本领的方式

你需要学习其他人的工作。他们解决问题的方法和他们使用的工具会让你以一个新的视角来审视自己的工作。在写程序前只需要学习一组为数不多的程序模块。例如,要写编译器,首先要写的是扫描功能,那是一个会用到很多次的小工具。一旦学会了这些工具,剩下的工作就只是把它们组合在一起。这里弄点儿、那里弄点儿,把这些功能模块都放到一起。查看其他人编写的程序可以为你提供构建条理清晰的代码的新思路。这就是为什么作为一个老师,我会花很多时间和学生们在一起,向他们展示我搜罗来的清晰算法模块的原因。

程序员的工作节奏

我的步调在程序开发的各个阶段是不同的。在某些时候,代码如泉涌一般,所有的东西都同时出现在脑海中:所有的变量名,变量之间的相互联系,指针从哪里开始、在哪里结束,磁盘的访问等。各种各样的事情都浮现在脑海里,因为我不停地修改自己的想法,所以没有办法写在纸上。我花在设计上的时间比花在编码上的时间多,而且我从来没有在合理的时间内完成过一个项目。

当数据结构还在雏形时,需要高度集中注意力,让它们在脑海中成形。在这个阶段我通常会在早上3点开始工作,一直干到大约下午6点,然后吃晚饭,早一点上床睡觉,再很早地起床,不断推敲构思,直到数据结构定下来。

在平静的时候,我的工作节奏会放松一些,我会提出下一阶段的解决方案。我会有步骤地去解决问题,先把问题排好次序,然后一次一个步骤地去解决——步骤A,步骤B,然后步骤C。我试过了,除非把步骤B做完,否则就无法做步骤C。

比尔.盖茨

bill
bill

人物介绍

作为微软的CEO,威廉·H. 比尔·盖茨(William H. Bill Gates)被认为是当今个人计算领域和办公自动化行业一个强有力的推动者。比尔·盖茨从年轻时就开始了计算机软件的职业生涯。当盖茨和微软的联合创始人保罗·艾伦还在华盛顿州的西雅图上高中时,两人就开始做起了编程顾问的工作。1974年,盖茨在哈佛大学读本科时,他与艾伦合作为第一台商用微型计算机MITS Altair开发了一套BASIC编程语言。在那个项目顺利完成后,两人创办了微软公司,为新兴的微机市场开发并销售软件。

编程中最困难的部分

最困难的部分是确定采用什么算法,然后还要尽可能地简化算法。做到最简单的形式是很难的。必须在心中模拟程序是如何工作的,必须完全了解程序各部分是如何一起工作的。最好的软件是其中有一个程序员完全了解程序的工作方式。要做到这一点,必须要特别热爱编程,集中精力让程序变得极为简洁。

团队管理

建立小型的项目团队,通常是四五个人一组,其中一个人经证实有能力掌控整个程序。如果这个项目带头人遇到不确定的事情,他会与经验更为丰富的程序员一起讨论。

我们的部分策略是让所有程序员在进入编码阶段之前都先想清楚每一件事情。编写程序设计文档是至关重要的,因为在把问题当做算法看的时候,问题会得到很大的简化。可以说算法是最简单的形式,从中可以看出问题在什么地方是重叠的。

另一个重要因素是代码复查,要确保代码是看过的,看看资深人士是否能提出如何做得更好的建议。而且你必须参考类似的、做得特别特别好的项目。程序员可以看看以前其他人是怎么做的,从其他项目获得改进自己程序的想法和经验。

开发优秀程序

有些人刚一进到项目中就开始坐下来编码,而有些人则在编码之前把所有的过程都想清楚,我认为你会发现那些一开始就坐下来编码的程序员只是在把那些代码当做草稿使用。那些在他们头脑中思考的内容才是最重要的。

你必须得有非常聪明的程序员。一个优秀的程序员会一直不断地思考所开发的程序,无论是开车还是吃饭。不停地思考问题,需要耗费大量的脑力。

编程风格

我喜欢在坐下来编写代码之前先把整个设计方案构想清楚。而在完成代码后,我喜欢回去把它从头到尾再全部重写一遍。

编写程序最重要的部分是设计数据结构。接下来重要的部分是分解各种代码块。在开发到那一步并写出代码之前,你无法敏锐地感知那些公共子例程应该是什么样的。

我所写过的真正优秀的程序都是在开始动手编程前已经花了大量时间去思考的。我在高中时为一台小型机编写了一个BASIC解释程序。我在那个程序中犯了很多错误,后来我得到机会,看到了一些其他的BASIC解释程序。这样当我在1975年坐下来编写微软的BASIC解释程序时,问题已经不在于是否能写出程序来,而在于能不能把程序压缩到4K,并得到非常快的运行速度。整个过程中我都在紧张地思考:“ 速度够快了吗?其他人会做得更快吗?”

速度与性能如何权衡

有时候是需要在添加功能和快速运行之间进行权衡的,但也有其他办法,即使增加很多很多功能,速度也照样快。一般来说,你要确定程序中最常见的情况是什么,并要确保它们运行通畅,不会陷入到那些特殊情况的检查中。因为如果在主要的交互循环流程中有各种各样的检查,程序就会比别人的慢。

编程经验的积累

我认为在过了最初的三四年后,就会非常明显地显现出你是否是一个优秀的程序员。刚开始的几年中,你可能会更多地知道怎样去管理大型项目和不同个性的人,但在三四年后,就能很清楚地看出你会成为什么样的程序员了。在微软没有哪个程序员是在平庸了几年之后突然间一鸣惊人的。我和一个人谈谈他的程序,马上就能知道他是否是个好程序员。如果他真的很棒,每个细节他都会脱口而出。

成为一名程序员的最佳途径

成为程序员的最佳途径是编写程序并研究其他人编写的优秀程序。我自己以前就是去翻计算机科学中心的垃圾桶,找出他们的操作系统的程序清单。

你要愿意去看别人写的代码,然后写自己的代码,再让其他人复查你的代码。你需要身处这个不可思议的反馈循环当中,让世界级的专家告诉你,你做错了什么。你不能让一些小小的个人习性阻碍你获得这些反馈信息。有些世界级的专家会在一些纯属个人偏好的细节上喋喋不休,比如说该怎样注释程序。你必须跳过所有这些东西,因为在某种程度上,他们是试图以自己的形象来塑造程序员,并试图让你按他们的方法行事。而这些可能并没涉及程序的纯质量问题。

如果和一个优秀的程序员聊一聊,你会发现他对他使用的工具非常熟悉,就像一个画家了解他的画具一样。优秀程序员们开发程序的方式都有很多共同之处,这点令人惊奇——他们得到反馈的方式,以及他们是如何精准地进行规范的,哪些是草率成就的,哪些是认真完成的。当你请这些人来看一些代码时,你会发现他们的反应通常是非常非常一致的。