引子

有一本讲诺贝尔奖获得者,物理学家费曼的书,叫做《发现的乐趣》,书中写到一个费曼小时候的故事:

“我们家有《大不列颠百科全书》,我还是小孩子的时候,父亲就常常让我坐在他腿上,给我读些《大不列颠百科全书》。比如说,我们读关于恐龙的部分,书上可能讲雷龙或其他什么龙,书上会说:“这家伙有 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提供了另外一种对现有类增强的办法,动态生成的类继承了现有的类,两者是“父子关系”。

小结

怎么样?用这种(假装)教授别人,层层递进、自我逼问的方法是不是很有效果?收益很大?

用这种办法,实际上就是逼着你把大脑中的盲点和一些想当然的假设给暴露出来,效果要比单纯地阅读和记忆好得多,赶紧在学习中试一下吧!

(完)

最后,再介绍一下我的一个备份号“想躺平的程序员”,防止被人投诉后失联,请小伙伴们保存一下吧。

这个号不会空着,经常会发一下轻松有趣的东西,让大家在紧张的工作之余乐呵一下。

用史上最牛学习法自学编程,不香吗?相关推荐

  1. 史上最牛最强的linux学习笔记 10.shell基础

    史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...

  2. 史上最牛C语言控制台游戏!C语言控制台音游——Rhythm Slasher! 附上源代码供交流学习

    这个游戏是我大一上学期弄出来,刚学C语言,学了循环和选择结构.那时候数据结构都不太会,但是按捺不住自己的想法,总想用现有的东西做点什么. 就连窗体程序都不会,没有任何的图片,全是ASCII字符的一个游 ...

  3. 史上最牛研究生已成院士,给出“维持科研创新能力”的秘诀

    科研人员, 如何维持强大的科研创新能力? 美国的Ronald D. Vale做出了榜样. 读研究生的1985年, 年仅26岁的Ronald D. Vale, 以第一作者在Cell杂志发表了4篇论文! ...

  4. [Perl] Python 与 Perl 合并,打造史上最牛语言 Parrot

    本文链接: http://www.php-oa.com/2010/04/01/python-perl-parrot.html 据Perl官方网站的消息,Perl之父Larry Wall和Python之 ...

  5. 史上最牛中学开学演讲:去到悲欣交集的审美人生

    9月开学季无非都是这样,浩浩荡荡的父母,乘飞机,坐火车,驾车,划船,把孩子从天南海北,送到另一个天南海北.学校有别,家庭有异,学校与家庭共通的是一份"望子成龙"的期盼. " ...

  6. 史上最牛员工将退休 23年每天挣10亿(图)

    史上最牛员工将退休 23年每天挣10亿(图) 其实现在越来越感觉很多道理都是相通的,而很多大道理都是实用的.比如本文介绍的很多经验,也适用于科研~~ 原标题:史上最牛员工每天挣10亿,记录保持23年! ...

  7. 唐僧是史上最牛海归的十大理由

    唐僧是史上最牛海归的十大理由          唐僧去西天取经,实际上就是去西方学习先进科技理念的过程,也就是留学的过程,最后学成归来.唐僧是一个货真价实的"海归",而且,这个&q ...

  8. 一封史上最牛的求职信!

    一封史上最牛的求职信! 尊敬的负责人或人事主管: 你好! 我这是第三次给您公司投简历了,谢谢您终于能在浩瀚的求职信海洋中看到我的求职简历.需要解释的是,现在求职的人太多了,我害怕您因为太忙,而又将我的 ...

  9. 安卓设备互相投屏_史上最牛!手机、电脑、电视相互投屏软件airlink

    原标题:史上最牛!手机.电脑.电视相互投屏软件airlink 以前有人分享了几款投屏软件,有的使用还是有些麻烦,这款软件,实现手机(Android.ios均支持).电脑.电视 之间相互投影.并且无需设 ...

最新文章

  1. 第十七届全国大学生智能车竞赛完全模型组 I 型车模数据
  2. unity3d : Failed to query D3D11 context for ID3DUserDefinedAnnotation interface (hr = 0x80004002)
  3. java注释的简单_Java简单注解
  4. c# mysql 管理员权限_C# winform 权限管理系统完整源码下载(含数据库)
  5. python安装pyqt5第三方_搭建pyqt5开发环境(python3+pycharm2019+pyqt5)
  6. nginx基本数据结构ngx_module_t,ngx_module_s
  7. 妄想性仮想人格障害 新手教程 +改动器
  8. python实践心得体会_“Python自然语言实践”——总结(一),实战
  9. Apache Flink 为什么能够成为新一代大数据计算引擎?
  10. 从遇见到信任 | Apache Dubbo 的毕业之旅
  11. 【Android开发坑系列】之PopupWindow
  12. 易华录发布蓝光存储新品
  13. 完美摄影作品展,它可以是你作品的风格
  14. 百面机器学习——python实现二分类逻辑回归
  15. 六石管理学:人是不可以被说服的,除非自己想明白
  16. eclipse二进制编辑器插件
  17. 计算机右键功能总结,电脑小技巧分享:右键菜单功能使用技巧
  18. 最全最全的文件扩展名
  19. Unity篇——Minimap小地图
  20. Python网页爬虫工具有哪些?

热门文章

  1. Android 培训课件编写--- 第1章 Android应用开发概述
  2. 很实用的应用,推荐一下http://static.apk.hiapk.com/html/2012/06/625213.html?module=256info=MQA2ADMA
  3. 项目管理之我见:甲方乙方
  4. 谈一谈Flutter中的共享元素动画Hero
  5. 【XML和Java】手写Java程序引用xsd验证xml
  6. python pop3lib连接网易企业邮箱
  7. 程序员的日常:当一名程序员到底有多难?
  8. F - Tian Ji -- The Horse Racing
  9. 编辑器漏洞 EWebedtitor FCKeditor spaw editor
  10. 11235找规律c语言程序设计,找规律练习习题及答案