April 05, 2017

漂亮的with,鱼与熊掌可以兼得

假设要加载磁盘上的一个文件,并以二进制形式读取文件的数据。若要从健壮性的角度考虑,需得考虑两种异常情况:

加载文件失败,例如给定的文件路径并不存在该文件

读取文件数据失败,例如磁盘扇区有故障

显然,生活中总是存在着例外,我们不能乐观对待,还得未雨绸缪,唯有对这些异常情况做充分判断,由代码组成的软件系统才够健壮:

case File.read(path) do

{:ok, binary} ->

case :beam_lib.chunks(binary, :abstract_code) do

{:ok, data} ->

......

March 26, 2017

推行TDD的思考

我在参与的开发项目以及咨询项目中,都有实践TDD的经验。直至今日,我仍然会在某些功能开发时采用TDD的方式实现功能。虽然没有达到将TDD溶于开发血液之中形成自然而然的习惯,但至少也是我常用的编程利器之一,偶尔使用,效果还算不错。

以下内容则是我在某大型团队中推行TDD时的一些思考。当时的整个咨询过程,至少在TDD推行上可以称得上是举步维艰。如今看来,这些思考仍有现实意义。

目前看来,我在推行TDD过程,主要的障碍有如下几点:

开发人员的质量意识;

分析需求并进行任务分解的能力;

将测试作为开发起点的开发习惯;

开发人员的重构能力,包括如何识别坏味道和如何运用重构手法;

单元测试的基础设......

March 26, 2017

对微服务的简单思考

最近,阅读了文章《微服务架构在Netflix的应用:架构设计的经验教训》,引发了我对微服务的一些感想。大约这些感想平日都在大脑里装着没有声响,这篇文章算是酵母,投进去,发了酵,开始有些微醉薄醺的味道了。

这篇文章介绍了Cockcroft的微服务架构经验。Cockcroft是Battery Ventures公司的技术人员,是微服务和云架构方面著名的布道者,目前供职于Nginx技术咨询委员会。

一直以来,微服务虽然风生水起,不过却没有什么靠得住的定义可以得到多少人公认的。Cockcroft对微服务的定义却引起了我的注意。定义如下:

由松耦合的有相应语境的元素构成的一种面向服务的架构,松耦合......

March 26, 2017

或许是领域建模的真相

我们一提及领域建模,就好像回到了石器时代。然而这个谜题至今还未解决,就好像穴居人的生存方式,我们只能猜测、推测以及演绎,却不能真实复现。

Martin Fowler的《分析模式》总结了诸多领域分析模式,Eric Evans开创了领域驱动设计的办法,至于还要老的CRC方法,用例驱动,ICONIX方法以及稍新一些的四色建模法,都在尝试领域模型的建构,结果仍然差强人意。

这个问题或许是Mission Impossible,因为领域逻辑其实是一个复杂系统,系统中的模型如三体一般互相影响,却又隐没在混沌中,并不真实清晰地凸显出来。

在许多项目中,我多数采用混合手法进行建模。CRC、用例驱动、领域驱......

March 23, 2017

代码诊所续

几年前,我有机会负责一个项目的咨询。团队很小,目标是对旧有系统的后端用Java改写,而团队的开发人员全为C程序员。我的工作职责是负责项目设计、开发,以及担任项目开发过程敏捷化的教练,并培养Java开发人员。

我在团队工作室的墙角落,开了一个小小的诊所,广而告之——“每日一贴,包治百病”。这是当时我在项目上的第二次诊断。

第一条:变量的声明(定义)应尽量与使用放在一起

本规则与代码的可读性有关,倘若方法还没有保持短小,这个问题就更要命。或许这是C语言开......