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

news2024/11/22 14:38:37

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更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中常量基础知识

1 问题 什么是字面常量? 2 方法 拿第一行输出语句来说,这行代码输出了 “hello” 这个字符串,无论何时何地运行程序,输出的这个字符串都不会变,这就是字面常量。 定义:常量即程序运行期间,固定不…

chatgpt网站优选集合

目录 chatGpt 国内镜像网站集合 chatgpt接入微信 chatgpt接入谷歌浏览器 chatgptAI绘画 最后 chatGpt 这个说实话,不用我介绍大家也都懂。不如玩一个有意思的,这里我让chatGpt自己介绍一下他自己: 嗨,大家好,我是…

C++ [STL之vector模拟实现]

本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT STL之vector模拟实现 前言正文空间结构默认成员函数构造函数拷贝构造函数赋值重载析构函数关于数据拷贝问题 迭代器容量操作查询容量容量操作 数据访问下标访问头尾数据访问 数据增删尾插尾删重…

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前,我们需要知道为什么我们需要缓存。在了解这三个问题后,我们也必须知道使用Redis时,如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…

Linux学习笔记 --- Linux基础命令Part1

一. Linux的目录结构 目标:1. 掌握Linux系统的目录结构 2. 掌握Linux系统的路径表达形式 1.1 Linux系统的目录结构 我们知道,在操作系统中,文件系统的目录结构一般都是树形结构。Linux的目录结构是一个树型结构Windows 系统可以拥有多…

如何使用wireShark抓取还原文件

简介 WireShark的追踪流功能可以帮我们抓取从网络上下载的各种文件,接下来就演示下如何抓取并且进行还原。 使用Nginx搭建文件存储服务器 只要是通过http网站下载的包,都可以通过追踪流工具进行抓取。这里为了演示,临时搭建一个Nginx文件存…

Yolov8涨点技巧:MobileViTAttention助力小目标检测,涨点显著,MobileViT移动端轻量通用视觉transformer

在​crack缺陷检测项目原始0.739提升至 0.772 ,涨点明显,博主多个数据集亲测有效,实现暴力涨点; 现有博客都是将MobileViT作为backbone引入Yolov5,因此存在的问题点是训练显存要求巨大,本文引入自注意力的Vision Transformer(ViTs):MobileViTAttention 1. MobileViT介绍…

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一

English Learning - L3 作业打卡 Lesson3 Day18 2023.5.22 周一 引言🍉句1: People said my mother was “a good egg”.成分划分弱读连读语调 🍉句2: She would always help anyone in need.成分划分连读语调 🍉句3: We never had to “walk…

1、MQTT协议入门以及mosquitto示例

1.什么是MQTT MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上&#xf…

一款好看的markdown编辑器:md-editor-v3

文章目录 md-eidtor-v3地址其它markdown编辑器🎄 md-editor-v3⭐️ 功能一览📦 安装💡 用法✍🏻 编辑器模式📖 仅预览模式 🗺 预览图🎁 Apis🔖 MdPreivew Props🔩 MdEdit…

c++基础概念,const与指针、引用的关系,auto,decltype关键字能干啥总得了解吧。总得按照需求自定义创建实体类,自己编写头文件吧

const限定符 有时我们希望定义这样一种变量,它的值不能被改变。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时,很容易对其进行调整。另一方面,也应随时警惕防止程序一不小心改变了这个值。…

邂逅Webpack和打包过程

1 认识webpack工具 2 webpack基本打包 3 webpack配置文件 4 编写和打包CSS文件 5 编写和打包LESS文件 6 postcss工具处理CSS 从脚手架打包成普通的htmlcssjs文件 内置模块path: 拼接路径 const path require("path")const filepath "C://abc/…

Systrace系列9 —— MainThread 和 RenderThread 解读

本文是介绍 Android App 中的 MainThread 和 RenderThread,也就是大家熟悉的主线程和渲染线程。文章会从 Systrace 的角度来看 MainThread 和 RenderThread 的工作流程,以及涉及到的相关知识:卡顿、软件渲染、掉帧计算等。 这里以滑动列表为例 ,我们截取主线程和渲染线程一…

InnoDB 在可重复读 RR 隔离级别下,能解决幻读问题吗?

InnoDB 在可重复读 RR 隔离级别下,能解决幻读问题吗? MySQL 在「可重复读」隔离级别下,可以很大程度上避免幻读现象的发生(注意是很大程度避免,并不是彻底避免),所以 MySQL 并不会使用「串行化」…

Pycharm中配置不了conda解释器

我安装的是pytorch的CPU版本,在Pycharm中配置conda环境时,每次添加完都不显示,搜遍了很多方法都没用。最后成功解决,这里将一些方法进行总结,方便大家解决问题。 我的情况和解决 问题情况以及显示 1.在Pycharm的日志…

GATK最佳实践之数据预处理SnakeMake流程

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> 写的数据预处理snakemake流程其实包括在每个单独的分析中比如种系遗传变异和肿瘤变异流程中&#xff0c;这里单独拿出来做演示用&#xff0c;因为数据预处理是通用的&#xff0c;在call变异之前需要处理好数据。 数据…

Java中如何使用策略模式减少 if / else 分支的使用

目录 1、策略模式 1.1 、策略模式包含三个角色&#xff1a; 2、需求 2.1 、传统方式 2.2 、策略模式实现 2.2.1 、新建PolicyPatternController.java 2.2.2 、Express.java(实体类) 2.2.3 、定义一个接口&#xff1a;PolicyPatternService.java 2.2.4 、定义3个实现类…

Python根据经纬度在地图上显示(folium)

Python根据经纬度在地图上显示&#xff08;folium&#xff09; 一、folium介绍1.folium.Map参数简要介绍2.folium.Marker参数介绍 二、Python根据经纬度在地图上显示&#xff08;示例&#xff09;1.经纬度坐标标记2.经纬度坐标分组标记 一、folium介绍 1.folium.Map参数简要介…

URLConnection(五)

文章目录 1. 断开与服务器的连接2. 处理服务器响应3. 错误条件4. 重定向5. 代理6. 流模式 1. 断开与服务器的连接 HTTP1.1 支持持久连接&#xff0c;允许通过一个TCP socket发送多个请求和响应。不过使用Keep-Alive时&#xff0c;服务器不会因为已经向客户端发送了最后一个字节…

chatgpt赋能python:使用Python操作股票软件:探索股票市场的新方式

使用Python操作股票软件&#xff1a;探索股票市场的新方式 在当今股票市场中&#xff0c;许多投资者正在寻找新的方式来更好地管理其投资组合。一种新的方式是使用Python编程语言操作股票软件。Python拥有简洁的语法和丰富的库来帮助投资者更好地理解和管理股票。在本文中&…