如何成為一名優(yōu)秀的全棧工程師?
寫在最前
我的前一篇文章《給職場(chǎng)新人的 10 點(diǎn)建議》發(fā)表后,得到了很多網(wǎng)友,特別是年輕程序員朋 友們的喜愛,這令我頗感意外,但又很受鼓舞。同時(shí),我也收到了一些私信,大多來自那些畢業(yè)不久,剛步入工作崗位的職場(chǎng)新人。詢問的內(nèi)容也大多是如何選擇職業(yè)方向,如何成為一名優(yōu)秀的軟件工程師,以及怎樣快速提高自身的技能等。我在一一回復(fù)的同時(shí),不禁想結(jié)合自身的經(jīng)歷,談?wù)勅绾尾拍艹蔀橐幻麅?yōu)秀的全棧工程 師。
什么是全棧工程師
全棧工程師一詞,最早出現(xiàn)于Facebook工程師Calos Bueno的一篇文章 - Full Stack(需翻墻)。他把全棧工程師定義為對(duì)性能影響有著深入理解的技術(shù)通才。自那以后全棧這個(gè)詞便流行起來,我看到過的就有全棧工程師,全棧設(shè)計(jì)師,全棧運(yùn)維,全棧市場(chǎng)營(yíng)銷人員等等。而在針對(duì)互聯(lián)網(wǎng)人才的招聘網(wǎng)站上,全棧工程師更是一躍成為熱門招聘職位,其薪資水平也比一般的開發(fā)工程師職位要高出一截。那么,什么是全棧工程師,我們又應(yīng)該如何定義一名全棧工程師呢?
百度百科對(duì)全棧工程師的定義是這樣的:“掌握多種技能,并能利用多種技能獨(dú)立完成產(chǎn)品的人”。我覺得這個(gè)定義還不夠全面,我認(rèn)為全棧工程師應(yīng)該同時(shí) 是一位資深開發(fā)工程師、架構(gòu)師以及具有敏捷開發(fā)技能的程序員。全棧工程師對(duì)于軟件開發(fā)的認(rèn)識(shí)往往已經(jīng)進(jìn)化了,他們把特定的技術(shù)拋到了身后,明白技術(shù)的更新 始終比計(jì)算機(jī)理論要快的道理,因此,他們注重強(qiáng)化自身的核心技能,關(guān)注并樂于實(shí)踐其他技術(shù)。全棧工程師往往是某一方面的專家,同時(shí)通曉并善于在正確的場(chǎng)合 運(yùn)用其他語言、工具和技術(shù)。
全棧工程師的價(jià)值
隨著時(shí)間的推移,全棧工程師的作用和價(jià)值在越來越多的產(chǎn)品或項(xiàng)目中得到了印證。那么,我們來看看全棧工程師對(duì)于個(gè)人或公司意味著什么。
-
個(gè)人價(jià)值及自由度的極大提升 —— 我曾看過一些介紹全棧工程師的文章,文中大多強(qiáng)調(diào)了全棧工程師對(duì)于公司與團(tuán)隊(duì)的價(jià)值。而我想說的是,沒有一個(gè)優(yōu)秀的全棧工程師是因?yàn)闀?huì)對(duì)公司產(chǎn)生多大的利 益,而努力學(xué)習(xí)各種技術(shù)的。我所認(rèn)識(shí)的他們,都是那些有著一顆匠心,不斷追求更高技能,并執(zhí)著于做出更優(yōu)秀產(chǎn)品的人。而當(dāng)你成為一名真正的全棧工程師后, 會(huì)感受到前所未有的個(gè)人價(jià)值與技術(shù)自由度的提升。試想當(dāng)一個(gè)很好的創(chuàng)意出現(xiàn)時(shí),你可以一個(gè)人或主導(dǎo)一個(gè)團(tuán)隊(duì)去實(shí)現(xiàn)并不斷完善它,這是一件多么讓人興奮的事 ??!
-
全局思維與技術(shù)前瞻性 —— 由于具備了各個(gè)開發(fā)環(huán)節(jié)與技術(shù)領(lǐng)域的知識(shí),全棧工程師往往具有更好的大局觀和技術(shù)前瞻性,能夠在項(xiàng)目初期就選擇正確的技術(shù),并很好地把控一個(gè)項(xiàng)目的整體方向?,F(xiàn)代項(xiàng)目往往非常復(fù)雜,而全棧工程師往往能帶來技術(shù)和質(zhì)量上的保障,從而成為一個(gè)項(xiàng)目成功的關(guān)鍵人物。
-
降低溝通成本 —— 我經(jīng)常聽到有設(shè)計(jì)師抱怨前端工程師無法百分之百地還原他們的設(shè)計(jì),而前端工程師又在抱怨后端工程師從接口返回的數(shù)據(jù)更本無法直接使用,后端工程師也在抱怨 產(chǎn)品經(jīng)理所提的需求根本無法完成。隨著團(tuán)隊(duì)人數(shù)的上升,由于各自技能棧的不同,溝通成本一定會(huì)隨之上升。全棧工程師除了能夠獨(dú)立完成前后端的開發(fā)(甚至包 括設(shè)計(jì))外,如果能夠在項(xiàng)目初期提前介入,便能很好地規(guī)避技術(shù)風(fēng)險(xiǎn),過濾不合理的需求,從而顯著降低因不同技術(shù)差異導(dǎo)致的溝通問題,顯著降低項(xiàng)目風(fēng)險(xiǎn)。
-
初創(chuàng)公司 —— 我們已經(jīng)來到了一個(gè)萬眾創(chuàng)業(yè),全民創(chuàng)新的時(shí)代。那些初創(chuàng)公司也如雨后春筍般不斷涌現(xiàn)。初創(chuàng)公司往往都有了一個(gè)不錯(cuò)的創(chuàng)意,但經(jīng)常會(huì)遇到“就缺一個(gè)程序員” 的尷尬。我想說的是,他們其實(shí)并不是缺程序員,而是缺一位全棧工程師。初創(chuàng)公司往往資金有限,而一名優(yōu)秀的全棧工程師能夠幫助初創(chuàng)公司用最低的代價(jià)與最短 的時(shí)間推出自己的產(chǎn)品。這是初創(chuàng)公司能夠存活下來,拿到更多投資,甚至成為“獨(dú)角獸”一員的最關(guān)鍵一步。
全棧工程師的技能棧
看到這里你一定會(huì)問,到底需要具備怎樣的技能才能成為一名全棧工程呢?下面這張圖來自Medium,作者將軟件開發(fā)所涉及的各個(gè)方面分為層,又將每個(gè)層所包含的主要技術(shù)作為組件,制作了這張全棧技術(shù)圖。
從上面這張圖,我們不難發(fā)現(xiàn),現(xiàn)在的技術(shù)體系是多么龐大,每一年又會(huì)有新的技術(shù)加入到這些層中,而已有的技術(shù)又在不斷地更新。因此要掌握所有技術(shù)是 根本不可能的,而成為全棧工程師也并不需要你真的掌握所有的技術(shù),你應(yīng)該將自己的精力聚焦于關(guān)鍵開發(fā)技能以及一些必須掌握的附加技能上。
關(guān)鍵開發(fā)技能(硬實(shí)力):
-
Git / GitHub —— 你必須掌握如何使用Git來管理和分享你的代碼。把Git作為關(guān)鍵技能的第一條,是因?yàn)樗粌H僅是一個(gè)代碼管理工具,更是一種推薦的工作方式。它使你能在 任何地方進(jìn)行開發(fā),高效地管理任何大小的項(xiàng)目,通過Git你還能與其他團(tuán)隊(duì)成員進(jìn)行分布式協(xié)作,大大提升工作效率。通過GitHub,還能將你與世界所有 的開發(fā)者聯(lián)系在一起。
-
至少一門編程語言 —— 你需要精通至少一門編程語言,JAVA 、PHP、C#、Python、Ruby、Perl 等,因?yàn)槟愕拇蠖鄶?shù)核心業(yè)務(wù)處理都需要用這門語言來寫。你既要掌握這門語言的語法,又需要非常熟悉如何基于這門語言進(jìn)行項(xiàng)目的架構(gòu)、設(shè)計(jì)、實(shí)現(xiàn)以及測(cè)試。 如果你選擇的是JAVA,那么你就需要掌握面向?qū)ο蟮脑O(shè)計(jì)和開發(fā),設(shè)計(jì)模式的應(yīng)用,基于J2EE各個(gè)組件的開發(fā) 等等。
-
運(yùn)用開發(fā)框架和第三方庫(kù) —— 流行的開發(fā)語言,一般都伴有出色的開發(fā)框架,比如JAVA的Spring、MyBatis、Hibernate,Python的Django,PHP的 thinkphp、yin,nodeJs的 express 等等。這些開發(fā)框架往往都遵循軟件開發(fā)領(lǐng)域的一些最佳實(shí)踐,并由非常優(yōu)秀的開發(fā)人員創(chuàng)建。熟練使用這些開發(fā)框架或第三方庫(kù)能夠避免重復(fù)發(fā)明輪子,使你的工 作事半功倍。更重要的是這些優(yōu)秀框架或第三方庫(kù)的一般都得到持續(xù)的維護(hù),是對(duì)你的產(chǎn)品或項(xiàng)目在質(zhì)量與安全方便的最有效的保障。
-
前端技術(shù) —— 之所以將前端技術(shù)獨(dú)立出來,作為一項(xiàng)關(guān)鍵技術(shù),是因?yàn)樗诮裉斓捻?xiàng)目和產(chǎn)品的研發(fā)過程中正變得越來越重要。一個(gè)產(chǎn)品除了實(shí)現(xiàn)所需的功能之外,是否好用(用 戶體驗(yàn))也正在成為評(píng)判一個(gè)產(chǎn)品是否成功的重要標(biāo)準(zhǔn)。而這都依賴于前端技術(shù)的實(shí)現(xiàn),你至少需要掌握 HTML5、CSS3、JavaScript 等基本前端技術(shù),同時(shí)進(jìn)一步學(xué)習(xí) JQuery、LESS、SASS、AngularJS或REACT等前端框架或第三方庫(kù)。
-
數(shù)據(jù)庫(kù)與緩存 —— 任何產(chǎn)品或項(xiàng)目都需要一個(gè)數(shù)據(jù)庫(kù)來存儲(chǔ)數(shù)據(jù)。作為全棧工程師,你也需要至少掌握一到兩個(gè)數(shù)據(jù)庫(kù),并知道怎樣與數(shù)據(jù)庫(kù)進(jìn)行交互。目前流行的數(shù)據(jù)庫(kù)主要有 MySQL、MongoDB、Redis、Oracle、SQLServer等。MongoDB作為文檔型數(shù)據(jù)庫(kù),在互聯(lián)網(wǎng)產(chǎn)品中正被越來越多地使用,對(duì) 于規(guī)模稍大一些的項(xiàng)目,我仍推薦使用MySQL或商用的Oracle作為后端數(shù)據(jù)庫(kù)。而Redis這樣的內(nèi)存數(shù)據(jù)庫(kù)則可以用于緩存,以提升系統(tǒng)的性能。
-
基本設(shè)計(jì)能力 —— 大部分關(guān)于全棧工程師的文章或討論中,都不會(huì)將設(shè)計(jì)能力做為全棧工程師的關(guān)鍵技能,但我卻認(rèn)為這項(xiàng)技能非常重要。我曾被邀請(qǐng)?jiān)u估一些軟件工程師自己開發(fā)的 產(chǎn)品,這些產(chǎn)品都有不錯(cuò)的創(chuàng)意,功能實(shí)現(xiàn)也很到位,但一看就不是一個(gè)好的產(chǎn)品,用戶根本沒有使用欲望,原因是這些產(chǎn)品的設(shè)計(jì)太差了,而往往那些開發(fā)者完全 沒有意識(shí)到問題的存在,比如色彩的不一致,排版的凌亂,不恰當(dāng)?shù)膱D標(biāo) 等等。我所建議的基本設(shè)計(jì)能力,并不要求你像專業(yè)設(shè)計(jì)師那樣能夠P出神圖、制作奇妙的視覺效果等,但你需要掌握最基本的UI設(shè)計(jì)原則,如 色彩的搭配,基本的排版,并具備良好的審美能力,和一些基本UI設(shè)計(jì)能力,這樣你做的產(chǎn)品就不會(huì)太差了。
在掌握了這些核心技能之后,你可以根據(jù)自己的興趣與發(fā)展方向,學(xué)習(xí)其他方面的技術(shù)。比如,如果你對(duì)數(shù)據(jù)處理感興趣,那么你可以學(xué)習(xí)大數(shù)據(jù)方面的技 術(shù)。如果你對(duì)移動(dòng)互聯(lián)網(wǎng)更感興趣,那么你可以學(xué)習(xí)Swift,開發(fā)ios應(yīng)用。知識(shí)總是相通的,在有了良好的技術(shù)基礎(chǔ)后,學(xué)習(xí)其他知識(shí)將會(huì)變得非常容易。
附加技能(軟實(shí)力):
-
溝通 —— 除非你是在做個(gè)人項(xiàng)目,對(duì)于稍大一些的項(xiàng)目,你總是需要與同事、干系人或是客戶進(jìn)行溝通的。而成功的溝通往往是獲得有效需求,與建立團(tuán)隊(duì)信心的第一步。在 項(xiàng)目的進(jìn)行過程中,你更需要通過有效的溝通去確定方案,消除誤解,與項(xiàng)目成員協(xié)同前進(jìn)。良好的溝通能力將使你在團(tuán)隊(duì)中更具影響力,收到更多尊重和關(guān)注。
-
問題解決能力 —— 全棧工程師首先是一名工程師,他必須掌握工程化的方法來解決遇到的各種問題。我在職業(yè)生涯中的幾乎所有亮點(diǎn),都與解決問題相關(guān),大到提供整個(gè)項(xiàng)目的架構(gòu)方 案,小到以最快的速度解決生產(chǎn)問題 等。其實(shí)有很多提高問題解決能力的方法,但沒有一種比實(shí)踐更有效。我所見到的優(yōu)秀工程師,往往能夠憑借直覺以最短的時(shí)間給出正確的解決方案,但你可能沒有 看到的是,在這背后其實(shí)是經(jīng)過大量實(shí)踐累積而來的經(jīng)驗(yàn)。
-
時(shí)間管理 —— 作為全棧工程師,你可能會(huì)被安排同時(shí)在不同的項(xiàng)目中承擔(dān)不同的角色。你需要合理地分配時(shí)間,保證所有的工作能夠按時(shí)交付。同樣在你的業(yè)余時(shí)間,你還需要花 時(shí)間閱讀和學(xué)習(xí),同時(shí)你還可能會(huì)有自己的Side Project。因此,合理地進(jìn)行時(shí)間分配,并對(duì)一些關(guān)鍵任務(wù),進(jìn)行計(jì)劃是很重要的。你或許會(huì)感到一些壓力,但這反而會(huì)激發(fā)你的創(chuàng)造力,并能讓一切都有條 不紊地進(jìn)行。
-
好奇心 —— 對(duì)任何工作都抱有好奇心,并愿意不斷學(xué)習(xí)和改善是那些優(yōu)秀工程師的共同特性。軟件開發(fā)領(lǐng)域匯集了世界上最聰明的人,各種類型的技術(shù)、產(chǎn)品、框架更是日新月 異,層出不窮。優(yōu)秀的全棧工程師需要不斷地學(xué)習(xí)來抓住這些變化,跟上計(jì)算機(jī)領(lǐng)域發(fā)展的腳步。時(shí)常有人會(huì)問我,做計(jì)算機(jī)這一行一直會(huì)有新的東西產(chǎn)生,要去不 斷地學(xué)習(xí),是不是會(huì)很累。我要說的是,對(duì)于將持續(xù)學(xué)習(xí)作為一種生活習(xí)慣的人來說,學(xué)習(xí)新東西并不會(huì)成為一種負(fù)擔(dān),反而是一種樂趣。
-
領(lǐng)導(dǎo)力 —— 優(yōu)秀的全棧工程師往往會(huì)被賦予技術(shù)Leader甚至項(xiàng)目管理者的角色。成為管理者并不是讓你去支配其他人,或讓其他人替你做事。管理者需要理解你的團(tuán)隊(duì)成 員的長(zhǎng)處與不足,并知道如何以服務(wù)的態(tài)度使團(tuán)隊(duì)獲得最大化的產(chǎn)出。我見過一些非常優(yōu)秀的工程師,當(dāng)他們被安排去管理團(tuán)隊(duì)時(shí),他們是排斥的,他們往往更愿意 獨(dú)自工作。但我想說,成為管理者,將會(huì)使你更加睿智、可靠和值得他人信賴,也會(huì)對(duì)你未來的職業(yè)生涯帶來極大的益處。因此,當(dāng)機(jī)會(huì)到來時(shí),請(qǐng)將它視為挑戰(zhàn), 不要排斥它。
有經(jīng)驗(yàn)的技術(shù)領(lǐng)導(dǎo)者在招聘時(shí),往往會(huì)同時(shí)考察應(yīng)聘者技術(shù)能力與上述附加技能,而對(duì)于初級(jí)程序員的招聘來說,那些附加技能往往更被優(yōu)秀的技術(shù)公司所看重。開發(fā)技能是你的硬實(shí)力,而附加技能則可以看作是你的軟實(shí)力,只有同時(shí)具備這兩方面技能,才能成為一名優(yōu)秀的全棧工程師。
優(yōu)秀的全棧工程師需要走出去
優(yōu)秀的全棧工程師不應(yīng)局限于自己的工作,他更應(yīng)該走出去,接觸不同的技術(shù),分享自己的經(jīng)驗(yàn)和心得,認(rèn)識(shí)更多的朋友。下面便是我的一些做法。
-
參加技術(shù)大會(huì) —— InfoQ、CSDN、GITC、優(yōu)設(shè)、TED 等網(wǎng)站都會(huì)定期舉辦各類技術(shù)大會(huì)。在這些大會(huì)上,你不僅能夠聽到技術(shù)大咖們帶來的各自領(lǐng)域最佳技術(shù)實(shí)踐,而且能認(rèn)識(shí)很多行業(yè)內(nèi)的朋友。這對(duì)你開拓思路,擴(kuò) 大技術(shù)社交圈都很有幫助。因此,如果公司沒有安排你去參加這些技術(shù)大會(huì)的話,那就自己買票參加,作為對(duì)自己的一種投資吧。
-
作公開演講 —— 全棧工程師并不需要是一個(gè)公開演講者,但作為團(tuán)隊(duì)的核心成員,他一定需要在團(tuán)隊(duì)內(nèi)部做技術(shù)、管理等方面的進(jìn)行演講。如果你是一個(gè)樂于分享的技術(shù)達(dá)人,那么 也可以嘗試錄制個(gè)人課程(視頻或音頻),并在慕課、網(wǎng)易課堂、優(yōu)酷 或 像 荔枝、喜馬拉雅 等各種媒體分享自己的技能和知識(shí),不要因?yàn)樽约翰⒉皇菍<揖筒辉竾L試,相信我,你用心制作的內(nèi)容,會(huì)獲得大家的認(rèn)可,并收獲一大批粉絲的。
-
個(gè)人博客 —— 每天進(jìn)步一點(diǎn)點(diǎn),一年以后你便會(huì)獲得質(zhì)的飛躍。優(yōu)秀的全棧工程師懂得如何進(jìn)行知識(shí)的積累,而技術(shù)博客就是一個(gè)很好的方式,將自己平時(shí)的實(shí)踐、思考記錄下 來,配以tag標(biāo)簽方便日后的回顧。最有意思的是,當(dāng)你在不斷記錄和更新你的博客同時(shí),世界各地的程序員也會(huì)通過你的博客認(rèn)識(shí)你。
-
參加線下活動(dòng) —— 與以前程序員總是宅在家里不同,現(xiàn)在的年輕程序員們更愿意分享和交流。很多網(wǎng)站也會(huì)組織不同技術(shù)主題的線下活動(dòng),在這些活動(dòng)中你可以聽到一些技術(shù)牛人的分 享,還可以找到很多和你一樣對(duì)技術(shù)富有激情的人。而我現(xiàn)在所做的開源項(xiàng)目中的很多團(tuán)隊(duì)成員,正是我在這些線下活動(dòng)中結(jié)識(shí)的。
全棧工程師決不是一夜練成的,你需要打好技術(shù)基礎(chǔ),強(qiáng)化核心技能,并持續(xù)學(xué)習(xí)。相信有一天你也能像我一樣,感受到自由地運(yùn)用技術(shù),開發(fā)出優(yōu)秀產(chǎn)品所帶來的樂趣的。