度量 | 敏捷的哲学

我们喜欢度量,只是因为我们害怕不确定性罢了。

拟定的目标,但未成为现实之前,是摸不着的空中楼阁。我们如何确保自己以及众人,做出了正确的努力。度量,是在到达那一天之前,本能之下会想到的办法。遥望远方,时不时回头看下身后的脚印,再一步一步踱往前去。

只是到了一些特定的局面之中,因为我们内在的人性惯性,企业文化的重力,以及微妙的的官僚和政治,原本有着良好意愿的度量初心,就会很容易被极度简单物化成了只需遵从并实现的指标,并挤压在复杂性下做全局优先思考的空间。

于是,度量势必走向变形的另外一面。我们看到了多少以KPI和OKR之名,行下达摊派之实。极度简化的单词缩写,也简化了人们的头脑。结果只能是懒惰的思考,以及唯一放在产出的关注点。目标平庸还好,无伤大雅。而华丽的愿景之下错误的方向,则会引领人们南辕北辙,日暮途穷。在这错误的旅途上,唯指标和上峰至上,各自为阵,彼此倾轧,只见树木不见森林。

而这又会进一步扭曲我们对于当下存在状态的思考角度。认为这就是现实,无力扭转。

我一度也以为,敏捷更关乎开放的心态,无止境的快速反馈和学习,提起度量的态度是暧昧的。即便见证过敏捷起来的收益,但对于心存狐疑的人终究没有说服力。

《加速》里面提到了四个关键指标:

  • 前置时间
  • 部署频率
  • 平均恢复时间
  • 变更失败率

与误入歧途的KPI不一样,这里的关注点则被放在了亟待建设的能力上。

在我看来,它们是尽了最大的可能,给出让人信服但又难以企及的答案。对于我们的理想境地,用它们去描述,虽然平白,但激动人心。但它们终究是经过大量的案例和数据统计得来的,一个完美主义者的美丽新世界。深刻去理解它们,并能理解在它们之下,究竟隐藏着多少持续改进的意愿和努力,才是最难能可贵的。

重要的是,它们确实为我们提供了可以观察的立足点,看到我们进步,以及我们驶往的方向。

(谢谢王妮的建议)

Share
 

持续改进 | 敏捷的哲学

重要的是持续优化的过程,最终交付只是作为副产品之一产生,顺水推舟而已。

记得在某个场合,跟仝键有这样大致的对话。

面前一段旅程,从起点出发,往着目标进发。这是每个人都会有的功课。对于组织而言,要有自己的目标,商业盈利还是社会公益,也都无可厚非。但我们多少已经习惯,目标的实现,即等同于定义的成功。全神贯注于目标,并致力于实现它,成为普世意义上唯一衡量是否努力的标准。

但在软件行业,是否存在另外一个可以思考的空间。

软件构建相比较其他行业而言,最大的一个区别莫过于,它是知识消费和创造的过程。从业务诉求和价值定义,所有与此相关的信息在人们的头脑和言语间传递和转换。令人失望的是,除去那些自欺欺人的所谓满意以外,我们并没有足够的经验和能力,能表明我们在这些信息承转之间,获得到了足够的心安理得。需求模棱两可,在过程中反复无常,曾经自以为的目标交付物也可以沦落到谬以千里,触目惊心。

瀑布方法已经被证明一板一眼无法再有面对不确定性的从容。敏捷以适应性和响应性,挺身而出。敏捷之中诸多的原则和实践,是显而易见的改进手段,唾手可得,耍将起来也煞有介事。短时间取得显而易见的效果,本就是理所当然。它们一度填充了人们在恐惧面对不确定性洪流时的安全皮筏。但人们也就此误以为,这就是可以赖以顺流直下的救命稻草。

然后就此认为改进完成,已然敏捷。

如果仅仅是就此原地踏步,也算万事大吉。但无奈怎样都会是事与愿违。敏捷实践的整体性诉求,以及企业组织和文化的惯性,总是很容易让团队的微弱努力顷刻烟消云散。不安全感再度笼罩。

迎难而上的改进,是向不确定性讨要回掌控感的本能。但一如字面意义,持续改进,难的不是改进,而是在持续。

持续二字,既是对改进这件事一如既往的执着态度,也是对不确定性和不安全感出自内心的认可。适时后退一步,并不意味着低头,在后退间反而得到片刻静默,以及观察的机遇。

历经辛苦,找到改进的良药,实属不易。解决了一个技术难题,或者澄清了纠结已久的需求,都是件值得庆贺的事情。当下的事情,都可以某种更明快的节奏往前推进。怎么都被看做一件值得庆贺的事情。但起点(需求)和终点(目标)对于确定性的双重挤压,仍然会将我们置回于似曾相识的失落境地。不再奏效的不只是曾经成功的经验,还有尚未消失殆尽的成就感。

这时候,我们可曾有过妄议,哪怕迈出大胆的一小步,质疑我们开头来的路,以及我们要去的方向。

Share
 

轮子还是要重复发明的

“不要重复发明轮子”,很多开发者在新入行不久,就经常会被这样叮嘱:这个世界上程序员已经太多,遇到的问题已经够多,而解决方案层出不穷。你走过的路,跳下的坑,已经有无数的先驱在你之前路过,跳过。

所以在做技术选择的很多时候,你不需要自己从头去实现一个东西,就可以在现实世界中找到现成的趁手的利器,小到一个类库,工具,大到一个框架,平台,来满足自己的“需求”。你以为你看到了绝美的风景,后面是一马平川。

invent-wheels而这,只是不愿意拒绝懒惰和诱惑的借口,背后很可能面临更多的困难,陷入其中不得自拔。

开发者在技术选型的过程中,很容易对已有的神往已久的某个技术或者工具情有独钟。

“什么都是现成的,直接拿来用(一套)就好了!”

而往往忽略了它们在后期定制化需求,或者弹性及扩展方面对自己可能存在的限制。下面看两个例子。

关于构建工具的例子

比如Maven在Java的世界里很长时间都是主要的自动化构建工具,它的插件化结构,提供的很多现成的archetype和插件,以及命令行和插件化扩展的可能让很多程序员眼前一亮。

而随着手头的项目变得愈加复杂的时候,你会发现Maven的XML声明式结构和插件化,恰恰是阻碍自身伴随项目复杂度进化的绊脚石,因为它缺乏灵活性,以及对于自动化测试实践的支持,尤其在持续交付方面。

Ant有同样的问题,我们不断发现团队在不可维护的Ant和Nant构建脚本上耗费了巨大的精力。由于工具自身与生俱来缺少的表现力以及清晰的模块性,这些脚本难以理解和扩展。

XML配置文件中太多让人觉得多余的尖括号,以及粗糙的插件架构。虽然语法问题可以通过升级换代来解决,但插件化架构严重限制了构建工具随着项目变得愈加复杂自我优雅进化的能力。我们发觉插件的抽象层次是错误的,相反我们更青睐基于语言的工具,比如Gradle和Rake,因为提供了细粒度的抽象,以及更多的灵活性。

Gradle是一个把理智带入企业级构建世界的尝试,它把划时代的技术和最佳工具组合相结合。Gradle可以让你访问你已有的Maven仓库,但通过清晰的领域特定语言为你的构建添加脚本功能。

logo_for_Gradle

相对于像Ant和Maven这样基于XML和插件的构建工具,像Gradle和Rake这种基于语言的构建工具,在持续提供细粒度的抽象和更多的灵活性。这样它们就能伴随项目变得越来越复杂而随机优雅地应对。

关于前端可视化框架的例子

另外一个例子是关于前端(可视化)框架的选择上,一些提供了丰富UI渲染样式的框架库很是夺人眼球,漂亮的表格和图表样式,简单的Demo示例代码,让开发人员都以为这是实现当下棘手UI需求的不二法宝,可以极大地提高开发的效率。

比如ExtJS,开发人员在经历了初期的甜蜜之后,会发现他们很难控制Ext渲染出的HTML和DOM,而编写功能测试代码看起来也不太可能,尤其是当对UI的外观和样式有个性化的定制变化需求时,会显得一筹莫展。

Ext会把你限制在它的UI实现思想框框里面,这样也许可以在那些不需要投资UX的团队里面工作得很好。

Highcharts是个另外一个例子,丰富的图表类型,以及基于提供的图表类型的定制化功能,优异的JavaScript引擎,对HTML内嵌SVG文档的支持,一度是我们在项目中选择前端图表展现库的不二选择:

highcharts

但随着对图表渲染的个性化UX定制需求的加入,我们会发现Highcharts通过公开API提供的很多灵活性,比如对于X轴、Y轴和渲染细节的定制,已经很难满足我们对更多图表本身的修改,和添加新的样式。

而这时候,如果不是让UX设计迁就Hightcharts既有的实现,也许更好的选择是D3,虽然它会在开始显得底层,需要团队更多的精力来创建通用的不那么复杂的可视化元素,但这也意味着更多的灵活性,加上它的插件模型,以及像Rickshaw和Crossfilter这样的库支持,会让D3比以前更具亲和性。

最后

所以对于技术的官方网站提供的所见即所得的特性展示,简单的示例代码,和想当然的心满意足,开发者需要在接受诱惑的同时,多考虑一些在技术投资后可能存在的风险,以及是否有足够的支持。

需要考量的因素和角度可能但不限于:

  • 文档和社区支持的成熟度
  • 复杂的代码示例
  • 可能的功能性需求变化
  • UI呈现上可能的需求变化
  • 性能,安全等非功能性需求
  • 团队知识和学习能力
  • 后期的维护成本

需要针对这些因素,做一一的评估和侦测,才能最大限度地保护成本的投入。

有的时候,你真的需要重复发明轮子。

Share
 

写作,我写什么?

这篇是关于技术写作系列的第三篇,在尝试解决为什么要写,以及怎么写的问题后,让我们来看一下关于能写什么的问题。但在进入具体的问题,给出一些可能的选项之前,我们首先需要回答的问题是,我为谁而写,写的目的是什么,这两个问题。

what-to-write

写作的目的,受众是什么

按照我自己的写作经验,当开始说我像写点东西,小到一篇文章,大到一本书,这两个问题恰恰是最容易被忽略的。而忽略这两个问题,产生的结果就很有可能是,文章的定位不清楚,读者也很难get到你想在内容中表述的点,成了自说自话,王顾左右而言他的局面。

如果期望自己的内容能在网络发布,或者在一些知名的媒体发表,能影响到更多人,和自己的思想产生共鸣,就要认真考虑这两个问题:

  1. 我写这样的内容是为了什么?是为了展示我对卓越新技术的追求,对技术的深入思考和经验所得,还是展现自己对商业领域知识的掌握。也许会有更具体的目的,比如为了呼应和反驳之前网络上出现的一篇文章。
  2. 我这样的内容的目的受众到底是谁?是有着怎样背景的人,有着多少年经验的人,是大概担任怎样职位的人?为什么他们会对我的内容感兴趣,愿意读下去一直到底,甚至愿意为我传播分享这篇文章给更多的人?我希望她们能得到什么,从我的内容中。

举个例子,例如这篇文章《敏捷软件测试常见的七个误区》,可以分析这篇文章写作的目的是为了分享作者近十年来,结合实际的项目经验,在敏捷测试领域对于自己经验的总结和回顾。而针对的目的读者,就是那些同样从事测试领域工作,但对敏捷测试还不甚了解,或者是刚开始尝试敏捷测试的人,他们对敏捷测试的理解还不到位,对于敏捷测试的那些坑还没趟过,而这样的内容对于他们是很有帮助的。

写作线索的来源

我跟我的同事说,其实什么都可以写,可以写的东西很多啊,但我看到的仍然是面露难色。那现在我给大家介绍一下具体的可以尝试想和写的线索:

Lightening Talk on Insights

就像你能从这幅图里面所看到的,我们可以从日常工作和生活中太多角度,得到写作的灵感了,下面是一些其中的例子:

  • 刚刚解决了一个很难克服的问题。在自己耗费了半天时间,请教了同事,翻查了不少资料后,一个棘手的问题终于被解决了。而这个问题可能只是未来出现的诸多问题之一,要保存对解决方案的记忆,以及分享给更多可能面临这个难题的人,写一篇文章记录下来就是唯一的出口。我的经验是,当过一段时间再次面对这样的问题是,脑子里的答案早已淡去,而当初自己留存的文章记录帮了大忙。
  • 团队在头脑风暴时候的一些想法。“三人行必有我师”,当有更多的人和自己一起动脑经的时候,冲突和想法也会指数级的上涨,而不做记录甚至成文,也是很大的浪费的。
  • 从失败中得到的教训。失败了,也许不会有再次经历同样状况的机会,但对自己的将来,和可能经历同样情形的他人而言,记录的经验会让人获益良多。
  • 从自己阅读的几篇极好的文章中的所得。站在巨人的肩膀上,总是可以有更好的视角和新的发现。所谓的创新也是从前人的研究和总结中来。阅读了几篇同样主题的内容,沃恩总可以有新的角度,或者更高的角度,来看待这个主题。而记录下所思所想,就是一篇新的内容。

情绪写作

这是我自己个人的经验,而我认为这可以提醒到那些实在对周遭正在发生的线索不敏感,而且对上面这幅图中提到的诸多可能一筹莫展的人,那你可以尝试留意你自己的情绪变化。

当你对团队中发生的一些事情表示不满意,敲桌子,大声咆哮的时候; 当你对面对的代码无法容忍,憋着气要对它大动干戈的时候; 当你对一项新技术突然冒出来,你觉得它能极大改善你的工作方式,你对它充满无限激情和饱满兴趣的时候; 当你以一种平和甚至感恩的心态,看着周围发生的一些积极的变化的时候,内心里欣慰自己的努力没有白费的时候;

这些都是你的情绪在发生一些甚至激烈的变化,而这就产生了一些可能,让自己把自己的情绪写下来的可能。

我把这样的过程称作“情绪写作”。

相比较正常状态下的写作过程,情绪写作难能可贵的是,自己的情绪可以支撑自己连续写作很长一段时间甚至一蹴而就。在基本完成后可以离开一段时间,再回头重新打磨,甚至考虑祛除掉那些因为情绪所带来的,对于主题没有帮助的部分,让内容本身主题更加明确,目的性更强,或者显得更加理性。

最最不该做的就是任由情绪稀释,白白流失掉一次很好的写作机会。

最后

到这里,关于写作的三个问题就基本回答完成了。怎么写为什么写,写什么,似乎是当我们面对写作的时候,最首当其冲要解决的问题,而解决它们也不会一蹴而就,甚至可能会在纠纠结结,反反复复中徘徊。

但一旦解决了愿意去写,知道写什么的时候,剩下的问题就好办了。

Share
 

解读ThoughtWorks技术雷达

接地气的技术雷达

ThoughtWorks在每年都会出品两期技术雷达,这是一份关于技术趋势的报告,它比起一些我们能在市面上见到的其他各种技术行情和预测报告,更加具体,更具可操作性,因为它不仅涉及到新技术大趋势,比如云平台和大数据,更有细致到类库和工具的推介和评论,从而更容易落地。

这是2016年4月份的技术雷达全貌:

2016 April tech radar post

其中,自上次雷达发表以来新出现或发生显著变化的技术以三角形表示,而没有变化的技术则以圆形表示。每个象限的详细图表显示各技术发生的移动。

技术雷达对于不同层级和水平的技术从业者,有可以从不同角度和分类进行解读的可能。不管你是个人开发者,对于新工具和技术有执着的追求,寄希望于从新工具和技术那里获取改进每日工作的灵感,或者你是技术领导者需要针对自己的系统做技术选型,以及对未来技术趋势的把握,技术雷达都会是一份很好的参考。

而如何解读技术雷达就是变成一件很有意思的事情,解读方式可以帮助我们更有效地利用它。下面会介绍几种观察技术雷达的不同角度。

这里可以下载到最新版本的中文技术雷达。

… 

Share
 

每个人都是内容营销者

在聊了怎么用精益创业的思维开始写作怎的问题之后,我们来尝试回答一下为什么要写作这个问题。而这个是本源问题。

full_res0415

其实这是个老生常谈的问题,很多具有丰富写作经验的朋友或者同事,已经给出过无以复加的观点。

下面是我很认可的几个:

回到写作这件事情,抛开那些“总有一天”才能实现的好处外,眼前的好处无外乎就是帮助我们记录理解消化沉淀学到的知识了。不过我们的内心里总有一个声音反复出现:反正书看了,Session听了,感觉知识已经学会了,那还值得花时间写么?我用这个时间多学点东西不更好?

你越是不开始书写,总是拿有限的思维缓存去默想一个问题,就越是没有内容可以写,如果你逼着自己将一些不成熟的想法写下来,看着自己写的内容,试着进一步拓展它们,就有可能在理性的道路上走得很远,很远。

… 

Share
 

用精益创业思维开始写作

我的周围有很资深的同事,进入软件这个行业没有十年也有五六年,我和她们在一个项目中工作时,往往惊讶于她们处处显现的真知灼见。她们会很轻易地点出设计上的短板,流程上的浪费,还有潜在的缺陷,然后轻轻挥一挥手离开,留下我们傻傻地坐在屏幕前,一身冷汗。

而我试图抓住潇洒的她们,说可以把这些宝贵的实践经验写下来,分享给更多人的时候,得到的回复更多是:

啊,我没写过文章啊,不知道怎么写?

这些都是常识啊,很多人都写过了吧,还有什么可写的?写出来谁会看啊?

我实在太忙了,项目家里一堆事儿,顾不上写了。

这是三个问题,我们一个一个来解。今天,我们先解第一个。

很有意思,在我们组建团队,开始构建软件的时候,我们已经习惯了拥抱变化,我们说不变的是需求的变化,我们接纳这样的变化和挑战,我们对它习以为常,我们认为这样才是解决软件需求之道。

我们会和客户以很小的迭代周期进行频繁反馈,然后上线,或者改进,去交付最终的价值。但让人好奇的是,我们对待写作的态度却一直没有怎么变化,没有对待软件变化那样宽容,而是一如从前。

… 

Share