透明思考


Transparent Thoughts


  1. 三人成众

    一个人是孤单的,就像“人”字,只能自己支撑自己。

    两个人的团队,如果不是互相对立的话,就难免有一人比较强势。如同一个“从”字,主从关系往往确定下来就不易改变。

    四个人或更多人的团队,就常会分裂成小帮派。

    三个人的团队是个绝配。三人成“众”,既互相支撑,又互相平衡,均势来回变,难有某一人永远强势。一起出现,三人不显太多;分开行动,一人两人可以灵活配置。

    而且争吵能得到有效控制。一旦两人出现争执,另一人便可客观评判,居中调停。而且这次的旁观者下次就可能成了争执的一方,这次的争执者下次又换了调停的角色。于是每个人在身涉争执时大可各执一端畅所欲言,因为信任旁观者已有准备平息战火。于是争执也常被带往健康的方向。

    所以如果去陌生而紧张的环境工作,三个人的团队是很好的选择。


  2. 测试驱动咨询

    当别人求助你解决一个问题时,第一件要做的是什么?

    不是挽起袖子解决问题。不是诊断症结在哪儿。甚至都不是问5个why。

    首先要问的问题是:

    • 如果这是一个问题,用什么数据能体现它?
    • 如果问题被修复了,从这个数据上是否能反映?

    然后,把度量放下去。每个度量项要有几个要素:

    1. 哪些数据?
    2. 如何得到数据?
    3. 以什么频率采集数据?
    4. 如何发布结果?

    按照这几个要素制定一个跟踪度量方案。用这个方案先采集现有数据。根据现有数据定一个改进目标。

    这就是你的──正在失败的──测试。先把测试放下去,然后再提任何改进措施。


  3. Sponsor的价值所在

    今儿给麦罗打电话的片段摘录…

    • 我:俺们SVN server装Windows上,用个32位Apache做前端,那玩意有2G内存限制…
    • 麦:一,用Windows做SVN server。二,代码库很大。三,很多人同时访问。
    • 我:对头~~
    • 麦:你在XX公司?

    知音啊~~我又内牛满面了~~介个就是Sponsor的价值亚~~


  4. 设计问题多于方法问题

    比如说吧,产品和平台之间依赖好严重啊,产品还经常要修改平台的代码;特性组和支撑组之间耦合好紧密啊,支撑组的代码都得到特性组去验证和提交。敏捷怎么解决这些问题啊?还有啊,开发人员总是几个故事一起做,做出来的故事测试人员发现没法测。敏捷怎么解决这些问题啊?

    还有啊,架构思想都没有传达到开发人员啊,都做乱掉了;持续集成工具的专家他不属于开发团队啊,出问题找他支持好麻烦啊;测试工具的专家…嗯,最近的一个离我们大概有一千公里吧。敏捷怎么解决这些问题啊?

    这些不是方法问题,是设计问题。设计很简单。单一职责,DRY,OCP,依赖倒置,接口隔离,就这么些东西而已。但简单不等于容易。写代码的时候不会设计,划分模块的时候同样不会,划分产品的时候同样不会,管理组织机构的时候还是同样不会。一个软件组织不让员工学会写代码,其结果就是设计问题出现在所有地方。

    还有个下半句:管理问题多于能力问题。

    我们很想提高工程人员的技术能力啊,应该怎么让他们学习啊?我们这些实践影响的人太少啊,怎么快速复制到成千上万人啊?──想要事情做下去,不走样,就得去关注所有的细节。拍一个任务下去,你周五之前给我完成,我只看结果。完不成怎么样?时间过去了,能力还是没提升,问题还是没解决。这就是所谓粗放式管理。一层一层都说,行,我支持,大家去学习吧──你不去手把手的教着他,他除了变成蘑菇还能变成什么?

    管理细节也很简单。代码的坏味道有没有重构?每个函数有没有测试?每次提交的注释是不是符合规范?但简单不等于容易。写代码的时候不会管理细节,做管理也同样不会。一个软件组织不让员工写好代码,其结果就是管理问题出现在所有地方。


  5. 持续不能集成

    持续集成只是信息源。持续集成的检验是在代码提交之后而非之前进行的,因此持续集成的作用只是使项目健康情况可视化。并且这种可视化必须建立在构建经常成功的前提下。因为软件本身的复杂性决定了只有“是否达到质量要求”能够被简单度量,而“达到(或不达到)质量要求的程度”无法被简单度量。所以,如果构建经常失败,持续集成所能提供的信息就只剩“项目一直不健康”──这个信息的价值很小,如果不是完全没有价值的话。

    让持续集成保持经常成功,必须规范三件事:

    1. 提交代码之前必须更新
    2. 提交代码之前必须进行本地验证
    3. 线上构建失败时不得进行任何提交(或更新)

    如果做不到这三件事,持续集成就可能降格化为持续不能集成:你知道项目有问题,但不知道问题出在哪儿,也不知道该如何解决这些问题。

    为了避免这种降格化,在持续集成到位之后,需要用更多的手段确保三点规范得以落实:

    • 代码库和持续集成分级
    • 责任逐级下压
    • 建立提交前本地构建基础设施

    要言之:持续不能集成会使持续集成的价值降低到约等于0(甚至低于0)。要避免持续不能集成的发生,第一要严格规范,第二要提供技术手段使规范能够被落实。


  6. 滥用缩写和意义的缺失

    《ThoughtWorks文集》的第六章这样写道:

    我们总会不自觉地在类名、方法名或者变量名中使用缩写。请抵制住这个诱惑。缩写会令人迷惑,也容易隐藏一些更严重的问题。

    不光是在程序中。这个庞大的组织里充斥着形形色色的缩写。角色有缩写(SE、DE、PO、PL、TL、TPL…),测试种类有缩写(UT、ST、SDV、SIT、HLT、LLT…),文档类型也有缩写(PR、SD、SRS、TC…)。

    缩写不仅会令人迷惑。“更严重的问题”是,当人们习惯了铺天盖地的缩写,大脑就会麻痹而停止思考缩写所代表的本体是什么。于是人们就只是凭着惯性把一个缩写和一个既定的东西联系起来,而不去思考两个问题:

    1. 这个东西存在的价值是什么?
    2. 如何改进现有的东西使之更好地达成其预期的价值?

    当我们说出一个完整的、有意义的名称,大脑是在思考这个名称所指涉的意义。例如当我说自己是“techlead”,我就会下意识地想:我做的事,第一有没有“tech”的性质,第二有没有“lead”的性质。而当大脑习惯了“TL”这个缩写,扮演这个角色的人们也就不会在下意识中不断审视自己,从而使无数细节改进就此浪费──或者从来就没有出现过。

    这个庞大的组织相信,目的重于过程,实质重于形式。但我们谈论的是沟通。麦克卢汉说,媒介即信息。沟通的形式就是实质,沟通的过程就是目的。不在意形式的沟通,其结果就是传递的信息直接降格化为无意义──例如这些缩写。


  7. 《ThoughtWorks文集》精选版可以下载了

    在帮助客户实施敏捷的过程中,ThoughtWorkers常被问到一个问题:有没有一套标准的“敏捷模板”可供快速入门之用?

    作为一种强调持续改进的方法学,自然不会有一套放诸四海而皆准的“标准流程”;但对于希望采用敏捷方法的组织和个人而言,若有一组普遍适用的最佳实践作为基础,便能少走许多弯路,以期事半功倍之效。

    摆在你面前的,正是这样一本“敏捷入门手册”。

    本迷你书从《ThoughtWorks文集》的13篇文章精选5篇编撰成集。这几篇文章有一个共同点:它们介绍的是一些最根本、最易施行、又最能立竿见影的敏捷实践。藉由这几篇各自独立而又相互关联的文章,我们希望帮助读者从持续集成和测试入手,建立行之有效的项目健康保障体系,并掌握必要的面向对象编程和重构技能,从而切实提升软件质量,并为更进一步的改进打下坚实基础。

    如果你喜欢本书,可以购买原版《ThoughtWorks文集》

    或在InfoQ中文站免费下载这本书(PDF)


  8. 博尔赫斯风格的培训

    今天培训的主题是,站立会议和回顾会议。

    于是,我们先讲,站立会议是干什么用的,应该怎么开,常见的坏味道有哪些,小技巧有哪些。

    讲完站立会议,就开始讲回顾会议。大家一起读一遍回顾会议宣言,然后讲回顾会议是干什么用的,应该怎么开。

    然后,大家就一起来开一次回顾会议吧。回顾的主题是:我的站立会议。

    于是大家开始回顾,各自团队的站立会议开得怎么样,哪些地方做得好,哪些地方可以改进,有什么点子,等等。

    一边回顾,一边继续讲解,“这就是回顾会议的要点,大家记下来了吗?”

    回顾做完,针对“站立会议讲太多细节”和“团队成员参与度不高”两个最受关注的主题,得到了一系列切实可行的改进措施。

    同时,怎么做回顾会议,也就学到手了。

    这培训做得,颇有点像博尔赫斯小说的风格。

    (还有从胡凯那偷学来的小技巧,着实精妙得很啊。)


  9. 对象健身操:九诫

    1. 方法只使用一级缩进。
    2. 拒绝使用else关键字。
    3. 封装所有的原生类型和字符串。
    4. 一行代码只有一个“.”运算符。
    5. 不要使用缩写。
    6. 任何类的长度不能超过五十行。
    7. 任何类中的实例变量不能超过两个。
    8. 任何包含容器的类不能再包含其他的成员变量。
    9. 不使用任何Getter/Setter/Property。

    阻碍我们写出好代码的,首先是根本不知道代码能写多好。


  10. 结构化沟通框架

    每次沟通活动(会议)应该有以下元素:

    1. 动机:每个会议应该有且只有一个动机,声明沟通的涉众
    2. 目标:每个会议最好有且只有两个目标,一个针对现状的信息传导,一个针对将来的行动
    3. 实践

    例如,standup meeting:

    1. 动机:全团队每天的内部沟通
    2. 目标:
      1. 每个人了解团队整体当前进度
      2. 触发针对问题的后续详细/小范围讨论
    3. 实践:
      1. 每个人讲三件事:昨天做了什么,今天要做什么,重要的事项和问题
      2. 所有人对所有人讲话
      3. 小范围的详细讨论被及时中止并放到会后

    再例如retrospective:

    1. 动机:全团队周期性的回顾
    2. 目标:
      1. 增进信心
      2. 促成改进
    3. 实践:
      1. 就事论事,对事不对人
      2. 具体,每个条目只说一件事
      3. 讨论最受关注的条目,每个条目要有后续行动和负责人