当一名战士就是一支军队,那些不需要软件工程的时候

当一名战士就是一支军队,那些不需要软件工程的时候* 最初的代码1994年,当我开始对编程感兴趣的时候,还没有软件蓝领这一说法,但是我已经
有了后来软件蓝领流行起来以后的困惑。我第一次做的比较大的程序,是用GW-BASIC写的,没有IDE界面,需要按行号插
入,黑底绿字的显示器,单个软驱倒腾用两张盘。 (感谢我们的导员刘春光老师
每天中午借我用他的计算机) 要编的程序是自己想出来做着玩的,一个DOS界面下
CGA显示模式,菜单方式的……班费管理程序。如同齐同学的那个定票系统,这个软
件并没有实际应用,不过,它对我来说,比此后所有写的程序都更难。代码后来参加一个比赛的时候,打印了唯一的一份纸质版,打印纸抻开比我举起
手还要高。我当时遇到了程序设计中的核心问题--大量的代码,复杂的逻辑。我当时使用了GW-BASIC提供的一个非BASIC的功能 gosub,类似于函数调用,它帮
助我逃过了程序彻底混乱的厄运。后来当我学到模块化思想的时候,如遇故人。
我毫不费力地就接受了这个观念,因为痛过,所以印象深刻。后来经常见到有初学的同学函数写得超出两三屏,还很得意自己逻辑控制能力。
我就在心里撇嘴,你那是还没受够罪。大量的代码,复杂的逻辑。软件工程给了我们某个答案,就是软件蓝领,它声称
大量的人工、短期培训、重复地简单劳动,能够解决--以工程的方法--大量代码
和复杂逻辑的问题。是的,我们这么干过,好几千看前就这样做。埃及盖金字塔,是没有起重机的,
而是靠几千几万人力完成的;中国的古长城 (不是当代的) ,也没有等待现代电
子计算机和通信技术的发展,而是靠万喜良们的双手堆砌出来的。那个时候,他们一定期待一种东西,可以用燃油作为动作,稳妥精确地运输沉重
的材料。但是他们没有。因为是时代是父亲是民族选择我们,而不是反过来,所以很多时
候很多事情都不能一蹴而就。有的时候,智力或自然的法则也参与限制。* 他们说,没有解析解在数学当中,有一种解题的方法得出的结论称为解析解。我们解一个方程,得到
结果,如果我们所做的常见运算只需要 有限次,那么,这个结果就称为解析解。这是什么意思呢?就是说,你可以通过公式,只需要一个大式子,可能非常大,
但是最终可以计算出结果,直接地。难道不都是这样么?不幸的是,还有一些方程,伟大的牛人数学家们告诉我们,
有些方程就是不能通过公式求出来。而我们在工业生活中还需要求解。数学家牛人们还是有办法的。他们创造了另一种方法,用猜测-比较-再猜测,大
致这样的方法,逼近我们寻找的那个数。这些牛人们中的第一位就是著名的牛顿。但是,我们得到的是那个"数",是整个方程中的一段,而且是粗糙的。精细的完
全一致的解,可能永远也无法求得,我们得到的就是对于当前的应用"足够"精确
的个案。人类是多么地热爱形而上,热爱一次性解决所有问题啊。可是,数学牛人们说,
有时候,你哭也没有用,就是不行。在程序设计中也是一样,只有工程方法,有人说,就是蓝领方法,才能解决大量
代码和逻辑复杂的问题。如果没有燃油,没有热功当量,除了征服更多的奴隶,又有什么方法能够赢得自
己的自由呢?但是,我们是否已经判定程序设计一定没有解析解,所以只能靠人力逼近?* 解析解我和李记者曾经对刘典同学怀有偏见,认为他(没有虽然技)技术极好 ,但是却从
不注重软件中的工程,也不怎么注重合作。今天,关同学用事实给了我强烈的教育。她用事实告诉我:软件工程为什么有时
可以忽略?因为有的程序员,她一个人可以完成超过100个程序员的。就像有的战士,一个人就是一支军队。刘典同学讲过他写数据库的程序用了编译原理生成代码,讲过写手机游戏的时候
用虚拟机。前几天,我刚刚写了3千多的代码生成器,吐出来近6万行代码。这些
给我的印象也都没有今天这样深刻。程序设计,是一种创造工作,就像写小说。与写小说不同的,你所创造的是一台
机器,它可以做很多事,你甚至可以制造一台机器,它以代替你写作最终需要的
代码。在所有的计算机本科都开设了相关的课程,叫做编译原理。在一定程度上,这是
一个解析解。* 关同学今天我CIAC的导师请大家吃饭,辛苦一年。导师本人想参加,我托包师弟说:不
欢迎他。如果导师出现,今天稍微拘谨的场面,就可能令聚会完全不同。我们讨论了,我们吃午饭了,我们唱歌了,我们又吃晚饭了。刚开始吃晚饭没多久,包师弟说:2012的上半年,我们有一些任务要完成,相当
于本年度完成任务的40倍工作量。他说:这些工作都是相似的。可是这些相似的工作如果不能抽象出其中相同的部分,就没有一点相似。我们人
类看到的相似,对于构造代码而言,毫无用处。我看不出来相似。然后我想了几个方案,又都推翻--我在想从哪里抓那么多奴隶
来,又用什么报偿他们,工程本身于他们何益。其实,同学们并非奴隶,必须保
证同学们有足够利益和受益,否则除了我自己,一个人也派不出来。我说:包师弟啊,你能不能别在吃饭的时候说这个,我都吃不下去了。我真的吃不下去了。焦虑。而且,从这以后,我真的几乎没吃啥。奇迹时刻。关同学说:老师其实我想了,这些方案都是类似的。我说:啊?她说:所有的界面都可以……根据配置文件,new 出 一个 label来……是的,不熟悉关同学的,对女生能否写好程序有疑问的,请仔细看一下,她,不
是他。而且,她也不必再解释这个方案,因为软件组可以全体解散,而剩下的工作,只
需她一个人短时间就可以完成。这就是抽象的力量。她没有写GUI,而是解析配置文件生成了GUI;她绕过了令我头疼的C#如何表示
GUI--这样就可以生成RC文件,在编译前,我考虑过的方案--而是在运行时,new
出所有的GUI控件来,相当于解释执行的。* 后来后来,全体软件组成员加入了硬件组,将承担下位机的代码。很好,我终于不用
再讨厌他们用的IDE了,因为再也没有他们熟悉的VS什么的了。我们都开始进入
单片机或ARM的世界。后来,关同学对我的赞不绝口指出:这个方案是你告诉我的啊。我说:啊?她说:就是大仪网的时候,你告诉我blabla。我想起来了。不过,这仍不是我的方案,而是她的。一个方案之所以好(像这个,
好到如此突出,以致你一眼就能看到,绝不可能错过,如果你看到了的话),是
因为它被应用在一个恰好合适的领域,恰好解决了一个难题。至于这个方案有多
难有多容易,有多高科技,其实不是多重要。关同学刚毕业的时候,我们在CIAC讨论一个框架,当时我说:这个倒是可以再抽
象,不过我的方案有点耍赖了。关同学说:你是不是要用函数指针。是的。而且我非常欣慰了一下,因为学生优秀。黄同学当时认为:函数指针,也没啥难的啊。是的。函数指针一点也不难,能想到用函数指针解决这个问题,是一个高度。关同学在此刻想到了一个如此好的方案,所以接下来的半年,我们都不必那么焦
虑了。这就是解析解。关的方案,不是减轻了劳动,不是像我以工程的方法、各种测试 (关今天还提出
用MATLAB生成测试数据,也很好,后来给齐同学用上了) 来控制代码质量,用框
架规范程序员的行为,这些都不是,关同学直接替代十来个人把40个用例生成了
出来。代码质量如此一致和优秀,是由图灵保证的。* 后后记上午,与一位技术人员和一位经理谈话。我提到 通用的CMS > 定制的站点 > 使用CMS。那位技术人员不认可。我说:我刚刚说错了啊,我不是指复杂,而是指困难。那位技术人员blabla说,这不困难,只要如何如何即可。我说:其实我们也不必达成一致意见。我的意思不是说我们无法实现,我说的我
会收更多的钱。争执略去,我同意那位技术人员的下面这个观点 (大致意思,我翻译过的) ,但
是当时没有时间表达:这不是工作量,而是更高的高度。是的,那不是更复杂,不是更消耗时间,甚至不是更困难。那就是更值钱。关同学用事实告诉我:一名战士完全可以是一支军队。没错。

我早就说过

我早就说过"我早就说过",经常有牛人说出这一句话,配合气场,一般代表我多么地牛啊,
早就有些先见之明。有时候,还附带对听众的嘲笑,你看,你们居然不识货。我们常听到:某某观点我们祖宗早已有之,某某技术不过是啥啥技术的翻版……再来看两个例子。云服务的。当年,我整了几张大纸,画下了一个方案,命名为"科技改变生活",
内容是把计算和服务、软件都放在主机端,终端都用计算性能非常性的机器,只
负责显示。跟丁老师聊,他认为,这根本不可能。几个月后,云服务的概念正式
提出,当然,由别人,不是我。我的先见之明值得自豪么?不。因为我只有瞎扯的能力,如果整不出来,我也不
用负任何责任,所以,我也没有投入所有家当去整这个极有前途的东西。又。ZHUMAO有天提起来,他刚工作,或者还没工作的时候,跟我提到可以在计算
机里面装两个操作系统,一个跑在另外一个里面。我完全不相信,我觉得只有多
启动这一类的吧,怎么能一起跑呢。他说我都装出来了,我也不相信,直到亲眼
见到。说实话,我忘了这事很久了,因为不是我的光荣史的一部分。经他一提,
才想起来。ZHUMAO同学比我在云服务中的表现要好多了,他真的搭了个虚拟机出
来。我没有这种先见之明很应该惭愧么?也不。因为,即使我能预见到虚拟机巨大的
市场和技术潜力,我也没有能力实现。自己无法实现的事情,远观则可,没有必
要为没生出来的鸡蛋们打碎了而悲伤。前几天去学习精品课,听到两则八卦,也能说明类似的问题。某学校有个计划:
根据学生的既有表现和举趣,为学生提供下一步的建议,该学生该看什么,都可
以计算出来。很有雄心的计划,问题是,用什么样的技术手段可以实现呢?对于无法实现,至
少我们无法实现的东西,讨论到细节和投入资金,除了丰富一下想像力又有何益?另一个故事。说一位博士设计了个CPU,能在o(n^7)--可能是7--时间复杂度内解
决某个问题。更牛的人判定,这个问题像是个NP难问题,也就是说,这个问题理
论告诉我们,不能在这种时间内解决。即1.这位博士创造了奇迹,他很快就要得
图灵奖了,整个计算机行业的数学基础也快要换了;2.他整错了。在严格地论证以前,你更愿意相信哪个?能尽早地判断美好地梦想不能实现,并承认这一点,非常重要。甚至比美好梦想
本身更重要。判断那是美好梦想还是可能未来的一个重要的方法:你是否具有实现它的能力。如何度量能力本身呢?我并不太知道能力应该如何,不过,对于这种能力不是什么,我略有考虑,与你
分享。实现梦想的能力,不应该是聪明和飞跃的。《三宝大闹宝莱坞》里,编剧和导演为了表现主角是聪明睿智的,设计他完成了
以下任务:用照明灯的电惩罚向门上撒尿的学长、带无线摄像头的四旋翼直升机、
把危重病人绑在自己身上用两轮摩托车送去医院……用自行车带动(发电?)电推
子剪羊毛。各种聪明的做法。这些都很了不起,但是这些做法有个共同的特点,
使得它们的效用受限,那就是,这些做法不能用于设计航空母舰、航天飞机、导
弹,甚至AK47。我们在这些工业成果中,看到的是智慧,聪明无所置其身。也许吧,印度和我们一样,作为第三世界国家,对于技术具有这样的幻想,我们
认为英雄可以拯救世界。而事实上,即使有一千个刺客,也不能攻下四平。孙子
说,以正合,以奇胜。没有正,奇是没有用武之地的。杀伐掠地,最终靠的还是
野战攻城,而非奇技淫巧。《黑客与画家说》编程有三个层次:: (a)使用一种强大的语言,(b)为这个难题写一个事实上的解
: 释器,或者(c)你自己变成这个难题的人肉编译器。使用lisp语言,就是方案a;先写接口和函数库,或者写个dsl,大致相当于方案
b;用设计模式,或者把可能用编译器或者lisp macro生成的代码用手一行行写出
来,大致是方案c。作者暗示我们,方案a是最高妙的,方案b等而下之,方案c最基础。估计有很多人想,俺们应该按方案a行事。问题是,如果你能够使用lisp macro的话,有一个前提,你本人必是编译器/解释
器的专家,才有能力运用这种高级的特性。利剑在一个居家的妇男手中,可能还
不如切菜刀好使。如果你想用方案b,写个解释器,除了要具备写解释器的能力
外(此时不需要具备lisp macro的运用能力,也不需要会lisp语言),有一个前
提,那就是你本人必须能像编译器生成代码一样用手把代码写出来。你只是不想
这么做,不是没有这样的能力。你自己能完成的任务,才能指派别人去做。自己没有能力完成,却偏偏觉得别人
能够完成,而能够完成的人还不如他,这样的人也存在,不过大家面对他的时候
都感觉不太爽。而很多人的问题是,代码写得尚且人和编译器都不忍卒读,又怎么可能写出解释
器,或者更高级地用lisp macro作为编译器生成出代码来再执行呢。作者这样说,固然指出了一条光辉大道,但这大道必须从脚下走起。他只是没有
指出我们和他之间的鸿沟,估计会令很多人淹死在眼前的小河沟里。鸿鹄之飞固
然舒展而高级,不过虫子有虫子的移动之法,那就是爬。更何况同样飞得不错的
蝴蝶,当初爬得也是飞快的,虽然可能并不是最快。这里,还需要小心,实现的能力,是指能切实操作的能力,而不是感觉似乎大概
可以。能够和不能够,二者必居其一。"差不多"这种程度,根本就不存在。我初中的学校,以前提过,是山上片,升重点高中比例不高。每年大约十多个。
也就是说,如果你不是在这十多个里面,你是25名,27名,又或者
100名,150名,在升重点高中这一点上,是没有什么差别的。要么行,要么不行,"差不多"的内部,没有级别。而不行和行之间,有天渊之别。大学刚入学的时候,我以为我的听力老好了,还去过外语系请教学长,应该怎么
才能学得更好。很多年以后我才知道,如果只是听个一知半解,再加上看字幕或
者根据故事情节猜测,那根本不能算是听懂。要知道,一句外语也不会,光靠表
情,我们就能跟老外聊个半天。但是,你能告诉他你对于世界局势的看法么?你能精确地传达,斜上45度角倾望
天空是当今很多被另一些人称为脑残青年的生活态度,这样复杂的含义么?又或
者:: Lisp functions take Lisp values as input and return Lisp values. They
: are executed at run-time. Lisp macros take Lisp code as input, and
: return Lisp code. They are executed at compiler pre-processor time,
: just like in C. The resultant code gets executed at run-time.不能精确表达,我们就只能生存,而不能工作--工作,就是对别人有意义的事。
在这种情况下,你除了用父母的钱和微笑表达对别人的情感以外,对他人毫无帮
助。其实,一个秘密,我们还有一个办法。那就是,我们假装仍然生活在1500年以前的乡村,无论世界的哪个地方。我们施
施然穿过大街,任车流抚过身体,如同流水抚过舒蔓柔美的水草。然后,我们要快乐的生活,全然忘记明天及以后。我们满足于我们的幻想,过
去,我们无比伟大,未来也是。我们无论做什么,都"差不多"和最牛的那些想法非常接近了。只是,我们没有再
稍微努力一点,或者再精确一点,被他们占了先。但是,我们仍然是最聪明的个
体或者民族。只有哪天一发力,那世界就完全不同啦。这很简单。只要我们忘掉,这世界就像编译器一样残忍,只要你写错一个字符,
那么,一切就都是错的。任你流着眼泪说,我不过就差一点点,它都无动于衷。
孩子,这也是一种生活。

穷人如何使用测试驱动开发进行重构

穷人如何使用测试驱动开发进行重构重构这个词现在已经被用烂了。我们经常听经理啥的说,咱们应该把系统重构一
下。当他用重构这个词的时候,想表达两个意思。一,把这个系统重写一遍,大
手术,二,我很fation.重构具有更严格的意义,就是需要在重写的同时,保证系统原有的功能。如果对
系统原有的功能不变做出保证呢?我听过很多人保证:我的U盘绝对没有病毒。你用什么保证。我见过用脑袋保证
某事的,最后,他的脑袋还留在他自己的脖子上。我并非对他的脑袋搬移有什么
兴趣,而是想说,他的脑袋确实很值钱,但是于我却毫无用处。我们用什么保证?胡适先生说:证据。测试驱动开发能给出证据。测试用例如果在重构前和重构后都通过,就说明重构至少在功能不变上是成功的。重构有不少好工具了,可是对于我等穷人,没有大公司啥的作为支撑,有时机器
连eclipse跑不起来都不顺畅。没有利器,如果重构?测试驱动开发也有不少好工具,可是如果你用的既不是C++也不是Java,甚至
连.net也不是,cppunit,junit这些工具又如何助力呢?刘慈欣先生在《全频道阻塞干扰》的最后,让被逼到毫无退路的美国军官说:我
们的祖先也不是最开始就有坦克大炮导弹核武器的,士兵们,上刺刀。我们总可以在更原始的工具中找到新技术的精神,因为牛人们从前就是以此这些
丑陋陈旧的工具创造了这些新的技术。昨天还是前天,二猫像个小大人一样一直坐桌前陪我吃饭,跟我聊。谈到她喜欢
吃这个吃那个。这几乎就是目前她生活的全部,所以有些事情是她想不到的。我说:爸爸小的时候没吃过香蕉。她问:为什么不吃?你不喜欢吃么。我说:因为买不起。她问:香蕉很贵么?我说:不贵,是我没有钱。我曾经教育才外教Dave同学。是的,教育,爱国主义教育。他看到我读《鸿:中
国的三个女儿》,问我:允许你读这种书么?我说:啥?为什么不能。他说:这书不是中国出版的。这书确实不是咱们出版的,是阿于同学从美国给我带回来的。这面这段对话可以看出,他对于陌生的国度有怎么的不了解。所以,在后来,我
对他进行了如下教育:我问:你是不是以为俺们政府真的就挺虐待她一家的,她家还给俺们做出那么多
贡献和牺牲。他说,是啊。我说:那我来给你讲一些事。作者,五岁的时候,因为不喜欢上幼儿园,把牛奶倒在桌子上,挨了批评,很委
屈。Dave说:我记得这个情节。淘气的女孩。我以为,不打死她个败家的就已经是手下留情了。中国很多孩子至今都不能每天
喝上牛奶,我在大学以前,就很少喝到牛奶。他很难相信。我再问:你记不记得,她妈妈去医院(或者临时监狱?)看她爸,因为不能坐单
位的车(她爸单位的),而只能骑着自行车。你认为这很艰苦?他说:是。我告诉他:那是195X年,整个中国,就没有几个人有自行车。我想,不亚于现在
的宝马吧。直到197X年,20年后,自行车仍然是结婚时必备的四大件之一。可
见,它多么昂贵。同样的数据,同样的事实,我们可能得到完全不同的结论。但是,即使我们买不起香蕉也仍然活了下来。重构,测试驱动开发,也是一样。
尤其是在最艰苦的时候,比如你所用的语言没有测试驱动工具,就更能体现出穷
人方法的必要性。1. 我们假设所有的输出都是向控制台的。至于gui程序,你可以先写一个console版本,让未来要写的gui与console版本使
用相同的业务逻辑库,凡是与计算机的机制无关,而与用户特定需求的,都放这
里。gui消失触发以后,别的啥也不干,调用业务逻辑库中的某个函数。2. 先跑一把程序,整个输出,重定向到一个文本文件里。这时,输出的文本文件十有八九不是你想要的。因为特别简单的程序,会轻量级
到甚至无须测试驱动开发。3. 手动修改这个文本文件,改成你最后需要输出的样子,重命名为
expected.txt。这就是以后我们用以对比的素材了。4. 跑你的程序,改它,再跑,再改。估计好多人都要先改语法错误,让编译通
过。始终把输出由控制台重定向到 output.txt。这样做:假如你有输入文件的话,那么,假定它命名为 input.txt。program.exe < input.txt > output.txt5. 当你需要测试驱动的时候,执行这样一条指令:diff output expected.txt如果啥结果也没输出,成功了。我第一次见到比较成功的时候没有输出,很惊度。
李记者教导我说,diff么,就是找不同,没有不同,它就应该不吱声。如果有任何输出,你的程序仍然没有符合要求,继续改,继续跑。6. 以上,是测试驱动开发。测试驱动开发,是重构的前提。没有测试驱动,一
次次用眼睛在程序输出里找你想要发现的错误或者期待的字符,你就是在构建性
能可怜而其实非常宝贵的人肉计算机。如果不同太多,你又想找特定的字符,请使用 grep。7. 以上的 diff 和 grep 是标准unix系统的小工具,所有的Linux版本里都有。
如果你使用windows,那么,可以下载 mingw & msys,或者 gnuwin
[http://gnuwin32.sourceforge.net/]。8. 关于重构,补充一点。想各种办法,始终保持约20分钟内,代码可以编译和运行和测试通过。尽可能不
要冒险长时间不编译或不运行或者测试不通过。你可能会期待在一个大~~~的不间
断的重构之后,代码一下子跑起来了,而且正常了。这就像打算沿着海岸游泳到达某个地方,我们可能遇到一个海湾,抄近路似乎一
下子就过去了。你可以想像一下,从丹东到青岛,一种方案是沿着渤海湾一次半
公里,另一种方案是取直线。取直线,真的是极富有吸引力。毕竟,我们编程大
半是为了快感,而不是为了资本家。可是,如果你沉了呢,后果很严重。这也是
为什么需要测试驱动开发的原因。小步的迭代,每步都要确保能活着再次接触海岸。我妈说了:宁走十步远,不走
一步险。我曾经4个小时左右,不编译,不执行,不测试,这个期间程序就跟大手术尚未缝
合,根本不能跑。一下子跑起来,是的,非常兴奋。可是,也有几个小时以后完
成失败,甚至回滚到几分钟前都没有意义,只能一下回滚到几小时以前。那种挫
败感也令人印象深刻。这些经历,我知道你也有,就像牛仔的伤疤,如果没死是
大可以拿出来显摆的。不过,还是每天写一点,每小时写一点,20分钟写一点。以微小的可控的单位前
进。像竹子那样,每走一步,就要做个小节。未来无限美好,此刻却虚无飘渺。如果有经理老板导师男朋友女朋友对你这样
说,你就给他讲讲测试驱动开发和重构的道理。----完成所有今天能完成的任务,喝一杯咖啡,然后倒头大睡。人生当如此,哪怕就
此长眠,也了无遗憾。

一见钟情 vs. 众里寻他

一见钟情 vs. 众里寻他1.搜索与遍历一见钟情 与 众里寻他千百度,是爱情的两种境界,这在文本编辑和软件工程中
也经常遇到。我们最经常进行的文本编辑是编程序。请考虑一下这个情境,你要跳到文本的某
个位置。相信有不少人的右手伸向了鼠标,是打算去用滚轮了吧。但是,这并不是最快的
方法,而且是一种打算你思路的方法。什么样的情况最可能发生一见钟情?当你不知道自己想要的是什么样的人。那
么,你就只好一个一个一个一个看下去,直到遇到某一个,你感叹"啊,原来上
天为我准备好的那个人就在这里!"心理学告诉我们,在这之前,你的心中早就有一个对象的原型了。但是,你一直
可能都不知道。你看那一个一个一个一个的时候,每个都要判断,是这样么,是
那样么。如果我们换成众里寻他模式,情况会完全不同。这时,你事先就知道自己想要的
是什么。我们俗一些,比如:年薪百年,年少俊美,恩,还有很简单的要求,大
落地窗,大大的浴缸和大大的床。对了,还有满床的阳光。那么,就好办了。你根本不用一个一个...地看下去。因为全世界绝大多数人都
不符合你的要求。要求越明确就越容易实现,或者被否定。有人可能会说,这本身就是一个学习的过程。爱情我就不懂了,文本编辑的时候
跳转到你想去的地方,那不是一个渐近的学习的过程,而是:要么,你知道自己要跳到哪里;要么,你不知道自己要跳到哪里。如果你一行一行地看下去,停下来挠挠,上上人人网,听会歌,又很心烦,又一
行一行看回去。我打赌一块钱,你不知道自己想要到哪里去。请对比女性和男性去商场买东西。女性可以不断地比较,了解,徘徊,而男性直
达目标,买到或买不到,然后就走了。为什么?因为我们的祖先里,女性是采摘
者,她们可以站那儿比较这个果子和那个果子,果子是不会跑掉的也不会烂掉的。
而男性是猎人,就这么一只兔子,打还是不打,一犹豫,肥不肥,毛色如何,白
不白,可爱么。这些都是好问题,不过,你的兔子已经跑了。更可怕的是,当你在森林中遇到一头黑熊。然后,你开始犹豫。我们应该做的是:断然按下 ctrl-s 输入你想要去的地方,然后回车。接下来继续你的工作。一行一行地看下去,你也会找到想要的地方,但是这中间的过程,会打断你的思
路。这就是目录、书签、回城卷轴存在的目的。当你去找某个朋友的时候,会挨个屋子推开门,然后施施然进去一个个对比么。
先知道你想要的,然后行动。遍历一行行,就是在等待自己终于知道想要的是什么。这个过程也是很美好的,
可叹人生缺少时间去经历。或者,别人缺少时间。2. 搜索 vs. 选择常看到有人这样看网页,一下下往下翻,只右手抓着鼠标,眼睛盯着某一处,别
的地方都不与计算机接触。这是被动的信息获取方式,就像发呆的同学看着老师的嘴一张一合。你同意某个
观点么,你不同意某个观点么,你事先预想了作者可能的观点么,你如何表达赞
同或者反对。还是,你毫无意见,只是想经历一下这个世界。看到不少同学在使用搜索引擎时遇到困难。为什么他总是找不到想要的东西呢?
因为他没有预设当他要表达这个信息的时候,会使用什么样的措辞。更深层次,
因为他不表达。搜索引擎需要你大声地喊出你要什么,然后他帮你找到。在网络上还有另一种东西,与搜索引擎不同的,类似黄页,叫open directory,
比如[http://dmoz.org/]。它像个殷勤的小跟班,老板,你要这个么,老板,你
要那个么。它与搜索引擎最大的不同是:它不需要你*主动*地表达。你只要对某个选项点头
就可以了。想到ABCD单选题了么。当你拥有选择的自由的时候,你失去了所有其他的可能。
只有随心所欲的表达,才是真正的自由。如果心里没有,那么连枷锁都不
需要。主动搜索,而不是选择各种别人提供的可能。武侠小说里的高手们,往往能在对手有弱点的地方,等着对方撞过来。那是因为
他们预判,知道对方要做什么。对未来的预测,也是主动搜索的一种。更高级
的,不是等对方如何,而是引导他去做。3. 规模在信息量少的时候,你当然可以慢慢地阅读。我想这是大多一只手看网页的人这
么做的原因--他的生命有足够的时间。但是,有时不行。比如系统管理员查日志的时候。日志有成万上百万行,你绝无
可能有足够的时间一行行看下去,慢慢形成对故障现象的认识,一行行去看某行
是不是记录了故障发生的原因。所以,你必须事先知道故障看起来应该是什么样子。然后,不是让那些行在你眼
前飞过,抓住符合特征的那行,而是使用grep,用匹配字符串或者正则表达式匹
配来搜索故障。使用这些工具,瞬间,通常不到一秒,可以完成。前提是,你要知道你要想的是
什么。并且,你要用语言描述出来。五笔打字比拼音快的原因,就在于,五笔是不必选择的。时间就消耗在你在一大
堆选项里跋涉。命令行比菜单快的原因也在于此。旋钮的微波炉比按键电脑的容
易使用的原因,也在于此。因为不必交互。如果你找不到你想要的,而他事实上是存在的,十有八九,是你并不知道你想要
的是什么。3. 现实生活而现实是残酷的。我们经常见到点菜的时候,你我就这么做过,我们对付账的人说:随便。我们经常见到领导不明确说出自己想要的,而是等下属提出或实现出几种,然后
点头一种,其余的否定。我们经常见到清宫剧里的皇儿上儿,是这么个发音吧,他一句话也不说,等奴才
们实现各种方案,然后嘉许一种,其余的斥责。我们可以看到,这些主子并不表达自己想要的还不是最糟糕的部分,最糟糕的部
分是他还会对你的实现做出评价。所以,那些能指别人需要却不能或无能说出来的人,都是牛人。比如心理医生,他说:你看,你就是这么这么这么想的,所以这事也没啥。然后
你点头,对啊,我早就该知道我是这么想的。你之外的另一个人,比你更了解你想要什么。但是,说"对对,这就是我想要的那个人",在现代社会,往往是病人,而不是君
主。或者既是病人,也是君主。你是不是点头了?对对,这就是我想要的。我们习惯于在交互中表达。我们说了一小段,然后等别人的肯定或否定,或复
述,然后才敢于或舍得继续下去。而在真正有价值的交流中,这样的沟通太低效
了。当你写作论文,文献,手册的时候,如果你的表达不够清晰严谨,读者要做的比
喝令你闭嘴还简单,他会直接关闭文档转身走开。他绝不会巴巴地问"您老要说
的是不是啥啥啊",然后你说,"着啊,小某子,进步了啊。"这绝不会发生。想要求别人理解领导的心思,需要一个前提,那就是你得是领导。而写论文、文
献、手册的人,往往都是被领导的。哲学家们写作时也是一样。他们思考世界我们啥的都是怎么回事。可悲的是,每
个时代,或者几个时代,才出一个哲学家。他们都非常孤独。我读罗素<西方哲
学史>的时候,每每感叹,谁谁太孤独了,等到一个能读他的人出生的时候,他
都死了好几百年了。如果这些哲学家们以信赖于交互的方式写作,他们对于世界的思考,一行字也不
会传下来。他们边写作边猜测,我们会如何理解这段话,会有二义性么,会误解
到什么程度。我们读不懂,不是他们写得诲涩,而是因为这东西就是这么难,同时,
我们就是这么面。我们面到不仅不清楚领导想要什么,有时候甚至不清楚自己想要什么。人人网上我见到有同学抱怨机房在课前开得太晚了,只有"到点"的时候才能放同
学们进去。我提醒一点:机房的老师要做准备工作。要做哪些准备工作呢,我不权威,只能猜测。机房的卫生(请回想我们扔的瓜果
皮壳和饮料瓶)、重启机器、维护机器处于正常状态、电力系统保养。如果每次课前没有打扫,同学们可能会抱怨卫生不好。如果打扫,同学们可能会
抱怨机房没有"提前"让大家进入。我们有时候不知道自己想要什么,或者,没有意识到我们想要的是矛盾的。又想
让马儿跑,又不想让马儿吃草。不仅同学,老师们导师们老板们领导们也经常如此。4. 表面表面上,我们只要知道自己想要的,就可以搜索了。但是,很多时候,我们所知
道的,不过是表面上的需求。用户需求到分析,这个过程可以use-case driven,让用户讲故事啥的,了解他
们想要什么。他们一定会说真话么?我们自己,说的就是真话么?有人追求传统,有人追求流行。表面上看差异很大,无外乎追求 认同。追求传统
的人说:我是优秀啥啥,才不屑于啥啥。追求流行的人也这样说。但是,在否定自己不是什么人的同时,传统与流行,都不过是*别人的*,老了的
死了的那群人认同的观点,或者当前大众认同的观点。连追求小众的人,都是希望更好地获得小集团的认同。为了小集团,甚至不惜违
背更大范围和更长历史的认同。我们自己,说的就是真话么?我们觉得大人物们渺视我们是他们愚蠢,觉得我们渺视更小的人物,那也是因为
他们愚蠢,但是我们没有质问人物应该有大小么?我们追示隐身查看好友,追求
星星月亮图标的的差异。我们想开宝马车,想坐红旗。表面上,我们追求的是与
众不同,但是,我们追求的是与某一部分"众"不同,期待的是对我们的高等级的
认同,对我们所获得的特权的认同。我们批评学生,表面上是为了他们好,而有些时候,不过是为了维护自己的威权。
更有甚者,我们还可以说:这是为了让他们到社会上的时候不吃亏。我们自己,说的就是真话么?5. 规范以上,搜索时,我们希望自由地随心所欲的表达,但是,这真的那么容易实现
么?为什么会有菜单的存在。是为了规范和限制一部分人的行为。写代码的时候,黄同学告诉我:appfuse会按java规范,把所有下划线删除,把下
划线后的字母转成大写。这可以避免程序员犯非常愚蠢的错误,强制使用骆驼符
号法,同时它拒绝了程序员的自由选择。因为它认为你是愚蠢的,所以,你没有能力自由表达,再所以,你没有资格拥有
自由表达的权利。我们捂住孩子的眼睛,我们给他们一块红布。告诉他们,这个世界是什么样的,
而不允许他们伸出手去触碰哪怕一点点细菌。请不要联想太过丰富,至少在工程上,菜单有存在的必要。不是受用户的智商
所限,而是他们时间太紧,没有功夫接受培训。6. 领导当领导划出道道来,说这就是解决问题的全部可能方案,你只需选择的时候,那
就是你失去创新的时候。那是领导的创新。在工程上,我们按受上级指派的任务,按规定的方案实施。那是因为技术的差异
和责任承担范围的不同,我们在自己的领域内仍然可以创新,不是因为上级的等
级更高,也不是因为上级拥有更多更好的特权。当GFW封住因特网,告诉我们只要看什么就能富国强民创新科技的时候,我就想
起了以上这些。

罗马十二铜表法的进步与软件工程需求与原型实验

罗马十二铜表法的进步与软件工程需求与原型实验"十二铜表法就其阶级实质说,是一部分严格维护私有财产,维护贵族利益的法典。
然后,十二铜表法的颁为罗马法的发展奠定了基石,是整个罗马历史的发展过程
中的一座里程碑。尽管法律条文极力地对贵族的特权地位加以维护,例如,在第
十一表的内容中,强调了"平民与贵族不得通婚"。可是,制定法律并将其以文字
形式公布于众,本身就是法律史上的一个巨大进步。从此,国家对法律行为的有
效、无效、赔偿、处罚等都有了明确的规定,在一定程度上限制了贵族官吏的专
横。"罗马:从共和走向帝制
宫秀华 著
高等教育出版社
2006年7月第2版这个故事告诉我们,在软件工程中,清晰的需求,哪怕是错误的,也比模糊的需
求要好。甚至可以说,模糊的需求比没有需求更坏。陈述观点的时候也是一样,清晰的观点,即使是错误的,也可以拿出来作为靶子
进行充分的讨论。鲁迅先生说:水有的浅而清,有的深而浊,有的浅而浊,有的深而清.世间的人,大凡
可归此四种.宁可要浅而清的人,也不要深而浊的人.所以,我们听完别人的观点,可以复述一遍:我理解的是否你的原意?当我们读完教材或者文献,不妨做个实验,验证一下我们对于理论的理解是否正
确。这就是工程原型。如果原型是错误的,我们的代价相对较小,如果没有原
型,等到工程正式实施的时候,代价则可能是惨重的。当我们操作真实世界的时候,由于要花费水泥沙子木料,所以我们相对谨慎。其
实,当我们操作虚拟世界的时候也是一样,因为我们正在花费更宝贵的东西,你
的时间。尽早发现错误,则损失比更晚发现要少,因为如果错误保持下去,我们还将在此
基础上做很多工作,这些工作都将废弃。尽早发现错误的一个方法就是,尽可能清晰地描述。这就又回到了老问题上:你真正想要的,是什么?