怎样才能叫高级程序员?
Stephen Tobolowsky 在定義聯(lián)體三角形
“我真的開始對我在這里做的事情感覺不自信了。如果我們都不知道高級程序員到底是個什么樣子,那我又該怎么朝這個目標(biāo)努力?”
我們 Frontside 公司是習(xí)慣于每周二下午開個全公司例會的,會上大家談?wù)勆现苋〉玫某煽?#xff0c;并為下一周訂訂計劃。
在最近一次會議上,我們談到了最近要招一位高級程序員,大家一談到這個話題就都立刻激情爆發(fā)了。因為要提到對公司影響重大的事,非招聘新人加入團隊莫屬了,所以很自然的大家就開始各抒己見,熱烈地討論起我們要找的人到底應(yīng)該具有什么樣的資質(zhì)來。
可是除了依靠直覺,一屋子的人里卻沒有一個能夠把大家的想法歸納起來,到底要怎樣才能叫做“高級”。
當(dāng)一位同事說出了文章開始我引用的那段話之后,我意識到我們已經(jīng)迷迷糊糊地碰上了一個對于整個公司來說都非常重要的問題:我們無法為我們想招聘的角色下一個定義,也不知道我們該怎樣培養(yǎng)我們的程序員。
定義“高級程序員”的難題
就我個人來說,我是對“高級程序員”這個稱號非常懷疑的,尤其因為當(dāng)初在我有了 9 個月的正規(guī)編程經(jīng)驗,他們就為了給我漲工資而給了我這個稱號之后。
事實上,如果你找來兩個有經(jīng)驗的程序員,讓他們分別描述一下他們心中的“高級”是個什么樣子,我敢保證他們的答案會大相徑庭。
“怎樣才能叫高級程高序員”這個問題其實非常依賴于語境,而且彈性空間非常大,以致于在我們這個行業(yè)里各個公司都可以給出任何自己需要的答案。
下面是一些身邊人給出的我親眼見到的關(guān)于“高級程序員”的定義:
有 15 年以上編程經(jīng)驗
有 2 年編程經(jīng)驗并且有非常好的學(xué)習(xí)能力
有 1 年使用一個非常熱門的框架的經(jīng)驗,并且框架發(fā)布時間要超過一年
一本技術(shù)書的作者
可以在白板上默寫出來某個計算機科學(xué)的算法
寫過一個開源庫并且在公司里用起來了
這些定義之間相差實在太遠了。但想想在我們的生活中,很多東西都是沒法下定義的,那又有什么問題呢?
為什么要費力下這個定義?憑直覺做判斷不好嗎?
當(dāng)大家在會議上說出這個困惑時,大家實際上說的是我們并沒有非常清晰和可定義的標(biāo)準(zhǔn)來雇傭人、開除人和提拔人這個問題。大家說的對,事實上也就是這么混亂。
更糟的是,我們的核心使命——培養(yǎng)程序員——完不成了,因為我們沒辦法幫他們設(shè)定出一條發(fā)展路線來。
“我一見到這個人我就知道他是個高級程序員”——這種說法揭示了另一個重大問題:“高級程序員”已經(jīng)根深蒂固地成了一個偏見的有效載體。
把“高級程序員”作為供奉偏見的一種方法
當(dāng)我們描述一個高級程序員應(yīng)有的樣子時,我們都是根據(jù)自己的經(jīng)驗和喜好來的,這就意味著這個詞已經(jīng)有了非常強的主觀色彩。
當(dāng)我們沒有明確具體的標(biāo)準(zhǔn),只能憑著直覺來判斷一個人的資歷的時候,我們就沒有辦法不帶有偏見,但我們還是要做出判斷。當(dāng)一個人同時申請幾份開發(fā)工作的時候,非常有可能有的公司認(rèn)為他只是初級,有的會認(rèn)為他是中級,還有的卻認(rèn)為他是高級,當(dāng)然大家都不會直說自己是怎么判斷的。
作為招聘經(jīng)理,當(dāng)我們做出判斷的時候我們都會自認(rèn)為非常正確,即使大家得到的結(jié)論相距甚遠。
這樣的結(jié)果就是不斷被加強的偏見會阻止一些人進步,最終導(dǎo)致“頭銜通貨膨脹”。在當(dāng)今技術(shù)界,各種偏見都不可避免的偏向白種男人,那么這種憑直覺做判斷的體系就更多的會傷害女士和有色人種。
為什么大家還沒有解決這個問題?
首先給這個問題下定義就很難,因為它和工作環(huán)境的具體情況關(guān)系太大了。大多數(shù)公司領(lǐng)導(dǎo)人處理這個問題的辦法都是走著瞧,而最終解決方案也都是“差不多”就行了。
解決這個問題也沒有什么動力,因為當(dāng)定下明確標(biāo)準(zhǔn)之后,公司領(lǐng)導(dǎo)人靠直覺做決定的權(quán)力很大程度上就會被剝奪了,而且還要為做出的決定負責(zé)。有誰會主動做一件讓自己又要讓出權(quán)力又要背上責(zé)任的事呢?
加上問責(zé)
我喜歡被問責(zé),我也非常習(xí)慣。我懂得在為某件事負責(zé)任的同時,實際上我的自由度也是非常高的。就是否雇傭某個人這個問題來說,憑直覺下的決定往往比依據(jù)清晰的標(biāo)準(zhǔn)做出的決定更容易讓人后悔。因為我們的直覺太容易受影響了,從我早上是不是忘了吃早餐,到那個人是不是能即興談起某個動畫片,都有可能。
問責(zé)也為我們打開了改進之門。作為招聘經(jīng)理,我的責(zé)任是打造一支有戰(zhàn)斗力、快樂和能力互補的團隊。要不斷改進并且朝著這樣的目標(biāo)努力,可以靠直覺,可以全憑運氣,但我們也可以創(chuàng)建一種先定義、再衡量、又問責(zé)反思然后再從頭開始這樣的循環(huán),來保證我們通向最終目標(biāo)。
問責(zé)可以幫助我們在通向未來的道路上完成從乘客到駕駛員的角色轉(zhuǎn)換。
始于責(zé)任
現(xiàn)在問題變成了:我們怎樣才能創(chuàng)造一種用于衡量資歷的可度量的標(biāo)準(zhǔn),而不是用那些有明顯缺陷、象玩游戲一樣的方法?
我能想到唯一相對公平的評判一個侯選人的方式就是問幾個關(guān)鍵問題:這個人的責(zé)任是什么?他是怎么完成任務(wù)的?他工作上需要什么樣的幫助?
我們先從定義我們的情況開始了。當(dāng)我們總結(jié)了 Frontside 的工作環(huán)境特征后,事情就開始變得清晰:
公司很小,所以每個人都要肩負多種責(zé)任,承擔(dān)多種角色,并且要從頭到尾的跟進解決問題。在我們這臺機器上沒有居中的傳動齒輪。
我們依賴并打造內(nèi)部社區(qū)的力量,以及我們參與的外部社區(qū),尤其是開源界。
我們在技術(shù)目標(biāo)和代碼可維護性可用性上追求極致。
于是團隊成員的責(zé)任就非容易確定了:
- 可以為隊友及客戶提供清晰專業(yè)的技術(shù)和項目指導(dǎo)。
所有這些責(zé)任構(gòu)成了我們評估資歷的標(biāo)準(zhǔn)基礎(chǔ)。
聯(lián)體三角形:簡單的解釋
我恰好最近有機會與好幾家不同規(guī)模公司的負責(zé)人討論了“高級”的定義,大家意見的共同點只有一個。
大家最簡單的關(guān)于資歷的共同解釋就是:這個人需要多少指導(dǎo)?這個人能給別人提供多少指導(dǎo)?
我贊成這個“高級程序員的組合三角形”是一個不錯的主意,可以簡明的表達出內(nèi)在含義,就象 Action Jack 的“成功的組合三角形”一樣。
但即使這樣的標(biāo)準(zhǔn)也是非常容易引入偏見的。它缺少一些重要的標(biāo)準(zhǔn),并且過度強調(diào)了口碑這類容易見到的東西,以及解釋深奧的計算機術(shù)語的能力。
在會上我們討論出了一個新的框架
會上的熱烈討論有了一個非常酷的結(jié)果。在我試圖灌輸上面的三角形理論時,另一位員工提出了一個嶄新的心理模形,吸引了大家的注意力。
她把我們在 Frontside 確定資歷的方法描繪成了一個文氏圖(用閉合的區(qū)域表示集合的圖示法)。三個集合分別是:這個人有多強的獨立工作能力及領(lǐng)導(dǎo)力?這個人技術(shù)實力如何?這個人和外部環(huán)境關(guān)系如何、有多大貢獻?
文氏圖:更復(fù)雜的解釋
在上文中我們已經(jīng)把對資歷的評估方法提升到了更高境界:“這個人需要多少指導(dǎo)?這個人可以給其他人提供多少指導(dǎo)?”但正像我們的員工指出來的,如果到此為止的話,還會有非常多令人困惑的地方。
那我們該怎樣定義一位候選人到底能把他的本職工作做得多好?我們怎樣能把評判標(biāo)準(zhǔn)引向一些具體的方面,而千萬不要變成數(shù)學(xué)公式?
我們最終按照候選人要做的事總結(jié)出了三方面:技術(shù)能力、領(lǐng)導(dǎo)力和交際能力,并細化提煉出了 12 個特質(zhì)。我將在下一篇文章中詳細闡述這 12 個特質(zhì),但現(xiàn)在我可以簡單說說。
三大方面
技術(shù)能力(Technical capability):技術(shù)能力強的人通常都對技術(shù)有濃厚興趣,他們會不斷鉆研決不放棄,最終會做出可供經(jīng)驗不足的工程師使用、維護和學(xué)習(xí)的解決方案。
領(lǐng)導(dǎo)力(Leadership):有領(lǐng)導(dǎo)力的人知道怎樣為自己及別人發(fā)展并保持一種目的感。他們會指出公司里及自己職業(yè)生涯中出現(xiàn)的問題,并且攬到自己身上最終解決掉。
交際能力(Community/Connectedness):交際能力強的人非常希望自己成為一個大集體中的一員,有非常強的奉獻意識,身上有別人(同事、客戶等)無法輕易描述的個人魅力,并且存在感非常強,生活充實快樂。
“對文化的適應(yīng)能力”怎么樣
我們最初差點把交際能力叫做“對文化的適應(yīng)能力”了,但我非常懷疑這個定義實際上是個扼殺思想的陳詞濫調(diào)。“對文化的適應(yīng)能力”就是一個萬金油,所有你想在程序員身上見到的可你又說不出來的東西都可以用它往上套,而且這里面也非常容易藏入偏見。
當(dāng)我們定義好了可以讓 Frontside 的文化一致的標(biāo)準(zhǔn)之后,上面的觀點就定義成了交際能力。
在三個不同方面衡量資質(zhì)
還記得那三個方面嗎?技術(shù)能力、領(lǐng)導(dǎo)力和交際能力,每個方面都有自己的從初級到高級的發(fā)展路線。
現(xiàn)在人們換職業(yè)都不是什么新鮮事了。很容易見到那些有很強領(lǐng)導(dǎo)力和交際能力但剛參加完代碼訓(xùn)練營的人,他們的技術(shù)水平就只能被認(rèn)為是一般。相反,一個經(jīng)驗豐富又受過正規(guī)培訓(xùn)的技術(shù)人員卻有可能缺乏領(lǐng)導(dǎo)力和交際能力。
很少有人真的能在三方面都能達到高級水平,事實上也很少有人真的想在三方面都成為高級。我們 Frontside 把資質(zhì)定義為這些方面的混合體,并努力幫助人們在他們想提高的方面獲得進步。
證據(jù):唯一能得到的衡量依據(jù)
衡量每個方面的資質(zhì)都需要證據(jù)。如果你已經(jīng)做了一些工作,那你手上應(yīng)該已經(jīng)有了一些證據(jù)。
我們將在下一篇文章中討論這 12 個特質(zhì),每一個都有詳細的標(biāo)準(zhǔn),可以讓候選人提供證據(jù)來說明他們經(jīng)過時間的積累的確具有這些特質(zhì)并且經(jīng)驗豐富。
但總的來說,如果在某個方面有一兩項特別擅長和精通的特質(zhì)的話,就可以認(rèn)為他在那個方面是高級了。
比方說,假如某個人告訴你他的代碼用好幾種語言實現(xiàn)過,那在“技術(shù)好奇心”這個特質(zhì)上就可以得高分了。如果他還會非常嚴(yán)謹(jǐn)?shù)臑轫椖康暮诵拇a寫出全面、高質(zhì)量的測試用例并用于持續(xù)集成,你就差不多可以認(rèn)為他在技術(shù)能力上達到了高級水平。
或者如果某個人經(jīng)常輔導(dǎo)別人、組織聚會,或者會做一些讓大家過得更輕松的事,那我們就差不多可以在交際能力這方面給他打高分。
如果某個人曾經(jīng)帶過幾個團隊,那他就應(yīng)該已經(jīng)掌握了帶團隊的技巧。再加上挖掘問題根本原因的能力,那你就可以認(rèn)為他在領(lǐng)導(dǎo)力的方向上達到高級了。
我們怎么定義“高級”
我們的衡量標(biāo)準(zhǔn)是如果某個人在技術(shù)能力上達到高級水平,他在領(lǐng)導(dǎo)力或交際能力中有一方面也能達到高級水平,我們就認(rèn)為他是高級程序員了。如果他還想繼續(xù)提高剩下的一方面,我們愿意提供幫助。
如果他是在領(lǐng)導(dǎo)力和交際能力都能達到高級水平,在技術(shù)方面能屬于中高級的話,我們也認(rèn)為是高級程序員。
舉個一年前發(fā)生過的真實例子,我們雇傭了一個初級程序員,因為據(jù)我們評估,起碼在最初的六個月中他需要非常多的指導(dǎo)。
到了第六個月,他的技術(shù)水平就已經(jīng)達到中級了。到第一年結(jié)束時他就已經(jīng)達到了高級水平。我敢這么說的原因是我們知道如果他離職,我們需要雇傭一個高級程序員來頂替他。
這樣的事情為什么能發(fā)生?因為他是在我們公司起步的,而當(dāng)時他已經(jīng)在交際能力和領(lǐng)導(dǎo)力方面都可以達到高級水平了。所以他要在我們團隊中做高級程序員的工作只是需要提高技術(shù)能力而已。
只看技術(shù)水平并不夠
對于技術(shù)水平高但在領(lǐng)導(dǎo)力和交際能力方面都缺乏經(jīng)驗的人,不能直說“在我們這里你達不到高級程序員的標(biāo)準(zhǔn)”,這話太刺耳了。但對于他在團隊中能承擔(dān)的責(zé)任來說,我們可以暫時評訂為中級,等他把另一方面或者兩方面都提高了之后,我們再把他提升為高級。
很多公司只根據(jù)技術(shù)水平來做判斷,但這樣對于我們這種小型的而且非常依賴合作模式工作的公司來說行不通。其實我非常擔(dān)心那些只衡量技術(shù)能力的公司是認(rèn)可“孤獨的天才開發(fā)者”這樣的危險想法的,覺得一個人技術(shù)水平高,就想當(dāng)然的認(rèn)為領(lǐng)導(dǎo)力和交際能力也很好。
在大公司中每個人都只負責(zé)一小部分工作,我非常樂于見到他們分享對于“高級程序員”的定義,那應(yīng)該會在技術(shù)和非技術(shù)的方面都更加全面,讓我們工作得效率更高,尤其是在需要與客戶打交道的團隊里。
成為高級需要多久?
“高級程序員”是不是就意味著“若干年的經(jīng)驗”?事實上我并沒有看到過哪個人不用五年就可以成為高級程序員的。要在很短的時間內(nèi)就把一些特質(zhì)發(fā)展得非常好來在某一方面達到高級水平其實是非常困難、甚至不可能的,更別說在多個方面全部成為高級了。
而且“五年經(jīng)驗”并不一定要意味著“五年的軟件開發(fā)經(jīng)驗”。如果一個人已經(jīng)在領(lǐng)導(dǎo)力和(或)交際能力上滿足了條件,那他只需要提升技術(shù)能力,就已經(jīng)可以發(fā)揮高級程序員的作用了。
我們招聘的“秘密武器”很大程度上源于我們觀察到的事實:對于具有領(lǐng)導(dǎo)力和交際能力的人來說,要再提升技術(shù)能力并不需要很多時間,反之則不然。我見過很多這樣的人,從代碼集訓(xùn)營中出來兩三年后就已經(jīng)成了非常好的高級程序員。
更多要討論的
這篇文章留下了非常多未能回答的問題。我們在這三個方面是用什么具體方法來評估候選人的能力和特質(zhì)的?在面試前和面試中該怎么衡量呢?該如何把這些評估結(jié)果與一些具體的東西聯(lián)系起來,比如工資?
這個框架又如何應(yīng)用于非高級程序員?程序員們該什么時候升級?怎么升級?初級、中級和高級之間的區(qū)別是什么?它們之間差了些什么?這些詞會不會實際上毫無意義而該被替換掉?
最后,如果真的可以的話,這個框架該如何應(yīng)用于其他與 Frontside 有著非常大的文化和需求差異的公司?
在下一篇文章中我們會詳細回答這些問題。
告別直覺
定義“高級”是一個仍在進行中的而且出乎人意料困難的過程,但我們還是要做這件事,因為它對我們非常重要。如果不能給“高級程序員”下一個清晰的定義,我們就迷失了培養(yǎng)員工的方向,就沒有具體的辦法來衡量要加入我們團隊的人,也沒有辦法讓員工相信我們可以信賴,更沒辦法來改進流程。
這個行業(yè)已經(jīng)應(yīng)該告別“我一見到這個人我就知道他是個高級程序員”這樣下結(jié)論的年代了,我們該向著一些我們可以定義和分享的東西努力。讓我們一起把開源的思路帶到我們雇傭和發(fā)展員工上吧。
希望我能在下一篇文章中把留下的主要問題都解釋清楚。如果你對文中內(nèi)容有問題或者不同想法,你可以在 Twitter(@tehviking)上找我,或者更好的方式是,你也把你的想法寫出來,我會在我的文章里鏈接過去。
總結(jié)
以上是生活随笔為你收集整理的怎样才能叫高级程序员?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows系统开机自动运行程序和自动
- 下一篇: ShowWindow与UpdateWin