1. 程式人生 > >用費曼技巧學程式設計,香不香?

用費曼技巧學程式設計,香不香?

引子

 有一本講諾貝爾獎獲得者,物理學家費曼的書,叫做《發現的樂趣》,書中寫到一個費曼小時候的故事:

 “我們家有《大不列顛百科全書》,我還是小孩子的時候,父親就常常讓我坐在他腿上,給我讀些《大不列顛百科全書》。比如說,我們讀關於恐龍的部分,書上可能講雷龍或其他什麼龍,書上會說:“這傢伙有 25 英尺高,腦袋寬 6 英尺。” 

這時父親就停下來,說:“我們來看看這句話什麼意思。這句話的意思是:假如它站在我們家的前院裡,它是那麼高,高到足以把頭從窗戶伸進來。不過呢,它也可能遇到點麻煩,因為它的腦袋比窗戶稍微寬了些,要是它伸進頭來,會擠破窗戶。 

費曼說:凡是我們讀到的東西,我們都儘量把它轉化成某種現實,從這裡我學到一個本領——凡我所讀的內容,我總設法通過某種轉換,弄明白它究竟什麼意思,它到底在說什麼。

 

費曼技巧

 

費曼技巧,或者說費曼學習法是一種以教促學的方法,一共有四步(已經知道的可以無視,直接跳過): 

(1) 選擇新概念/新知識, 自己先去學習它。 

(2) 假裝當一個老師,去教授別人 

想象你面對一群小白,怎麼把這個概念講給他們聽,讓他們理解呢? 

把你講解的思路也寫到紙上,如果實在不想寫,可以說出來。 

非常重要!!!不要讓你的思路停留在大腦中,因為大腦中對於知識點之間的關聯會有些想當然的、錯誤的假設,說出來或者寫出來能找到這些“盲點”!!

 

(3) 如果你在教授的過程中遇到了麻煩,卡了殼,返回去學習。 

重新去看書,搜相關資料,問別人,倒逼自己把這個概念搞清楚, 然後回到第二步,繼續給小白講授。

 

(4) 簡化你的語言。 

目標是用你自己的語言,非專業的詞彙去解釋這個概念。儘量做到簡單直白,或者找到比喻來表達。 

非常簡單的過程,對吧? 

 

實戰演練

我們來用個例子來演練一下,有請碼農翻身頭號主人公張大胖出場。 

張大胖正在學習Java,這一天他遇到了一個新的概念:“動態代理”  (注意是學習這個概念,不是具體實現), 非常抽象,在日常程式設計中幾乎不會直接使用,理解起來有難度。

 

第一步,自學

 張大胖看了動態代理的介紹,書上列舉出一堆煩人的程式碼來展示這個東西是怎麼使用的,比如有個介面(IHelloWorld)及其實現類(HelloWorld), 然後有個InvocationHandler的實現,最後用Proxy.newProxyInstance(....)建立一個新的類出來,這些都是什麼鬼?囉裡囉唆的。

 

第二步,張大胖嘗試教一下小白(當然這裡的小白至少得懂點兒Java)

 

張大胖:動態代理嘛,很簡單,就是給定一個介面和實現類,再加上一個InvocationHandler , 動態代理這個技術可以在執行時建立一個新的代理類出來。 

小白:張老師, 新的代理類有什麼用? 

張大胖:舉個例子,有個叫IHelloWorld介面及其實現類HelloWorld,它有一個叫sayHello()的方法。可以在sayHello()之前和之後,額外加一些日誌的輸出。 

(在講解一個概念的時候,舉例和類比很重要,人類習慣於通過例子來學習,從具體走向抽象) 

小白:那我直接寫一個新的類,比如HelloWorldEx,把日誌輸出新增到其中不就行了,為什麼還要用Proxy.newProxyInstance(......)這麼麻煩的方法?

public class HelloWorldEx implements IHelloWorld{
    IHelloWorld hw;
    public HelloWorldEx(IHelloWorld hw){
        this.hw = hw;
    }    
    public void sayHello(){        
        Logger.startLog();
        hw.sayHello();
        Logger.endLog();
    }
}

  

張大胖無法回答這個問題,卡殼了! 

第三步,回過頭去看書,學習。

書中也沒有解釋,唉! 

仔細想一想,手動寫一個類HelloWorldEx和用Proxy.newProxyInstance來建立,區別到底是什麼? 

實現的功能是相同的,但是HelloWorldEx需要事先寫好,編譯後不能改了,相當於寫死了!如果我想對Order類,Employee類,Department類,也想加點兒日誌,還得寫個OrderEx,EmployeeEx,DepartmentEx的類,太麻煩了! 

而Proxy.newProxyInstance這種方法,可以在程式執行的時候為任意類動態地建立增強的類。 

事先寫死的叫做靜態代理,Proxy.newProxyInstance這種方式叫做動態代理,更加靈活。 

張大胖覺得這麼解釋就通了。 

小白:為什麼要建立新的代理類,那個Proxy.newProxyInstance不能直接修改老的HelloWorld類嗎? 

張大胖再度卡殼,上網搜尋,找到了答案,和Python,Ruby等方法不同,Java本質是一個靜態型別的語言,class一旦被裝入JVM,是不能修改,新增,刪除方法的,既然老的class不能修改,只能通過代理的方式來建立新的類了。 

小白:懂了,這個技術主要用在什麼地方啊? 難道只是加個日誌? 

張大胖第三次卡殼,只好再次搜尋。 

原來動態代理使用得最多的是AOP,AOP中經常會以宣告的方式提出這樣的要求: 

某個包下所有add開頭的方法,在執行之前都要呼叫Logger.startLog()方法,在執行之後都要呼叫Logger.endLog()方法。 

或者對於所有以Service結尾的類,所有的方法執行之前都要呼叫tx.begin(),執行之後都要呼叫tx.commit(), 如果丟擲異常的話呼叫tx.rollback()。

 

到此為止,張大胖可以這樣來給小白講述了: 

你不是用過Spring AOP嗎?AOP中經常有這樣的需求......  ,Spring想新增這些日誌和事務的功能,但是卻沒有辦法去修改使用者的類,它是框架啊,一是不知道使用者類的原始碼,二是Java不允許再修改裝載入JVM的class。 

沒辦法,Spring只好在執行時找到使用者的類,然後操作位元組碼動態建立一個新類,新類會對原有的類進行增強,新增日誌,事務這些功能,注意啊,這些都是在記憶體中動態建立的。 

這個技術就是Java的動態代理,不過它有個前提要求,就是使用者的類需要實現接口才行。我用一個簡單的例子給你說下,你就明白細節了......

 

第四步,簡化,比喻

上面的講解從文字上來說還是非常囉嗦的,用了很大篇幅來講解“為什麼”,因為理解了why ,剩下的就是細節了。  

如果你徹底理解了以後,動態代理的技術細節會在大腦中會建立這麼一幅圖景:

 

$HelloWorld100就是那個代理類,它和HelloWorld都實現了IHelloWorld這個介面。 

如果一定要用個比喻來說,它們倆就是“兄弟關係”,CgLib提供了另外一種對現有類增強的辦法,動態生成的類繼承了現有的類,兩者是“父子關係”。

  

小結

 怎麼樣?用這種(假裝)教授別人,層層遞進、自我逼問的方法是不是很有效果?收益很大?  

用這種辦法,實際上就是逼著你把大腦中的盲點和一些想當然的假設給暴露出來,效果要比單純地閱讀和記憶好得多,趕緊在學習中試一下吧!

  

更多精彩文章,盡在碼農翻身

 

我是一個執行緒

TCP/IP之大明郵差

一個故事講完Https

CPU 阿甘

Javascript: 一個屌絲的逆襲

微服務把我坑了

如何降低程式設計師的工資?

程式設計師,你得選準跑路的時間!

兩年,我學會了所有的程式語言!

一直CRUD,一直996,我煩透了,我要轉型

位元組碼萬歲!

上帝託夢給我說:一切皆檔案

Node.js :我只需要一個店小二

相關推薦

用費技巧程式設計

引子  有一本講諾貝爾獎獲得者,物理學家費曼的書,叫做《發現的樂趣》,書中寫到一個費曼小時候的故事:  “我們家有《大不列顛百科全書》,我還是小孩子的時候,父親就常常讓我坐在他腿上,給我讀些《大不列顛百科全書》。比如說,我們讀關於恐龍的部分,書上可能講雷龍或其他什麼龍,書上會說:“這傢伙有

國外孩子都在程式設計人家程式設計而是程式設計思維!

隨著人工智慧成為熱門話題,程式設計也成為父母們關注的焦點。其實,讓孩子學習程式設計的目的並不是讓孩子寫程式碼,掌握演算法和邏輯思維才是王道。 人工智慧時代,學程式設計勢在必行 2016年3月英國倫敦Google DeepMind開發的人工智慧圍棋程式AlphaGo打敗圍棋世界冠

設計師與其程式設計不如營銷技巧

不少人常說設計師必須會程式設計,我卻不以為然。當然,有一些設計師為了更貼近預期必須親自動手敲程式碼。(例如,如果想實現資料視覺化,很可能你最想自己親自操作一下)。如此看來,這個說法就有些片面了。不論程式設計還是設計,都不是一朝一夕能掌握的技能,更不用說兩者都精通了。

程式設計師吐槽:真心累轉行花了數萬元程式設計卻連工作都找

網際網路紅利時代,激發了越來越多的人投身其中就業與創業,其中程式設計師這一職業也被推上了高薪職業風口。除了科班畢業的程式設計師,也有不少傳統行業從業者轉行進入網際網路行業,這些半路轉行的有的會通過自學,有的則會通過花錢上培訓班達到速成的效果。然而俗話說轉行窮三年不是沒有道理的,畢竟從事一個全新的崗位

美監獄讓囚犯程式設計刑滿後囚犯:再也回這鬼地方了

程式設計,在大部分人眼中,是很高大上的東西,噼噼啪啪寫程式碼,就會發生一些神奇的事情。程式設計也成了公認的門檻高的技能。事實真的是如此嗎? “我自己是一名從事了5年前端的老程式設計師,辭職目前在做講師,今年年初我花了一個月整理了一份最適合2019年學習的web前端乾貨,從最基礎的

如何程式設計我的一些學習感悟

    入坑已經有一年之久,今天來談談自己的學習心得也希望能幫到更多的人,如果有講的不好或者不準確的地方還請各位大神指正,本文僅僅針對於想要入行的朋友說的。  廢話不說現在進入正題,對於如何學習有以下三點要說     第一 瞭解語言 &nb

程式設計師怎樣程式設計其實學習這幾門程式語言就夠了!

近年的來的python超過java成為熱度排名第一,同時我們也發現很多程式設計師開始學習盲目python,作為一名專業的程式設計師,沒有必要把程式語言都學完,比較目前程式語言有不少200種,每種程式語言都有成為熱度的可能性。 中國程式設計師都有一個讓人難於理解的問題,特別是新手程式設計師,

【譯】需要學習的是程式設計是程式語言

我們不僅是程式設計師,而且是個(與時俱進的)學習者。鮮見的是有多少人認為他們是在學習程式設計的呢。原翻譯傳送門is here 你可能在學習程式設計語言而不是程式設計本身 別對學習電腦科學(CS)不是研究計算機這種言論感到驚訝。相反的,學習CS是對自動解決問題的研究。解決問題的是電腦科學,而不是程

玩遊戲也能程式設計8款能教會你程式設計的遊戲玩玩兒?

這幾年,程式設計相當熱門。早前有個14歲的小蘿莉,自學程式設計,竟然可以獨自開發遊戲。這位才14歲的小女孩,即使沒有程式設計經驗,但是她最終實現了自己的夢想。其實即使零基礎,也可以自學程式設計。下面這幾款遊戲,你可以邊學程式碼,邊玩遊戲。 遊戲一:Code Hunt 這個遊戲是H

程式設計自學還是選擇培訓機構?

我們一直都在自學和培訓機構做選擇上,而沒有或是不知道結合這2種優勢而更加有利的渠道 一個好的老師,不僅能給你學習計劃,還能引導你走更快的捷徑,老師不一定是某個人。三人行必有我師,如果自學程式設計,最好就是找夥伴一起,不要孤軍奮戰,夥伴也是很好的老師 所以重點

30歲開始程式設計什麼語言比較好?

以下是2018年最大的開發者調查/總結的程式語言。想必對你選擇程式語言會有很大的參考價值!   1. JavaScript   它是幹什麼用的?雖然JavaScript起源於一種網路指令碼語言,但今天它通過Node-RED用於從node.js後端伺服器到物聯網裝置的所有內容。也就是

程式設計學校會教你的課程

Bill Gates(微軟公司創始人,前世界首富)、 Mark Zuckberg(Facebook創始人,最年輕的億萬富翁之一)、 Chris Bosh(NBA全明星球員,曾效力多倫多猛龍隊,目前邁阿密熱火隊的主力大前鋒), I.Am.Will(超級R&B說

我是一個新手小白想學習C++程式設計但是知道該如何入手。請大神們給出一個簡單的思路。

如題所示,我現在準備學習C++程式語言,因為是0基礎,所以入門也顯的很迷茫,也看過一些視訊,感覺講的很好,但就是聽得雲裡霧裡,看著視訊也會嘗試敲一些程式碼,但是程式碼的意思,也都不懂,不知道該如何入手,所以就想到,如果要

程式設計是完全我會一點點

STL中list的erase用法 erase的作用是,使作為引數的迭代器失效,並返回指向該迭代器下一引數的迭代器。 如下: list<DotSource>ParticleSystem; list<DotSource>::iteratorpointe

沒有基礎半路程式設計靠譜嗎?

1、如果你沒有去做,是不會知道自己能不能成為大牛的。2、學習是一輩子的事情,哪裡來的半路出家?2

剛開始程式設計應該怎麼規劃?——答一網友

關於學習計算機從何下手這個問題也一直在困擾著我,真的,有時候感到很迷茫的。我想這是我們對這個 行業還是不太瞭解,鑽研的也不太深的緣故。所以我認為首先得了解這個行業。可以上網檢視。 關於學程式設計從何下手的問題,我們可以探討一下。  我想你對計算機已經很熟悉了。學習程式設計需要

82歲程式設計開發的應用獲得5.3萬次下載這位老奶奶的程式設計

我總會收到類似這樣的私信「小甲,我已經畢業三四年了,我目前在XX企業上班,每天上班

小白程式設計需要掌握哪些基礎?學習清單送給你

程式設計就像圍城,城裡的人想出去,城外的人想進來。每年都有很多人不是科班出身,而是通過培訓機構殺入程式碼戰場,對於這類人,我建議你仔細的掌握下面的知識。我的建議是針對那些希望在IT技術上有所成就的初學者。同時,我還列出了一些書目,這些書應該都還可以在書店買到。1、英語基礎雖然

喜歡程式設計是就改轉行?

大多數程式設計師的態度是:混口飯吃,談不上喜歡。不喜歡,不等於技術渣。再說了,不是每個公司每個崗位都需要找個技術牛逼哄哄的人。如果是不得不到很遠的地方挑水,否則就沒水喝的話,那麼就利用每天挑完水的時間,挖一口自己的井吧。什麼意思?就是說我們完全可以在程式設計師這行裡找到自己的