三种软件工程师——编码员、程序师和架构师

从小时候开始,工程师在我的心目中就不是一份高尚伟大的职业。   工程师必须要用没人听得懂 (也没人有兴趣) 的语言,去架构出能被使用的东西。这些东西可能是建筑物、车子、机器、电路板、软件等等??   人们总是会将产品的功劳归给「计划者」(如 Steve Jobs) 以及设计、行销、管理者。而我们的工程师似乎就像是一些可以被替换的零件,没有人会记得他们的名字。他们所做的事情也可以被其他人取代。   直到后来,我自己加入了软件工程师的行业,对于工程师的想法也有所改变。今天,我想在这边跟大家分享一下我对于「工程师」的看法。   虽然在中文里,大家都叫做工程师,但其实根据工程师喜欢做的事情、心中对于程序的想法,可以分成几种类别的人。这边简单的以我的认知,把写程序的工程师分成三类。    第一,写程序的人 (Coder、Employee、Worker)   这种类型的人单纯的只是为了工作、功课、任务而写程序,虽然职务名称叫做工程师,但是写程序对他们来说只是获取成绩、金钱的工具,写程序对他们来说枯燥无味,但为了生活,他们继续产出他们的程序码。他们喜欢简单的任务,最好是一看到就知道要怎么做,最好有开源的程序码可以直接套用。只要他们的程序可以过关,他们就开心的回家睡觉去了,一秒钟都不想再看代码。    第二,有目标而写程序的人 (Hacker、Doer、Entrepreneur)   这种类型的人并不是因为热爱「程序」本身而开始写程序,他们写程序是为了要达成某些目的。这些人虽然不是天生的程序高手,但是很会用别人写好的套件去兜出一些应用,当有一个好的点子时,他们第一件事不是去想:「我本身不是学这个的,我要怎么样才能找到别人来帮我做??」他们会去找既有的资源架构,尝试做出原型 (Prototype),有时候虽然做出来虽然有点破 (像是下图右方的机器人),但他们乐在其中,并且常常不眠不休的写程序。我自己会将 Mark Zuckerberg(Facebook)、Drew Houston(Dropbox)、David Karp(tumblr) 这些创办人归在这类。  

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 的第一个思维会让他想要阻止大家天马行空的乱提点子,因为他知道这些点子拼凑在一起,程序或产品架构会是个一团乱 (但这时候 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 也该继续更新了 )。  

后来我的朋友 Szu-Yu Chen 有回应一篇文章,提出不一样的观点,大家也可以参考看看:   这篇主要的目的是回应上文《三种工程师——Coder, Hacker and Architect》,并乱扯一下我目前的心得,建议可以先看完上篇,会比较好懂。   最大的问题是我不认同这个分类,通常分类都是互斥的,但文中的这三个类别,给我的感觉却怪怪的,另外也不该有哪一个更高尚的比较。  Coder   第一个角色是 Coder,就是仅仅把写程式当成工作的人。广义的来说这不受限于写程式或是工程师。这种人就是没兴趣没热情,为了谋生而工作的人,或是其实不缺钱,但搞不清楚为什么而工作的人。   这个问题是,这些人就是把工作当成杂事或是职业,而不是志业,每天早上去上班,因为必需要去,而不是自己想去,去了之后就开始期待领薪水,期待放假。而让自己做好的主要工作动机都是外部因素,升迁、加薪、权力。   把工作看成志业的人,会认为工作本身就是他的目的,动机来自于内在因素,觉得有贡献,觉得在实现自我。当然这种人也是在乎薪水跟升迁的!   这两个的差别就是工作态度。会走上 Coder 之路的人,是因为他在选择工作时,思考的是「会做什么」,「擅长做什么」,因为我会写 Code,所以找了一份写 Code 的工作。   曾经我也很瞧不起这种人,就是因为有这种人在,造成劣币驱逐良币,工程师的地位低落,我甚至觉得,在一个公司里,这样的人大概有八九成,一个人到底有没有兴趣有没有热情,其实都会彰显出来的。不过阿,就像最近很红的这篇「我在微软学到大学没教的事」所说,不是每个人提到写程式时都会满腔热血,是阿,It’s all about priorities,也许他就是不想成为一个伟大的工程师,试着去尊重每个人的选择!   不过虽然这么说,这种人也让人觉得很可惜,我认为他们应该试图寻找一个可以当作自己人生志业的工作。就如同马斯洛说的「一个人最好的运气和最大的福分,就是有人付钱请他从事他衷心喜爱的工作。」   所以怎么找到自己的志业呢   管理学大师 Stephen Covey 认为一个人的独特贡献应该是天赋才能、工作热情、需求、道德良知的交集处 (From )。   哈佛幸福课讲师 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 () ==   的方式比较,结果他把 == 做 operator overloading,让结果不管是什么,== 都是 True,瞬间通通破台了。这就是 Hack,预期外的效果。   而 Hacker 也没有限制要是工程师,只是对于软件工程师来说,作这样的事有较大的优势,很容易作些什么就让这个世界更好。是的,就是解决问题,然后回馈 会。用这样的观点来看,g0v 就是一群很棒的 Hacker。  架构师   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 的定义都完全符合。希望文末这样的说明,能够让名词的定义更加清楚

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年4月22日
下一篇 2017年4月22日

相关推荐