1. 程式人生 > >程式設計新手如何快速提高開發能力?

程式設計新手如何快速提高開發能力?

說服自己

拿我自己這一年的工作經歷來說吧。

首先,說服自己很重要,什麼叫說服自己呢,就是一定要先把自己“忽悠”了,讓自己覺得現在做的事情非常的牛x。

去年這個時候,我也是剛畢業進公司,上來就要搞一個之前從沒有接觸過的技術,怎麼辦?

首先,開始瘋狂暗示自己,這個專案很牛x --- 大名鼎鼎 Erlang 平臺,號稱可以寫出十幾年不用停機,超高可用性的專案,同時搭配吸取了 Ruby on Rails 精髓的 Elixir/Phoenix 開發框架,開發速度據說是 Java 的 20 倍牛逼的技術,學起來還不得偷著樂?

然後搗鼓開發環境吧,語言太新,沒有成熟 IDE,正好可以學學多年來一直想學的 Emacs --- 這可是號稱神之編輯器,號稱偽裝成編輯器的作業系統,號稱無所不能。

硬著頭皮學,一開始儲存檔案快捷鍵都要想一下怎麼按,把快捷鍵列表放在螢幕另一邊,一邊看一邊寫,竟然也能慢慢上手了。

然後專案跑起來,學習語言,理解核心要點,開始寫程式碼,寫專案 --- 從一開始寫爬蟲,到研究如何打包專案,熱部署,再到程式碼結構的設計優化 ...

甚至橫向發展: 前端,互動設計,SEO 都開始涉及。慢慢的也能理解更深層次的東西了,非常有成就感。

但是還不能滿足,能不能更好?學習一下別的大牛是怎麼做的?都用的什麼?最新的開源專案用的什麼技術?學過來!

於是埋頭研究,把公司老舊技術替換成更好的新技術,GraphQL,持續整合/持續部署(CI/CD) ...

同時自己也搞點個人愛好,比如給自己部落格用上公司還不敢用的更加激進的新技術,折騰一下 ArchLinux,嘗試自己搭建一個代理服務,等等等等 ...

這樣既能提升自己的水平,又給公司創造了價值,這樣帶著榮耀感去學,怎麼會覺得枯燥?

總之,“自我催眠”,認為自己做的事情很牛x,這樣做起來才會有激情。不然如果自己都覺得無聊,一看見就煩,那樣能做好才奇怪。

內功

貌似學了這麼多東西,如果僅僅只能學到點新技術的用法,能行麼?新技術日新月異,瞎追是追不上的。這就又回到老掉牙的話題了,內功。

真正的聰明人聰明在思考問題的方式和你不一樣。聰明人有聰明人的思路,而你想不到這個思路。 但要知道大部分人並不是聰明人,所以也不要自卑。

扯遠了,再說內功。為什麼有的人學知識特別快?可能並不是因為他有多聰明,而是他內功紮實。也就是對計算機的知識體系有一定程度上的理解。

比如在你懂了計算機網路之後,就可以很快理解 RESTAPI,GraphQL,RPC 之間的異同,也可以明白即時通訊協議 XMPP,MQTT 的優劣。

比如你瞭解 Lambda 演算,編譯原理,形式語言,自動機,也就能理解一個語言為什麼要這麼設計語法,為什麼不能這麼寫。

比如你懂了資料結構,你就能理解資料庫,搜尋引擎中的細節原理。

這些知識並沒有被什麼邪惡組織封鎖,只要你想學,網路上有大把的資源供你所學。

所以你眼中的聰明人真的是天才麼?不排除真的有天才,但我想更多的是普通人,只不過他學的稍微比你多一點,知識體系比你更系統一點罷了。

所以只要你願意學,願意思考,願意動腦子,願意較真,願意折騰,也一定能成為別人眼中的聰明人。

道理我都懂,但是到底要怎麼做?

技術是複雜的,而且每個人都有自己的學習習慣,所以具體例子可能並不適用於所有人。

所以到底怎麼做才能快速提高開發能力?

別急,先講兩個故事。

利其器

一開始學校老師讓你用純文字編輯器,不讓用 IDE,所以你就選則了比較流行的 Notepad++。

這是第一步,先上手。第二步,在用的過程中尋找問題,並解決問題。

比如,經常因為標點符號打錯而不能通過編譯,怎麼辦,首先老師不讓用 IDE 的原因之一就是讓你認識到這些錯誤,養成一種嚴謹的習慣。

那就打字之前小心嚴謹一點。但是就算你非常嚴謹,難免也有筆誤的時候,這個時候 Eclipse 登場了,問題解決。

然後迴圈這個過程 --- 遇到新的問題,解決問題。

比如有些程式碼片段記不住怎麼辦,用自動補全。變數改名方法結構調整的時候非常麻煩怎麼辦,用 IDE 的重構功能,等等。

其中解決問題的時候也會遇到問題,比如怎麼才能找到問題的解決辦法呢?一開始總是黑暗的,這個時候可以求助他人,比如現在有人告訴你,搜尋引擎是個好東西,於是你知道可以用搜索引擎。

搜尋引擎搜尋不到怎麼辦?這個時候就發揮作為人類的能力,也就是結合和運用之前的經驗的能力,怎麼辦?你現在只會用搜索引擎,那隻好在搜尋引擎裡搜尋“如何使用搜索引擎”... 結果還真搜到幾篇有用的內容,一看都是來自某某公眾號的文章,果斷收藏。

發散思維之後還要收回來,得到了搜尋引擎使用祕籍之後要投入使用啊,比如把某搜尋引擎換成更好的搜尋引擎,把整句分割成關鍵字來查詢,最終你成功搜到了想要的結果。同時,積累了數個收藏夾。

下次再遇到問題的時候,你又可以站在之前的經驗上,繼續提高自己。

這樣你就滿足了嗎?雖然你解決了自己遇到的問題,但是有沒有可能另一種解決方式更完美呢?

所以繼續發動人類能力,於是你從你同學口中得知一種叫 IDEA 的東西,又從搜尋引擎上得知 IDEA 的優點,又在之前收藏的論壇裡發現了一篇 IDEA 的教程,再結合自己 Eclipse 的使用經驗,你成功的上手了 IDEA。這就是人類的能力,可以結合運用之前得到的經驗的能力,而不是隻能零散的使用。

你甚至把這個過程總結成一篇文章,得到了許多膜拜,也得到了許多批評建議,不僅能收穫了,還能輸出了。

最後,追求永無止境,能不能更好?更舒適的字型,更快的快捷鍵,更強的程式碼模板 ... 總之,就像劍客對其兵刃的喜愛一樣,投入精力不斷打磨,總是有回報的。

重構

拿著錘子不會錘釘子也不行啊。工具並不能直接提高你的程式設計水平,怎麼辦?

繼續發動人類天賦技能,之前你已經學到了遇到問題解決問題的能力,那寫程式碼有什麼問題呢?

首先第一步還是先搞起來再說,於是你花了三天時間寫了一個“高達” 80 行的程式。寫完之後覺得自己好牛x啊,厲害的不得了。

冷靜下來,這樣夠了麼?不夠,因為程式碼中有三段都是重複的,僅僅只有一點區別,如果以後需要改動,那就需要改動三處程式碼,這樣不行。

於是你花了兩個小時把那些程式碼改寫成一些函式,使用之前學到的 IDE 重構功能,消除了重複程式碼,現在只剩下 40 行了。寫完之後感覺已經超神了,怎麼會有這麼聰明的人?

冷靜,這樣還不夠,雖然提取了出來,但是方法名不能體現出功能,而且可讀性太差。如果過兩天來看完全不知寫的啥。

於是你整理程式碼結構,增加註釋,程式碼變得賞心悅目起來。寫完之後感覺精神振奮,擡頭一看,天已經黑了,嗯,晚上能吃三個饅頭。

冷靜,這些程式碼有沒有值得總結的通用邏輯?下次如果遇到類似問題能不能直接寫出最後一步的程式碼而不是再這麼重構一遍?

於是你認真分析,總結出一個非常通用的邏輯,什麼時候可以用,什麼時候不適用。寫完長舒一口氣,晚上能睡個好覺了。

這麼晚了只能吃夜宵了,路上你想,我這個東西這麼厲害,怎麼能忘了出去炫耀一下?馬上開啟手機,正準備發帖,突然想到,聰明人大有人在,是不是已經被捷足先登了?

於是你利用自己之前積累的豐富的搜尋引擎使用姿勢,快速搜尋到原來早就有人總結了出來,還出了書,稱之為設計模式。不禁出了一身冷汗,這要是真出去得瑟了還不得被笑話,幸好搜了一下。

吃完飯回來,翻開設計模式,哦,原來別人是這麼總結的,大同小異。設計模式算是理解了,今天是太晚了,只能以後再多加練習。

一星期後,你發現有人在抱怨設計模式好難學啊,背也背不會,用也不會用,根本無從下手。於是給他耐心講解一二,那人發出感嘆,“大神啊,你怎麼這麼聰明。”

你一時語塞 ... 真的是我聰明麼?

總結

僅僅只是兩個故事麼?

其實,開發能力的提升都像這兩個故事中說的那樣。

如何寫出高質高效的程式碼?並不是一蹴而就,同樣需要先按以往經驗寫出初版,然後提取、抽象,最後歸納總結,甚至開源分享。為下一次更好更快的開發做好準備。

所以並不是按照某種經驗照做就可以快速提升個人能力了,而是需要按照一定的節奏,站在之前的基礎上,不斷自我升級,迭代,優化,開發水平和速度才能穩步提高。

那到底是什麼節奏呢?各位都是程式猿了,那就總結的程式一點:

遇到問題

解決問題

若解決途中再次遇到問題,則解決子問提

能不能更好?

同時,說服自己非常重要,自信,但不能自滿,要在覺得自己很牛x的情況下虛心前進,這樣有動力又走的遠。

這一點兒也不矛盾。『雖知大海的深邃,但仍為撿到貝殼而歡呼。』這是我非常喜歡的一句話,作為結尾。