選擇了計算機專業可能意味著你已經一條腿踏入了I行業,成為一名「預備程序員」。那又要如何
在大學期間打好基礎呢?程序員又需要哪些品質呢?你需要了解程序員必備的「硬技能」與「軟技
能」。
一、程序員成長的必備條件
程序員的工作,說到底就是要編出滿足需求的程序,如果這項工作你做得好,你就發展得好,所
以,程序員的成長,都是圍繞著「編出滿足需求的程序」來展開的。
第一,程序員要了解工作的終極目標是滿足需求。
很多程序員在這一條上就走錯方向了,他們誤以為,程序員的價值就在于把技術玩得神乎其技,于
是,他們腦子里想的,是如何應用各種時髦、炫酷、看起來很牛的技術,而完全忽略了工作的最根
本目的是要滿足需求。
很不幸,這種程序員還不在少數,而且因為這種想法表面上看起來還挺迷惑人,所以很有市場,我
甚至聽過一個初創公司的CTO這樣說:「如果程序員不用最新最牛的技術,那還做這行干嗎?」
他們在工作中就是把各種最新的時髦技術都用上,不出意外,這家初創公司已經倒閉了。
如果你能夠意識到,程序員的工作是要滿足需求,你就已經強過了大部分二吊子的程序員,因為你
看問題的出發點就會不一樣。在做技術選擇的時候,你就會更可能做出正確的選擇。
有的程序員會說,需求滿足不滿足,那是公司的事情,管他呢,我只要學習到最新最酷的技術,公
司倒閉了好歹我還能找到下一份工作。且不說這樣的想法很自私,從「學習的角度說,也是錯
的。我接下來要說下一個程序員成長的必備條件——學習能力。
第二,程序員成長必須要有學習能力。
每個程序員都知道,這個行業有浩如煙海的知識量,且不說層出不窮的編程語言和框架,光是各種
概念和風潮就已經讓人應接不暇了。這個行業的特點就是技術發展快,沒幾年就會有一次革命性變
化,幾年前微服務還只是一個最佳實踐的候選,現在就是開發大型后端應用的標準配置;幾年前整
個行業都在說大數據,這幾年整個行業都在說人工智能.....快速發展的行業,帶來了快速增長的知
識和技術。
那么,我們是應該展現我們的學習能力,把這些都學了嗎?
當然不是!
學習能力的一個很重要組成部分,是知道「哪些需要學,哪些不需要學」,不做區分,什么時髦學
什么,別人鼓吹什么學什么,那就會貪多嚼不爛,最后樣樣都稀松。
為什么我在前面反復強調,程序員應該首先明確自己的領域方向,還有確定自己會在什么類型的公
司工作呢?因為這些選擇將決定什么樣的知識對你是最有價值的。
假設你確定自己的發展方向是移動端開發,服務的公司定位是初創型公司,那么,一個新的手機操
作系統出現,你就應該更加關注,相對地,一個新的機器學習算法,你就沒必要花太多時間了解;
一個快速開發模型出現,你值得關注,相對地,一個超重量級的軟件管理流程,你知道有這么回事
就足夠了。
把學習精力放在和你的方向相關的領域上,你才能獲得最佳的投入產出比,當然,并不是說對和自
己領域無關的東西完全不管不問,從擴大自己知識面的角度來說,你需要了解這些知識點,但是你
不應該被這些東西分散有限的時間。
面對新技術變革的挑戰,抓住自己專屬的領域,傷其十指不如斷其一指,先做到一個領域的專家水
平。
第三,程序員發展要和團隊發展聯系起來。
這個行業,沒有一個人是可以單打獨斗的,你可能覺得自己可以單槍匹馬完成一個項目,但是,你
可以閉上眼睛思考一下,如果你的工作中少了一些同事的支持,你是否真的可以完成?
如果沒有產品經理給你組織明確的需求,你是不是無法開始編程?
如果沒有項目經理給你協調各個部門之間的進度,你是不是無法獲得對應部門的支持?
如果沒有測試人員給你做測試,你是不是也沒有信心讓程序上線?
如果沒有其他程序員給你做代碼審核,你是不是也沒發現潛藏的代碼缺陷?
如果你對上面的問題全都不以為然,覺得你一個人能夠獨立搞定所有的事情,你真的沒必要來讀這
本書,恭喜你,你已經可以成為一個非常獨立的自由職業者了。
不過,對于絕大部分程序員,都應該正視這樣一個現實——你不是一個人在戰斗,你是在一個團隊
中工作。
所以,不光要關注自己的成長,也要關注團隊的成長,當團隊出現問題的時候,要想辦法解決,當
隊友遇到困難的時候,要幫助他們解決。
如果你的團隊發展得不好,你一個人就是有孫悟空的神通,也無法按期把滿足需求的產品推出;如
果團隊發展得好,你哪怕只是像沙和尚一樣跟著取經團隊走,最后也能修成正果。
小結一下,程序員成長的必備條件,根本上就是要明確目的是提供滿足需求的程序,為此,要明白
滿足需求最重要,要正確發揮自己的學習能力,把自己的發展和團隊發展關聯起來。
前面我們已經介紹了程序員的成長,不過,這是基于3年以內工作時間的前提,接下來,我們要把
眼光放長遠一點,來介紹一下在一個更長時間里程序員如何規劃自己的職業生涯。
二、如何確定自己的成長目標?
為了達到成長的目的,必須有針對性地進行訓練,首先要確定自己針對的目標。
請先讓自己回答下面的這些問題:
5年內,我希望自己在這個領域能夠影響到多少人? 3人、10人、100人還是1000人?
這時候可能就有人看不下去了,他們要喊:不要這些虛的,你就直接告訴我,5 年之后怎么讓我的年薪達到 XX 萬元,其他的都不要說。
抱歉,作者只懂提高能力和影響力,不能給你開工資,到底怎么達到這些年薪,在提高能力和影響
力之后都有可能,如果沒有能力和影響力的提升,單純的空想是沒有意義的。
上面說到,關注于對領域知識的了解,代表深度,自己能夠影響多少人,代表廣度。只有在深度和
廣度上都有投入,才能在職業生涯上發展得順利。
這個世界我們無法把握,但是至少能夠把握自己,通過提高自己的能力來實現自己的目標,人的能
力可以分為「硬技能」和「軟技能」兩個方面。
「硬技能」指的是那些外在的、可以量化衡量的技能,我們在學校里學到的大部分課程教育的都是
硬技能,因為這些技能可以通過考試分數來衡量。對于程序員,編程能力就是最重要的硬技能,一
個程序員一天能夠開發一個程序模塊,就比需要一周才開發同樣模塊的程序員硬技能要強,可見,
硬技能是很容易量化衡量的。
「軟技能」指那些內在的、感性的、難以量化衡量的技能,比如專業精神、人際交往能力、領導和
管理能力,我們沒法給一個人的軟技能打分,因為沒有這樣一個量化衡量的方法。
接下來,我們分別介紹如何提高「硬技能」和「軟技能」。
三、如何培養自己的硬技能?
硬技能,對于程序員就是創造軟件相關的專業知識和技能,培養這方面知識,方法其實很簡單,無
論提高任何硬技能,請按照這三個步驟來做:
第一步,確定目標,定義清楚測量自己能力的方法;
第二步,學習對應知識和技能;
第三步,給自己一個測試,看是否達到了目標,如果達到,你就完成了,如果沒有,回到第一步繼
續。
因為硬技能是可以衡量的,所以都可以用這種套路來提高自己。舉個例子,你想要學習Python 語
言,你先確定這個月的目標是要能夠獨立編寫一個游戲,然后你開始學習,每過一周,你就嘗試用
Python編寫一個小游戲,如果能夠完成,代表你的目標達到了,否則,你需要繼續學習。
提高硬技能的方法看似很簡單,但是要做到并不容易,我在知乎上也被無數次問這樣的問題:「我
看了XXX這本書,看到第X章的時候就看不懂了啊!」每次我都試著去了解這些程序員的困難,
最后發現問題根源都是——基礎差。
IT這個行業每一個知識點都是建立在很多其他知識點上的,例如,如果你不理解時間復雜度,你就
不會理解為什么數據庫需要索引,而要理解時間復雜度,你又必須理解算法和數據結構基礎.......依
此類推,實踐中一個小的功能點,要求你懂很多基礎性知識。
要獲得扎實的基礎,最直接的就是接受過計算機專業的本科教育。有很多網上的朋友問我,如果沒
有上過計算機本科怎么辦?很抱歉,我真沒有什么好方法,如果我能夠有一個捷徑可以代替計算機
本科教育,那我也太牛了,計算機本科教育如果能夠這么輕松被替換,也就沒有存在價值了,對
吧?對于想要從事這個行業的小朋友,不要被一時的快感或者利益蒙蔽眼睛,不要在高中畢業甚至
初中畢業的情況下就去參加工作,磨刀不誤砍柴工,請一定至少考一個計算機專業的大學本科,這
樣你才能有一個扎實的基礎。
那只有初中或者高中學歷的人就不能當程序員嗎?當然不是,實際上,我見過一些高中畢業當程序
員的,他們有的很努力,也工作得不錯,但是,他們經歷的辛酸是別人難以想象的,他們的發展天
花板卻是誰都看得到的。
對于已經失去接受計算機專業本科教育的機會的朋友,你也不要灰心,補救的方法也很簡單,你找
到任何一家你心儀的計算機專業院校,打聽清楚他們的專業課程,然后按照他們的課程來學習,這
當然不能和接受全日制教育那么好,但是這是最好的補救辦法。我說過,沒有類似《九陰真經》
《九陽真經》這樣的秘籍,你看完之后就能打通任督二脈,如果你非要說有,那就是計算機本科的
教材,沒有其他捷徑。
有了扎實的計算機基礎之后,接下來就要多實踐,這個行業是一個建立在實踐上的行業,優秀的程
序員只有在實踐中才能培養起來。簡單說,就是少做些無病呻吟的鬼扯,多一些實際創造價值的貢
獻。
提出問題,誰都會;解決問題,就不是誰都能夠做到的了。
根據我的觀察,職業發展良好的程序員,都有一個特點,那就是他們是擅長解決問題的人,而不是
拋出問題讓別人解決的人。
我舉一個非常具體的例子,團隊里代碼質量很差,三天兩頭線上出bug,搞得開發團隊一方面有新
功能的開發壓力,一方面還要抽時間去修線上bug,這時候團隊肯定會有怨言的。
這時候,只會提出問題的人,只會抱怨:「項目一團糟,都不知道怎么辦了。」「大家都沒有干
勁,這樣下去肯定要散?!埂竍ug 越改越多,都不知道為什么還要改?!?/p>
好的問題當然是解決問題的一半,但是,如果單純地提出問題,甚至是以消極態度提出問題,那就
只是添亂。
能夠提出解決辦法的人,會說:「我們把團隊分為兩組,一組集中精力開發新功能,另一組專心修
復線上的bug。」「我們的代碼分支管理可以踩進gitflow的流程,避免代碼提價混亂。」「我們
需要研究分析—下重復出現的bug的類別,針對最多出現的類別進行改進。」
上面的「解決問題的方法」只是一些例子,重點就是,這些方法是針對實際問題的對策,能夠幫助
團隊渡過難關。能夠提出解決辦法并且實施,不光是對自己能力的鍛煉,更重要的是,真正解決問
題的人能夠獲得組織的青睞,獲得更多的晉升機會。
在確定了學習方法、學習態度之后,「硬技能」的培養就是要花時間去反復訓練,沒有任何捷徑,
下面是一些直接的提高硬技能的方法:
1.當你加入一個新項目時,從fix一個bug 入手開始工作,因為你的同事未必有時間幫你過一遍代
碼,而你找得到的文檔往往都是過時或者錯誤的,而fix一個bug是最快速的能讓你熟悉一個項目
代碼的方法。
2當你學習—門新的語言時,用這種語言編一個你每天都會用的程序,比如一個「待辦任務列表」
(Todo List),或者做一個彈珠小游戲,寫這樣的程序的好處是需求非常清晰,因為你已經見過類
似功能無數次了,你不用糾結需求(雖然實際工作中你依然要糾結),你可以心無旁騖地應用你的
編程語言。
3.如果有時間,你寫過的程序,都重新寫一遍,你會發現第二次寫的會和第一次大不一樣,越是不
—樣,越說明你在這期間進步大。
4.每天花一兩個小時來學習工作之外的技術,如果工作緊張騰不出這個時間,那就每周末騰出幾個
小時來學習。
5.不要浪費時間和別人爭論語言或者框架的優劣,把爭論的時間用在實際上手編程上,你不會后
悔。
6.無論如何,給自己定一個目標,每個月不能生產少于1000行代碼,這里說的是新寫的代碼,不
是修改別人的代碼。
7.當你積累了多年的工作經驗,對某一個領域非常熟悉的時候,可以考慮擴展自己的廣度,成為其
他領域的專家,這是讓你擴展影響力的必經之路。
四、如何培養自己的軟技能
相對于硬技能,軟技能在程序員職業發展中的作用更大,為什么這么說呢?因為,硬技能的學習材
料實在太飽和了,各種語言、工具、框架的介紹可以說是長篇累牘地重復,只要你有足夠的時間和
耐心,學好一個硬技能不成問題;與硬技能相反,軟技能的培養是一個很冷門的領域,更多的是靠
程序員在工作和生活中自己去領悟,沒有人給予教導,偶爾能夠開悟掌握軟技能的程序員,就會如
虎添翼。更重要的一點,這個行業里需要的是人與人之間的協作,一個人的硬技能只能做好一個人
的工作,處理人與人之間關系的軟技能卻能讓一個團隊產生合力,達到1+1>2的效果。
我見到過很多程序員,他們覺得技術是一切,有技術就是牛,忽視了軟技能的培養,這就很影響他
們的成長,表現在這些方面:
·只能自己做工作,不能教別人做工作,最后累死自己;
·費好大勁做出的成果,但是表達不出來,團隊和領導看不出這個成果有多重要;
·唯技術至上,看不起技術剛入門的同事,甚至出口不遜,造成矛盾。
這樣的例子數不勝數,相反,軟技能過硬的程序員,即使技術上并不是最強的,職業發展卻會順風
順水,真的,最后人和人之間差距,更多的是軟技能之間的差距。
軟技能是一個比較模糊的范圍,可以包含但是不受限于下面這些能力:
1.表達能力;
2.自我營銷能力;
3.與他人溝通能力;
4.說服他人的能力;
5.組織能力;
6.培訓指導他人的能力;
........
如果要總結上面這些「軟技能」的共同之處,那就是,這些技能都是和「人」打交道,而不是和電
腦、邏輯、程序打交道,所以,「軟技能」的核心,就是和人打交道的能力。
一說到和人打交道,就不得不提「情商」這個概念。情商高的人軟技能就一定高嗎?其實未必,一
個人可以情商很高,但是一到演講的時候就情緒緊張,情商更多的是一個人的為人處世態度,并不
完全代表技能,有一些和人打交道的技能,比如演講能力,依然需要訓練才能獲得。
所以,情商高只是基礎,軟技能依然需要訓練。
程序員這個職業,因為長時間和電腦打交道,而且和電腦打交道就能夠獲得工資,所以往往會讓人
產生錯覺,以為不需要培養和人打交道的能力。
其實啊,軟件開發還是和人打交道的藝術,且不說產品經理、項目經理和程序員之間的溝通是和人
打交道,程序員之間的交流也是和人打交道。前面我說過,要成為更高階的程序員,你的「影響
力」就要擴大,而你所影響的,就是人類啊,所以和人打交道的能力是必修課。
在這里,我們不需要把「軟技能」神秘化,我們可以明確程序員需要提高的軟技能方面,請努力做
到下面這些方面。
1.每一個知識點,能夠解釋得不懂計算機的人也能夠理解,你不一定需要讓對方和你一樣精通,但
是你可以用比喻的方法讓對方理解。
2.你能夠通過演講,把自己的理念傳播出去,為什么要這么做、怎么做,你能夠通過半小時到一小
時的演講說清楚。
3.你能夠讓團隊成員和你交流如沐春風,可以有觀點不一樣,但是不要紅臉吵架。在和人交流的過
程中,請記住卡耐基教誨我們的一句話:「每一個人都希望自己是重要的?!褂涀∵@一點,讓每一
個人都感覺自己重要,你就可以做到每一個人和你的交流都很愉快。
如果你做到了上面三點,你的軟技能已經強過絕大部分程序員,足夠讓你成為資深級別以上的程序
員。
我在微軟工作的時候,有一次一個工號在100之內的資深員工來給我們做培訓,培訓內容覆蓋了硬
技能和軟技能。關于硬技能部分,參加培訓的員工都沒有任何問題,但是當他介紹軟技能培養的時
候,大家就覺得難以把握了,于是,我就問了這位資深前輩一個很具體的問題:「如果我只能做—
件事來提高自己的軟技能,那這—件事應該是什么?」
這位前輩說:「你覺得你日常所能接觸到的人里,誰的軟技能最高?」
我想了想,說:「我們部門門的架構師吧?!?/p>
這位前輩又問我:「為什么你覺得他的軟技能最高?」
我說:「因為他情商高,說話風趣,再復雜痛苦的事情他也能理清楚,所有人都說和他說話總是很
愉快?!?/p>
然后這位前輩就給出建議:「那你就和這個架構師約一個兩個月以后的一對一會議,一個人是肯定
會接受兩個月之后的會議的,然后你就通過和他的接觸,學習他的做事方式,向他看齊。」
后來我按照這位的方式做了,發現這一招真的非常好使,當有了一個明確的榜樣去學習之后,看似
虛無縹緲的軟技能也變得非常具體易學了。
可見,雖然「軟技能」比較軟,難以量化衡量,但是,也有一個對個人來說可以「量化」的培養方
法,這個方法也非常簡單:找到你接觸范圍內的「軟技能」的榜樣,然后努力讓自己變成他那個樣
子。這個榜樣,可能是一個口才很棒的領導,也能是一個情商超高的項目經理,重要的是你認可他
就是你幾年后想要成為的層次,你就可以和他多交流接觸,看他平時都看些什么書,看他平時有什
么編程習慣,看他怎么和別人交流,看他平時怎么處理問題,即使你只學會他的十之四五的本事,
你很快會發現自己已改頭換面,成為大不一樣的人,這時候,你的眼界更高,就可以設立一個新的
榜樣,邁向一個新的臺階。