在客觀世界中,有很多事物存在非黑即白,我們很容易去區(qū)分。例如女人與男人,老虎與獅子,汽車與自行車等等,但對于眾多IT從業(yè)人員,外界的人們很難一下找出他們之間的區(qū)別。提出此問題,目的在于從外界和IT人員自身的角度去探討開發(fā)者和程序員之間的差異和關(guān)聯(lián),為想要踏入IT行業(yè)的求職者和企業(yè)招聘者提供一些個人的看法。
也許你會覺得該問題會很搞笑,不管是開發(fā)者還是程序員他們都是程序員,就像男人和女人都是人(你也可以說都是動物)。首先,開發(fā)者和程序員都是程序員沒錯,這就像下面這個小故事一樣:
“駕購獅,射雞獅,攻城獅和程序猿一起走進酒吧”
酒保:——程序員們來了!

對于非IT行業(yè)的人們來說,他們只能對IT從業(yè)者只有一個模糊和呆板印象——他們都是程序員,會修電腦,頭發(fā)很少。如果你是一個IT行業(yè)的從業(yè)人員,則需要細品開發(fā)者和程序員之間的差異(我探討的目的并不在于界定誰比誰好)。例如,如果你是IT公司負責(zé)招聘的工作人員,則必須搞清楚兩者之間存在的差異,不然可能招募不到合適的人才,浪費公司的時間和金錢;如果你是一個想要從事軟件開發(fā)的人,理解兩者之間的差異,對你的職業(yè)規(guī)劃也大有幫助,因為只有了解了差異,你才知道什么角色適合你,將來該往什么方向發(fā)展。
一、程序員
為了便于理解,我先將程序員比喻成一個技藝高超的廚師(注意強調(diào)烹飪技術(shù)),他們能夠按照菜單上的信息,在既定的時間范圍內(nèi),烹飪出色香味俱全的菜肴。能完成這樣一項任務(wù),這得益于廚師們在刀工,時間和火候上的精湛技藝。

同樣的,程序員在既定的時間范圍內(nèi),按照開發(fā)任務(wù)(菜單)將別人的想法轉(zhuǎn)化為可執(zhí)行的軟件代碼,他們負責(zé)編寫,測試,調(diào)試/故障排除和維護計算機源代碼,能勝任這樣一類工作,這得益于他們能理解各種計算機編碼指令,能熟練使用各種庫函數(shù)或框架。
如果要用一句簡單的話來概況,那就是:和廚師一樣,程序員是面向任務(wù)/指令型的角色。他們都是根據(jù)任務(wù)/指令行事。
二、開發(fā)者
如果將程序員類比為技藝高超的廚師,那么開發(fā)者更像是一個專業(yè)的美食家。就像美食家也是一名廚師一樣,開發(fā)者也是程序員,但區(qū)別在于,他們不僅能夠烹飪出美味的菜肴,還可以從0到1創(chuàng)造新的菜品。于程序員相比,開發(fā)者在創(chuàng)造性和概念性上更勝一籌。
對于同樣一個產(chǎn)品,程序員的工作是從任務(wù)/指令下達的時候開始的,而開發(fā)者的工作是從和客戶談?wù)撔枨髸r開始的。開發(fā)者需要不斷的同客戶交談以獲取原始的需求信息,然后對需求進行分析,定位和抽象并找出其中埋藏的問題,最后針對客戶的問題,尋求可行的解決方案。

在實際情況中,程序員和開發(fā)者并沒有很明確的界限。例如,在小規(guī)模的公司,一個開發(fā)者既要承擔(dān)需求分析,系統(tǒng)設(shè)計,項目管理的工作,又要承擔(dān)編碼,測試,調(diào)試/運維的工作。但不管界限如何模糊,他們之間終究有區(qū)別,例如,從工作的范圍來看:
程序員的工作始終伴隨著編碼,而開發(fā)者的工作更多是處理需求,設(shè)計和管理的事情。
如果從工作的時間周期來看:
程序員的工作時間周期是從任務(wù)下達到調(diào)試完成,而開發(fā)者的工作時間周期是從需求談判到產(chǎn)品落地。
從工作范圍和時間周期上來看,我們可以得到第一個直觀的概念:
開發(fā)者程序員都是程序員,開發(fā)者和程序員所承擔(dān)的角色是整體與部分,全集與子集的關(guān)系。
程序員只需關(guān)注自身任務(wù)的時間周期,而開發(fā)者需要關(guān)注整個項目周期。
三、程序員 VS 開發(fā)者
首先,不管是系統(tǒng)架構(gòu)師,軟件工程師還是軟件設(shè)計師,他們都是程序員。
在接下來的內(nèi)容中,我會從工作的職責(zé),時間,能力和領(lǐng)域這四個方向探討開發(fā)者和程序員之間存在的區(qū)別和聯(lián)系。

3.1 工作職責(zé)
程序員:
- 程序員需要對他們正在編寫的源代碼負責(zé)(測試,調(diào)試/運維)
- 根據(jù)既定任務(wù)行事
- 專注于代碼邏輯和算法
- 負責(zé)業(yè)務(wù)邏輯的實現(xiàn)和代碼組裝
開發(fā)者:
- 很少的代碼編寫量,更偏重于編碼規(guī)范的制定
- 負責(zé)評定和管理項目代碼
- 對項目的時間,空間和資金成本負責(zé)
- 協(xié)調(diào)處理整個項目的功能
- 協(xié)調(diào)/掌控全局,但沒有必要知道各子功能的內(nèi)部細節(jié)。
程序員利用專業(yè)知識,將現(xiàn)實需求/問題轉(zhuǎn)化為可執(zhí)行代碼,開發(fā)人員則需要利用創(chuàng)造性和概念性來保證程序員的節(jié)奏一致,為項目爭取時間和空間。這好比一場交響樂音樂會,程序員像演奏者,而開發(fā)者像手拿指揮棒的演奏指揮。
3.2 時間范圍
程序員:
- 任務(wù)下達——工作開始時間
- 編碼
- 測試
- 調(diào)試
- 任務(wù)完成——工作結(jié)束時間
開發(fā)者:
- 需求談判——工作開始時間
- 需求分析
- 概要設(shè)計
- 解決方案
- 編碼實現(xiàn)
- 系統(tǒng)測試
- 系統(tǒng)運維
- 文檔編寫——工作結(jié)束時間
程序員的的工作好比一個400米的接力往返跑比賽,每個程序員只負責(zé)其中一段工作,而開發(fā)者更像是馬拉松長跑比賽,需要從頭盯到尾。

3.3 工作能力
程序員:
- 使用合適的編碼指令和算法,編寫經(jīng)過測試且符合標(biāo)準(zhǔn)的有效代碼,以完成任務(wù)。
開發(fā)者:
- 發(fā)揮自身的創(chuàng)造性和概念性,找到滿足客戶需求的解決方案,并讓程序員能夠理解并實現(xiàn)自己的想法。
3.4 專注領(lǐng)域
程序員:
- 業(yè)務(wù)邏輯轉(zhuǎn)化為可執(zhí)行代碼
- 精于某一個或多個編碼語言
- 善于使用各類算法解決問題
- 善于對代碼進行測試、修改和運維
開發(fā)者:
- 需求分析和溝通
- 資源整合和協(xié)調(diào)
- 項目管理與跟蹤
- 風(fēng)險評估于把控
四、總結(jié)
通過對程序員和開發(fā)者之間的對比,我們發(fā)現(xiàn)了兩者之間的差異。簡單來說,程序員和開發(fā)者之間最本質(zhì)的區(qū)別在于他們的工作范圍不同,思考方向不同。開發(fā)人員(技術(shù)總監(jiān),架構(gòu)師,設(shè)計師,項目經(jīng)理等)會更多的參與到整個項目當(dāng)中,并對項目有更深入的了解;而程序員(例如:初/中/高級JAVA程序員或技術(shù)專家),他們只參與了項目的特定部分,利用自身的專業(yè)知識,解決了某一領(lǐng)域的問題。
回到一開始的那個問題中,開發(fā)人員也是程序員,就像美食家也是廚師。但需要注意的是,開發(fā)者可以平滑切換到程序員的角色,但程序員并不一定能切換為開發(fā)者的角色。為什么這樣說?道理很簡單,美食家可以切換成廚師的角色,自做美味菜肴,但廚師并不一定能夠像美食家一樣創(chuàng)造新的菜品,并對沒事進行品鑒。同樣的,一個技術(shù)總監(jiān)或架構(gòu)師可以成為一個合格的程序員,去完成編碼任務(wù)(通常不會這樣,殺雞用牛刀,如果小公司只有一把牛刀,那也沒有辦法);但一個高級程序員未必能夠勝任技術(shù)總監(jiān)或架構(gòu)師的工作,因為兩者要思考的問題是一個父子集合,整體與局部的關(guān)系。
認識到這一點后,如果你是一名IT公司的招聘人員,你應(yīng)該已經(jīng)明白,一個編程專家未必是你想要尋求的技術(shù)總監(jiān)或架構(gòu)師,選擇需謹(jǐn)慎,用人有風(fēng)險;如果你是一個碼農(nóng),也請認清兩者區(qū)別,做好職業(yè)規(guī)劃,如果你想往技術(shù)總監(jiān)/架構(gòu)師方向發(fā)展,除了必要的編碼能力,你還需加強自身在溝通,表達,整合,探索,創(chuàng)新等方向上的能力,規(guī)劃需謹(jǐn)慎,光陰去不回。