妄论

友人的日志里有个问题,让叙述自己对儒、释、道、基督四家的印象,我也试试给出自己的解答。我知道这是自己的妄论,但无论如何,仍然是生命里的一道划痕,记下便记下了。

儒,温文尔雅;释,圆融庄严;道,无为自在;基督,炽热光明。

我对这里道家的描述最不满意:孔子见老子都无法言语形容,”无为”讲老子好像过于简单;似乎老子那里也蕴含着一种质朴阳刚的气质。而”自在”本是佛教术语,形容庄子看起来也不恰当;但我翻过词典,也没找到更合适的词。

对儒家的描述,我觉得也不恰当,但也没找到更合适的词。”温文尔雅”,单字没有太大问题,合在一起却过于温和了一点。只有”雅”字和我心意,从它的读音里,我们能体会到一种阴性的延绵不断的滋生和阳性的、敞开的刚强。

释家,我了解不多。

基督,了解也不多,但我喜欢一种炽热光明的东西。

沟通问题

人们并不完全相互理解,可是却能够沟通,这背后的数学原理在哪里?我自己个人的一个非数学解答是这样一个过程:沟通、合一、生长。要知道,Shannon是在双方完全理解的前提下,建立信息论的;问题是现实里人们并不完全彼此理解。

沟通是一个往复不断的过程。这里又有三个子问题:沟通何以能成立?为什么不能完全的相互理解或者说为什么彻底的沟通会失败?一次沟通结束,如何成长为下次沟通作准备?如果设想大脑是一个复杂的动力系统,那么”理解”就是两个动力系统的一种拟同态,而这一对动力系统又构成一个更复杂的动力系统。这个时候沟通、合一、生长就可以纳入数学框架里面了。但这是个非常困难的事情。

万物有灵

宇宙:充盈着生命的大生命,它包蕴、滋生着万物,万物也都获得了它的灵性。

时间:时光流逝,延绵不绝,永不再来?应该不是这样的:所有的神话都会以某种方式在新人里重生,这是一种特殊的时光的轮回;时间难道不能也是不连续的吗?像珠串,大小相间,层层嵌套。

空间:空间里充满的是无所不在的场域,它是万事万物之间的联系。

生命:从细微菌类的蠕动开始,生命内里的灵性,让它们沿着进化之树在不断奋进向上。万余年前在莽原上奔跑的原始人类,人科旁枝的弟兄,他们喘息,感受着这丰富的世界。可让人惊奇的是,他们的骨笛和我们的有着类似的结构。生命永远是可以相通的,因为他们有着相同的來自宇宙的灵性。

灵性:灵性是和母亲分离的痛,是生命向黑暗发出的光,是向自然的立法,是无所不在的推演和计算。

連岳的一場即席發言

上個周末去廣州參加了2008中文網志年會,這已經是第二次參與了。這次年會最大的收獲是聽了連岳的一場即席發言。從來沒見過連岳,只是從文字猜想他頗有稜角,但見面之后才發現,他非常文靜而內斂。這場即席發言,是在年會結束后,很多朋友聚在一起的一場告別晚會。現場聽的時候,連岳聲音很斯文,特別是講到PX期間的恐怖,聽來很感動。但我不知道變成文字,是否還有這個效果。這篇文字是周曙光和我每人整理了一半,但有些地方聽不清楚,或許還有疏漏,這些由我們來負責。

上個周末去廣州參加了2008中文網志年會,這已經是第二次參與了。這次年會最大的收獲是聽了連岳的一場即席發言。從來沒見過連岳,只是從文字猜想他頗有稜角,但見面之后才發現,他非常文靜而內斂。

這場即席發言,是在年會結束后,很多朋友聚在一起的一場告別晚會。現場聽的時候,連岳聲音很斯文,特別是講到PX期間的恐怖,聽來很感動。但我不知道變成文字,是否還有這個效果。這篇文字是周曙光和我每人整理了一半,但有些地方聽不清楚,或許還有疏漏,這些由我們來負責。

連岳

因為我昨天只參加了一個小組的封閉年會,參加的時間非常短,所以給大家道個歉,說聲對不起。因為這次的活動的重點是放在南方都市報的一個論壇,今天下午和另外兩位老師的論壇,三個小時吧,今天的重點放在那個地方,因為還要准備一些材料吧。

今天這個南方都市報的論壇,我覺得它的主題和我們網志年會是很貼切的,是講公民社會的形成和改變、改造的事。我覺得其實博客它現在在做的就是這個事,所以我今天下午因為很多人有提問的時候,他也說呢我悲觀, 意思是說—我說的和做的以及別人做的一切都沒有用。當時我下午講得一個主題就是說,在現階段我們說悲觀,它是一個不道德的事;只不過如果你是一個悲觀主義 者,你要把這個東西放到你的心里。在現在我們每個的公民社會,包括這種博客遂導(?聲音不清楚)的社會進步,還剛開始看到几個結成網絡,很幼小、很無聊、 很自不量力。在這個時候你是要打擊他呢?你還是跟他說你的這個東西是沒有用的?如果你說這個東西是沒有用的話,它沒有用的話,它又如何發生?這個公民社會的萌芽就扼殺了。所以這個時候我認為說,在現階段,中國現階段,悲觀主義是不道德的事。(眾人鼓掌)

我們為什么會寫博客?會來參加這個網志年會?大 家會在一起溝通?就表示說,我們相信自己的力量,我們相信能改變這個社會。我們能相信自己,一定要相信別人。是我認為我們這里的每一個人是都不是比別人更 高明的,別人的力量一點不比我們弱小。網志年會這一些人,這几十個人,這一百多個人,這一百多個人做事情、說話,它能改造這個社會多少?說實話還有可能這個社會一點都改變不了,但我覺得它的作用在什么地方?它的作用是每個人都是一個種子,你要把自己當成種子,也許一年以后每個人能影響四十個人,兩年以后每個人能影響一萬個人,這時候社會就開始改變。

我 覺得我們,我們想改造社會的人,在現階段不會存在的一個(?),我覺得存在兩個誤區。一個就是說我們存在傳道焦慮,當時我們影響力不夠的時候,或是我們說 一些重要的話題的時候,旁邊沒有人馬上應和,或是社會不馬上改變的話,我們就很焦慮。我們就會馬上說,我們做的可能是沒有用的東西。但這個公民社會,往往 正常的社會,它的進步是很緩慢的。在美國,每個人能投一票,所有的人他只能投一票。奧巴馬是一票,小布什是一票,億萬富翁是一票,窮人是一票。所以我覺得 在公民社會,我們每一個博客每一個人,我們寫好自己的博客,做好自己的東西,我們就賺到了,我們就完成了公民社會該完成的事情。如果你的博客有兩個人閱 讀,你就賺到了一票。所以我覺得說,我們沒有必要,沒有必要悲觀,不能悲觀。就說如果你能參加網志年會的話,你一定是影響了一批人的,你一定應該是一個樂 觀主義者,而你實際上的效應就是一個樂觀主義者。

所 以我就有了一個倡議就是說:原來我經常會說,中國沒有救了;我會說,中國沒有救了,我們做了沒有用。在07年之前我會說這種話,到07年之后,我意識到, 這種話不能說了,我們永遠不能說這種話。就永遠要鼓勵做事情的人,永遠不能打擊做事情的人。有時候悲觀主義者會形成一種抒情冷血。一個聲音出來以后,我們 寫一篇文章,社會沒有搞定,事情沒有改變;然后我們就抒情說,沒有用了,中國沒有救了,中國人的人性就是這個樣子。你會覺得好像很美,像林黛玉的抒情。這 個事情我們應該要有一種意識,我們不再說這種話。我們要覺得它在現階段,它是一個非常非常不道德的事情。

這是第一點傳道的焦慮。第二,我們要把悲觀主義,其實我們是一個天生的悲觀主義者,把悲觀主義留在自己的心里,不要說出來,當成一個記憶。

還有第二點,我覺得說,我們要怎么樣防止我們成為一個受迫害幻想狂(鼓掌)。或者換一個角度講,也許在座的各位多多少少受過迫害。就是在迫害的狀態下,我們怎么保持正常的心態、正常的心境。這也是我在去年想通的一個事情。

去 年的時候,剛開始知道的時候,這個電話,每天我電話拿起來,我非常恐慌,如果有人在監聽,那我當時在一直想這個問題,我突然就想通了。如果說這個公權力知 道一個人不停的批評它,不停的否認它的事情,它沒有釆取這個手段,反而不正常的。這個手段是你允許的,我給你。那我在電話說我該說的話,我不讓它影響我的 生活。我照樣在電話里和老婆打情罵俏,當這些人不存在。就不讓它和我的生活,不讓它,覺得說—我做一個想法、每出一次門都弄得很緊張,我覺得這對我精神上 是有損害的。我要恢復到一個很平和的狀態。所以我覺得說,這一點很重要,我們要,即使我們受到迫害,即使你覺得受到壓力,也要保持一個平和的心態。該享受 生活就享受生活,該寫博客就寫博客。盡量使自己不要成為一個被迫害者,甚至成為一個受迫害幻想狂。

這是我在去年這段時間里想清楚的,所想清楚的几點事情。可能很多人沒有想通,遲一點就想通了。其他也沒有別的可說了,謝謝大家。

北風

謝謝連岳。讓我發現連岳不再感到恐懼的,只是因為他跟他老婆打情罵俏。因為我往往跟老婆以外的某個人打情罵俏。(眾人哄笑)

基本功

最近没有去用太多时间研究Haskell,而是又把很多精力放回到已经工作了将近10年的Java了。原因很简单,这些日子和公司的一位老手合作,才豁然发现其实自己编程的基本功很差。对程序员来说,语言的选择只是问题的一个方面,更重要的是他如何对待自己写出的每一行代码,境界的差别全在其中。就拿我这一两天学到的为例。

本文原发在巴别诺瓦,把上篇BLOG没有细说的设计说清楚了。

最近没有去用太多时间研究Haskell,而是又把很多精力放回到已经工作了将近10年的Java了。原因很简单,这些日子和公司的一位老手合作,才豁然发现其实自己编程的基本功很差。

对程序员来说,语言的选择只是问题的一个方面,更重要的是他如何对待自己写出的每一行代码,境界的差别全在其中。就拿我这一两天学到的为例。

public static String format(Object[] arguments, String pattern) {
return java.text.MessageFormat.format(pattern, arguments);
}

public static void test() {
format(new Object[]{"a", "b"}, "{0}_{1}");
}

比如,上面这段普通不过的代码如何改进?我看到了下面的代码才明白自己没有真正理解变参函数的长处:

public static String format(String pattern, Object... arguments) {
return java.text.MessageFormat.format(pattern, arguments);
}

public static void test() {
format("{0}_{1}", "a", "b");
}

这只是一个小的细节。下面再举一个设计的例子,关于一个代码生成器:

需求很简单,输入一个格式类似 “${a.b.c}” 的字串,把它按照一定的业务规则,输出为另外一段代码

上面描述的过程在业务类里面大量重复出现,一个可以设想的解决办法是把重复的代码提升到父类里面。

public String generate(Context ctx) {
Reference ref = resolveReference(m_ref);

String clazz = ctx.getClass(ref.getFirstPart());
String variable = getVariable(ref, "url");
String scriptlet = getScriptlet (ref, clazz, "url");

ctx.setAttribute(variable, scriptlet);
return "${" + variable + "}";
}

然而因为父类导致抽象层次的增加,很多时候这种做法并不一定导致最好的解决方案,反而让代码变得难懂。有时候引入一个恰当的记法和工具类,可以使得代码变得异常的清晰。

public String generate(Context ctx) {

Object[] parts = FormatHelper.parse(m_ref, "$'{'{0}.{1}.{2}'}'");

String clazz = ctx.getClass((String) parts[0]);
String variable = FormatHelper.format("_url_{0}_{1}_{2}", parts);
String scriptlet = FormatHelper.format( "{0}.url({3}.{1}.{2})", parts[0], parts[1], parts[2], clazz);

ctx.setAttribute(variable, scriptlet);
return "${" + variable + "}";
}

这样是不是清晰了很多呢?更多的好处还在于工具类没有破坏业务类的完整,对业务逻辑的控制权始终掌握在业务类里面,提高了代码的内聚性。

这位老手的话不多,但他评审代码的意见都很到位,让我心悦诚服。

更多想说的是,热爱编程的程序员应该要精益求精,追求代码的完美。只有多磨练,才能出真功夫。

业务类、工具类和内聚

工作里的小小心得—能设计出相对复杂的系统,却不一定能写得好一段简单的代码。

在写代码的过程中,经常会遇到业务类里面大量的代码重复,一个可以设想的解决办法是把重复的代码提升到父类里面。然而因为父类导致抽象层次的增加,很多时候这种做法并不一定导致最好的解决方案,反而让代码变得难懂。

有时候一个恰当的工具类,可以使得代码变得异常的清晰。但在写工具类时一定要注意:工具类不能生硬插入业务的逻辑,这会破坏业务类的完整;对业务逻辑的控制权一定要掌握在业务类里面。

这些都是看似简单的原则,可在平时写代码的时候,因为时间、进度,我们往往忽略了代码的美感。写代码的感觉还是要多磨练呀。

Ruby上的管理工具:Capistrano與God

公司網站的后端應用比較多,于是后台程序的部署和后台進程的監控便成為當務之急。搜索了一些解決方案后,最終鎖定到Ruby平台上的Capistrano與God兩個工具。

Capistrano( http://capify.org/ )是Jamis Buck的力作。總的來說,Capistrano就是一個建立在ssh之上的、多服務器環境下的部署工具。它與SVN也有良好的集成;通過ssh,它可以自由的執行任何一台服務器上的命令。

God( http://god.rubyforge.org/ )則是一個后台進程監控的工具。它可以用來啟動指定的進程,監控其后的狀態,并可以依據CPU/Memory等條件重啟進程。它的命令行界面很干淨,讓人喜愛。

現在只是剛剛把這兩個工具結合在一起使用,至于God是否穩定還有待考察。

最后想說的是,Ruby語言之上并不只有Ruby on Rails這樣的開發平台,也有許多系統管理工具可供大家選擇。