原創文章,轉載請註明:轉載自Keegan小鋼
並標明原文連接:http://keeganlee.me/post/full-stack/20170826
微信訂閱號:keeganlee_me
寫於2017-08-26php
全棧正在變得愈來愈流行,不少人都有意願或正在往全棧的方向去發展。我本身也一直在往這個方向不斷提高本身,到目前爲止,算是略有小成,勉強稱得上是一個合格的全棧架構師。爲了給更多走在全棧路上的小夥伴們提供一些思路,我將基於我本身這些年來的經驗總結和思考,以及從其餘更優秀的人(好比吳軍)學習得來的感悟,與大夥分享我對全棧的一些觀點。我主要將從三方面來聊聊全棧的問題:html
對全棧的定義,據我所瞭解的,最先來源於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等四個角色的人力。至少四我的加起來那就是兩人日的成本,期間還有很多溝通成本。這不是個杜撰的栗子,而是在咱們團隊中真實發生過的事情。那麼,若是有全棧工程師的話呢,一我的從前端到網關、服務接口端、數據庫,一路本身調試跟蹤數據,估計一個小時左右就能定位到問題,這就很是高效地解決了問題,也極大地減低了溝通成本。
固然,最重要的仍是對我的的發展如何。畢竟,公司並無要求你必定要成爲全棧,而你也不會是爲了公司的利益而努力成爲全棧,除非這家公司是你本身開的。而我以爲,我的發展全棧,最重要的就是爲了應對將來,主要有如下幾方面:
要發展全棧,就須要全面發展硬技能和軟技能,硬技能相對比較容易掌握,但最重要的仍是軟技能,這是全棧的根基,固然,軟技能就不是那麼容易提升的了。
須要發展哪些硬技能要看從事的行業和技術方向而定,作移動應用和作VR/AR/MR應用所需掌握的技能棧是不一樣的,作人工智能、區塊鏈應用又是另外一套技能棧。就以目前作企業級應用的主流技術爲例,主要會有如下技術棧:
一個合格的全棧工程師並不須要掌握以上全部技術棧,但在工做中遇到問題時,若是卡在了某個你還不懂的技術棧,那你應該能快速學會該技術棧中能解決問題的那部分知識,而後解決問題。
若是想發展成全棧架構師,那還須要掌握架構方面的技能,包括前端架構、API設計、負載均衡、微服務架構、分佈式事務、服務器集羣設計、容災設計等等。優秀的架構師還須要深刻理解業務,應該也是個業務專家。
而後,如何發展軟技能呢?就如我上面說的,軟技能主要包括: 解決問題能力、 超強學習能力、 良好溝通能力、 技能遷移能力、 全局思惟能力。這些軟技能都須要經過長時間的實踐積累才能掌握,如下我只提供一些實踐方法的指引。
要提升解決問題的能力,首先要懂得如何分析問題。分析問題要儘可能保持開拓性思惟,多角度、多方面地思考可能致使的緣由。多思考,多分析,而不是直接就開幹,才能不斷提升你的思惟能力。若是該問題不是急着立刻就要解決的,能夠儘可能將全部想到的可能緣由所有列出來,經過長時間的這種刻意練習,你會慢慢變成分析問題的高手,同時,你的思惟能力會獲得質的提高,常常能看到別人看不到的地方。
而後,對推測得出的緣由,必定要進行檢查驗證。有些人,一旦遇到問題,老是武斷地下結論,認爲是某某地方致使的,而不是先進行檢查驗證,這是一種錯誤的解決問題的思惟方式。就算有90%的可能的確是某某地方致使的,也要先進行驗證以後才下結論。以前,我帶領的團隊裏就有這種固話思惟習慣的人,出現了某個BUG,他立馬就下結論說必定是由於XXX致使的,我也知道,多是XXX致使的概率挺高,但我仍是讓他先檢查驗證一下再做結論,結果檢查完發現是另外的緣由致使的,啪啪啪,直接打臉。
還有,更重要的一點就是,要去解決當前值得解決的問題。注意兩個詞:當前、 值得。有些問題,可能也是值得解決的,可是否須要當前就去解決呢?好比說,項目初期階段,須要解決高性能問題嗎?
劉潤在《5分鐘商學院》提到一個20小時快速學習的方法,怎麼作?
另外,古典在《超級個體》也提到了一些學習管理的東西,包括:功利學習法、找到知識源頭、學習金字塔。
還有一本書叫《關鍵20小時,快速學會任何技能!》,書中提到快速學習也是分爲四步:
學習方法不少,但我以爲最有效的仍是 輸出倒逼輸入。我目前在團隊中也正在採用此方法幫助團隊成員提高本身的能力。
良好的溝通主要分爲兩方面:一是理解對方的想法,二是讓對方理解個人想法。任何一方理解出現誤差,都是無效溝通。
首先,你要先理解對方的想法,這是有效溝通的第一步。固然,這裏面的學問也很大。有時候,對方表達出來的只是表面的需求,而不是真正的需求,這時候,你要懂得如何去挖掘出他的真實需求。通常狀況下,多問幾個爲何就能挖掘出來。另外,多站在對方的立場看問題。
其次,要讓對方理解個人想法,這就須要你能清晰明確地表達出你本身的想法了。固然,前提是你本身腦子裏已經有了清晰的邏輯。另外,做爲技術人員,最容易犯的錯誤就是:與不懂技術的人員溝通時,依然使用技術語言。好比,你和不懂技術的產品經理談UML、談架構細節,這都不是合適的溝通方式。溝通時,必定要使用對方能聽得懂的語言或其餘方式。
硬技能通常是比較難遷移的,軟技能則容易遷移。因此,應該多發展本身的軟技能。就算是硬技能,其底層大多也是軟技能的東西,好比,Android和iOS開發屬於硬技能,但底層的設計模式、架構模式、編程思想等則屬於軟技能,是能夠遷移到後端開發的。因此,學習一門技術,除了要知其然,還要知其因此然,瞭解一門技術背後爲何這麼設計,這才能將硬技能轉化爲軟技能。
不過,有一點須要注意,技能遷移不等同於把全部東西都從舊領域照搬到新領域,由於兩個不一樣領域確定存在一些差別性,在舊領域適用的東西,在新領域不必定也適用,甚至有可能拔苗助長。好比說,不少大公司的高管出來創業的人,會將他們在大公司的管理經驗遷移過來,對創業公司進行一樣的管理,但最終不少都失敗了。這樣的故事相信你也聽到過很多了。因此,進行技能遷移時,也要清楚不一樣領域的差別性在哪裏,要懂得判斷哪些能夠遷移過來,哪些不能直接遷移。
全局思惟能力是最難提升的,須要不斷擴展本身的技能棧,要不斷擴大本身的視野,要站在更高的視角看問題。我本身在這方面的培養主要就是多學習和思考如何才能作出優秀的產品。這就涉及到需求分析、產品設計、UI設計、技術實現等,每一部分都會影響產品的質量。所以,我每作一個產品,雖然主要仍是負責技術部分,但都會習慣站在更廣更高的視野去看待整個產品,也會常常性地給產品經理、UI設計師提建議。
最後,作一個總結回顧。本文主要圍繞三個問題簡單聊了聊我對全棧的一些觀點:
另外,我也正在計劃開設一個通往全棧的收費社羣,目前正在規劃提綱,有興趣加入的能夠關注一下。
掃描如下二維碼便可關注訂閱號。