逝者已逝,众恶徒已正法,然天下居庙堂者与处江湖者,当以此为鉴,牢记生命之重,人权之重,民主之重,法治之重,无使天下善良百姓,徒为鱼肉。 ——孙志刚墓志铭
  • 记得去年5月11号,项目第一个迭代结束的时候,我在日记中写到:

    整体感觉很无力。

    几十个project组成的遗留系统,改点东西要翻天覆地的找代码;无数的存储过程,繁琐的手工的deploy、 release步骤;需求不清晰,客户非抵抗不合作。

    迭代的起止没有任何明确的标志。show case是下个迭代的第一天做,回顾是下个迭代的第二天做。没有kickoff meeting。计划在哪里,在mingle上。

    但情况也一点点变好,渐渐熟悉了遗留系统、IIS和Tomcat的结合、部署流程。自动化脚本也增加了起来。

    大半年过去了,回头看看前三个迭代的回顾墙,不免五味杂陈。

    我们基本上不会再出现一个story做一个迭代的盛况了;

    也不需要每次迭代都要反复提及“提前做spike,分一个pair专门做spike”之类的话题了;

    一开始发布domain的时候要瞪着屏幕瞪10分钟,后来有了Autoit的脚本,到后来domain也不需要发布了;

    后来有了自动化功能测试,然后又没了,最后又有了;

    代码删啊删,测试加啊加,有个项目的覆盖率超过80%了;

    某个机器上应该还有inception之前搭起来的本地持续集成吧,那上面还有dbdeploy + sqlplus的自动化数据migration呢。客户的tech lead离开北京的时候答应说把这套东西在伦敦搞好,可是到他离职的那天,还没在mingle上建卡呢;

    该走的客户还没走,不该走的客户却走了;从一开始就对客户的协作态度不满意,回顾的Action上写着“PM催;PM继续催;PM想办法催;PM找CP催”,但一直也没成功过;

    有的人来了就没有走;有的人来了又走了,然后就再没回来过;

    快要2011年了,更快要离开项目了,只想说一句话:

    回头望,每个人都看那世事无常
    向前闯,一颗心比谁都还要坚强
  • WinApps是个相当有爱的应用,它可以让你直接在Mac上启动某些Windows应用程序,比如迅雷,比如Raysource。我常常需要从Raysource上下载资源,但每次为了下载百兆甚至几十兆或者几兆的文件就要开个虚拟机,这让我实在不堪其扰。

    还好有了WinApps,于是我就可以体面的在Mac上用Raysource了。但它又带来了新的困扰。一如绝大多数下载工具一样,它即便在退出以后也在后台放一个常驻进程,这一点在Windows还没有太大问题,但在Mac上退出一次以后就再也启动不起来了。。。WTF!

    作为一名体面的程序员,我无法接受每次都去ps aux | grep Raysource 再kill进程这样的操作,于是写了这样的脚本[raysource.rb]:

    raysource_status = `ps aux|grep peer.exe`.split("\n")
    raysource_process = raysource_status.select{|line|
      line.split(" ").select{|piece| piece.eql? 'Files\RaySource\peer.exe'}.length != 0
    }
    if raysource_process.length != 0 then
      raysource_process_id =  raysource_process[0].split(" ")[1]
      `kill #{raysource_process_id}`
    end

    然后我只需要再写一个shell脚本,quitraysource.sh,给QuickSilver添加一个Trigger指向 "quitraysource"+"Run in Terminal...",以后每次想退出Raysource的时候,用快捷键调用那个Trigger就可以了。

    从发现Raysource的问题到写完程序花了大概半个来小时,但以我平均两天使用一次Raysource的频率而言,它可以为将来节省大量手工重复操作的时间。

    我不知道迅雷、纳米人,乃至IE是不是也存在同样的问题,但如果你曾遇到过的话,希望这个程序对你有用。不知道如何配置QuickSilver Trigger的朋友,可以参看我从前的博客:QuickSilver进阶应用指南

  • 五月书单 - [朝花夕拾]

    2010-05-31

    1. 《六顶思考帽

    在用系统反馈图的方式来剖析问题成因、改善点、观测点的时候,有一点相当重要,那就是要头脑风暴。每个人都有自己的知识局限性、认知差异,所以有的人会摸到象腿,有的人会摸到身子,或者尾巴。只有每个人都可以无阻碍的把自己的理解呈现出来,这个团队才能建立一个趋向于分析系统全貌的思考方式。

    思考》跟《系统思考》有很多异曲同工之处,但它给出了一种更具有可操作性的团队协作方式。

    书的开篇就指出:因为每个人各自的关注点不同,再加上背景和知识结构的差异,往往会出现很多不必要的争论。而这些争论丝毫无益于得出一个建设性的共识,无益于团队中的智力资源整合。

    作者提出的解决方案很简单:所有思考者在同一时间只做一件事情,把逻辑、情感、创造、信息等等区分开。我们有不同颜色的子,戴上不同颜色的子,表示换一个看问题的角度。

    通过这种方式,我们可以更多的关注于“我们能够做什么”,而不是谁对谁错。

    2. 《软件随想录──Joel谈软件》

    前两天荣浩说起他在看微观经济学,我随口问了句谁推荐的,然后荣浩、晓庆和我三个异口同声说,“Joel”。Joel是个很有煽动力的八卦er,至少在我这个没有把1940年以来的重要论文或者图灵演讲集都读过一遍的人眼中看来,他还是很能把各种史事信手拈来挥洒如意的。

    3. 《常识

    常识是本很沉重的书,作者在封底说,“如果时事评论的目的是改变现实,那么现实的屹立不变就是对它的最大嘲讽了”。然而正如某历史系女博士所说,“人不会变得更好,他们只是变得更聪明。人变聪明之后,不会停止拔飞虫的翅膀,只会为这种行为想出一个更好的理由。”

  • 郝明义在《越读者》中把阅读分成四类:寻求人生现实问题解决之道的“主食阅读”;提升素养、丰富思想的“美食阅读”;查证词语、典故,辅助阅读的“蔬果阅读”;娱乐、消遣的“甜食阅读”。从南方归来已经三个多月了,也按照郝明义分类法来梳理一下这些日子读过的书:

    1. 主食阅读

    《金矿》──讲述了一家濒临倒闭的公司在精益大师的指导下,应用精益的原则和实践,从保证交付做起,一步步减少库存,标准化生产,拉动式生产,达成价值的顺畅流动,消除过程中的一切浪费。学精益,不妨从这本书开始。

    《精益思想》(未读完)

    《丰田改善力》── 实施改善的25点心得:4. 反复试验;8. 永远将今天作为起点;9.身处现场;19.寻求根本原因,多问五个为什么;20. 改善永无止境。 24.当前作业的目的是让后续作业更容易。

    《现场改善》──讲述了改善、现场改善的原则和种种实践,例子也很多,读着很轻松。改善的缘由是浪费,要找浪费去现场。

    《丰田可视化管理方法》──看板、现场、可视化、湖水和岩石

    《丰田生产方式》

    《Programming Scala》

    《Programming in Scala》

    2. 美食阅读

    传统经济学假定人们都是理性的,可以充分了解手中掌握的一切信息,看清各种选择中错综复杂的因素,计算其利弊后加以权衡。它假定人们的决策都是受到价值和幸福指数二者的驱动,人人力图将收益最大化,据此做出理性的、合乎逻辑的判断。

    但现实并非如此。我们的决策过程只是“有限理性”的:我们的决定会受到情绪及其他非理性因素的影响,但这些非理性行为又是有规律可循的。在对人类认知行为的考察过程中,行为经济学建立了有关经济决策中认知偏差的诸多理论。相关的书籍包括:

    《摇摆》、《不做正常的傻瓜》、《怪诞行为学》、《行为经济学》

    前三本书都是案例讲解辅以理论分析,第四本对种种非理性行为做出了归纳总结,是教科书性质的,可以最后读。

    ~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~

    结构决定行为。不同的人,置身于相似的结构中,倾向于产生类似的结果。但是,参与系统的各个部分,常常见树不见林,只能针对眼中见到的局部信息,做出局部的最佳决策。不幸的是,每个人的局部最佳决策,并不能构成整个系统的全局最佳决策。因为系统中有反馈、有延迟,因和果在时空上并不紧紧相连,显而易见的解往往无效。

    推荐两本经典书籍:《系统思考》、《第五项修炼》

    ~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~

    今年的QCon大会上,有好几场演讲都属于内容精彩但ppt制作极烂的,要人花很大的力气才能专注于听他的讲述,而不是看他的胶片。

    读过《演说之禅》和《让创意更有黏性》之后,你的演讲一定会上一个台阶。

  • 上一篇博客介绍了Current Selection的概念。用它可以进行很多便捷的操作,比如打印文件、删除文件、复制文件等等。

    1. 打印文件

    这个方法在这篇博客里面有详细讲述,简单来说就是:

    1)启用proxy object

    2)保存这个trigger:PrinterProxy(Open File) Current Selection(注:这个表达式的含义是:操作对象是PrinterProxy,要执行的操作是Open File,操作的参数是Current Selection,接下来均以这种方式表示trigger。)

    2. 删除文件

    Current Selection(Move to trash)

    3. 复制

    Current Selection(Copy to...)

    除了这些基本用法以外,Current Selection还有一些奇技淫巧。

    比如说,如果我们从文档或是网页中看到一个网址,而这个网址没有以超链接的形式显示,无法点击打开,必须复制粘贴到地址栏里面回车,这就很不方便了。所以我们可以保存这样一个trigger:current selection (open url with...) Firefox。然后就可以选中网址按个快捷键就能在新浏览器窗口中打开链接了。

    该trigger的配置界面如下所示:

    且不要着急按照上图中的说明去配置,你大概是配不出来的,因为在QS中,Current Selection对应的action只有几个基本的对于任何对象都适用的操作,所以输入Current Selection之后,第二个窗格里是联想不到Open Url With...这个Action的。那该怎么办呢?

    1. 要使用QS打开页面,首先要安装Filefox/Mozilla Module或者Safari Module插件,插件安装完毕之后,到Catalog的配置下,点击Module,把FF和Safari都勾中,然后QS会去检查FF和Safari的收藏夹,这样收藏的页面就可以被识别为对象了。

    2. 调出QS的主界面,输入一个收藏过的网址,然后切换到第二个窗格上,选中Open Url With...这个action,然后按command+c复制;再转到配置trigger的界面上,创建新trigger,第一行中选Current Selection,在第二行上按command+v,于是我们就可以对Current Selection调用Open Url With...这个action了。在第三行上选择Firefox,再配置快捷键,于是一个华丽的trigger就诞生了。

    杨麟在上篇博客中留言说因为Current Selection不一定被识别为text,所以对应的action出不来Find With...,用这个办法也能解决。

    (再注:因为FF3的书签是在SQLite数据库中保存,所以QS的插件找不到它们。不过FF3是可以周期性的把书签保存到bookmarks.html里面去的。在FF的地址栏里面输入about:config按回车,再在过滤器里面输入autoreport,我们可以看到browser.bookmarks.autoExportHTML这个选项,它的默认值是false,双击可以把它改成true。最后重启FF和QS,bookmarks.html就会自动生成了。FF3会在退出的时候自动把书签写入bookmarks.html文件。──该段内容来自这里)

  • 这两天打听了一下,身边使用Mac的朋友,要么是没有用过QuickSilver,要么是就用它来启动应用程序。其实我之前也是这样的,只是前些日子看到徐宥同学在博客中写到:

    一定要装 Quicksilver 或者用“服务”,否则就是把苹果当 Windows 用。

    于是花了些时间,才发现了QuickSilver的强大之处。

    本文从一个令人心动的快捷操作出发,简单介绍一下QS中的一些基本概念。

    通常我们使用google搜索的时候,都要切换到FF窗口上去,然后切换到google搜索栏,输入文字、回车;如果我们可以把这个过程简单成敲个快捷键然后就可以输入文本回车呢?如果我们还可以在看PDF、看Word文档、看网页的时候,把想查询的文字选中,敲个快捷键,就可以自动展示google的搜索结果呢?

    下面就来看看如何一步步实现这个功能。

    安装和基本配置,包括装插件、快速启动程序、快速打开FF和Safari收藏夹中的链接等等,这些在Robin Lu的文章中有详细介绍,这里不再赘述。

    1. QS的主界面

    QuickSilver的主界面分三个窗格,正如官方用户手册中所写的那样,第一个窗格是操作的对象,第二个窗格是要对该对象执行的操作,第三个窗格是要传入的参数(这个窗口只有当第二个窗口的操作需要参数时才会出现):

    2. 安装所需插件

    这个功能需要Web Search Module,请自行安装。

    3. 对象操作

    调出QS,输入Google Search,这就是要操作的对象了。然后按Tab键切换到第二个窗格,这个窗格里面显示的是可以对该类型对象执行的所有操作。这里要执行的操作是“Search for”。如下图所示:

    再按Tab键或是回车,进入第三个窗格,在这里我们要对"search for"这个操作传递参数了,随便输点文本,按一下回车,结果页面就会弹出来。是不是很爽?

    你可能会说不。

    我同意你的观点,每次都这样在三个窗格里面依次输入命令,可能还真不如切换到ff,切换到google搜索栏再搜索来的快。不要着急,下面就是更有趣的应用了。有了触发器(trigger),一切就会截然不同。

    4. 触发器(Trigger)

    Trigger的最常见的用法,就是用一个热键触发一系列的操作。还是以google search为例。

    打开QS的配置界面,在Triggers这个分类下,再按一下+号,选择“Hotkey”。你会看到这样的弹出界面:

    同QS的主界面一样,第一行是操作对象,第二行是要执行的操作,第三列是变量。我们这里依次输入“Google Search”和 “Search For”,第三行不用填。点击save。然后点击Trigger配置界面第三列中对应的小方块,在弹出窗口中配置这个操作序列对应的热键,如图所示:

    这样配置好之后,无论我当前在用什么工具做什么事情,都可以通过command+shift+s的组合来调出google search的窗口了。

    与之类似的是,还可以绑定某个快捷键,让它去打开页面,比如用command+shift+g打开gmail;还可以定义用某个浏览器打开页面,例如用command+shift+d在safari中打开google文档:

    当然,即便是这样依然还是有不方便的地方,比如在博客开头说过的,如果我们看到文档中的某些字词想搜索呢?能不能让我连复制粘贴到搜索栏的操作都能省掉?

    答案是肯定的。这就涉及到了另外一个概念,叫做Proxy Object,它是一种特殊的对象,用来代表(或代理)一些变化的对象。有什么对象会发生变化呢?比如“当前选中的文本”,“上一次调用的对象”,“上一个播放的曲目”等等,(详见用户手册)。Proxy Object就是用来代理对这些对象的操作的。

    5. 使用Proxy Object

    首先在QS的配置界面中进入“Preferences”标签页,在“Application”配置项里面选中“Enable advanced features”。之后就可以在“Catalog”标签页中的“QuickSilver”配置项里面看到“Proxy Objects”,把它勾中,然后就可以为我们所用了!

    那对应到刚才的例子中,我们该做哪些操作呢?

    首先,我们要操作的对象是Current Selection,要对它执行的操作是Find With...,这个操作要传入的变量是Google Search(当然也可以是Wikipedia Search或者Google Map Search等等)。然后我们把这一系列的操作绑定到某个trigger上,譬如command+shift+f,这样就大功告成了!

    现在,如果我想要搜索某个文档中看到的词,只要把它用键盘(或是鼠标)选中,按一下绑定的trigger快捷键,firefox页面就会自动弹出来,给我们显示google的结果!

    6. 小结

    本文通过一个快速启动google搜索文本的例子,演示了QuickSilver中trigger和proxy object的简单使用。当然,QS的威力远不止于此,接下来的文章还会继续讲述。

  • 白雪压枝低

    紫色的小刺

    不是汽车,是灰机

    忧郁的雪团

  • 女人的考验 - [朝花夕拾]

    2010-02-13

    郭冬临的小品让我想起多年前的一个故事。

    那是一个雷雨的夜里,我跟同学在路边的一个小烧烤店喝酒。

    同学收到同事老婆的一条短信:“xx今天没回家吃饭,他跟你在一起么?” 同学本想直接回复说在一起,但转念一想,如果同事需要圆场的话,就肯定会提前打招呼的,既然没打招呼,那就是不需要圆场。于是回复说“我们没在一起”。 结果十多分钟之后,便收到了一条令我们错愕又捧腹的短信:”恭喜你通过了考验,只有你说实话了。以后我只让xx跟你一起玩。”

    恭喜你通过了考验。。。恭喜你通过了考验。。。!!

  • 聊发少年狂 - [朝花夕拾]

    2010-01-31

    十年前,他跟我说,李剑,帮我写封情书吧。
    女孩是他的同学,后来断了联系,很多年过去了,偶然在搜狐校友录上又碰到。他欣喜若狂。
    我写了情书,他寄了出去。
    三年前,他们结婚了。

    十年前,她跟我说,师兄,帮我写封情书吧。
    男孩子是她军训时的教官,帅帅的把她迷住了。
    那天大雪,我跟她在雪地里走了很久,聊了很久,然后她就放弃了。
    后来毕业了,也就没了她的消息。

    ──李剑,帮我写封情书吧。

    ──同学,请问你的情书怎么卖?是按份还是按字数?

    零下三十多度,往墙上贴海报冻得手疼啊。女生楼里面的传单还要找小师妹帮着发。

    那些促成或是拆散的姻缘们,你们还会不会记得我?

  • 摩根‧拉迪莫尔曾经是一个伟大而高尚的骑士,他为了保卫无辜、贫穷和饱受痛苦的人而战斗。多年来,他几乎跑遍了艾泽拉斯的所有边远地区,为受苦的人民带来安慰,惩戒那些作恶多端的人。

    在他十八岁那年的夏天,摩根与一位名叫莉丝的年轻女孩结婚了。他们彼此相爱,后来生了一个儿子和两个女儿。

    在摩根三十二岁那年,罗德隆的战争爆发了。

    摩根被召入圣骑士光明使者乌瑟的部队,与兽人和亡灵作战。因为战争,他离开了妻子和儿女,离开了安静的家园。

    数年过去了,战争依然没有结束,摩根亲眼目睹了许多可怕的事,他目睹了白银之手骑士团的解散,目睹了乌瑟的死,也目睹了瘟疫的蔓延。只有一件事可以让他远离疯狂和崩溃的边缘,那就是他相信自己总有一天可以和妻子儿女团聚。

    摩根最终回到了家乡,但那裡已经不再是他熟悉的景象了。曾经青翠的树林变得枯萎凋零,散发着堕落的气息,亡灵和其他黑暗的势力到处横行。遍地都是已经损毁的房屋与农场,乌鸦岭附近的墓地佔据了大片的土地。摩根怀着震惊和迷惑,艰难地回到家中,却只发现那裡已成废墟。

    摩根不知道自已的家遭遇了什麽样的灾难,他赶去村庄裡寻找答案,寻找他的妻子和孩子们的消息。

    摩根询问了许多人,但是没有找到任何线索。就在现在被称为夜色镇的这个地方,有一位牧师告诉他应该到乌鸦岭的墓地去搜索一下是否有他妻儿的墓碑。摩根不愿相信他的家人会死去,他走遍了暮色森林的每一片农场和每一所房子,但还是一无所获。

    他相信自己的家人已经出去逃难了,于是骑马从夜色镇赶往毗邻的湖畔镇。

    就在去湖畔镇的路上,他最终决定到乌鸦岭的墓地去一次。摩根在墓碑之间穿行了数个小时,看到了许多熟悉的人名被刻在墓碑上,这让他变得几近发狂。最后他看到了众多的墓碑中间有一小片由三块墓碑组成的墓地,看起来已经很久无人打理了。当他靠近那片墓地的时候,他全身充满了恐惧。摩根擦去了墓碑上的灰尘,显出了上面的名字。墓碑上简单地凋刻着几行字母,那是他最不愿看到的名字。

    莉丝‧拉迪莫尔
    我们深爱着的妻子与母亲

    摩根的忧虑立刻变成了沮丧,进而变成了无比的悲痛,他不禁瘫在地上开始哭泣。摩根一连几个小时望着墓碑,一边哭泣,一边对着墓碑请求原谅和宽恕。又过了几个小时。他突然情绪大变,开始发狂,他拔出佩剑,一边怒吼一边用剑如狂风暴雨一般砍向墓碑。愤怒让他变得盲目,他疯狂地挥舞着剑,不断地攻击着。

    他的举动引起了三个墓地值班人的注意,他们试图阻止他。摩根注意到了他们,于是他把自己的愤怒和对罪恶的谴责通通倾洩这些无辜的人身上,最后杀害了他们。

    杀人之后,摩根的愤怒逐渐散去,他的脑子也恢复的正常的意识。在看到自己的剑血淋淋地插在一个值班人的胸膛裡时,激烈的情绪将他推向了崩溃的边缘,他抽出匕首勐然刺入了自己的心脏。

    第二天,有人发现了摩根‧拉迪莫尔和另外三个无辜者的尸体。

    他被埋葬在墓地旁边一个匆匆挖掘的墓穴裡,没有举行任何葬礼。摩根杀了无辜的人,这完全违背了他的信仰与天性,再加上他因为不能挽救家人而感到了巨大的悲痛,这些使得摩根死后也无法得到安宁。

    只过了几天,人们便发现他的墓穴被破坏,他的尸体也不知所踪。

    如今,摩根‧拉迪莫尔被失去妻儿的痛苦和对自己的仇恨煎熬着,每日都在暮色森林中游荡。现在他称自己为摩拉迪姆,满怀仇恨在暮色森林中徘徊,毫无理智地肆意进行屠杀。

  • 今天胡凯同学在客户现场留意到这样一个现象:一个角落里面摆放着四台饮水机,但大多数时间都只有一个桶里面有水,其他桶往往都是空着的。

    于是跟透明一起,我们三个就这个现象画了一次系统循环图。

    从图中可以看到,有水的桶数越多,每个人换桶的动力就会越小,而每个人换桶的动力越小,又会导致有水的桶数减少,这个回路是一个调节回路;而另外一个回路呢,有水的桶数减少,会导致打水的等待时间变长,等待时间变长,会导致个人换桶的动力增加,从而又导致了有水的桶数增加,于是又形成了一个调节回路。

    因为调节回路的存在,所以会导致回路外的系统影响被调节回路给消化掉。不管打水的人数增加还是减少,它对“有水的桶数”的影响进入调节回路以后,这个回路还是会最终趋于一个平衡点,也就是只有一个桶有水。即便是我们通过增加“负罪感”来提高换桶的动力也是如此。

    所以当系统结构是一个调节回路,而我们又想让某个方面向我们所期望的方向倾斜时,我们能够做到的就是打破这个系统结构。也许我们可以发现在图中还没有发现的元素,它可以跟现有元素构成增强回路,然后我们想办法改变新元素的性质;也许我们可以改变系统现状,让它不再成之为调节回路。

    我们今天暂时所想到的,就是第二个做法,改变系统现状:把四个饮水机分散开,放到办公大厅的不同地方去,这样子“有水的桶数”就不会跟“个人换桶的动力”形成调节回路了。

  • 学而时习之 - [朝花夕拾]

    2009-12-20

    回顾一下昨天的工作。从可以观察的度量项上来比较一下重构前后的代码,圈复杂度从5到2,方法的平均代码行数从6变成不到3。所做的事情主要是以下几点:

    1. 解耦合。原来是很多操作都放在一个丑陋的downloader对象来做,其他对象都是贫血模型而已;改成了每种类型的页面对象负责下载自己对应的页面并解析,构造下一级的页面对象。把对象的职责理顺以后,代码看起来就舒服多了。

    2. 方法提取。小方法更易理解,更易测试;从方法名就可以清楚的看到方法意图;而在方法提取的过程中,当我们发现方法越提取越多,也会被促使着思考这个类是不是承担了过多职责。

    做得比较好的地方是:小步快走,每一步都先重构或是补充测试代码,测试驱动重构。

    需要改进的地方:首先是不应该在犯困的时候写代码(-_-|||);其次是在写代码之前没有先把需求想清楚,一上来就被细节陷进去了,也没有个设计思路,盲目的开始写,正如被8x所批评过的一样。这个错误也很严重的影响了重构,所以解耦合的时候步履维艰。

  • 从昨天夜里到现在,写了11个小时的程序。

    代码的圈复杂度为2。共7个类,34个方法。

    各个类的代码统计如下:

    lib(161)
        category.rb(48)
        downloader.rb(47)
        gallery.rb(35)
        image_page.rb(33)
     test(121)
        category_test.rb(41)
        gallery_test.rb(38)
        image_page_test.rb(24)

    有相当长的一段时间,已经极其疲倦了;如果不是还能记得出现一个bug就写个测试覆盖,新增或修改功能之前先写个测试,真不知道最后这程序会写成什么鸟样。即使是这样,睡过一觉清醒以后,还是基本上重写了一遍

    所以,当看到客户的程序员没日没夜的加班到深夜,而代码又连一行测试都没有,硬生生的靠调试(有的时候干脆连这个环节都省略了)来保证外部质量,就有种束手无策的感觉。前两天跟吃饭的时候,熊说起,他们这个恶心循环是件很可怕的事情,因为他们每天都在加班,所以他们就不会在乎进度、在乎计划,所以他们有理由不关注效率,有理由磨洋工,有理由不去提高生产率───反正不管怎么样我都得加班到10点,你还能拿我怎么样?

    ~~另一则~~~~

    前两天熊跟我说,你丫写代码一点sense都没有,回去以后赶快找个项目待上半年吧。

    上面这不到300行的代码,写了5个小时,重写了6个小时。有什么办法呢,多写多总结吧,会快起来的。

  • 我爱广电/你使2012突然提前/这一刻我内牛满面/我爱广电/我爱你一幅伶牙俐齿/能把打压说成宣传/我爱广电/我爱你一双如花妙手/能把好片剪成太监/我爱广电/我爱你一颗似火红心/能把许可变成圈钱/我爱广电/你是秦始皇再现/焚书坑儒也比不过你的利益垄断/我爱广电/你把中国变朝鲜/宽带光纤挡不了锁国闭关/电视直销骗人广告/色情光碟到处泛滥/貌似和你无关 /什么BT/什么在线/什么盗版什么侵权/该管不管,不该管瞎管/点灯的百姓又怎敌得过放火的州官/我爱广电/我向佛祖请愿/被雷劈一次吧就一次/这是广大网民的心愿

  • 刘未鹏的博客上这样写:

    好资料,坏资料。好资料的特点:从问题出发;重点介绍方法背后的理念( rationale ),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。 坏资料的特点是好资料的反面:上来就讲方法细节,仿佛某方法是从天上掉下来的,他们往往这样写“我们定义… 我们称… 我们进行以下几个步骤… ”。根本不讲为什么要用这个方法,人们最初是因为面对什么问题才想到这个方法的,其间又是怎样才想出了这么个方法的,方法背后的直观思想又是什么。实际上 一个方法如果将其最终最简洁的形式直接表达出来往往丢失掉了绝大多数信息,这个丢掉的信息就是问题解决背后的思维过程。

    知道了资料的好坏之分,我们也就可以知道如何更好的写文章,讲道理。

    学习一个东西之前,首先在大脑中积累充分的“疑惑感”。即弄清面临的问题到底是什么,在浏览方法本身之前,最好先使劲问 问自己能想到什么方法。一个公认的事实是,你对问题的疑惑越大,在之前做的自己的思考越多,当看到解答之后印象就越深刻。记得大学里面的课本总是瀑布式地把整个知识结构一览无余地放在面前,读的过程倒是挺爽,连连点头,读完了很快又忘掉了,为什么?因为没有带着疑问去学习。

    这跟我上一篇博客所讲的“主动思考”是一致的。