`
coffeescript
  • 浏览: 123250 次
社区版块
存档分类
最新评论

学习技术的三部曲:WHAT、HOW、WHY

 
阅读更多

近几天有些网友在邮件里面问我关于学习的问题。有好几个人觉得工作了几年,也学会了不少的类库、框架、甚至语言,但是感觉自己的能力没有太大的提高。因此今天来说一下我个人对这方面的体会,希望对大伙儿(尤其是新手)有帮助。

先声明一下,本帖子讨论的三部曲是指你已经选定了某个技术方向之后,该如何学习;至于如何选定技术方向,则属于另一个话题,不在今天的讨论之列。

我把学习归类为三个步骤:What、How、Why。经过我对周围同事和朋友的观察,大部分感觉自己技术没有提高的人,都仅仅停留在What阶段。下面我把这三个步骤解释一下。

第一步:WHAT

所谓的“WHAT”,就是搞清楚某个东东是什么?有什么用?有什么语法?有什么功能特性?......
  
举例如下:对于学习语言(比如C++、Java、Python),大部分人都能够掌握基本的语法和标准库,然后用它写一些小程序(诸如二分查找、冒泡排序、简单文件操作等)。
  
对于学习类库(比如JDBC类库),大部分Java程序员都能明白JDBC主要包含哪些类,也能够用JDBC进行简单的数据库查询和增删改操作。由于这个步骤是最基本的,假如你连这都做不到(可能你的理解力不够好),也别在IT界混了。

但是光会What是不够的。仅仅停留在这个步骤,导致了很多程序员只知其然,不知其所以然。这就是目前大部分开发人员的现状

第二步:HOW
  
所谓的“HOW”,就是搞清楚某个东西内部是如何运作的?实现机制如何?等一系列相关问题。
  
举例如下:假如你在学习C++语言,你是否搞明白函数传参数的实现机制?虚函数是如何实现?抛出异常时的栈回退是怎么回事?......
  
假如你在学习Java语言,你是否搞清楚GC如何实现?反射是如何实现?
假如你在学习JDBC库,你是否清楚JDBC Driver的4种类型?不同游标类型的实现机制?事务的机制?
  
在这个阶段,你必须多想想类似这些问题。然后通过各种途径(参见“关于自学能力”的几个方法),把问题彻底搞清楚。自然而然,你的提高就会比较明显。而且如果碰到一些深层次的问题(比如性能优化),也就知道该如何去解决。
  
完成这个阶段之后,你基本上就属于该技术领域最优秀的20%的人(根据二八原理,80%的人不会去思考HOW的问题)。

第三步:WHY
  
一般来说,只有你把HOW的问题想清楚,才开始考虑步骤WHY。所谓的“WHY”,就是搞清楚某个东西为什么设计成这样?为什么不是另外的样子?这样的设计有什么讲究?
  
说实在的,善于问“为什么”有一定的天赋成分?好像某个科学大牛曾经说过“提出问题有时候比解决问题更难”。一般来说,只有当你深刻理解了某个东西,才能够针对这个东东的设计问出一些问题。所以,我前面强调过,要先把HOW的问题搞清楚,再来考虑WHY的问题。
  
举例如下:对于C++语言:为什么C++没有类似Java的finally关键字?为什么C++当初没有考虑GC?......
  
对于Java语言:为什么Java没有类似C++的类析构函数?为什么Java要同时提供String和StringBuffer两个似乎冗余的类?......
  
对于Python语言:为什么Python不提供类似C++/Java的访问控制机制?......
  
如果你能够自己问出诸如上述的“为什么”问题,并且能够通过各种途径找到解答,那你基本上已经吃透这个技术了,并且你已经有可能自己去设计一个类似的玩意儿了。到这时,你已经踏上了通向技术高手的康庄大道。

由于本博客偏重IT方面,所以今天举的这些例子多半都是IT相关的,但是这个三部曲在IT以外的行业/领域其实也能适用,就看读者自己的领悟了。

 

相关阅读:精通one,学习another,关注next

36
5
分享到:
评论
8 楼 lichun01 2013-01-21  
感觉很像某培训机构的3w1h教学法 。。。。。。。
7 楼 Wentasy 2013-01-21  
FlyAway2 写道
写了等于没写,读了等于没读

非也。
6 楼 FlyAway2 2013-01-21  
写了等于没写,读了等于没读
5 楼 学习学习736 2013-01-19  
4 楼 semask 2013-01-18  
好像任何学习都适用这个
3 楼 KeepCrazy 2013-01-17  
很不错, 有同感。 但有一个疑问,真有那么多的程序员停留在第一阶段吗?如何得知?
2 楼 ershiyikezhong 2013-01-17  
说的很好。现在还是处于只知道what的地步。要不断努力,知其然,知其所以然。
1 楼 aleco 2013-01-17  
感觉跟一篇博客有点类似(呵呵博主,好东西都是相近的)
from:https://www.sunchangming.com/blog/?p=3805

假如,现在有一个新的开源产品出现,我该如何去了解它?我认为,分三步:
What?  它是做什么的,适用于什么领域。拿Protocol Buffer来说,它就是一个序列化框架,凡是要把一个对象通过IO(文件、数据库、网络)传输的时候,都可以用它。
How? 它是怎么实现的?仿sun rpcgen,定义格式,生成代码。Message Format、整数的变长化编码等等。
Why? 它为什么要这么做?比如,为什么要采用key/value这样的方式,每个data前面加一个tag id。通常,想完这个问题之后,会再回头去想第一个问题。
通过阅读文档,能得到第一个答案。而继续阅读文档和代码,能得到第二个答案。但是第三个答案,却需要和开发者沟通,才能真的搞透彻,否则就像看小说一样,1000个读者心中有1000个哈姆雷特。

相关推荐

Global site tag (gtag.js) - Google Analytics