大家好,感谢收听【程序员·随身听】。
这一期我们继续说《黑客与画家》。
第二章 黑客与画家
作者试图通过这个话题,来解释黑客更像画家,而不是所谓的计算机科学的工作者。作者首先解释他这么说的原因,然后讲如果黑客把自己当做计算机科学家,会引起什么误会,走什么样的弯路,接着讲了,如果向画家这一职业类比,会得到什么灵感,最后讲了自己的一些感想。
下面我就讲讲作者在这篇文章中的主要内容。
读完计算机系的研究生,作者去了艺术学校,学习绘画。许多人很吃惊,一个喜欢计算机的人,居然还喜欢画画!他们似乎觉得,摆弄计算机和画画是两件截然不同的事情--计算机是冰冷的、精确的、井然有序的,而画画是某种原始欲望热烈狂放的表达方式。
这种看法是错的。计算机和画画有许多共同之处。事实上,在我知道的所有行业中,黑客与画家最像。
黑客与画家的共同之处,在于他们都是创作者。与作曲家、建筑师、作家一样,黑客与画家都是试图创作出优秀的作品。他们本质上都不是在做研究,虽然在创作过程中,他们可能会发现一些新技术。
我一直不喜欢“计算机科学”(computer science)这个词。主要原因是根本不存在这种东西。计算机科学就像一个大杂烩,由于某些历史意外,很多不相干的领域被强行拼装在一起。这个学科的一端是纯粹的数学家,他们自称是“计算机科学家”,只是为了得到国防部研究局(DARPA)的项目资助。中间是计算机博物学家,研究各种专门性的题目,比如网络数据的路由算法。另一端则是黑客,只想写出有趣的软件,对于他们来说,计算机只是一种表达的媒介,就像建筑师手里的混凝土,或者画家手里的颜料。所以,在“计算机科学”的名下,数学家,物理学家和建筑师不得不待在同一个系里。
(有时,黑客做的事情被称为“软件工程”(software engineering,但是这个词也是误导的。与其说优秀的软件设计师是工程师,还不如说是建筑师(建筑师和架构师是同一个词,architect,建筑学和架构学也是,architecture)。建筑学和工程学之间的区别并不是很严格,但就是存在区别,建筑师决定做什么,工程师想出怎么做。
当然,做什么和怎么做不应该分得太开。如果你决定做一件事,却不知道怎么做,你就是在自找麻烦。但是,只是单纯地决定如何实现某种规格,那肯定不是黑客。黑客的最高境界是创造规格。虽然看起来,做到这一点的最好方法就是先做出一个样品把规格实现了。)
把不同类型的工作捆绑在一起,可能是为了行政管理的方便,但是却容易引起混淆。数学家看来并不在乎自己搞的是计算机还是数学,他们很高兴来到这个新地方,然后就开始埋头证明新的定理,与数学系的数学家干的事情完全一样。但对于黑客,“计算机科学”这个标签是一个麻烦。如果黑客的工作被称为科学,这会让他们感到自己应该做的像搞科学一样。所以,大学和实验室里的黑客,就不去做那些真正想做的事情(设计优美的软件),而是觉得自己应该写一些研究性的论文。
要是黑客写论文,最好的情况下,写出来的也只是一些补充性的描述,不会具有太大的实际价值。黑客先开发了一个很酷的软件,然后就写一篇论文,介绍这个软件,论文变成了软件成果的展示。优美的软件并不总是论文的合适题材。首先,科学研究必须具有原创性。其次,科学研究必须是能够产生大量成果的,而那些不成熟的、障碍重重的领域最容易写出许多篇论文。
但是,创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。
那么,为什么大学和实验室还把论文数量作为考核黑客工作的指标呢?这种事情其实在日常生活中普遍存在,比如,我们使用简单的标准化测试考核学生的学术能力倾向,再比如,我们使用代码行数考核程序员的工作效率。这样的考核容易实施,而容易实施的考核总是首先被采用。
唯一有效的外部考核是时间。经过岁月的洗礼,优美的东西生存发展的机会更大。不幸的是,这种考核需要的时间可能比一个人的生命还要长。
人们无法考核你的工作,甚至误解你的工作,都不是最糟的事。更大的危险是你自己也会误解自己的工作。如果你发现自己读的是计算机科学,你就会以为计算机科学和其他理论科学并无不同,你的工作属于理论计算机科学所涉及的那种理论的应用研究。读研究生期间,我潜意识里一直有一种很不舒服的感觉,觉得自己应该多学一点理论,不应该期末考试结束还不到三个星期,就把所有东西忘得一干二净。现在,我意识到自己错了。黑客搞懂计算理论的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”;如果你写一个解析器,可能还需要知道状态机的概念;除此以外,并不需要知道特别多的理论。
我发现,黑客新想法的最佳来源,并非那些名字里有计算机三个字的领域,而是来自于其他创作领域。与其到计算理论领域寻找创意,还不如在绘画中寻找创意。
举例来说,我在大学受到的教育是,在上机编程之前,应该先在纸上把程序搞清楚。可我一直不是这样编程,我喜欢直接坐在计算机前编程,而不是在纸上编程。更糟的是,我不是耐心地一步步写成整个程序,而是一股脑不管对错,先把代码堆上去,再慢慢修改。书上说,debugging是最后的步骤,可我的工作方法却像编程就是在调试。
很长一段时间,我都为此沮丧。就像小学老师教我怎么拿铅笔,我却总是学不会那种感觉。如果我那时看到其他创作领域,如绘画和建筑,我会想到自己的学习方法有一个正式名称:打草稿。
明白这一点对软件设计有重大影响。它意味着,编程语言首要的特性应该是允许动态扩展。编程语言是用来帮助你思考程序的,而不是用来表达你已经想好的程序。这也是我认识的黑客,没有一个喜欢用静态类型语言编程的原因。
创作者不同于科学家,明白这一点有很多好处。除了不用为静态类型烦恼外,还可以免去另一个折磨科学家的难题--对数学家的妒忌。科学界的每一个人,暗地里都相信数学家比自己聪明,我觉得,数学家也相信这一点。这会引诱你用数学的方式解决问题。如果黑客认识到自己与其他创作者是一类人,这种诱惑就不起作用。
如果大学和实验室不允许黑客做他们想做的事情,那么适合黑客的地方可能就是企业。不幸的是,大多数企业也不允许黑客做他们想做的事情。大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。在企业,“黑客”的工作就是用软件实现某个功能,而不是设计软件。在那里,程序员被当做技工,职责就是将产品经理的构想翻译成代码。
这似乎是普遍情况。大公司这样安排的原因是减少标准差。因为实际上只有很少一部分黑客懂得如何正确设计软件,管理层很难识别应该把设计软件的任务交给谁,因此,只能交给一个负责产品的委员会。不过,这是创业公司的优势所在。如果你的竞争优势在软件设计方面,并且你的对手是一家大公司,它大到由一群产品经理来设计软件,那么你的对手将无法赶上你。不过,说实话,这样的机会不容易找到,你很难单单依靠软件设计就与大公司展开竞争。真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。
所以,开发优秀软件的方法之一就是自己创业,但是,这样做会遇到两个问题。一个是自己开公司的话,必须处理许许多多与开发软件完全无关的事情。作者创业的时候,如果能有四分之一的时间做开发就感到幸运。另一个问题是,赚钱的软件往往不是好玩的软件,两者的重叠度不高。好比写小说的回报比不上写广告文案的回报。
那黑客如何才能做自己喜欢的事情?那就是找一份儿白天工作,一份为了赚钱的工作,然后还有一份儿爱好的工作。几乎所有创作者在职业生涯早期都有一份儿白天工作。
因为黑客更像创作者,而不是科学家,所以要了解黑客,不应该在科学家身上寻找启示,而是应该观察其他类型的创作者。那么,从画家身上,我们还能借鉴到什么对黑客的启示呢?
有一件事情是可以借鉴的,那就是应该如何学习编程。画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就自己动手写程序了。即使上了大学,黑客学习编程依然主要通过自己写程序。还有一个可以借鉴绘画的地方:一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。但是,它又不单纯是一个填入细节的过程。有时,原先的构想看来是错的,你就必须动手修改。无数古代油画放在X光下检视,就能看出修改的痕迹。黑客也应该这样工作。你不能期盼先有一个完美的规格设计,然后再动手编程。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。因而,过早优化和过早设计都是件危险的事情。
接下来作者说,
1、优秀的软件应该对美有狂热的追求。如果你查看优秀软件的内部,你会发现那些预料中没有人会看见的部分也是优美的。
2、普通黑客与优秀黑客一个重要区别是,会不会换位思考。不会换位思考,很难设计出优秀的软件。判断一个人是否具备换位思考的能力有一个好方法,就是看他怎样向没有技术背景的人解释技术问题。
3、眼下看来艺术家比黑客更酷,但是我们不应该忘记,古时候绘画蓬勃发展的黄金年代,画家也不是像今天这样酷的。现在正是编程的黄金年代,编程能有多酷,要看我们能够用编程做出怎样的工作,就像达·芬奇推动绘画成为一种伟大的表达方式。
这一期就讲到这里,感谢您的收听。
网友评论