通常,我们得知了一种新技术新领域,所做出的第一反应就是去了解它,学习它的使用方法,最后再借助相关文档和Google来边实践边熟悉这项技术。
比如今天看到了一篇文章讲了Struts2中的OGNL表达式在项目中如何强大方便,如何让我在页面和Action中更加方便地传递你想要的东西。看到框架描述中的种种方便之处,我就会到CSDN学院、培训机构论坛、贴吧、甚至某宝找教程找学习路线,接下来的一段时间就是疯狂看视频、写Demo,等到把所有基础教程视频、书看完,就迫不及待地去开启一个小型项目,大量运用所学知识,这时候知识就得到了巩固,深深地印刻在我的知识库里,工作的时候要取出来就易如反掌。以上就是我以前学习一门新技术的主要流程。
但是这样真的是把技术学到家了吗?我们或许只是把知识简单的搬运到了大脑中。让我们来看一个简单的生活中的例子。
在玩具店中,摆放了一只“会说话的小黄鸭”。这只会念儿歌、会讲故事的鸭子在不同人的眼中可以有不同的解读:
- 在孩子眼中,他关心的是“小黄鸭说了什么”,于是他听到的是儿歌、故事。即孩子关心的是最直接的信息。
- 在家长眼中,他们关心的是“小黄鸭是什么”,首先他们会把它定义为一个玩具(而不是一直“鸭子”),然后他们可能会对这只鸭子的娱乐性、教育性、安全性、性价比等做出评判。也就是说,家长关心的是价值和意义。
- 在玩具构建者的眼中,他们关心的是“小黄鸭是怎么做出来的”,他们会思考和设计小黄鸭有哪些功能模块,会想它的电路结构以及声光效果。也就是说,构建者关心的是结构和实现。
在这里,我们可以看到我之前的学习方法,似乎只停留在了“小孩”层面,即只学习了最表面最直接的信息。面对OGNL的价值和意义,以及他是如何在框架中实现的,我一概不知。即使我能熟练地使用它,却不理解他为何广为所用,不理解它的底层实现。可能很多初学者都跟我一样,在一个“小孩”的层面去学习,所做的只不过是信息的搬运工,将知识从其他地方搬到了我们的知识库中。
其实最好的学习方法是循序渐进,把问题当做一段多层加密的密文,逐步解码。在面对知识的时候,我们可以依次问自己四个问题(从“小孩角度”到“构建者角度”):
- 这个知识是什么?(OGNL是一种什么样的语言?去了解它的背景)
- 他能完成什么工作?(他能完成什么操作?去学习他怎么使用)
- 这个知识的价值何在,我们为什么要用它而不选用其他的知识来替代它?(OGNL相比于EL表达式有什么优势?了解它的特性和较其他技术的强大之处)
- 这个知识是如何实现它的价值的,他凭什么有这种效果?(OGNL在Struts2中的底层实现是什么样的?通过底层代码来学习它的结构组成,实现原理)
一一破开了密文的面纱,才能真正解读一门技术。在能熟练使用它的同时,还能根据实际需求判断是否需要运用它,也就是通过深入剖析它的结构,达到对其价值的理解,从而判断它的应用场景。