变更日志
本书及其工具的重要变更。最新条目在前。日期使用 ISO 8601(YYYY-MM-DD)。
[Unreleased]
Changed
- 荷兰语(
nl-nl):翻译了主题 9.0、9.3 和 9.4 中剩余的英文标题和 slug(bijlagen、controlelijsten、sjablonen)。 - 威尔士语(
cy-001、cy-gb):术语与 TermCymru 对齐:risg(风险,取代perygl,并做词性一致)、cyfnewidiad(权衡)、dangosydd rhagfynegi和dangosydd ôl-fynegi(领先指标与滞后指标,取代hwyrfrydig)、cynhwysedd(容量)、dosraniad(分布)、cydberthynas(相关性)、主题 1.3 中表示产出的allbwn,以及cyfradd gadael staff(员工流失率)。为保持一致,重命名了四个主题 slug。 - 站点:把
@lilydesignsystem/svelte-picker-bar升级到 0.2.0,它在标题栏中增加了一个搜索选择器;它提交到现有的/?<query>站点搜索。 - 添加了
scripts/generate-sitemap.mjs,它在pnpm build结束时运行,并根据预渲染的页面写出sitemap.xml(仅限规范的语言区域 URL, 不包含两个字母别名的重复项),使robots.txt中的Sitemap:行能够解析。 AGENTS.md现在是一份简短的索引;细节转移到了AGENTS/layout.md、style.md、locales.md和workflow.md。- 文档整理:针对 27 个语言区域、各语言区域的部分目录名称和新工具,更新了
AGENTS.md、index.md、生成的 README 语言区域文本、spec/index.md、spec/locales.md, 以及站点的AGENTS.md和README.md;添加了CLAUDE.md(指向AGENTS.md的指针);修正了两个代理技能中过时的docs/路径, 并让skills/成为.claude/skills/的规范副本(由测试检查)。 - 在站点的
static/中添加了llms.txt和llms.json(面向 AI 代理的、涵盖每个已提供语言区域和主题的索引),由tools/gen_llms.py(just llms)生成并由测试检查。 - 站点主页:“九个部分”的磁贴列表现在是涵盖所有部分和主题的“目录”嵌套列表,并删除了“古德哈特定律,无处不在”一节。
- 在每个语言区域中,把书的正文里的“chapter”改成了“topic”(例如“主题 2.1”“本部分的主题”),使用各语言自己表示“topic”的词
(
tema、sujet、Thema、тема、主題等),在规格、工具生成的文本和站点界面字符串中也是如此。文件名、URL 和部分键保持不变。 - 翻译了
locales/下每个部分目录的名称:chapters/现在是topics/(在其他每个语言区域中是它的译名,如temas/、sujets/、themen/), 而es-001的examples/现在是ejemplos/。名称保存在spec/section-names.json中;工具、测试和站点的内容同步都从那里读取,站点 URL 保持不变。
Changed
- 对照威尔士政府的 TermCymru 术语表修订了威尔士语语言区域(
cy-001、cy-gb,保持相同):幸福感用llesiant,生产力用cynhyrchiant, 脆弱性用gwendid/gwendidau,治理用llywodraethiant,相关性用cydberthynas,待办事项清单(backlog)用ôl-groniad(此前保留为英文),成本效益用cost a budd, 并在每个主题中首次提到 AI 时使用deallusrwydd artiffisial (AI)。
Added
- 已把前言、示例、贡献和项目各部分(14 个文件,外加变更日志、主页和目录)翻译成该语言区域,目录名称也已翻译。
- 添加德语(
de-001)作为第 26 个完整翻译的语言区域:全部 63 个主题,附带匹配的.locale-peer-id附属文件,内容与de-de相同。 已接入站点,并在/de-001/(别名/de/)提供服务。 - 添加葡萄牙语(
pt-001)作为第 25 个完整翻译的语言区域:全部 63 个主题,附带匹配的.locale-peer-id附属文件,内容与pt-pt相同。 已接入站点,并在/pt-001/(别名/pt/)提供服务。 - 完成了全部 63 个主题到乌尔都语(
ur-001,从右到左)的从零开始的完整人工翻译,这是第 24 个完整翻译的语言区域,附带匹配的.locale-peer-id附属文件。每个主题都直接从英文源头翻译,索引(主题 9.7)把每个内部链接重新映射到对应的乌尔都语文件名, 部分目录是موضوعات。已接入站点,并在/ur-001/(别名/ur/)提供服务。 - 完成了全部 63 个主题到印度尼西亚语(
id-001)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件。此前没有可供构建的印度尼西亚语语言区域, 因此每个主题都直接从英文源头翻译,索引(主题 9.7)把每个内部链接重新映射到对应的印度尼西亚语文件名。已接入站点,并在/id-001/(别名/id/)提供服务。 - 添加俄语(
ru-001)和中文(zh-001)作为第 21 和第 22 个完整翻译的语言区域:各含全部 63 个主题,附带匹配的.locale-peer-id附属文件, 内容分别与ru-ru和zh-cn相同。已接入站点,并在/ru-001/和/zh-001/(别名/ru/和/zh/)提供服务。 - 添加法语(
fr-001)作为第 20 个完整翻译的语言区域:全部 63 个主题,附带匹配的.locale-peer-id附属文件,内容与fr-fr相同。 已接入站点,并在/fr-001/(别名/fr/)提供服务。 - 添加孟加拉语(
bn-001)作为第 19 个完整翻译的语言区域:全部 63 个主题,附带匹配的.locale-peer-id附属文件,内容与bn-bd相同。 已接入站点,并在/bn-001/(别名/bn/)提供服务。 - 添加阿拉伯语(
ar-001)作为第 18 个完整翻译的语言区域:全部 63 个主题,附带匹配的.locale-peer-id附属文件,内容与ar-eg相同。 已接入站点,并在/ar-001/(别名/ar/)提供服务。 - 添加威尔士语,英国(
cy-gb)作为第 17 个完整翻译的语言区域:全部 63 个主题,附带匹配的.locale-peer-id附属文件,内容与cy-001相同(与hi-id和hi-001的关系相同)。已接入站点的SERVED_LOCALE_CODES,并在/cy-gb/提供服务。 - 完成了全部 63 个主题到荷兰语,荷兰(
nl-nl)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。 此前没有可供构建的荷兰语语言区域,因此每个主题都直接从英文源头翻译。索引(主题 9.7)把每个内部主题链接重新映射到对应的荷兰语文件名, 沿用了为ar-eg、bn-bd、ko-kr、es-es、pt-pt、ja-jp、ru-ru、fr-fr和sv-se采用的做法。尚未接入站点。 - 完成了全部 63 个主题到瑞典语,瑞典(
sv-se)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。 每个主题都直接从英文源头翻译。索引(主题 9.7)把每个内部主题链接重新映射到对应的瑞典语文件名,沿用了为ar-eg、bn-bd、ko-kr、es-es、pt-pt、ja-jp、ru-ru和fr-fr采用的做法。尚未接入站点。 - 完成了全部 63 个主题到法语,法国(
fr-fr)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。 每个主题都直接从英文源头翻译。索引(主题 9.7)把每个内部主题链接重新映射到对应的法语文件名,沿用了为ar-eg、bn-bd、ko-kr、es-es、pt-pt、ja-jp和ru-ru采用的做法。尚未接入站点。 - 完成了全部 63 个主题到俄语,俄罗斯(
ru-ru)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。 每个主题都直接从英文源头翻译。索引(主题 9.7)把每个内部主题链接重新映射到对应的俄语文件名,沿用了为ar-eg、bn-bd、ko-kr、es-es、pt-pt和ja-jp采用的做法。尚未接入站点。 - 完成了全部 63 个主题到日语,日本(
ja-jp)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。 每个主题都直接从英文源头翻译。索引(主题 9.7)把每个内部主题链接重新映射到对应的日语文件名,沿用了为ar-eg、bn-bd、ko-kr、es-es和pt-pt采用的做法。尚未接入站点。 - 完成了全部 63 个主题到葡萄牙语,葡萄牙(
pt-pt)的从零开始的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。 每个主题都直接从英文源头翻译。索引(主题 9.7)把每个内部主题链接重新映射到对应的葡萄牙语文件名,沿用了为ar-eg、bn-bd、ko-kr和es-es采用的做法。尚未接入站点。 - 添加西班牙语,西班牙(
es-es)作为完整翻译的语言区域,全部 63 个主题,起点是现有西班牙语(es-001)译文的副本(经检查,它在语法上已经是中性的, 词汇也大多已偏向西班牙用法),然后针对其余少数用法做了有针对性的术语处理,尤其是 针对本书事件指标领域把“incidente”改为“incidencia”,并在各处做了相应的词性一致修正。尚未接入站点。 - 完成了全部 63 个主题到韩语,韩国(
ko-kr)的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。索引(主题 9.7) 把每个内部主题链接重新映射到对应的韩语文件名,沿用了为ar-eg和bn-bd采用的做法。尚未接入站点。 - 添加印地语,印度(
hi-id)作为完整翻译的语言区域,全部 63 个主题,做法是把现有的印地语(hi-001)译文逐字复制到带有国家标记的语言区域代码下, 因为标准印地语没有需要单独手工翻译的、独立的印度特有变体。尚未接入站点。 - 完成了全部 63 个主题到孟加拉语,孟加拉国(
bn-bd)的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。尚未接入站点。 - 完成了全部 63 个主题到阿拉伯语,埃及(
ar-eg)的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。尚未接入站点。 - 完成了全部 63 个主题到德语,德国(
de-de)的完整人工翻译,附带匹配的.locale-peer-id附属文件,且just test通过。尚未接入站点。 - 在三个语言区域中完成了全部 63 个主题的完整人工翻译:威尔士语(
cy-001)、中文(zh-cn)和印地语(hi-001),每个都附带匹配的.locale-peer-id附属文件, 且just test通过。 - 又有两个计划中的翻译语言区域,威尔士语 - 英国(
cy-gb)和中文(zh-001),被添加到spec/locales-for-global-sharing-with-svelte/locales.tsv和spec/locales.md(现在是十三个计划中的语言区域,之前是十一个),并且zh-cn此前未定的本族语名称确定为 中文。站点的LOCALE_LABELS获得了相应条目 (cy-gb:“Cymraeg (Prydain Fawr)”,zh-001:“中文”,zh-cn:“中文 (中国)”)。目前只有基础设施:这些语言区域都没有locales/<code>/目录或已翻译的内容。 - 书以四个语言区域发布在
locales/下:en-gb-oxendict(英式英语,牛津拼写;手写的源头)、en-001(国际英语)、en-gb(主流英式英语)和en-us(美式英语)。en-001、en-gb和en-us由新的tools/localize.py从en-gb-oxendict机械派生;参见spec/locales.md。docs/已不复存在;spec/、AGENTS.md、tests/validate.py、tools/gen_nav.py和tools/stats.py中对它的每处引用现在都指向locales/<locale>/。 - 添加了两个 Claude Code 技能:
software-engineering-metrics-skill(面向把书中指导应用于自己团队的读者)和software-engineering-metrics-maintainer-skill(面向添加或编辑主题的贡献者),位于skills/下,并镜像到.claude/skills/。 - 把已发布网站的源代码移入本仓库,作为
software-engineering-metrics.github.io/,此前它是一个独立仓库。它现在直接从仓库根目录读取locales/, 而不是从旁边检出的副本。根目录的.github/workflows/deploy.yml在每次推送到main时验证站点仍能构建, 然后向software-engineering-metrics.github.io仓库发送repository_dispatch(该仓库保留为一个薄的部署外壳,因为 GitHub Pages 只会从名称与之完全相同的仓库提供那个裸域名), 由它检出这个单体仓库、构建站点并部署。 - 按照新的
spec/locales-for-global-sharing-with-svelte/子规格,为已翻译(而不只是拼写派生)的语言区域添加了基础设施:tools/gen_locale_peer_ids.py给每个 内容文件一个.locale-peer-id附属文件,在各语言区域间相同,未来的翻译语言区域(带有自己的原文字母 slug)可以用它来解析 “这个页面在语言区域 X 中”,而不是按 slug 匹配;tests/validate.py检查每个附属文件都存在且一致。spec/locales.md记录了十个计划中的翻译语言区域(阿拉伯语、孟加拉语、威尔士语、 西班牙语、法语、印地语、印度尼西亚语、葡萄牙语、俄语、乌尔都语和中文 - 中国)。在站点方面,scripts/locales.mjs获得了LOCALE_LABELS/localeLabel()(每个计划中语言区域的显示名称, 在路由之前就位)和sortedLocaleEntries()(未来的语言区域列表应使用的排序顺序),而src/lib/i18n.js提取了每个.svelte组件此前用英文硬编码的界面外壳字符串(导航、侧边栏、分页器、选择器、 页脚、跳转链接),通过ui(locale)传递,对于没有自己译文的语言区域则回退到英文。 - 用 Lily Design System 的
@lilydesignsystem/svelte-picker-bar取代了站点手工制作的、仅限语言区域的标题栏控件:一个真正的主题选择器 (浅色/深色,通过新的static/assets/themes/{light,dark}.css)、真正的语言区域选择器(接入本站基于 URL 的路由,而不是它默认仅限 lang/dir 的行为)、 一个文字大小选择器(Lily 的七级刻度)和一个分享选择器(电子邮件、Mastodon、复制链接)。通过pnpm-workspace.yaml的 overrides,把@lilydesignsystem/svelte-{theme,locale,text-size,share}-picker固定在^0.1.2,把@lilydesignsystem/svelte-headless固定在^0.2.0,绕开svelte-picker-bar0.1.0 自身依赖范围中的一个真实的已发布缺陷 (参见每个选择器的CHANGELOG.md“0.1.2”,以及本站的AGENTS.md)。 - 删除了主页的统计行(部分/主题/“Free Always”)及其“How to read it”一节,并把“Browse the nine parts”卡片网格换成了普通的项目符号列表。
Changed
- 添加了
scripts/generate-sitemap.mjs,它在pnpm build结束时运行,并根据预渲染的页面写出sitemap.xml(仅限规范的语言区域 URL,不包含两个字母别名的重复项), 使robots.txt中的Sitemap:行能够解析。 - 添加了主题 2.8,精益价值流指标(来自经典精益价值流图的前置时间、处理时间、周期时间、完整且准确的百分比和节拍时间, 外加滚动吞吐良率的计算),置于排队论之后。拉取请求与代码评审指标从 2.8 移到 2.9,DORA 指标主题从 2.9 移到 2.10。 全书中受影响的每一处交叉引用都已更新。
- 把第 2 部分从“Delivery and Flow Metrics”改名为“Flow Metrics”,并围绕 Mik Kersten 的流动框架重新组织。添加了四个新主题:2.1 流动框架、2.2 流动项目(功能、缺陷、 风险、债务)、2.3 流动速度与流动分布,以及 2.4 流动时间与流动负载。四个单独的 DORA 指标主题(部署频率、前置时间、变更失败率、 恢复时间)被合并为一个参考主题 2.9 DORA 指标框架,并移到该部分末尾。流动效率与在制品被重新编号为 2.5,排队论主题 (原 2.9)被改名并重新编号为 2.7 排队论。周期时间(2.6)以及拉取请求与代码评审指标(2.8)保持原编号。全书、术语表、公式参考、 成熟度自评和前言中的每一处交叉引用都已更新以保持一致。
Added
- 初始版本:8 个部分中的 45 个内容主题,外加前言和 7 个主题的附录(第 9 部分),涵盖 DORA 和 SPACE 框架、代码与质量指标、产品与业务指标、 可靠性与安全指标,以及生成式 AI 对工程指标的影响。
- 从姊妹项目
software-engineering-guide镜像来的仓库基础设施:规格驱动的spec/(index、structure、conventions、牛津拼写、路线图)、tests/validate.py中的验证套件、tools/gen_nav.py中的导航生成器、一个justfile、在docs/contributing/下带有贡献者指引的AGENTS.md、CONTRIBUTING.md,以及本变更日志。 spec/structure.md,测试据以检查文件的规范主题清单。docs/examples/中的两个具体示例:一份填好的指标章程和一份仪表盘规格。
历史
本书是从规格向外构建的:九部分结构先在 spec/structure.md 中声明,然后每个主题依据 docs/contributing/chapter-template.md 中的共享模板撰写, tests/validate.py 则全程强制执行结构和内部风格。
本文件的约定
- 把变更归入 Added、Changed、Fixed、Removed 或 Deprecated 之下。
- 条目要简短而具体。尽可能每条一行。
- 这里同样不要使用长破折号;测试也会检查本文件。