阿里工程師分享:對于優(yōu)秀的程序員,技術(shù)學(xué)精好還是學(xué)廣好?
作者?|?淘系技術(shù)
編輯|?橙子君
出品|?阿里巴巴新零售淘系技術(shù)
于一名優(yōu)秀的技術(shù)人員來說,究竟是專精一塊技術(shù)方向,做到深耕其中所向披靡;還是謀求“什么都能略懂一點(diǎn)”的廣度,成為一個全方位的人才?
這其實(shí)是一個職業(yè)發(fā)展和學(xué)習(xí)規(guī)劃路線的問題,許多同學(xué)都有這個困擾。
今天我們邀請了 4 名淘系技術(shù)工程師,結(jié)合他們自身在小廠和大廠的經(jīng)歷故事,給大家分享一些?他們在技術(shù)人員成長中對于【精】和【廣】的選擇觀點(diǎn)?,?希望能夠?qū)δ阌袔椭?/p>
01、淘系技術(shù)部 - 應(yīng)用算法??-?立青
“更早地認(rèn)識自己和自己的方向,能更快地幫助我做出成績?!?/p>
我想先撇開這個具體的問題,?談一談一個程序員的技術(shù)發(fā)展和職業(yè)規(guī)劃。
寫代碼這件事絕大多數(shù)人在喜愛的同時,更多的都是當(dāng)做一個職業(yè)來做的,當(dāng)然也確實(shí)有一部分人真的完全當(dāng)做愛好,例如前段時間的新聞,HashiCorp 的創(chuàng)始人 Mitchell Hashimoto:“?頂級凡爾賽CTO辭職:寫代碼才最快樂!管理只會影響我搞研發(fā)?”;著名的Linux創(chuàng)始人Linus大神也是出了名的熱愛編程。對于這樣的追求(?土豪?),拋棄功利熱愛編程,我覺得在編程上完全可以喜歡什么方面就追求什么方面,是廣泛的發(fā)現(xiàn)興趣探索興趣,還是在一個方向上深入挖掘都沒有問題,大可以今天做前端,明天搞開發(fā),后天攢算法,一人搞定全棧。
但是對于絕大多數(shù)人來說,編程更多的是職業(yè)發(fā)展道路上一個立身的手藝,在眾多專業(yè)技術(shù)方向上挑了一個自己比較喜歡和熱愛的。程序員的發(fā)展和眾多職位的發(fā)展一樣,每個人都希望自己能夠往"上"走:更專業(yè),更能在職場上發(fā)揮自己的作用和影響力,從單兵作戰(zhàn)做小事,到帶隊做大一點(diǎn)的事,再到影響一個領(lǐng)域,影響一個行業(yè)。這樣的發(fā)展單單靠自己各方面都懂,都有涉獵,恐怕是不行的。剛畢業(yè)的應(yīng)屆同學(xué)可以靠自己的知識儲備做自己的標(biāo)簽,久經(jīng)職場的同學(xué)必須靠自己在某些領(lǐng)域做出的成績做自己的軍功章。
所以我們越早在某些方向做出自己的成績,對自己的成長和發(fā)展是越好的。我本人是做算法的,算法領(lǐng)域有很多大牛在學(xué)校期間就已經(jīng)找準(zhǔn)了自己的發(fā)展方向,并做出了成績,例如caffe作者@賈揚(yáng)清大神,Taichi作者@胡淵鳴等等。他們的成就就需要?及早的找到自己的方向+不懈的努力+億點(diǎn)點(diǎn)的天賦?……對我們絕大多數(shù)人來說更需要及早的找到一個熱愛的,希望精通的方向并做出成績。
我自己的經(jīng)歷其實(shí)不是好的榜樣,我抱著做機(jī)器人的夢想本科學(xué)的機(jī)械,在學(xué)校的時候?qū)κ裁炊几信d趣,既參加過機(jī)器人大賽,參加過結(jié)構(gòu)設(shè)計大賽,也和同學(xué)做過熱力學(xué)相關(guān)的一些機(jī)械設(shè)計;一個比較有意思的經(jīng)歷是,當(dāng)時在學(xué)校還做過一個上天失敗的小衛(wèi)星。當(dāng)時學(xué)校的微小衛(wèi)星研究所發(fā)射了一顆皮星(體積很小的衛(wèi)星)之后,在學(xué)校辦了一個小衛(wèi)星的比賽,我們做了一個模擬衛(wèi)星太陽能電池片自動追蹤陽光的衛(wèi)星模型,在答辯前熬夜完成了,然而在最后測試的時候由于線的固定太過粗糙,在運(yùn)動中扯掉短路了,把電路都燒了……萬幸留下了視頻支持最后的答辯。對我后來職業(yè)選擇影響比較大的是臨畢業(yè)用Kinect做了一個姿態(tài)識別控制無人機(jī)飛行的項目,初步接觸了視覺算法的一些知識。
后來研究生就真正的開始做起了機(jī)器人的方向,也是研究生時期做的控制算法和視覺算法的經(jīng)歷讓我走上了程序員的道路。在這個過程中自己也是對機(jī)器人領(lǐng)域中的SLAM方向產(chǎn)生了興趣,自己惡補(bǔ)了一些知識,并靠著這些最后走上了這個方向的職業(yè)。一方面我覺得自己如果能早一些找到自己的方向并且積累起來一些成果,肯定對自己的發(fā)展是要好很多的,但是另一方面每個人也確實(shí)需要一個認(rèn)識自己的過程,但這個過程我想還是越快越好。?在這個過程中,我們自己的技術(shù)發(fā)展就像是一棵樹,我們盡可以無限的去展開自己的枝葉,多了解一些不同的方向和知識,但一定記住這是為了讓自己的枝頭長得更高。

02、淘系技術(shù)部??-??應(yīng)用算法??-??朔玥
“?大部分的精力還是要用于鞏固自己的長處上,你一定要有競爭力的依憑。?”
做一件事是要精還是要廣?其實(shí)相當(dāng)于賭博里你是要多壓,還是要單押。我們的籌碼是有限的,當(dāng)然我們的精力也是有限的,不可能去做所有的選擇。那么這時候,?問題就變成了如何去組合投資獲得最大化的收益。
如果你選擇去把所有的籌碼壓在一個選項上,那么你就一定要去承擔(dān)選擇失誤帶來一切清零的后果。但是我們也知道,如果你選擇到一支潛力項,不費(fèi)吹灰之力就可以贏到盆滿缽滿。所以孤注一擲,一定對應(yīng)的高風(fēng)險。
另外一個選項就是廣博,它帶給我們的好處是平攤風(fēng)險,但是平攤風(fēng)險的同時收益也會被稀釋掉。比較好的一種做法,應(yīng)該是兩者相結(jié)合,在該廣博的時候廣博,在該專注的時候?qū)Wⅰ?/p>
作為一名算法工程師,我的建議是,廣泛的去涉獵相關(guān)領(lǐng)域的知識,以及弱相關(guān)領(lǐng)域的知識,因?yàn)檫@些知識全都可以作為你自己的儲備,作為你專注行業(yè)的加成。?比如說,你從事圖像識別相關(guān)算法研究,那么直接的,除了圖像相關(guān)的專業(yè)知識,一些基礎(chǔ)的知識例如代數(shù)分析等數(shù)學(xué)理論,計算機(jī)原理與體系結(jié)構(gòu),甚至色彩,攝影美學(xué)等知識,都可以為模型設(shè)計帶來一定的輔助。除基礎(chǔ)的知識以外,相關(guān)領(lǐng)域比如自然語言處理當(dāng)中的時序模型就與視頻圖像分割問題有很多的共通之處;信號處理中很多變換算子能夠直接遷移到圖像處理當(dāng)中。這些知識,都可以作為你研究圖像算法的加成。
又如,你想不到心理學(xué),消費(fèi)者行為學(xué)以及經(jīng)濟(jì)學(xué)都可以為我們的工業(yè)推薦體系賦能。在洞悉了消費(fèi)者在購物時的選擇動機(jī),心理活動以及當(dāng)下經(jīng)濟(jì)趨勢后,算法設(shè)計者能夠依據(jù)這些先驗(yàn)知識有聚焦地設(shè)計相關(guān)的模塊,或是作為趨勢因子加入算法當(dāng)中。用一種更柔軟的方式將大眾認(rèn)知融入模型,將表象和理論相結(jié)合,從而更好地發(fā)揮推薦系統(tǒng)的效能。
世界上很多知識底層是相通的,不要去抗拒學(xué)一些基礎(chǔ)的知識,很有可能那將是你未來抓住機(jī)遇的契機(jī)。但是,?大部分的精力還是要用于鞏固自己的長處上,你一定要有競爭力的依憑。廣泛的涉獵,精準(zhǔn)地融會貫通,提取出你需要的那一部分,轉(zhuǎn)化為自己需要的能量。

03、淘系技術(shù)部??-??前端技術(shù)??-??禾鳥
“我個人經(jīng)歷覺得,精進(jìn)一?門技術(shù),不管是對于開發(fā)還是其他工作,都是重中之重!”
當(dāng)我剛畢業(yè)的時候,在一家小廠做Flash游戲開發(fā),由于當(dāng)時開發(fā)人員配比嚴(yán)重不足(qiong),所以不但要用AS3去寫前端游戲UI功能,還需要用NodeJS寫服務(wù)端游戲邏輯、SQL處理數(shù)據(jù)讀寫操作、HTML/CSS/JS寫后臺配置管理頁面,且一度在公司沒有招到測試的情況下,所有的功能測試只能通過自測來完成。
時間一長就有些膨脹了,自我感覺非常好,覺得自己就是全棧,覺得只有更大的舞臺才能配得上自己,進(jìn)入大廠應(yīng)該是輕而易舉的事情,于是開始往網(wǎng)易、阿里、華為一些大廠投簡歷,F(xiàn)lash游戲開發(fā)、H5游戲開發(fā)、Web前端開發(fā)、NodeJS開發(fā)、服務(wù)端開發(fā)、測試開發(fā)各種崗位都投了遍。結(jié)果就是被現(xiàn)實(shí)狠狠地打了臉,投的簡歷石沉大海,少有的幾個面試也都是一輪游。
后來總結(jié)反思了一下,在所有面試中,面試官經(jīng)常會問這么幾個問題:XX原理是什么?XX如何實(shí)現(xiàn)?對XX你是如何理解的?對于XX功能是否有更好的解決方案?面對這些問題,發(fā)現(xiàn)了自己其實(shí)對底層原理一竅不通,所有都還是停留在使用層面。
看清楚了這個問題之后,我暫時放下了其他域的學(xué)習(xí),專注在前端領(lǐng)域的學(xué)習(xí),從基礎(chǔ)的HTML/CSS/JS入手,到lodash/JQuery等常用工具庫的使用,再到Vue/React等主流框架的使用以及原理的學(xué)習(xí),以及ES6、TS等學(xué)習(xí)掌握。等熟練掌握了這些技能之后,再深入到瀏覽器工作原理、網(wǎng)絡(luò)通信機(jī)制、前端性能優(yōu)化、穩(wěn)定性安全保障等知識點(diǎn)的學(xué)習(xí)。一步一步從搬磚菜鳥變成了熟練搬磚工,然后繼續(xù)朝著搬磚磚家努力。
總的來說,在小廠,老板當(dāng)然希望能更省錢,巴不得一個人就能干完所有的活。?而對于個人而言,精進(jìn)一門技術(shù),不管是對于開發(fā)還是其他工作,都是重中之重!

04、淘系技術(shù)部??-??移動開發(fā)??-??臨境
“不要把自己當(dāng)做?業(yè)務(wù)研發(fā)的工具人?!?/p>
這個問題沒有標(biāo)準(zhǔn)答案,角度不同,得出的結(jié)論會大相徑庭。前不久剛從小廠跳到阿里,簡單聊下我自己的感受。
小廠會更偏重于業(yè)務(wù),因此我們更多的是在實(shí)現(xiàn)業(yè)務(wù)方的需求,日常的研發(fā)工作也少有接觸特別難或者深的內(nèi)容。這個階段不是說基礎(chǔ)不重要,但深入學(xué)習(xí)基礎(chǔ)知識可能對你業(yè)務(wù)研發(fā)不會有特別明顯的提升。
曾有段時間我為了學(xué)習(xí)算法知識跑去刷 leetcode,刷完兩三百題后陷入了迷茫。這些刷題獲得的算法知識在大部分的業(yè)務(wù)場景中不太能用上,雖然它對于在編程中邊界條件判斷、減少低效代碼確實(shí)起到了一定的幫助,但相較于投入的時間來說性價比略低。
同樣道理,學(xué)習(xí)操作系統(tǒng)、計算機(jī)網(wǎng)絡(luò)、計算機(jī)組成原理能讓你對整個計算機(jī)體系有一個更深層次的認(rèn)識,但工作的人不比在校生,時間比較有限,如果你不是一個特別特別自律的人,投入時間沒有看到明顯產(chǎn)出很可能會中途放棄。
如果想要在工作的同時更深入學(xué)習(xí)一些計算機(jī)基礎(chǔ)知識,可以從你正在做或者感興趣的性能優(yōu)化入手。不少性能優(yōu)化手段背后都伴隨著深入的知識,比如之前不少大廠分享的針對 iOS 二進(jìn)制重排優(yōu)化冷啟動的內(nèi)容。學(xué)習(xí)過程中一定會碰到自己不了解的知識,一點(diǎn)點(diǎn)去積累,會比盲目的抱著一本磚頭書直接啃更容易堅持。
另外,如果是業(yè)務(wù)研發(fā),請一定鍛煉自己對業(yè)務(wù)的理解程度,不要只停留于需求來了做完就完了,把自己當(dāng)業(yè)務(wù)的工具人沒有對個人成長沒有益處。
最后,和大家分享一句我和喜歡的話:“書上沒有知識,書上只有信息;知識是在特殊的工作和行動中運(yùn)用信息的能力。”共勉。
結(jié)語
程序員要精還是要廣,并不是一個有著標(biāo)準(zhǔn)確定答案的選擇題。
精于基礎(chǔ),廣于工具,熟于業(yè)務(wù),?永遠(yuǎn)保持進(jìn)步和學(xué)習(xí)的心態(tài),希望各位都能找到最適合自己的技術(shù)成長路徑。
如題,你們的觀點(diǎn)是什么呢??留言區(qū)歡迎一起討論。

另外,對現(xiàn)在我們的大多數(shù)朋友來說還是學(xué)編程技術(shù)最重要!栽一棵樹最好的時間是十年前,其次是現(xiàn)在。對于準(zhǔn)備學(xué)習(xí)編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
微信公眾號:C語言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項目實(shí)戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
