提升編程能力,一般我們都聽過很多方法,差不多就是多看,多學(xué),多動(dòng)手。但是我們有的時(shí)候會(huì)發(fā)現(xiàn)這種方式太慢,有的時(shí)候會(huì)到一種瓶頸,解決某些問題比較困難,產(chǎn)生挫敗感。今天要談是如何快速有效提升,如何逃避這種陷阱。
編程能力的發(fā)展階段大致是一個(gè)這樣的循環(huán)
一無所知---知道了一些----能解決一些問題----遇到解決不了的問題,覺得自己又是一無所知了
這是一個(gè)螺旋上升的過程,但是其知識(shí)和技能的掌握并非是一個(gè)爬樓梯的一級(jí)一級(jí)的跨越過程。我們也可以表示為一個(gè)類似搭積木的過程。如果你一直往高度上追求,不斷疊,就會(huì)根基不穩(wěn),要想堆更高,那就要更寬的基礎(chǔ)。在編程學(xué)習(xí)中,一般學(xué)會(huì)基礎(chǔ)語言后,就會(huì)旁邊擴(kuò)展一些知識(shí),然后往上一級(jí)發(fā)展。比如學(xué)會(huì)了C語言課本,先能計(jì)算數(shù)學(xué)問題之類的,發(fā)現(xiàn)沒有啥用,寫出的程序不好用;再學(xué)點(diǎn)UI庫(kù),如MFC、Winform,就能寫有界面的程序了;但是進(jìn)一步就會(huì)發(fā)現(xiàn)數(shù)據(jù)存儲(chǔ)遇到問題,于是又學(xué)習(xí)系統(tǒng)api,學(xué)習(xí)數(shù)據(jù)庫(kù),然后解決問題的能力又高了一些。然后逐步下去,學(xué)習(xí)網(wǎng)絡(luò),學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,逐步提升的一個(gè)過程。今天要談?wù)摰氖牵绾慰焖?,如何有效的提升,也就是加速這個(gè)提升過程。
首先一個(gè)是反思
反思自己的程序,如果再寫一次,你會(huì)怎么做?現(xiàn)在做的有那些不足?有那些地方可以用什么方式改進(jìn)?一旦你開始反思,就相當(dāng)于埋下了鉤子,下次學(xué)習(xí)遇到相關(guān)的技術(shù),就會(huì)有動(dòng)力記得更深刻,聯(lián)想到自己的問題,把知識(shí)轉(zhuǎn)化為自己的能力。如果時(shí)間允許的情況,可以隨時(shí)重構(gòu)升級(jí)自己的程序。重構(gòu)是一個(gè)痛苦的過程,可能本來正常的程序,重構(gòu)了很久反而不正常了,很多時(shí)候我們都會(huì)想放棄。但是要相信自己,只要重構(gòu)采用了更好的技術(shù),更清晰的思路,更精簡(jiǎn)的設(shè)計(jì),他的好處會(huì)不斷的展現(xiàn)出來。維護(hù)會(huì)越來越容易、修改bug增加功能也會(huì)很快,而最關(guān)鍵的這個(gè)過程提煉了自己的思維,做完重構(gòu),很可能技術(shù)就上升了一個(gè)層次。
反思包括對(duì)別人的程序反思,是思考別人為什么要這么做?思考一個(gè)程序你來做會(huì)怎么做?這個(gè)過程會(huì)讓你思考你所會(huì)的技術(shù)能解決什么問題,還有那些地方有空白需要進(jìn)一步學(xué)習(xí),也會(huì)思考深入技術(shù)的底層。這就是要提到的另外一個(gè)快速有效提升的方法:試著思考學(xué)習(xí)底層原理
我們多數(shù)時(shí)候,喜歡遇到問題了,就百度查找答案,直接復(fù)制粘貼,改改就用了。并沒有明白其底層的道理,對(duì)于我們的整體能力提升來說,沒有多大用處。就算學(xué)了很多這樣的函數(shù),復(fù)制粘貼,也只是術(shù)的提升,一旦遇到問題遇到bug,就很難弄清楚到底什么地方出問題了。如果從一個(gè)思維方式的層次來思考,百度是在尋找問題是什么what,以及如何解決問題,也就是how。如果一直這種方式下來,最后我們就會(huì)變成瑞士軍刀,什么都會(huì)一點(diǎn)點(diǎn),但是稍微深入一點(diǎn)的問題就解決不了。要有效提升,就是思考Why,為什么要這樣解決,為什么用這個(gè)技術(shù)?為什么是這個(gè)算法?為什么是這個(gè)函數(shù)?一旦開始用這種思維,就是在探求編程之道。這樣在解決問題的過程,就算是百度,也會(huì)對(duì)自己有提升。另外順著這個(gè)思路下去,很多問題就會(huì)觸及計(jì)算機(jī)技術(shù)的本質(zhì):web服務(wù)的底層是如何運(yùn)作?UI控件之間是如何實(shí)現(xiàn)交互?系統(tǒng)線程是如何進(jìn)行調(diào)度?數(shù)據(jù)流編碼是如何影響我們的解析?甚至到更加底層的硬件如何執(zhí)行指令?隨著深入的層次越深,解決問題的能力也就會(huì)越來越強(qiáng)。如果更底層一些,就已經(jīng)脫離技術(shù),進(jìn)入解決問題之道,比如在調(diào)試中,就要應(yīng)用鑰匙通常不會(huì)在鎖孔里面插著。又在設(shè)計(jì)的時(shí)候,要轉(zhuǎn)換焦點(diǎn),從實(shí)現(xiàn)當(dāng)前的函數(shù),考慮到實(shí)現(xiàn)一個(gè)功能的整體需求,考慮到用戶如何使用,以后如何維護(hù)升級(jí),如何擴(kuò)展功能,焦點(diǎn)定得越遠(yuǎn),那么很多問題你的思考方式就不一樣了,很多可能掉進(jìn)去的坑就不存在了。