聊聊程序員的核心能力

隨着互聯網和移動互聯網的快速發展,各類應用軟件(app)如雨後春筍般湧現,許多應用程序甚至成爲超級app,一些活躍用戶過億的應用程序成爲國民app,這些app的興起與程序員這個羣體密不可分。快速發展的行業、互聯網巨頭的光環、國民級的應用程序帶來的成就感、遠超出普通行業的薪水,每年都在吸引着大量的程序員。競爭變得越來越激烈,程序員的35歲門檻已常年成爲社交媒體熱議的話題,程序員的中年焦慮已成爲常態,作爲程序員,我們應該建立怎樣的核心能力,讓使自己擺脫焦慮並在漫長的職場道路上不掉隊呢?

今天就來聊一聊我在十多年的程序員生涯中總結出的一點感悟。

從基礎到高級,我將從三個方面進行概括:通用能力、專業能力和進階能力。

01通用能力
通用能力是作爲一個職場人員都需要具備的基礎能力。
通用能力包括學習能力、溝通能力、執行力。
  • 學習能力
在互聯網行業,技術日新月異,並且不斷升級;3G和4G在10年內逐漸普及,5G也即將踏浪而至,隨之帶來對IT相關技術要求也越來越高。從我們每天在使用的編程語言、技術框架等,到更復雜的通信協議、音視頻編解碼、網絡數據傳輸等等,各項技術都在持續的更新與進步。作爲一個程序員,我們還會在不同的子行業、公司之間輾轉,接觸不同的業務和產品,快速學習和理解不同業務及產品背後的邏輯和本質,是一項必備的素質。這些都要求至少及格往上的學習能力,不斷的學習、研磨技術,豐富自身技能,以適應時代的快速變化帶來的技術更新和挑戰。
  • 溝通能力
作爲程序員,大部分時間是和機器在打交道,但並不意味着程序員就可以和外界完全隔離,良好的溝通技巧,能夠讓工作事半功倍。許多程序員會排斥與人溝通,總是希望通過代碼、做出來的產品來展示和表達自己,在某些時候也許行的通;但在大部分工作中,我們還是要與其他人溝通與交流,比如需求評審需要和產品同學溝通,bug需要和測試人員溝通,即使是代碼也需要做出良好的技術架構設計,通過文字、圖形或語言表達出來。溝通首先需要具備溝通意願。其次要掌握好溝通技巧,學會換位思考,避免無謂的衝突。隨着90後、千禧一代邁入職場,社會也越來越包容倡導多元、自由的文化,這帶來的一個問題是越來越多的人會走向自我、封閉甚至極端,直接的體現是他們在社交、職場上與人溝通經常出現衝突,團隊合作愈發困難。因此掌握良好的溝通技巧,學會共情也是溝通能力的一種體現。
  • 執行力
任何一個團隊和組織,都會在目標明確後要求每個人能夠全力以赴,不折不扣的執行既定的計劃,高質量高效率的完成任務,因此良好的執行力也是程序員在一個團隊中必備的基礎能力。
以上是作爲程序員在職場中所需要具備的幾項基礎能力。除此之外,我認爲程序員還需要構建以下幾項專業能力。
02專業能力
專業能力是程序員能夠進入IT行業從事軟件開發的關鍵。專業能力的不同也意味着可以達到不同的職業高度。
專業能力包括基本的技術能力、架構設計能力和項目管理能力。
  • 基本的技術能力
基本的技術能力是一個程序員在工作中賴以生存的基礎。
對於一個java程序員,需要深入的理解java的語法知識、jvm的原理和調優、java的高級特性等等;需要了解常見的數據結構和算法;需要熟悉主流的應用框架,如spring、spring cloud、spring boot等;需要對常見的中間件有實踐經驗,如緩存、消息隊列、NoSQL數據庫等等;另外還需要對數據庫、運維等領域技術有一定的研究。如果能夠對基本的技術能力有了較深入的掌握,基本就可以拿到一份工作的offer。
  • 架構設計能力
架構設計能力是一個程序員突破自我所需要邁過的第一個坎。技術、框架不斷更新進步帶來的一個新的問題是,許多程序員在日常工作中通過簡單的複製粘貼,已經可以完成大部分工作,也有一個名詞叫“Crud Boy”,泛指那些每天最多做的事情就是簡單的增刪改查的程序員。重複的複製粘貼或Crud讓程序員的思維逐步退化,不願意思考,隨着時間的推移面臨被淘汰的困局。如果在工作中,能夠多思考總結,逐步積累起架構設計能力,那結果可能是另外一種境遇。
架構設計能力首先包括最簡單的設計模式。在寫代碼的時候,是否考慮過對代碼進行有效的組織,按照GoF所倡導的23種設計模型進行重構,讓代碼更易讀、易維護,這些都是架構設計能力的體現。
其次需要掌握對系統進行分層設計的思想。前後端分離,表現層、控制層、模型層各司其職,無論你是從事後端開發還是前端開發,觀察那些主流的框架如springMVC、Vue等,無不在告訴我們分層設計的重要性。同樣當你在設計一個大用戶量產品的系統架構,有必要將系統合理的劃分爲接入層、接口轉發層、服務控制層、服務執行層、緩存層、數據訪問層等。
再次,對於具有高併發大流量的系統,還需要掌握如何做服務劃分和模塊拆分,識別領域邊界,做到高耦合低內聚的同時支持水平擴展和垂直擴展。這個時候需要對分佈式服務、微服務、RPC、數據庫分庫分表等技術有更深入的研究。

一個簡單的系統分層架構圖
最後,還要了解一些容災備份解決方案。當應用系統所在機房或雲存儲網絡故障了怎麼辦?當數據庫數據被誤刪了怎麼辦?當某些區域發生了不可抗力的自然災害又該如何應對?這些都是在系統的訪問量級、用戶量級、數據量級等達到一定規模後必須要考慮到的點。
架構設計能力可以再不斷的細分和擴展,例如隨着抖音、快手等視屏和直播類應用的崛起,對於超大流量下的視頻、圖形圖像類系統架構如何設計,隨着5G和AIoT時代的到來,如何設計系統來支撐大規模和超大規模的物聯網硬件終端接入及其產生的數據等等。
以上這些架構設計能力在每一個維度都有可以深入研究挖掘的技術點,如果你有時間並且希望不斷突破,應該深入到每一個領域中去,通過不斷研究和實踐積累經驗,直到有一天你能夠根據不同的業務、應用場景、用戶等,自己設計出一套合理的架構。
  • 項目管理能力
專業能力中的另外一項是項目管理能力。項目管理能力是一項綜合能力。
許多人對項目管理能力都有誤解,認爲它是一項很簡單的能力,或者不認爲是程序員所需要具備的核心能力。在一些互聯網大廠,也有專門的項目管理人員或類似PMO的組織去推動和完成項目管理工作,但這不意味着對於一個程序員就不需要掌握項目管理能力。
項目管理是任何一個組織能夠完成產品、項目成功上線,都必須要做好的一件事。對於一個程序員來說,能否主導或負責完成一箇中大型項目的項目管理工作或者在項目的某一個細分領域完成項目相關的管理工作,更是綜合能力的體現。最近幾年,無論是百度、快手的春晚營銷技術支撐團隊,還是京東、淘寶每年雙十一的技術保障支撐團隊,無不是大規模、跨團隊、跨地域的大型項目,在這些項目中,從上到下都需要各個不同領域、不同組織、橫向、縱向的項目管理人員,而這些項目管理人員往往都是資深的程序員、技術專家成長起來的。他們需要對項目的目標、戰略意義理解的很透徹,組織做好項目細分的目標對齊、任務分解和計劃落地,協調項目的各項資源突破各項技術瓶頸和項目難點,做好項目的風險管理,同時統籌兼顧做好項目組的氛圍,形成項目組的團隊合力,最終爲項目的目標達成負責。
如果你已經具備和掌握了上述所有這些專業技能,則可以從一個程序員菜鳥成長爲技術專家,大部分工作中遇到的技術問題已經可以自行研究解決。如果這時你仍不滿足想進一步提升自己,就需要修煉以下幾項進階能力。

03進階能力‍
進階能力是程序員能夠邁入更高層級突破職場天花板的必要條件。
進階能力包括技術的廣度、系統化的思考能力、團隊管理能力、組織協調能力和業務理解能力。
  • 技術的廣度
每個人的精力和時間都是有限的,當我們對自己專業領域有足夠深入的瞭解時,我們還需要拓展自己的知識。作爲程序員,除了要完成架構設計和編碼之外,還會接觸到更專業的技術領域,例如安全、大數據、算法和AI等。一方面,擴展這些專業技術領域可以促進對程序員所具備的基本專業技能更深刻理解,同時也可以獲得其它技術領域的新知識和突破點。
  • 系統化的思考能力
在具備一定的知識深度和廣度後,從單純的某一項具體技術細節中跳出來,做系統化的思考和總結,以領域視野、全局角度,舉一反三,梳理和建立自己的技術知識體系,形成自己的解決問題的方法論。當具備系統化的思考能力,技術或知識猶如滾雪球一般,快速識別、提取、學習、積累,循環往復,建立一套不斷更新迭代的技術知識體系,無論市場、業務、技術如何變化已經可以及時的適應,甚至抓住新技術紅利,去引領新技術的發展。
  • 團隊管理能力
當程序員成長到一定階段,必然會面臨着成爲管理者的可能。有些人會成爲一個3到5人小組的組長,有些人會帶領幾十人甚至上百人的團隊,不排除有一心只想寫程序而拒絕走上管理崗位的同學,但這並不意味着不需要關注團隊管理能力的提升。每一個人都是團隊管理的參與者和受影響者,通過良好的團隊管理能力發揮出團隊的價值,能夠讓程序員的工作更有意義。
團隊管理能力的建設包括管理方法論的沉澱和管理動作的落地,這兩個方面相輔相成,互相促進。
管理方法論的沉澱首先需要進行領導力的培養。領導力應該成爲你管理團隊的指導思想。
不同的企業組織會構建自己的領導力模型。在我曾經學習和實踐過的一種領導力模型中,把領導力按照三個維度六個領域進行了解釋,這裏做下分享。

領導力模型示意圖
領導力主要目標是爲了組織協同,發揮團隊的力量以達成績效結果。
首先,管理者需要理解公司戰略和方向,根據公司戰略和方向制定團隊的目標。任何組織都需要明確的方向指引。當年成爲團隊管理者後,對於你所在的公司,既需要去理解公司遠期的目標我們稱之爲願景,還要理解公司的近期目標;用公司願景指導團隊長期努力的方向,按照公司近期目標分解並制定自己團隊的短期目標,來指導團隊接下來半年度、季度或月度的工作。我們可以藉助不同的目標管理方式如OKR等來管理團隊的目標。
其次,需要做好良好的激勵措施。激勵能夠讓團隊成員產生更強的工作動力。短期的激勵可以通過日常工作中的獎勵、表揚或稱讚來實現,而長期的激勵還需要通過對團隊成員預期的管理和工作授權來實現。
最後,需要做好團隊成員的指導工作。通過對團隊成員日常的輔導提供指導和幫助,通過樹立典範來指明團隊成員未來所需要學習的目標員工畫像。
領導力最終通過行動計劃來落地,而不能只停留在口號和文字總結中,這將在後面進行解釋。
領導力是一個很大的課題,每個感興趣的人都可以去深入研究,找到和建立適合自己的領導力模型。
有了領導力模型的指導,我們還需要做好團隊人才盤點和梯隊建設,識別團隊中的明星、潛力、骨幹和後進人員,在做到對團隊人員瞭如指掌的同時,通過目標和績效促進團隊成員不斷提升和進步。
第三,做好團隊流程與機制沉澱。一個團隊能夠高效的運轉下去,需要依賴合理的流程和機制。關於這一點,我曾經看到過一個很精煉的總結:將複雜的的事情簡單化,將簡單的事情標準化,將標準的事情流程化,將流程的事情自動化。它闡述的道理即是不斷的做流程、機制的沉澱,最終能夠實現效率的極大化。
第四,需要做好向上管理。瞭解你的上級對你和團隊的預期,懂得通過上級協調資源尋求幫助,同時能夠站在上級的角度考慮問題,替上級分擔解憂。
最後,建立有特色的團隊氛圍和團隊文化。一個好的團隊與良好的團隊氛圍和團隊文化密不可分,團隊文化也能夠吸引和過濾志同道合的人一起,促進團隊氛圍的不斷髮展。
有了管理方法論的沉澱,並不意味着一定能夠做好管理,如何在日常的工作中通過管理動作的落地去影響團隊更爲重要。我們需要針對工作中的每一個環境和每個動作細化管理方法和管理手段。
例如,年度、季度、月度的目標設定和定期的覆盤,提升團隊人員的目標感和團隊凝聚力。定期的one-one溝通,瞭解團隊人員的想法和困惑,給予他們輔導和幫助。組織項目和需求迭代的覆盤總結,發現需求迭代過程中的問題,找到流程可以優化的點並形成可複製可複用的方法論。定期的團隊績效覆盤和團隊成員績效反饋,讓大家知道如何提升改進。組織團隊技術分享,參與行業的技術交流構建團隊和個人技術影響力,打造團隊的極客文化等等。
在管理動作的落地的過程中,通過實踐得來的知識,又可以豐富管理手段和管理工具箱,進而總結成新的管理方法論,指導下一階段的團隊管理工作。
  • 組織協調能力
組織協調能力和項目管理能力既有相似處,又有差異。相似的地方在於它們都強調團隊合作的重要性,注重通過團隊的力量達成既定目標。不同的地方是,項目管理能力更強調項目,一切圍繞項目的目標去努力。而組織協調能力強調的是組織和人,相比項目管理能力,組織協調能力是更高的一個層級。當你在組織協調能力上具備一定的積累後,任何項目或任務將不再是問題。組織協調能力需要你瞭解組織及組織的部門、人員,快速識別關鍵人物和核心目標,建立自己在組織內的連接,提升自己在組織內的影響力。可以很好的理解和傾聽他人,產生共鳴和共情。當你需要完成一項任務時,發揮自身的組織協調能力優勢,把握關鍵點,找到關鍵人,成功也就隨之而來。
  • 業務理解能力
技術本身不產生價值,只有將技術應用到業務和產品中,通過產品解決用戶的需求才能產生價值。作爲掌握技術的程序員,站在業務的角度去思考問題,解決業務的痛點永遠是第一位的。程序員不能僅僅滿足於被動的完成業務需求,更需要通過主動對業務的理解和思考,洞察業務的核心和本質,把業務問題轉化爲技術問題。在業務的開始階段,快速的構建MVP版本產品,支撐業務發展,在業務步入高速發展或穩定階段,通過不斷的抽象、模塊化,打造服務化、平臺化的技術體系,支撐業務的規模化擴張,讓技術真正發揮出支撐業務甚至驅動業務的轉型。
最後,通過一幅圖對以上的解釋做個總結。

程序員能力金字塔
北哥通過多年的實踐經驗證明,程序員的這些核心能力在工作中相互交織而又層層遞進,每天我們都在使用、學習和積累這些能力。通過在工作中不斷的總結和回顧,接受項目和產品的歷練,相信每一個人都可以突破自我,邁上新的臺階。
當然程序員的核心能力在不同人的眼中會有不同,正如一百個讀者眼中就有一百個哈姆雷特。重要的是每個人在工作中不斷總結,找到適合自己的能力圈。
如果你對程序員的核心能力圈有新的認識或不同的看法,也歡迎與我聯繫交流。

本文分享自微信公衆號 - 大數據實戰演練(gh_f942bfc92d26)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章