盖茨
程序员可以看看以前其他人是怎么做的,从其他项目获得改进自己程序的想法和经验。
我认为大多数优秀的程序员都希望周围有其他优秀的程序员。当他们想出了一个很好的算法时,他们希望周围有能够欣赏其绝妙之处的同事。因为你在构想那个算法、脑海中产生那样一个模型时,那是个寂寞的事情。如果你原来以为处理过程很复杂,但却找到一个办法,让过程变得很简单,那种感觉好极了。不过你需要从其他程序员那里得到一些反馈。如果已经有了几个优秀的程序员,就会吸引更多优秀的程序员。
采访者:你认为开发优秀的程序有什么特定规则吗?盖茨:有些人刚一进到项目中就开始坐下来编码,而有些人则在编码之前把所有的过程都想清楚,我认为你会发现那些一开始就坐下来编码的程序员只是在把那些代码当做草稿使用。那些在他们头脑中思考的内容才是最重要的。
采访者:经过多年的经验积累后,编程是否一定会更容易呢?盖茨:不,我认为在过了最初的三四年后,就会非常明显地显现出你是否是一个优秀的程序员。刚开始的几年中,你可能会更多地知道怎样去管理大型项目和不同个性的人了。在微软没有哪个程序员是在平庸了几年之后突然间一鸣惊人的。我和一个人谈谈他的程序,马上就能知道他是否是个好程序员。如果他真的很棒,每个细节他都会脱口而出。就像下棋的人一样。如果你特别喜欢下棋,会很容易记住10盘棋中的每一步,因为你已置身其中了。其他人看到国际象棋选手或程序员能记住每个细节时,觉得他们像个怪物。其实这很正常。即使到了今天,在我写了微软的BASIC程序10年后,我仍可以在黑板上大段大段写出当时的源代码。
编程需要非常大量的精力,所以大多数程序员都比较年轻。这就会带来一个问题,因为编程需要很多的训练。在年轻时,目标不是很持久,可能会被这样那样的事分心。但是年轻的程序员应当坚持下去,他们会变得更出色。
佩奇
佩奇:你必须了解客户,了解计算机,为客户和计算机设计出最优秀的产品,除此之外,就没有什么基本原则了。你必须了解客户,知道他们想要什么。这样才能为他们设计出合适的产品。产品可能是一个很简单的程序,比如PFS:FILE,也可能是一个极其复杂的程序,比如编译器。前者是为普通用户设计的,后者是为程序员或工程师设计的。我不会容忍一个软件工程师只想做复杂的程序设计。首先,我认为这样的态度不够成熟。一个好的建筑师不管是设计一个小凉亭还是设计一个大博物馆,都能从中得到快乐,它们各有各的挑战。 第二,我认为真正的挑战是如何设计出一个外表简单而内部复杂的软件。我对那些不喜欢这种挑战的人感到困惑,因为这种挑战对我来说非常有趣。
莱特莱夫
采访者:你能不能再详细说说这种平衡和优雅的感觉?莱特莱夫:平衡有很多种形式。代码应当干脆精炼。你应当可以用一句话解释任何一个模块。如果可能,内容应当按字母顺序排列。仅从视觉角度讲,代码不应当在任何地方掉出打印纸的边缘。不应当有一个很大的“if”,而“else”却很小。一切东西在任何地方都应当平衡。平衡是这里的关键字。
我写程序总是力争把代码写得稳固、清晰、干净,哪怕是需要额外多写五行。 我一般认为,你需要写的注释越多,你的程序就越糟糕,肯定是哪里出了什么问题了。好的程序并不需要很多的注释。程序本身就应该是注释。
弗兰克斯顿
采访者:即使这样,目前大部分编程工作还是由一小部分人完成的。是什么因素决定一个人能成为一名优秀的程序员,而不是众多用户中的一员?弗兰克斯顿:什么因素使人在某一方面出类拔萃?是什么因素让人成为优秀的作家?优秀的人一般需要满足两个因素:正好具备这个知识领域所需要的心智,并且在能力上又不是太愚钝。这样的组合很罕见,但并非不可思议。
采访者:你在程序中会写很多注释吗?弗兰克斯顿:那要看我觉得代码是否易于理解。**程序语言越高级,我写的注释就越少。**我尽力编写可读性好的代码。在编程语言中,我只使用有意义的常规用语,如果我觉得一段代码不是很容易读懂,就会写上注释。
采访者:你对年轻程序员的忠告是什么?弗兰克斯顿:总的来说,不要以为你知道所有的东西,要尝试学习并质疑那些假定的东西。要信心十足,但要保持谦虚,要猜想你可能做错了什么。要有刚好够多的罪恶感——不要太多,不然就会害怕去做任何事情——但要足以建立美感。尝试去做更深刻的理解。不要因为你曾使它运行成功了,就以为再也没有什么需要去了解的了。
采访者:是什么让人成为好的程序员?关键是天赋还是培训?萨奇:是天赋、气质、动机和努力工作的结合。我知道有很多人期望在很短的时间就成为一名好的程序员,但能成功做到这一点的人并不多。成功来自一遍又一遍地做同样的事情,每一次学习一点点,下一次都做得更好一点。
萨奇
有些人很擅长优化每一步指令。他们可以让一小段代码变得极为紧凑。而另一些人只注重算法和实现过程。我介于这两者之间。我不是很擅长非常紧凑地压缩代码。多年前我就发现,如果那样编程的话,每次需要修改代码时,都必须拆开整个程序并重写一遍。但如果稍退一步,只在非常重要的几个点上让代码非常紧凑,那么程序在完成后就容易维护得多了。
奥奇
采访者:你对现在的年轻程序员有什么建议?奥奇:如果你是硬被拉入编程这一行的,我建议你保持乐观的心态,尽量多编程,同时尽可能参加各种不同的项目。尽可能多把时间花在计算机上,还要学会准确判断自己的职业倦怠状况(burnoutlevel)。要是别人觉得你很古怪,不用放在心上。
罗伊森
采访者:你可不可以描述一下你是怎么编程的?罗伊森:我是个非常“自底向上”的程序员。我不为整体战略伤脑筋,因为除非完成了所有细节,否则我从来看不清全貌。如果你想要把工作交给其他人做,“自顶向下”的编程自然很好——很显然,你需要了解各个部件是如何在一起工作的。对我而言,编程是一个反复迭代的过程。我总是一次做一个程序的一小部分。如果我在一个地方改动一下代码,就很可能需要在其他地方也动一下。我会这样上下调整,直至方案合适为止。我也非常实际。我见过很多不实际的聪明人,他们在追逐一些完全无用的学术目标时迷失了方向。实际对编程很重要。你必须能够猜出完成一个项目的准确时间,具有推断可以做哪些、不可以做哪些的能力,然后据此去做,抵制中途停下来干其他事情的诱惑。当你想做好每一件工作时,实际一些尤为重要,毕竟你可以分配在每件工作上的时间很有限。如果你想把一个项目做到尽善尽美,往往轻易就会多花上两倍的时间。可东西如果没完成的话,就不会卖得好。没有可销售的产品,你就很难维持生计。
采访者:你写的源代码采用特殊风格吗?罗伊森:我想每个人都有自己的风格。我的代码很散,里面有大块的留白。我总是让不同例程需要用到的函数彼此独立,来节约代码、提高速度。