美女放电还是整形-从《人月神话》误译谈状态机图

103 阅读4分钟

DDD领域驱动设计批评文集

欢迎加入“软件方法建模师”群

《软件方法》各章合集

在重审《人月神话》中译本的过程中,发现一处较严重的误译。

原文是:

the first milepost is not reached until two months have elapsed.

原译为:

两个月之后,第一个里程碑没有达到。

应改为:

两个月之后,第一个里程碑才达到。

回想责任,当年(2001-2002)审校时没有对着原文一句一句审,觉得译文无大的逻辑问题的地方就过了,有问题才标注并找原文对照。

意思都译反了,还觉得没有大的逻辑问题吗?以当时的水平,还真的是没觉察。

译得不对,首先是英语知识有缺陷(当然领域知识缺陷也会影响);看着译文没有觉得不对,那就是领域(此处即软件工程领域)知识有缺陷了——当时的知识不足以体会出作者真正想表达的意思。

不过,本文的目的不是追究责任或者辩解,这方面内容参见此文:

这回真要动刀子-征集《人月神话》中译本的翻译修正>>

本文说的是由此联想到的学习英语的问题。

如果不是已经熟练到习惯成自然,被not……until或类似的结构困扰是很常见的。

如果从状态机的角度来理解,会很有帮助,如下图:

过去分词“not reached”相当于形容词,放在系动词be后面作表语。用状态机表达就是:

【先声明:我英语一般,以下内容如果有用词不当之处,烦请指出。】

我们也可以把状态“not reached”换成一个不带not但意思差不多的“形容词”,例如“being worked on”。

因此,下面的句子应该也是可以的(吧?)。

比较两个状态名称,我们会发现,如果在过去分词和现在分词之间选择一个作为状态名称,应该优先选过去分词。像上面的例子,“not reached”优于“being worked on”,我们把输出的行为(用主动语态,原因可自行体会)补上就知道了:

可以看到,如果用现在分词“**中”作为状态名称,状态和状态的内部活动可能会重名。

但是,现在分词作为状态名称并不是最差的。最差的状态名称是“to **”(待**),因为它强烈暗示(耦合)了允许接收的事件。

你想想,你的状态名字都叫“待审核”了,不就已经暗示这个状态下能接收的事件就是“审核”了吗!

同样,虽然过去分词>现在分词>不定式,但过去分词也并非最佳选择。

最佳选择是描述性形容词,即:

描述性形容词>过去分词>现在分词>不定式

注意,这几种都可以用作状态名称,只不过如果前面的选项有合适的名称,优先选用。

我们用人举例,玉凤比较丑,她看上的人类高质量男性看不上她,她想变美。

变美有很多条路线,可能有(1)连续三年坚持锻炼注意饮食早点睡觉(2)整形(3)外星基因改造

玉凤选择了整形。

整形完毕后,玉凤拼命放电,果然有人类高质量男性和她结了婚。

我们把这个故事相关的概念画成不同的状态机图:

①最佳。没有暗示进入或离开的事件,要变美,可以整形,可以锻炼,也可以基因改造;美了,可以结婚,也可以干别的。

②不好。暗示了进入的事件,但比④要好,毕竟“整形”是已经发生过的,“已整形”至少没有暗示任何离开的事件。

③更不好。有把状态和状态下的行为混淆的可能,或者说,把状态和内部行为绑定,不过,没有暗示进入或离开的事件。

④最不好。暗示了离开的事件,“待结婚”状态下接收的事件就是“结婚”呗。

可能细心的同学会发现,②③④涉及的概念都是3个:整形、放电、结婚,其中一个刷了两遍,而号称“最佳”的①却多了一个“美”,这是不是多余?

对的,状态就是多出来的概念。

至于为什么需要“美”这样的冗余概念,可以参见我的另一篇文章《DDD话语批评之一:评“状态和事件本质相同”》>>

33套UML/SysML+EA/StarUML的建模示范视频-全程字幕(20230217更新)

[架构师强化]6月5-7晚8点使用状态机整理领域逻辑和生成代码-网络公开课

[产品经理强化]业务建模和需求高阶5月29-6月2日晚8点网课

CTO也糊涂的常用术语:功能模块、业务架构、用户需求……[20210217更新]

如何选择UMLChina服务

作者微信:umlchina2