视频地址:https://www.youtube.com/watch?v=nKIu9yen5nc
从小时候开始,工程师在我的心目中就不是一份高尚伟大的职业。
工程师必须要用没人听得懂 (也没人有兴趣) 的语言,去架构出能被使用的东西。这些东西可能是建筑物、车子、机器、电路板、软件等等⋯⋯
人们总是会将产品的功劳归给「计划者」(如 Steve Jobs) 以及设计、行销、管理者。而我们的工程师似乎就像是一些可以被替换的零件,没有人会记得他们的名字。他们所做的事情也可以被其他人取代。
直到后来,我自己加入了软件工程师的行业,对于工程师的想法也有所改变。今天,我想在这边跟大家分享一下我对于「工程师」的看法。
虽然在中文里,大家都叫做工程师,但其实根据工程师喜欢做的事情、心中对于程序的想法,可以分成几种类别的人。这边简单的以我的认知,把写程序的工程师分成三类。
第一,写程序的人 (Coder、Employee、Worker)
这种类型的人单纯的只是为了工作、功课、任务而写程序,虽然职务名称叫做工程师,但是写程序对他们来说只是获取成绩、金钱的工具,写程序对他们来说枯燥无味,但为了生活,他们继续产出他们的程序码。他们喜欢简单的任务,最好是一看到就知道要怎么做,最好有开源的程序码可以直接套用。只要他们的程序可以过关,他们就开心的回家睡觉去了,一秒钟都不想再看代码。
第二,有目标而写程序的人 (Hacker、Doer、Entrepreneur)
这种类型的人并不是因为热爱「程序」本身而开始写程序,他们写程序是为了要达成某些目的。这些人虽然不是天生的程序高手,但是很会用别人写好的套件去兜出一些应用,当有一个好的点子时,他们第一件事不是去想:「我本身不是学这个的,我要怎么样才能找到别人来帮我做⋯⋯」他们会去找既有的资源架构,尝试做出原型 (Prototype),有时候虽然做出来虽然有点破 (像是下图右方的机器人),但他们乐在其中,并且常常不眠不休的写程序。我自己会将 Mark Zuckerberg(Facebook)、Drew Houston(Dropbox)、David Karp(tumblr) 这些创办人归在这类。
图片来源
第三,热爱程序本身的人 (Architect、Theorists、Change Maker、Geek)
这类工程师喜欢程序本身,他们欣赏程序设计的架构、可扩充性、可被测试性。他们喜欢最新的科技,并且会主动的去接触、试用它们。他们喜欢写有架构、能够被别人重复使用的套件 (Library)。他们乐于贡献自己所知所学到这个世界,并且常常在想有没有什么最新科技、理论能够套用到某个工具或服务上,让这个服务更快、更大、更好。他们是三种类型的工程师中技术最高超的一群 (如上图左方的人),也常常是能够改变整个程序世界游戏规则的人。如 jQuery 的发明者 John Resig、Linux 发明人 Linus Torvalds、个人电脑发明者 Stephen Gary Wozniak,还有许许多多的 Google 工程师们。
Steve Jobs & Stephen Wozniak, photo credit: empireonline
写到这里,我忽然想要澄清一个大众对于工程师的误解。当大家看到一个东西、软件不好用,或是 UI、UX 设计上有问题时,常常会说制作这个东西的人用「工程师思维」在设计。又或是团队在讨论一样东西时,PM(Product Manager) 或管理者常会对工程师说:「你那是『工程师思维』,站在『使用者』的角度来说⋯⋯」工程师常因为大众对自己身份的刻板印象,被弄到连发言权都没有,或是提出的意见不被重视,但事实是怎样呢?
如上面所说,工程师分成三种。而所谓的「工程师思维」,充其量只能形容第一种人 (Coder) 的所作所为。
Coder 的工程师思维
Coder 因为只想把事情做到交差了事,因此他们每天的任务就是把上面说要做的事情完成,一分不多、一分不少。因此,假设管理者、PM 在 Spec、Feature 中没有把整个使用流程、步骤、使用情境全部拆解成任务,这些 Coder 是不会自动帮忙把 UX 做好的,当他们发现这个系统使用起来会有问题,他们会选择默不吭声,因为提出一个好的意见,只代表自己的工作会增加 —— 而这是让 Coder 最不开心的事情。
在充满 Coder 的工作环境,做出来的东西就有机会充满「工程师思维」(不好用、UX 烂),因为这些东西只是一堆 Feature(Coding 任务) 的结合。要营运这样的公司必须要有很强的 PM 和设计者,能够有效管理员工、定义产品,才能让 Feature 拼凑出好的产品。
Hacker 的工程师思维
而第二种人 (Hacker) 是最讨厌别人说他们有「工程师思维」的人,因为他们其实是普通人和第三种人 (Architect) 的混种。Hacker 知道怎么完成一样事情,但技术没有这么高超。他们重视目的和 UX,因为他们喜欢使用自己做的东西。当公司要规划一项新产品时,他们不会因为这项新产品做起来简单、轻松,工作负担轻而开心 (Coder 会)。相反,他们会因为这些东西好用、创新而兴奋不已。当有任务下来,Hacker 不会让使用的细节从眼前溜过,他们会默默的将设计不完整的地方补完。有时候他们甚至会和管理者争论,这个 Feature 到底该不该有,因为他们认为使用者不会喜欢。
假如在公司没有权力,Hacker 其实是角色最尴尬的人。至于尴尬在哪⋯⋯,我想这个秘密就留给 Hacker 们了。
Architect 的工程师思维
而第三种人 (Architect) 的确是有工程师思维,但工程师思维对他们来说应该要是种称赞。Architect 的工程师思维源自于两个面相,第一个是他们喜欢有秩序、可以永久保存、重复使用的东西,第二个是他们无私的想要贡献自己做出的东西给这个世界。当公司或团队在讨论时程时,Architect 的第一个思维会让他想要阻止大家天马行空的乱提点子,因为他知道这些点子拼凑在一起,程序或产品架构会是个一团乱 (但这时候 PM 会说:「那是因为你从工程的角度去想,但使用者使用起来不会这样觉得,你这是工程师思维」)。但实际上,一个好的产品设计,从工程上面来看应该也要是规律、优雅而有深度的。若工程设计本身具有规则,使用者在使用时是可以隐约感受到其背后令人舒适的逻辑的。因此我认为 Architect 喜欢秩序的工程师思维是好的。
而 Architect 的第二种思维——贡献于整个世界,有时候对于末端使用者 (也就是我们所称的「大众」) 来说,会是一个小灾难。Architect 会希望把一个东西做到拥有很大的扩充性、以及很多的功能,如此一来任何一种人都可以视自己的需求,去变化使用这个东西。而这种想法最知名的例子,就是苹果电脑的发明人沃兹·尼克,曾和 Steve Jobs 争论,它希望电脑上面要有很多可扩充的插槽,如此一来各类的科技人才能视自己所需去改装电脑。(后来 Steve Jobs 没让他这样做,沃兹尼克还小生气了一阵)。
但 Architect 的第二种思维,常常是他们做出来的东西能影响这整个世界的关键。Internet、Linux、python、ruby、C 语言⋯⋯Architect 创造出来的东西,无私的奉献给这个世界,成为科技发展的基石,因此一般大众才有机会使用简单易懂的科技产品。
photo credit: Xiqiao
在我们的环境中,有太多的 Coder、也有许多从 Coder 变成的 Hacker(他们的差别只在有没有目标,还有去实作的毅力),但比较少真正愿意奉献、热爱程序的 Architect。
至于我呢? 目前还只是个有目标的 Hacker 而已,距离真正厉害的工程师还有很长的一段距离。但自诩为一个 Hacker,还是希望自己能够继续做出对世界有贡献的东西 ( 之前做的 Timego 也该继续更新了 )。
当你有一个想法,并用自己的双手实现出来,然后按下一个按钮,让几百万人都能分享你的成果。我想我们是世界上第一代能够有此经历的人。 —— Drew Houston in "What most school don't teach"
后记:
话说这次之所以会写这篇文章,是因为昨天想要在 iPad 上看第一银行的电子书,但很不幸的,它是 Flash,iPad 无法观看。而使用 Puffin 它竟然说网页记忆体用量太大不让我开,这时我想起自己是个工程师,于是就用 Dropbox 的公开资料夹当做服务器,自己写的几行程序码当做载具,简单的做了一个 iPad 观看版本。做完后觉得,嗯,当工程师还是有一些特殊的地方的。晚上心血来潮,就写了这篇文章。
我想人们之所以会走向不同的工程师类型,和工作环境、投入的 Project 也有很大的关係,即使在 Google,也有很多聪明的人因为一些因素成为单纯生产 Code 的 Coder。
希望每个工程师都能选择自己想走的路,生活、创业、贡献⋯⋯ 一切都是自己的选择。
本文作者 St. Threath,以网路领域为自己的志业,同时喜欢科技和人文这两个极端,梦想是到硅谷的伟大航道创业。目前和创业伙伴一同开发和经营美食 app「爱食记」。
后来我的朋友 Szu-Yu Chen 有回应一篇文章,提出不一样的观点,大家也可以参考看看:
这篇主要的目的是回应上文《三种工程师——Coder, Hacker and Architect》,并乱扯一下我目前的心得,建议可以先看完上篇,会比较好懂。
最大的问题是我不认同这个分类,通常分类都是互斥的,但文中的这三个类别,给我的感觉却怪怪的,另外也不该有哪一个更高尚的比较。
Coder
第一个角色是 Coder,就是仅仅把写程式当成工作的人。广义的来说这不受限于写程式或是工程师。这种人就是没兴趣没热情,为了谋生而工作的人,或是其实不缺钱,但搞不清楚为什么而工作的人。
这个问题是,这些人就是把工作当成杂事或是职业,而不是志业,每天早上去上班,因为必需要去,而不是自己想去,去了之后就开始期待领薪水,期待放假。而让自己做好的主要工作动机都是外部因素,升迁、加薪、权力。
把工作看成志业的人,会认为工作本身就是他的目的,动机来自于内在因素,觉得有贡献,觉得在实现自我。当然这种人也是在乎薪水跟升迁的!
这两个的差别就是工作态度。会走上 Coder 之路的人,是因为他在选择工作时,思考的是「会做什么」,「擅长做什么」,因为我会写 Code,所以找了一份写 Code 的工作。
曾经我也很瞧不起这种人,就是因为有这种人在,造成劣币驱逐良币,工程师的地位低落,我甚至觉得,在一个公司里,这样的人大概有八九成,一个人到底有没有兴趣有没有热情,其实都会彰显出来的。不过阿,就像最近很红的这篇「我在微软学到大学没教的事」所说,不是每个人提到写程式时都会满腔热血,是阿,It's all about priorities,也许他就是不想成为一个伟大的工程师,试着去尊重每个人的选择!
不过虽然这么说,这种人也让人觉得很可惜,我认为他们应该试图寻找一个可以当作自己人生志业的工作。就如同马斯洛说的「一个人最好的运气和最大的福分,就是有人付钱请他从事他衷心喜爱的工作。」
所以怎么找到自己的志业呢?
管理学大师 Stephen Covey 认为一个人的独特贡献应该是天赋才能、工作热情、需求、道德良知的交集处 (From <Great work, Great Career>)。
哈佛幸福课讲师 Tal Ben Shahar 则说,可以透过 MPS (Meaning Pleasure Strength) 的流程来帮助自己,思考什么东西做起来有意义,快乐,而自己也擅长。
LinkedIn 创办人 Reid Hoffman 也说了一个类似的,什么是你的竞争优势,是资产、抱负、市场状况,三者缺一不可。
所以,我想应该很清楚了吧!
Hacker
再来就是什么是 Hacker,有人提到文中 Hacker 的定义怪怪的,是的,这正是我想说的,Hacking 是一种精神,拥有 Hacking 精神的人就是 Hacker,更详细的可以看 How to become a hacker,另外说自己是一个 Hacker 也怪怪的,「You aren't really a hacker until other hackers consistently call you one」,就像你不能自己说自己是个好爸爸,这要由你的小孩来说。话说,我也想成为一个 Hacker,可以有 Hacker 来认可我吗 XD
前阵子在 PyCon TW 听了一个 talk,有一个我很喜欢的 Hacking 定义:「在条件限制下,达到预期外的效果」,讲者说了一个 Hack checkIO 的故事,checkIO 是一个透过玩游戏学写程式的网站,基本上 online judge 就是给你一组 input,要求算出某个东西,然后跟标准 output 比较,看你是否正确,checkIO 使用
assert checkio (<given input>) == <golden output>
的方式比较,结果他把 == 做 operator overloading,让结果不管是什么,== 都是 True,瞬间通通破台了。这就是 Hack,预期外的效果。
而 Hacker 也没有限制要是工程师,只是对于软件工程师来说,作这样的事有较大的优势,很容易作些什么就让这个世界更好。是的,就是解决问题,然后回馈社会。用这样的观点来看,g0v 就是一群很棒的 Hacker。
Architect
Architect 其实是个职称,地位比 Engineer 高很多。我认为应该分成会写 code,跟不会写 code 的,在大公司里很多这种不会写 Code ,只会动嘴巴的,well... 不予置评。
其实人人都是 Architect,程序设计师的三个美德,懒惰、不耐烦、傲慢。为了懒惰,自然而然就会产生有秩序,可以永久保存、重复使用的东西。这么说好了,打造这些东西都是为了日后可以偷懒而努力。
再来原文中所说的 Architect 灾难,比较像是 Joel on software 中的 architecture astronauts,当架构过了头,而失去了原本真正要解决的问题。
最后
我发现我有点想要偷懒,开始虎头蛇尾了 XD,不如就在这边下个结论吧。
我一直认为工程师是很伟大的,也期许自己可以成为一名伟大的工程师,所以就让我们一起。
Hack the world and code for tomorrow!
在后面我回复他的文章如下:
其实假如要我重新再写一次文章,我可能会照这样的分类来分。依照热情和能力分成四个象限,两个轴,X 轴是有没有热情,Y 轴是能力高不高超。
Coder Hacker (我说的 Architect)
--------+--------
Coder Hacker (我说的 Hacker)
而在文中说把自己归类在 Hacker 只是要说自己技术还没到这麽高超而已 XD
现在看起来,我似乎滥用了 Hacker 这个名词,因为 Hacker 在程序界似乎包含了「高超技术」的印象,相反地 Architect 反而被归类在 Manager 之类的角色。
谢谢大家的留言,在一般观念中大家提到 Hacker 指的是程序技术高超的人,而这边是把采用 Funders and Founders 的定义:「Hackers are doers」。不论程式技巧高不高超,只要能实际去做、去实践自己想要达到的目标,就是个 Hacker。
但这样的定义似乎不是传统定义,不好意思因为这样的标题混淆到大家的视听。文中所提到的 Architect 是真正的 Hacker(而且是 Super Hacker),因为他们愿意做,而且技术又高超,两种 Hacker 的定义都完全符合。希望文末这样的说明,能够让名词的定义更加清楚 :)