All Stories

有必要系统地学习一下编译原理

  因为我是一个半路出家的coder,除了会写几行C/C++代码外,所有其他计算机科班出身的人会做的事我都不会,这也是我的一大劣势。  其实前段时间就想过,要学一下lex和yacc的用法。有这个想法,主要还在于看到不少开源项目,比如doxygen、source highlight、swig等等,全都用到了相关的东西,而正是因为我对这方面一无所知,所以即使能获取到它们的源代码,我也不知道如何自己编译。  这两天在公司里,遇到一个问题。编辑器里需要auto completion,为了尽可能实现地进行联想,于是以project方式组织时,需要扫描单独文件的上级文件内容,把符合要求的几种模式都识别出来,其实也只有5种。于是我就用了一个比较简单,可以说是笨的方法,用正则表达式去全文匹配一下,5种模式就匹配了5次,当文件内容少的时候,问题不明显,可说是没有问题。当文件有几万行时,就不行了,CPU占用率一下就99%以上了,而且匹配一次就会持续十来秒,5次就可能要1分钟去了。而且这个动作是在打开文件的时候进行,所以如果连续打开多个文件,机器就假死了。这个问题一直在存在,存在大半年了,只不过没人提出来,我也没意识到其严重性。这次跟同事讨论起来,我才觉得不改不行了,但我又想不出好的办法,缺少必要的理论支持,绞尽脑汁也是无济于事的。我的直觉告诉我,用编译原理方面的知识可以解决这个问题,所以学习编译原理也将提上议程。  编译原理一直以来是我最怕学的东西之一,记得很久以前,高中时的某个假期吧,但毫无进展,不了了之。后来大学时考高程,其中有一部分就是编译原理的内容,全靠考前死记硬背,考时胡乱蒙猜。可能其他还欠缺些理论知识的支撑,也是一部分原因吧。  因为想做好编辑器,所以对代码编辑的支持是必不可少的,因此从现在开始,订个计划,学编译原理,lex、yacc使用。

书送到了

  今天上午连续接了两个奇怪的电话。已经有几次了,打到什么布吉五金商行的,结果打到我们这个座机上来了,不过有趣的是,这次这个家伙没有直接挂掉,而是跟我扯起来,说什么交个朋友,有没有兴趣出来干,呵呵,感觉像是个人贩子似的。好不容易挂掉电话,马上就有另外一个人打进来,听背景声音跟前面一个是同一处,但听口音,明显是两个不同的人。这次这个也比较有趣,问我们公司现在招不招人,有什么岗位,待遇如何等等,还说是不是研发的都是高学历的,水平很高的,呵呵。又是好不容易挂上电话,手机又响了,这次是当当网送货的了。蹭蹭跑出去,发现居然是在岗亭门口的一个小角落里,而且看货有好几箱,而送货的只是一辆小自行车,真不知道他怎么把这么多书载过来的,混口饭吃也不容易啊。  打开看了看,建筑类的几本书的纸张质量还真是不敢恭维。《Head First Design Pattern》外面有一张塑料纸包着,好厚一本,拿回家翻了翻,有点后悔,价格定那么高,里面的篇幅实在没多少,很多的插图,很多的空白,浪费啊,看来我还是习惯那种适合苦读的典型的中国教科书啊。《建筑模式语言》有上下两册,精装的外壳,很厚很厚,但里面的纸张远不如《Head First DP》,《建筑的永恒之道》不是很厚,而且不是很大开本,不过奇怪的是,想不到建筑类的书居然也定价那么高。

继续学习设计模式

  还是没干什么事,看了一阵书,话说昨天把《设计模式解析》第二版还掉了,其实旁边的同事又马上借回来了,于是乎我就拿来看看,看得囫囵吞枣的,不过也比直接看GoF的要省力得多。其实一直以来我都很少会认真仔细地从头到尾看完一本技术类书籍,很多书甚至是只看了前言、序,或者目录就直接丢到一边了。虽是这样,就算没完整看完一本书,像那种武侠小说中描述的那样,像我这样的小虾,向大师学习时,能领悟到个一招半式也是受用无穷的了。  到今天为止,大致了解了Adapter、Facade、Bridge、Strategy、Abstract Factory这几种模式。简单地说来,Adapter是为了转换接口,Facade则是为了封装并简化接口,Bridge说是把抽象和实现解耦,在我看来,实际是把几种不同类的概念分类,避免组合爆炸,Strategy是为了封装算法,Abstract Factory则是封装一系列相关的类的实例化过程。在阅读《设计模式解析》的过程中,我还发现一个比较明显的现象,有些模式,或者说有些解决问题的方案,其实都是通过将问题细化,将较细粒度的变化进行封装来实现的。比如书中讲述Strategy模式时,一开始例举的是直接继承,在论述了该例的缺点后,才抛出新的方法,其实就是把更小更精确粒度的变化提取出来并进行封装。在讲述Bridge模式时,也有类似的倾向和做法。再回想《重构》一书中,作者Martin Fowler则是更激进的做法,如果要给一段代码添加注释,则把这段代码提取出来,用有意义的函数名来阐述代码的作用。这从另一角度促使了小粒度代码段的生成。  《设计模式解析》一书的写作风格也是让人比较舒服的。作者会花一些章节进行理论或实际例子的讲述,再用一些章节描述模式,再讲述一些通用的理论,如此穿插的作法,反正我书看得少,正是第一次看到,感觉比较容易让人接受并领悟。

静不下心来

  我就是缺乏定力,就是忍不住去做些无聊的打发时间的事情,就是不愿意去做些有实际意义的事情。早上起来就觉得很烦躁,也不知道是哪里出问题了,仔细想想好像也没有什么重要的事情,但总是静不下心来。  白天在公司里糊里糊涂地过了一天,看了一点书,《设计模式解析》,书写得还是比较合我的口味的,不过下午的时候去图书馆,把这书还了,因为快到期了,以前没怎么看,后来觉得有用的时候,却是借期快满了。虽然只看了前半本,但也觉得略有斩获。前半本有不少内容是通用性的概念,有些概念我一看就觉得就是这么回事,不过自己却肯定总结不出这么精辟的来。

XUL,也不错的一种选择

  今天在公司网上看到一人发了个Komodo IDE,装来看了看,猛然发现它是基于Mozilla XUL技术实现的,有点诧异,居然还真有用XUL技术开发的商业软件。然后就跟公司里的另外一个人讨论了一下,那人比较了解XUL,在去年还做过技术选型工作。  从中我了解到,有一种叫Remote XUL的技术,可以使得通过Firefox浏览某个页面,界面效果跟通用的桌面软件差不多,但实际上却真真实实是部署在远程服务器上的。其他能达到类似的效果的有JAVA Applet,或者MS的ActiveX,好像Adobe现在在搞的AIR也差不多,有种让人惊艳的感觉。看来该是有必要学一点这方面的新技术了,一直以来觉得跟Web相关的,都不是很感冒,但现在看来,它混淆了B/S和C/S,即桌面和浏览器的概念,很有意思啊,比如,假设有一种能适应各种浏览器的这类技术,那么做一个Web版的IDE什么的也不是问题了。  除了这种远程部署的界面技术,还有其灵活的可扩展框架也是让我感兴趣的。那人的胶片中对Eclipse RCP和Mozilla XUL进行了简单的比较,结论是更看好XUL的,不过我个人的观点看来,两者单纯从可扩展性上讲,各有优缺点,不相上下吧。XUL体系使用C/C++实现具体的界面控件,然后用XML描述界面布局和事件响应,用JavaScript完成实际的业务逻辑,响应XML中定义的事件,调用C++代码作出具体的动作。XUL要创建出新的界面控件比较困难,只能用已有的控件组合成新控件,所以像Firefox就实际上提供了扩展和插件两种不同的机制,扩展就完成只使用XML和JavaScript实现,而插件就可以实现比较高级的像内嵌Flash播放器之类的功能。总之,简单看来,相比Eclipse的实现方案,XUL并没有哪里特别不如,或哪点特别突出,只能说也是一种不错的机制。倒是让我多了解了一种扩展方式,自己设计可扩展的软件架构时,倒是要好好考虑一下了。

再次开始学习设计模式

  虽说好久好久以前就认识到设计模式的重要性,也好几次都决心要认真系统地学习一下,但是每次都没能坚持下来,每次看到GoF的书,立马一个头变成两个大,实在是枯燥乏味啊。倒是总能看到那么多人,学这么枯燥的东西津津有味的样子,然后头头是道是品头论足,心中不免有一丝的羡慕,什么时候自己也能那么熟悉并熟练地应用这些设计模式该有多好啊!  当兴趣渐渐从纯粹的编程语言技巧转移到架构设计、软件工程方面上来时,就有意无意地拿起《重构》、《敏捷软件开发》、《重构与模式》等书看。这些书有一个比较有趣的特点,就是互相引用,于是,我发现不懂设计模式已成为我前进道路上最大的障碍。我要进步,就必须要清除所有的阻碍,所以我要再次开始学习设计模式。  仔细考虑一下,为什么之前我每次都会放弃,是因为GoF那书太枯燥抽象了。所以要去找几本通俗易懂的书来先补充一下这方面的不足。《设计模式解析》第二版似乎还算入门级的,从公司图书馆中借到一本,抽空要快速看一遍。看网上的评论,《Head First Design Pattern》更加适合初学和进阶,所以要看看。另外,看到这些书中都提到了Christopher Alexander写的书, 有中文版《建筑的永恒之道》和《建筑模式语言》,这是关于建筑学的书,但是软件架构设计就跟建筑学有类似的地方,而且设计模式的起源据说就是从Alexander的研究中开始的,就当开阔眼界也好,也买来看看。  我并不是想做一个软件架构师,我只是想能轻松地写出结构优美,弹性十足,易于维护的程序来。

居然还有人想试用这东西

  今天有个项目部的主管来找我,问我那流程平台工程做得怎么样了,他们部门目前新员工多,觉得这个工具或许可以解决当前的问题。我比较诧异啊,居然还有人想试用这东西,说实话现在这边的状况是,尽量快点甩手,从此解脱。我早就不胜其烦,厌倦了没完没了在上面投入。那位主管说得很有理,说这东西做好了很有价值。这个我当然也知道,如果做好了,当然有价值,关键是上头的决心有多大,愿意投入的成本有多少。一直就是我一个人在折腾,一个人折腾么,给我足够的权力和资源也好,偏偏也没有,要指手划脚地作些不合适的决定。  今天我突然想到,要是早知道会拖到5月底这么久,早期的设计就可以做得好一点,2个月有2个月的做法,3个季度有3个季度的做法,唉,这应该可以算是一个失败的案例了。  回顾检讨一下失败的原因:1、前期的规划没做好,开始以为时间不足,就迫使强制采取了些不良设计;2、用户需求一直不明确,以及用户需求实现比较困难;3、我做为唯一的开发人员,心理上有所抵制,积极性不高;4、开发编码工作没有计划和任务跟踪;5、缺少测试支持等额外资源的投入;6、现在看来,因为其他因素的影响,似乎开发投入人力也不够。  暂时只想到这几点,不过也很难过了,唉!

第一次摸车

  晚上去练车了,这是我第一次摸车,比较不习惯,总是记得一头忘记另一头。比如想着踩离合器和刹车的时候,就会忘了摆方向盘,或者又不记得挂档了。  据说天黑是不能练车的,因为看不到桩。确实,如果没有灯的话,我连边线都看不清,有双夜视的眼睛该多好呀!  一般说来,习惯成自然,只是平时没有碰车的机会。要流畅熟练地手脚并用,还需要多多练习。  因为是第一次,所以只是教了下怎么挂档,怎么用离合器控制速度,怎么摆方向盘,怎么前进倒退。除了我,还有另外一个人一起,两个人轮换着控车,大概总共搞了1个小时多一点点吧,不过瘾啊,要攒钱自己买台车才行,呵呵!

在家烫火锅

  嗯,这个活动在上个月的时候就筹划过了,不过我并没怎么投入,呵呵,都是bobo在那里捣鼓说五一3天假期里可以抽一天出来,然而,bobo组织不力,3号那天上午我迷迷糊糊发了个短信给bobo,最后结果是cancel掉了。  这次好像是猫猫牵头联系了其他人的,在公司里是一点风声都没有,只是有一天晚上在QQ群里猫猫跟我提了一下,要到我家里来烫火锅,其他时候则是只字不提,联系都没有。  直到今天上午10点多了,我发了个短信喊猫猫起床,她才给我打电话,说11点在我们小区对面的超市门口见,叫了某某和某某。等我11点10分跑去,也才看到舒蕊一个人在那里等着,这个猫猫越来越不像话了,都没有时间观念啦。又过了一会儿,才见大部队浩浩荡荡从天桥那边走过来,猫猫、江江、bobo、大牛和他媳妇。一共7个人,到超市里买菜,这种感觉还不错。买了盒装的肥牛和羊肉,贡丸、虾丸,还有很多素菜。又买了些碗筷,本来家里是有一些的,不过这次人多了,不够用,所以要再添点。  买了回家,我就没怎么动手了,只是找出椅子等必需用品,收拾一下东西。这次买得多了一点,后来刘献文也来了,9个人把肉类都吃掉了,素菜却剩下不少。总的说来,我对火锅的味道要求很低,我几乎感觉不出什么好差来,呵呵,所以这次也吃得比较满足,关键是一群同事一起玩,有一份惬意。  可惜,相机没电了,不然也可以留下点什么留念,一大遗憾啊~