程序員是學的越多越好?
送大家以下java學習資料
于一名優秀的技術人員來說,究竟是專精一塊技術方向,做到深耕其中所向披靡;還是謀求“什么都能略懂一點”的廣度,成為一個全方位的人才?
這其實是一個職業發展和學習規劃路線的問題,許多同學都有這個困擾。
今天我們邀請了 4 名淘系技術工程師,結合他們自身在小廠和大廠的經歷故事,給大家分享一些他們在技術人員成長中對于【精】和【廣】的選擇觀點,希望能夠對你有幫助。
01
淘系技術部 - 應用算法 - 立青
“更早地認識自己和自己的方向,能更快地幫助我做出成績。”
我想先撇開這個具體的問題,談一談一個程序員的技術發展和職業規劃。
寫代碼這件事絕大多數人在喜愛的同時,更多的都是當做一個職業來做的,當然也確實有一部分人真的完全當做愛好,例如前段時間的新聞,HashiCorp 的創始人 Mitchell Hashimoto:“頂級凡爾賽CTO辭職:寫代碼才最快樂!管理只會影響我搞研發”;著名的Linux創始人Linus大神也是出了名的熱愛編程。對于這樣的追求(土豪),拋棄功利熱愛編程,我覺得在編程上完全可以喜歡什么方面就追求什么方面,是廣泛的發現興趣探索興趣,還是在一個方向上深入挖掘都沒有問題,大可以今天做前端,明天搞開發,后天攢算法,一人搞定全棧。
但是對于絕大多數人來說,編程更多的是職業發展道路上一個立身的手藝,在眾多專業技術方向上挑了一個自己比較喜歡和熱愛的。程序員的發展和眾多職位的發展一樣,每個人都希望自己能夠往"上"走:更專業,更能在職場上發揮自己的作用和影響力,從單兵作戰做小事,到帶隊做大一點的事,再到影響一個領域,影響一個行業。這樣的發展單單靠自己各方面都懂,都有涉獵,恐怕是不行的。剛畢業的應屆同學可以靠自己的知識儲備做自己的標簽,久經職場的同學必須靠自己在某些領域做出的成績做自己的軍功章。
所以我們越早在某些方向做出自己的成績,對自己的成長和發展是越好的。我本人是做算法的,算法領域有很多大牛在學校期間就已經找準了自己的發展方向,并做出了成績,例如caffe作者@賈揚清大神,Taichi作者@胡淵鳴等等。他們的成就就需要及早的找到自己的方向+不懈的努力+億點點的天賦……對我們絕大多數人來說更需要及早的找到一個熱愛的,希望精通的方向并做出成績。
我自己的經歷其實不是好的榜樣,我抱著做機器人的夢想本科學的機械,在學校的時候對什么都感興趣,既參加過機器人大賽,參加過結構設計大賽,也和同學做過熱力學相關的一些機械設計;一個比較有意思的經歷是,當時在學校還做過一個上天失敗的小衛星。當時學校的微小衛星研究所發射了一顆皮星(體積很小的衛星)之后,在學校辦了一個小衛星的比賽,我們做了一個模擬衛星太陽能電池片自動追蹤陽光的衛星模型,在答辯前熬夜完成了,然而在最后測試的時候由于線的固定太過粗糙,在運動中扯掉短路了,把電路都燒了……萬幸留下了視頻支持最后的答辯。對我后來職業選擇影響比較大的是臨畢業用Kinect做了一個姿態識別控制無人機飛行的項目,初步接觸了視覺算法的一些知識。
后來研究生就真正的開始做起了機器人的方向,也是研究生時期做的控制算法和視覺算法的經歷讓我走上了程序員的道路。在這個過程中自己也是對機器人領域中的SLAM方向產生了興趣,自己惡補了一些知識,并靠著這些最后走上了這個方向的職業。一方面我覺得自己如果能早一些找到自己的方向并且積累起來一些成果,肯定對自己的發展是要好很多的,但是另一方面每個人也確實需要一個認識自己的過程,但這個過程我想還是越快越好。在這個過程中,我們自己的技術發展就像是一棵樹,我們盡可以無限的去展開自己的枝葉,多了解一些不同的方向和知識,但一定記住這是為了讓自己的枝頭長得更高。
02
淘系技術部 - 應用算法 - 朔玥
“大部分的精力還是要用于鞏固自己的長處上,你一定要有競爭力的依憑。”
做一件事是要精還是要廣?其實相當于賭博里你是要多壓,還是要單押。我們的籌碼是有限的,當然我們的精力也是有限的,不可能去做所有的選擇。那么這時候,問題就變成了如何去組合投資獲得最大化的收益。
如果你選擇去把所有的籌碼壓在一個選項上,那么你就一定要去承擔選擇失誤帶來一切清零的后果。但是我們也知道,如果你選擇到一支潛力項,不費吹灰之力就可以贏到盆滿缽滿。所以孤注一擲,一定對應的高風險。
另外一個選項就是廣博,它帶給我們的好處是平攤風險,但是平攤風險的同時收益也會被稀釋掉。比較好的一種做法,應該是兩者相結合,在該廣博的時候廣博,在該專注的時候專注。
作為一名算法工程師,我的建議是,廣泛的去涉獵相關領域的知識,以及弱相關領域的知識,因為這些知識全都可以作為你自己的儲備,作為你專注行業的加成。比如說,你從事圖像識別相關算法研究,那么直接的,除了圖像相關的專業知識,一些基礎的知識例如代數分析等數學理論,計算機原理與體系結構,甚至色彩,攝影美學等知識,都可以為模型設計帶來一定的輔助。除基礎的知識以外,相關領域比如自然語言處理當中的時序模型就與視頻圖像分割問題有很多的共通之處;信號處理中很多變換算子能夠直接遷移到圖像處理當中。這些知識,都可以作為你研究圖像算法的加成。
又如,你想不到心理學,消費者行為學以及經濟學都可以為我們的工業推薦體系賦能。在洞悉了消費者在購物時的選擇動機,心理活動以及當下經濟趨勢后,算法設計者能夠依據這些先驗知識有聚焦地設計相關的模塊,或是作為趨勢因子加入算法當中。用一種更柔軟的方式將大眾認知融入模型,將表象和理論相結合,從而更好地發揮推薦系統的效能。
世界上很多知識底層是相通的,不要去抗拒學一些基礎的知識,很有可能那將是你未來抓住機遇的契機。但是,大部分的精力還是要用于鞏固自己的長處上,你一定要有競爭力的依憑。廣泛的涉獵,精準地融會貫通,提取出你需要的那一部分,轉化為自己需要的能量。
03
淘系技術部 - 前端技術 - 禾鳥
“我個人經歷覺得,精進一門技術,不管是對于開發還是其他工作,都是重中之重!”
當我剛畢業的時候,在一家小廠做Flash游戲開發,由于當時開發人員配比嚴重不足(qiong),所以不但要用AS3去寫前端游戲UI功能,還需要用NodeJS寫服務端游戲邏輯、SQL處理數據讀寫操作、HTML/CSS/JS寫后臺配置管理頁面,且一度在公司沒有招到測試的情況下,所有的功能測試只能通過自測來完成。
時間一長就有些膨脹了,自我感覺非常好,覺得自己就是全棧,覺得只有更大的舞臺才能配得上自己,進入大廠應該是輕而易舉的事情,于是開始往網易、阿里、華為一些大廠投簡歷,Flash游戲開發、H5游戲開發、Web前端開發、NodeJS開發、服務端開發、測試開發各種崗位都投了遍。結果就是被現實狠狠地打了臉,投的簡歷石沉大海,少有的幾個面試也都是一輪游。
后來總結反思了一下,在所有面試中,面試官經常會問這么幾個問題:XX原理是什么?XX如何實現?對XX你是如何理解的?對于XX功能是否有更好的解決方案?面對這些問題,發現了自己其實對底層原理一竅不通,所有都還是停留在使用層面。
看清楚了這個問題之后,我暫時放下了其他域的學習,專注在前端領域的學習,從基礎的HTML/CSS/JS入手,到lodash/JQuery等常用工具庫的使用,再到Vue/React等主流框架的使用以及原理的學習,以及ES6、TS等學習掌握。等熟練掌握了這些技能之后,再深入到瀏覽器工作原理、網絡通信機制、前端性能優化、穩定性安全保障等知識點的學習。一步一步從搬磚菜鳥變成了熟練搬磚工,然后繼續朝著搬磚磚家努力。
總的來說,在小廠,老板當然希望能更省錢,巴不得一個人就能干完所有的活。而對于個人而言,精進一門技術,不管是對于開發還是其他工作,都是重中之重!
04
淘系技術部 - 移動開發 - 臨境
“不要把自己當做業務研發的工具人。”
這個問題沒有標準答案,角度不同,得出的結論會大相徑庭。前不久剛從小廠跳到阿里,簡單聊下我自己的感受。
小廠會更偏重于業務,因此我們更多的是在實現業務方的需求,日常的研發工作也少有接觸特別難或者深的內容。這個階段不是說基礎不重要,但深入學習基礎知識可能對你業務研發不會有特別明顯的提升。
曾有段時間我為了學習算法知識跑去刷 leetcode,刷完兩三百題后陷入了迷茫。這些刷題獲得的算法知識在大部分的業務場景中不太能用上,雖然它對于在編程中邊界條件判斷、減少低效代碼確實起到了一定的幫助,但相較于投入的時間來說性價比略低。
同樣道理,學習操作系統、計算機網絡、計算機組成原理能讓你對整個計算機體系有一個更深層次的認識,但工作的人不比在校生,時間比較有限,如果你不是一個特別特別自律的人,投入時間沒有看到明顯產出很可能會中途放棄。
如果想要在工作的同時更深入學習一些計算機基礎知識,可以從你正在做或者感興趣的性能優化入手。不少性能優化手段背后都伴隨著深入的知識,比如之前不少大廠分享的針對 iOS 二進制重排優化冷啟動的內容。學習過程中一定會碰到自己不了解的知識,一點點去積累,會比盲目的抱著一本磚頭書直接啃更容易堅持。
另外,如果是業務研發,請一定鍛煉自己對業務的理解程度,不要只停留于需求來了做完就完了,把自己當業務的工具人沒有對個人成長沒有益處。
最后,和大家分享一句我和喜歡的話:“書上沒有知識,書上只有信息;知識是在特殊的工作和行動中運用信息的能力。”共勉。
結語
程序員要精還是要廣,并不是一個有著標準確定答案的選擇題。
精于基礎,廣于工具,熟于業務,永遠保持進步和學習的心態,希望各位都能找到最適合自己的技術成長路徑。