隨着互聯網和移動互聯網的快速發展,各種應用軟件(app)如雨後春筍般涌現,許多應用程序甚至成爲超級app,一些活躍用戶過億的應用程序成爲國民app,這些app的興起與程序員這個羣體密不可分。快速發展的行業、互聯網巨頭的光環、國民級的應用程序帶來的成就感、遠超出普通行業的薪水,每一年都在吸引着大量的程序員。競爭變得愈來愈激烈,程序員的35歲門檻已常年成爲社交媒體熱議的話題,程序員的中年焦慮已成爲常態,做爲程序員,咱們應該創建怎樣的核心能力,讓使本身擺脫焦慮並在漫長的職場道路上不掉隊呢?前端
今天就來聊一聊我在十多年的程序員生涯中總結出的一點感悟。java
從基礎到高級,我將從三個方面進行歸納:通用能力、專業能力和進階能力。程序員
通用能力是做爲一個職場人員都須要具有的基礎能力。
通用能力包括學習能力、溝通能力、執行力。算法
在互聯網行業,技術突飛猛進,而且不斷升級;3G和4G在10年內逐漸普及,5G也即將踏浪而至,隨之帶來對IT相關技術要求也愈來愈高。從咱們天天在使用的編程語言、技術框架等,到更復雜的通訊協議、音視頻編解碼、網絡數據傳輸等等,各項技術都在持續的更新與進步。做爲一個程序員,咱們還會在不一樣的子行業、公司之間展轉,接觸不一樣的業務和產品,快速學習和理解不一樣業務及產品背後的邏輯和本質,是一項必備的素質。這些都要求至少及格往上的學習能力,不斷的學習、研磨技術,豐富自身技能,以適應時代的快速變化帶來的技術更新和挑戰。spring
做爲程序員,大部分時間是和機器在打交道,但並不意味着程序員就能夠和外界徹底隔離,良好的溝通技巧,可以讓工做事半功倍。許多程序員會排斥與人溝通,老是但願經過代碼、作出來的產品來展現和表達本身,在某些時候也許行的通;但在大部分工做中,咱們仍是要與其餘人溝通與交流,好比需求評審須要和產品同窗溝通,bug須要和測試人員溝通,即便是代碼也須要作出良好的技術架構設計,經過文字、圖形或語言表達出來。溝通首先須要具有溝通意願。數據庫
其次要掌握好溝通技巧,學會換位思考,避免無謂的衝突。隨着90後、千禧一代邁入職場,社會也愈來愈包容倡導多元、自由的文化,這帶來的一個問題是愈來愈多的人會走向自我、封閉甚至極端,直接的體現是他們在社交、職場上與人溝通常常出現衝突,團隊合做愈發困難。所以掌握良好的溝通技巧,學會共情也是溝通能力的一種體現。編程
任何一個團隊和組織,都會在目標明確後要求每一個人可以盡心盡力,徹徹底底的執行既定的計劃,高質量高效率的完成任務,所以良好的執行力也是程序員在一個團隊中必備的基礎能力。後端
以上是做爲程序員在職場中所須要具有的幾項基礎能力。除此以外,我認爲程序員還須要構建如下幾項專業能力。設計模式
專業能力是程序員可以進入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人小組的組長,有些人會帶領幾十人甚至上百人的團隊,不排除有一心只想寫程序而拒絕走上管理崗位的同窗,但這並不意味着不須要關注團隊管理能力的提高。每個人都是團隊管理的參與者和受影響者,經過良好的團隊管理能力發揮出團隊的價值,可以讓程序員的工做更有意義。
團隊管理能力的建設包括管理方法論的沉澱和管理動做的落地,這兩個方面相輔相成,互相促進。
管理方法論的沉澱,第一須要進行領導力的培養。領導力應該成爲你管理團隊的指導思想。
不一樣的企業組織會構建本身的領導力模型。在我曾經學習和實踐過的一種領導力模型中,把領導力按照三個維度六個領域進行了解釋,這裏作下分享。
領導力模型示意圖
領導力主要目標是爲了組織協同,發揮團隊的力量以達成績效結果。領導力須要關注哪些方面呢?
1,管理者須要理解公司戰略和方向,根據公司戰略和方向制定團隊的目標。任何組織都須要明確的方向指引。當年成爲團隊管理者後,對於你所在的公司,既須要去理解公司遠期的目標咱們稱之爲願景,還要理解公司的近期目標;用公司願景指導團隊長期努力的方向,按照公司近期目標分解並制定本身團隊的短時間目標,來指導團隊接下來半年度、季度或月度的工做。咱們能夠藉助不一樣的目標管理方式如OKR等來管理團隊的目標。
2,須要作好良好的激勵措施。激勵可以讓團隊成員產生更強的工做動力。短時間的激勵能夠經過平常工做中的獎勵、表揚或稱讚來實現,而長期的激勵還須要經過對團隊成員預期的管理和工做受權來實現。
3,須要作好團隊成員的指導工做。經過對團隊成員平常的輔導提供指導和幫助,經過樹立典範來指明團隊成員將來所須要學習的目標員工畫像。領導力最終經過行動計劃來落地,而不能只停留在口號和文字總結中,這將在後面進行解釋。
領導力是一個很大的課題,每一個感興趣的人均可以去深刻研究,找到和創建適合本身的領導力模型。
第二,有了領導力模型的指導,咱們還須要作好團隊人才盤點和梯隊建設,識別團隊中的明星、潛力、骨幹和後進人員,在作到對團隊人員瞭如指掌的同時,經過目標和績效促進團隊成員不斷提高和進步。
第三,作好團隊流程與機制沉澱。一個團隊可以高效的運轉下去,須要依賴合理的流程和機制。關於這一點,我曾經看到過一個很精煉的總結:將複雜的的事情簡單化,將簡單的事情標準化,將標準的事情流程化,將流程的事情自動化。它闡述的道理便是不斷的作流程、機制的沉澱,最終可以實現效率的極大化。
第四,須要作好向上管理。瞭解你的上級對你和團隊的預期,懂得經過上級協調資源尋求幫助,同時可以站在上級的角度考慮問題,替上級分擔解憂。
最後,創建有特點的團隊氛圍和團隊文化。一個好的團隊與良好的團隊氛圍和團隊文化密不可分,團隊文化也可以吸引和過濾志同道合的人一塊兒,促進團隊氛圍的不斷髮展。
有了管理方法論的沉澱,並不意味着必定可以作好管理,如何在平常的工做中經過管理動做的落地去影響團隊更爲重要。
咱們須要針對工做中的每個環境和每一個動做細化管理方法和管理手段。
例如,年度、季度、月度的目標設定和按期的覆盤,提高團隊人員的目標感和團隊凝聚力。按期的one-one溝通,瞭解團隊人員的想法和困惑,給予他們輔導和幫助。組織項目和需求迭代的覆盤總結,發現需求迭代過程當中的問題,找到流程能夠優化的點並造成可複製可複用的方法論。按期的團隊績效覆盤和團隊成員績效反饋,讓你們知道如何提高改進。組織團隊技術分享,參與行業的技術交流構建團隊和我的技術影響力,打造團隊的極客文化等等。
在管理動做的落地的過程當中,經過實踐得來的知識,又能夠豐富管理手段和管理工具箱,進而總結成新的管理方法論,指導下一階段的團隊管理工做。
組織協調能力和項目管理能力既有類似處,又有差別。類似的地方在於它們都強調團隊合做的重要性,注重經過團隊的力量達成既定目標。不一樣的地方是,項目管理能力更強調項目,一切圍繞項目的目標去努力。而組織協調能力強調的是組織和人,相比項目管理能力,組織協調能力是更高的一個層級。當你在組織協調能力上具有必定的積累後,任何項目或任務將再也不是問題。組織協調能力須要你瞭解組織及組織的部門、人員,快速識別關鍵人物和核心目標,創建本身在組織內的鏈接,提高本身在組織內的影響力。能夠很好的理解和傾聽他人,產生共鳴和共情。當你須要完成一項任務時,發揮自身的組織協調能力優點,把握關鍵點,找到關鍵人,成功也就隨之而來。
技術自己不產生價值,只有將技術應用到業務和產品中,經過產品解決用戶的需求才能產生價值。做爲掌握技術的程序員,站在業務的角度去思考問題,解決業務的痛點永遠是第一位的。程序員不能僅僅知足於被動的完成業務需求,更須要經過主動對業務的理解和思考,洞察業務的核心和本質,把業務問題轉化爲技術問題。在業務的開始階段,快速的構建MVP版本產品,支撐業務發展,在業務步入高速發展或穩定階段,經過不斷的抽象、模塊化,打造服務化、平臺化的技術體系,支撐業務的規模化擴張,讓技術真正發揮出支撐業務甚至驅動業務的轉型。最後,經過一幅圖對以上的解釋作個總結。
程序員能力金字塔
北哥經過多年的實踐經驗證實,程序員的這些核心能力在工做中相互交織而又層層遞進,天天咱們都在使用、學習和積累這些能力。經過在工做中不斷的總結和回顧,接受項目和產品的歷練,相信每個人均可以突破自我,邁上新的臺階。
固然程序員的核心能力在不一樣人的眼中會有不一樣,正如一百個讀者眼中就有一百個哈姆雷特。重要的是每一個人在工做中不斷總結,找到適合本身的能力圈。
若是你對程序員的核心能力圈有新的認識或不一樣的見解,也歡迎與我聯繫交流。
我是程序員北哥,一個資深程序員,架構師,團隊管理者。前後經歷過程序員、技術經理、架構師、技術專家和團隊技術總監等多個身份變化,也經歷過數個產品從0到1的打造。
在這裏會分享個人一些工做經歷、思考和總結。偶爾也會發發感悟、隨想和讀書筆記。但願這些能對您有所啓發。
歡迎關注公衆號:程序員北哥。