Tuesday, 11 December 2007

测试驱动学习模式


测试驱动学习模式



学习本身也需要学习(Study itself also needs to be studied),而且学习本身的学习,还是一个永不停止的过程,永远也没有个完结。这也恰恰是学习自身学习的特点。


人一生下来就对周围进行探索。迈出一步之前假设落脚之处是平的、凹的、或凸的。如果假设不对,就修改自己的视觉识别代码和步行代码来适应更复杂的环境。这在本质上是测试的思想。当然测试也是一种探索,只是没有其他一些种类探索那样的盲目,是一种目的性比较强的探索。


测试驱动学习模式(Test Driven Study PatternTDSP)可以对测试驱动学习模式自身进行学习。测试驱动学习模式的关键之处就是对追根溯源、对所谓终极真理的追求强烈地说不。不然的话,就没办法使用测试驱动学习模式来学习测试驱动学习模式,就会陷入鸡生蛋、蛋生鸡的无限循环反复不能自拔。以下是测试驱动学习模式对鸡生蛋还是蛋生鸡问题的回答:

  1. 如果喜欢或需要吃蛋(鸡),而只有鸡(蛋)没有蛋(鸡),就养鸡生蛋(孵蛋成鸡);
  2. 如果喜欢或需要吃蛋(鸡),并且蛋(鸡)刚好就有,就直接吃;
  3. 如果喜欢或需要吃蛋(鸡),而蛋(鸡)和鸡(蛋)都没有,那就到其他地方找找。

人不可能什么都喜欢也不可能什么都需要。测试驱动学习模式最适合对未知事物怀有浓烈兴趣且高度敬业的人,也比较适合兴趣和职业精神只占其一的人。但对那些对未知毫无兴趣、又不敬业的人,测试驱动学习模式束手无策。


保持饥饿,保持无知(Stay hungrystay foolish)。整天打嗝的人即使面对珍馐美味,也毫无食欲,更不要指望其能使用测试驱动学习模式作为猎枪,在寒冷的户外猎取食物。

人都有吃饱的时候,但千万不要让垃圾阻塞肠胃。如何区别垃圾是测试驱动学习模式解决的最漂亮的问题。可以说,使用测试驱动学习模式获得的知识,根本就没有垃圾。既然测试驱动学习模式自身也是由测试驱动学习模式得到,因此可以证明测试驱动学习模式不是垃圾。


测试驱动学习模式典型的思考方式:

  1. 本人需要的是什么?

  2. 其所有的是什么?

  3. 如何使用其所有的来满足本人所需要的?

前两个问题是What类型,后一个问题是How类型的;测试驱动学习模式里没有Why类型的问题,比如没有类似“为什么它的所有满足不了我的需要”这样的问题。



测试驱动学习模式不提倡问以下问题:

  1. 某某的本质到底是什么
    比如测试驱动学习模式的本质到底是什么?

  2. 所有以为什么开头的问题


拒绝问为什么的问题会不会导致不求甚解?是的,会导致。但不求甚解在测试驱动学习模式里是难得的好习惯。不求甚解的对象是所有不为本人所需要的。当然也有一些饱食终日的人什么都不需要。这也是测试驱动学习模式对此类人毫无效果的原因。


测试驱动学习模式提倡有清晰的、可验证的观点。哪怕事后证明是错误的观点也比含糊不清要好。有了观点之后马上着手去验证,去实践中测试这个观点。如果经测试这个观点是对的,那可以把这个观点收藏起来;否则可以修正之前的观点,进一步验证;如此循环。


大量的、清晰而且可验证的观点是一笔财富,存的越多测试驱动学习者就越富有。而不清晰不可验证的观点对学习者来说恰恰是类似债务的东西,越多越贫穷;将来要栽的跟头也就越多。


测试驱动学习模式不相信“谦虚使人进步,骄傲使人落后”,而是认为无论骄傲还是谦虚都可以使人进步,只要这人是真诚的。真诚的人更容易提出清晰而可验证的观点,即使一些观点经过验证并不正确,但仍然有益;而虚伪的人,比如一些政治家,提出含糊而不可验证的观点,不到翁一样摇摇摆摆,根本不是为了获取知识,因此也获取不到真正的知识。


如果测试驱动学习者发现自己有很多含糊而不可验证的观点,怎么办?可以肯定的是能有此发现是天大的好事,因为很多人还不知道自己的观点含糊不可验证呢。剩下的任务就简单了,只需使这些观点其变得清晰并可验证就可以了。

一个观点是否含糊也许难于察觉,但其是否可以验证(或容易验证)却是非常容易验证的问题。因此试图验证一个观点是否正确是测试驱动学习模式的第一步,也就是最关键的一步。观点是否正确并不重要,重要的是该观点是否容易验证。

总结一下测试驱动学习模式所强调的:

  1. 敏捷而直接
    先找到学习对象一个最简单的使用方式,在这个最简单使用方式之下用测试的方法体会其功能及使用。
  2. 把握整体
    面向学习对象的主体思想,避免迷失于具体的细节。
  3. 迅速应用于实践
    测试的特点就是实践性强,可以同时从成功和失败中学习,学到的也不仅仅是经验而是规律性的东西。

需要注意的是以上三条总结是否正确需要进一步使用测试驱动学习模式来验证。甚至这三条总结的观点是否清晰可验证都需要读者进一步验证。


测试驱动学习模式有以下好处:

  1. 学习周期短见效快
    即使只是花了很少的时间,学会了很少的一部分知识,也可以很快投入使用。甚至用于用于学习的测试过程经过简单整理,也可以投入实践中进行使用。
  2. 直指学习对象的可执行核心
    直接解决的学习对象的可执行部分是什么,怎么用的问题。避免陷入其不可执行部分的细节争论。
  3. 拿测试说话沟通容易
    测试也能说话,而且测试是注重实践的人之间最精确的语言。使用测试进行交流会避免很多不必要的误解。

需要注意的是这三条好处是否正确需要进一步使用测试驱动学习模式来验证。甚至三条好处的观点是否清晰可验证都需要读者进一步验证。


测试驱动的学习模式特别适合街边的程序员(Programmers on the street)来使用。街边的程序员的称谓来自高德纳(Donald Ervin Knuth),并非贬义,泛指以编程为生计的技术人员。世界上大部分程序员都是街边的程序员。象牙塔里的程序员寥寥无几,其中高德纳就是一个。


街边的程序员还可以分为两类,一类是街右边的程序员,一类是街左边的程序员。街右边的走的路比街左边的多,街左边的比街右边的看的多。测试驱动学习模式认为两边的都应该往中间靠靠。埋头走路的也应该抬头看看,站在街边观看的也应该走走。学习的道路上没有机动车,撞不死;跌倒了爬起来拍拍土也就没事了;相互碰碰身体更强壮,没理由老绕着走。


象牙塔里到底有没有程序员?这个问题并不是很清晰可验证,可以在这个问题变得清晰可验证之前,对其不加理会。因此街边的程序员可以暂时地走在测试驱动学习模式的道路上。

Wednesday, 21 November 2007

windresize简介

windresize可以用来管理emacs里的窗口,改变窗口大小、切换窗口,创建或去除窗口等。
Emacs里的窗口在没有windresize的时候,也可以改变大小,比如:
C-x ^ ---- 增加高度
C-u -1 C-x _ ---- 减少高度
等,功能都在但用起来就不方便。

windresize用上下左右方向键来改窗口大小,比如用<-就是向左变大,非常方便。

不用windresize的话,窗口切换用C-x o。用了windsize,用o或n
切到下一个窗口,用p返回上一个窗口。很方便。
安装:
cd /usr/share/emacs/site-lisp
wget http://www.cognition.ens.fr/~guerry/u/windresize.el
在.emacs里:
(require 'windresize)
使用的时候可以M-x windresize,之后就可以用方向键变窗口大小了。也可以将其与某个键绑定,比如和F2绑定。
(global-set-key [f2] 'windresize)
按F2进入windresize,调整窗口后按F2或Enter退出,取消调整按q推出。

还可以用2横着分两个窗口,按3竖着分两个,1删除当前窗口。都很好用。目前的一个问题是帮助窗口的退出设计的不好,不过这些作者已经知道,很快会修复。另一个提上日程的功能是改变选中背景色来表示选中的窗口。很快会推出。

Wednesday, 14 November 2007

顶部的小窗

有人要求顶部的小窗
原因是他一男的
低头太难
作者说有啥用啊
他说他一男的
低头太难
低头太难

Saturday, 3 November 2007

初识Scala

毫无疑问scala将成为一门伟大的语言,Java最无间的伴侣。就像在Emacs的实现里,C语言和lisp语言的关系一样。Java相当于C而scala就是Java里的lisp。这是因为C没有那么动态而Java也没有那么动态。Lisp足够的动态而scala也动感十足。因此理想类Emacs的应用是以Java为骨架而以Scala为血肉。

Sunday, 14 October 2007

战争风云以及战争与回忆

中国人从两次世界大战中学到了什么?很遗憾,基本什么都没有学到。这是我读战争风云,看战争与回忆体悟到的。文学家应该负起这个责任。根本没有对战争站在一个民族的立场,进行反思的作品。是我们民族的劣根在其作用。这是一个习惯忘记真实,记住幻觉的民族。这些幻觉和愚昧和怯懦无关,只有智慧和勇敢无畏。这太讨厌了。想到此处都想大哭一场。文学家忙于歌功颂德。中国没有哲学家,遇到难解决的问题就退隐了,还要写上一首意境深远的诗。 没有批评,没有真心的夸赞。我们的民族倒立在世界民族之林,炫耀技巧,以 及祖宗的真理。犹太人从二战中毕业了,他们用他们学到的知识建立了以色列国,他们没有忘记他们的苦难以及苦难的原因。德国人也毕业了,日本人也毕业了,英国人,法国人,美国人,他们都毕业了。但中国人什么也没学到,但也得到了毕业证。这是一个阴谋,但只有聪明如中国这样的才会故意上当。

Thursday, 4 October 2007

关于Ruby

大致翻阅了一下Programming Ruby中文版。写的不错,翻译的也很好。
Ruby是一个骨子里类lisp的语言,尽管其表面上是纯面向对象的。它解决多继承的办法(mixin)值得称道,这一点已经进入Java的设计。在面向方面编程方面,非常的自然。Java在面向方面编程方面处理的不够优美,但就使用方面而言,还算可以。这种自然的面向方面编程能力,来源自它的母体,古老而神秘的lisp编程世界。Ruby的性能是很大的问题,其标准库也是七拼八凑,基本就是杂牌军。当然其基本建设还是好的。但就其根基而言 ,没有统一的办法解决大部分问题,因此只能拼凑。一些新思想是在设计理念 方面,可以很容易用到其他语言。下面谈一下Ruby的面向方面编程。有两个方面,一个是类加载,一个是块传递。Ruby可以加载多个类,重复定义的类会在运行时融合为一个,类里的方法后加载的覆盖覆盖前面的,很简单。很典型的缝补模式。Java可以通过定义类加载策略来做到这一点。Java当下类加载的策 略就是不加载第二个,这个倒可以改改。代码块的传递Java里没有对应,不过就功能而言,也是可以设计的。

Friday, 28 September 2007

大洋彼岸的一个朋友

大洋彼岸的一个朋友,终于找到了匹配的器官,去医院做手术去了。真替他高兴。他一直操心我的事。最后一次和他聊,他很谨慎地不聊这个。他说再见。 然后就不见了。