如何提升你的能力?給年輕程序員的幾條建議
一轉眼工作已有 8 年,前兩天公司一位初入職場的同事希望我給一些建議與經驗。我覺得這個話題很有價值,這里以個人的想法與經歷寫成此文,希望給年輕的開發(fā)者們一些啟發(fā)。
我工作過的公司有 4 家,NVIDIA, Google, Slide 和 Glow。其中兩家是知名的大公司,Slide 我是D輪過后加入的,那時約 150 人。Glow 則是從它第一天創(chuàng)立,一直走到現(xiàn)在。個人的工作也從 Developer,Tech Lead,Engineering Manager 到 CTO。這些經歷使我對程序員的個人發(fā)展之路有比較全面的看法。
如果你問一個年輕的前端開發(fā)人員,你在今后的 3 年內如何提升自己的能力?他可能會說“我現(xiàn)在對 Web 前端比較熟悉,但我想深入了解 AngularJS,另外 React 現(xiàn)在發(fā)展的很快我也想看一下。之后,我會花時間去學習 iOS 和 Android 開發(fā)。”看上去不錯,但缺乏系統(tǒng)性的目標?;蛘哒f,他制定了學什么,但對為什么要學這些并沒有仔細的思考。
在技術領域,有太多的東西會迅速的過時,如何利用有限時間,最大化你的長期收益?這里我可以給出幾條建議
打造你的工具箱
工欲善其事,必先利其器。每個開發(fā)者都應該有一把自己的瑞士軍刀,在將來漫長的職業(yè)生涯中,這些工具可以為你省下寶貴的時間,并幫助你更好的組織個人知識庫。舉兩個例子
- 一套高效的開發(fā)環(huán)境
- 一個信息采集器和一本筆記本
高效的開發(fā)環(huán)境
我們可以從編緝器談起,這里有 IDE vs Text Editor,有 Vim vs Emacs,有 Sublime vs Atom,那該如何選擇呢?在做選擇之前,我們先想想自己的目標。我們希望這是一個長期的投資,這款編緝器能被長期使用,在這個過程不斷的打磨,使其能完 全適合自己的習慣,最大化編緝效率。如果程序員是俠客,編緝器則是他手中的劍。
雖然我是 Vim 的重度用戶,但我覺得當年選擇 Vim 時有欠考慮。如果讓我重選一次,我的第一選擇會是 Emacs,第二選擇會是 Atom。Emacs 已存在 30 年,社區(qū)仍然活躍,其可擴展性在編緝器中無人能出其右。Emacs 的腳本語言 elisp 又是 lisp 的一種 dialect,我覺得對 lisp 的學習可以提升程序員對編程核心思想的理解。另一個加分點是 Emacs 由于其本身的高門檻及 lisp 特質,吸引了大批高質素的程序員,其社區(qū)可謂藏龍臥虎,更誕生了像 Org-mode 這樣神級的插件。反觀 Vim,Vim 的精髓在于 Mode editing,這是值得學習的,可以極大提高文本編緝的效率。但當你熟悉了這一理念后,我覺得可以轉投其他編緝器,因為 Vim 的架構與 Vimscript 限制了其擴展性。Emacs 通過 Evil 插件非常完整的支持了 Mode editing,其他主流的編輯器也有類似插件,所以你一旦掌握了這個理念,在別的編輯器中也可以發(fā)揮作用。可能有人會說沒有一個 Vim emulator 能做到 Vim 100% 的功能,但重點不在于某條指令是否被移植,而是 mode editing 思想的精髓能否被移植,我覺得答案是肯定的。
再看 Atom vs Sublime,Atom 的可擴展性非常好,它的大部分核心功能也是以插件的方式實現(xiàn),這點與 Emacs 有異曲同工之妙。并且其開源的特性,使我相信它有比 Sublime 更持久的生命力。
關于 IDE,我的看法是,我不排斥 IDE,但每個 IDE 都是為了某個特定的任務或是編程語言服務的。做為一個有追求的程序員,可以用 IDE,但依然需要精通一個強大的通用編緝器。
類似編緝器,高效的開發(fā)環(huán)境還包括 Shell,Launcher,窗口管理器,文檔閱讀器等等。其中有一部分只需要你化很少的時間就可以完成配置,它們的投資回報率是非常高。
信息采集器和筆記本
前者是用來收集別人產生的信息,后者則是收集自己產生的信息。前者一個簡單的例子就是瀏覽器的 Bookmark。你需要能隨時將一組有用的信息歸檔,并在未來的某個時刻快速找到它。后者最直觀的例子則是 Mac OS 或是 iOS 自帶的筆記本,這里的目的是能隨時隨地記錄你自己的想法。從本質上講,就是你需要有一套好用的工具來做你的知識庫管理(Knowledge management),也可以說是你知識和思想的外部備份。我個人現(xiàn)在是用 Evernote 同時來做信息采集與筆記的。如果有一個好的流程,你也完全可以用兩個工具來分別把這兩件事做好。但我建議你花足夠多的時間來思考如何組織你的個人知識庫。
以上只是兩個典型的例子,你需要做的是發(fā)現(xiàn)那些你要長期從事的任務(往往不隨技術而改變,也不隨公司而改變),將完成這些任務所需的工具調整至 最優(yōu)。再舉一個例子,我會留意身邊的程序員所用的鍵盤。只有少部分的程序員會買高端的靜電容鍵盤,比如 HHKB。而在我看來,這明顯是一筆很劃得來的投資,程序員在工作的大部分時間里都需要和鍵盤打交道,一個舒適的打字體驗是非常有收益的,更何況這類高品 質的鍵盤都非常的耐用。
#p#
開闊你的視野,構建你的技術體系
首先你要給自己設定一個目標,就如同一個公司會設定它的 Vision。
- 目標要夠大,這樣你才能看到更多的風景。
- 目標應該設定在解決哪一類問題,而不是精通哪一類技術。技術只是手段,不是目的。
例如,“我要成為 iOS developer 中的達人”這個目標,就遠不如“我要成為前端應用開發(fā)的專家”來得有意義。前者學到深處你可能會去鉆研 iOS framework 里各種奇技淫巧,而后者你會開始關注視覺與交互設計,研究各平臺間的差異與共同趨勢。顯然,后者更有助于你的個人發(fā)展。
不過即便有了明確的目標,選擇哪一類技術學習,如何學習,在信息過載的今天依然是一個難題。常有的觀點是應該學習最新的技術,因為老的已經過 時,而反對的觀點則是新技術還不成熟。我個人的觀點是,當初入一個領域時,選擇主流技術框架;當你有一定經驗后,選擇技術時更應該關注背后的推動者,我相 信優(yōu)秀的人和團隊總能打造優(yōu)秀的產品,無論是商業(yè)公司還是開源社區(qū)。不必太在意技術的新舊,因為可能很快都會成為過去時。你真正要學習的是技術背后的思 想。有不少語言與開源項目會寫它的 Coding philosophy,這是很意思的,你可以從它們的源代碼中去驗證這些編程理念。以 Python 為例,如果你執(zhí)行import this
就會看到它的理念,再如 Python 中一個著名的開源庫 Celery,在它的文檔有專門一節(jié)講述它的編程理念。 它們對你的影響會比這些技術本身來得更深遠,這是我給初學者們的一個忠告。同理,我非常推薦讀一些優(yōu)秀開源庫或是語言的源代碼,例如 Python 的標準庫絕大部分都是用 Python 實現(xiàn)的,而且可讀性非常好。如果學習一門技術僅僅停留在用的層面上,你就還沒有完全吸取其中的精華,而且學習的收益會隨著技術的過時而消失。
我的另一個學習原則是,在選擇學習一門新技術時,最大化它與你現(xiàn)有知識庫的差異性。讀起來可能有拗口,例如你會 Django,接下去你應該去學習 Ruby on Rails 還是 NodeJS? 依據這個原則,你應該學 NodeJS,因為它的異步 IO 模型在理念上與 Django 的同步模型差異很大,而 RoR 則與 Django 更多相似之處。但更好的選擇是不要去學另一個 Web framework,去學習 ZeroMQ 或是 Redis,這兩者對于 Web development 也非常有幫助,這樣就做到了最大化差異。從構建一個程序員的技術理念角度,我會推薦每一個程序至少去了解 Lisp 或是一門 Functional programming language,不管你是否會在可見的未來用到,它們能讓你從一個不同的角度看待編程。
最后我建議每個程序員都應該經營一款自己的產品,它可以是一款 app,一個網站或是一個開源軟件。除非你是一個創(chuàng)業(yè)公司的早期員工,不然你可能沒有機會將所有學到的技術或是理念都付之實踐,有很多人想成為全棧工程 師,最快的捷徑就是打造一款自己的產品。任何一個設計師都會精心打造自己的 Portfolio,但大部分程序員卻不會。當評估一個程序員的 Coding 能力時,我會去看他的 Github 上是否有出彩的項目,可惜國內絕大部分程序員的 Github 空空如也,或者只有一些非常簡單的程序。我建議大家好好經營自己 Github 上項目,這不但可以提高你的聲譽,對你將來的求職也非常有幫助。當你報怨求職面試時又被問到各種無厘頭的程序題時,有沒有想過面試官也很無奈,因為他沒有 任何其他方法得知你的 Coding 能力究竟如何。如果每一個程序員都有自己的作品,我想程序員的面試會簡單許多。
重視溝通能力的培養(yǎng)
當被問到“你學得 Junior Developer 和 Senior Developer 最大的差別是什么”時,我最自然的反應是溝通與文檔。溝通包括程序員團隊內部的溝通,與其他團隊的溝通,與 Manager 的溝通等等。我不認為自己有能力把這些問題非常概括地說清楚,不過我可以給一條建議,那就是先學會和你的 Manager 溝通,讓他來教你其余的部分。許多公司都會設置 Manager 與組員的1:1,一個有效率的1:1 應該大部分時間有組員來主導。這需要你在1:1 之前花足夠多的時間來考慮要問的問題,并且最好提前 1 天發(fā)給 Manager,讓他有機會思考答案。許多人對此不太重視,或者只問非常具體的問題而不是一些開放性問題,這樣你很難在你的 Manager 身上學到東西。如果你漸漸懂得如何利用1:1 的時間,它很會成為你在工作中單位時間投資回報率最高的活動。
累積你的人脈
每個人都明白人脈的重要性,但實際做起來卻不容易。參加一些線下的會議或是活動,可能是最直接的擴展人脈的方式之一??上Т蟛糠秩怂坪踔皇侨ヂ?了一場技術講座就回家了。當然,這和不少活動的時間安排也有關系,講座時間排得太滿,茶歇時間短,加上有時嘉賓遲到或是沒控制好時間,干脆就把茶歇取消 了。而實際上,結識一兩個同道中人遠比聽技術講座有價值。下次去參加這類會議,不妨給你自己設個目標,比如至少加兩個同行的微信。之后維系你的人脈可能需 要花更多的時間,下了班或是周末找你的朋友們喝個咖啡吧!
另外我覺得每個人都需要一個職場導師,他可以是你第一份工作的導師或是 Manager,也可以是你認識的其他前輩。你們需要維系一個非常長期的關系,不止于一家公司,最好貫穿你的整個職業(yè)生涯。每當你遇到疑惑時,都可以詢求 他的建議,我覺得這將是你最寶貴的一筆人脈財富。
#p#
尋找發(fā)揮你才華的平臺
最后也是最重要的一步,找到適合你的公司。做為求職者評估一家公司可以看三個方面
- 公司的發(fā)展前景(大公司的話,看所在部門的發(fā)展前景)
- 你將要加入的團隊
- 薪資福利
所以在面試一家公司的時候,你要意識到面試是雙向的,公司在面試你的同時,你也在面試這家公司。面試前你應該對這家公司做足功課,準備好一些有質量的問題,比如指出產品中的問題,詢問開發(fā)流程或是如何做績效評估。到時你也可以檢驗一下你的面試官是否合格。
每次選擇公司對以上三個方面都應兼顧,但在職業(yè)生涯的不同階段,側重點不同。比如,在剛剛工作時,加入一個優(yōu)秀的團隊最為重要,他們可以教會你 很多東西,提升你的能力。工作 5 年之后,你需要一個平臺施展你的才華,體現(xiàn)個人價值,公司發(fā)展前景的重要性迅速提升。當你做出一番成績,證明了自己的價值之后,逐漸進入收獲期,就有了與 公司要價的資格。另一方面,團隊實力對公司的前景也有很大的影響。
對一個剛畢業(yè),初入職場的同學,一個近幾年被問了無數(shù)次的問題“我的第一份工作是去創(chuàng)業(yè)公司還是大公司?”我的回答仍舊是“加入一個優(yōu)秀的團隊 最為重要”。一些知名的大公司,團隊的素質是有一定保證,但創(chuàng)業(yè)公司則不然,團隊素質參差不齊,所以如我前面所說你需要面試這個團隊,做出自己的判斷。不 過除了團隊因素之外,我想提一下畢業(yè)生去創(chuàng)業(yè)公司的幾個好處。首先,在剛畢業(yè)的一段時間內,經濟壓力小,是最自由最能承受風險的時期,而這段時間往往不 長,所以應把握好這個去創(chuàng)業(yè)公司的黃金時段。其次,所有的學生進入大公司后,都會擔任初級職位,某種程度上來講是學校學習的延續(xù),規(guī)范有條理,但缺乏獨立 性和創(chuàng)新性,而這正是中國大部分學生所欠缺的。這方面的能力在一家創(chuàng)業(yè)公司可以得到快速鍛煉,而在大公司可能要等升到中級職位后才有這方面的機會。個人觀 點,僅供參考。
小結
我覺得步入職場的前 3 年對今后的發(fā)展尤其重要,希望此文能對年輕的程序員們有所幫助。歡迎評論!