最近有兩個趨勢真的令我討厭:DevOps和“全棧”開發者概念。DevOps運動如此受歡迎,以至於討厭它就相當於說是我討厭x86架構或單核心。但是確實如此:我受不了它。使我痛苦的根本原因是什麼?那就是:不是每個公司都是新創公司,但看來每個公司都必須表現得好像它們就是一樣。
DevOps
“DevOps”表示之前純粹的開發、運營以及質量保障(QA)部門之間的密切合作和交叉。因為軟體需要以不斷加快的速度釋出出來,傳統的“瀑布型”開發-測試-釋出週期已經不能滿足要求。開發者還必須對測試及釋出環境的質量負責。
“開發者”(這個詞是否合適有待商榷)漸增的責任範圍催生了對綜合型求職者的需求:“全棧”開發者。這類開發者既能夠做開發工作,也可以是QA團隊的成員、運營分析師、系統管理員和資料庫管理員。在你指責我誇張之前,再回頭看一下這個列表,有你不期望一個“全棧”開發者精通的嗎?
這些概念來自哪裡呢?對,新創公司(還有敏捷方法)。新創公司初起時奇形怪狀,需要以一種艱苦的方式撐過最初幾年。我不否認這一點。不幸的是,由於缺乏資源,新創公司的工程師被迫承擔多種技術角色作為“開發者”角色必備的基本要求。
身兼多職
想象你在一家擁有7人開發團隊的新創公司。你已經做了一年的web應用開發,一切順利。但在確保這方面一切正常,卻常常是令人抓狂的混亂。如果有一個特別麻煩的問題,需要深奧的資料庫知識,你沒有權力說“那不是我的專長”,然後把它交給 DBA 團隊處理。由於條件有限 ,你必須擔當起DBA 的角色,然後自己解決這個問題。
現在,將這個情景擴充套件到之前列出的所有角色。在任何時候,一個新創公司的開發者可能同時擔任開發、QA測試、部署/運營分析師、系統管理員和 DBA 。這就是商業本性,而有些人非常適合這種環境。然而,不知從什麼時候起,我們開始自欺欺人說自己適合,因為在任何時候,一個新創公司的開發者不得不身兼多職,他/她必須一下擔當起所有這些角色。
即使真存在這樣的人,“全棧”開發者仍然不能以他們應有的方式工作。新創公司並不是讓他們在一段時間內擔當某一個角色,然後再轉換到下一個角色,而是要求他們一直同時擔當所有這些角色 。最糟的是:大部分優秀開發者幾乎都能做到。
階級
優秀開發者都是聰明人。我知道我這樣說肯定會遭人反感,但在一個組織裡存在著技術角色實用性等級制度。最頂層是開發,接下來是系統管理員和DBA。QA 團隊,“運營”人員,釋出協調者等類似角色處於該階級的最底層。為什麼是這樣的順序呢?
因為,若有必要,每個角色都能夠承擔低於這一層次所能做的所有工作。
新創公司教會我們這個道理。如果需要,優秀開發者可以是合格的DBA。他們也可以是像樣的測試員,“部署工程師”,或者其他諸如此類職位。他們的工作要求他們對更低層工作領域也瞭如指掌。但這其中有一個問題,希望說到這裡你也能看出來:
反過來卻行不通。
在緊要關頭,QA人員不能承擔開發者的工作,構建工程師也不能承擔DBA的工作。他們不具備擔當這些角色所必須的專業知識。好吧,不管你喜不喜歡,每個組織裡都有這種階級層次,並且人們有著不同技能組合和能力水平。然而,當你讓開發者去做其他工作時,任何人都不能來擔當他的開發者角色。
舉個例子能使它更清楚些。我爸爸是一個開私人診所的牙醫。他僱了一個祕書,一個保健專家和一個牙醫助理。在這種對應的“DentOps”運轉下,我爸爸需要邊記錄預約、洗牙,邊擠出時間來鑽蛀牙、實施根管治療術,等等。我爸爸可以做診所裡所有其他工作,因為他具備這些工作所必需的專業知識。
但是沒有一個人,即便是所有僱員全加起來,也都做不了他的工作。
這樣運轉會傷害到每一個牽涉其中的人,(當然)僱主除外。這個旨在提高軟體質量的實驗已經變成一場鬧劇,最具天賦的僱員勞累過度(然而有價值的工作少之又少),而低層次的職位根本不存在。
這就是這一問題的關鍵所在。“全棧”工程師,使之前那些由不同能力水平的人分別擔任的職位變得多餘。大公司喜歡這一點,因為這意味著,他們可以僱傭儘可能少的人來完成等量工作。然而,在這個過程中,真正的開發在開發者工作所佔的比例越來越小。這就是為什麼我們會看到那麼多開發者都不能通過FizzBuzz:他們從不須真正編寫任何程式碼。現在這個問題太常見了,你能想象面試廚師時要問他,每天有多少時間真正用來烹飪嗎?
什麼都可以做,什麼都不精通
如果你是一箇中等規模軟體的開發者,那麼你需要一個適當的部署系統。請馬上說出下述這些系統各自的優缺點:Puppet、Chef、Salt、Ansible、Vagrant、Docker。現在實施你的部署方案吧!你是不是都沒有注意到,上面列出的系統中有一項是完全無關的?
我們需要專業化的原因是:人類所能保留的知識有限。任務切換無疑是昂貴的。強迫開發者去擔當其他傳統專業人員的角色,意味著他們將:
- 不能花費時間在開發上
- 需要跟上一個巨大的知識領域
- 將不堪重負
另外,要強迫開發者承擔“全棧”職責,公司需要付給僱員們遠高於完成其中大部分任務的市場平均價格的工資。如果一個開發者1年賺10萬,你可以僱傭4個每年10萬的開發者來做一個兩人的任務,一半時間做開發,一半時間做釋出管理。或者,你也可以只僱一個每年75k的釋出管理員,然後兩個開發者做全職開發。要注意到兼職釋出管理的開發者,在沒有釋出需要管理時浪費的時間了。
不要扼殺開發人員
所有這一切的效果就是毀掉“開發者”的角色,並代之以“全能技術工人”。我所認識的每個開發者都沉迷於程式設計,因為他們真地喜歡(一度)。當你強迫那些聰明人執行額外的任務時,你就傷害了每個牽涉其中的人。
並非每個公司都是新創公司 。新創公司可以選擇不讓開發人員身兼多職,他們這樣做是出於必要。你的公司很可能在你沒有創造出一些資源之前有著極大地制約。請不要混淆“精益”與“以最少僱員運營”的概念。看在上帝的份上, 讓開發者寫程式碼吧!