近来正在完成的项目需要不断的修改代码的架构,使得能够具备一些特殊的要求。修改代码之余,发觉自己设计的代码架构居然那么难看,一点灵活性都没有,现在采用的几乎是打补丁的权宜之计。为了改变这种状况,以及避免将来可能再设计其他系统架构时的遇到的潜在问题,我找到了一本相见恨晚的书:《Java与模式》。
限于条件,我每次阅读60页左右,在刚看完的60页里,我几乎每看一页都会有些启发,简直有点天马行空的感觉。
说说看了前60页的感受吧。
为了方便记述以及将来的温习,我采用摘录加感受的方式。
-----------------------------------------------------------------------------
摘录:模式化的过程是把问题抽象化,在忽略掉不重要的细节后,发现问题的一般性本质,并找到普遍使用的解决问题方案的过程。
感受:这个和数学建模太像了,也和做研究的基本思路以及终极目标一致。看到这句时,我开始觉得这本书肯定会让我“天马行空”了 :)
-----------------------------------------------------------------------------
摘录:人们在自己的环境中不断发现问题和寻找问题的解决方案的时候,发现有一些问题及其解决方案不断变换面孔重复出现,但在这些不同的面孔后面有着共同的本质,这些共同的本质就是模式。
感受:编程如此,NLP亦如此,我研究的共指消解更是如此。那什么才是共指消解的模式呢?人工总结还是机器学习,抑或二者结合呢?Example Based Method是条出路,可以看成是将每个样本都当成模式的模式方法。SVM寻找支撑向量,可以看成将一些最具表达和区分能力的样本当成了模式,应该也存在缺陷,就是抽象能力还不够。K-Nearest的方法可以看成是前面两种的结合,主要思想是在最相近的一堆样本中取平均值,可以算作是一种改进,但是距离理想状态还差几个数量级。贝叶斯、最大熵和决策树等生成模型的机器学习算法,都是在建立一个能够描述和解决问题的模型。贝叶斯和最大熵是一伙儿的,都是在计算一组权值;决策树是在考虑属性的层进式判断,有点儿模式的味道。但是生成模型的问题就是对共指中相关实体的上下文环境描述能力较为缺乏。基于逻辑的Inductive Logic Programming以及Markov Logic Network同时具备了生成和判别的能力,是一条值得深入尝试的道路,但是还需要进行深入的融合,目前这两种方法在实现的解决方案上还需要深入的学习。在二元分类模型框架下,感觉采用结合多种算法自动学习模式以及深入结合局部上下文以及篇章信息的方法才是王道。但是共指属于聚类型问题,目前都是在玩图分割以及整数规划,还需要在深入考虑属性的问题,从这点看HyperGraph是王道。那么对于共指,我猜想最终的解决方案应该是多种二元分类学习方法+基于Logic的推理能力+完善的上下文、篇章信息描述及背景知识+HyperGraph的融合。呵呵,有点大一统的味道,值得深入构思啊 :)
-----------------------------------------------------------------------------
摘录:模式的研究起源于建筑工程设计大师Christopher Alexander的关于城市规划和建筑设计的著作。尽管他的著作是针对城市规划和建筑设计的,但是作者的观点实际适用于所有的工程设计领域,包括软件开发领域。
感受:如此好的书籍,应该加入待读列表。这书是否适用于做NLP的研究呢?
-----------------------------------------------------------------------------
摘录:Alexander描述了一些他认为是永恒的、适合于任何工程学科的设计原则。这些原则是建立在下面的三个基本概念上的:质、门、道。
论无名的质(QWAN)
在Alexander的论述中,质或无名的质处在核心地位上。他认为,所有的生物、有用之物均包含如下的“质”:自由性、整体性、完备性、舒适性、和谐性、可居住性、持久性、开放性、弹性、可变性,以及可塑性。QWAN使人感到充满活力,给人以满足感,并最终改善人类的生活。
论门
门是指通向质的管道。门是通过一个普遍的模式语言来体现的,这个模式语言使设计师能够创建多种形式的设计,以满足多方面的需求。门市普遍存在的,是这些模式之间的关系或是模式的以太,充满着一个特定的域。
论道
道又称作永恒的道。利用道,从门演化到质的过程,就是把一些特定的模式按照一定的顺序应用到系统设计上的循序渐进的过程。Alexander把从门道质的过程比喻为胚胎发育过程。胚胎发育过程的特殊之处就是整体先于部分而存在,整体通过分裂来产生部分。通过追寻道,可以通过门达到质。Alexander认为这个过程是任何一种工程设计的发展过程。
感受:这段摘录比较长,读了好几遍感觉还是领悟不完全。需要常悟啊!
-----------------------------------------------------------------------------
摘录:阅读过Alexander的《建筑的永恒之道》一书的人们无不为次数的哲理性所打动。人们将这本书比喻为一本使用建筑学的例子讲解哲学的血,或者是一本以哲学的风格讲解建筑学的书。Alexander本人一再强调,模式理论是一个完整的、不可分割的整体,不能够他的理论概率为一套方法论,而不理会他的哲学观点。
感受:看来此书是必读之物了 :)
-----------------------------------------------------------------------------
摘录:《建筑的永恒之道》以及《建筑模式语言》两本书是关于解决任何领域中的问题的设计模式的书。这两本书就像Java或者C++的书一样,只是没有讨厌的代码语法。读者这两本书,就好象读着一本为技术人员写的易经或者是儒家-道家的著作一样。
感受:又想到了我编程方面的偶像cr了,当年他推荐我学习模式,我却一直没能领悟学习这个的重要性。看来只能亡羊补牢了 :)
-----------------------------------------------------------------------------
摘录:如何同时提高一个软件系统的可维护性和可复用性是面向对象的设计要解决的核心问题。
感受:总结核心问题看来非常重要,那么什么是我的研究领域以及目前需要解决的核心问题呢?值得深思。
-----------------------------------------------------------------------------
摘录:西方发达国家的一个软件项目在其生命周期内,花在维护上面的钱,是花在原始开发上面的钱的两倍。
感受:这个让我想起科研的生命周期,或者叫顶级论文的生命周期。Dr. Zhang向我介绍他的Paper经验时,提到Paper的核心是Idea,但是有了idea以及实验结果只能算是完成了一半,Paper的撰写应该占到一半的比例。我想如果加上研究过程中的各种相关系统的复用、拓展以及论文Idea和撰写的复用拓展,就能形成良性的科研生命周期。
-----------------------------------------------------------------------------
摘录:系统的美,首先存在于设计者们的头脑之中,然后存在于设计图纸之上,然后变成一个原型系统,最后变成一个真实的、有血有肉、可以交付客户使用的成品。
感受:研究之美,首先存在于想到精美的Idea那一刻,然后存在于详细的实验设计以及确实是对问题本质进行解释的提高,然后变成一个论文的初稿,最后变成一个完整的、让人相见恨晚的高质量的论文并和同行交流得到反馈。从而形成良性循环。
-----------------------------------------------------------------------------
摘录:一个好的系统设计应该具有如下性质:可扩展性、灵活性、可插入性。这三个性质就是一个系统设计应该达到的目标。
可插入性
可以很容易的将一个类抽出去,同时将另一个有同样接口的类加入进来,这就是可插入性。
感受:从我参与设计过的LTP的架构,以及接触过的Gate、NLTK、OpenNLP的架构,再到目前正在学习的UIMA的架构,我感觉可插入性方面NLTK、OpenNLP、GATE是代码级的,LTP和UIMA是模块级(不涉及代码)的。可插入性在NLP系统里面相当的重要。能否将这种性能增强到像计算机硬件那样可以随意插拔,而且在达到基本的系统需求后通过任意插拔代码级或非代码级(例如windows下的dll、linux下的so,以及可以跨平台的jar)的模块来增强。这个话题有点深远,留待思考和拓展。
-----------------------------------------------------------------------------
摘录:传统的复用主要有,
代码的剪贴复用,这是最低级的复用,而且会导致后期及其麻烦的处理。
算法的复用:较为高级,也是目前计算机研究领域较为高级的研究话题。
数据结构的复用:与算法相对,并且成为一体。
感受:感觉目前我编程序经常采用第一种复用。
-----------------------------------------------------------------------------
摘录:面向对象设计的复用。在一个像Java这样的面向对象语言中,数据的抽象化、继承、封装和多态是几项最重要的语言特性,这些特性使得一个系统可以在更高的层次上提供可复用性。数据的抽象化和继承关系使得概念和定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和促进系统的可维护性。这样一来,复用的焦点不再集中在函数和算法等实现细节上,而是集中在最重要的含有宏观商业逻辑的抽象层次上。换言之,复用的焦点发生了倒转。
感受:面向对象就是好,看来这本书值得深入阅读。
-----------------------------------------------------------------------------
摘录:客户端依赖于一个抽象的接口,而不是一个具体实现类,使得这个具体类可以被另一个具体类所取代,而不影响到客户端。
感受:学习Java时不太明白接口有什么用,现在想来作用和我们学习的计算机硬件接口一种作用。
-----------------------------------------------------------------------------
摘录:《老子》云:善为士者不武。
感受:说的是好的设计师不会在他设计的系统投入使用后再进行大规模的修改。让我想到《孙子兵法》里的上上兵法:不战而屈人之兵。
-----------------------------------------------------------------------------
摘录:经典力学的基石是牛顿三大定律。面向对象的可复用设计的第一块基石,便是所谓的“开-闭”原则。讲的是:一个软件实体应当对扩展开放,对修改关闭。根本说来就是找到一个系统的可变因素,将之封装起来,实现抽象化。
感受:回想当时设计的LTP架构,这个方面做得很不好啊。
-----------------------------------------------------------------------------
摘录:西汉杨雄的《太玄》一书说:“知固而不知革,物则失则;知革而不知固,物失其均。”一个系统对修改关闭,就是固;而系统对扩展开放,就是革。一个系统不可拓展,就会“物则失则”,或者说系统失去使用的价值;而一个系统动则需要修改,便会“物失其均”,也就是失去其重心。
感受:回想我个人经历过的研究和开发,顿觉我是“物则失则”。以后需要改正啊。
-----------------------------------------------------------------------------
读罢前60页,顿觉相见恨晚,值得继续学习。特此鸣谢kimi近日每晚听过看此书时瞎扯 :)
没有评论:
发表评论