2013年9月30日星期一

阮一峰的网络日志

阮一峰的网络日志


梁漱溟:做学问的八个境界

Posted: 29 Sep 2013 06:01 AM PDT

本周,我读完了梁漱溟先生的自传文集《我生有涯愿无尽》

我生有涯愿无尽

这本书的前半部分,讲述梁先生如何从一个中学生成长为国学大师,闪光点很多。比如,北大校长蔡元培只因读过梁漱溟的一篇论文,便邀请他担任北大讲师,完全不顾梁没有读过大学。

出乎意料的是先生随即表示希望我到北大任教。先生说:"我是喜爱哲学的。我此次来北大重点要办好文科。文科中又以哲学系为重点,你就来哲学系讲印度哲学好了。"

我忙回答说:"先生之喜爱哲学我知道,早在中学时即读过先生翻译的《哲学要领》一书,至于我,实在不懂印度哲学。印度宗派是如此之多,而我只不过为解决自己在人生问题上的烦闷,钻研了一些佛典,领会一点佛家思想而已。"

先生说:"你说你不懂,但又有谁懂呢?我寻不着人,就是你来吧!"我总不敢承当。先生于是说道:"我看你也是喜欢哲学的。我们把一些喜爱哲学的朋友聚拢在一起,共同研究,互相切磋,你怎么可以不来呢!来北大,你不要以为是来教别人的,你把到北大当做来共同学习好了。"

蔡先生这几句话打动了我。抱这种态度再好不过,而我又怎会不愿来学习呢。来北大的事就如此确定下来。

这本书的后半部分,讲述梁先生从事社会改造的经历,乏味得很,因为没有一件事是成功的。他一心想让中国走上宪政之路,结果处处碰壁。比如,他主张"军队国家化",先去游说蒋介石。

1942年3月20日中午,蒋公宴请国民参政会驻会委员廿五人,饭罢留下我们五人细谈。对于草案认为可行,问我们若未曾与中共谈过,可即往商谈。

蒋介石把皮球踢给了共产党。结果,梁漱溟真的跑到延安,见了毛泽东和朱德,宣传他的主张。

座间毛、朱二公颇用心听我发言,毛无表示,朱公当听到我末后的话时,忽曰:"此或三十年后的事吧!"此外无人置一词。

梁先生幼稚到相信,国民党和共产党会同意放弃军队,可见他对政治其实一无所知。难怪他的社会改造梦想皆不成功,还没等到文化大革命,就在1953年被毛泽东打倒了。

虽然政治的部分不好看,但是在治学方面,他的自传文集很值得一读。下面的内容关于如何做学问,整理自他1928年在广州中山大学的讲演,我觉得讲得非常好。

================================

1928年在广州中山大学的讲演(节选)

作者:梁漱溟

梁漱溟

所谓学问,就是对问题说得出道理,有自己的想法。

想法似乎人人都是有的,但又等于没有。因为大多数人的头脑杂乱无章,人云亦云,对于不同的观点意见,他都点头称是,等于没有想法。

我从来没有想过要做学问,走上现在这条路,只是因为我喜欢提问题。大约从十四岁开始,总有问题占据在我的心里,从一个问题转入另一个问题,一直想如何解答,解答不完就欲罢不能,就一路走了下来。

提得出问题,然后想要解决它,这大概是做学问的起点吧。

以下分八层来说明我走的一条路:

第一层境界:形成主见

用心想一个问题,便会对这个问题有主见,形成自己的判断。

说是主见,称之为偏见亦可。我们的主见也许是很浅薄的,但即使浅薄,也终究是你自己的意见。

许多哲学家的哲学也很浅,就因为浅便行了,胡适之先生的哲学很浅,亦很行。因为这是他自己的,纵然不高深,却是心得,而亲切有味。所以说出来便能够动人,能动人就行了!他就能自成一派,其他人不行,就是因为其他人连浅薄的哲学都没有。

第二层境界:发现不能解释的事情

有主见,才有你自己;有自己,才有旁人,才会发觉前后左右都是与我意见不同的人。

这时候,你感觉到种种冲突,种种矛盾,种种没有道理,又种种都是道理。于是就不得不第二步地用心思。

面对各种问题,你自己说不出道理,不甘心随便跟着人家说,也不敢轻易自信,这时你就走上求学问的正确道路了。

第三层境界:融汇贯通

从此以后,前人的主张、今人的言论,你不会轻易放过,稍有与自己不同处,便知道加以注意。

你看到与自己想法相同的,感到亲切;看到与自己想法不同的,感到隔膜。有不同,就非求解决不可;有隔膜,就非求了解不可。于是,古人今人所曾用过的心思,慢慢融汇到你自己。

你最初的一点主见,成为以后大学问的萌芽。从这点萌芽,你才可以吸收养料,才可以向上生枝发叶,向下入土生根。待得上边枝叶扶疏,下边根深蒂固,学问便成了。

这是读书唯一正确的方法,不然读书也没用处。会读书的人说话时,说他自己的话,不堆砌名词,不旁征博引;反之,引书越多的人越不会读书。

第四层境界:知不足

用心之后,就知道要虚心了。自己当初一点见解之浮浅,不足以解决问题。

学问的进步,不单是见解有进步,还表现在你的心思头脑锻炼得精密了,心气态度锻炼得谦虚了。

心虚思密是求学的必要条件。

对于前人之学,总不要说自己都懂。因为自己觉得不懂,就可以除去一切浮见,完全虚心地先求了解它。

遇到不同的意见思想,我总疑心他比我高明,疑心他必有我所未及的见闻,不然,他何以不和我作同样判断呢?疑心他必有精思深悟过于我,不然,何以我所见如此而他所见如彼呢?

第五层境界:以简御繁

你见到的意见越多,专研得愈深,这时候零碎的知识,片段的见解都没有了;心里全是一贯的系统,整个的组织。如此,就可以算成功了。到了这时候,才能以简御繁,才可以学问多而不觉得多。

凡有系统的思想,在心里都很简单,仿佛只有一两句话。凡是大哲学家皆没有许多话说,总不过一两句。很复杂很沉重的宇宙,在他手心里是异常轻松的----所谓举重若轻。

学问家如说肩背上负着多沉重的学问,那是不对的;如说当初觉得有什么,现在才晓得原来没有什么,那就对了。道理越看得明透,越觉得无甚话可说,还是一点不说的好。心里明白,口里讲不出来。

反过来说,学问浅的人说话愈多,思想不清楚的人名词越多。让一个没有学问的人看见,真要把他吓坏了!其实道理明透了,名词便可用,可不用,或随意拾用。

第六层境界:运用自如

如果外面或里面还有解决不了的问题,那学问必是没到家。如果学问已经通了,就没有问题。

真学问的人,学问可以完全归自己运用。假学问的人,学问在他的手里完全不会用。

第七层境界:一览众山小

学问里面的甘苦都尝过了,再看旁人的见解主张,其中得失长短都能够看出来。这个浅薄,那个到家,这个是什么分数,那个是什么程度,都知道得很清楚;因为自己从前也是这样,一切深浅精粗的层次都曾经过。

第八层境界:通透

思精理熟之后,心里就没有一点不透的了。

(完)

文档信息

2013年9月2日星期一

阮一峰的网络日志

阮一峰的网络日志


JavaScript与有限状态机

Posted: 01 Sep 2013 09:14 PM PDT

有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。

简单说,它有三个特征:

  * 状态总数(state)是有限的。
  * 任一时刻,只处在一种状态之中。
  * 某种条件下,会从一种状态转变(transition)到另一种状态。

它对JavaScript的意义在于,很多对象可以写成有限状态机。

举例来说,网页上有一个菜单元素。鼠标悬停的时候,菜单显示;鼠标移开的时候,菜单隐藏。如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状态转变。

代码可以写成下面这样:

   var menu = {            // 当前状态     currentState: 'hide',        // 绑定事件     initialize: function() {       var self = this;       self.on("hover", self.transition);     },        // 状态转换     transition: function(event){       switch(this.currentState) {         case "hide":           this.currentState = 'show';           doSomething();           break;         case "show":           this.currentState = 'hide';           doSomething();           break;         default:           console.log('Invalid State!');           break;       }     }      };    

可以看到,有限状态机的写法,逻辑清晰,表达力强,有利于封装事件。一个对象的状态越多、发生的事件越多,就越适合采用有限状态机的写法。

另外,JavaScript语言是一种异步操作特别多的语言,常用的解决方法是指定回调函数,但这样会造成代码结构混乱、难以测试和除错等问题。有限状态机提供了更好的办法:把异步操作与对象的状态改变挂钩,当异步操作结束的时候,发生相应的状态改变,由此再触发其他操作。这要比回调函数、事件监听、发布/订阅等解决方案,在逻辑上更合理,更易于降低代码的复杂度。

下面介绍一个有限状态机的函数库Javascript Finite State Machine。这个库非常好懂,可以帮助我们加深理解,而且功能一点都不弱。

该库提供一个全局对象StateMachine,使用该对象的create方法,可以生成有限状态机的实例。

   var fsm = StateMachine.create();    

生成的时候,需要提供一个参数对象,用来描述实例的性质。比如,交通信号灯(红绿灯)可以这样描述:

   var fsm = StateMachine.create({        initial: 'green',        events: [       { name: 'warn',  from: 'green',  to: 'yellow' },       { name: 'stop', from: 'yellow', to: 'red' },       { name: 'ready',  from: 'red',    to: 'yellow' },       { name: 'go', from: 'yellow', to: 'green' }     ]      });    

交通信号灯的初始状态(initial)为green,events属性是触发状态改变的各种事件,比如warn事件使得green状态变成yellow状态,stop事件使得yellow状态变成red状态等等。

生成实例以后,就可以随时查询当前状态。

* fsm.current :返回当前状态。
* fsm.is(s) :返回一个布尔值,表示状态s是否为当前状态。
* fsm.can(e) :返回一个布尔值,表示事件e是否能在当前状态触发。
* fsm.cannot(e) :返回一个布尔值,表示事件e是否不能在当前状态触发。

Javascript Finite State Machine允许为每个事件指定两个回调函数,以warn事件为例:

* onbeforewarn:在warn事件发生之前触发。
* onafterwarn(可简写成onwarn) :在warn事件发生之后触发。

同时,它也允许为每个状态指定两个回调函数,以green状态为例:

* onleavegreen :在离开green状态时触发。
* onentergreen(可简写成ongreen) :在进入green状态时触发。

假定warn事件使得状态从green变为yellow,上面四类回调函数的发生顺序如下:onbeforewarn → onleavegreen → onenteryellow → onafterwarn

除了为每个事件和状态单独指定回调函数,还可以为所有的事件和状态指定通用的回调函数。

* onbeforeevent :任一事件发生之前触发。
* onleavestate :离开任一状态时触发。
* onenterstate :进入任一状态时触发。
* onafterevent :任一事件结束后触发。

如果事件的回调函数里面有异步操作(比如与服务器进行Ajax通信),这时我们可能希望等到异步操作结束,再发生状态改变。这就要用到transition方法。

   fsm.onleavegreen = function(){     light.fadeOut('slow', function() {       fsm.transition();     });     return StateMachine.ASYNC;   };    

上面代码的回调函数里面,有一个异步操作(light.fadeOut)。如果不希望状态立即改变,就要让回调函数返回StateMachine.ASYNC,表示状态暂时不改变;等到异步操作结束,再调用transition方法,使得状态发生改变。

Javascript Finite State Machine还允许指定错误处理函数,当发生了当前状态不可能发生的事件时自动触发。

   var fsm = StateMachine.create({     // ...     error: function(eventName, from, to, args, errorCode, errorMessage) {       return 'event ' + eventName + ': ' + errorMessage;     },     // ...    });    

比如,当前状态是green,理论上这时只可能发生warn事件。要是这时发生了stop事件,就会触发上面的错误处理函数。

Javascript Finite State Machine的基本用法就是上面这些,更详细的介绍可以参见它的主页

(完)

文档信息