如何用案例分析法學(xué)習(xí)編程

資深的程序員有豐富的項(xiàng)目經(jīng)驗(yàn)。但是大多數(shù)人沒(méi)有注意到的是,新手程序員也有自身很強(qiáng)的優(yōu)勢(shì),新手所具有的優(yōu)勢(shì)是有充足的數(shù)據(jù),跟豐富的項(xiàng)目模板,比如github。因此我們可以通過(guò)模仿資深程序員的工作習(xí)慣,或者是在既有的代碼項(xiàng)目上進(jìn)行模仿,通過(guò)了解代碼項(xiàng)目的實(shí)施流程,對(duì)其實(shí)施細(xì)節(jié)的拆解再重新組合,從而達(dá)到學(xué)習(xí)編程和工作流的目的。要知道,模仿才是最好的學(xué)習(xí)!這也是后發(fā)者的優(yōu)勢(shì)。背后的邏輯是,你不可能等到了解了所有的知識(shí)以后再去工作,不可能等到參悟了生活的道理以后再去生活。
很多人沒(méi)有注意到的一個(gè)事情就是:

當(dāng)今時(shí)代我們已經(jīng)從先發(fā)現(xiàn)因果再去解決問(wèn)題,已經(jīng)轉(zhuǎn)向僅發(fā)現(xiàn)事情的相關(guān)性就足夠解決問(wèn)題的這樣一個(gè)快速迭代的時(shí)代。

舉個(gè)例子,包括谷歌搜索引擎用戶的搜索關(guān)鍵詞,進(jìn)行統(tǒng)計(jì)排序,也是利用暴力算法去通過(guò)統(tǒng)計(jì)規(guī)律發(fā)現(xiàn)事情的相關(guān)性。如果我們還是采取以前的思考方式和做事方式的話,會(huì)嚴(yán)重落后進(jìn)步的節(jié)奏。

一、案例分析法學(xué)習(xí)編程

先做項(xiàng)目,或者說(shuō)先找一個(gè)項(xiàng)目做。你甚至都可以不用找那些完全能看懂的github上面的項(xiàng)目代碼,因?yàn)橥耆芸炊拇a就沒(méi)有學(xué)習(xí)的意義了。

1.1 借鑒并模仿別人寫(xiě)得好的代碼

比如我最近就在做一個(gè)電影推薦的項(xiàng)目和一個(gè)金融風(fēng)控的項(xiàng)目,恰好同一個(gè)集中訓(xùn)練營(yíng)的很多學(xué)員都是程序員,我把他們的作業(yè)都瀏覽了一遍,看了下哪些是寫(xiě)得好的,用了什么新的方法來(lái)調(diào)試,顯示運(yùn)行進(jìn)程等等,用了jupyter notebook哪些插件和工具。我對(duì)于不懂的部分或者代碼我都會(huì)認(rèn)真把它拆解,然后到谷歌當(dāng)中進(jìn)行搜索,獲取相應(yīng)的背景知識(shí)。最后再將這些知識(shí)重組一遍,把整個(gè)代碼流程完全過(guò)一遍之后,我才真正掌握了這一部分的,并且我認(rèn)真觀察他們代碼書(shū)寫(xiě)風(fēng)格,接收他們寫(xiě)得好的一些處理方式,以及代碼的一些邏輯,從而優(yōu)化我自己的代碼書(shū)寫(xiě)風(fēng)格。

1.2 對(duì)案例分解代碼并學(xué)習(xí)的實(shí)施流程

以我最近做的一個(gè)電影推薦項(xiàng)目為例子。
以下是github上面的代碼部分。

1. 分解
在這個(gè)項(xiàng)目當(dāng)中,雖然它有很多段代碼,但是實(shí)際上只用分成三個(gè)部分。第一部分是電影推薦系統(tǒng),第二個(gè)是將電影推薦系統(tǒng)通過(guò)flask的web框架封裝為app,第三部分是將app進(jìn)行一個(gè)服務(wù)器啟動(dòng)。
于是分解后就得到如下圖所示的部分,這樣一下子就簡(jiǎn)單明了。

2. 調(diào)試


對(duì)一些實(shí)施細(xì)節(jié)部分不懂的,可以去網(wǎng)上查一些相關(guān)資料,并且抽取相關(guān)的部分代碼出來(lái)調(diào)試,一點(diǎn)一點(diǎn)去弄懂。這個(gè)過(guò)程可以考慮用滴答清單去分解步驟,每次只完成下一步行動(dòng),完成當(dāng)前行動(dòng),再完成下一個(gè)行動(dòng)。

3. 重組
回過(guò)頭來(lái),通過(guò)隨手畫(huà)圖,流程圖,思維導(dǎo)圖等方式去充分理解整個(gè)流程,把之前的細(xì)節(jié)重新串聯(lián)起來(lái)去從更宏觀的角度上去理解整個(gè)項(xiàng)目是怎么實(shí)施下來(lái)的。
以下是我在學(xué)習(xí)如何將自己的推薦系統(tǒng)的一些參數(shù)post到flask框架上的一些學(xué)習(xí),我之前并沒(méi)有接觸過(guò)web的一些內(nèi)容,于是我畫(huà)了一些簡(jiǎn)易圖來(lái)幫助理解。

不求多只求精。
你甚至這幾個(gè)月只需要去認(rèn)真鉆研好這個(gè)項(xiàng)目就夠了。

二、學(xué)習(xí)編程到底是在學(xué)什么

2.1 學(xué)習(xí)解決問(wèn)題

關(guān)鍵詞大道至簡(jiǎn)。

很多人以為學(xué)習(xí)編程,其實(shí)只是在學(xué)習(xí)一個(gè)編程語(yǔ)言的語(yǔ)法結(jié)構(gòu),邏輯以及一些常見(jiàn)的函數(shù)和用法。但對(duì)于我來(lái)說(shuō),我認(rèn)為,編程并不會(huì)是一個(gè)很特殊的東西,學(xué)習(xí)編程跟學(xué)習(xí)其他任何東西在本質(zhì)上是一樣的,都是在解決一個(gè)問(wèn)題,只不過(guò)用的手段不一樣而已,所以在很多時(shí)候拼的是思維,也就是你一開(kāi)始的方向,解決問(wèn)題的方法有沒(méi)有找對(duì)。

所以我認(rèn)為,學(xué)習(xí)編程,有兩方面更應(yīng)該掌握,一個(gè)是做項(xiàng)目過(guò)程中,從無(wú)到有整個(gè)過(guò)程的合理流程,寫(xiě)代碼的優(yōu)良習(xí)慣,優(yōu)良的組織的方式;第二個(gè)是另外一個(gè)就是對(duì)實(shí)際場(chǎng)景的背景了解,解決實(shí)際場(chǎng)景當(dāng)中的思路和方法。

2.2 學(xué)習(xí)真實(shí)工作場(chǎng)景下代碼的應(yīng)用

在正式工作當(dāng)中的編程工作流以及如何組織代碼,是十分有重要的。舉個(gè)例子,在真實(shí)工作當(dāng)中。都是會(huì)把很多復(fù)雜代碼寫(xiě)成寫(xiě)成類和包的形式,這樣子十分方便重復(fù)調(diào)用。下一次要用的時(shí)候,甚至不懂編程的人,他都可以直接通過(guò)調(diào)用你寫(xiě)好的這個(gè)API就可以直接得出相應(yīng)的結(jié)果,而不用理解中間到底經(jīng)過(guò)什么樣的一個(gè)復(fù)雜過(guò)程,也不用理解你的代碼邏輯。跟你直接用家里的洗衣機(jī),把臟衣服放到洗衣機(jī)里面,按下按鈕,之后就可以得到干凈的衣服。你不用知道洗衣機(jī)設(shè)計(jì)原理,電路構(gòu)造,離心力的計(jì)算公式,這些都已經(jīng)封裝好了。

往往這些過(guò)程都是十分復(fù)雜的,但你要把它最終變成一個(gè)非常簡(jiǎn)單,容易調(diào)用的傻瓜式工作,對(duì)我來(lái)說(shuō),這些在教程當(dāng)中是不可能學(xué)習(xí)到的,你得通過(guò)不斷的模仿別人的優(yōu)秀習(xí)慣,不斷地總結(jié),形成自己的風(fēng)格和高效率工作方式。

2.3 多了解業(yè)務(wù),問(wèn)一些傻問(wèn)題

除了編程這種專業(yè)性的知識(shí)以外,我認(rèn)為還有很重要的一個(gè)能力,就是解決實(shí)際場(chǎng)景當(dāng)中的思路和方法,對(duì)業(yè)務(wù)和場(chǎng)景的理解是十分重要的。但這個(gè)往往說(shuō)起來(lái)十分虛,只有在面試當(dāng)中,你才會(huì)感覺(jué)到這方面認(rèn)識(shí)是多么缺乏。

實(shí)際上來(lái)說(shuō)對(duì)于公司來(lái)說(shuō),你的代碼寫(xiě)的好不好,并不是他最關(guān)心的,一個(gè)公司要生存,最關(guān)心的應(yīng)該是業(yè)務(wù)發(fā)展,你的工作能夠?qū)镜陌l(fā)展,對(duì)它的盈利能夠起到多大的支持作用。那么我們要怎么樣才能理解業(yè)務(wù)呢?

我認(rèn)為,這剛好要從問(wèn)題的另外一個(gè)方向思考,就是:

如果你不會(huì)編程的話,那你怎么樣去解決這個(gè)問(wèn)題?也就是說(shuō)不靠一些復(fù)雜高級(jí)的編程工具,如果你這是在真實(shí)場(chǎng)景下,作為一個(gè)其他業(yè)務(wù)線上的人,要直接去為公司盈利,你要怎么樣去解決這個(gè)問(wèn)題?

舉個(gè)例子就是在真實(shí)場(chǎng)景中很多特征的處理,并沒(méi)有辦法簡(jiǎn)單調(diào)用已有的工具包直接nltk分詞,詞根化,把它轉(zhuǎn)化成向量。往往在真實(shí)場(chǎng)景當(dāng)中,特征都是十分復(fù)雜的,都是需要人去進(jìn)行一些很多手工的一些操作,要寫(xiě)一些非常接地氣的代碼,去解決最實(shí)際的問(wèn)題。那么這些工作未必就是低效的,而是為了得到很好的預(yù)測(cè)效果,必須要付出的勞動(dòng)。
這也是奧卡姆剃刀的原理,也就是說(shuō)在盡可能的程度上進(jìn)行簡(jiǎn)化,直到不能簡(jiǎn)化為止。

但是關(guān)鍵不在于簡(jiǎn)化,關(guān)鍵在于不能過(guò)度簡(jiǎn)化,犧牲掉最后的效果。

很多工作,到最后你可能只是需要把這個(gè)事情的流程弄得越來(lái)越明確,越來(lái)越少的模糊的存在空間,越來(lái)越把各種復(fù)雜的東西都封裝在一個(gè)簡(jiǎn)單的容器里面,使其調(diào)用起來(lái),使用起來(lái)十分的方便,人性化舒適。
這可能才是工作不斷提升價(jià)值的本質(zhì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容