工程师与黑客

之所以翻译这篇文章,是因长久以来笔者有感于工程师与黑客之间误解,有些黑客瞧不起工程师的死板,工程师则看不上黑客的傲气。事实上,在软件项目管理过程中,安全仅仅是软件测试阶段的一个测试环节。源于思维角度的不同和性格特征的使然,笔者相信,优秀的工程师同样也是不逊的黑客,优秀的黑客却未必是优秀的工程师,这正是工程师和黑客需要相互了解、学习之处,读过全文,或许你会对黑客、工程师、创业有新的认识和了解。
看待这个世界最简一单的方式是莫过于二元世界观,一个人可以放言“这个世界上只有两种人……”并将生活的细微之处看地异常简单。作为前言,我声明这个世界上的确有两种人:黑客和工程师。
艺术家和科学家 vs 黑客和画家
小的时候,父亲告诉我世界上有两种人:艺术家和科学家。他说,艺术家喜怒无常而且桀骜不驯,当他们想工作的时候就工作,想休息的时候就休息。科学家则是另外一种人:按部就班、恪守规矩。无论他们想或不想,都得完成手头工作。作为亚洲人,显然我就一个与艺术家形象背道而驰的例子,一个立志成为科学家的人。我应该像科学家一般的自律且有条理,这也正是我的成长历程,尽管我家里任何一个人都可以证明我是家中最不守规矩的一个。
六年前,我偶然拜读了保罗.格雷厄姆(Paul Graham)(译者注:以下简称保罗)的书————《黑客与画家》。正如书名所示,黑客和画家一章清晰地阐述了黑客与画家之间的关联。保罗在书中写到,黑客与画家的相似之处在于两者都是创造者(Maker),也正如画家一般,黑客有着缪斯女神(译者注:九位古希腊文艺女神)般的工作习性。
书中“良好的坏习惯”一章,保罗进一步阐述了什么是黑客。在他看来,黑客通常不服管教、桀骜不驯。这确是一件好事,因为创新和破旧都需要这样良好的坏习惯。
“喜怒无常”(工作习性)和“桀骜不驯”(不服管教)几乎便是我父亲所说的“艺术家形象”。在《黑客与画家》书中,这种比较显而易见,然而这却是我第一次看到有人将“艺术家形象”归类到好的一面,于是我决定我的确是要成为一名“黑客”。

连续性格特征
在六年里,我做了很多工作,也学了很多东西。如果六年前在我读过《黑客与画家》之后你问我,我会毫不犹豫告诉你谁是黑客,谁不是黑客。但是现在我发现我错了。
想象下有一个基于工作纪律性要求、严谨性要求不同而产生的连续性格。越往左边越趋向于艺术家性格,对应的工作要求相对也较为宽松,越往右边越趋向科学家/学者性格,对应的工作需要较高的严谨性。在中间区域,便是黑客和工程师。话说回来,这也可以被看作是艺术-科学工作的连续性。在我看来,这张图应该是这样的:

我在这里所说的严谨指的是学术严谨,没有暗含褒义或者贬义的意思。在学术领域,特别是科学领域,一个人的工作必须能够经得起同行严苛的推敲和审阅,也有很多客观的方法做这些严谨性验证。但对于艺术家而言则并非如此,借用保罗书中画家的例子,有很多主观的方式来确定什么是好画家,什么不是。我虽然搞不懂杰克逊.波洛克(Jackson Pollock)(译者注:美国画家)的作品,但有很多人懂。
客观性的工作和主观性的工作在我看来其不同在于严谨性。越是客观的工作,对于严谨性要求越高。严谨一词经常与其他的词产生关联,比如“标准”、“死板”和“官僚主义”。毕竟,“严谨(rigour)”和“死板(rigid)”有着相同的词根。
无论在何时,一个人的性格都可能处在上图连续性格特征中的任何一点。当你灵感突来的时候可能会创造一些新的东西,当你遇到烦心事时可能会坐下来琢磨这些烦心事,当你感觉不好也不坏,处在连续性格特征的中间区域时,你可能只是将事情做完,再无其他。

关于工程师
如今已经有很多文字来描述什么是黑客,但却没几个字说说什么是工程师。在某种程度上,是因为相比黑客,工程师是一个更为古老的称呼,或多或少都已经在人们心中定型,而且工程师通常是职业的称呼,而非性格特征的描述。在本文中,我会试图描述工程师的性格特征。
工程师就像黑客的同胞兄弟,它们有一些相同的特征,而其他方面则相去甚远。黑客藐视规则,而工程师热爱规则(或者至少喜欢创造规则)。对工程师而言,井然有序是件好事,而对黑客来说混乱不堪则是益事。工程师的工作以建立过程和事物为伊始,向着原创方向而努力,很像《黑客与画家》中所描述的科学家。黑客则以兴趣为导向进行工作,工程师则倾向于死记硬背。当然,工程师偶尔也会不修边幅。
工程师和黑客的相似之处在于都是创造并搞定事情。正如科学家能够完全沉浸在自己的研究当中一样,艺术家也会在自己的艺术创作中迷失自我。黑客和工程师都是能将事情做好的人,是的,两者的性格特征都倾向于吹毛求疵,总的说来,都是极力在直截了当地将问题彻底解决。
说到吹毛求疵,我相信在艺术家和科学家、黑客和工程师之间存在一些不同。艺术家和科学家通常沉浸在自我工作的深度上,黑客和工程师则倾向于吹毛求疵地迷失在自我工作的广度上。这是画家和黑客、科学家和工程师之间的显著不同。
像黑客一样,工程师也对细节斤斤计较。工程师对于细节的关注并非源于他们对于美的无尽追求,而是源于对正确性的自我要求,他们依赖已有知识体系和已知常识去创造事物。有些观点认为工程师仅仅是缺乏创造力的实践者,但我认为事实并非如此。
工程师和黑客也都是工匠和实验者,只不过他们以不同的方式来实践罢了。黑客是自由散漫的工匠,工程师则是组织有序的工匠。工程师相比黑客更愿意以更为有条理的方式来做事,因此也比爱冒险的黑客少了许多风险。
本质上工程师和黑客是一样的,唯一的不同在于他们做事的方法和动机。就我看来,知识水平决定了一个人会成为黑客还是成为工程师(译者注:知识水平越高的人越会成为工程师,因为他们知道的太多了)。

关于严谨性
最初的黑客其实是科学家,作为几个世纪前便已存在的职业,科学家到二十世纪时已变地相当无组织无纪律。个人(自我)实验司空见惯,很多畅销小说中都会提到这么一段疯狂的科学家情节。
我曾经痴迷地读过这么一本书————《豚鼠科学家》,这是一本通俗易懂且容易找到的书。在书中,作者回顾了那些热衷做个人实验的著名科学家。在我记忆中印象最深的是霍尔丹(JBS Haldane)(译者注:遗传学家和进化生物学家),部分原因是他是一名众所周知的科学家,他的作品之前我之前也读过。霍尔丹的个人实验很有名,以至于因为实验造成失聪,背脊也受了伤。
要是霍尔丹是名电脑程序员,可能他会用所有调试方式来编写程序来调试错误,简而言之,就是黑客。
严谨性要求在科学领域出现的较晚。随着越来越多的信息开始在科学家们各自研究的领域传播和分享,各种框架或约定也越来越被科学家们所需要。毕竟,如果两个化学家就实验的目的,工作流程等不能达成一致,那还搞个毛飞机呢?很快,适当的严谨性框架/约定在科学界被确定下来,比如如果要做科学家,你就必须得会做假设检验。
我相信这样的事情也发生在计算机科学及其工业领域。随着计算机工业成熟化,它也变得越来越严谨。戴夫.盖尔普林(Dave Gelperin)在1988年写了一篇文章叫《软件测试的发展》,在该文中,戴夫和他的合作者指出软件开发已经从面向调试开发发展到面向规范开发(软件必须满足规范)、面向毁灭开发(目的是寻找错误),面向评估开发(能够测试软件质量)、面向防范开发(检测和阻止错误发生)。
今天我们可以找到很多严谨的软件测试方法——从BDD到TDD,我敢打赌这只会更加稳固软件严谨性的发展,就像假设检验是科学界严谨方式的中坚力量一般。

关于黑客
黑客在哪里?黑客无所不在。不同于将黑客和工程师看作一成不变的性格特性,我更愿意认为黑客或工程师像是人们所戴的帽子————创造者尤其如此。黑客与工程师的不同在于在给定的时间、地点和情形下其本人是什么样的人。
在《黑客与画家》中,保罗反对将计算机科学当作科学来对待。他写到,黑客只想做黑客所做的事情,而不是写论文。基本上,我认可他的想法,在领域/职业心理层面,这是很重要的。作程序员的人并不妨碍他成为一名黑客,当然也不妨碍他成为诺贝尔物理学奖获得者。
正如前文中所提到的,黑客的特性是破旧,拒绝约定俗成的举动往往会引起重大革新/突破。
李纳斯.托沃兹(Linux Torvalds)反感所有常规的软件创造过程。他打破了以往各自为营的封闭式软件开发模式,开创了Linux开源系统,正如艾瑞克斯.雷蒙德(Eric S Raymond)在《大教堂和市集》中所描述的那样,这是极具震撼力的革新。
尽管如此,李纳斯也并非是一个草率马虎的程序员,事实恰好相反,他所写的Linux内核的源码有着不可思议的美感。在创造这样的程序时同样需要有明确的规则、约定的方法,在Linux开发工作之余,他也可以说是一名带着工程师帽子的开发者。

关于角色
六年前,我曾说过做一名黑客或一名工程师需要与生俱来的品质。而我现在则认为,在不同的领域,不同的情形下我们有着不同的心理特征。
创业公司从来不会在单个领域起步,例如,一家搜索引擎起家的公司既包含商业领域(如商业运营、业务管理),又包含软件开发领域(如开发搜索引擎软件)。
在这里我举两个创业公司至少在两个领域起步的例子。想象一下,有两个合伙人正处在创业阶段,两人都是程序员且都是创造者类型(就是说他们喜欢创造东西出来),但是A比B有着更多的开发经验和知识,而B有着比A多的商业运营经验。当涉及到商业领域时,B通常会成为工程师角色,而A则倾向于成为黑客的角色。在创建一家创业公司的结构或框架时,B比A知道更多关于商业运营方面的陷阱,比如B知道特定的税必须以特定的方式缴纳,但A不知道而且还会提出一些美好但违法的黑客式方法。
然而,当涉及到软件开发领域时,他们的角色将会发生转换。例如,A有着足够充分的理由架设桌面视频会议系统来用,而缺乏经验的程序员可能会将此举认为是在阻碍他们黑客式的行为。
当涉及到单个程序开发时就更有趣了。一个人可能会以他的知识体系和工程素养创造一段程序出来,或者是提出一个工程化解决方案,然后像黑客那样探寻这个解决方案的更多发展空间。前者的例子是,李纳斯.托瓦兹以黑客方式创造了Linux内核————当Linux被创造时是以MINIX系统的fork程序为基础的,但同时他也做了很多精细的工程化的工作。后者的例子是理查德.费因曼(Richard Feynman)对于量子电动力学的发现。

角色转换
当一个黑客和一个工程师在一间屋子里计划一起创造一些东西出来时,可能会是谁也不服谁的状态。尽管如此,我仍然强烈建议在初创公司中既包含有黑客型人才,亦包含有工程师型人才。
依据不同的情形,创造者(黑客或工程师)有着不同的心理特征,这可以被很好的加以利用。在存在黑客和工程师的领域里,黑客能够以革新的角度看待旧问题,寻找漏洞并做修补,而工程师能够为黑客提供扎实的事实基础。上文中的税收例子便是说明。
事实上,依据情境变化的角色转换也可以很好的加以利用。保罗在《黑客与画家》中谈到黑客需要同理心。角色转换是很好的同理心训练。虽然角色转换大多数时候发生在不同领域转换中(比如,A是商业运营方面的黑客,软件开发方面的工程师;B正好相反),如果初创业者能够认清他们正在扮演的角色以及需要的角色,这会是很好的锻炼同理心的机会。
工程师可能会觉得自己多年的经验会被黑客忽视掉,而黑客会觉得他的能力会被工程师所设定的条条框框所牵绊。当这样的事情发生时,其实是不错的机会去感受彼此的角色————试着穿上别人的鞋子走走看,或许能走一英里亦或两英里。
关于这点,我想指出的是,我不相信每个人都有黑客的品质,总会有一些人承受不了一点点的冒险或不服从的后果。在我看来这些人可能适合生活在更大的环境中,但不适合在初创团队里,创业团队需要的是能够在黑客和工程师角色之间相互转换的人。
在另一方面,如果初创团队负责是是极为重要的软件(比如可能会引起多人丧命的那种),那么相比黑客式思考方式,团队需要的更多是工程师式的想法。当然,这并不妨碍一些娱乐型的黑客用像Python这样的动态语言做出一些疯狂的事,像是用Python控制30吨重的设备。

结束语
黑客早已不是什么新名词,但黑客这个词已经存在许久并将存在更久。从伽利略到费因曼再到托瓦兹,总会有一些麻烦制造者伸长了脖子探寻着盒子外的世界,桀骜不驯、寻求革新。
在软件方面,我赞同保罗.格雷厄姆的观点。我们生活在软件黑客的繁荣时代,但随着计算机工业的成熟,工程师将会逐渐成为新新人类,他们可能没有黑客那么迷人,但他们将会是软件的根基。
综上所述,最重要的是继续努力前行,继续努力创造新的事物,不管你是一名黑客还是一名工程师,因为是创造者(Maker)在推动这个世界发展。