軟件開發(fā)者升職加薪的8項技能
私下里,經(jīng)常有一些讀者問我:“作為一名軟件開發(fā)者,我應(yīng)該掌握哪些技能,才能被領(lǐng)導(dǎo)賞識給我呢?”說實話,我心目中很多選項,不少于 20 個,但我斟酌再三,只挑選了其中最能讓你受益的 8 個,不僅能讓領(lǐng)導(dǎo)賞識你,還能讓領(lǐng)導(dǎo)給你升職加薪。
01、吃透一門編程語言
這個技能看起來似乎沒有必要強(qiáng)調(diào),畢竟程序員不懂一種編程語言也說不過去啊。我之所以再次強(qiáng)調(diào)是怕你“貪心”,以為技多不壓身就拼了命的學(xué)很多種編程語言。
有個大二的學(xué)生就曾經(jīng)問我:“你好呀,老哥,有個問題想咨詢一下您,我專業(yè)學(xué)的是 C#,但聽說以后不太好就業(yè),所以就自學(xué)了一段時間 Python,但感覺越來越混亂了,您有什么好的建議嗎?”
我只能說不混亂才怪。編程語言雖然有相似的語法,但畢竟是不同的編程語言啊,之間還是有很多差異的。對于初級程序員來說,切勿貪多,先把一門編程語言吃透再說,等你有了融會貫通的本領(lǐng),再去學(xué)新的編程語言也不遲。
我剛剛查了一下(見下圖),C# 還是挺熱門的編程語言,沒到不太好就業(yè)的地步,別隨便聽信別人的話,要學(xué)會自己去判斷。Python 是門不錯的編程語言,增長勢頭很猛,但遠(yuǎn)沒到那種獨霸天下的地步。
學(xué)校有不盡人意的地方,但不至于蠢到讓學(xué)生學(xué)一門已經(jīng)被市場淘汰的編程語言。在這一點上,我寧愿站在支持學(xué)校的立場上,否則就太糟糕了。
我承認(rèn),學(xué)霸學(xué)什么都快,不僅學(xué)的快,還比平常人學(xué)得好,學(xué)得多,因為他有一套自己的學(xué)習(xí)方法,但大部分學(xué)生并不具備這種條件。如果你對自己沒有這種認(rèn)知的話,很可能會陷入泥潭。
因此,我給出的建議是,深入并且專注于一種編程語言,當(dāng)你對使用這種編程語言充滿信心時,再去學(xué)其他的編程語言也不遲。
02、整潔的代碼
當(dāng)你學(xué)會一門編程語言之后,接下來要考慮的事情就是讓你編寫的代碼變得更整潔,更易于理解,更富有藝術(shù)。關(guān)于藝術(shù),我想到了一段話,王小波在他的雜文《用一生來學(xué)習(xí)藝術(shù)》說的:
我念過文科,也念過理科。在課堂上聽老師提到藝術(shù)這個詞,還是理科的老師次數(shù)更多:化學(xué)老師說,做實驗有實驗藝術(shù);計算機(jī)老師說,編程序有編程藝術(shù)。老師們說,怎么做對是科學(xué),怎么做好則是藝術(shù);前者有判斷真?zhèn)蔚姆▌t,后者則沒有;藝術(shù)的真諦就是要叫人感到好,甚至是完美無缺;傳授科學(xué)知識就是告訴你這些法則,而藝術(shù)的修養(yǎng)是無法傳授的,只能夠潛移默化。
不得不說,偶像就偶像,把藝術(shù)的真諦闡述得很清楚。我見過不少臃腫的代碼,它們讓我想起“裹腳布”這三個字;我也見過不少整潔的代碼,它們讓我想起“藝術(shù)”這個詞,我想創(chuàng)造出它們的程序員一定富有工匠精神。
Elliot Chance 曾表達(dá)過這樣一個觀點,他說:“要分辨兩個程序員的優(yōu)劣,就是給他們一樣的時間,越好的程序員寫出來的代碼越少(當(dāng)然是可以運行的)。”
我同意他的觀點。越多的代碼并不一定代表著認(rèn)真,有可能代表的是懶惰,懶得去思考,才會寫出臃腫的代碼。如果我們程序員沒有這種(寫更少代碼的)追求的話,那我們的編程技藝就只會原地踏步,長此以往的后果就是各種避免重復(fù)造輪子的第三方類庫就不會出現(xiàn)。
03、算法與數(shù)據(jù)結(jié)構(gòu)
說起來慚愧,在很長的一段時間里,我對算法和數(shù)據(jù)結(jié)構(gòu)存在著很大的偏見,認(rèn)為它們就好像懸掛在夜空中的月亮,雖然很美,但卻很遙遠(yuǎn)。
因為這種偏見,在敲代碼的過程中吃了不少的悶虧,經(jīng)常遇到一些實際的問題,由于無法充分利用數(shù)據(jù)結(jié)構(gòu)將數(shù)據(jù)之間的關(guān)系通過合適的算法策略進(jìn)行有效地存儲轉(zhuǎn)換,就導(dǎo)致程序的性能很低。
作為一個吃過虧的男人,我必須要負(fù)責(zé)任地提醒你,趁有大把的時間和精力,多投入一點到數(shù)據(jù)結(jié)構(gòu)和算法上面去。基礎(chǔ)知識就像是一座大樓的地基,它決定了我們的技術(shù)高度。數(shù)據(jù)結(jié)構(gòu)和算法就是最重要的基礎(chǔ)知識,學(xué)習(xí)它們的過程就像是在打地基。
舉個例子來說,假如你要在一個列表中對元素進(jìn)行排序,那么可采用的算法就有下圖中的這 10 種,每種算法所花費的時間,所占用的內(nèi)存都不盡相同。換句話說,如果你不能夠熟練地掌握算法和數(shù)據(jù)結(jié)構(gòu),就很難找出一個優(yōu)雅的解決方案。
長期來看,大腦思考能力是一個人最重要的核心競爭力,而算法是為數(shù)不多的能夠有效訓(xùn)練大腦思考能力的途徑之一。有了這項能力,很多別的程序員解決起來很困難的編程問題在你這里就會迎刃而解。
04、基本的數(shù)據(jù)庫知識
雖然軟件開發(fā)人員更應(yīng)該專注于程序設(shè)計而非編寫和優(yōu)化 SQL(應(yīng)該交給專業(yè)的數(shù)據(jù)庫管理員負(fù)責(zé)),但在我們國內(nèi),只有優(yōu)秀的企業(yè)才會有數(shù)據(jù)庫專家。扎心了。如果你想要在軟件開發(fā)這條道路上走得更高更遠(yuǎn),懂一些基本的數(shù)據(jù)庫知識是必須的,比如說:
- 如何將業(yè)務(wù)中的對象屬性轉(zhuǎn)化為數(shù)據(jù)庫字段;
- 如何從數(shù)據(jù)庫中檢索數(shù)據(jù),并將數(shù)據(jù)集拼接在一起;
- 如何往數(shù)據(jù)庫中插入、修改、刪除數(shù)據(jù);
- 索引的數(shù)據(jù)結(jié)構(gòu)及原理;
- SQL 語句的優(yōu)化;
- 等等。
如果再懂一些數(shù)據(jù)庫分庫分表的中間價,那你可能就會成為團(tuán)隊的寶貝了,畢竟所有的應(yīng)用程序都要與數(shù)據(jù)庫交互,另外,數(shù)據(jù)庫是系統(tǒng)最先出現(xiàn)性能瓶頸的地方——總有你大展身手的時候。
05、技術(shù)框架
除了要吃透一門編程語言,我強(qiáng)烈建議你再學(xué)習(xí)一個技術(shù)框架。如果你像我一樣是個 Java 后端開發(fā)人員的話,Spring 的系列框架(Spring MVC、Spring Boot、Spring Cloud)就不得不學(xué)了;如果你是一個 C# 開發(fā)人員,.NET Framework 就不得不學(xué)了。
技術(shù)框架是一組通用類庫的集合,它幫助我們讓編程任務(wù)變得更簡單,畢竟輪子替我們造好了。假如說沒有技術(shù)框架的話,我們就好像坐著馬車前行,而不是飛機(jī)、高鐵和汽車,開發(fā)效率就要大大降低了。
06、源代碼管理工具
記得我剛參加工作那會,用的源代碼管理工具叫做 CVS(Concurrent Versions System),估計有不少讀者沒聽說過,非常非常難用。后來遷移到 SVN(Subversion)后,情況總算是有了很大的改善,它不僅支持 Eclipse,還有專屬的客戶端,除了管理源代碼,還可以管理許許多多的文檔。
每天上班的時候先從服務(wù)器獲取新的代碼,然后開始一天的工作,下班走之前切記要提交一次代碼,否則就很容易耽擱團(tuán)隊其他成員的開發(fā)進(jìn)度。

現(xiàn)在呢,有了 Git,它是一套開源的分布式版本控制系統(tǒng),可以有效、高速的處理從很小到非常大的項目版本管理。它與 SVN 比較大的不同之處,在于每個開發(fā)者的電腦上都會有一個本地倉庫(Local Repository),即便是沒有網(wǎng)絡(luò)也一樣可以提交版本,查看版本,以及比較版本;等到網(wǎng)絡(luò)連接上之后,再提交到服務(wù)器端。
源代碼管理工具比較大的好處就在于它可以幫助我們保留不同文件更改的歷史記錄,并且允許多個開發(fā)人員對同一文件的代碼進(jìn)行合并。舉個例子來講,小王完成了一項任務(wù),然后提交了代碼;但他覺得有待改進(jìn),于是他重新修改了代碼并提交到了版本庫,誰知道,程序上線后出了 bug,這時候源代碼管理工具可以幫助他快速回滾到之前正常的版本。否則的話,小王只能被祭天了。
07、測試
測試真的是太重要了!但并不是所有的開發(fā)者都這樣認(rèn)為,這種感覺在我回到洛陽后尤其強(qiáng)烈。竟然有團(tuán)隊成員不經(jīng)測試就把代碼提交到代碼庫,并且是會報錯的那種,我天吶,遇到這種隊友我也是醉了。
在我回來之前,是在一家日企工作,測試是一項非常重要的工作,占用的時間比代碼編寫的時間多多了。從單元測試到集成測試,所有的測試結(jié)果都要整理成冊,所有的邊界條件都要測試到,哪怕你覺得完全沒有必要。但正是這種一絲不茍的態(tài)度,成就了日企軟件高質(zhì)量的美譽。
一個優(yōu)秀的開發(fā)人員絕不允許他的代碼在交給別人之前不經(jīng)測試,我想這是不容置疑的。
08、調(diào)試
說句實在話,在我做程序員的這 10 年里,調(diào)試代碼的時間比編寫代碼的時間要多得多。因為解決 bug 的難度要比創(chuàng)造 bug 難得多,首先你要先復(fù)現(xiàn)問題的場景(真的是難啊),要復(fù)現(xiàn)問題就需要你擁有出神入化的調(diào)試技巧,否則只能錘爆鼠標(biāo),然后大喊“為什么,為什么,為什么我的代碼無法正常運行呢?”
入門級的調(diào)試很簡單,你只需要在發(fā)生問題的代碼處打個斷點,然后再跑一跑,就能從堆棧信息和代碼的上下文中發(fā)現(xiàn)問題。難度再上升點的話,就需要你創(chuàng)造代碼執(zhí)行的條件;再難的話,你甚至需要內(nèi)網(wǎng)穿透,比如說微信公眾號開發(fā);再再難的話,就不是一句半句能說得清楚了。
總之呢,調(diào)試就是為了讓你弄清楚代碼不能正常運行的真正原因,如果你的調(diào)試技巧不過關(guān)的話,甚至有可能會被表象蒙騙,從錯誤的角度去修改 bug,從而引發(fā)更多、更大的問題。
09、鳴謝
好了,親愛的讀者朋友,以上就是本文的全部內(nèi)容了,能看到這里的都是很優(yōu)秀的程序員,我必須要伸出可愛的大拇指為你點個贊。如果你也覺得自己很棒的話,就無情地轉(zhuǎn)發(fā)和在看吧,我需要你的支持。

























