小鋼聊全棧

Keegan小鋼發表於2019-02-21

原創文章,轉載請註明:轉載自Keegan小鋼
並標明原文連結:http://keeganlee.me/post/full-stack/20170826
微信訂閱號:keeganlee_me
寫於2017-08-26


全棧正在變得越來越流行,很多人都有意願或正在往全棧的方向去發展。我自己也一直在往這個方向不斷提升自己,到目前為止,算是略有小成,勉強稱得上是一個合格的全棧架構師。為了給更多走在全棧路上的小夥伴們提供一些思路,我將基於我自己這些年來的經驗總結和思考,以及從其他更優秀的人(比如吳軍)學習得來的感悟,與大夥分享我對全棧的一些觀點。我主要將從三方面來聊聊全棧的問題:

  1. What?什麼是全棧?
  2. Why?為什麼要發展全棧?
  3. How?如何發展全棧?

什麼是全棧

對全棧的定義,據我所瞭解的,最早來源於Facebook的工程師Calos Bueno在2010年底時寫的一篇文章:The Full Stack。作者認為全棧是一個通才,能夠自己建立不平凡的應用程式。他也指出,沒人能夠熟悉所有方方面面,但作為一個全棧,能夠看清每個棧的上下之間是如何運作的。他還提出視覺化一個系統的方案:One way to visualize a system is how its data is shaped and how it flows.

百度百科收錄的定義則是:掌握多種技能,並能利用多種技能獨立完成產品的人。收錄的原文其實是這篇:全棧工程師到底有什麼用。本質上來說,和Calos Bueno的觀點大同小異。另外,也有越來越多人認為,全棧工程師 = 前端開發 + 後端開發。

對全棧工程師,每個人都有不一樣的定義,不一樣的衡量標準。要求高的,認為全棧=全能,需求分析、產品設計、UI設計、移動開發、前端開發、後端開發、運維等,全部都熟悉。要求低的,認為只要既懂前端開發也會後端開發即可,比如,熟悉H5前端開發和Node.js後端開發,就可以稱得上全棧工程師了。在我看來,其實都沒有錯,工程師也有分初級、高階、資深、專家,全棧工程師也一樣有等級劃分。

那麼,我們就從分級的角度來聊聊什麼是全棧。但我不想從傳統的初級、高階、資深、專家的角度來劃分,我想從另一個更高的視角來劃分全棧工程師。

吳軍在得到專欄《矽谷來信》的第054封信中,將工程師劃分為五級,如下:

第五級:能獨立解決問題,完成工程工作;
第四級:能指導和帶領其他人一同完成更有影響力的工作;
第三級:能獨立設計和實現產品,並且在市場上獲得成功;
第二級:能設計和實現別人不能做出的產品,也就是說他的作用很難取代;
第一級:開創一個產業。

從本質上來說,不同層級的工程師需要有能力獨立解決不同高度的問題。第五級只要有能力獨立解決技術任務即可,第四級則需要解決團隊問題,第三級需要解決產品問題,第二級需要解決行業問題,第一級則是最高階的產業問題了。需要注意的是,有能力獨立解決問題,不代表就不需要和別人協作。

全棧工程師屬於工程師的子集,同樣的,也適用這個五層級別的劃分。那麼,對於第五級的全棧工程師來說,就是有能力獨立解決跨棧的技術問題。第四級的全棧工程師,需要具備管理和領導能力,應該是一個全棧架構師。第三級則還需要掌握產品設計能力,有能力做出成功的產品。但這個產品會比以往復雜得多,如果不具備全棧技能,那就很難形成全域性性思維,更難以做出成功的產品。再往上還要深入瞭解行業和產業痛點,需要更高遠的前瞻效能力。

如果這樣劃分的話,那能夠獨立完成產品的全棧工程師應該屬於第三級和第四級之間,而只懂前端開發 + 後端開發的全棧工程師還不一定能達到第五級,因為懂了前端開發和後端開發並不意味著就有能力獨立解決問題。我面試過幾個既懂前端開發,也懂點後端開發的程式猿,但每個端其實都還達不到我要求的及格線,更談不上有能力獨立解決工作中的跨棧問題。

在我看來,一個合格的全棧工程師應該具備硬技能和軟技能。硬技能主要就是熟練掌握工作領域中的各種技術棧了,比如做移動應用的,那可能就要熟悉Android/iOS開發、Java開發、資料庫、運維等。更重要其實是軟技能,我覺得至少應該具備有以下能力:

  • 解決問題能力 —— 如果不能解決問題,要全棧工程師何用
  • 超強學習能力 —— 全棧需要快速掌握很多技能,所以必須具有超強的學習能力
  • 良好溝通能力 —— 全棧雖然有能力獨立解決問題,但在實際工作中還是需要和各種人員合作溝通,在團隊不同成員之間起到橋樑作用
  • 技能遷移能力 —— 全棧不會被某一領域綁死,技能可以快速遷移到其他領域,比如可以從移動網際網路遷移到物聯網、人工智慧或區塊鏈等新領域
  • 全域性思維能力 —— 全棧最大的價值就是擁有全域性思維能力

為什麼要發展全棧

發展全棧,不管是對公司還是個人,都大有益處。

對公司的益處,就舉個例子吧。假如在App端有時候會出現呼叫介面超時的問題。在沒有全棧工程師的團隊裡,一般的處理流程就是:Android或iOS開發人員在App端檢查確定不是前端的問題後,就把鍋丟給API閘道器,API閘道器開發人員檢查日誌後發現有部分服務的查詢介面沒能在超時時間內返回資料,各服務開發人員和前端、閘道器聯調後發現是資料庫查詢結果慢,就將鍋甩給了DBA,DBA經過一番排查之後發現資料庫存在很多慢查詢,最終定位到是因為很多SQL查詢語句沒有加索引。等這個問題解決,可能半天就過去了。而為了解決這個問題,至少投入了前端開發、API閘道器開發、後端服務開發、DBA等四個角色的人力。至少四個人加起來那就是兩人日的成本,期間還有不少溝通成本。這不是個杜撰的栗子,而是在我們團隊中真實發生過的事情。那麼,如果有全棧工程師的話呢,一個人從前端到閘道器、服務介面端、資料庫,一路自己除錯跟蹤資料,估計一個小時左右就能定位到問題,這就非常高效地解決了問題,也極大地減低了溝通成本。

當然,最重要的還是對個人的發展如何。畢竟,公司並沒有要求你一定要成為全棧,而你也不會是為了公司的利益而努力成為全棧,除非這家公司是你自己開的。而我覺得,個人發展全棧,最重要的就是為了應對未來,主要有以下幾方面:

  • 避免被淘汰 —— 技術更新迭代太快,只熟悉單一技能棧在未來幾年有可能會面臨被淘汰的風險。比如,雖然現在Android和iOS開發依然是主流,但又有誰能保證五年十年後不會像塞班一樣。比如,雖然現在Java依然是後端開發的主流,但代表著未來趨勢的人工智慧、區塊鏈等,大多卻不是用Java開發的。
  • 提升個人價值 —— 如今,系統級產品已經越來越複雜,那麼,對於具有全域性思維的全棧工程師和全棧架構師的人才需求就會越來越大,所以,全棧工程師,尤其是全棧架構師的個人價值也就會越來越高。
  • 走向高管職位 —— 管理崗位對全域性觀的要求必不可少,越高的管理崗要求越高。所以,就算是在特定領域做到了技術專家,如果缺乏全域性思維,就會成為職業瓶頸。
  • 實現創業夢 —— 我想,不少人可能和我一樣,將自己慢慢發展成全棧,主要還是為了做出優秀的產品,為了實現創業夢。

如何發展全棧

要發展全棧,就需要全面發展硬技能和軟技能,硬技能相對比較容易掌握,但最重要的還是軟技能,這是全棧的根基,當然,軟技能就不是那麼容易提高的了。

需要發展哪些硬技能要看從事的行業和技術方向而定,做移動應用和做VR/AR/MR應用所需掌握的技能棧是不同的,做人工智慧、區塊鏈應用又是另一套技能棧。就以目前做企業級應用的主流技術為例,主要會有以下技術棧:

  • 移動端 —— Android、iOS、React Native
  • 前端 —— H5、CSS3、SASS、LASS、React、Vue、AngularJS
  • 後端語言 —— Java、Go、Python、Node.js
  • 後端框架 —— SpringBoot、SpringCloud、MyBatis、FastJson、Dubbox
  • 資料庫 —— MySQL、Oracle、DB2、MongoDB、Redis
  • 運維 —— Nginx、ZooKeeper、Docker、Kubernetes

一個合格的全棧工程師並不需要掌握以上所有技術棧,但在工作中遇到問題時,如果卡在了某個你還不懂的技術棧,那你應該能快速學會該技術棧中能解決問題的那部分知識,然後解決問題。

如果想發展成全棧架構師,那還需要掌握架構方面的技能,包括前端架構、API設計、負載均衡、微服務架構、分散式事務、伺服器叢集設計、容災設計等等。優秀的架構師還需要深入理解業務,應該也是個業務專家。

然後,如何發展軟技能呢?就如我上面說的,軟技能主要包括: 解決問題能力超強學習能力良好溝通能力技能遷移能力全域性思維能力。這些軟技能都需要通過長時間的實踐積累才能掌握,以下我只提供一些實踐方法的指引。

解決問題能力

要提高解決問題的能力,首先要懂得如何分析問題。分析問題要儘量保持開拓性思維,多角度、多方面地思考可能導致的原因。多思考,多分析,而不是直接就開幹,才能不斷提高你的思維能力。如果該問題不是急著馬上就要解決的,可以儘量將所有想到的可能原因全部列出來,通過長時間的這種刻意練習,你會慢慢變成分析問題的高手,同時,你的思維能力會得到質的提升,經常能看到別人看不到的地方。

然後,對推測得出的原因,一定要進行檢查驗證。有些人,一旦遇到問題,總是武斷地下結論,認為是某某地方導致的,而不是先進行檢查驗證,這是一種錯誤的解決問題的思維方式。就算有90%的可能的確是某某地方導致的,也要先進行驗證之後才下結論。之前,我帶領的團隊裡就有這種固話思維習慣的人,出現了某個BUG,他立馬就下結論說一定是因為XXX導致的,我也知道,可能是XXX導致的機率挺高,但我還是讓他先檢查驗證一下再作結論,結果檢查完發現是另外的原因導致的,啪啪啪,直接打臉。

還有,更重要的一點就是,要去解決當前值得解決的問題。注意兩個詞:當前值得。有些問題,可能也是值得解決的,但是否需要當前就去解決呢?比如說,專案初期階段,需要解決高效能問題嗎?

超強學習能力

劉潤在《5分鐘商學院》提到一個20小時快速學習的方法,怎麼做?

  1. 第一,花5小時,大量泛讀,主要就是為了瞭解一些基本概念;
  2. 第二,花3小時,建立模型,這是為了形成基本的全域性觀;
  3. 第三,花2小時,請教專家,專家能幫你解答你無法理解的問題;
  4. 第四,花10小時,理解複述,可以使用著名的“費曼技巧”。

另外,古典在《超級個體》也提到了一些學習管理的東西,包括:功利學習法、找到知識源頭、學習金字塔。

還有一本書叫《關鍵20小時,快速學會任何技能!》,書中提到快速學習也是分為四步:

  1. 分解步驟 —— 把技能做最大程度的細分,分成若干小步驟。
  2. 充分學習 —— 對每個小步驟進行充分學習,以便進行靈活的練習,並在練習中自我糾正。
  3. 克服困難 —— 克服在練習中出現的生理、心理或者情緒上的障礙。
  4. 集中練習 —— 至少用20小時集中學習最重要的小步驟。

學習方法很多,但我覺得最有效的還是 輸出倒逼輸入。我目前在團隊中也正在採用此方法幫助團隊成員提升自己的能力。

良好溝通能力

良好的溝通主要分為兩方面:一是理解對方的想法,二是讓對方理解我的想法。任何一方理解出現偏差,都是無效溝通。

首先,你要先理解對方的想法,這是有效溝通的第一步。當然,這裡面的學問也很大。有時候,對方表達出來的只是表面的需求,而不是真正的需求,這時候,你要懂得如何去挖掘出他的真實需求。一般情況下,多問幾個為什麼就能挖掘出來。另外,多站在對方的立場看問題。

其次,要讓對方理解我的想法,這就需要你能清晰明確地表達出你自己的想法了。當然,前提是你自己腦子裡已經有了清晰的邏輯。另外,作為技術人員,最容易犯的錯誤就是:與不懂技術的人員溝通時,依然使用技術語言。比如,你和不懂技術的產品經理談UML、談架構細節,這都不是合適的溝通方式。溝通時,一定要使用對方能聽得懂的語言或其他方式。

技能遷移能力

硬技能一般是比較難遷移的,軟技能則容易遷移。所以,應該多發展自己的軟技能。就算是硬技能,其底層大多也是軟技能的東西,比如,Android和iOS開發屬於硬技能,但底層的設計模式、架構模式、程式設計思想等則屬於軟技能,是可以遷移到後端開發的。所以,學習一門技術,除了要知其然,還要知其所以然,瞭解一門技術背後為什麼這麼設計,這才能將硬技能轉化為軟技能。

不過,有一點需要注意,技能遷移不等同於把所有東西都從舊領域照搬到新領域,因為兩個不同領域肯定存在一些差異性,在舊領域適用的東西,在新領域不一定也適用,甚至有可能適得其反。比如說,很多大公司的高管出來創業的人,會將他們在大公司的管理經驗遷移過來,對創業公司進行同樣的管理,但最終很多都失敗了。這樣的故事相信你也聽到過不少了。所以,進行技能遷移時,也要清楚不同領域的差異性在哪裡,要懂得判斷哪些可以遷移過來,哪些不能直接遷移。

全域性思維能力

全域性思維能力是最難提高的,需要不斷擴充套件自己的技能棧,要不斷擴大自己的視野,要站在更高的視角看問題。我自己在這方面的培養主要就是多學習和思考如何才能做出優秀的產品。這就涉及到需求分析、產品設計、UI設計、技術實現等,每一部分都會影響產品的質量。因此,我每做一個產品,雖然主要還是負責技術部分,但都會習慣站在更廣更高的視野去看待整個產品,也會經常性地給產品經理、UI設計師提建議。

總結

最後,做一個總結回顧。本文主要圍繞三個問題簡單聊了聊我對全棧的一些觀點:

  • What?什麼是全棧? —— 全棧也有分等級,合格的全棧工程師至少應該有能力獨立解決跨棧的技術問題。合格的全棧工程師應該具備硬技能和軟技能,硬技能就是熟練掌握工作領域中的各種技術棧了,軟技能主要包括: 解決問題能力超強學習能力良好溝通能力技能遷移能力全域性思維能力
  • Why?為什麼要發展全棧? —— 發展全棧對公司和隔熱都大有益處,但最重要的還是對個人的發展如何。個人發展全棧主要還是為了應對未來,主要有幾方面: 避免被淘汰提升個人價值走向高管職位實現創業夢
  • How?如何發展全棧? —— 發展全棧就需要全面發展硬技能和軟技能,需要發展哪些硬技能要看從事的行業和技術方向而定,更重要的是發展軟技能。

另外,我也正在計劃開設一個通往全棧的收費社群,目前正在規劃提綱,有興趣加入的可以關注一下。


掃描以下二維碼即可關注訂閱號。

相關文章