自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用費曼技巧自學編程,香不香?

開發(fā) 開發(fā)工具
“我們家有《大不列顛百科全書》,我還是小孩子的時候,父親就常常讓我坐在他腿上,給我讀些《大不列顛百科全書》。比如說,我們讀關于恐龍的部分,書上可能講雷龍或其他什么龍,書上會說:“這家伙有 25 英尺高,腦袋寬 6 英尺?!?/div>

[[327381]]

引子

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

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

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

費曼說:凡是我們讀到的東西,我們都盡量把它轉(zhuǎn)化成某種現(xiàn)實,從這里我學到一個本領——凡我所讀的內(nèi)容,我總設法通過某種轉(zhuǎn)換,弄明白它究竟什么意思,它到底在說什么。

費曼技巧

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

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

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

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

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

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

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

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

(4) 簡化你的語言。

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

非常簡單的過程,對吧?

實戰(zhàn)演練

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

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

第一步,自學

張大胖看了動態(tài)代理的介紹,書上列舉出一堆煩人的代碼來展示這個東西是怎么使用的,比如有個接口(IHelloWorld)及其實現(xiàn)類(HelloWorld), 然后有個InvocationHandler的實現(xiàn),最后用Proxy.newProxyInstance(....)創(chuàng)建一個新的類出來,這些都是什么鬼?啰里啰唆的。

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

張大胖:動態(tài)代理嘛,很簡單,就是給定一個接口和實現(xiàn)類,再加上一個InvocationHandler , 動態(tài)代理這個技術(shù)可以在運行時創(chuàng)建一個新的代理類出來。

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

張大胖:舉個例子,有個叫IHelloWorld接口及其實現(xiàn)類HelloWorld,它有一個叫sayHello()的方法。可以在sayHello()之前和之后,額外加一些日志的輸出。

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

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

  1. public class HelloWorldEx implements IHelloWorld{ 
  2.     IHelloWorld hw; 
  3.     public HelloWorldEx(IHelloWorld hw){ 
  4.         this.hw = hw; 
  5.     }     
  6.     public void sayHello(){         
  7.         Logger.startLog(); 
  8.         hw.sayHello(); 
  9.         Logger.endLog(); 
  10.     } 

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

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

書中也沒有解釋,唉!

仔細想一想,手動寫一個類HelloWorldEx和用Proxy.newProxyInstance來創(chuàng)建,區(qū)別到底是什么?

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

而Proxy.newProxyInstance這種方法,可以在程序運行的時候為任意類動態(tài)地創(chuàng)建增強的類。

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

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

小白:為什么要創(chuàng)建新的代理類,那個Proxy.newProxyInstance不能直接修改老的HelloWorld類嗎?

張大胖再度卡殼,上網(wǎng)搜索,找到了答案,和Python,Ruby等方法不同,Java本質(zhì)是一個靜態(tài)類型的語言,class一旦被裝入JVM,是不能修改,添加,刪除方法的,既然老的class不能修改,只能通過代理的方式來創(chuàng)建新的類了。

小白:懂了,這個技術(shù)主要用在什么地方啊? 難道只是加個日志?

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

原來動態(tài)代理使用得最多的是AOP,AOP中經(jīng)常會以聲明的方式提出這樣的要求:

某個包下所有add開頭的方法,在執(zhí)行之前都要調(diào)用Logger.startLog()方法,在執(zhí)行之后都要調(diào)用Logger.endLog()方法。

或者對于所有以Service結(jié)尾的類,所有的方法執(zhí)行之前都要調(diào)用tx.begin(),執(zhí)行之后都要調(diào)用tx.commit(), 如果拋出異常的話調(diào)用tx.rollback()。

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

你不是用過Spring AOP嗎?AOP中經(jīng)常有這樣的需求...... ,Spring想添加這些日志和事務的功能,但是卻沒有辦法去修改用戶的類,它是框架啊,一是不知道用戶類的源碼,二是Java不允許再修改裝載入JVM的class。

沒辦法,Spring只好在運行時找到用戶的類,然后操作字節(jié)碼動態(tài)創(chuàng)建一個新類,新類會對原有的類進行增強,添加日志,事務這些功能,注意啊,這些都是在內(nèi)存中動態(tài)創(chuàng)建的。

這個技術(shù)就是Java的動態(tài)代理,不過它有個前提要求,就是用戶的類需要實現(xiàn)接口才行。我用一個簡單的例子給你說下,你就明白細節(jié)了......

第四步,簡化,比喻

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

如果你徹底理解了以后,動態(tài)代理的技術(shù)細節(jié)會在大腦中會建立這么一幅圖景:

 

$HelloWorld100就是那個代理類,它和HelloWorld都實現(xiàn)了IHelloWorld這個接口。

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

小結(jié)

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

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

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-10-12 09:48:55

SSR JSPPHP

2020-09-25 15:50:41

鴻蒙小米國產(chǎn)

2020-10-21 09:19:27

Flutter開源項目

2021-12-05 23:17:18

iOS蘋果系統(tǒng)

2021-07-08 06:52:41

ESClickHouse Lucene

2022-03-28 11:06:38

Nacos監(jiān)聽配置

2021-12-03 10:46:49

ELKGraylog運維

2020-04-28 10:17:51

人工智能技術(shù)智能音箱

2021-06-27 17:33:51

培訓員工AI人工智能

2020-01-21 21:15:16

WiFi網(wǎng)絡WiFi6

2021-12-02 06:34:34

GraylogELK日志

2021-04-06 10:48:52

MySQLElasticsear數(shù)據(jù)庫

2020-07-03 15:10:35

Java Rust 開發(fā)

2021-01-11 08:03:30

阿里中臺項目

2021-05-19 09:37:45

SessionTokencookie

2021-11-29 06:24:05

物聯(lián)網(wǎng)平臺物聯(lián)網(wǎng)IOT

2021-12-17 15:05:55

CSSwhenelse

2022-03-22 09:20:57

應用線程池技術(shù)

2020-07-30 09:10:21

DockerK8s容器

2021-11-02 16:44:40

部署DevtoolsJRebel
點贊
收藏

51CTO技術(shù)棧公眾號