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