★ Surely You’re Joking, Mr. Feynman!

July 22, 2010

结婚了

Filed under: 思考

一年之前,她让我帮她办一张学生证(在北京,你知学生证为什么有用),这是一个有趣的缘起;一年之后,升级成了结婚证,这次可是货真价实。陈懿经历爱情美丽的一年,奇迹年。

大早,约好,到王府井的中国照相馆,希望这家名气老大的照相老店能带来喜气。下地铁,经过东方新天地,这是我们第一次约会的地方,迅速找到这家还蛮显眼的门店。在二楼,照结婚证件照的师傅已是非常娴熟,指导着我:新娘子都笑了,你还不笑。我一下子就乐了,露出了牙齿(我实在没有意识到我没有笑)。师傅抓住了这个时刻,迅速的咔嚓咔嚓四张。自我感觉,效果蛮不错,选了一张灿烂的,打印出来,介个可是要贴在结婚证书上的。立等可取,强烈推荐。

接着,目标是崇文区婚姻登记处,我们再坐地铁回头。婚姻登记处就在天坛南门附近的玉蜓桥公园里,离现在租住的家里十分的近。我送她回家的时候竟然常常路过这个福地。

顺顺利利的登记,交上早已听说的九块钱,和满意的合照。其实还是有一点紧张的,我竟然差点把日期写错:7月22日,成双成对的日子,是佳文提议的。一切结束,把带上的结婚对戒拿出,互相戴上。真的觉得有不一样了,这是一个沉甸甸的约定。

没有任何的犹豫,我觉得眼前人便是要珍惜,共度之人。 感谢老天,给我这个机缘。婚姻,是要慢慢的去体验。

结婚照 2010-07-22
 

June 18, 2010

方文山和周爱民

Filed under: 思考

方文山和周爱民竟然留下了一个相似的投影。一位词人,一位技术作家

他们都有一颗脑袋,告诉你,聪明,深刻是这副面向的唯一出路。确实他们的文字透露出才气,更确切的说是凝结的思考。

June 11, 2010

翻过和要翻的书

Filed under: 思考

说“翻”不用“看”,让我觉得表述的更自由。因为有的书,其实是大部分只翻过几页,有的书翻过的那几页,可能思考一下,再琢磨琢磨。

随意的看看书的目录,然后挑感兴趣的一章,然后从感兴趣的词句开始看,也不知在哪一句结束这次的阅读。书也是这样,从书架上捡起一本,看看对不对胃口,然后再开始看。

流水账记录书的感受

周爱民的书:javascript精髓和编程实践。

周爱民的博客文字不一定都能认同,但是却给人很犀利的感觉,常能让人频频点头,这本书也是如此。书名javascript,js只是一个载体。看了第一章的历史扯淡,第四章函数式语言,很好的对函数式编程特点的描述。

周有另一本大道至简,秉承了高而又高的风格。列入待看的书。

Structure and Interpretation of computer program. 名著,几次听课,没有入门,还是看书更详细。以scheme作为语言描述。说到底看了第一章看到一半,不知道整本书的主旨是什么,但是很有收获,一些段落的思考很本质。

代码大全,真的很大全,每一个小主题都是很适合程序员反思,可以零星的看。很偶然,我本来看到这种大部头都怕,但是捡起书架上的一本样书,一下就被里面写的抓住了,很实践的书。

程序员修炼之道,unix编程艺术,不说了列为编程哲学类。

Joel论软件,看了网上免费贴出来的段落。阮一峰翻译的非常好。

spring揭秘 国人写的spring剖析,很用心,收获很多。本来想自己看看spring,这本书可以帮助梳理一下。

量子物理史话,介绍那段激动人心时代的科普书我看了很多,更久没有捡起来看,到书店翻了翻,写的还真不一样,作者融入了自己的看法,写的更深刻。不是中规中矩,到处摘抄的那种书。一看作者简介,居香港,其他信息没有透露。果然是特别的人写特别的书。

重新看同一本书,有时比看第一遍还要兴奋,这主要是来自于思考所得

June 9, 2010

逛西单图书大厦

Filed under: 思考

昨晚郁闷,决定留下来把文档写完。有么有用,不知道,甚至不一定能交差,但是至少说我写了点东西去交差。聊以安慰

在外头随便吃了碗面,不想早早就回公司,遂遛到了西单图书大厦。很少在书店里逛了,因为觉得书店里烂书太多,太贵,也买不起。但是我忽视了,书店里随手拿起一本书,有意外收获的体验。这一点是在网上搜书,订书所没有的体验。捧起一本书,细细阅读也是对着屏幕得不到的感觉。今晚便有意外收获。

书架上有几本程序员修炼之道之类,已经知道,并且在阅读的好书。代码大全,鼎鼎大名,看了一下厚度,大概得有八九百页。按照习惯,我捧起来随便翻了几页。写得很不错,是那种可以随便挑几页翻一翻,都有收获的书。我把它记到手机里,回去找电子书。

热销书的展台,我一般不去,但是鬼使神差的拿起了一本excel图表之道,因为前面做了一些图表,发现这本书写的很实际,很不错,虽然我不用excel画图表(以后不知道会不会),但是图表如何设计的专业是共通的。顺带把书作者的博客浏览了一下,很有启发。

寻找一本有用,适合的好书的是困难的。因为好书不多,适合某人的好书再少之,适合在某个时刻阅读的好书再少之。有些书是需要反复的阅读,和经验去印证,去再实践,失败,思考。看起来是太麻烦了,但是这样的经验尤其宝贵。

June 6, 2010

关于程序员修炼之道中文版

Filed under: 思考

在看程序员修炼之道,这是一本好书,诚如设计模式说的一样,这本书需要反复的读,反复的思考,常看常新。不是一本为rookie写的书,因为很可能不能理解里面的经验从何而来,因为依我看,经验从挫折而来。

谈一下中文版,我看的是中文版,而且没有舍得去买一本纸板的书。应该是翻译挺长时间了。译者的前言看得出投入了感情,有感情那么就更有可能认真一点。翻译这件事情,很大部分是靠认真,肯不肯多花时间。从用词来看也花了心思,但是也还是留有不少英文的味道,有些生硬。比较不足的是某些词的翻译值得商榷。p205接口就是系统。我一看以为是开发人员设计好了接口,系统差不多就成型了。再一看内容不是,是说用户界面了。应该是把interface所在的上下文搞错了。如果interface在讲开发时,译文为接口,但是讲用户时,就应该是界面。这里讲的是对用户来讲,用户界面就意味着一个系统的全部。所以要设计好用户界面,要不然系统内部再好也没有用。

June 3, 2010

关于API的设计以及代码生成的思考

Filed under: 思考

接触了不少图表工具,关于API的变化有一点启示

首先图表是图形,图形的要素非常多,所以图表的要素也不会少。典型的例子GUI的工作量和API数量都很多,windows的图形界面比字符界面需要考虑的东西也多得多。

图表的要素的多反映在用代码生成图形,必然需要指定很多元素,很麻烦。是的,重要的是怎么麻烦法。图形是用程序画出来的,构成程序的有方法,和输入的参数,输出则是图表。我的一个假设就是参数空间和方法空间总量是保持不变的,无论是采用什么设计方案。函数中多增加一个参数,那么就可以减少一族函数。

可以用draw(chartType, parameters)来代替一族方法drawPieChart(), drowBarChart(), drawAreaChart()…,同样可以增加其他参数,来减少方法空间中方法的数量。最极端的,如果参数足够的多,那么可以将画图方法中的方法空间减少到只有一个。但是api减少的代价是参数变得复杂了。所以这里就像一个矩形的两维,参数数量和api数量各为两条边,矩形的面积是大致不变的。

那么为什么需要变来变去呢?在现实中,jfreechart就是采用api空间较大,参数列表较小的选择(其实也不小,没有办法,画图就是有很多参数),但是可以采用适当包装参数,并且结构化方法参数的方法减低复杂度。而新的图表工具,比如flex,flash图表,都采用的是一个巨型方法, 接收一个复杂的参数,这个参数就是一个结构化的xml文件,或者json格式的数据。原来的参数往往只包括数据部分,但是现在的参数包括了图形的格式信息,等非数据的结构化信息,包括图表类型等等。

巨型方法的坏处在哪里?坏处在参数会多,对于一般的方法来讲,参数最好不超过2个,极少情况下可以有三个,参见clean code。如果参数多了怎么办?可以用对象将参数结构化包装起来。我在刚刚接触图表的时候,没有包装,传入的都是各种基本类型。所以参数列表甚至到了7,8个,可读性非常差。但是这是可以解决的,如果使用对象,或者更广泛的xml文件(序列化了,便于网络传输)来组织这种非常大量的,数据非常复杂的数据,可读性可以变好。但是这只解决参数列表的问题,对于巨型方法本身的维护性成了一个问题。巨型方法对client段是好用的,因为只需要调用一个单一的接口,然后组织好参数列表就可以了,刚才解释了,xml等可以很好的组织参数列表。巨型方法对于编写库的人员来说也不是不能克服的,因为他可以在内部将巨型方法,分解为一个个小方法。每个方法只有两三个方法,库的可读性也没有遭到损失。却只暴露给客户端一个单一的接口非常友好。

其实就可以利用jfreechart里现有的方法,组织出一个巨型方法。暴露给客户端调用生成图形。接口的参数包含了很多结构信息,而不只是单纯的数据信息。实际上,我相信我原先可以这么设计我的图表接口,给jfreechart包装一下。或者现在的图表api也是这么来组织他们的单一的巨型方法,而不是就真的只写一个方法。这样也不违反我们的clean code对方法参数的要求。

为什么麻这个烦呢?因为人对数据结构的认识更容易,相对于代码流程,不仅是记忆还是学习还是设计。所以更多的把复杂度留在数据结构这一维是好的。而图表api的转变就体现了这个原则。这个原则有一个抽象的描述在unix编程艺术这本书里面。

如果你要用jfreechart的api,画一个图表,定制是有非常多的api,涉及到很多策略模式的对象,每个对象里的setxxx的api非常多。总是画图是不容易的,要记住也不容易。但是把这些小的方法,封装到一个通用方法中,然后定义好通用方法接收的参数结构。那么这种xml文件或者对象是非常容易记忆和使用的。而且通用方法是由小方法组成的,也没有伤害到可维护性。数据结构的复杂性比api的复杂性对人类更友好的多。 从图表api中得到了印证。

下一个谈一下最近接触的快速开发工具

接触的两个快速开发工具,一个是大名鼎鼎的ror,一个是在java世界模仿ror的spring roo,java世界对ror的模仿还有play framework和grails。我用了spring roo,印象深刻,因为他大量应用了spring的东西,所以比较倾向。

ror的快速在于,第一它是脚本语言,这一点敏捷上有天生的优势,但是java也是可以模仿的,有在运行时植入的方法aspectj和反射等技术,也是可以得到媲美脚本语言的灵活性,典型的是在框架上可以拥有极端的灵活性。

第二是约定优于配置的理念,这个可以及大量的减少配置。其实第一减少难度,第二减少错误,第三减低曲线,第四很优美。

这些都不是要谈的,要谈的的是自动化的理念对这种框架产生的快速理念。这种自动化是由脚本或者各种工具实现的。

rails和roo生成框架的时候都不是自己敲进去的,而是运行某些命令脚本,这些脚本生成的程序框架和配置。这些脚本就是自动化的程序生成器,程序生成器的利弊后面会说。搭框架实际上是非常烦的事情,而且还有各种问题。而这些快速开发框架,将最佳实践融入到自动生成的代码里面。这些框架的结构本身都反映出开发者的理念。roo是拿来主义是用java世界里比较出色的各种开源项目来个大整合。粘合剂就是maven,maven充当了构建工具,依赖管理工具,包下载管理工具。这些自动化都由maven出色的完成了。相当于ruby里的rake和gem。roo里面还提供了类似bash的命令行工具用来运行脚本。

如果生成一个model,也是和rails一样用一个命令。因为这样可以做很多附加的工作。然后可以把精力集中在业务的开发上。

maven和ant等工具在我看来其实做了java做起来很麻烦的脚本工作。例如copy,构建,部署等等。一个程序不是万能的,例如c程序就需要一些脚本程序粘合在一起。在我看来是因为写程序,其实有两种性质不同的任务。往往构建等任务因为没有被自动化,依靠人工的所以被忽略了。程序员往往更加忽视了自己工作中可以自动化的部分,而没有编程实现这些任务。在自动构建,持续集成等概念被引进来以后,这些任务的自动化就被重视起来了。而这些任务往往是用java实现比较麻烦的。诚然maven和ant本身也是java程序,但是一般是用脚本的概念来编程的,我们是编写的xml形式的脚本程序。

由于习惯了每天在IDE上,点来点去按钮,没有意识到其实自己做的这些其实都是可以编程实现的。

May 27, 2010

再一次部署

Filed under: 思考

经过安全公司第一轮安全审计,应用程序方面的漏洞主要集中在:SQL注入和XSS攻击。

SQL注入可以由PreparedStatement比较好的解决,各种ORM或者轻量级的工具(SpringJdbcTemplate)都提供了相应的接口。代码规范必须要求使用参数绑定来执行SQL

XSS攻击真是防不胜防,攻击方式多种多样,并不是一个可以简单解决的问题。首先对简单的字段可以采用encodeUrlForHtml,可以对有害的字符例如

这只是安全加固里的一小部分,安全是一个整体方案,而不是现在这样,应急的修修补补。 前台的校验只是为了方便用户,而与安全无关,安全性只能由后台来保证。而且与用get还是post方式无关。上述只是对输出做了安全的加固。对输入的参数也需要后台验证,struts2提供了方便的validate方法,然后可以针对每个字段的业务语义,使用正则表达式验证是否是合法输入。struts还提供了token等措施,使得不能偷窃session。

只要当安全设计报告曝出漏洞的时候,才会知道这些框架里面的某些与功能无关的东西是做什么用的。安全才刚刚迈出了第一步。我想过一段时间,我是不是还能记住代码里的这些安全加固部分。

昨晚因为部署的时间很匆忙,所以慌了,没静下心来去想怎么防止富文本编辑的xss攻击,还是不能手忙脚乱,要冷静,才能更好的解决问题。昨晚回去看看gmail,查了一下就知道大概方案了。

May 12, 2010

有一些想法

Filed under: 思考

这次部署以后,下了一本叫release it 的书准备看。

有一些书,不是从零开始学习的。因为不能体会其中的经验。更像是要经历过相同的事情,然后去印证,看看人家是怎么经历,哦,原来不是就我这么惨。更重要的当然是看,他是怎么解决,怎么总结的。

带着经历看书,恩,有些书是这样的。有一个悲剧的推论,很多时候,无论如何,你都需要经历过痛苦,才能够习得经验。所能做的是,少受些苦,不要吃了苦不长记性。 从头到尾的金光大道是不存在的。

关于最近的部署

Filed under: 思考

最近的工作,可以说是痛苦的,如果提前知道这段经历,我可能会退却。现在这段痛苦还没有过去,也许还处在刚刚开始的阶段也未知。

痛苦有痛苦的收获,有些经验,不是完全浸泡在这种经历之中,这种情绪之中,是不可能从别人的口中,书上得到的。 为了不让这段烦人的经历被浪费,希冀有所成长。下面的文字,希望能记录下一些事情,更是为了帮助回忆和思考。

项目只是一个大项目的子项目,很小的项目。难处在于,这个项目不是独立的,而是依赖其他项目或者资源。这样带来的不可控性时时都引发问题。

项目依赖了,另一个业务系统的业务数据和业务规则,要和一个单点集成平台集成,要部署在商用环境上,部署环境不可控。

流水账一下,自己遇到的困难。

第一:项目依赖了OTRS ticket系统。这个系统是perl写的。虽然是开源的,但是看不懂源代码去熟悉业务规则,和系统怎么实现这些业务。因为现学perl已经来不及了。只能通过在界面上黑盒的操作来推测代码所做的动作。但是挂一漏万,总是有一些边界的动作没有考虑到。因为这种探测功能的测试做的不够完善。彻底了解一个业务系统是做之上开发的必要条件。阅读源代码也是了解这个系统所必须的。黑盒虽然短时间见效,但是最后会尝到恶果。

这个项目还有第二阶段,在第二阶段这些问题需要弥补。最为重要的是还是需要看源代码,黑盒的探测业务是行不通的。如果碰到行为古怪的系统,行为和预期的不一致就更惨了。古怪的行为只能通过源代码发现。因为人家的思维不一定和你的预料一致。即使看起来一致,其实边界条件隐藏着很多不一致的定时炸弹。

虽然搭建了本地的OTRS环境,但是由于缺少真实运行的业务数据,有一些bug没有来得及发现。自己对OTRS系统不够彻底了解,只能做一点是一点,这一点是很忌讳的。没有主动和公司负责这个系统的运维人员主动沟通业务和数据方面的知识也是失误之一。包含一年公司业务数据的测试系统搭起来的很晚,因为这个不是我自己能掌握的,所以架构在这个系统上的测试,也拖的很迟。但是自己在得到有真实数据的环境以后,也没有做完善的测试,也是失误。特别是边界条件上的测试。

需要和业务人员沟通,编写完善的测试用例,了解系统的日常流程。需要尽早的接触真实的环境,和真实环境的偏差都会导致新的问题出现。

在真实的OTRS环境搭建好以后,还是发现了不少问题。

这里碰到了三个环境,自己搭建的,公司搭建的测试环境,商用的环境。每一次都发现新的问题。问题在自己,没有和业务人员沟通,做出有效的测试用例。

总之测试环境一定,一定要和真实环境尽量的相近。不然很多隐患,迟早爆炸,那个时候时间和资源就很紧张了。

在真实环境上,用了tomcat6.0.由于页面的语法检查比5.x更加严格,有一些页面没有通过检验,不能编译。导致页面出错。

第二,系统要和单点登录系统集成。一开始遇到cookie传不过去的问题,调试了两天。还是环境的问题。因为不熟悉Crowd系统。所以大部分时间都在不着边际的摸索。

单点登录的问题还么有结束,因为需要使用域名,要通过apache做proxy跳转到tomcat。网络环境变的复杂。在第一次切换时也出现了问题。每次的问题都可以惊出一身冷汗,因为不知道能不能解决,环境太过复杂了。

由于单点登录系统的加入,网络环境的复杂可能给部署带来很多麻烦。系统之间的集成是脆弱的。系统集成是需要花很多时间的,最后无一例外会和最初的设想不一致。

第三,也是非常非常头疼的一点。部署环境不是自己控制的,而且是安全性非常高的环境,权限控制非常紧,另外部署到真实环境上的时间非常短,几乎没有什么时间去调试。要求一部署上就能工作,如果发现问题,需要修改和重新启动服务器。部署人员就会非常的为难。这里也显现出脚本语言系统在部署方面的优势。对于小的改动,不需要编译和重启服务器。

如果部署人员对系统的安全性做了新的限制,比如文件读写权限,或者数据库做了修改。就会导致web服务器无法启动。但这时问题不在程序本身,会将问题诊断导入歧途,浪费大量时间。环境要稳定。

真实系统也要有一定的时间,和一定的权限供应用程序测试。资源紧张会导致大量的时间浪费,最后只能用加班来低效的弥补。由于安全性的控制,如果我在环境上发现了什么问题,想重启服务器,上传class文件更新,这时候已经没有了登陆服务器的权限和ftp的权限。只能去找部署人员打开,其实人家也很为难。大家都有难处。我认为主要还是验收的工期太短,所以有些事情不能从容的去做,部署人员总是惦记着收回服务器的权限。如果这些事情分阶段去做,情况可能会好一些。因为搅在一起,会使得大家的工作互相干扰。而且不白原因所在。

真实的环境部署,要留出一定时间供测试,一定权限供测试,最后再收回权限。如果事情搅在一起,互相干扰,就会觉得寸步难行。不要低估到真实环境上的问题。发现了问题,因为没有权限不能去改动,是非常难受的事情。这都是平常部署环境完全自己控制,什么都是root权限,数据库和文件,所不能遇到的问题,服务器启动不是很难。

第四,如果从代码部署到真实环境,有一堆的配置文件需要修改,挂一漏万,如果忘记了修改,就导致整个程序出现问题。如何管理测试环境和真实环境的配置变动也是一个挑战。只通过记忆和注解打开关闭是不行的。

没有想到会遇到这么多问题,因为集成引入的复杂性。

先让这些回忆沉淀一段时间,然后再回头来总结经验教训

对于生活上,只需要让家人知道自己最近有一些忙,尽量不要把工作的情绪带到生活中来,因为这会伤害到家人。也只能说尽量。

不要说别人,就是自己,如果过了一段时间,也很难感同身受的体会别人的紧张,压力和烦恼。

 另外还要补充几点:

作为开发人员,可能有点内向,起码我是这样的。要大胆去沟通,把自己的问题说出来,无论是向同事请教技术难题,还是和业务人员沟通业务,还是让领导知道进度,自己这里的问题。不要把事情藏着,其实只不过是拖着,最后都会暴露。沟通肯定是没有错的,不要因为一两次沟通不畅就退缩。工作环境其实还是有好的,即使不友好,你藏着事情,就是你的责任。主动和人交流,然后留下沟通的电子邮件等。你做了,别人不配合是别人的事情,你不做就是你的事情。事情成不成又是另外一回事。

 

May 5, 2010

感恩

Filed under: 思考

出地铁口时,突然在想:我是不是已经对现在的生活习以为常。就在两三年前,或者几个月前我会很羡慕这样的生活状态。以至于它们常常会在脑海中盘旋,现在都已经成为现实。

把过去的生活摆在旁边对比。我找到一个聪明贤惠好看的女朋友;有一份不讨厌,甚至还觉得有点奔头的工作;离单位只有四十分钟的路程,不用每日起早;和同租的关系处的不错;和同事的关系不错;常常得到了大家的帮助;自己每天都进步;老妈来到北京暂住,看到我在北京的生活;将要到来的婚姻得到亲戚们的认同和祝福。这一切,乃是真的觉得:是上苍给的福分,是朋友们的爱护,最后还有自己的努力和善意的回报。

自省一下,自己还算努力,但不算令自己十分满意的努力,工作和学习经常也偷懒,领导有时也对工作进度表示过不满。待人接物不够圆润。

只是想写说,我很感谢这一切。需要牢记,相比过去,我正在被包围在幸福中。还需要更多的努力,去回报这一切。幸福是可遇不可求,只要努力,认真,善良,自然自会敲门。你别去找它,它会来找你

 

Get free blog up and running in minutes with Blogsome
Theme designed by Jay of onefinejay.com