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

157 views
Skip to first unread message

Program Thinker

unread,
Feb 18, 2009, 10:32:43 PM2/18/09
to pon...@googlegroups.com
下面是我今天写的一个Blog,转贴给大伙儿,希望论坛里的牛人多提批评意见。

  最近几天有些网友在邮件里面问我关于学习的问题。有很多人觉得工作了几年,也学会了不少的类库、框架、甚至语言,但是感觉自己的能力没有太大的提高。因此今天来说一下我个人对这方面的体会。
  我把学习归类为三个步骤:What、How、Why。经过我对周围同事和朋友的观察,大部分感觉自己技术没有提高的人,都仅仅停留在What阶段。下面我把这三个步骤解释一下。

  ★第一步:WHAT
  所谓的"WHAT",就是搞清楚某个东东是什么?有什么用?有什么语法?有什么功能特性?......
  对于学习语言(比如C++、Java),大部分人都能够掌握基本的语法和标准库,然后用它写一些小程序(诸如二分查找、冒泡排序、简单文件操作等)。
  对于学习类库(比如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两个似乎冗余的类?......
  如果你能够自己问出诸如上述的"为什么"问题,并且能够通过各种途径找到解答,那你基本上已经吃透这个技术了,并且你已经有可能自己去设计一个类似的玩意儿了。到这时,你已经踏上了通向技术高手的康庄大道。

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

转载必须包含本声明、保持本文完整。并以超链形式注明本文原始地址:
http://program-think.blogspot.com/2009/02/study-technology-in-three-steps.html


----------------
编程随想
progra...@gmail.com
http://program-think.blogspot.com

pongba

unread,
Feb 19, 2009, 1:55:04 AM2/19/09
to pon...@googlegroups.com
很不错,这样靠谱的方法指导很少见的。
有几个建议:

1. 我觉得例子可以用一个或几个身边的案例,"身边的故事"比论述的说服力强得多 :) 毕竟方法是要人使用的,如果说服不了别人去遵循那么就白费功夫了 ..
2. 我觉得虽然这里的道理和做法是正确的,但是学习中的人往往更需要一个诱人的动机,即"我为什么要学这些呢?",所以看了本文,自己学了一阵往往又会质疑说"你说得倒是好,但我看不出需要学习这个还有这个的必要啊,为什么现在要去提前学?不学可以吗?"
3. 为什么是WHAT->HOW->WHY的顺序?我个人认为应该始终把WHY放在大脑中,带着疑惑和审视的眼光去学习。另外WHAT和HOW往往应该是在一起的吧?

2009/2/19 Program Thinker <progra...@gmail.com>



--
刘未鹏(pongba)
Blog | Mind Hacks
http://mindhacks.cn
TopLanguage
http://groups.google.com/group/pongba

Program Thinker

unread,
Feb 19, 2009, 2:34:35 AM2/19/09
to pon...@googlegroups.com
感谢Pongba拍转。先说说为什么是这样一个顺序。
这里提到的WHY,更侧重于一种"批判",要对某事物进行批判,得先对它有比较深刻的认识,对其优缺点足够了解。而对于某个领域的新手来说(比如从来不懂编程,第一次学编程语言),要做到这个比较难;如果是一个老手去学一个他已经比较熟悉的领域的相关技术(比如一个C++老手去学D语言),我赞同一开始就带着WHY去学习。
我这里提到的HOW,更侧重于了解某事物的运行机制或实现机制(How it works),而不是使用方式(How to use)。跟上面一样,我认为如果是新手,倒是可以What is it和How to use一起学。但是我感觉How it works可能得放后;如果是老手,倒是可以在了解What is it的同时,心里就在琢磨How it works。
以上是个人观点,欢迎大伙指正 :-)

2009/2/19 pongba <pon...@gmail.com>
3. 为什么是WHAT->HOW->WHY的顺序?我个人认为应该始终把WHY放在大脑中,带着疑惑和审视的眼光去学习。另外WHAT和HOW往往应该是在一起的吧?
--
刘未鹏(pongba)
Blog | Mind Hacks
http://mindhacks.cn
TopLanguage
http://groups.google.com/group/pongba



--

sagasw

unread,
Feb 19, 2009, 3:38:49 AM2/19/09
to pon...@googlegroups.com
有点像王国维谈做学问的三种境界,"昨夜西风凋碧树,独上高楼,望尽天涯路";"为伊消得人憔悴,衣带渐宽终不悔";"众里寻他千百度,蓦然回首,那人却在灯火阑珊处"。

记得某人(houjie?)提到如何学习STL,先学会用STL,知道常用组件用法,然后是学习STL代码,了解其中的internal,最后最牛逼的就是像boost那样设计自己的库。

大部分计算机的业务流程莫不如此。我最早进入某个公司搞mis的,公司已经有一套成型的powerbuilder类库,使用很少的代码就能做出很强的一个应用。但是我还是买了一本入门书,一点点敲代码做着what的工作,然后试着去读pb以及其他高手的代码,算是开始how,当然,最后不搞mis了,也没有进入到最后一个why阶段。


2009/2/19 Program Thinker <progra...@gmail.com>

Jimmy

unread,
Feb 19, 2009, 6:35:57 AM2/19/09
to pon...@googlegroups.com
我觉得文章只是文章,不必将它抬到什么高度,文章只是某个人某时某地某心态下的偶然之数,它引起其他人共鸣的同时,也许会引起另一些人的反感。科学也有真科学与伪科学之分,自己的东西只是自己的,若能对他人有所帮助,那当然是更好,但不必强求与期待。

2009/2/19 sagasw <sag...@gmail.com>:

Hongfei Xie

unread,
Feb 19, 2009, 3:36:19 AM2/19/09
to pon...@googlegroups.com
这个文章很不错,说得很好。
我记得我们学习网络的时候,我们总是从why的角度去理解问题。
任何存在都是有道理的。比如为什么会有网络,为什么会有存储转发,为什么会有流水线等等,都是参考传统行业的方法来的。
我感觉带着why去理解,然后找到联系,理解问题很容易,而且也很有趣。我的个人看法。谢谢拍板


2009/2/19 Program Thinker <progra...@gmail.com>

sjinny

unread,
Feb 19, 2009, 10:24:14 AM2/19/09
to pon...@googlegroups.com
我觉得我的顺序是:
第一步:WHY,也就是先搞清楚目的;
第二个:初步的HOW,也就是怎么解决问题;
第三部:WHAT,在明确了WHY和初步的HOW之后,才能真正理解自己在做什么;
然后回到第一步进一步迭代。:)


网易邮箱,中国第一大电子邮件服务商

Jawley

unread,
Feb 19, 2009, 10:31:03 AM2/19/09
to pon...@googlegroups.com
我觉得楼主说的WHY和你说的WHY不是一回事。
楼主说的WHY不是指学习目的,而是指为什么要用这个技术而不用其他类似技术,这个技术比类似技术优点在哪里,缺点在哪里。一些细节为什么要如此设计。等等。这些在没有WHAT和HOW的基础之前是难于把握的。

2009/2/19 sjinny <sji...@163.com>

x y

unread,
Feb 19, 2009, 11:14:43 AM2/19/09
to pon...@googlegroups.com
谢谢 对于一个新人,这样的方法论是很重要的!

2009/2/19 Jawley <jaw...@gmail.com>

Laserfiche.dengchao

unread,
Feb 19, 2009, 8:49:23 PM2/19/09
to TopLanguage
我想楼主提前假设了:如果某人已经决定要学习一样技术(已经有动机了)。

如果还没有学习动机,确实应该先想想“WHY”;然后在思考“What is it?”的时候,是不是也应该问一问“What isn't it?”

On 2月19日, 下午2时55分, pongba <pon...@gmail.com> wrote:
> 很不错,这样靠谱的方法指导很少见的。
> 有几个建议:
>
> 1. 我觉得例子可以用一个或几个身边的案例,"身边的故事"比论述的说服力强得多 :) 毕竟方法是要人使用的,如果说服不了别人去遵循那么就白费功夫了 ..
> 2.
> 我觉得虽然这里的道理和做法是正确的,但是学习中的人往往更需要一个诱人的动机,即"我为什么要学这些呢?",所以看了本文,自己学了一阵往往又会质疑说"你说得倒是好,但我看不出需要学习这个还有这个的必要啊,为什么现在要去提前学?不学可以吗?"
> 3.
> 为什么是WHAT->HOW->WHY的顺序?我个人认为应该始终把WHY放在大脑中,带着疑惑和审视的眼光去学习。另外WHAT和HOW往往应该是在一起的吧?

> 刘未鹏(pongba)
> Blog | Mind Hackshttp://mindhacks.cn
> TopLanguagehttp://groups.google.com/group/pongba

kai li

unread,
Feb 19, 2009, 9:11:20 PM2/19/09
to pon...@googlegroups.com
楼主更多的是基于学习本身的分析方法,也就是选定目标了之后,然后目标是什么,进行怎么学,如何学,非常不错,如二楼而言,非常靠谱,而二楼的考虑问题角度更提前了一步,相对而言,我个人更倾向于二楼的思考路径。
 
我从个人角度来进行一下延伸:)
 
实际上,这两种思路不同,正好符合德鲁克写给企业管理者们的一句经典名言:先做正确的事,然后才是正确的做事。
前者讲的是效能,后者将的是效率,大部分人可能很关注后者,也就是注重提高效率,可是,如果方向就错了,事做的越正确,失败也就越彻底。
 
也有不少人认为前者是管理者的事,后者是执行层的事,但我不认为这是正确的,哪怕是一个基层人员,也应该有这样的思想,因为这种思想可以指导你的生活,比如追女友、结婚、同事间的矛盾、晋升。
 
感兴趣的朋友,可以和附件中的5w1h思考路径做下对比。
 
欢迎探讨指正。
 
  
2009/2/20 x y <erwin...@gmail.com>
5W1H.jpg

Program Thinker

unread,
Feb 19, 2009, 9:23:45 PM2/19/09
to pon...@googlegroups.com
楼上说的有道理 :-)
我这篇帖子的三个步骤,主要是讲选定目标之后,该如何学。
至于如何选定目标(无疑更重要),则属于另外一个话题。

关于做正确的事和正确地做事,我之前正好写过一个系列帖子"如何成为优秀开发人员",
里面特地强调了两者的关系(也引用了德鲁克在《卓有成效的管理者》里面的话)。

2009/2/20 kai li <kaika...@gmail.com>
楼主更多的是基于学习本身的分析方法,也就是选定目标了之后,然后目标是什么,进行怎么学,如何学,非常不错,如二楼而言,非常靠谱,而二楼的考虑问题角度更提前了一步,相对而言,我个人更倾向于二楼的思考路径。
 
我从个人角度来进行一下延伸:)
 
实际上,这两种思路不同,正好符合德鲁克写给企业管理者们的一句经典名言:先做正确的事,然后才是正确的做事。
前者讲的是效能,后者将的是效率,大部分人可能很关注后者,也就是注重提高效率,可是,如果方向就错了,事做的越正确,失败也就越彻底。
 
  
2009/2/20 x y <erwin...@gmail.com>

谢谢 对于一个新人,这样的方法论是很重要的!

2009/2/19 Jawley <jaw...@gmail.com>

我觉得楼主说的WHY和你说的WHY不是一回事。
楼主说的WHY不是指学习目的,而是指为什么要用这个技术而不用其他类似技术,这个技术比类似技术优点在哪里,缺点在哪里。一些细节为什么要如此设计。等等。这些在没有WHAT和HOW的基础之前是难于把握的。

2009/2/19 sjinny <sji...@163.com>

我觉得我的顺序是:
第一步:WHY,也就是先搞清楚目的;
第二个:初步的HOW,也就是怎么解决问题;
第三部:WHAT,在明确了WHY和初步的HOW之后,才能真正理解自己在做什么;
然后回到第一步进一步迭代。:)






--

Justin L

unread,
Feb 20, 2009, 1:25:32 AM2/20/09
to TopLanguage
这个说法让我想起了一个人,雷军。他拉投资和做UCWEB时,就是大量使用身边的故事,论述简洁有力。
甚好!


On 2月19日, 下午2时55分, pongba <pon...@gmail.com> wrote:

> 很不错,这样靠谱的方法指导很少见的。
> 有几个建议:
>
> 1. 我觉得例子可以用一个或几个身边的案例,"身边的故事"比论述的说服力强得多 :) 毕竟方法是要人使用的,如果说服不了别人去遵循那么就白费功夫了 ..

> > ----------------
> > 编程随想
> > program.th...@gmail.com

总书记

unread,
Apr 1, 2009, 3:31:32 AM4/1/09
to TopLanguage
首发第一帖:

what 就是它能干什么,拿它派什么用场; how就是它内部是如何完成处理过程的(好奇心重的人喜欢进去); why 就是它关于what和why
的存在理由。

举个不恰当例子:公司某公关,他的what就是去攻关,有公关的活就交给他; 他的how是转包给其他人; why他要转包?因为他有一张关系网可以使
用。

学习必须搞清楚这三样东西,否则你不会用(初级),不会自己做一个同样的东西(中级),不知道如此实现的理由,也就是没有深入理解,无法使用和实现的最
好。


On 2月19日, 上午11时32分, Program Thinker <program.th...@gmail.com> wrote:
> 下面是我今天写的一个Blog,转贴给大伙儿,希望论坛里的牛人多提批评意见。
>

> 最近几天有些网友在邮件里面问我关于学习的问题。有很多人觉得工作了几年,也学会了不少的类库、框架、甚至语言,但是感觉自己的能力没有太大的提高。因此今天来-说一下我个人对这方面的体会。
> 我把学习归类为三个步骤:What、How、Why。经过我对周围同事和朋友的观察,大部分感觉自己技术没有提高的人,都仅仅停留在What阶段。下面我把这三-个步骤解释一下。
>
> ★第一步:*WHAT*
> 所谓的"*WHAT*",就是搞清楚某个东东是什么?有什么用?有什么语法?有什么功能特性?......


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

> 但是光会What是不够的。仅仅停留在这个步骤,导致了很多程序员*只知其然,不知其所以然*。这就是目前大部分开发人员的现状。
>
> ★第二步:*HOW*
> 所谓的"*HOW*",就是搞清楚某个东西是如何运作的?实现机制如何?等一系列相关问题。


> 举例如下:
> 假如你在学习C++语言,你是否搞明白函数传参数的实现机制?虚函数是如何实现?抛出异常时的栈回退是怎么回事?......
> 假如你在学习Java语言,你是否搞清楚GC如何实现?反射是如何实现?......
> 假如你在学习JDBC库,你是否清楚JDBC Driver的4种类型?不同游标类型的实现机制?事务的机制?......

> 在这个阶段,你必须多想想类似这些问题。然后通过各种途径(参见"关于自学能力<http://program-think.blogspot.com/2009/01/2.html>


> "的几个方法),把问题彻底搞清楚。自然而然,你的提高就会比较明显。而且如果碰到一些深层次的问题(比如性能优化),也就知道该如何解决。

> 完成这个阶段之后,你基本上就属于该技术领域最优秀的20%的人(根据二八原理<http://program-think.blogspot.com/2009/02/80-20-principle-0-overview....>
> ,80%的人不会去思考HOW的问题)。
>
> ★第三步:*WHY*
> 一般来说,只有你把HOW的问题想清楚,才开始考虑步骤WHY。
> 所谓的"*WHY*",就是搞清楚某个东西为什么设计成这样?为什么不是另外的样子?这样的设计有什么讲究?
> 说实在的,善于问"*为什么*
> "有一定的天赋成分?好像某个科学大牛曾经说过"提出问题有时候比解决问题更难"。一般来说,只有当你深刻理解了某个东西,才能够针对这个东东的设计问出一些问-题。所以,我前面强调过,要先把HOW的问题搞清楚,再来考虑WHY的问题。


> 举例如下:
> 对于C++语言:为什么C++没有类似Java的finally关键字?为什么C++当初没有考虑GC?......

> 对于Java语言:为什么Java没有类似C++的类析构函数?为什么Java要同时提供String和StringBuffer两个似乎冗余的类?.....-.
> 如果你能够自己问出诸如上述的"为什么"问题,并且能够通过各种途径找到解答,那你基本上已经吃透这个技术了,并且你已经*有可能*


> 自己去设计一个类似的玩意儿了。到这时,你已经踏上了通向技术高手的康庄大道。
>
> 由于本博客偏重IT方面,所以今天举的这些例子多半都是IT相关的,但是这个三部曲在IT以外的行业/领域其实也能适用,就看读者自己的领悟了。
>

> 转载必须包含本声明、保持本文完整。并以超链形式注明本文原始地址:http://program-think.blogspot.com/2009/02/study-technology-in-three-s...
>
> ----------------
> 编程随想
> program.th...@gmail.comhttp://program-think.blogspot.com

chaoyan ma

unread,
Apr 1, 2009, 4:35:36 AM4/1/09
to pon...@googlegroups.com
LZ的名字好恶搞

小马xioama

unread,
Apr 1, 2009, 4:54:24 AM4/1/09
to pon...@googlegroups.com
漏了一个关键的,where, 就是在哪里使用这样的技术。还有一个who也很重要,就是谁会愿意为你的技术付钱。

有了where和who,才能把技术变成钱,改善自己的生活。

2009/4/1 总书记 <zhucey...@tom.com>

trydofor

unread,
Apr 1, 2009, 5:10:40 AM4/1/09
to pon...@googlegroups.com
个人认为 WHAT-> WHY -> HOW
可学可作的事太多了,不问why,直接how,没效率.
Message has been deleted

lili

unread,
Apr 1, 2009, 10:44:08 PM4/1/09
to TopLanguage

> program.th...@gmail.comhttp://program-think.blogspot.com

赞同你的“老手”和“新手”的观点。
学习,最难的就是这why不好找,也许面对陌生的知识,最好的why就是what了

wywwq

unread,
Apr 2, 2009, 12:36:50 AM4/2/09
to pon...@googlegroups.com
现在新技术太多了,why we learn so much~??

2009/4/2 lili <popi...@gmail.com>

Jeffrey Zhao

unread,
Apr 2, 2009, 12:44:44 AM4/2/09
to pon...@googlegroups.com
不学新技术就不用学了吗?

居振梁

unread,
Apr 2, 2009, 12:46:57 AM4/2/09
to pon...@googlegroups.com
why you learn so much new ?

2009/4/2 wywwq <kew...@gmail.com>

现在新技术太多了,why we learn so much~??



--
自学走了不少弯路,更浪费了太多的时间,寻找良师益友。
追求黑客精神和清心寡欲的心态。
中文博客:http://wargrey.yo2.cn
英文博客:http://wargrey.blogspot.com
研究方向:人工智能、Unix/GNU Linux、移动计算、虚拟化
其他兴趣:数学、物理、心理学、武术、自然语言

wywwq

unread,
Apr 2, 2009, 12:49:00 AM4/2/09
to pon...@googlegroups.com
项目需要就学,经常是很不深入的学习


 
2009/4/2 居振梁 <juzhe...@gmail.com>

居振梁

unread,
Apr 2, 2009, 1:56:12 AM4/2/09
to pon...@googlegroups.com
这就是我不喜欢做纯应用层软件的原因之一。
抽象层次越高,可选择的技术实现就越(倾向于)多,而实现技术又不能总由自己选,就被迫不断的要学那些看上去是新的东西。
比如ajax的框架,flex的框架,其实他们是原理模式是相同(似)的,但是在很多“视项目而学”的情况下,往往参与者会认为是新的东西,其实是在重复的学。

2009/4/2 wywwq <kew...@gmail.com>
项目需要就学,经常是很不深入的学习
Reply all
Reply to author
Forward
0 new messages