wolf19831029 发表于 2010-6-22 23:23:36

[转帖]一直以来伴随我的一些学习习惯(四):知识结构

<font size="4">&nbsp; </font>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1" align="left"><b><span style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-font-kerning: 18.0pt; mso-bidi-font-family: 宋体"><font size="4">一直以来伴随我的一些学习习惯<span lang="EN-US">(</span>四<span lang="EN-US">)</span>:知识结构<span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></font></span></b></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times new=" ?Times mso-hansi-font-family: &nbsp;&nbsp;Roman?? new="New" New?&nbsp;&nbsp;Roman?;><font size="4">作者:刘未鹏</font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="FONT-SIZE: 24pt; FONT-FAMILY: 宋体; mso-font-kerning: 18.0pt; mso-bidi-font-family: 宋体"><o:p><font size="4">&nbsp;</font></o:p></span></b></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">自从建立了 <span lang="EN-US">TopLanguage </span>以来,发现在上面待的时间越来越多,与高手讨论问题是个粘性十足的事情,一方面,分享自己的认识是整理不成熟的想法的极好途径,另一方面,互相之间视角不同,所以往往自己忽视的地方会被别人发现。在讨论中不断精化既有的知识体系。以下这段基本上摘抄自(略有整理和添加)在<span lang="EN-US"> TopLanguage </span>上的发言:<span lang="EN-US"><o:p></o:p></span></font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><font size="4"><b><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">抓住不变量</span></b><span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">我喜欢把知识分为<span lang="EN-US">essential</span>的和<span lang="EN-US">non-essential</span>的。对于前者采取提前深入掌握牢靠的办法,对于后者采取待用到的时刻<span lang="EN-US">RTM (Read the manual)</span>方法(用本)。<span lang="EN-US"><o:p></o:p></span></font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">如何区分<span lang="EN-US">essential</span>和<span lang="EN-US">non-essential</span>的知识想必绝大多数时候大家心里都有数,我举几个例子:对程序员来说,硬件体系结构是<span lang="EN-US">essential</span>的,操作系统的一些重要的实现机制是<span lang="EN-US">essential</span>的,主流编程范式(<span lang="EN-US">OO</span>、<span lang="EN-US">FP</span>)是为了满足什么需求出现的(出现是为了解决什么问题),是怎么解决的,自身又引入了哪些新的问题,从而适用哪些场景)。这些我认为都是<span lang="EN-US">essential</span>的。我想补充一点的是,并不是说硬件体系结构就要了解到逻辑门、晶体管层面才行(其实要了解到这个层面代价也很小,一两本好书就行了),也并不是说就要通读《<span lang="EN-US">Computer Architecture: Quantitative Approach</span>》才行。而是关键要了解那些重要的思想(很长时间不变的东西),而不是很细的技术细节(易变的东西)。《<span lang="EN-US">Computer Systems: A Programmer’s Perspective</span>》就是为此目的,针对程序员的需求总结出那些<span lang="EN-US">essential knowledge</span>的好书。<span lang="EN-US"><o:p></o:p></span></font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">再来说一下为什么需要预先牢靠掌握这些<span lang="EN-US">essential</span>的知识:<span lang="EN-US"><o:p></o:p></span></font></span></p>
<ol type="1">
<li class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0=" list="list" tab-stops: &nbsp;&nbsp;36.0pt? &nbsp;&nbsp;lfo1; l0?&nbsp;&nbsp;level1="level1"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">根据<span lang="EN-US">Joel Spolsky</span>同学的说法(<span lang="EN-US"><span lang="EN-US"><span lang="EN-US">原文</span></span></span>),编程语言技术是对底层设备的封装,然而封装总是会出现漏洞的,于是程序员被迫下到<span lang="EN-US">“</span>下水道<span lang="EN-US">”</span>当中去解决问题,一旦往下走,漂亮的<span lang="EN-US">OO</span>、<span lang="EN-US">N</span>层抽象就不复存在了,这时候不具备坚硬的底层知识就会无法解决问题。简而言之就是这些底层知识会无可避免的需要用到,既然肯定会被用到那还是预先掌握的好,否则一来用到的时候再查是来不及的,因为<span lang="EN-US">essential</span>的知识也往往正是那些需要较长时间消化掌握的东西,不像<span lang="EN-US">Ruby</span>的<span lang="EN-US">mixin</span>或<span lang="EN-US">closure</span>这种翻一下<span lang="EN-US">manual</span>就能掌握的东西。(英语也是这样的<span lang="EN-US">essential knowledge——</span>上次在<span lang="EN-US">PyCN</span>上看到一个招<span lang="EN-US">Python</span>开发人员的帖子将英语列为必备技能,却并不将自然语言处理列为必备技能,正是因为英语不是可以临阵磨枪的东西,而且作为知识的主要载体,任何时候都少不了它,如果不具备英语能力,这个就会成为个人知识结构的短板或瓶颈,而且由于需要长时间才能获得这项能力,所以这个瓶颈将持续很长时间存在。我们曾经在<span lang="EN-US"> TopLanguage </span>上讨论过如何<span lang="EN-US"><span lang="EN-US"><span lang="EN-US">花最少的时间掌握英语</span></span></span>)另一方面,在问题解决当中,如果不具备必要的知识,是根本无从思考的,再好的分析能力也并不是每个问题都能分析出该用哪些知识然后再去查手册的,很多时候是在工具和问题之间比较,联想,试探性的拼凑来解决问题;这就使得一个好的既有知识基变得至关重要。(实际上以上这个是一个较大的话题,希望有一天我能够把它详细展开说清<span lang="EN-US">:)</span>) <span lang="EN-US"><o:p></o:p></span></font></span></li>
<li class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0=" list="list" tab-stops: &nbsp;&nbsp;36.0pt? &nbsp;&nbsp;lfo1; l0?&nbsp;&nbsp;level1="level1"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">如果你不知道某个工具的存在,遇到问题的时候是很难想到需要使用这么样一个工具的,<span lang="EN-US">essential knowldge</span>就是使用最为广泛的工具,编程当中遇到某些问题之后,如果缺乏底层知识,你甚至都不知道需要去补充哪些底层知识才能解决这个问题。 <span lang="EN-US"><o:p></o:p></span></font></span></li>
<li class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0=" list="list" tab-stops: &nbsp;&nbsp;36.0pt? &nbsp;&nbsp;lfo1; l0?&nbsp;&nbsp;level1="level1"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">你必须首先熟悉你的工具,才能有效地使用它(须知<span lang="EN-US"><span lang="EN-US"><span lang="EN-US">工具的强是无敌的</span></span></span>,但这一切得以<span lang="EN-US">“</span>了解你的工具<span lang="EN-US">”</span>为前提,甚至得以<span lang="EN-US">“</span>了解目前可能有哪些工具适合你的问题<span lang="EN-US">”</span>为前提)。一门语言,你必须了解它的适用场景,不适用场景(比如继承能解决你的问题不代表继承就是解决你的问题的最适合的方案,须知问题是一个复杂系统,解决方案总是常常引入新的问题)。你必须了解它支持的主要编程范式,此外你还必须了解它的<span lang="EN-US">traps</span>和<span lang="EN-US">pitfalls</span>(缺陷和陷阱,如果不知道陷阱的存在,掉进去也不知道怎么掉的。)这些都是<span lang="EN-US">essential knowledge</span>,如果不事先掌握,指望用的时候查<span lang="EN-US">manual</span>,是很浪费时间的,而且正如第<span lang="EN-US">2</span>点所说,正因为你不知道这些知识(如适用场景),从而用<span lang="EN-US">sub-optimal</span>的方式使用了一门语言自己可能还不知道(最小白的例子是,如果你不知道语言支持<span lang="EN-US">foreach</span>,那么可能每次都要写一个冗长的循环,较常见的例子是不知道有很方便的库设施可以解决手头的问题所以傻乎乎的自己写了一堆代码),因为人的评价标准常常是:只要解决了最醒目的问题并且引入的新问题尚能忍受,就行。注意,熟悉并非指熟悉所有细节,而是那些重要的,或者无法在需要用到的时候按需查找的知识。比如上面提到的:适用场景不适用场景,编程范式,主要语言特性,缺陷和陷阱。 <span lang="EN-US"><o:p></o:p></span></font></span></li></ol>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">当然,以上作为程序员的<span lang="EN-US">essential knowledge</span>列表并不完备,关键是自己在学习新知识的时候带着第三只眼来敏锐地判断这个知识是否是不变量,或不易变的量,是否完全可以在用的时候查手册即可,还是需要提前掌握(一些判断方法在上文也有所提及)。并且学会在纷繁的知识中抽象出那些重要的,本质的,不变的东西。我在之前的<span lang="EN-US">part</span>里面也提到我在学习新知识的时候常常问自己三个问题:该知识的(体系或层次)结构是什么、本质是什么、第一原则是什么。<span lang="EN-US"><o:p></o:p></span></font></span></p>
<p class="MsoNormal" style="TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="4">另外还有一些我认为是<span lang="EN-US">essential knowledge</span>的例子:分析问题解决问题的思维方法(这个东西很难读一两本书就掌握,需要很长时间的锻炼和反思)、判断与决策的方法(生活中需要进行判断与决策的地方远远多于我们的想象),波普尔曾经说过:<span lang="EN-US">All Life is Problem-Solving</span>。而判断与决策又是其中最常见的一类<span lang="EN-US">Problem Solving</span>。尽管生活中面临重大决策的时候并不多,但另一方面我们时时刻刻都在进行最重大的决策:如:决定自己的日常时间到底投入到什么地方去。如:你能想象有人宁可天天花时间剪报纸上的优惠券,却对于房价的<span lang="EN-US">1%</span>的优惠无动于衷吗?(《别做正常的傻瓜》、《<span lang="EN-US">Predictably Irrational</span>》)如:你知道为什么当手头股票的股价不可抑止地滑向深渊时我们却一边揪着头发一边愣是不肯撤出吗?(是的,我们适应远古时代的心理机制根本不适应金融市场。)糟糕的判断与决策令我们的生活变得糟糕,这还不是最关键的,最关键的是我们从来不会去质疑自己的判断,而是总是能<span lang="EN-US">“</span>找到<span lang="EN-US">”</span>其他为自己辩护的理由(《错不在我(<span lang="EN-US">Mistakes were made, but not by me</span>)》)又,现在是一个信息泛滥的时代,于是另一个问题也出现:如何在海洋中有效筛选好的信息,以及避免被不好的信息左右我们的大脑(<span lang="EN-US">Critical Thinking</span>)关于以上提到的几点我在豆瓣上有一个专门的豆列(<span lang="EN-US">“<span lang="EN-US"><span lang="EN-US">学会思考</span></span>”</span>),希望有一天我能够积累出足够多的认识对这个主题展开一些详细介绍。<span lang="EN-US"><o:p></o:p></span></font></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p><font size="4">&nbsp;</font></o:p></span></p>
<p><font size="4"></font>&nbsp;</p>

lx1000d 发表于 2010-6-23 14:12:37

收获还是很多的,根据自己的阅读习惯会选择性的借鉴一下,啊哈哈!谢谢
页: [1]
查看完整版本: [转帖]一直以来伴随我的一些学习习惯(四):知识结构