<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Unknown</title>
    <description>Best wishes to you</description>
    <link>https://www.zeusro.com/</link>
    <atom:link href="https://www.zeusro.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Sun, 19 Apr 2026 07:29:08 +0000</pubDate>
    <lastBuildDate>Sun, 19 Apr 2026 07:29:08 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>golang的问题</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;p&gt;一句话概括，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;是一种高性能网络编程语言，仅此而已。&lt;/p&gt;

&lt;h2 id=&quot;零值陷阱&quot;&gt;零值陷阱&lt;/h2&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AllBasicTypes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Str&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;I8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;int8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;U8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Up&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uintptr&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;By&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Ru&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;rune&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// int32&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;F32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;F64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float64&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;C64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;complex64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;C128&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;complex128&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// var v AllBasicTypes —— 各字段为零值：false、&quot;&quot;、0、0.0、(0+0i) 等&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;为了规避&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Java&lt;/code&gt;的空指针引用而引入了&lt;strong&gt;默认零值&lt;/strong&gt;的设计。这导致了在设计程序的时候，遇到&lt;strong&gt;零值&lt;/strong&gt;要小心处理。
比如上述这个结构，变量声明 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var v AllBasicTypes&lt;/code&gt; 之后访问 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.B&lt;/code&gt;会得到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.U8&lt;/code&gt; 会得到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;那么在实际的应用场景，就无法判断&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt;到底是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;，还是未赋值。解决的办法是另外加一个字典标记，或者使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*bool&lt;/code&gt; 布尔指针这种奇怪的类型。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;time&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;google.golang.org/protobuf/types/known/timestamppb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// 错误示例：使用 time.Time 的零值&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// 或者 time.Time{}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timestamppb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c&quot;&gt;// 序列化时就会报错&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proto&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// 报错：proto: Google.Protobuf.Timestamp.Seconds out of range -62135596800&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;而时间的零值导致的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timestamp&lt;/code&gt;溢出是隐形的错误。
我们可能在底层的模型代码里面使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time.Time&lt;/code&gt; 定义了某个字段，但在顶层&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API&lt;/code&gt;获取的时候发现反序列化失败。&lt;/p&gt;

&lt;h2 id=&quot;弱网问题&quot;&gt;弱网问题&lt;/h2&gt;

&lt;p&gt;在弱网环境，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;几乎是一种非常难用的编程语言。内置的语言包非常薄弱，经常需要&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt;，而国内 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt; 则必定绕不过网络代理。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/2026-04-19-golang-problems/golang-diamond-dependency.png&quot; alt=&quot;Go 模块：菱形依赖下对公共依赖 C 的多个版本要求&quot; /&gt;&lt;/p&gt;

&lt;p&gt;即便网络问题解决了，第三方的&lt;strong&gt;菱形依赖&lt;/strong&gt;你也解决了。但在弱网情况下，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;还是很难用。一份源代码，下载到本地，开发+编译绕不过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;插件 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt;。
而且&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt;插件不是开箱即用的，安装之后还需要再安装 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; 等工具。&lt;/p&gt;

&lt;h2 id=&quot;兼容性问题&quot;&gt;兼容性问题&lt;/h2&gt;

&lt;p&gt;兼容性问题分两部分：&lt;strong&gt;操作系统兼容&lt;/strong&gt;和&lt;strong&gt;语言向前兼容&lt;/strong&gt;。&lt;/p&gt;

&lt;h3 id=&quot;golang的不向前兼容&quot;&gt;golang的不向前兼容&lt;/h3&gt;

&lt;p&gt;很多人不知道，其实&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;在这么多年迭代的过程中出现过不向前兼容的变更：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Go 版本&lt;/th&gt;
      &lt;th&gt;变更类别&lt;/th&gt;
      &lt;th&gt;具体不兼容变更描述&lt;/th&gt;
      &lt;th&gt;控制方式 / 备注&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1 (2012)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;语言 &amp;amp; 标准库重大重构&lt;/td&gt;
      &lt;td&gt;pre-Go 1 (r60 等) 到 Go 1 的巨大变更：包路径调整（e.g. encoding/asn1）、os.Error → error、time 包重构、map/delete 语法、rune 类型引入、map 遍历随机化等。&lt;/td&gt;
      &lt;td&gt;使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go fix&lt;/code&gt; 工具辅助迁移。这是历史上最大的一次 breaking update。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;语言 &amp;amp; 平台&lt;/td&gt;
      &lt;td&gt;整数除常量零变为编译错误；64 位平台 int/uint 变为 64 位；部分 net/syscall 结构体/签名变更。&lt;/td&gt;
      &lt;td&gt;直接影响编译或运行行为。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;运行时&lt;/td&gt;
      &lt;td&gt;GOMAXPROCS 默认从 1 改为 CPU 核心数（调度行为变更）。&lt;/td&gt;
      &lt;td&gt;性能/并发相关，可能影响旧假设。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;运行时 &amp;amp; panic&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;panic(nil)&lt;/code&gt; 或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;panic(untyped nil)&lt;/code&gt; 现在 panic &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*runtime.PanicNilError&lt;/code&gt;（之前无 panic）。&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=panicnil=1&lt;/code&gt; 恢复旧行为（或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.20&lt;/code&gt; 及更早）。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;包初始化&lt;/td&gt;
      &lt;td&gt;包初始化顺序算法精确定义（按 import path 排序），之前为未定义行为。&lt;/td&gt;
      &lt;td&gt;依赖隐式初始化顺序的代码可能受影响。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;语言（for 循环）&lt;/td&gt;
      &lt;td&gt;for 循环变量每个迭代创建新变量（之前所有迭代复用同一变量）。闭包捕获行为改变。&lt;/td&gt;
      &lt;td&gt;由 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt; 中的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.22&lt;/code&gt;（或更高）启用。旧模块保留旧行为。这是常见迁移点。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;net/http.ServeMux&lt;/td&gt;
      &lt;td&gt;ServeMux 支持方法前缀（如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST /path&lt;/code&gt;）、通配符 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{name}&lt;/code&gt; 等新模式；路径转义处理变更。&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpmuxgo121=1&lt;/code&gt; 恢复 Go 1.21 行为。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;go/types&lt;/td&gt;
      &lt;td&gt;类型别名现在用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alias&lt;/code&gt; 类型表示（之前等价于原类型）。&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=gotypesalias=0&lt;/code&gt;（默认在 1.22）；1.23 起默认 1，将在 1.27 移除。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;TLS &amp;amp; crypto&lt;/td&gt;
      &lt;td&gt;默认最小 TLS 版本提升至 1.2；移除部分 RSA key exchange 和 3DES 等 cipher（后续版本）。&lt;/td&gt;
      &lt;td&gt;多个 GODEBUG（如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tls10server=1&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tlsrsakex=1&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tls3des=1&lt;/code&gt;），部分将在 1.27 移除。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;time 包&lt;/td&gt;
      &lt;td&gt;time 包创建的 channel 变为 unbuffered（同步），影响 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timer.Stop&lt;/code&gt; 等正确使用。&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=asynctimerchan=0&lt;/code&gt; 恢复旧异步行为（将在 1.27 移除）。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;net/http&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.ServeContent&lt;/code&gt; 在错误响应时移除某些 header。&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpservecontentkeepheaders=1&lt;/code&gt; 恢复旧行为。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;x509 &amp;amp; TLS&lt;/td&gt;
      &lt;td&gt;拒绝负序列号证书；&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Leaf&lt;/code&gt; 字段填充变更等。&lt;/td&gt;
      &lt;td&gt;多个 GODEBUG（如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509negativeserial=0&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509keypairleaf=0&lt;/code&gt;）。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.24&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;x509&lt;/td&gt;
      &lt;td&gt;x509 证书策略（Policies）字段使用变更。&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=x509usepolicies=0&lt;/code&gt; 恢复旧行为。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;运行时 &amp;amp; nil 检查&lt;/td&gt;
      &lt;td&gt;某些 nil 指针 dereference（e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f, err := os.Open(); f.Name()&lt;/code&gt; 当 f==nil 时）现在严格立即 panic（之前某些情况延迟）。&lt;/td&gt;
      &lt;td&gt;严格遵守规范；无 GODEBUG 控制，需修复代码（先检查 err）。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25+&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;平台支持&lt;/td&gt;
      &lt;td&gt;移除对旧 OS 支持（如 macOS 11、32-bit windows/arm）；Wasm 导出指令变更。&lt;/td&gt;
      &lt;td&gt;平台/移植相关，非 API 但影响构建。&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;在高版本&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;中解析旧版本&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;生成的证书，因为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;部分的变更，可能出现解析失败的问题。&lt;/p&gt;

&lt;p&gt;而语言不兼容的另一方面体现，是&lt;strong&gt;工具集的割裂&lt;/strong&gt;。这在开发&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt;相关的时候就特别明显。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# 核心基础&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/protobuf/cmd/protoc-gen-go@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

&lt;span class=&quot;c&quot;&gt;# 数据验证&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/envoyproxy/protoc-gen-validate@latest

&lt;span class=&quot;c&quot;&gt;# HTTP 网关&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest

&lt;span class=&quot;c&quot;&gt;# API 文档&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/google/gnostic/cmd/protoc-gen-openapi@latest
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;你安装了这么多的工具集。但当你切换到低版本的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;语言，就会发现 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; 甚至都运行不了。
你需要找各种兼容当前版本的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;，最后在一堆工具集中&lt;strong&gt;迷失自我&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;实际情况并不允许你一直使用最新版本的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;，所以最后行为链路会变得非常奇怪：&lt;/p&gt;

&lt;p&gt;在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt;使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;路径切换到低版本&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; –&amp;gt; 调试工具集不支持 –&amp;gt; 重新寻找支持当前版本的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;工具集ABCD –&amp;gt; A弄好了，弄B，B弄好了找C，然后一直循环往复。&lt;/p&gt;

&lt;p&gt;最后你忘了其实你只是想要跑个程序，却一直把时间浪费在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; xx version。&lt;/p&gt;

&lt;h3 id=&quot;window不适合golang开发&quot;&gt;window不适合golang开发&lt;/h3&gt;

&lt;p&gt;而在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt;环境做&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;开发是一个痛苦的事情。很多第三方工具，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;环境甚至无法编译成功，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; 就是一个笑话。
最后为了方便，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;开发大家都会尽可能地使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Linux&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mac&lt;/code&gt; 系统。&lt;/p&gt;

&lt;h2 id=&quot;选择编译缺失&quot;&gt;选择编译缺失&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; 没有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; / C 系那种&lt;strong&gt;预处理器级&lt;/strong&gt;的条件编译：同一套语法里用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; 把整段代码从&lt;strong&gt;未选中的构建&lt;/strong&gt;里直接抹掉。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; 里更接近的做法是 &lt;strong&gt;build tags&lt;/strong&gt;（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build&lt;/code&gt;）配合不同文件，或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime.GOOS&lt;/code&gt; 等运行时分支，语义和手感都不一样。若你从 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; 过来，会明显感到这种「选择性编译」能力的缺失。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; 里常见用法大致如下（仅示意）：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;// 1) 按内置/项目符号裁剪代码块（DEBUG 由 Debug 配置自动定义）&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if DEBUG
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;只在 Debug 构建中存在&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if MY_FEATURE
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// 需在 csproj 的 &amp;lt;DefineConstants&amp;gt; 或编译参数里定义 MY_FEATURE&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;DoExperimentalStuff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// 2) Conditional：未定义符号时，调用点会被编译器剔除（方法本身仍可存在）&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;App&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Conditional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;VERBOSE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;这条在未定义 VERBOSE 时不会产生调用指令&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对比之下，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; 要在「不同构建」下换实现，通常靠文件级条件（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build linux&lt;/code&gt;）或链接时注入，而不是在同一函数体里用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; 折叠半页代码。&lt;/p&gt;

&lt;p&gt;如果不用这种标签去做选择编译，那除了使用&lt;strong&gt;环境变量&lt;/strong&gt;切换之外，我暂时想不到别的解决方案。&lt;/p&gt;

&lt;h2 id=&quot;后记&quot;&gt;后记&lt;/h2&gt;

&lt;p&gt;写到这里，我突然想问自己一个问题：&lt;strong&gt;AI时代&lt;/strong&gt;分享技术还有意义吗？&lt;/p&gt;

&lt;p&gt;回想刚入行的时候，网络同行前辈的建议是写个博客记录整理一下遇到的问题和解决方案。至今这个习惯已经断断续续坚持了10年。&lt;/p&gt;

&lt;p&gt;现在是AI时代，人学习信息技术的速度已经完全跟不上AI。但&lt;strong&gt;批判性思维&lt;/strong&gt;让我不太受AI的影响，我始终把AI当成辅助计算的手段。&lt;/p&gt;

&lt;p&gt;毕竟最终的决策风险要我本人承担。这么多年的风风雨雨，告诉我只有把&lt;strong&gt;命运&lt;/strong&gt;掌握在自己手中，才不会被外物牵着走。&lt;/p&gt;

&lt;p&gt;所以我觉得，写技术博客本身没有意义。&lt;strong&gt;思考本身就是意义&lt;/strong&gt;，归纳是一个过程，文章只是一个供后人怀念的结果。&lt;/p&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    
&lt;p&gt;In one sentence: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; is a high-performance language for network programming—nothing more, nothing less.&lt;/p&gt;

&lt;h2 id=&quot;zero-value-traps&quot;&gt;Zero-value traps&lt;/h2&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AllBasicTypes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Str&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;I8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;int8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;U8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Up&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uintptr&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;By&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Ru&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;rune&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// int32&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;F32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;F64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float64&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;C64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;complex64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;C128&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;complex128&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// var v AllBasicTypes — zero values: false, &quot;&quot;, 0, 0.0, (0+0i), etc.&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To avoid null-pointer-style issues like in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Java&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; uses &lt;strong&gt;default zero values&lt;/strong&gt;. That means you must be careful with zero values when you design programs.
For the struct above, after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var v AllBasicTypes&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.B&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.U8&lt;/code&gt; is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In real scenarios you cannot tell whether &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt; is &lt;strong&gt;false&lt;/strong&gt; or simply &lt;strong&gt;unset&lt;/strong&gt;. The usual fixes are an extra map for “was it set?” or the odd choice of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*bool&lt;/code&gt; pointer.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;time&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;google.golang.org/protobuf/types/known/timestamppb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Bad example: zero value of time.Time&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// or time.Time{}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timestamppb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c&quot;&gt;// Serialization fails&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proto&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// e.g. proto: Google.Protobuf.Timestamp.Seconds out of range -62135596800&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A zero &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time.Time&lt;/code&gt; quietly blows up &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt; &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timestamp&lt;/code&gt;&lt;/strong&gt; handling.
You might define a field as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time.Time&lt;/code&gt; deep in the model, then fail deserialization at the top-level &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;weak-networks&quot;&gt;Weak networks&lt;/h2&gt;

&lt;p&gt;On a poor network, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; is awkward to use: the standard library is thin, you constantly need &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt;, and in China &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt; almost always means fighting proxies.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/2026-04-19-golang-problems/golang-diamond-dependency.png&quot; alt=&quot;Go modules: diamond dependency with multiple required versions of shared dependency C&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Even if the network and third-party &lt;strong&gt;diamond dependencies&lt;/strong&gt; are “solved,” &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; is still painful under weak connectivity. You check out one repo and still cannot escape &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt; + the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; extension + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt; for dev and build.
The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt; extension is not turnkey either—you install it, then still install &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; and more.&lt;/p&gt;

&lt;h2 id=&quot;compatibility&quot;&gt;Compatibility&lt;/h2&gt;

&lt;p&gt;Compatibility splits into &lt;strong&gt;OS-level compatibility&lt;/strong&gt; and &lt;strong&gt;forward language compatibility&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;when-golang-is-not-forward-compatible&quot;&gt;When &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; is not forward-compatible&lt;/h3&gt;

&lt;p&gt;Many people do not realize &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; has shipped &lt;strong&gt;backward-incompatible&lt;/strong&gt; changes over the years:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Go version&lt;/th&gt;
      &lt;th&gt;Category&lt;/th&gt;
      &lt;th&gt;What broke&lt;/th&gt;
      &lt;th&gt;Mitigation / notes&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1 (2012)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Language &amp;amp; stdlib overhaul&lt;/td&gt;
      &lt;td&gt;Huge jump from pre-Go 1 (r60, etc.): package paths (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encoding/asn1&lt;/code&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;os.Error&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;error&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt; redesign, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delete&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rune&lt;/code&gt;, randomized map iteration, …&lt;/td&gt;
      &lt;td&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go fix&lt;/code&gt;. Largest breaking migration ever.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Language &amp;amp; platforms&lt;/td&gt;
      &lt;td&gt;Integer divide-by-zero on constants is an error; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint&lt;/code&gt; 64-bit on 64-bit; some &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;syscall&lt;/code&gt; shapes/signatures.&lt;/td&gt;
      &lt;td&gt;Direct compile/runtime impact.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Runtime&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOMAXPROCS&lt;/code&gt; default 1 → number of CPUs.&lt;/td&gt;
      &lt;td&gt;Concurrency/perf assumptions may change.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Runtime &amp;amp; panic&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;panic(nil)&lt;/code&gt; / untyped nil panics &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*runtime.PanicNilError&lt;/code&gt; (previously no panic).&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=panicnil=1&lt;/code&gt; or stay on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.20&lt;/code&gt; or older.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Package init&lt;/td&gt;
      &lt;td&gt;Init order is now defined (import path order); previously undefined.&lt;/td&gt;
      &lt;td&gt;Code relying on implicit init order may break.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Language (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;for&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;Per-iteration loop variables (was one shared var). Closure capture changes.&lt;/td&gt;
      &lt;td&gt;Enabled by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.22&lt;/code&gt; (or newer) in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt;; older modules keep old behavior. Common migration point.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http.ServeMux&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Method prefixes (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST /path&lt;/code&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{name}&lt;/code&gt; wildcards, escaping changes.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpmuxgo121=1&lt;/code&gt; restores Go 1.21 behavior.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go/types&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Type aliases use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alias&lt;/code&gt; (previously same as underlying type).&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=gotypesalias=0&lt;/code&gt; (default in 1.22); default 1 from 1.23; removed 1.27.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;TLS &amp;amp; crypto&lt;/td&gt;
      &lt;td&gt;Min TLS 1.2; some RSA KEX / 3DES ciphers removed (later releases).&lt;/td&gt;
      &lt;td&gt;Various &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt; flags (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tls10server=1&lt;/code&gt;, …), some removed by 1.27.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Channels from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt; are unbuffered; affects correct &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timer.Stop&lt;/code&gt; usage.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=asynctimerchan=0&lt;/code&gt; (removed 1.27).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.ServeContent&lt;/code&gt; strips some headers on errors.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpservecontentkeepheaders=1&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt; &amp;amp; TLS&lt;/td&gt;
      &lt;td&gt;Reject negative serials; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Leaf&lt;/code&gt; population changes, etc.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt; such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509negativeserial=0&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509keypairleaf=0&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.24&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Certificate Policies field handling.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=x509usepolicies=0&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Runtime &amp;amp; nil checks&lt;/td&gt;
      &lt;td&gt;Some nil derefs (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f, err := os.Open(); f.Name()&lt;/code&gt; when &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f==nil&lt;/code&gt;) panic immediately (was sometimes deferred).&lt;/td&gt;
      &lt;td&gt;Spec-correct; no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt;; fix code (check &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;err&lt;/code&gt; first).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25+&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Platforms&lt;/td&gt;
      &lt;td&gt;Drops old OS support (e.g. macOS 11, 32-bit windows/arm); Wasm export changes.&lt;/td&gt;
      &lt;td&gt;Porting/build impact, not always API.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Parsing certs produced by older &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; with a newer toolchain can fail because of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt; changes.&lt;/p&gt;

&lt;p&gt;Another face of incompatibility is &lt;strong&gt;splintered tooling&lt;/strong&gt;—especially obvious around &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# Core&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/protobuf/cmd/protoc-gen-go@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

&lt;span class=&quot;c&quot;&gt;# Validation&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/envoyproxy/protoc-gen-validate@latest

&lt;span class=&quot;c&quot;&gt;# HTTP gateway&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest

&lt;span class=&quot;c&quot;&gt;# API docs&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/google/gnostic/cmd/protoc-gen-openapi@latest
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You install all of that—then drop to an older &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; and even &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; may not run.
You hunt for toolchains that match, and get &lt;strong&gt;lost in the matrix&lt;/strong&gt; of plugins.&lt;/p&gt;

&lt;p&gt;You cannot always stay on the newest &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;, so workflows get weird:&lt;/p&gt;

&lt;p&gt;Tweak &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt; to an old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; → debugger stack unsupported → hunt for tools A B C D that match → fix A, then B, then C, loop forever.&lt;/p&gt;

&lt;p&gt;You only wanted to run a program, but time burns on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; version pins.&lt;/p&gt;

&lt;h3 id=&quot;window-is-a-bad-fit-for-golang&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt; is a bad fit for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;On &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt;, many third-party tools fail to build; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; becomes a joke.
So people doing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; gravitate to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Linux&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mac&lt;/code&gt; when they can.&lt;/p&gt;

&lt;h2 id=&quot;no-selective-compilation&quot;&gt;No selective compilation&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; lacks &lt;strong&gt;preprocessor-style&lt;/strong&gt; conditional compilation like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; / the C family: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; that &lt;strong&gt;strips whole regions&lt;/strong&gt; from unselected builds. The closest &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; offers is &lt;strong&gt;build tags&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build&lt;/code&gt;) across files, or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime.GOOS&lt;/code&gt; branches—different semantics and ergonomics. Coming from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt;, you feel the missing “selective compilation.”&lt;/p&gt;

&lt;p&gt;Typical &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; patterns (illustrative):&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;// 1) Trim code by symbol (DEBUG is defined in Debug builds)&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if DEBUG
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Only in Debug builds&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if MY_FEATURE
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// Define MY_FEATURE in csproj &amp;lt;DefineConstants&amp;gt; or compiler flags&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;DoExperimentalStuff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// 2) Conditional: if the symbol is undefined, call sites are stripped (method may remain)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;App&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Conditional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;VERBOSE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;No call instruction if VERBOSE is not defined&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;By contrast, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; swaps implementations per build mostly via file-level conditions (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build linux&lt;/code&gt;) or link tricks—not &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; folding half a function.&lt;/p&gt;

&lt;p&gt;Without those tags, aside from &lt;strong&gt;environment variables&lt;/strong&gt;, I do not have another clean pattern.&lt;/p&gt;

&lt;h2 id=&quot;postscript&quot;&gt;Postscript&lt;/h2&gt;

&lt;p&gt;Writing this, I ask myself: does sharing tech still matter in the &lt;strong&gt;AI era&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;When I started, seniors said: blog your problems and fixes. I have kept that habit, off and on, for ten years.&lt;/p&gt;

&lt;p&gt;We cannot out-learn AI—but &lt;strong&gt;critical thinking&lt;/strong&gt; keeps me from being swept along; I treat AI as a calculator.&lt;/p&gt;

&lt;p&gt;Risk is still mine. Years of bumps taught me: hold your &lt;strong&gt;fate&lt;/strong&gt; in your own hands, or the world drags you.&lt;/p&gt;

&lt;p&gt;So the blog post itself is not the point. &lt;strong&gt;Thinking is the point&lt;/strong&gt;—synthesis is the process; the article is just something for later readers to remember you by.&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    
&lt;p&gt;ひと言で言えば、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;は高性能なネットワーク向け言語に過ぎない。&lt;/p&gt;

&lt;h2 id=&quot;ゼロ値の罠&quot;&gt;ゼロ値の罠&lt;/h2&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AllBasicTypes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Str&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;I8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;int8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;U8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Up&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uintptr&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;By&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Ru&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;rune&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// int32&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;F32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;F64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float64&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;C64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;complex64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;C128&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;complex128&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// var v AllBasicTypes — 各フィールドはゼロ値: false、&quot;&quot;、0、0.0、(0+0i) など&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Java&lt;/code&gt;のようなヌルポインタ問題を避けるため、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;は&lt;strong&gt;デフォルトゼロ値&lt;/strong&gt;を採用した。その結果、設計時に&lt;strong&gt;ゼロ値&lt;/strong&gt;には常に注意が必要になる。
上の構造体では &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var v AllBasicTypes&lt;/code&gt; のあと、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.B&lt;/code&gt;は&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.U8&lt;/code&gt;は&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;になる。&lt;/p&gt;

&lt;p&gt;実務では、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt;が本当に&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;なのか、&lt;strong&gt;未代入&lt;/strong&gt;なのか判別できない。対策は別マップで「セットされたか」を持つか、変な型の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*bool&lt;/code&gt; を使うことになる。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;time&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;google.golang.org/protobuf/types/known/timestamppb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// 悪い例: time.Time のゼロ値を使う&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// または time.Time{}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timestamppb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c&quot;&gt;// シリアライズで失敗する&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proto&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// 例: proto: Google.Protobuf.Timestamp.Seconds out of range -62135596800&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;時間のゼロ値が原因の&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timestamp&lt;/code&gt;まわりの不具合は、見えにくい。
下位のモデルで &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time.Time&lt;/code&gt; フィールドを定義していても、上位の&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API&lt;/code&gt;でデシリアライズに失敗することがある。&lt;/p&gt;

&lt;h2 id=&quot;弱いネットワーク&quot;&gt;弱いネットワーク&lt;/h2&gt;

&lt;p&gt;回線が弱い環境では、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;はかなり使いづらい。標準付属は薄く、すぐ&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt;が必要で、中国国内では&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt;はプロキシとセットになる。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/2026-04-19-golang-problems/golang-diamond-dependency.png&quot; alt=&quot;Go モジュール: 共通依存 C の複数バージョン要求によるダイヤモンド依存&quot; /&gt;&lt;/p&gt;

&lt;p&gt;ネットの問題とサードパーティの&lt;strong&gt;ダイヤモンド依存&lt;/strong&gt;をどうにかしても、弱い回線のもとでは&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;は相変わらず厳しい。ソースを取得しても、開発とビルドから &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;拡張 + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt; は逃げられない。
しかも&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt;拡張は開箱即戦力ではなく、入れたあとも &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; などを別途入れる。&lt;/p&gt;

&lt;h2 id=&quot;互換性&quot;&gt;互換性&lt;/h2&gt;

&lt;p&gt;互換性は大きく&lt;strong&gt;OS互換&lt;/strong&gt;と&lt;strong&gt;言語の前方互換&lt;/strong&gt;に分かれる。&lt;/p&gt;

&lt;h3 id=&quot;golangが前方互換でない例&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;が前方互換でない例&lt;/h3&gt;

&lt;p&gt;あまり知られていないが、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;は長年のあいだに&lt;strong&gt;前方互換を壊す&lt;/strong&gt;変更を出している：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Go バージョン&lt;/th&gt;
      &lt;th&gt;分類&lt;/th&gt;
      &lt;th&gt;非互換の内容&lt;/th&gt;
      &lt;th&gt;回避・備考&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1 (2012)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;言語・標準庫の大改修&lt;/td&gt;
      &lt;td&gt;pre-Go 1 (r60 等) からの巨大差分：パス変更（例: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encoding/asn1&lt;/code&gt;）、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;os.Error&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;error&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt;再設計、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delete&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rune&lt;/code&gt;、マップ走査のランダム化など&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go fix&lt;/code&gt; で移行。最大の breaking 更新。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;言語・プラットフォーム&lt;/td&gt;
      &lt;td&gt;定数ゼロ除算がエラー；64bit で &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint&lt;/code&gt; が64bit；一部 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;syscall&lt;/code&gt; の型・シグネチャ変更&lt;/td&gt;
      &lt;td&gt;コンパイル・実行に直撃。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;ランタイム&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOMAXPROCS&lt;/code&gt; 既定が 1 → CPU 数&lt;/td&gt;
      &lt;td&gt;並行・性能の前提が変わる。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;ランタイム・panic&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;panic(nil)&lt;/code&gt; / 型なし nil が &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*runtime.PanicNilError&lt;/code&gt; を panic（以前は panic しない）&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=panicnil=1&lt;/code&gt; または &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.20&lt;/code&gt; 以前。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;パッケージ初期化&lt;/td&gt;
      &lt;td&gt;初期化順が規定（import path 順）；以前は未定義&lt;/td&gt;
      &lt;td&gt;暗黙の初期化順に依存したコードに影響。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;言語（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;for&lt;/code&gt;）&lt;/td&gt;
      &lt;td&gt;ループ変数が反復ごとに新規（以前は共有）。クロージャの捕獲が変わる&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt; の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.22&lt;/code&gt; 以上で有効。よくある移行ポイント。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http.ServeMux&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;メソッド接頭辞（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST /path&lt;/code&gt;）、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{name}&lt;/code&gt; ワイルドカード、エスケープ変更&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpmuxgo121=1&lt;/code&gt; で Go 1.21 挙動。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go/types&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;型エイリアスが &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alias&lt;/code&gt; として表現（以前は下位型と同一扱い）&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=gotypesalias=0&lt;/code&gt;（1.22 既定）；1.23 から既定1、1.27 で削除予定。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;TLS・crypto&lt;/td&gt;
      &lt;td&gt;最小 TLS 1.2；RSA KEX や 3DES など削除（以降も継続）&lt;/td&gt;
      &lt;td&gt;複数の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt;、一部 1.27 で削除。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt; が作る channel がアンバッファ；&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timer.Stop&lt;/code&gt; 等の正しい使い方に影響&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=asynctimerchan=0&lt;/code&gt;（1.27 で削除予定）。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;エラー応答で &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.ServeContent&lt;/code&gt; が一部 header を除去&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpservecontentkeepheaders=1&lt;/code&gt;。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;・TLS&lt;/td&gt;
      &lt;td&gt;負のシリアル拒否；&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Leaf&lt;/code&gt; の扱い変更など&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509negativeserial=0&lt;/code&gt; 等。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.24&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Certificate Policies フィールドの扱い&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=x509usepolicies=0&lt;/code&gt;。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;ランタイム・nil チェック&lt;/td&gt;
      &lt;td&gt;一部 nil デリファレンス（例: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f, err := os.Open(); f.Name()&lt;/code&gt; で &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f==nil&lt;/code&gt;）が即 panic（以前は遅延することがあった）&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt; なし。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;err&lt;/code&gt; を先に確認。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25+&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;プラットフォーム&lt;/td&gt;
      &lt;td&gt;古い OS サポート廃止（例: macOS 11、32-bit windows/arm）；Wasm エクスポート変更&lt;/td&gt;
      &lt;td&gt;API 以外だがビルドに影響。&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;新しい&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;で古い&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;が生成した証明書を読むと、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;の変更でパースに失敗することがある。&lt;/p&gt;

&lt;p&gt;互換性のもう一つの顔は&lt;strong&gt;ツールチェーンの分断&lt;/strong&gt;で、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt;まわりが特に顕著だ。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# コア&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/protobuf/cmd/protoc-gen-go@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

&lt;span class=&quot;c&quot;&gt;# バリデーション&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/envoyproxy/protoc-gen-validate@latest

&lt;span class=&quot;c&quot;&gt;# HTTP ゲートウェイ&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest

&lt;span class=&quot;c&quot;&gt;# API ドキュメント&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/google/gnostic/cmd/protoc-gen-openapi@latest
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;こんなに入れても、古い&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;に下げると &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; すら動かない。
互換バージョンを探して、ツールの海で&lt;strong&gt;迷子&lt;/strong&gt;になる。&lt;/p&gt;

&lt;p&gt;常に最新の&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;とは限らないので、作業フローは奇妙になる：&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt;で&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt;をいじって古い&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;に切り替え → デバッグスタック非対応 → 対応版のツール ABCD を探す → A、次 B、次 C… のループ。&lt;/p&gt;

&lt;p&gt;本当はプログラムを動かしたいだけなのに、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; のバージョンいじりに時間を焼く。&lt;/p&gt;

&lt;h3 id=&quot;windowはgolang開発に向かない&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt;は&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;開発に向かない&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt;ではサードパーティツールの多くがビルドすら通らず、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt;が笑い話になる。
なので&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;開発は、なるべく&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Linux&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mac&lt;/code&gt;を使う流れになる。&lt;/p&gt;

&lt;h2 id=&quot;選択的コンパイルの欠如&quot;&gt;選択的コンパイルの欠如&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt;には &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; や C 系のような&lt;strong&gt;プリプロセッサ級&lt;/strong&gt;の条件コンパイルがない：構文のなかで &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; によって&lt;strong&gt;選ばれないビルド&lt;/strong&gt;から丸ごと削る、というやり方はできない。近いのは &lt;strong&gt;build tags&lt;/strong&gt;（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build&lt;/code&gt;）でファイルを分けるか、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime.GOOS&lt;/code&gt; などの分岐で、意味も手触りも違う。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; 出身だと「選択的コンパイル」が足りないと感じる。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; でよくある例（概略）：&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;// 1) シンボルでブロックを切る（DEBUG は Debug 構成で定義）&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if DEBUG
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Debug ビルドにだけ存在&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if MY_FEATURE
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// csproj の &amp;lt;DefineConstants&amp;gt; かコンパイラで MY_FEATURE を定義&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;DoExperimentalStuff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// 2) Conditional: シンボル未定義なら呼び出し側が削られる（メソッド自体は残り得る）&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;App&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Conditional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;VERBOSE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;VERBOSE 未定義なら呼び出し命令は生成されない&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;対して&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt;は「ビルドごとに実装を差し替える」なら、だいたいファイル単位の条件（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build linux&lt;/code&gt;）かリンク時の工夫で、関数の半分を &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; で畳むことはしない。&lt;/p&gt;

&lt;p&gt;その手のタグを使わないなら、&lt;strong&gt;環境変数&lt;/strong&gt;で切り替える以外、すぐには思いつかない。&lt;/p&gt;

&lt;h2 id=&quot;あとがき&quot;&gt;あとがき&lt;/h2&gt;

&lt;p&gt;ここまで書いて、&lt;strong&gt;AI時代&lt;/strong&gt;に技術を共有することにまだ意味があるのか、自分に問う。&lt;/p&gt;

&lt;p&gt;入門した頃、先輩はブログに問題と解を書けと言った。その習慣は10年、途切れ途切れ続いている。&lt;/p&gt;

&lt;p&gt;いまはAI時代で、人間の学習速度はAIに追いつかない。それでも&lt;strong&gt;批判的思考&lt;/strong&gt;のおかげでAIに流されにくく、AIは計算の補助だと割り切っている。&lt;/p&gt;

&lt;p&gt;最終的なリスクは自分が負う。長年の経験で、&lt;strong&gt;運命&lt;/strong&gt;は自分の手で握る以外、外物に引きずられる。&lt;/p&gt;

&lt;p&gt;だから技術ブログそのものに意味はない。&lt;strong&gt;考えること自体が意味&lt;/strong&gt;で、まとめるのはプロセスに過ぎず、記事は後世が懐かしむ結果にすぎない。&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    
&lt;p&gt;В двух словах: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; — это высокопроизводительный язык для сетевого программирования, не больше.&lt;/p&gt;

&lt;h2 id=&quot;ловушки-нулевых-значений&quot;&gt;Ловушки нулевых значений&lt;/h2&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AllBasicTypes&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Str&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;I8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;int8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;int64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;I&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;U8&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U16&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint16&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;uint64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;U&lt;/span&gt;    &lt;span class=&quot;kt&quot;&gt;uint&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Up&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;uintptr&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;By&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// uint8&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Ru&lt;/span&gt;   &lt;span class=&quot;kt&quot;&gt;rune&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// int32&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;F32&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float32&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;F64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;float64&lt;/span&gt;

	&lt;span class=&quot;n&quot;&gt;C64&lt;/span&gt;  &lt;span class=&quot;kt&quot;&gt;complex64&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;C128&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;complex128&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// var v AllBasicTypes — нулевые значения полей: false, &quot;&quot;, 0, 0.0, (0+0i) и т.д.&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Чтобы не ловить «как в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Java&lt;/code&gt;» проблемы с нулевыми указателями, в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; принята модель &lt;strong&gt;нулевых значений по умолчанию&lt;/strong&gt;. Поэтому при проектировании с &lt;strong&gt;нулевыми значениями&lt;/strong&gt; нужно быть осторожным.
Для структуры выше после &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var v AllBasicTypes&lt;/code&gt; поле &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.B&lt;/code&gt; даёт &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt;, а &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v.U8&lt;/code&gt; — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;В реальных сценариях непонятно: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B&lt;/code&gt; это именно &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt; или поле &lt;strong&gt;не задано&lt;/strong&gt;. Обычно добавляют отдельную карту «установлено ли» или используют странный тип &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*bool&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;time&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;google.golang.org/protobuf/types/known/timestamppb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Плохой пример: нулевое значение time.Time&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// или time.Time{}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timestamppb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;New&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;c&quot;&gt;// Сериализация падает&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proto&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Marshal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protoTs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;// например: proto: Google.Protobuf.Timestamp.Seconds out of range -62135596800&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ошибка из-за нулевого времени и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt; &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timestamp&lt;/code&gt;&lt;/strong&gt; почти незаметна.
Внизу стека вы могли объявить поле как &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time.Time&lt;/code&gt;, а на верхнем уровне &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API&lt;/code&gt; десериализация уже не проходит.&lt;/p&gt;

&lt;h2 id=&quot;слабая-сеть&quot;&gt;Слабая сеть&lt;/h2&gt;

&lt;p&gt;При плохой сети &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; неудобен: стандартная библиотека скромная, постоянно нужен &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt;, а в Китае без прокси &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go get&lt;/code&gt; почти нереалистичен.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/2026-04-19-golang-problems/golang-diamond-dependency.png&quot; alt=&quot;Go-модули: ромбовидная зависимость и несколько версий общей зависимости C&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Даже если сеть и &lt;strong&gt;ромбовидные зависимости&lt;/strong&gt; третьих сторон «решены», при слабом канале &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; всё равно мучителен. Исходники скачал — а разработка и сборка всё равно упираются в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt;, расширение &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt;.
Расширение для &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vscode&lt;/code&gt; не «из коробки»: поставил — и всё равно ставишь &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; и прочее.&lt;/p&gt;

&lt;h2 id=&quot;совместимость&quot;&gt;Совместимость&lt;/h2&gt;

&lt;p&gt;Совместимость делится на &lt;strong&gt;совместимость ОС&lt;/strong&gt; и &lt;strong&gt;совместимость языка вперёд по версиям&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;когда-golang-не-совместим-вперёд&quot;&gt;Когда &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; не совместим вперёд&lt;/h3&gt;

&lt;p&gt;Мало кто знает, что за годы в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; были &lt;strong&gt;несовместимые вперёд&lt;/strong&gt; изменения:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Версия Go&lt;/th&gt;
      &lt;th&gt;Категория&lt;/th&gt;
      &lt;th&gt;Что сломалось&lt;/th&gt;
      &lt;th&gt;Обход / примечание&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1 (2012)&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Язык и стандартная библиотека&lt;/td&gt;
      &lt;td&gt;Огромный разрыв с pre-Go 1 (r60 и т.д.): пути пакетов (напр. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encoding/asn1&lt;/code&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;os.Error&lt;/code&gt; → &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;error&lt;/code&gt;, переработка &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delete&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rune&lt;/code&gt;, случайный порядок обхода map и т.д.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go fix&lt;/code&gt;. Крупнейшая ломающая миграция.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.1&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Язык и платформы&lt;/td&gt;
      &lt;td&gt;Деление константы на ноль — ошибка; на 64-bit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uint&lt;/code&gt; 64-битные; часть &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;syscall&lt;/code&gt;.&lt;/td&gt;
      &lt;td&gt;Прямой эффект на сборку и выполнение.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.5&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Рантайм&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOMAXPROCS&lt;/code&gt; по умолчанию 1 → число CPU.&lt;/td&gt;
      &lt;td&gt;Меняются допущения про параллелизм.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Рантайм и panic&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;panic(nil)&lt;/code&gt; / нетипизированный nil паникует &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*runtime.PanicNilError&lt;/code&gt; (раньше не паниковал).&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=panicnil=1&lt;/code&gt; или &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.20&lt;/code&gt; и ниже.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.21&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Инициализация пакетов&lt;/td&gt;
      &lt;td&gt;Порядок инициализации задан (по import path); раньше — не определён.&lt;/td&gt;
      &lt;td&gt;Код, завязанный на неявный порядок, может сломаться.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Язык (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;for&lt;/code&gt;)&lt;/td&gt;
      &lt;td&gt;Переменная цикла на каждую итерацию (раньше одна на все). Меняется захват в замыканиях.&lt;/td&gt;
      &lt;td&gt;Включается &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go 1.22+&lt;/code&gt; в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt;; частая точка миграции.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http.ServeMux&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Префиксы методов (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POST /path&lt;/code&gt;), шаблоны &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{name}&lt;/code&gt;, экранирование.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpmuxgo121=1&lt;/code&gt; — поведение Go 1.21.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go/types&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Псевдонимы типов как &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alias&lt;/code&gt; (раньше совпадали с основным типом).&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=gotypesalias=0&lt;/code&gt; (по умолчанию в 1.22); с 1.23 по умолчанию 1; уберут в 1.27.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.22&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;TLS и crypto&lt;/td&gt;
      &lt;td&gt;Минимум TLS 1.2; выкидывание RSA KEX, 3DES и т.д.&lt;/td&gt;
      &lt;td&gt;Несколько флагов &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt;, часть снимут в 1.27.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Каналы из &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time&lt;/code&gt; — небуферизованные; влияет на корректный &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Timer.Stop&lt;/code&gt;.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=asynctimerchan=0&lt;/code&gt; (уберут в 1.27).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;net/http&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http.ServeContent&lt;/code&gt; убирает часть заголовков при ошибках.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=httpservecontentkeepheaders=1&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.23&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt; и TLS&lt;/td&gt;
      &lt;td&gt;Отрицательные серийные номера; изменения с полем &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Leaf&lt;/code&gt; и т.д.&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509negativeserial=0&lt;/code&gt; и др.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.24&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Политики сертификатов (Policies).&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG=x509usepolicies=0&lt;/code&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Рантайм и nil&lt;/td&gt;
      &lt;td&gt;Часть разыменований nil (напр. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f, err := os.Open(); f.Name()&lt;/code&gt; при &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f==nil&lt;/code&gt;) паникует сразу (раньше иногда откладывалось).&lt;/td&gt;
      &lt;td&gt;Без &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GODEBUG&lt;/code&gt;; чинить код (сначала &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;err&lt;/code&gt;).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Go 1.25+&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Платформы&lt;/td&gt;
      &lt;td&gt;Снятие поддержки старых ОС (напр. macOS 11, 32-bit windows/arm); изменения Wasm.&lt;/td&gt;
      &lt;td&gt;Влияет на сборку/порты.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Разбор сертификатов, сгенерированных старым &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;, новым компилятором может падать из-за изменений в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x509&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Другая сторона — &lt;strong&gt;раскол инструментов&lt;/strong&gt;; с &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;proto&lt;/code&gt; это особенно заметно.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# База&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/protobuf/cmd/protoc-gen-go@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

&lt;span class=&quot;c&quot;&gt;# Валидация&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/envoyproxy/protoc-gen-validate@latest

&lt;span class=&quot;c&quot;&gt;# HTTP-шлюз&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest

&lt;span class=&quot;c&quot;&gt;# Документация API&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;github.com/google/gnostic/cmd/protoc-gen-openapi@latest
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Столько всего поставил — а на старом &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; даже &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dlv&lt;/code&gt; не стартует.
Ищешь совместимые версии и &lt;strong&gt;теряешься&lt;/strong&gt; в наборе плагинов.&lt;/p&gt;

&lt;p&gt;Не всегда можно сидеть на последнем &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;, поэтому цепочка действий становится странной:&lt;/p&gt;

&lt;p&gt;Меняешь &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt; на старый &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; → стек отладки не подходит → ищешь инструменты A B C D под версию → починил A, потом B, потом C, по кругу.&lt;/p&gt;

&lt;p&gt;Ты хотел просто запустить программу, а время уходит на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; с версиями.&lt;/p&gt;

&lt;h3 id=&quot;window-плохо-подходит-под-golang&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt; плохо подходит под &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;На &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window&lt;/code&gt; много сторонних утилит не собирается; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; превращается в анекдот.
Поэтому для &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;golang&lt;/code&gt; чаще уходят на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Linux&lt;/code&gt; / &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mac&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;нет-условной-компиляции-в-стиле-препроцессора&quot;&gt;Нет условной компиляции в стиле препроцессора&lt;/h2&gt;

&lt;p&gt;У &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; нет &lt;strong&gt;препроцессорной&lt;/strong&gt; условной компиляции как у &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; / C: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt;, вырезающего целые куски из &lt;strong&gt;несобранных конфигураций&lt;/strong&gt;. Ближе всего — &lt;strong&gt;build tags&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build&lt;/code&gt;) по разным файлам или ветки &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;runtime.GOOS&lt;/code&gt;; смысл и эргономика другие. С фона &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; явно чувствуешь отсутствие «выборочной компиляции».&lt;/p&gt;

&lt;p&gt;Типичные приёмы в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; (схематично):&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;// 1) Обрезка кода по символу (DEBUG задаётся в Debug)&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if DEBUG
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Только в Debug-сборке&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if MY_FEATURE
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;// MY_FEATURE — в csproj &amp;lt;DefineConstants&amp;gt; или флагах компилятора&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;DoExperimentalStuff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// 2) Conditional: если символ не задан, вызовы вырезаются (метод может остаться)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System.Diagnostics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;App&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Conditional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;VERBOSE&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;VerboseLog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Без VERBOSE вызов не попадёт в IL&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Для &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Go&lt;/code&gt; смена реализации между сборками — обычно условия на уровне файлов (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;//go:build linux&lt;/code&gt;) или трюки линковки, а не &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#if&lt;/code&gt; на полфункции.&lt;/p&gt;

&lt;p&gt;Без таких тегов, кроме &lt;strong&gt;переменных окружения&lt;/strong&gt;, другого аккуратного варианта я не вижу.&lt;/p&gt;

&lt;h2 id=&quot;постскриптум&quot;&gt;Постскриптум&lt;/h2&gt;

&lt;p&gt;Пишу это и спрашиваю себя: есть ли смысл делиться технологиями в &lt;strong&gt;эпоху ИИ&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Когда я начинал, советовали вести блог с проблемами и решениями. Так я делаю с перерывами уже десять лет.&lt;/p&gt;

&lt;p&gt;Скорость обучения людей не догоняет ИИ — но &lt;strong&gt;критическое мышление&lt;/strong&gt; не даёт увлечься потоком; ИИ для меня вспомогательный «калькулятор».&lt;/p&gt;

&lt;p&gt;Риск всё равно на мне. Годы показали: &lt;strong&gt;судьбу&lt;/strong&gt; держишь в своих руках — или тебя волокут обстоятельства.&lt;/p&gt;

&lt;p&gt;Значит сам пост не цель. &lt;strong&gt;Смысл — в размышлении&lt;/strong&gt;; систематизация — процесс; статья — лишь след для тех, кто потом вспомнит.&lt;/p&gt;

&lt;/div&gt;
</description>
        <pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/04/19/golang-problems/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/04/19/golang-problems/</guid>
        
        <category>go</category>
        
        
      </item>
    
      <item>
        <title>不幂等电梯与P=NP中的分家产问题</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;p&gt;幂等性是程序设计的一种重要原则。&lt;/p&gt;

&lt;p&gt;举个最简单的例子，去ATM取钱，确认好数字，按下确认之后，机器会开始吐钱。但这个过程中如果再按下“确认”，
而ATM还会接着吐钱，那么这个设计就是不幂等的。&lt;/p&gt;

&lt;p&gt;当然现实没有那么好的事情，按下确认到收钱的这个时间段，在程序设计中属于一个“事务锁”的阶段。这期间按100次确认也是徒劳。&lt;/p&gt;

&lt;p&gt;不知不觉之间,ATM也成为了即将被淘汰的消费电子类产品。但幂等原则和数据库事务这类基本原理没有消失。&lt;/p&gt;

&lt;h2 id=&quot;不幂等电梯&quot;&gt;不幂等电梯&lt;/h2&gt;

&lt;p&gt;比如我最近遇到一种“不幂等电梯”。在传统商业建筑中，运营为了方便一般会设置“1对N幂等”——按下下行之后，所有下行灯一起亮，然后调度中心分配一个最近的电梯。这种我称为“幂等电梯”。&lt;/p&gt;

&lt;p&gt;不幂等电梯，是把面板上下行按钮跟调度中心分离。比如一栋楼有3部挨着的电梯。按下面板上的上下行，只是控制“1对1”关联的那部电梯。如果想要另外一部电梯，那就按另外一个面板。这种我称为“不幂等电梯”。
本文只讨论不幂等电梯场景。&lt;/p&gt;

&lt;h2 id=&quot;个体自私导致群体延误&quot;&gt;个体自私导致群体延误&lt;/h2&gt;

&lt;p&gt;结合过往的统计规律，应用时间序列编程对“不幂等电梯”场景建模，假设工作时间是 9:00 ~ 18:30 ，那么在上下班临界点10分钟内，对于楼层&amp;lt;10 的写字楼，按照我的经验，基本上是走步梯比较快。&lt;/p&gt;

&lt;p&gt;而假设场景中的人只有1个，实际上选取电梯的策略非常简单，选择“离自己最近的那部同向电梯”便是最佳策略：&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;//工作楼层&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;//上班时间&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;//下班时间&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Person 表示人&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 时间&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;//当前楼层&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;TargetFloor&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;//目标楼层&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MVP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;//walking&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;//找到离自己最近的节点并选择&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然而实际情况更多的是N人抢3部电梯这种情况比较多。这个策略会在N人情景下立刻失效。&lt;/p&gt;

&lt;p&gt;因为“这栋楼有多少人在等电梯”对于所有不在监控室里的人来说是一个黑盒。&lt;/p&gt;

&lt;p&gt;因此很多人会选择 “all” 策略——所有按钮一起按，甚至在下班的时候先上行再下行。即便所有人不倒着按电梯，下班的时候所有按钮都按下，也会导致下行的电梯几乎每层都停。&lt;/p&gt;

&lt;p&gt;当然，有些人会反驳，说可以设置一个“FL”的状态，当电梯满载时一路下行不停任何楼层。
但在4人4梯时，这个问题依旧很明显——4个人分布在不同楼层，决策方向完全随机，如果所有人4个面板一起按，会造成电梯资源最大程度的浪费。&lt;/p&gt;

&lt;p&gt;不幂等电梯揭露了一个问题：&lt;strong&gt;追求个体利益的最大化会损害群体利益，并最终影响到自己的收益&lt;/strong&gt;。因为搭电梯是为了尽可能地省时间，收益函数是时间。
如果所有人都按下所有按钮，表面看来所有电梯都会朝着自己来，但最终还是导致乘梯时间最大化。&lt;/p&gt;

&lt;h2 id=&quot;pnp中的分家产问题&quot;&gt;P=NP中的分家产问题&lt;/h2&gt;

&lt;p&gt;不幂等电梯代表了&lt;strong&gt;集体利益与个人利益的绝对矛盾&lt;/strong&gt;。除了把电梯调整为“幂等”，让调度中心去协调之外，
似乎没有很好的解法。但如果把电梯直接量化为家产，把分配电梯当成P=NP中的分蛋糕（我个人更愿意称为“分家产”难题）。那么问题似乎简单一点。&lt;/p&gt;

&lt;p&gt;转换一下问题，把 N 个参与人缩小为数量可控的“子女”，电梯转换为现金，那么所有参与人，彼此之间就不是“黑盒”的状态。&lt;/p&gt;

&lt;p&gt;那么在我看来，公平分配（每个人都认为自己至少得到了蛋糕的 1/n 价值）是不存在的——假设我作为家族财产管理人，名下有几个子女。为了资产的长远递增，那就不可能全部现金N等分，然后取一份给未满18岁的儿子。&lt;/p&gt;

&lt;p&gt;更别提每个人照镜子的时候都有自我美化倾向（曝光效应）。对自我评价比客观事实高，这是一种普遍现象。这种认知偏差，加上客观条件限制，就导致了分家产问题不可能有对所有人公平的解法。&lt;/p&gt;

&lt;p&gt;按照历史的统计经验，分家产问题最后还是看各位继承人的投资理财水平，根据实际的财务收益和能力特长，通过时间的检验，最终才能得到一个解法。&lt;/p&gt;

&lt;p&gt;至此，我终于理解了&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/web/shoggoth.go&quot;&gt;修格斯&lt;/a&gt;的分布式求偶这种行为艺术，通过&lt;strong&gt;广撒网，多捞鱼&lt;/strong&gt;的渣男策略，实现面向时间效率优化的多对象差异学习梯度下降。&lt;/p&gt;

&lt;h2 id=&quot;近水楼台先得月&quot;&gt;近水楼台先得月&lt;/h2&gt;

&lt;p&gt;A little closer to the bank,
Where coins and notes are in the rank.&lt;/p&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    &lt;p&gt;Idempotency is an important principle in program design.&lt;/p&gt;

&lt;p&gt;Take the simplest example: withdrawing cash from an ATM. You confirm the amount and press “confirm”, then the machine starts dispensing money. But if pressing “confirm” again during this process makes the ATM continue dispensing, then this design is non-idempotent.&lt;/p&gt;

&lt;p&gt;Of course, reality is not that generous. The time window between pressing confirm and receiving cash belongs to a “transaction lock” phase in program design. During this period, pressing confirm 100 times is still futile.&lt;/p&gt;

&lt;p&gt;Before we noticed it, ATMs also became consumer electronics that are about to be phased out. But principles like idempotency and database transactions have not disappeared.&lt;/p&gt;

&lt;h2 id=&quot;non-idempotent-elevator&quot;&gt;Non-idempotent Elevator&lt;/h2&gt;

&lt;p&gt;For example, I recently encountered a kind of “non-idempotent elevator”. In traditional commercial buildings, operations usually set up a “1-to-N idempotency” model for convenience: after pressing down, all down indicators light up together, and then the dispatch center assigns the nearest elevator. I call this an “idempotent elevator”.&lt;/p&gt;

&lt;p&gt;A non-idempotent elevator separates the up/down panel buttons from the dispatch center. For instance, if a building has 3 adjacent elevators, pressing up/down on one panel only controls the “1-to-1” mapped elevator. If you want another one, you press another panel. I call this a “non-idempotent elevator”. This article only discusses the non-idempotent elevator scenario.&lt;/p&gt;

&lt;h2 id=&quot;individual-selfishness-causes-collective-delay&quot;&gt;Individual selfishness causes collective delay&lt;/h2&gt;

&lt;p&gt;Based on historical statistical patterns, and modeling the “non-idempotent elevator” scenario with time-series programming, suppose working hours are 9:00 ~ 18:30. Then within 10 minutes of commuting critical points, for office buildings with floors &amp;lt;10, in my experience, taking the stairs is basically faster.&lt;/p&gt;

&lt;p&gt;If there is only 1 person in the scenario, the strategy for choosing an elevator is actually very simple: choose “the nearest elevator moving in the same direction” as the optimal strategy:&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// working floor&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// work start time&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// work end time&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Person represents a person&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// time&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// current floor&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;TargetFloor&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// target floor&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MVP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;//walking&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;// find and choose the nearest elevator&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, in reality, cases like N people competing for 3 elevators are much more common. This strategy fails immediately under the N-person scenario.&lt;/p&gt;

&lt;p&gt;Because “how many people are waiting for elevators in this building” is a black box for everyone not in the control room.&lt;/p&gt;

&lt;p&gt;So many people choose the “all” strategy - pressing every button together, and even going up first then down after work. Even if no one presses in reverse order, if everyone presses all buttons after work, down-moving elevators will still stop at almost every floor.&lt;/p&gt;

&lt;p&gt;Of course, some people may argue we can set an “FL” state: when an elevator is fully loaded, it goes straight down without stopping at any floor.
But in a 4-people-4-elevators case, the problem is still obvious - 4 people are distributed on different floors, decision directions are completely random, and if everyone presses all 4 panels together, elevator resources are wasted to the greatest extent.&lt;/p&gt;

&lt;p&gt;Non-idempotent elevators expose one fact: &lt;strong&gt;maximizing individual benefit harms collective benefit, and eventually harms one’s own payoff&lt;/strong&gt;. Because taking elevators is meant to save as much time as possible, and the utility function is time.
If everyone presses all buttons, it seems all elevators will come toward them, but in the end it still maximizes total elevator riding time.&lt;/p&gt;

&lt;h2 id=&quot;the-estate-division-problem-in-pnp&quot;&gt;The estate division problem in P=NP&lt;/h2&gt;

&lt;p&gt;A non-idempotent elevator represents the &lt;strong&gt;absolute conflict between collective interest and individual interest&lt;/strong&gt;. Other than turning elevators into an “idempotent” model and letting the dispatch center coordinate,
there seems to be no good solution. But if we directly quantify elevators as estate assets, and treat elevator allocation as the cake-cutting problem in P=NP (personally I prefer to call it the “estate division” problem), then the issue seems slightly simpler.&lt;/p&gt;

&lt;p&gt;Let’s transform the problem: shrink N participants into a controllable number of “children”, and convert elevators into cash. Then all participants are no longer in a “black box” state relative to each other.&lt;/p&gt;

&lt;p&gt;In my view, fair division (everyone believes they have received at least 1/n value of the cake) does not exist - suppose I am the family asset manager and have several children. For long-term asset growth, it is impossible to split all cash into equal N shares and hand one share to a son under 18.&lt;/p&gt;

&lt;p&gt;Not to mention that when people look in the mirror, they tend to self-enhance (mere exposure effect). Rating oneself higher than objective facts is a common phenomenon. This cognitive bias, combined with objective constraints, makes it impossible to have an estate-division solution fair to everyone.&lt;/p&gt;

&lt;p&gt;According to historical statistical experience, the final outcome of estate division still depends on each heir’s investment and wealth-management capability. Based on real financial returns and talent strengths, and through the test of time, a solution can finally emerge.&lt;/p&gt;

&lt;p&gt;At this point, I finally understood the behavioral art of distributed courtship by &lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/web/shoggoth.go&quot;&gt;Shoggoth&lt;/a&gt;: using the scumbag strategy of &lt;strong&gt;casting a wide net and catching more fish&lt;/strong&gt;, to achieve multi-object differential learning gradient descent optimized for time efficiency.&lt;/p&gt;

&lt;h2 id=&quot;nearby-advantage&quot;&gt;Nearby advantage&lt;/h2&gt;

&lt;p&gt;A little closer to the bank,
Where coins and notes are in the rank.&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    &lt;p&gt;冪等性はプログラム設計における重要な原則のひとつである。&lt;/p&gt;

&lt;p&gt;最も簡単な例を挙げるなら、ATMで現金を引き出す場面だ。金額を確認して「confirm」を押すと、機械は現金を吐き出し始める。だがこの過程で再び「confirm」を押し、ATMがさらにお金を出し続けるなら、その設計は非冪等である。&lt;/p&gt;

&lt;p&gt;もちろん現実はそんなに都合よくない。confirmを押してから現金を受け取るまでの時間帯は、プログラム設計では「トランザクションロック」の段階に属する。この間にconfirmを100回押しても無駄だ。&lt;/p&gt;

&lt;p&gt;いつの間にかATMも、淘汰されつつあるコンシューマーエレクトロニクス製品になった。だが冪等原則やデータベーストランザクションのような基礎原理は消えていない。&lt;/p&gt;

&lt;h2 id=&quot;非冪等エレベーター&quot;&gt;非冪等エレベーター&lt;/h2&gt;

&lt;p&gt;例えば最近、私は「非冪等エレベーター」に遭遇した。従来の商業ビルでは、運用上の都合で通常「1対N冪等」が設定される。下行ボタンを押すと、すべての下行ランプが同時に点灯し、配車センターが最寄りのエレベーターを割り当てる。私はこれを「冪等エレベーター」と呼ぶ。&lt;/p&gt;

&lt;p&gt;非冪等エレベーターは、パネルの上下ボタンと配車センターを分離する。例えば1棟に隣接した3基のエレベーターがある場合、あるパネルの上下ボタンを押しても、その「1対1」で対応する1基しか制御しない。別のエレベーターが欲しければ、別のパネルを押す。この方式を私は「非冪等エレベーター」と呼ぶ。この記事では非冪等エレベーターのシナリオのみを扱う。&lt;/p&gt;

&lt;h2 id=&quot;個人の利己性が集団遅延を生む&quot;&gt;個人の利己性が集団遅延を生む&lt;/h2&gt;

&lt;p&gt;過去の統計規則を組み合わせ、時系列プログラミングで「非冪等エレベーター」シナリオをモデル化する。勤務時間を 9:00 ~ 18:30 と仮定すると、出退勤の臨界点10分以内では、階数&amp;lt;10 のオフィスビルなら、私の経験上、ほぼ階段の方が速い。&lt;/p&gt;

&lt;p&gt;一方で、シナリオ内の人が1人だけだと仮定すれば、実際のエレベーター選択戦略は非常に単純で、「自分に最も近い同方向のエレベーター」を選ぶのが最適戦略になる。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// 勤務フロア&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 始業時刻&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 終業時刻&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Person は人を表す&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 時刻&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// 現在の階&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;TargetFloor&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// 目的階&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MVP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;// 徒歩&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;// 自分に最も近いエレベーターを選ぶ&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;しかし現実には、N人で3基のエレベーターを奪い合うケースの方がずっと多い。この戦略はN人シナリオではすぐに破綻する。&lt;/p&gt;

&lt;p&gt;なぜなら「このビルで何人がエレベーター待ちをしているか」は、監視室にいないすべての人にとってブラックボックスだからだ。&lt;/p&gt;

&lt;p&gt;そのため多くの人は「all」戦略、つまり全ボタン同時押しを選ぶ。退勤時には、先に上行を押してから下行を押す人すらいる。たとえ逆押しをしなくても、退勤時に全員が全ボタンを押せば、下行エレベーターはほぼ各階に停止してしまう。&lt;/p&gt;

&lt;p&gt;もちろん、「FL」状態を設定し、満載時はどの階にも止まらず一気に下行させればよい、と反論する人もいる。
しかし4人4基でもこの問題は依然として顕著だ。4人が別々の階に分布し、意思決定方向が完全にランダムな中で、全員が4つのパネルを同時に押せば、エレベーター資源は最大限に浪費される。&lt;/p&gt;

&lt;p&gt;非冪等エレベーターはひとつの問題を暴く。&lt;strong&gt;個人利益の最大化追求は集団利益を損ない、最終的には自分自身の利益にも影響する&lt;/strong&gt;。エレベーターに乗る目的は時間をできるだけ節約することであり、利得関数は時間だからだ。
全員が全ボタンを押せば、表面上はすべてのエレベーターが自分の方へ来るように見えるが、最終的には乗梯時間を最大化してしまう。&lt;/p&gt;

&lt;h2 id=&quot;pnpにおける遺産分割問題&quot;&gt;P=NPにおける遺産分割問題&lt;/h2&gt;

&lt;p&gt;非冪等エレベーターは、&lt;strong&gt;集団利益と個人利益の絶対的な矛盾&lt;/strong&gt;を表している。エレベーターを「冪等」に調整し、配車センターに協調させる以外に、
良い解法はなさそうだ。だがエレベーターを遺産として定量化し、エレベーター配分をP=NPにおけるケーキ分割（私は個人的に「遺産分割」難題と呼びたい）として捉えると、問題は少し単純になるように思える。&lt;/p&gt;

&lt;p&gt;問題を変換してみる。N人の参加者を数が管理しやすい「子女」に縮小し、エレベーターを現金に変換すれば、参加者同士はもはや「ブラックボックス」ではなくなる。&lt;/p&gt;

&lt;p&gt;私の見るところ、公平分配（各人が自分は少なくともケーキの 1/n の価値を得たと考えること）は存在しない。仮に私が家族資産管理人で、名義下に何人かの子女がいるとする。資産の長期増加を目指すなら、現金をN等分して18歳未満の息子に1つ渡す、というわけにはいかない。&lt;/p&gt;

&lt;p&gt;まして人は鏡を見ると自己美化傾向（単純接触効果）を持つ。自己評価が客観的事実より高いのは普遍的現象だ。この認知バイアスに客観条件の制約が加わることで、遺産分割問題には全員に公平な解法が存在しえなくなる。&lt;/p&gt;

&lt;p&gt;歴史的な統計経験に従えば、遺産分割問題の最終結果はやはり各相続人の投資・資産運用レベル次第だ。実際の財務収益と能力特長に基づき、時間の検証を経て、最終的にひとつの解が得られる。&lt;/p&gt;

&lt;p&gt;ここに至って私はついに、&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/web/shoggoth.go&quot;&gt;修格斯&lt;/a&gt;の分散求愛という行為芸術を理解した。&lt;strong&gt;広く網を撒き、多くの魚を獲る&lt;/strong&gt;という渣男戦略によって、時間効率最適化に向けた多対象差分学習勾配降下を実現しているのだ。&lt;/p&gt;

&lt;h2 id=&quot;近くの楼台は先に月を得る&quot;&gt;近くの楼台は先に月を得る&lt;/h2&gt;

&lt;p&gt;A little closer to the bank,
Where coins and notes are in the rank.&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    &lt;p&gt;Идемпотентность - один из важных принципов проектирования программ.&lt;/p&gt;

&lt;p&gt;Простейший пример: снятие наличных в ATM. Вы подтверждаете сумму и нажимаете “confirm”, после чего автомат начинает выдавать деньги. Но если в этот момент повторное нажатие “confirm” заставляет ATM продолжать выдачу, такой дизайн неидемпотентен.&lt;/p&gt;

&lt;p&gt;Конечно, в реальности таких чудес не бывает. Период между нажатием confirm и получением денег в программировании относится к стадии “transaction lock”. В это время хоть 100 раз нажимай confirm - бесполезно.&lt;/p&gt;

&lt;p&gt;Незаметно для нас ATM тоже стал видом потребительской электроники, которая скоро уйдет в прошлое. Но базовые принципы вроде идемпотентности и транзакций базы данных никуда не исчезли.&lt;/p&gt;

&lt;h2 id=&quot;неидемпотентный-лифт&quot;&gt;Неидемпотентный лифт&lt;/h2&gt;

&lt;p&gt;Например, недавно я столкнулся с видом “неидемпотентного лифта”. В традиционных коммерческих зданиях для удобства эксплуатации обычно настраивают модель “1 к N идемпотентности”: после нажатия кнопки вниз загораются все индикаторы вниз, а диспетчерский центр назначает ближайший лифт. Я называю это “идемпотентным лифтом”.&lt;/p&gt;

&lt;p&gt;Неидемпотентный лифт отделяет кнопки вверх/вниз на панели от диспетчерского центра. Допустим, в здании стоят рядом 3 лифта. Нажатие вверх/вниз на одной панели управляет только тем лифтом, который связан с ней по схеме “1 к 1”. Нужен другой лифт - нажимаешь другую панель. Это я и называю “неидемпотентным лифтом”. В статье рассматривается только этот сценарий.&lt;/p&gt;

&lt;h2 id=&quot;индивидуальный-эгоизм-приводит-к-задержкам-для-группы&quot;&gt;Индивидуальный эгоизм приводит к задержкам для группы&lt;/h2&gt;

&lt;p&gt;Если, опираясь на прошлые статистические закономерности, смоделировать сценарий “неидемпотентного лифта” через time-series programming и предположить рабочее время 9:00 ~ 18:30, то в 10-минутном окне вокруг пиков прихода/ухода, для офисных зданий с этажами &amp;lt;10, по моему опыту, по лестнице почти всегда быстрее.&lt;/p&gt;

&lt;p&gt;Если же в сценарии только 1 человек, стратегия выбора лифта на практике очень проста: оптимально выбрать “ближайший к себе лифт в том же направлении”:&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// рабочий этаж&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// время начала работы&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// время окончания работы&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Person обозначает человека&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// время&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt;       &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// текущий этаж&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;TargetFloor&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int16&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// целевой этаж&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;Work&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MVP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Floor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ClosingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WorkHours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Minute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;// пешком&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Elevator&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elevators&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;temp&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;c&quot;&gt;// найти и выбрать ближайший лифт&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bestElevator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Однако в реальности чаще встречается ситуация, когда N человек конкурируют за 3 лифта. В сценарии с N людьми эта стратегия сразу перестает работать.&lt;/p&gt;

&lt;p&gt;Потому что “сколько людей ждут лифт в этом здании” - это black box для всех, кто не находится в диспетчерской.&lt;/p&gt;

&lt;p&gt;Поэтому многие выбирают стратегию “all” - нажимают все кнопки сразу, а в час ухода с работы даже сначала вверх, потом вниз. Даже если никто не нажимает в обратном порядке, при нажатии всех кнопок всеми людьми в конце рабочего дня лифты, идущие вниз, останавливаются почти на каждом этаже.&lt;/p&gt;

&lt;p&gt;Конечно, кто-то возразит: можно задать состояние “FL”, чтобы при полной загрузке лифт шел вниз без остановок.
Но даже при 4 людях и 4 лифтах проблема остается очевидной - 4 человека распределены по разным этажам, направления решений полностью случайны, и если все нажимают все 4 панели сразу, ресурсы лифтов расходуются максимально неэффективно.&lt;/p&gt;

&lt;p&gt;Неидемпотентный лифт вскрывает одну проблему: &lt;strong&gt;максимизация индивидуальной выгоды вредит коллективной выгоде и в конце концов снижает собственный результат&lt;/strong&gt;. Потому что цель поездки на лифте - максимально экономить время, а функция полезности здесь - время.
Если все нажимают все кнопки, на первый взгляд кажется, что все лифты поедут к тебе, но в итоге это все равно максимизирует время поездки.&lt;/p&gt;

&lt;h2 id=&quot;проблема-раздела-наследства-в-pnp&quot;&gt;Проблема раздела наследства в P=NP&lt;/h2&gt;

&lt;p&gt;Неидемпотентный лифт представляет &lt;strong&gt;абсолютное противоречие между интересами коллектива и интересами индивида&lt;/strong&gt;. Кроме перевода лифтов в “идемпотентный” режим и координации через диспетчерский центр,
хорошего решения, похоже, нет. Но если напрямую квантифицировать лифты как наследственное имущество, а распределение лифтов рассматривать как задачу деления торта в P=NP (лично я предпочитаю называть это задачей “раздела наследства”), тогда проблема выглядит чуть проще.&lt;/p&gt;

&lt;p&gt;Переформулируем задачу: уменьшим N участников до управляемого числа “детей”, а лифты преобразуем в наличные. Тогда для всех участников друг друга уже не будет состояния “black box”.&lt;/p&gt;

&lt;p&gt;На мой взгляд, справедливого распределения (когда каждый считает, что получил как минимум 1/n ценности торта) не существует - допустим, я управляющий семейными активами и у меня несколько детей. Ради долгосрочного роста активов невозможно просто разделить всю наличность на N равных частей и отдать одну сыну младше 18 лет.&lt;/p&gt;

&lt;p&gt;Не говоря уже о том, что люди, глядя в зеркало, склонны к самоидеализации (mere exposure effect). Завышенная самооценка по сравнению с объективными фактами - распространенное явление. Это когнитивное искажение, плюс ограничения объективных условий, и приводят к тому, что у задачи раздела наследства не может быть решения, справедливого для всех.&lt;/p&gt;

&lt;p&gt;Согласно историческому статистическому опыту, в итоге в задаче раздела наследства все равно решают уровень инвестиционно-финансовых навыков наследников. На основе реальной финансовой доходности и индивидуальных сильных сторон, проверенных временем, в конце концов появляется решение.&lt;/p&gt;

&lt;p&gt;К этому моменту я наконец понял поведенческое искусство distributed courtship у &lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/web/shoggoth.go&quot;&gt;修格斯&lt;/a&gt;: через стратегию 渣男 вида &lt;strong&gt;广撒网，多捞鱼&lt;/strong&gt; реализуется multi-object differential learning gradient descent, оптимизированный по эффективности времени.&lt;/p&gt;

&lt;h2 id=&quot;кто-ближе-тот-и-первым&quot;&gt;Кто ближе, тот и первым&lt;/h2&gt;

&lt;p&gt;A little closer to the bank,
Where coins and notes are in the rank.&lt;/p&gt;

&lt;/div&gt;
</description>
        <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/03/27/elevator/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/03/27/elevator/</guid>
        
        <category>n</category>
        
        
      </item>
    
      <item>
        <title>中国Windows系统使用多个版本的go</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;p&gt;还记得我之前提出过的0号规律吗？&lt;strong&gt;边际收益为0的重构不要去做&lt;/strong&gt;。我已经遇过2次因为底层go版本的实现变化，而导致的无法升级项目go版本问题。&lt;/p&gt;

&lt;p&gt;由于工作环境的限制，CI的不支持，导致无法在工作环境中使用最用最新版本的golang。&lt;/p&gt;

&lt;p&gt;如果使用VS code作为编辑器，就会产生一个问题：
dlv 基本用最新版本的golang去构建，而 dlv 依赖于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt;。
如果使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt; ,会根据依赖图修剪策略，使用高版本go后会重算依赖树，最终导致 go.mod 被重写。&lt;/p&gt;

&lt;p&gt;要在 Windows 上让多个版本的 Go 语言共存，并且不影响 go mod 和 go install 的本地缓存，
Go 官方提出了一个多版本管理工具 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install golang.org/dl/go&amp;lt;version&amp;gt;@latest&lt;/code&gt; ，核心思路是：将不同版本的 Go 安装在不同的目录，并通过环境变量灵活切换。&lt;/p&gt;

&lt;p&gt;各版本 SDK 隔离存放，互不影响。
go mod 和 go install 的缓存（默认在 %USERPROFILE%\go\pkg\mod 和 %USERPROFILE%\go\bin）是全局共享的。这是设计使然，因为模块缓存和安装的可执行文件通常是版本无关或向后兼容的。使用不同版本 Go 编译同一模块时，会利用已有缓存，节省空间和时间。&lt;/p&gt;

&lt;p&gt;但在实践过程中会出现一点问题。&lt;/p&gt;

&lt;h2 id=&quot;卡点&quot;&gt;卡点&lt;/h2&gt;

&lt;p&gt;配置了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOPROXY&lt;/code&gt; 之后，本地安装当前golang的最高版本（go 1.26.1）并指向path路径。&lt;/p&gt;

&lt;p&gt;再安装特定版本的 Go 工具链：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;#打开 PowerShell 或 CMD，使用 go install 命令安装你需要的版本。这些命令会下载一个版本特定的启动器。&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;golang.org/dl/go1.23.12@latest
&lt;span class=&quot;c&quot;&gt;# 之后可以看到 `%USERPROFILE%\go\bin` 中出现了 `go1.23.12.exe`。&lt;/span&gt;
go1.23.12 download
&lt;span class=&quot;c&quot;&gt;# 这一步由于网络问题，国内会下载失败!&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我下载了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt; 并放置到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; 目录，然后把压缩包中的go目录提取到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; 中，还是提示下载失败。&lt;/p&gt;

&lt;p&gt;于是我翻阅了这个命令对应的项目源码。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12&lt;/code&gt;其实对应 https://github.com/golang/dl 中的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\go1.23.12\main.go&lt;/code&gt;，重点在于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt;中的文件判断。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%s: already downloaded in %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MkdirAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0755&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;versionArchiveURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusNotFound&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no binary release of %v for %v/%v at %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getOS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runtime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GOARCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusOK&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server returned %v checking size of %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsNotExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;// Something weird. Don&apos;t try to download.&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;copyFromURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error downloading %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;downloaded file %s size %v doesn&apos;t match server size %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slurpURLToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.sha256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verifySHA256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TrimSpace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error verifying SHA256 of %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unpacking %v ...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackArchive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;extracting archive %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0644&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Success. You may now run &apos;%v&apos;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt; 文件下载之后会计算 SHA256 ，并与远程登记的值进行对比，之后再解压，创建 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; 文件。
如果我本地想跳过这个过程，要么修改 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt; 重新编译;要么在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; 目录中创建  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; 文件,我选择第二种。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-BASH&quot;&gt;go1.23.12 version
go version go1.23.12 windows/amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;命令成功之后，我找了一个项目构建,设置 env 之后依旧构建失败了。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-cache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-modcache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-testcache&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GONOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPRIVATE=    &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOINSECURE=&lt;/span&gt;
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GOSUMDB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;off
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;on
go1.23.12 build &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-checklinkname=0&quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;于是我决定回退一开始的方案，使用 path 路径切换 go 版本 🤣。
在win11中，使用1.26，就把1.26 go版本的path上移到1.23的上面。这样新开的命令窗口，就是使用1.26版本，反之同理。&lt;/p&gt;

&lt;h2 id=&quot;one-more-thing&quot;&gt;One more thing&lt;/h2&gt;

&lt;p&gt;构建项目可以通过&lt;a href=&quot;https://github.com/Zxilly/go-size-analyzer&quot;&gt;go-size-analyzer&lt;/a&gt;分析二进制文件的大小。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;禁用CGO&lt;/li&gt;
  &lt;li&gt;去除调试信息&lt;/li&gt;
  &lt;li&gt;移除路径信息&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;减少二进制文件大小。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0 go build &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-s -w&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-trimpath&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; myapp main.go
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;而代码层面，为了减少最终二进制文件大小，应该做的是&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;减少代码的动态反射&lt;/li&gt;
  &lt;li&gt;使用构建标签减少非必要的引用&lt;/li&gt;
  &lt;li&gt;谨慎使用匿名导入&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;使用构建标签减少非必要的引用&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;db_basicgo&quot;&gt;db_basic.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build !cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to local SQLite database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;db_cloudgo&quot;&gt;db_cloud.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// 假设这个包非常大，有很多依赖&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// &quot;github.com/aws/aws-sdk-go/service/dynamodb&quot; &lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to heavy Cloud Database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// 初始化云数据库的代码&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;maingo&quot;&gt;main.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;直接运行 go build，编译器会包含 db_basic.go，排除 db_cloud.go。编译出来的文件很小。&lt;/p&gt;

&lt;p&gt;如果你想要包含高级特性的版本，运行 go build -tags cloud_db，编译器会包含 db_cloud.go，排除 db_basic.go，此时才会把那些沉重的云数据库依赖打包进去。&lt;/p&gt;

&lt;p&gt;相当于一种选择编译的技巧。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;谨慎使用匿名导入&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// main_plugin.go&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;plugin&quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 仅仅是导入了 plugin 包，哪怕使用空白标识符忽略它&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// 未导出的方法 1（未使用）&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is a very complex method doing a lot of things...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// 未导出的方法 2（未使用）&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Another unused complex method...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;编译行为分析：
当你使用 go build main_plugin.go 编译时，由于引入了 plugin 包，链接器将该二进制文件标记为支持动态链接。&lt;/p&gt;

&lt;p&gt;链接器会这样想：“既然支持动态加载插件，我不知道未来加载进来的插件会不会通过反射或其他机制偷偷调用 HeavyService.unusedMethod1。为了安全起见，我不能删掉它！”&lt;/p&gt;

&lt;p&gt;结果是：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;unusedMethod1、unusedMethod2 等所有未导出的方法都会被强行保留。&lt;/li&gt;
  &lt;li&gt;这些方法内部引用的其他包（如 fmt 内部更深层的依赖）、常量、字符串，也全都会被牵连保留。&lt;/li&gt;
  &lt;li&gt;最终编译出的二进制文件体积会异常膨胀。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;参考链接&quot;&gt;参考链接&lt;/h2&gt;

&lt;p&gt;【1】
Datadog 如何将其 Agent 的 Go 二进制文件缩减 77%
https://mp.weixin.qq.com/s/SW3-tI-OdtvladmWf-SLpg&lt;/p&gt;


&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    
&lt;p&gt;Do you still remember the “rule zero” I brought up before? &lt;strong&gt;Do not refactor when the marginal benefit is zero.&lt;/strong&gt; I have already run into twice the situation where I could not upgrade a project’s Go version because the behavior of the underlying Go toolchain changed.&lt;/p&gt;

&lt;p&gt;Because of limits in my work environment—CI not supporting it—I cannot use the latest golang there day to day.&lt;/p&gt;

&lt;p&gt;If you use VS Code as your editor, a tension appears:
dlv is generally built with the newest golang, and dlv relies on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt;.
If you run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt;, the dependency graph pruning rules mean that after moving to a higher Go version the tree is recomputed and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt; ends up rewritten.&lt;/p&gt;

&lt;p&gt;To keep multiple Go versions on Windows at once without breaking local caches for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt;, the Go project documents a multi-version workflow: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install golang.org/dl/go&amp;lt;version&amp;gt;@latest&lt;/code&gt;. The core idea is to put each Go version in its own directory and switch flexibly via environment variables.&lt;/p&gt;

&lt;p&gt;Each SDK version lives in isolation and does not disturb the others.
Caches for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; (by default &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\go\pkg\mod&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\go\bin&lt;/code&gt;) are shared globally. That is intentional: the module cache and installed binaries are usually version-agnostic or backward compatible. When different Go versions compile the same module, they reuse the cache and save disk space and time.&lt;/p&gt;

&lt;p&gt;In real use, a few snags still show up.&lt;/p&gt;

&lt;h2 id=&quot;sticking-points&quot;&gt;Sticking points&lt;/h2&gt;

&lt;p&gt;After configuring &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOPROXY&lt;/code&gt;, I installed the newest golang available for my current setup (go 1.26.1) and put it on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then I installed a specific Go toolchain:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# In PowerShell or CMD, use go install to fetch the version you need. These commands download a version-specific launcher.&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;golang.org/dl/go1.23.12@latest
&lt;span class=&quot;c&quot;&gt;# You should then see go1.23.12.exe under `%USERPROFILE%\go\bin`.&lt;/span&gt;
go1.23.12 download
&lt;span class=&quot;c&quot;&gt;# This step often fails in China because of network issues!&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I downloaded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt;, placed it under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt;, and extracted the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; directory into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt;, but the tool still reported a download failure.&lt;/p&gt;

&lt;p&gt;So I read the source for that command. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12&lt;/code&gt; maps to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\go1.23.12\main.go&lt;/code&gt; in https://github.com/golang/dl; the important part is the file checks in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%s: already downloaded in %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MkdirAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0755&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;versionArchiveURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusNotFound&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no binary release of %v for %v/%v at %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getOS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runtime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GOARCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusOK&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server returned %v checking size of %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsNotExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;// Something weird. Don&apos;t try to download.&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;copyFromURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error downloading %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;downloaded file %s size %v doesn&apos;t match server size %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slurpURLToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.sha256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verifySHA256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TrimSpace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error verifying SHA256 of %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unpacking %v ...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackArchive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;extracting archive %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0644&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Success. You may now run &apos;%v&apos;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt; is present, the tool computes SHA256, compares it with the value published remotely, unpacks, and writes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; marker.
To skip that locally I could either edit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt; and rebuild, or create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt;; I picked the second option.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 version
go version go1.23.12 windows/amd64
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With that working, I tried building a project; even after adjusting env vars the build still failed.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-cache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-modcache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-testcache&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GONOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPRIVATE=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOINSECURE=&lt;/span&gt;
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GOSUMDB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;off
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;on
go1.23.12 build &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-checklinkname=0&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So I went back to the first approach: switching Go versions by reordering entries on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt; 🤣.
On Windows 11, to use 1.26, move the 1.26 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; bin directory above the 1.23 one on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt;. New command windows then use 1.26; reverse the order for 1.23.&lt;/p&gt;

&lt;h2 id=&quot;one-more-thing&quot;&gt;One more thing&lt;/h2&gt;

&lt;p&gt;When you build, you can use &lt;a href=&quot;https://github.com/Zxilly/go-size-analyzer&quot;&gt;go-size-analyzer&lt;/a&gt; to study binary size.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Disable CGO&lt;/li&gt;
  &lt;li&gt;Strip debug symbols&lt;/li&gt;
  &lt;li&gt;Drop path metadata from the binary&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;to shrink the executable.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0 go build &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-s -w&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-trimpath&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; myapp main.go
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;At the source level, to reduce final binary size you should:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Cut down on dynamic reflection&lt;/li&gt;
  &lt;li&gt;Use build tags to drop optional imports&lt;/li&gt;
  &lt;li&gt;Be careful with blank imports&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Use build tags to omit non-essential references&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;db_basicgo&quot;&gt;db_basic.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build !cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to local SQLite database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;db_cloudgo&quot;&gt;db_cloud.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Suppose this package is huge with many dependencies&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// &quot;github.com/aws/aws-sdk-go/service/dynamodb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to heavy Cloud Database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Code to initialize the cloud database&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;maingo&quot;&gt;main.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A plain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build&lt;/code&gt; includes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_basic.go&lt;/code&gt; and excludes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_cloud.go&lt;/code&gt;, yielding a small binary.&lt;/p&gt;

&lt;p&gt;For a build with the advanced path, run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build -tags cloud_db&lt;/code&gt;: the compiler includes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_cloud.go&lt;/code&gt;, excludes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_basic.go&lt;/code&gt;, and only then pulls in the heavy cloud database dependencies.&lt;/p&gt;

&lt;p&gt;That is essentially a selective compilation technique.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Be careful with blank imports&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// main_plugin.go&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;plugin&quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// Only imports plugin; even with _, the package is linked&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Unexported method 1 (unused)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is a very complex method doing a lot of things...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Unexported method 2 (unused)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Another unused complex method...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What the linker does:
When you &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build main_plugin.go&lt;/code&gt;, importing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugin&lt;/code&gt; marks the binary as supporting dynamic loading.&lt;/p&gt;

&lt;p&gt;The linker reasons: “Because plugins may be loaded later, I cannot know whether a plugin will call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HeavyService.unusedMethod1&lt;/code&gt; via reflection or other tricks. To be safe I must keep it!”&lt;/p&gt;

&lt;p&gt;The outcome:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unusedMethod1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unusedMethod2&lt;/code&gt;, and similar unexported methods are retained.&lt;/li&gt;
  &lt;li&gt;Packages they pull in (deeper dependencies under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fmt&lt;/code&gt;, constants, strings, etc.) are kept as well.&lt;/li&gt;
  &lt;li&gt;The final binary balloons in size.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;p&gt;【1】&lt;br /&gt;
How Datadog shrunk its Agent’s Go binary by 77%&lt;br /&gt;
https://mp.weixin.qq.com/s/SW3-tI-OdtvladmWf-SLpg&lt;/p&gt;


&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    
&lt;p&gt;以前に挙げた「ゼロ番の法則」を覚えていますか。&lt;strong&gt;限界利益がゼロになるリファクタはやらない&lt;/strong&gt;、というやつです。底辺の Go 実装の挙動変化のせいで、プロジェクトの Go バージョンを上げられなくなった経験は、すでに 2 回あります。&lt;/p&gt;

&lt;p&gt;職場環境の制約（CI が対応していないなど）のため、業務環境では常に最新の golang を使えません。&lt;/p&gt;

&lt;p&gt;エディタに VS Code を使うと、次のような問題が出ます。&lt;br /&gt;
dlv はだいたい最新の golang でビルドされ、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt; に依存します。&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt; を実行すると、依存グラフのトリミング方針により、高い Go バージョンにすると依存ツリーが再計算され、最終的に &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt; が書き換わります。&lt;/p&gt;

&lt;p&gt;Windows 上で複数バージョンの Go を共存させ、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod&lt;/code&gt; と &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; のローカルキャッシュを壊さないようにするには、公式が示す複数バージョン管理の流れ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install golang.org/dl/go&amp;lt;version&amp;gt;@latest&lt;/code&gt; があります。考え方は、バージョンごとに別ディレクトリへインストールし、環境変数で柔軟に切り替えることです。&lt;/p&gt;

&lt;p&gt;各バージョンの SDK は隔離され、互いに干渉しません。&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod&lt;/code&gt; と &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; のキャッシュ（既定では &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\go\pkg\mod&lt;/code&gt; と &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\go\bin&lt;/code&gt;）はグローバルで共有されます。モジュールキャッシュとインストールした実行ファイルは多くの場合バージョンに依存しないか後方互換なので、設計としてそうなっています。異なる Go で同一モジュールをビルドすると既存キャッシュを使え、容量と時間を節約できます。&lt;/p&gt;

&lt;p&gt;実運用では、いくつかつまずきどころがあります。&lt;/p&gt;

&lt;h2 id=&quot;つまずき&quot;&gt;つまずき&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOPROXY&lt;/code&gt; を設定したうえで、手元の golang として利用できる最新（go 1.26.1）を入れ、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt; に載せました。&lt;/p&gt;

&lt;p&gt;続いて特定バージョンの Go ツールチェーンを入れます。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# PowerShell または CMD で、必要なバージョンを go install で取得する。バージョン専用のランチャーが落ちてくる。&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;golang.org/dl/go1.23.12@latest
&lt;span class=&quot;c&quot;&gt;# `%USERPROFILE%\go\bin` に `go1.23.12.exe` ができる。&lt;/span&gt;
go1.23.12 download
&lt;span class=&quot;c&quot;&gt;# 中国ではネットワークの都合で、このステップが失敗しがち&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt; を &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; に置き、アーカイブ内の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; フォルダを同じ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; に展開しても、やはりダウンロード失敗のままでした。&lt;/p&gt;

&lt;p&gt;そこでこのコマンドのソースを読みました。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12&lt;/code&gt; は https://github.com/golang/dl の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\go1.23.12\main.go&lt;/code&gt; に対応し、肝は &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt; のファイル判定です。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%s: already downloaded in %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MkdirAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0755&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;versionArchiveURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusNotFound&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no binary release of %v for %v/%v at %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getOS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runtime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GOARCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusOK&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server returned %v checking size of %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsNotExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;// Something weird. Don&apos;t try to download.&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;copyFromURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error downloading %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;downloaded file %s size %v doesn&apos;t match server size %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slurpURLToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.sha256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verifySHA256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TrimSpace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error verifying SHA256 of %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unpacking %v ...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackArchive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;extracting archive %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0644&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Success. You may now run &apos;%v&apos;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt; を取得したあと SHA256 を計算し、リモートの値と突き合わせ、展開して &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; を作ります。&lt;br /&gt;
ローカルでこの過程を飛ばすには、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt; を直して再ビルドするか、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; に &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; を置くか—こちらは後者を選びました。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 version
go version go1.23.12 windows/amd64
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;コマンドが通ったあと、あるプロジェクトをビルドしましたが、env を設定してもビルドは失敗したままでした。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-cache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-modcache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-testcache&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GONOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPRIVATE=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOINSECURE=&lt;/span&gt;
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GOSUMDB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;off
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;on
go1.23.12 build &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-checklinkname=0&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最初の方針に戻り、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt; の順で Go バージョンを切り替えることにしました 🤣。&lt;br /&gt;
Windows 11 では 1.26 を使うなら、1.26 の &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; を 1.23 より上に並べる。新しいコマンドウィンドウでは 1.26 が使われ、逆にすれば 1.23 側になります。&lt;/p&gt;

&lt;h2 id=&quot;one-more-thing&quot;&gt;One more thing&lt;/h2&gt;

&lt;p&gt;ビルド時は &lt;a href=&quot;https://github.com/Zxilly/go-size-analyzer&quot;&gt;go-size-analyzer&lt;/a&gt; でバイナリサイズを分析できます。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;CGO を無効にする&lt;/li&gt;
  &lt;li&gt;デバッグ情報を除く&lt;/li&gt;
  &lt;li&gt;パス情報を落とす&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ことでバイナリを小さくできます。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0 go build &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-s -w&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-trimpath&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; myapp main.go
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;コード面では、最終バイナリを小さくするために次を意識します。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;動的リフレクションを減らす&lt;/li&gt;
  &lt;li&gt;ビルドタグで不要な参照を外す&lt;/li&gt;
  &lt;li&gt;匿名インポートに注意する&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;ビルドタグで不要な参照を減らす&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;db_basicgo&quot;&gt;db_basic.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build !cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to local SQLite database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;db_cloudgo&quot;&gt;db_cloud.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// このパッケージが巨大で依存が多いと仮定&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// &quot;github.com/aws/aws-sdk-go/service/dynamodb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to heavy Cloud Database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// クラウド DB 初期化のコード&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;maingo&quot;&gt;main.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;そのまま &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build&lt;/code&gt; すると &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_basic.go&lt;/code&gt; が入り &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_cloud.go&lt;/code&gt; は外れ、出力は小さくなります。&lt;/p&gt;

&lt;p&gt;高度な構成にしたい場合は &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build -tags cloud_db&lt;/code&gt; とすると &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_cloud.go&lt;/code&gt; が入り &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_basic.go&lt;/code&gt; は外れ、重いクラウド DB 依存が初めてバンドルされます。&lt;/p&gt;

&lt;p&gt;選択的コンパイルのテクニックに相当します。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;匿名インポートに注意する&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// main_plugin.go&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;plugin&quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// plugin をインポートするだけ。空白識別子でもリンクされる&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// エクスポートされていないメソッド 1（未使用）&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is a very complex method doing a lot of things...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// エクスポートされていないメソッド 2（未使用）&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Another unused complex method...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;コンパイル・リンクの挙動：&lt;br /&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build main_plugin.go&lt;/code&gt; で &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugin&lt;/code&gt; を入れると、バイナリは動的ロード対応として印が付きます。&lt;/p&gt;

&lt;p&gt;リンカの考え方は「動的プラグインを将来読み込むかもしれない。読み込まれた側がリフレクションなどで &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HeavyService.unusedMethod1&lt;/code&gt; を呼ぶかもしれない。安全のため削れない」となります。&lt;/p&gt;

&lt;p&gt;結果：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unusedMethod1&lt;/code&gt; や &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unusedMethod2&lt;/code&gt; など、エクスポートされていないメソッドが残される&lt;/li&gt;
  &lt;li&gt;それらが引っ張る他パッケージ（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fmt&lt;/code&gt; より深い依存など）、定数、文字列も連鎖的に残る&lt;/li&gt;
  &lt;li&gt;最終バイナリが異常に肥大化する&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;/h2&gt;

&lt;p&gt;【1】&lt;br /&gt;
Datadog が Agent の Go バイナリを 77% 削減した話（記事紹介・中国語）&lt;br /&gt;
https://mp.weixin.qq.com/s/SW3-tI-OdtvladmWf-SLpg&lt;/p&gt;


&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    
&lt;p&gt;Помните «правило ноль», о котором я уже говорил? &lt;strong&gt;Не делайте рефакторинг с нулевой предельной отдачей.&lt;/strong&gt; У меня уже дважды была ситуация, когда из‑за изменений в реализации нижележащей версии Go нельзя было обновить версию Go в проекте.&lt;/p&gt;

&lt;p&gt;Из‑за ограничений рабочей среды (CI не поддерживает нужное) нельзя постоянно пользоваться самым свежим golang в том же окружении, где ведётся работа.&lt;/p&gt;

&lt;p&gt;Если редактор — VS Code, возникает такая связка:&lt;br /&gt;
dlv обычно собирают на новейшем golang, а dlv опирается на &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt;.&lt;br /&gt;
После &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod tidy&lt;/code&gt; политика обрезки графа зависимостей при переходе на более высокую версию Go пересчитывает дерево и в итоге переписывает &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go.mod&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Чтобы на Windows держать несколько версий Go и не ломать локальный кэш для &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt;, в экосистеме Go есть схема с &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install golang.org/dl/go&amp;lt;version&amp;gt;@latest&lt;/code&gt;: разные версии ставятся в разные каталоги, переключение — через переменные окружения.&lt;/p&gt;

&lt;p&gt;SDK разных версий изолированы и не мешают друг другу.&lt;br /&gt;
Кэши &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go mod&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go install&lt;/code&gt; (по умолчанию &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\go\pkg\mod&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\go\bin&lt;/code&gt;) общие для пользователя — так задумано: кэш модулей и установленные бинарники обычно не привязаны к одной версии компилятора или обратно совместимы. Разные версии Go при сборке одного и того же модуля могут переиспользовать кэш и экономить место и время.&lt;/p&gt;

&lt;p&gt;На практике всё равно всплывают узкие места.&lt;/p&gt;

&lt;h2 id=&quot;где-застреваешь&quot;&gt;Где застреваешь&lt;/h2&gt;

&lt;p&gt;После настройки &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOPROXY&lt;/code&gt; я поставил максимально новый golang для текущей связки (go 1.26.1) и добавил его в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Затем ставлю конкретную цепочку инструментов Go:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# В PowerShell или CMD: go install качает нужную версию — это отдельный лаунчер для версии.&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;golang.org/dl/go1.23.12@latest
&lt;span class=&quot;c&quot;&gt;# В `%USERPROFILE%\go\bin` появится go1.23.12.exe.&lt;/span&gt;
go1.23.12 download
&lt;span class=&quot;c&quot;&gt;# В Китае этот шаг часто падает из‑за сети.&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Я скачал &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt;, положил в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt;, распаковал каталог &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; — сообщение о неудачной загрузке всё равно оставалось.&lt;/p&gt;

&lt;p&gt;Тогда я прочитал исходники этой команды. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12&lt;/code&gt; соответствует &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\go1.23.12\main.go&lt;/code&gt; в https://github.com/golang/dl; ключевое — проверки файлов в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%s: already downloaded in %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MkdirAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0755&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;versionArchiveURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusNotFound&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no binary release of %v for %v/%v at %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getOS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runtime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GOARCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusOK&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;server returned %v checking size of %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;StatusCode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IsNotExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;c&quot;&gt;// Something weird. Don&apos;t try to download.&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;copyFromURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error downloading %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;downloaded file %s size %v doesn&apos;t match server size %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ContentLength&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slurpURLToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;goURL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.sha256&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;verifySHA256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TrimSpace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wantSHA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;error verifying SHA256 of %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unpacking %v ...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackArchive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;extracting archive %v: %v&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;archiveFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filepath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;targetDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unpackedOkay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0644&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Success. You may now run &apos;%v&apos;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;nil&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;После появления &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go1.23.12.windows-amd64.zip&lt;/code&gt; считается SHA256, сверяется с удалённым значением, архив распаковывается и создаётся маркер &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt;.&lt;br /&gt;
Обойти это локально можно либо правкой &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dl\internal\version\version.go&lt;/code&gt; и пересборкой, либо созданием файла &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.unpacked-success&lt;/code&gt; в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%USERPROFILE%\sdk\go1.23.12&lt;/code&gt; — я выбрал второе.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 version
go version go1.23.12 windows/amd64
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Когда команды прошли, я попробовал собрать проект: даже после настройки переменных окружения сборка не удалась.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-cache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-modcache&lt;/span&gt;
go1.23.12 clean &lt;span class=&quot;nt&quot;&gt;-testcache&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GONOPROXY=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOPRIVATE=&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# go1.23.12 env -w GOINSECURE=&lt;/span&gt;
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GOSUMDB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;off
go1.23.12 &lt;span class=&quot;nb&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;on
go1.23.12 build &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-checklinkname=0&quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Вернулся к исходной идее: переключать версии Go порядком записей в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PATH&lt;/code&gt; 🤣.&lt;br /&gt;
В Windows 11 для 1.26 поднимите каталог с &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt; от 1.26 выше, чем от 1.23. В новом окне терминала будет 1.26; обратный порядок — 1.23.&lt;/p&gt;

&lt;h2 id=&quot;one-more-thing&quot;&gt;One more thing&lt;/h2&gt;

&lt;p&gt;При сборке можно анализировать размер бинарника через &lt;a href=&quot;https://github.com/Zxilly/go-size-analyzer&quot;&gt;go-size-analyzer&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Отключить CGO&lt;/li&gt;
  &lt;li&gt;Убрать отладочную информацию&lt;/li&gt;
  &lt;li&gt;Убрать сведения о путях&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;— так уменьшается размер исполняемого файла.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nv&quot;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0 go build &lt;span class=&quot;nt&quot;&gt;-ldflags&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-s -w&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-trimpath&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; myapp main.go
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;На уровне кода, чтобы уменьшить итоговый бинарник:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Меньше динамической рефлексии&lt;/li&gt;
  &lt;li&gt;Сборочные теги, чтобы не тянуть лишние импорты&lt;/li&gt;
  &lt;li&gt;Осторожнее с пустым импортом &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
  &lt;li&gt;Сборочные теги для отсечения ненужных ссылок&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;db_basicgo&quot;&gt;db_basic.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build !cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to local SQLite database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;db_cloudgo&quot;&gt;db_cloud.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;//go:build cloud_db&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Допустим, пакет огромный и тянет много зависимостей&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// &quot;github.com/aws/aws-sdk-go/service/dynamodb&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Connecting to heavy Cloud Database...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Инициализация облачной БД&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;maingo&quot;&gt;main.go&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;connectDB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Обычный &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build&lt;/code&gt; подключает &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_basic.go&lt;/code&gt; и исключает &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_cloud.go&lt;/code&gt; — бинарник маленький.&lt;/p&gt;

&lt;p&gt;Нужна «тяжёлая» конфигурация — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build -tags cloud_db&lt;/code&gt;: включается &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_cloud.go&lt;/code&gt;, исключается &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;db_basic.go&lt;/code&gt;, и только тогда подтягиваются зависимости облачной БД.&lt;/p&gt;

&lt;p&gt;По сути приём выборочной компиляции.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Пустой импорт использовать осмотрительно&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// main_plugin.go&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;plugin&quot;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// Импортирован пакет plugin, даже через пустой идентификатор&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Неэкспортируемый метод 1 (не используется)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;This is a very complex method doing a lot of things...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// Неэкспортируемый метод 2 (не используется)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeavyService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unusedMethod2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Another unused complex method...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Поведение линкера:&lt;br /&gt;
при &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go build main_plugin.go&lt;/code&gt; из‑за &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;plugin&lt;/code&gt; бинарник помечается как поддерживающий динамическую загрузку.&lt;/p&gt;

&lt;p&gt;Линкер рассуждает так: «Раз возможна подгрузка плагинов, неизвестно, не вызовет ли плагин &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HeavyService.unusedMethod1&lt;/code&gt; через рефлексию. Ради безопасности методы не выкидываю».&lt;/p&gt;

&lt;p&gt;Итог:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unusedMethod1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unusedMethod2&lt;/code&gt; и прочие неэкспортируемые методы остаются.&lt;/li&gt;
  &lt;li&gt;Остаются связанные с ними пакеты (включая глубже &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fmt&lt;/code&gt;), константы, строки.&lt;/li&gt;
  &lt;li&gt;Размер бинарника сильно растёт.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;ссылки&quot;&gt;Ссылки&lt;/h2&gt;

&lt;p&gt;【1】&lt;br /&gt;
Как Datadog уменьшил Go-бинарник своего Agent на 77% (обзорная статья, китайский язык)&lt;br /&gt;
https://mp.weixin.qq.com/s/SW3-tI-OdtvladmWf-SLpg&lt;/p&gt;


&lt;/div&gt;
</description>
        <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/03/25/china-windows-multiple-go-versions/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/03/25/china-windows-multiple-go-versions/</guid>
        
        <category>go</category>
        
        
      </item>
    
      <item>
        <title>打通智能家居数据流动的上下游</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;p&gt;如果把一个社会人的一天的生活按照时间顺序解构，那基本流程是起床，吃饭，通勤，上班，下班，吃饭，睡觉。&lt;/p&gt;

&lt;h2 id=&quot;数据堰塞湖&quot;&gt;数据堰塞湖&lt;/h2&gt;

&lt;p&gt;在这个过程中，可能会涉及到电脑，家用电器，汽车，手机，外卖软件等生活用品/互联网服务。&lt;/p&gt;

&lt;p&gt;以智能家居场景为例，由于各大厂商之间的相互竞争，个人数据实际是处于各自独立的“信息孤岛状态”。比如我买了一个米家的温度传感器，但空调是海尔品牌的。因为两个品牌的数据不互通，导致无法实现“温度传感器高于36°时打开空调”这种需求；又比如我用了小米的大模型音箱，询问它当前的室温，它只能通过网络搜索，告诉我区县级别的天气温度/湿度。而这部分数据，实际上一直存在海尔空调的温度传感器中。&lt;/p&gt;

&lt;p&gt;我把这种数据不互联互通的情况称为“数据堰塞湖”。&lt;/p&gt;

&lt;h2 id=&quot;上下文丢失&quot;&gt;上下文丢失&lt;/h2&gt;

&lt;p&gt;以上午上班通勤的活动为例，“在家吃饭”和“开车去上班”发生在两个不同的场景。但从家到地下停车场的这个过程，实际上“车”是不知道的。
为了缩小问题复杂度，我们假设使用了全套的小米智能家居，以及小米汽车。理论上，通过小米手机/小米智能手环上的蓝牙信号的衰减/增强可以判断车到人的距离，进而判断是人离车，还是人开车。
然而蓝牙设备能记住的设备数量毕竟有限，只有在小范围场景才能适用这种解决方案。&lt;/p&gt;

&lt;p&gt;上下文丢失，更多的是一种跨设备，跨系统的问题。如果说“数据堰塞湖”是一种人为的上下文丢失，那么场景的切换也会带来上下文的丢失。&lt;/p&gt;

&lt;p&gt;举个例子，当我们走进博物馆，本质上博物馆是可以通过票证凭据和摄像头识别“知道”游客已经入馆的。但由于这套系统的运作成本过于巨大，实际操作是丢弃“数据上下文”，让游客自行游玩。&lt;/p&gt;

&lt;p&gt;//prompt: 画一个图片，内容是人进入博物馆之后，博物馆机器人打招呼，而且游客的手机屏幕切换为一个人形的导航。使用动漫风格。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/breaking-data-barrier-lake-in-smart-homes/image.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;意念编程spec-coding与主动陪伴active-companionship&quot;&gt;意念编程（Spec Coding）与主动陪伴（Active Companionship）&lt;/h2&gt;

&lt;p&gt;以上问题并非没有解决方案。&lt;/p&gt;

&lt;p&gt;在当前的意念编程设计中，AI作为新的流量入口，用户告诉智能音箱“打开客厅的灯”，本质是表达一种期望（spec）。AI作为一种“控制器”会做好该期望的实际交付工作（找到客厅中的灯，并打开）。&lt;/p&gt;

&lt;p&gt;但意念编程的问题在于“人主动”，而不是“物主动”。在当前版本的智能家居中，需要人为设计很多自动化场景去智能地控制电子设备（比如感应到人，并且时间在日落之后，触发自动开灯），但在我看来，AGI的第一性原理是数据保存在用户自己的消费电子终端，平台基于写时复制（copy on write），最小化地使用用户的数据。&lt;/p&gt;

&lt;p&gt;如果基础传感器数据存在用户本地，那么自始至终就不存在“信息孤岛”的问题。而携带个人数据的消费电子终端，可以通过传感器和其他设备（车）互联。&lt;/p&gt;

&lt;p&gt;而基于AGI之上的主动陪伴（Active Companionship）,则是智能家居自动化控制流/家居机器人的关键。以午睡这个场景为例，实际上，通过累计足够的数据（用户在工作日12点之后通常会拉窗帘，并关灯），建立相关的关联关系，智能家居应该是可以直接给用户提出一个建议（工作日中午时段当感知到你之后，我会关灯并拉窗帘），并在获取用户授权后，工作日自动化执行。&lt;/p&gt;


&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    
&lt;p&gt;If we deconstruct a social person’s daily life in chronological order, the basic flow is: wake up, eat, commute, work, get off work, eat, sleep.&lt;/p&gt;

&lt;h2 id=&quot;data-barrier-lake&quot;&gt;Data Barrier Lake&lt;/h2&gt;

&lt;p&gt;In this process, various consumer goods and internet services may be involved—computers, home appliances, cars, phones, food delivery apps, and so on.&lt;/p&gt;

&lt;p&gt;Take the smart home scenario as an example. Due to competition among major manufacturers, personal data is effectively trapped in isolated “information silos.” For instance, I bought a Mijia temperature sensor, but the air conditioner is a Haier brand. Because the two brands’ data don’t interoperate, I can’t implement a rule like “turn on the AC when the temperature sensor reads above 36°.” Or consider Xiaomi’s LLM-powered speaker: when I ask it about the current room temperature, it can only answer via web search, giving me district-level weather temperature/humidity—even though that data actually exists in the Haier AC’s temperature sensor all along.&lt;/p&gt;

&lt;p&gt;I call this situation where data fails to interconnect “data barrier lake.”&lt;/p&gt;

&lt;h2 id=&quot;context-loss&quot;&gt;Context Loss&lt;/h2&gt;

&lt;p&gt;Take the morning commute as an example. “Eating at home” and “driving to work” happen in two different contexts. But the car has no knowledge of the transition from home to the underground parking lot.
To reduce complexity, assume we use a full Xiaomi smart home setup plus a Xiaomi car. Theoretically, Bluetooth signal attenuation/strengthening from a Xiaomi phone or smart band could indicate the distance between car and person, and thus whether the person is leaving or approaching the car.
However, Bluetooth devices have a limited number of devices they can remember, so this approach only works in small-scale scenarios.&lt;/p&gt;

&lt;p&gt;Context loss is largely a cross-device, cross-system issue. If “data barrier lake” is a man-made form of context loss, then context switching also causes context loss.&lt;/p&gt;

&lt;p&gt;For example, when we enter a museum, the museum could in principle “know” that a visitor has entered via ticket credentials and cameras. But because the cost of running such a system is prohibitively high, the practical approach is to discard “data context” and let visitors explore on their own.&lt;/p&gt;

&lt;p&gt;//prompt: Draw an image of a person entering a museum, a museum robot greeting them, and the visitor’s phone screen switching to a humanoid navigation interface. Use anime style.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/breaking-data-barrier-lake-in-smart-homes/image.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;spec-coding-and-active-companionship&quot;&gt;Spec Coding and Active Companionship&lt;/h2&gt;

&lt;p&gt;These problems are not without solutions.&lt;/p&gt;

&lt;p&gt;In current Spec Coding design, AI acts as a new traffic entry point. When a user tells a smart speaker “turn on the living room light,” they are expressing an expectation (spec). The AI, as a “controller,” handles the actual delivery of that expectation (finding the living room light and turning it on).&lt;/p&gt;

&lt;p&gt;But the issue with Spec Coding is that it is “human-initiated” rather than “thing-initiated.” In current smart home setups, many automation scenarios must be manually designed to control devices (e.g., sense a person and, if it’s after sunset, trigger automatic lighting). In my view, the first principle of AGI is that data is stored on the user’s own consumer electronics, with platforms using copy-on-write to minimize use of user data.&lt;/p&gt;

&lt;p&gt;If base sensor data resides locally on the user’s device, there is no “information silo” problem from the start. Consumer electronics carrying personal data can interconnect with other devices (e.g., the car) via sensors.&lt;/p&gt;

&lt;p&gt;Active Companionship built on AGI is key to smart home automation flows and home robots. Take the afternoon nap scenario: with enough accumulated data (e.g., the user usually draws the curtains and turns off the lights after 12:00 on weekdays), correlations can be established. The smart home should be able to propose a suggestion (“On weekday afternoons, when I sense you, I’ll turn off the lights and draw the curtains”) and, after user authorization, automate it on weekdays.&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    
&lt;p&gt;社会人の一日の生活を時間順に分解すると、基本的な流れは起床、食事、通勤、出勤、退勤、食事、就寝となる。&lt;/p&gt;

&lt;h2 id=&quot;データ堰塞湖data-barrier-lake&quot;&gt;データ堰塞湖（Data Barrier Lake）&lt;/h2&gt;

&lt;p&gt;この過程で、パソコン、家電、車、スマートフォン、フードデリバリーアプリなどの生活用品やインターネットサービスが関わってくる。&lt;/p&gt;

&lt;p&gt;スマートホームのシーンを例にとると、各メーカー間の競争により、個人データは事実上それぞれ独立した「情報孤島」状態にある。例えば、米家の温度センサーを買ったが、エアコンはハイアール製だとする。両ブランドのデータが相互接続されていないため、「温度センサーが36°を超えたらエアコンをオンにする」といったニーズを実現できない。また、小米の大モデルスピーカーを使い、現在の室温を尋ねても、ネット検索でしか答えられず、区県レベルの天気の温度・湿度を教えてくれる。そのデータは実際にはハイアールエアコンの温度センサーにずっと存在しているのに。&lt;/p&gt;

&lt;p&gt;私はこのデータが相互接続されない状況を「データ堰塞湖」と呼んでいる。&lt;/p&gt;

&lt;h2 id=&quot;コンテキストの喪失&quot;&gt;コンテキストの喪失&lt;/h2&gt;

&lt;p&gt;午前の通勤を例にとる。「自宅で食事」と「車で出勤」は二つの異なるシーンで発生する。しかし、家から地下駐車場までの過程は、「車」には知られていない。
問題の複雑さを抑えるため、小米のスマートホーム一式と小米自動車を使っていると仮定する。理論上、小米スマートフォンやスマートバンドのBluetooth信号の減衰・増強から、車と人の距離を判断し、人が車を離れているのか、車に乗っているのかを判断できる。
しかし、Bluetoothデバイスが記憶できるデバイス数には限りがあり、この解決策は小規模なシーンでのみ適用可能だ。&lt;/p&gt;

&lt;p&gt;コンテキストの喪失は、より多くの場合、デバイス間・システム間の問題である。「データ堰塞湖」が人為的なコンテキスト喪失だとすれば、シーンの切り替えもコンテキストの喪失をもたらす。&lt;/p&gt;

&lt;p&gt;例えば、博物館に入る時、本質的には博物館はチケットとカメラで「知る」ことができる——来館者が入館したことを。しかし、このシステムの運用コストが非常に高いため、実際には「データコンテキスト」を捨て、来館者に自由に見学させている。&lt;/p&gt;

&lt;p&gt;//prompt: 博物館に入った人、博物館ロボットが挨拶し、来館者のスマートフォン画面が人型ナビに切り替わる画像を描く。アニメスタイルで。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/breaking-data-barrier-lake-in-smart-homes/image.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;spec-coding意念プログラミングとactive-companionship能動的同伴&quot;&gt;Spec Coding（意念プログラミング）とActive Companionship（能動的同伴）&lt;/h2&gt;

&lt;p&gt;以上の問題に解決策がないわけではない。&lt;/p&gt;

&lt;p&gt;現在のSpec Coding設計では、AIは新しいトラフィックの入口として機能する。ユーザーがスマートスピーカーに「リビングの照明をつけて」と伝えるのは、本質的には期待（spec）を表明している。AIは「コントローラー」として、その期待の実際の実行（リビングの照明を見つけて点灯する）を行う。&lt;/p&gt;

&lt;p&gt;しかしSpec Codingの問題は「人が能動的」であり「物が能動的」ではないことだ。現在のスマートホームでは、電子機器をスマートに制御するために多くの自動化シーンを人為的に設計する必要がある（例えば、人を感知し、日没後の時間であれば自動点灯をトリガーする）。私の見解では、AGIの第一原理は、データがユーザー自身の消費電子端末に保存され、プラットフォームはcopy on writeに基づいてユーザーデータを最小限に使用することである。&lt;/p&gt;

&lt;p&gt;基礎センサーデータがユーザーのローカルに存在すれば、最初から「情報孤島」の問題は存在しない。個人データを携帯する消費電子端末は、センサーと他のデバイス（車）を相互接続できる。&lt;/p&gt;

&lt;p&gt;AGIの上に構築されたActive Companionshipは、スマートホームの自動化制御フローやホームロボットの鍵である。昼寝のシーンを例にとると、十分なデータ（ユーザーが平日12時以降に通常カーテンを閉め、照明を消す）を蓄積し、関連する相関関係を確立すれば、スマートホームはユーザーに直接提案できる（「平日の昼間、あなたを感知したら、照明を消してカーテンを閉めます」）。ユーザーの承認を得た後、平日に自動実行する。&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    
&lt;p&gt;Если деконструировать день социального человека в хронологическом порядке, базовая последовательность такова: пробуждение, еда, поездка на работу, работа, возвращение, еда, сон.&lt;/p&gt;

&lt;h2 id=&quot;озеро-данных-data-barrier-lake&quot;&gt;Озеро данных (Data Barrier Lake)&lt;/h2&gt;

&lt;p&gt;В этом процессе могут участвовать компьютеры, бытовая техника, автомобили, телефоны, приложения доставки еды и другие потребительские товары и интернет-сервисы.&lt;/p&gt;

&lt;p&gt;Возьмём сценарий умного дома. Из-за конкуренции между крупными производителями персональные данные фактически оказываются в изолированных «информационных островах». Например, я купил температурный датчик Mijia, а кондиционер — Haier. Поскольку данные двух брендов не обмениваются, невозможно реализовать правило «включить кондиционер, когда датчик показывает выше 36°». Или: я использую колонку Xiaomi с большой языковой моделью и спрашиваю текущую температуру в комнате — она может ответить только через веб-поиск, сообщая температуру/влажность на уровне района. Хотя эти данные всё время есть в температурном датчике кондиционера Haier.&lt;/p&gt;

&lt;p&gt;Я называю такую ситуацию, когда данные не связаны между собой, «озером данных» (data barrier lake).&lt;/p&gt;

&lt;h2 id=&quot;потеря-контекста&quot;&gt;Потеря контекста&lt;/h2&gt;

&lt;p&gt;Возьмём утреннюю поездку на работу. «Еда дома» и «поездка на работу» происходят в двух разных контекстах. Но машина не знает о переходе от дома до подземной парковки.
Чтобы упростить задачу, допустим, используется полный комплект умного дома Xiaomi и автомобиль Xiaomi. Теоретически по затуханию/усилению Bluetooth-сигнала с телефона или умного браслета Xiaomi можно определить расстояние между машиной и человеком и понять, человек уходит от машины или подходит к ней.
Однако Bluetooth-устройства могут запомнить ограниченное число устройств, поэтому такой подход применим только в малых масштабах.&lt;/p&gt;

&lt;p&gt;Потеря контекста — это в основном проблема между устройствами и системами. Если «озеро данных» — это искусственная потеря контекста, то смена сценария тоже приводит к потере контекста.&lt;/p&gt;

&lt;p&gt;Например, когда мы входим в музей, музей в принципе может «знать» о приходе посетителя по билету и камерам. Но из-за чрезмерно высоких затрат на такую систему на практике от «контекста данных» отказываются и дают посетителям свободно осматривать экспозицию.&lt;/p&gt;

&lt;p&gt;//prompt: Нарисуй изображение: человек входит в музей, робот музея приветствует его, экран телефона посетителя переключается на человекоподобную навигацию. В стиле аниме.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/breaking-data-barrier-lake-in-smart-homes/image.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;spec-coding-и-active-companionship&quot;&gt;Spec Coding и Active Companionship&lt;/h2&gt;

&lt;p&gt;У этих проблем есть решения.&lt;/p&gt;

&lt;p&gt;В текущей концепции Spec Coding ИИ выступает новой точкой входа. Когда пользователь говорит умной колонке «включи свет в гостиной», он выражает ожидание (spec). ИИ как «контроллер» выполняет это ожидание (находит свет в гостиной и включает его).&lt;/p&gt;

&lt;p&gt;Но проблема Spec Coding в том, что инициатива исходит от «человека», а не от «вещи». В нынешних умных домах приходится вручную проектировать множество сценариев автоматизации (например, обнаружить человека и, если уже после заката, включить свет). По моему мнению, первый принцип AGI — данные хранятся на собственных устройствах пользователя, а платформы используют copy-on-write, минимизируя использование пользовательских данных.&lt;/p&gt;

&lt;p&gt;Если базовые данные сенсоров хранятся локально у пользователя, проблемы «информационных островов» изначально не возникает. Устройства с персональными данными могут связываться с другими устройствами (например, машиной) через сенсоры.&lt;/p&gt;

&lt;p&gt;Active Companionship, построенный на AGI, — ключ к потокам автоматизации умного дома и домашним роботам. Возьмём сценарий дневного сна: накопив достаточно данных (пользователь обычно закрывает шторы и выключает свет после 12:00 в будни), можно выявить корреляции. Умный дом должен уметь предложить: «В будние дни в обеденное время, когда я почувствую тебя, выключу свет и закрою шторы» — и после одобрения пользователя автоматически выполнять это по будням.&lt;/p&gt;

&lt;/div&gt;
</description>
        <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/03/19/breaking-data-barrier-lake-in-smart-homes/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/03/19/breaking-data-barrier-lake-in-smart-homes/</guid>
        
        <category>code</category>
        
        
      </item>
    
      <item>
        <title>信息技术的熵减定律</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;p&gt;我提出过信息技术的第一悖论：&lt;strong&gt;信息技术是一种反人类的技术&lt;/strong&gt;。而在《&lt;a href=&quot;https://www.zeusro.com/2026/02/04/fimbulwinter/?lang=zh&quot;&gt;公有云的诸神黄昏&lt;/a&gt;》文章中，我总结了信息技术行业的熵增定律以及“0号规律”——&lt;strong&gt;边际收益为0的代码重构没人愿意做&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;今天我要反驳0号规律，并提出一个新“熵减定律”——在后现代编程中，&lt;strong&gt;人类存在的意义在于降低代码的时间序列复杂度（n&amp;lt;n-1），确保代码的确定性&lt;/strong&gt;。&lt;/p&gt;

&lt;h2 id=&quot;屎山代码存在的合理性以及重构的必要性&quot;&gt;屎山代码存在的合理性以及重构的必要性&lt;/h2&gt;

&lt;p&gt;如果你反编译过一些游戏的安卓apk文件，就会发现里面存在大量冗余的美术资源，这些美术资源跟当前版本没半毛钱关系。它们是一种历史遗留的垃圾代码。&lt;/p&gt;

&lt;p&gt;而由于0号规律的存在，没有任何程序员愿意去重构以及删除相关的美术资源。这也解释了“王者荣耀”的安装包一再膨胀，直至后来提出了“清理历史道具”和“模块化按需下载资源”的解题思路，当然有一部分人吐槽更新完之后“粽子”变成一堆堆人机一样的图标。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/a5ea41ff2d7691e097a223d17031c6a3_720.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;至于为什么这么做，其实涉及到博弈论的一个基本论述：&lt;strong&gt;局部最优解未必全局最优&lt;/strong&gt;。对于游戏开发者而言，为了增加新的收入，必定需要构造新的叙事。而清理历史债务不会在游戏的财务上有所体现。&lt;/p&gt;

&lt;p&gt;但对于游戏用户和运营公司而言，日渐膨胀的安装包推高了CDN的流量成本，垃圾代码的堆积也延长了用户下载打开游戏所需要的时间，甚至有可能引起操作卡顿。&lt;/p&gt;

&lt;p&gt;如果用熵增定律去衡量软件开发的流程，就会发现程序设计的屎山是一种必然，从某种程度上是软件开发工程师的一种“防御性编程”。&lt;/p&gt;

&lt;h2 id=&quot;防御性编程还是过度设计&quot;&gt;防御性编程还是过度设计？&lt;/h2&gt;

&lt;p&gt;从政治经济学角度出发，软件开发工程师本质上依旧是不掌握生产资料的“进城农民工”。从入职公司的那一刻起，所思所写都是公司的“数字资产”。这在美剧《硅谷》中亦有所体现：Richard在Hooli工作时，利用业余时间（但部分使用了公司电脑进行测试）开发了革命性的无损数据压缩算法，并以此为基础创立了Pied Piper公司。&lt;/p&gt;

&lt;p&gt;当Pied Piper开始崭露头角后，Hooli（由Gavin Belson领导）在第二季中正式起诉Pied Piper，指控Richard“窃取”了属于Hooli的知识产权（copyright infringement），声称根据Richard与Hooli签订的雇佣合同（包含发明转让条款），他在职期间开发的代码及其相关技术归Hooli所有。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/GT5mot-XYAAI9Z3.jpeg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;与公司抗衡是不明智的。因此为了规避被裁员的风险，软件开发工程师除了不写文档之外，滥用设计模式、使用反射隐式调用方法、过度设计，也都是常见手法。&lt;/p&gt;

&lt;p&gt;我有时真的搞不懂，用人单位为了压低薪资而询问我各种“单机高并发”，“秒杀”问题。最夸张的莫过于问我“数百万用户同时在线”这种荒诞的问题。
而在平行世界的另一边，我看了一下那份岗位对应的薪资对应的职责。&lt;/p&gt;

&lt;p&gt;在有AI帮助的情况下，我当然可以设计一个流程去适配这些场景。问题在于，在使用了Redis分布式锁，Redis集群，kubernetes HPA动态扩缩容，微服务、消息中间件解耦之后，代码产生的实际收益在于哪里？我们做出来的产品是否真的有那么多付费的用户？把一个重要的系统交给一个边缘的外部服务商员工是否合适？&lt;/p&gt;

&lt;p&gt;回到那个面试场景，最终我没有跟他们浪费时间，我建议他们通过新浪微博发起抽奖解决商品秒杀的场景问题，然后我&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Command+Q&lt;/code&gt;结束了整个远程会话。&lt;/p&gt;

&lt;h2 id=&quot;科学熵减大家都轻松&quot;&gt;科学熵减大家都轻松&lt;/h2&gt;

&lt;p&gt;回望第二次世界大战之后的世界，我们在一片废墟之上，又重新构建了新的高楼大厦。信息技术到现在未到百年，终末的号角便已吹响。如果说这个行业也会随着人工智能技术而逐渐式微，那么少用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C++&lt;/code&gt;避免猝死，多用GC语言，做好AI coding的最后QA。&lt;/p&gt;

&lt;p&gt;这样每天下班还能看到尚未暗淡的天空，不好吗？&lt;/p&gt;

&lt;h2 id=&quot;nn-1&quot;&gt;n&amp;lt;n-1&lt;/h2&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    
&lt;p&gt;I once proposed the first paradox of information technology: &lt;strong&gt;information technology is an anti-human technology&lt;/strong&gt;. In my article &lt;a href=&quot;https://www.zeusro.com/2026/02/04/fimbulwinter/?lang=en&quot;&gt;The Twilight of the Public Cloud&lt;/a&gt;, I summarized the law of entropy increase in the IT industry and “Rule Zero” — &lt;strong&gt;nobody wants to do code refactoring whose marginal benefit is zero&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Today I want to refute Rule Zero and propose a new “The Second Law of Information Technology” — in post-modern programming, &lt;strong&gt;the human purpose is to reduce the time-series complexity of code (n&amp;lt;n-1) and ensure code determinism&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-rationality-of-legacy-code-and-the-necessity-of-refactoring&quot;&gt;The Rationality of Legacy Code and the Necessity of Refactoring&lt;/h2&gt;

&lt;p&gt;If you have ever decompiled the Android APK of a game, you will find a large number of redundant art assets inside — assets completely unrelated to the current version. They are historically inherited garbage code.&lt;/p&gt;

&lt;p&gt;Due to Rule Zero, no programmer is willing to refactor or delete these art assets. This also explains why the installation package of &lt;em&gt;Honor of Kings&lt;/em&gt; kept growing, until solutions like “clear historical props” and “modular on-demand resource downloads” were finally proposed — though some players complained that after the update, the “Zongzi” skin turned into a pile of bot-like icons.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/a5ea41ff2d7691e097a223d17031c6a3_720.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Why does this happen? It comes down to a basic principle of game theory: &lt;strong&gt;a local optimum is not necessarily a global optimum&lt;/strong&gt;. For game developers, constructing new narratives is essential for generating new revenue. Clearing historical technical debt has no direct reflection on the game’s financials.&lt;/p&gt;

&lt;p&gt;But for players and operators, bloated installation packages drive up CDN traffic costs, and the accumulation of garbage code prolongs the time users need to download and open the game — and may even cause lag.&lt;/p&gt;

&lt;p&gt;If you use the law of entropy increase to evaluate the software development process, you will find that a “shit mountain” codebase is inevitable — to some extent, it is a form of “defensive programming” by software engineers.&lt;/p&gt;

&lt;h2 id=&quot;defensive-programming-or-over-engineering&quot;&gt;Defensive Programming or Over-Engineering?&lt;/h2&gt;

&lt;p&gt;From a political-economic perspective, software engineers are fundamentally still “migrant workers” who do not own the means of production. From the moment they join a company, everything they think and write becomes the company’s “digital assets.” This is reflected in the US TV series &lt;em&gt;Silicon Valley&lt;/em&gt;: while working at Hooli, Richard used his personal time (though partially on company computers for testing) to develop a revolutionary lossless data compression algorithm, and founded Pied Piper on that basis.&lt;/p&gt;

&lt;p&gt;As Pied Piper began to gain traction, Hooli (led by Gavin Belson) formally sued Pied Piper in season two, accusing Richard of “stealing” Hooli’s intellectual property (copyright infringement), claiming that under Richard’s employment contract with Hooli (which included an invention assignment clause), all code and related technology he developed during his employment belonged to Hooli.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/GT5mot-XYAAI9Z3.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Fighting the company is unwise. To guard against the risk of being laid off, software engineers resort to more than just avoiding documentation — abusing design patterns, using reflection for implicit method calls, and over-engineering are all common tactics.&lt;/p&gt;

&lt;p&gt;I sometimes genuinely don’t understand: employers ask me about “single-machine high concurrency” and “flash sale” scenarios just to negotiate salaries down. The most absurd was being asked about “millions of users online simultaneously.”
On the other side of a parallel world, I took a look at the salary and responsibilities for that position.&lt;/p&gt;

&lt;p&gt;With AI assistance, I could certainly design a workflow to handle these scenarios. The real question is: after deploying Redis distributed locks, Redis clusters, Kubernetes HPA auto-scaling, microservices, and message broker decoupling — where is the actual return on that code? Does our product truly have that many paying users? Is it appropriate to hand a critical system over to an employee of a marginal third-party vendor?&lt;/p&gt;

&lt;p&gt;Back to that interview: I didn’t bother wasting my time with them. I suggested they run a Sina Weibo lottery to solve the flash sale scenario problem, then hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Command+Q&lt;/code&gt; to end the entire remote session.&lt;/p&gt;

&lt;h2 id=&quot;scientific-entropy-reduction-makes-everyones-life-easier&quot;&gt;Scientific Entropy Reduction Makes Everyone’s Life Easier&lt;/h2&gt;

&lt;p&gt;Looking back at the world after World War II, we rebuilt towering structures from ruins. Information technology has not yet reached a hundred years, and already the final horn is sounding. If this industry is destined to gradually fade with the rise of artificial intelligence, then use less &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C++&lt;/code&gt; to avoid sudden death, use more GC languages, and serve as the final QA for AI coding.&lt;/p&gt;

&lt;p&gt;That way you can still see a sky that hasn’t faded when you leave work each day — isn’t that a better thing?&lt;/p&gt;

&lt;h2 id=&quot;nn-1&quot;&gt;n&amp;lt;n-1&lt;/h2&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    
&lt;p&gt;私はかつて情報技術の第一逆説を提唱した：&lt;strong&gt;情報技術は反人間的な技術である&lt;/strong&gt;。&lt;a href=&quot;https://www.zeusro.com/2026/02/04/fimbulwinter/?lang=jp&quot;&gt;パブリッククラウドの黄昏&lt;/a&gt;という記事で、私はIT業界のエントロピー増大の法則と「ゼロ号規則」——&lt;strong&gt;限界利益ゼロのコードリファクタリングは誰もやりたがらない&lt;/strong&gt;——をまとめた。&lt;/p&gt;

&lt;p&gt;今日、私はゼロ号規則を否定し、新たな「情報技術の第二法則」を提唱する——ポストモダンプログラミングにおいて、&lt;strong&gt;人間の使命はコードの時系列複雑度を低下させ（n&amp;lt;n-1）、コードの確定性を確保すること&lt;/strong&gt;である。&lt;/p&gt;

&lt;h2 id=&quot;レガシーコードが存在する合理性とリファクタリングの必要性&quot;&gt;レガシーコードが存在する合理性とリファクタリングの必要性&lt;/h2&gt;

&lt;p&gt;ゲームのAndroid APKを逆コンパイルしたことがあれば、現在のバージョンとは無関係な大量の冗長な美術リソースが含まれていることに気づくだろう。それらは歴史的に受け継がれたガベージコードだ。&lt;/p&gt;

&lt;p&gt;ゼロ号規則の存在により、誰もこれらの美術リソースをリファクタリングしたり削除したりしたがらない。これは「王者栄耀（Honor of Kings）」のインストールパッケージが膨れ上がり続けた理由を説明する。最終的に「過去のアイテムの整理」と「モジュール式オンデマンドリソースダウンロード」という解決策が提案されたが、アップデート後に「ちまき」スキンがボットのようなアイコンの山に変わったと批判する人もいた。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/a5ea41ff2d7691e097a223d17031c6a3_720.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;なぜこうなるのか？ゲーム理論の基本的な命題に行き着く：&lt;strong&gt;局所最適は必ずしも大域最適ではない&lt;/strong&gt;。ゲーム開発者にとって、新しい収益を生み出すには新しい物語を構築しなければならない。歴史的技術負債の解消はゲームの財務には反映されない。&lt;/p&gt;

&lt;p&gt;しかしゲームユーザーと運営会社にとって、膨張するインストールパッケージはCDNのトラフィックコストを押し上げ、ガベージコードの蓄積はユーザーがゲームをダウンロードして起動するのに必要な時間を延ばし、操作のラグを引き起こす可能性すらある。&lt;/p&gt;

&lt;p&gt;エントロピー増大の法則でソフトウェア開発プロセスを評価するなら、コードの「ゴミ山」は必然であり、ある意味ではソフトウェアエンジニアによる「防御的プログラミング」の一形態だと気づくだろう。&lt;/p&gt;

&lt;h2 id=&quot;防御的プログラミングか過剰設計か&quot;&gt;防御的プログラミングか過剰設計か？&lt;/h2&gt;

&lt;p&gt;政治経済学の観点から見れば、ソフトウェアエンジニアは本質的に生産手段を持たない「出稼ぎ労働者」だ。会社に入社した瞬間から、考えることや書くことはすべて会社の「デジタル資産」になる。これは米ドラマ『シリコンバレー』にも描かれている：RichardはHooliで働きながら、個人の時間（一部は会社のパソコンを使ってテスト）を使って革命的なロスレスデータ圧縮アルゴリズムを開発し、それを基にPied Piperを創立した。&lt;/p&gt;

&lt;p&gt;Pied Piperが頭角を現し始めると、Hooli（Gavin Belson率いる）はシーズン2でPied Piperを正式に提訴し、Richardが同社の知的財産（著作権）を「盗んだ」と訴えた。RichardとHooliの雇用契約（発明譲渡条項を含む）に基づき、在職中に開発したすべてのコードと関連技術はHooliの所有物だと主張した。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/GT5mot-XYAAI9Z3.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;会社と対立するのは得策ではない。解雇リスクを避けるため、ソフトウェアエンジニアは文書を書かないだけでなく、デザインパターンの乱用、リフレクションによる暗黙的なメソッド呼び出し、過剰設計なども常套手段だ。&lt;/p&gt;

&lt;p&gt;採用担当者が「シングルマシン高並行」や「フラッシュセール」の問題を私に聞くのは、単に給与を下げるためだと時々本当に理解できない。最も極端だったのは「数百万人が同時オンライン」というような馬鹿げた質問だった。
そして並行世界の反対側では、そのポジションの給与と対応する職責を見てみると……。&lt;/p&gt;

&lt;p&gt;AIの助けがあれば、これらのシナリオに対応するワークフローを設計することは当然できる。問題は、Redisの分散ロック、Redisクラスター、Kubernetes HPAの自動スケーリング、マイクロサービス、メッセージブローカーのデカップリングを使った後、コードの実際のリターンはどこにあるのかということだ。私たちの製品に本当にそれほど多くの有料ユーザーはいるのか？重要なシステムを周辺的な外部ベンダーの社員に任せることは適切なのか？&lt;/p&gt;

&lt;p&gt;あの面接に戻ると、最終的に彼らと時間を無駄にしなかった。新浪微博でくじ引き抽選を行って商品のフラッシュセールシナリオ問題を解決するよう提案し、それから&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Command+Q&lt;/code&gt;でリモートセッション全体を終了した。&lt;/p&gt;

&lt;h2 id=&quot;科学的なエントロピー削減で皆が楽になる&quot;&gt;科学的なエントロピー削減で皆が楽になる&lt;/h2&gt;

&lt;p&gt;第二次世界大戦後の世界を振り返れば、廃墟の上から新しい高層ビルを再建した。情報技術はまだ百年も経っておらず、すでに終末のラッパが鳴り響いている。もしこの業界が人工知能の台頭とともに徐々に衰退していくとしたら、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C++&lt;/code&gt;の使用を減らして突然死を避け、GC言語を多く使い、AIコーディングの最後のQAを担おう。&lt;/p&gt;

&lt;p&gt;そうすれば毎日仕事終わりに、まだ色あせていない空を見ることができる——それでいいじゃないか？&lt;/p&gt;

&lt;h2 id=&quot;nn-1&quot;&gt;n&amp;lt;n-1&lt;/h2&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    
&lt;p&gt;Я однажды предложил первый парадокс информационных технологий: &lt;strong&gt;информационные технологии — это антигуманная технология&lt;/strong&gt;. В статье &lt;a href=&quot;https://www.zeusro.com/2026/02/04/fimbulwinter/?lang=ru&quot;&gt;Сумерки публичного облака&lt;/a&gt; я сформулировал закон возрастания энтропии в IT-отрасли и «Правило ноль» — &lt;strong&gt;никто не хочет делать рефакторинг кода с нулевой предельной выгодой&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Сегодня я хочу опровергнуть Правило ноль и предложить новый «Второй закон информационных технологий» — в постмодернистском программировании &lt;strong&gt;роль человека состоит в снижении временно́й последовательной сложности кода (n&amp;lt;n-1) и обеспечении детерминированности кода&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;обоснованность-существования-горы-мусора-и-необходимость-рефакторинга&quot;&gt;Обоснованность существования «горы мусора» и необходимость рефакторинга&lt;/h2&gt;

&lt;p&gt;Если вы когда-либо декомпилировали Android APK игры, то обнаружили бы огромное количество избыточных художественных ресурсов, не имеющих никакого отношения к текущей версии. Это исторически унаследованный мусорный код.&lt;/p&gt;

&lt;p&gt;Из-за Правила ноль ни один программист не хочет рефакторить или удалять эти художественные ресурсы. Это объясняет, почему установочный пакет &lt;em&gt;Honor of Kings&lt;/em&gt; постоянно разрастался, пока наконец не были предложены решения в виде «очистки исторических предметов» и «модульной загрузки ресурсов по запросу» — хотя некоторые игроки жаловались, что после обновления скин «цзунцзы» превратился в груду иконок, похожих на ботов.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/a5ea41ff2d7691e097a223d17031c6a3_720.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Почему так происходит? Это связано с фундаментальным тезисом теории игр: &lt;strong&gt;локальный оптимум не обязательно является глобальным оптимумом&lt;/strong&gt;. Для разработчиков игр новые нарративы необходимы для получения нового дохода. Устранение исторического технического долга никак не отражается в финансовых показателях игры.&lt;/p&gt;

&lt;p&gt;Однако для пользователей и операторов разрастающийся установочный пакет увеличивает затраты на CDN-трафик, а накопление мусорного кода удлиняет время загрузки и запуска игры — и может даже привести к зависаниям.&lt;/p&gt;

&lt;p&gt;Если оценивать процесс разработки программного обеспечения через призму закона возрастания энтропии, становится ясно, что «гора мусора» в коде неизбежна — в определённой мере это «защитное программирование» со стороны разработчиков.&lt;/p&gt;

&lt;h2 id=&quot;защитное-программирование-или-чрезмерное-проектирование&quot;&gt;Защитное программирование или чрезмерное проектирование?&lt;/h2&gt;

&lt;p&gt;С точки зрения политической экономии, разработчики программного обеспечения по-прежнему остаются «приезжими рабочими», не владеющими средствами производства. С момента прихода в компанию всё, о чём они думают и что пишут, становится «цифровым активом» компании. Это нашло отражение в американском сериале «Кремниевая долина»: работая в Hooli, Ричард в свободное время (хотя частично использовал рабочий компьютер для тестирования) разработал революционный алгоритм сжатия данных без потерь и основал на его базе компанию Pied Piper.&lt;/p&gt;

&lt;p&gt;Когда Pied Piper начала набирать обороты, Hooli (во главе с Гэвином Белсоном) во втором сезоне официально подала на Pied Piper в суд, обвинив Ричарда в «краже» интеллектуальной собственности Hooli (нарушении авторских прав), утверждая, что согласно трудовому договору Ричарда с Hooli (включавшему пункт о передаче изобретений), весь написанный им код и связанные технологии принадлежат Hooli.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/entropy-reduction-law/GT5mot-XYAAI9Z3.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Противостоять компании неразумно. Поэтому, чтобы снизить риск увольнения, разработчики прибегают не только к отказу от документирования — злоупотребление шаблонами проектирования, неявный вызов методов через рефлексию и чрезмерное проектирование тоже относятся к распространённым тактикам.&lt;/p&gt;

&lt;p&gt;Иногда я действительно не понимаю: работодатели спрашивают меня о «высоком параллелизме на одной машине» и задачах «flash sale» лишь для того, чтобы сбить зарплату. Самое абсурдное — вопрос о «миллионах пользователей одновременно онлайн».
А в параллельном мире я посмотрел на предлагаемую зарплату и обязанности для этой вакансии.&lt;/p&gt;

&lt;p&gt;При помощи ИИ я, конечно, могу разработать процесс для этих сценариев. Вопрос в другом: после применения распределённых блокировок Redis, кластеров Redis, автомасштабирования Kubernetes HPA, микросервисов и развязки через брокер сообщений — в чём реальная отдача от такого кода? Действительно ли у нашего продукта столько платящих пользователей? Уместно ли доверять важную систему сотруднику сторонней периферийной компании?&lt;/p&gt;

&lt;p&gt;Возвращаясь к тому собеседованию: я не стал тратить с ними время. Предложил им провести лотерею в Sina Weibo для решения сценария с flash sale товаров, а затем нажал &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Command+Q&lt;/code&gt; и завершил весь удалённый сеанс.&lt;/p&gt;

&lt;h2 id=&quot;научное-снижение-энтропии-облегчает-жизнь-всем&quot;&gt;Научное снижение энтропии облегчает жизнь всем&lt;/h2&gt;

&lt;p&gt;Оглядываясь на мир после Второй мировой войны: мы возвели новые небоскрёбы из руин. Информационным технологиям ещё нет ста лет, а финальный горн уже трубит. Если эта отрасль всё же будет постепенно угасать с развитием искусственного интеллекта — используйте меньше &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C++&lt;/code&gt;, чтобы избежать внезапной смерти, больше GC-языков и станьте последним QA для AI-кодинга.&lt;/p&gt;

&lt;p&gt;Так вы сможете каждый вечер, возвращаясь домой, видеть небо, которое ещё не потускнело — разве это плохо?&lt;/p&gt;

&lt;h2 id=&quot;nn-1&quot;&gt;n&amp;lt;n-1&lt;/h2&gt;

&lt;/div&gt;
</description>
        <pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/03/01/entropy-reduction-law/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/03/01/entropy-reduction-law/</guid>
        
        <category>code</category>
        
        
      </item>
    
      <item>
        <title>时间序列元编程</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;p&gt;由于时间序列库原始的论文&lt;a href=&quot;http://github.com/zeusro/data&quot;&gt;http://github.com/zeusro/data&lt;/a&gt;已经丢失了，我只能按照有限的回忆一点点拼凑起时间序列那部分的内容。&lt;/p&gt;

&lt;p&gt;只有经过时间的实践，才能验证程序的正确性。因此我提出时间序列元编程模型。这是一种对现实世界提出建模的新程序范式，是编程语言无关的设计哲学。&lt;/p&gt;

&lt;p&gt;在此基础上引入&lt;strong&gt;时间序列复杂度&lt;/strong&gt;：在满足传统时间/空间复杂度前提下，用二维图（t 与内存利用率等）乃至三维图（加入 CPU/GPU 负载）刻画算法实际耗时与资源利用。&lt;/p&gt;

&lt;h2 id=&quot;时间序列&quot;&gt;时间序列&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;时间序列&lt;/strong&gt;：按时间顺序排列、记录同一对象状态随时间变化的一组数据。
时间序列只有&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt;作为唯一API。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt;可以按照顺序分化为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Read&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Write&lt;/code&gt;接口。&lt;/p&gt;

&lt;h2 id=&quot;时间序列对象&quot;&gt;时间序列对象&lt;/h2&gt;

&lt;p&gt;时间序列对象，时间必须是第一成员，并且在初始化函数中体现。
基于时间而生成的数据都是时序数据。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;GoldenStaff&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NLine&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;//金箍棒 参数化线段（Parametric Segment）&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;//消费者规模&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;//算法规模&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;cost&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;时间序列函数&quot;&gt;时间序列函数&lt;/h2&gt;

&lt;p&gt;时间序列函数，时间必须是第一成员。返回参数第一成员必须是时间序列对象。
传入的时间与传出的时间，表示函数的时间上下界。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// NewDeadMonkey&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// m 作战对象&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// n 唯一资源数/算法规模&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewDeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;//只要不跟前面的点重复就行，全局重复也忽略了&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Compare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// SleepAndReturnNewTime 接收一个时间参数，随机 sleep 一段时间后返回最新时间&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SleepAndReturnNewTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// 设置随机种子&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnixNano&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// 生成随机的 sleep 时间，范围为 1 到 5 秒&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Intn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Second&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Sleep 随机时间&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// 返回当前时间&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;时间序列距离&quot;&gt;时间序列距离&lt;/h2&gt;

&lt;p&gt;使用时间+其他条件的复合判断（比如在4维球面中，可以只使用距离作为换算；也可以使用时间+Haversine公式换算）。&lt;/p&gt;

&lt;h2 id=&quot;时间序列日志&quot;&gt;时间序列日志&lt;/h2&gt;

&lt;p&gt;打印内容必须是“时间+内容”的格式。&lt;/p&gt;

&lt;h2 id=&quot;时间序列复杂度&quot;&gt;时间序列复杂度&lt;/h2&gt;

&lt;p&gt;时间序列复杂度（Time Series Complexity）：在满足时间复杂度以及空间复杂度的前置性论述下，算法执行的实际时间以及内存资源的利用效率。&lt;/p&gt;

&lt;p&gt;时间序列复杂度是一个二维图表。X轴是t，Y轴是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(used - buff/cache) / total&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;Y轴可以按照实际需要，使用其他的标准，比如CPU/GPU的整体利用率。&lt;/p&gt;

&lt;p&gt;单位时间序列复杂度是一个三维图表。 不过三维图表过于抽象，可以降维成2个2维图表。或者合并Y轴，变成一个二维图表的两条曲线。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;单位CPU时间序列复杂度&lt;/strong&gt;是一个三维图表。 X轴是t， Y轴是(used - buff/cache) / total， Z轴是cpu_load1。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;单位GPU时间序列复杂度&lt;/strong&gt;是一个三维图表。 X轴是t， Y轴是(used - buff/cache) / total， Z轴是gpu_utilization。&lt;/p&gt;

&lt;p&gt;时间序列复杂度需要对程序进行可观测性分析。&lt;/p&gt;

&lt;h2 id=&quot;时间序列空间&quot;&gt;时间序列空间&lt;/h2&gt;

&lt;p&gt;由时间序列组成的2维以上空间。&lt;/p&gt;

&lt;p&gt;在OOOS&lt;a href=&quot;https://github.com/zeusro/system&quot;&gt;https://github.com/zeusro/system&lt;/a&gt;中，我将会尽可能地使用这种编程范式。&lt;/p&gt;

&lt;p&gt;比如&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;无锁并发访问受限资源的平行时空算法（&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&lt;/a&gt;）&lt;/li&gt;
  &lt;li&gt;Y函数（&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    &lt;p&gt;The original paper for the time-series library &lt;a href=&quot;http://github.com/zeusro/data&quot;&gt;http://github.com/zeusro/data&lt;/a&gt; has been lost, so I can only piece together the time-series part from limited memory.&lt;/p&gt;

&lt;p&gt;Only through practice over time can the correctness of a program be verified. I therefore propose the time-series meta-programming model—a new programming paradigm for modeling the real world, a design philosophy independent of programming language.&lt;/p&gt;

&lt;p&gt;On this basis, &lt;strong&gt;time-series complexity&lt;/strong&gt; is introduced: under the premise of satisfying traditional time and space complexity, two-dimensional plots (e.g. t vs. memory utilization) and even three-dimensional plots (adding CPU/GPU load) are used to characterize the actual execution time and resource utilization of algorithms.&lt;/p&gt;

&lt;h2 id=&quot;time-series&quot;&gt;Time Series&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Time series&lt;/strong&gt;: A set of data arranged in chronological order that records how the state of the same object changes over time.&lt;br /&gt;
A time series has only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt; as its sole API. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt; can be split in order into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Read&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Write&lt;/code&gt; interfaces.&lt;/p&gt;

&lt;h2 id=&quot;time-series-objects&quot;&gt;Time-Series Objects&lt;/h2&gt;

&lt;p&gt;For a time-series object, time must be the first member and must be reflected in the initialization function.&lt;br /&gt;
Any data generated based on time is time-series data.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;GoldenStaff&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NLine&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// Golden Cudgel – Parametric Segment&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// consumer scale&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// algorithm scale&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;cost&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;time-series-functions&quot;&gt;Time-Series Functions&lt;/h2&gt;

&lt;p&gt;For a time-series function, time must be the first parameter. The first member of the return value must be a time-series object.&lt;br /&gt;
The input time and output time represent the lower and upper time bounds of the function.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// NewDeadMonkey&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// m combat objects&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// n unique resource count / algorithm scale&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewDeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;// As long as it doesn&apos;t duplicate the previous point; global duplicates are ignored&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Compare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// SleepAndReturnNewTime accepts a time argument, sleeps randomly, then returns the latest time&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SleepAndReturnNewTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Set random seed&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnixNano&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Generate random sleep duration, 1 to 5 seconds&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Intn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Second&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Sleep for random duration&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Return current time&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;time-series-distance&quot;&gt;Time-Series Distance&lt;/h2&gt;

&lt;p&gt;Use composite criteria of time plus other conditions (e.g. on a 4-dimensional sphere, distance alone may be used for conversion; or time plus the Haversine formula).&lt;/p&gt;

&lt;h2 id=&quot;time-series-logging&quot;&gt;Time-Series Logging&lt;/h2&gt;

&lt;p&gt;Log output must follow the format “time + content”.&lt;/p&gt;

&lt;h2 id=&quot;time-series-complexity&quot;&gt;Time-Series Complexity&lt;/h2&gt;

&lt;p&gt;Time-series complexity: Under the prerequisite of time complexity and space complexity, the actual execution time of an algorithm and the utilization efficiency of memory resources.&lt;/p&gt;

&lt;p&gt;Time-series complexity is represented as a two-dimensional plot. The X-axis is t, the Y-axis is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(used - buff/cache) / total&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The Y-axis can use other metrics as needed, such as overall CPU/GPU utilization.&lt;/p&gt;

&lt;p&gt;Unit time-series complexity is a three-dimensional plot. Three-dimensional plots are rather abstract; they can be reduced to two 2D plots, or the Y-axes can be merged into two curves on a single 2D plot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unit CPU time-series complexity&lt;/strong&gt; is a three-dimensional plot: X-axis t, Y-axis (used - buff/cache) / total, Z-axis cpu_load1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unit GPU time-series complexity&lt;/strong&gt; is a three-dimensional plot: X-axis t, Y-axis (used - buff/cache) / total, Z-axis gpu_utilization.&lt;/p&gt;

&lt;p&gt;Time-series complexity requires observability analysis of the program.&lt;/p&gt;

&lt;h2 id=&quot;time-series-space&quot;&gt;Time-Series Space&lt;/h2&gt;

&lt;p&gt;A space of two or more dimensions composed of time series.&lt;/p&gt;

&lt;p&gt;In OOOS &lt;a href=&quot;https://github.com/zeusro/system&quot;&gt;https://github.com/zeusro/system&lt;/a&gt;, I will use this programming paradigm as much as possible.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Lock-free parallel spacetime algorithm for concurrent access to constrained resources (&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Y function (&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    &lt;p&gt;時間序列ライブラリの元論文（&lt;a href=&quot;http://github.com/zeusro/data&quot;&gt;http://github.com/zeusro/data&lt;/a&gt;）は失われており、限られた記憶から時間序列の部分を少しずつ再構成するしかない。&lt;/p&gt;

&lt;p&gt;時間をかけた実践によってのみ、プログラムの正しさは検証できる。そこで時間序列メタプログラミングモデルを提唱する。現実世界をモデル化するための新しいプログラムのパラダイムであり、プログラミング言語に依存しない設計哲学である。&lt;/p&gt;

&lt;p&gt;この上に&lt;strong&gt;時間序列複雑度&lt;/strong&gt;を導入する：従来の時間・空間複雑度を満たすことを前提に、二次元グラフ（t とメモリ利用率など）や三次元グラフ（CPU/GPU 負荷を加える）で、アルゴリズムの実際の実行時間とリソース利用を表現する。&lt;/p&gt;

&lt;h2 id=&quot;時間序列&quot;&gt;時間序列&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;時間序列&lt;/strong&gt;：時間順に並べられた、同一対象の状態の時間変化を記録したデータの集合。&lt;br /&gt;
時間序列の API は &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt; のみである。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt; は順序に従って &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Read&lt;/code&gt; と &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Write&lt;/code&gt; インターフェースに分化できる。&lt;/p&gt;

&lt;h2 id=&quot;時間序列オブジェクト&quot;&gt;時間序列オブジェクト&lt;/h2&gt;

&lt;p&gt;時間序列オブジェクトでは、時間を第一メンバーとし、初期化関数に反映させる必要がある。&lt;br /&gt;
時間に基づいて生成されるデータはすべて時系列データである。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;GoldenStaff&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NLine&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// 金箍棒 パラメトリック線分（Parametric Segment）&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// 消費者規模&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// アルゴリズム規模&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;cost&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;時間序列関数&quot;&gt;時間序列関数&lt;/h2&gt;

&lt;p&gt;時間序列関数では、時間を第一引数とする。戻り値の第一メンバーは時間序列オブジェクトでなければならない。&lt;br /&gt;
入力される時間と出力される時間は、関数の時間の下界と上界を表す。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// NewDeadMonkey&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// m 戦闘対象&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// n 唯一リソース数 / アルゴリズム規模&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewDeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;// 前の点と重複しなければよい。全体での重複は無視する&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Compare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// SleepAndReturnNewTime 時間引数を受け取り、ランダムに sleep してから最新の時間を返す&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SleepAndReturnNewTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// 乱数シードを設定&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnixNano&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// 1〜5秒のランダムな sleep 時間を生成&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Intn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Second&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// ランダム時間だけ Sleep&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// 現在時刻を返す&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;時間序列距離&quot;&gt;時間序列距離&lt;/h2&gt;

&lt;p&gt;時間＋その他の条件による複合判定を用いる（例：4次元球面上では距離のみで換算してもよいし、時間＋Haversine 公式で換算してもよい）。&lt;/p&gt;

&lt;h2 id=&quot;時間序列ログ&quot;&gt;時間序列ログ&lt;/h2&gt;

&lt;p&gt;出力内容は「時間＋内容」の形式でなければならない。&lt;/p&gt;

&lt;h2 id=&quot;時間序列複雑度&quot;&gt;時間序列複雑度&lt;/h2&gt;

&lt;p&gt;時間序列複雑度（Time Series Complexity）：時間複雑度および空間複雑度の前提を満たした上で、アルゴリズムの実際の実行時間とメモリリソースの利用効率。&lt;/p&gt;

&lt;p&gt;時間序列複雑度は二次元グラフで表す。X 軸は t、Y 軸は &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(used - buff/cache) / total&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;Y 軸は必要に応じて、CPU/GPU の全体利用率など別の指標を用いてよい。&lt;/p&gt;

&lt;p&gt;単位時間序列複雑度は三次元グラフである。三次元は抽象的すぎるため、2 つの二次元グラフに次元削減するか、Y 軸を統合して二次元グラフ上の 2 本の曲線にしてもよい。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;単位 CPU 時間序列複雑度&lt;/strong&gt;は三次元グラフである。X 軸は t、Y 軸は (used - buff/cache) / total、Z 軸は cpu_load1。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;単位 GPU 時間序列複雑度&lt;/strong&gt;は三次元グラフである。X 軸は t、Y 軸は (used - buff/cache) / total、Z 軸は gpu_utilization。&lt;/p&gt;

&lt;p&gt;時間序列複雑度にはプログラムの可観測性解析が必要である。&lt;/p&gt;

&lt;h2 id=&quot;時間序列空間&quot;&gt;時間序列空間&lt;/h2&gt;

&lt;p&gt;時間序列からなる 2 次元以上の空間。&lt;/p&gt;

&lt;p&gt;OOOS（&lt;a href=&quot;https://github.com/zeusro/system&quot;&gt;https://github.com/zeusro/system&lt;/a&gt;）では、このプログラミングパラダイムを可能な限り用いる。&lt;/p&gt;

&lt;p&gt;例：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;制約付きリソースへの無ロック並行アクセスの並行時空アルゴリズム（&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&lt;/a&gt;）&lt;/li&gt;
  &lt;li&gt;Y 関数（&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    &lt;p&gt;Оригинальная статья по библиотеке временных рядов &lt;a href=&quot;http://github.com/zeusro/data&quot;&gt;http://github.com/zeusro/data&lt;/a&gt; утрачена, поэтому я могу лишь по обрывочным воспоминаниям восстановить часть, касающуюся временных рядов.&lt;/p&gt;

&lt;p&gt;Только практика во времени способна проверить корректность программы. Поэтому я предлагаю модель метапрограммирования временных рядов — новую программную парадигму для моделирования реального мира, философию проектирования, не привязанную к языку программирования.&lt;/p&gt;

&lt;p&gt;На этой основе вводится &lt;strong&gt;сложность временных рядов&lt;/strong&gt;: при соблюдении традиционной временной и пространственной сложности двумерные графики (например, t и утилизация памяти) и даже трёхмерные (с учётом нагрузки CPU/GPU) описывают фактическое время выполнения алгоритма и использование ресурсов.&lt;/p&gt;

&lt;h2 id=&quot;временной-ряд&quot;&gt;Временной ряд&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Временной ряд&lt;/strong&gt;: упорядоченный по времени набор данных, фиксирующий изменение состояния одного и того же объекта во времени.&lt;br /&gt;
У временного ряда единственный API — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Watch&lt;/code&gt; по порядку разбивается на интерфейсы &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Read&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Write&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;объект-временного-ряда&quot;&gt;Объект временного ряда&lt;/h2&gt;

&lt;p&gt;У объекта временного ряда время должно быть первым полем и отражаться в функции инициализации.&lt;br /&gt;
Любые данные, порождённые на основе времени, являются данными временного ряда.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;GoldenStaff&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NLine&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;// Золотая дубинка – параметрический отрезок&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// масштаб потребителей&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;           &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;     &lt;span class=&quot;c&quot;&gt;// масштаб алгоритма&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;cost&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;функция-временного-ряда&quot;&gt;Функция временного ряда&lt;/h2&gt;

&lt;p&gt;У функции временного ряда первым аргументом должно быть время. Первое поле возвращаемого значения должно быть объектом временного ряда.&lt;br /&gt;
Входное и выходное время задают нижнюю и верхнюю временные границы функции.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;// NewDeadMonkey&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// m боевые объекты&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// n число уникальных ресурсов / масштаб алгоритма&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NewDeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DeadMonkey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;Birth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;// Достаточно не совпадать с предыдущей точкой; глобальные повторы игнорируются&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Compare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandonPoint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ZeroPoints&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zeroPoints&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dead&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// SleepAndReturnNewTime принимает аргумент времени, случайно «засыпает», затем возвращает актуальное время&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SleepAndReturnNewTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputTime&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;// Установить зерно случайности&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UnixNano&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Случайная длительность сна от 1 до 5 секунд&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Duration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Intn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Second&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Сон на случайное время&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleepDuration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c&quot;&gt;// Вернуть текущее время&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;расстояние-во-временном-ряде&quot;&gt;Расстояние во временном ряде&lt;/h2&gt;

&lt;p&gt;Используется составной критерий: время плюс другие условия (например, на 4-мерной сфере можно опираться только на расстояние или на время и формулу Haversine).&lt;/p&gt;

&lt;h2 id=&quot;логирование-временного-ряда&quot;&gt;Логирование временного ряда&lt;/h2&gt;

&lt;p&gt;Содержимое вывода должно быть в формате «время + содержание».&lt;/p&gt;

&lt;h2 id=&quot;сложность-временного-ряда&quot;&gt;Сложность временного ряда&lt;/h2&gt;

&lt;p&gt;Сложность временного ряда (Time Series Complexity): при заданных временной и пространственной сложности — фактическое время выполнения алгоритма и эффективность использования памяти.&lt;/p&gt;

&lt;p&gt;Сложность временного ряда изображается двумерным графиком. По оси X — t, по оси Y — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(used - buff/cache) / total&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;По оси Y при необходимости можно использовать другие метрики, например общую загрузку CPU/GPU.&lt;/p&gt;

&lt;p&gt;Единичная сложность временного ряда — трёхмерный график. Трёхмерный график слишком абстрактен; его можно свести к двум двумерным или объединить оси Y в две кривые на одном двумерном графике.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Единичная CPU-сложность временного ряда&lt;/strong&gt; — трёхмерный график: ось X — t, ось Y — (used - buff/cache) / total, ось Z — cpu_load1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Единичная GPU-сложность временного ряда&lt;/strong&gt; — трёхмерный график: ось X — t, ось Y — (used - buff/cache) / total, ось Z — gpu_utilization.&lt;/p&gt;

&lt;p&gt;Для сложности временного ряда требуется анализ наблюдаемости программы.&lt;/p&gt;

&lt;h2 id=&quot;пространство-временных-рядов&quot;&gt;Пространство временных рядов&lt;/h2&gt;

&lt;p&gt;Пространство размерности два и выше, состоящее из временных рядов.&lt;/p&gt;

&lt;p&gt;В OOOS &lt;a href=&quot;https://github.com/zeusro/system&quot;&gt;https://github.com/zeusro/system&lt;/a&gt; я буду по возможности применять эту программную парадигму.&lt;/p&gt;

&lt;p&gt;Например:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Алгоритм параллельного пространства-времени с неблокирующим доступом к ограниченным ресурсам (&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shenzhen/szx/readme.md&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Функция Y (&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&quot;&gt;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go#L73&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
</description>
        <pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/02/06/Time-Series-Coding/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/02/06/Time-Series-Coding/</guid>
        
        <category>n</category>
        
        <category>time</category>
        
        
      </item>
    
      <item>
        <title>公有云的诸神黄昏</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    &lt;h2 id=&quot;摘要&quot;&gt;摘要&lt;/h2&gt;

&lt;p&gt;本文从形式逻辑与定义出发（网络效应、熵增定律、反依赖性、边际收益为零的「0」哲学），系统梳理了 2014–2025 年间阿里云、谷歌云、Azure、Cloudflare、腾讯云等主流公有云与基础设施的重大故障记录，并比较了各家的故障透明度。在此基础上，文章分析了公有云「死因」：软件熵增与边际收益为零导致旧代码与架构难以治理，网络效应在故障时放大连锁反应，而 SLA 赔付与政企实际损失严重不对等。作者建议大型政企将对公有云的「反依赖」提上日程，并提出「小并发高可用系统」的设想——通过存储冗余与流量分摊（如多区域、多集群 DNS 解析）降低单点风险与问题扩散半径。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/fimbulwinter/fimbulwinter.jpeg&quot; alt=&quot;芬布尔之冬&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;形式逻辑和定义&quot;&gt;形式逻辑和定义&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;网络效应&lt;/strong&gt;：一个产品/服务/平台的使用者（或参与者）越多，它对每一个使用者的价值就越大。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;熵增定律&lt;/strong&gt;：项目代码库会随着时间推移而变成一座屎山。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;反依赖性&lt;/strong&gt;：对单一编程语言/技术栈/云平台的反向依赖。比如多语言混合编程，多技术栈选型，多云策略。反依赖性让业务可以脱离语言/开源项目/公有云平稳运行。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0&lt;/strong&gt;：边际收益为0的代码重构没人愿意做。&lt;/p&gt;

&lt;h2 id=&quot;aws的故障&quot;&gt;AWS的故障&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;
      &lt;th&gt;地域/范围&lt;/th&gt;
      &lt;th&gt;持续时长&lt;/th&gt;
      &lt;th&gt;主要影响范围与后果&lt;/th&gt;
      &lt;th&gt;官方/主流原因说明&lt;/th&gt;
      &lt;th&gt;备注 / 行业评价&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;未指定&lt;/td&gt;
      &lt;td&gt;影响 Amazon SimpleDB 服务部分关键组件，导致部分用户无法访问或操作数据库。&lt;/td&gt;
      &lt;td&gt;电源问题引发系统中断。&lt;/td&gt;
      &lt;td&gt;较小规模事件，AWS 快速恢复；行业评价为基础设施电源冗余不足的典型案例。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-08-07&lt;/td&gt;
      &lt;td&gt;EU West (爱尔兰)&lt;/td&gt;
      &lt;td&gt;未指定&lt;/td&gt;
      &lt;td&gt;影响 EC2、EBS 和 RDS 服务，导致部分欧洲用户实例、存储和数据库不可用。&lt;/td&gt;
      &lt;td&gt;内部系统事件，未公布详细根因。&lt;/td&gt;
      &lt;td&gt;区域性事件，影响欧洲客户；评价为 AWS 早期区域隔离不完善的体现。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-11-26&lt;/td&gt;
      &lt;td&gt;全球 (CloudFront DNS)&lt;/td&gt;
      &lt;td&gt;约 2 小时&lt;/td&gt;
      &lt;td&gt;DNS 服务器宕机，影响 CDN 服务，导致部分网站和云服务离线，无法解析请求。&lt;/td&gt;
      &lt;td&gt;DNS 服务器故障。&lt;/td&gt;
      &lt;td&gt;短暂但广泛影响；行业称其为“世界上最大云的 DNS 脆弱性暴露”。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2015-09-20&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;DynamoDB 故障导致内部服务通信中断，波及 Netflix、Reddit、IMDb 和 Amazon 自身站点，用户无法访问视频、社交和电商服务。&lt;/td&gt;
      &lt;td&gt;内部多个服务通信中断，引发连锁反应。&lt;/td&gt;
      &lt;td&gt;严重事件，影响数百万用户；评价为 AWS 内部依赖性过高的警示。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2017-02-28&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;4-5 小时&lt;/td&gt;
      &lt;td&gt;S3 控制平面瘫痪，影响 Slack、Trello、GitHub Pages、Quora 等大量网站，无法加载图像和文件。&lt;/td&gt;
      &lt;td&gt;工程师误删关键配置（打字错误）。&lt;/td&gt;
      &lt;td&gt;历史上最著名故障之一，称为“最贵的一次 typo”；行业评价强调人为错误风险。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020-11-25&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;Kinesis 和 Cognito 故障，影响 Roku、Adobe、Flickr 等企业客户，流媒体和认证服务中断。&lt;/td&gt;
      &lt;td&gt;容量更新问题引发中断。&lt;/td&gt;
      &lt;td&gt;疫情期间事件，影响远程工作；评价为容量管理挑战。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022-12-05&lt;/td&gt;
      &lt;td&gt;us-east-2 (俄亥俄)&lt;/td&gt;
      &lt;td&gt;约 40 分钟&lt;/td&gt;
      &lt;td&gt;可用区中断，影响区域内多项服务，导致部分客户资源不可用。&lt;/td&gt;
      &lt;td&gt;未公布详细根因，可能是网络或电源问题。&lt;/td&gt;
      &lt;td&gt;短暂事件，但凸显可用区依赖；行业建议多 AZ 架构。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;未指定&lt;/td&gt;
      &lt;td&gt;Lambda 服务事件，广泛影响大型组织如 Boston Globe、纽约地铁和 Associated Press，无法执行无服务器函数。&lt;/td&gt;
      &lt;td&gt;未公布详细根因。&lt;/td&gt;
      &lt;td&gt;区域性大范围中断；评价为无服务器计算脆弱性暴露。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024-07-30&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;未指定&lt;/td&gt;
      &lt;td&gt;Kinesis Data Streams 故障，导致依赖服务连锁中断，影响实时数据处理应用。&lt;/td&gt;
      &lt;td&gt;未公布详细根因，可能是内部系统问题。&lt;/td&gt;
      &lt;td&gt;影响数据流服务；行业评价为流处理依赖风险。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-02&lt;/td&gt;
      &lt;td&gt;eu-north-1 (斯德哥尔摩)&lt;/td&gt;
      &lt;td&gt;未指定&lt;/td&gt;
      &lt;td&gt;网络故障影响一个 AZ 内多项核心服务，导致欧洲部分用户中断。&lt;/td&gt;
      &lt;td&gt;重大网络故障。&lt;/td&gt;
      &lt;td&gt;区域性事件；评价为欧洲基础设施扩展挑战。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-10-19/20&lt;/td&gt;
      &lt;td&gt;us-east-1 (北弗吉尼亚)&lt;/td&gt;
      &lt;td&gt;约 15 小时以上&lt;/td&gt;
      &lt;td&gt;DynamoDB API 端点中断，影响 Slack、Atlassian、Snapchat、Reddit、Roblox、Fortnite、Coinbase、Venmo、Duolingo、Canva、PlayStation Network、银行、航空公司（如 Delta、United 航班延误）和 Amazon 服务；超 3500 家公司、60+ 国家受影响，用户报告超 1700 万次。&lt;/td&gt;
      &lt;td&gt;DNS 解析故障引发连锁反应。&lt;/td&gt;
      &lt;td&gt;2025 年最大故障，称为“云脆弱性大暴露”；行业评价为 DNS 和控制平面依赖的重大教训，强调多云策略。&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;分析比较严重的事故&quot;&gt;分析比较严重的事故&lt;/h3&gt;
&lt;p&gt;在 2014-2025 年间，AWS 经历了多次故障，其中最严重的几起包括 2015-09-20 的 DynamoDB 故障、2017-02-28 的 S3 故障，以及 2025-10-19/20 的 DynamoDB DNS 故障。这些事件均发生在 us-east-1 区域，该区域作为 AWS 最古老和最繁忙的中心，常因内部依赖和规模效应成为故障高发地。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;严重程度比较&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;2015 DynamoDB 故障&lt;/strong&gt;：持续数小时，影响 Netflix、Reddit 等娱乐和社交平台，导致用户无法访问内容。后果主要是娱乐中断，但未波及金融或交通。根因是内部通信失败，暴露了服务间连锁风险。行业评价为 AWS 早期架构依赖的典型问题，推动了后续的多区域冗余改进。&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;2017 S3 故障&lt;/strong&gt;：持续 4-5 小时，由人为错误（打字错误）引发，影响 Slack、Trello 等生产力工具和数百万网站的文件托管。经济损失巨大，估计数亿美元。相比 2015 年，此次更强调人为因素，促使 AWS 加强自动化和错误检查机制。&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;2025 DynamoDB DNS 故障&lt;/strong&gt;：持续 15+ 小时，是三者中最长，影响范围最广，波及 3500+ 公司，包括金融（Coinbase、Venmo）、游戏（Fortnite、Roblox）、教育（Duolingo）和交通（航空延误）。用户报告超 1700 万次，全球 60+ 国家中断。根因是 DNS 解析问题，凸显控制平面脆弱性。相比前两次，此次后果更严重，涉及关键基础设施，行业评价为“云时代最大中断”，呼吁企业采用多云或混合云策略以分散风险。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;总体而言，这些严重故障的共同点是 us-east-1 的中心化问题和连锁反应，严重度随时间推移而增加（从数小时到 15+ 小时，从娱乐到关键服务），反映了互联网对云依赖的加深。AWS 通过 PES 报告持续改进，但行业建议企业避免单区域依赖，实现真正的高可用架构。&lt;/p&gt;

&lt;h2 id=&quot;阿里云的故障&quot;&gt;阿里云的故障&lt;/h2&gt;

&lt;p&gt;阿里云自2014年至2025年期间，公开报道和官方披露的&lt;strong&gt;真正影响面广、持续时间长、被广泛称为“重大事故”&lt;/strong&gt;的故障并不算特别多（相比体量来说，整体SLA表现仍属行业前列），但其中几次确实造成了较大社会影响和行业讨论。下面按时间顺序列出公认的几次&lt;strong&gt;重大级别故障&lt;/strong&gt;（主要基于公开信息、官方公告、媒体和社区复盘）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;
      &lt;th&gt;地域/范围&lt;/th&gt;
      &lt;th&gt;持续时长&lt;/th&gt;
      &lt;th&gt;主要影响范围与后果&lt;/th&gt;
      &lt;th&gt;官方/主流原因说明&lt;/th&gt;
      &lt;th&gt;备注 / 行业评价&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年6月&lt;/td&gt;
      &lt;td&gt;部分地域（具体未公开细节）&lt;/td&gt;
      &lt;td&gt;约30分钟&lt;/td&gt;
      &lt;td&gt;部分云产品出现异常，影响范围相对有限&lt;/td&gt;
      &lt;td&gt;未详细公开&lt;/td&gt;
      &lt;td&gt;当时被部分媒体称为“重大技术故障”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2019年3月3日&lt;/td&gt;
      &lt;td&gt;华北2（北京）可用区C&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;大量ECS实例磁盘故障，众多网站/App瘫痪&lt;/td&gt;
      &lt;td&gt;磁盘故障&lt;/td&gt;
      &lt;td&gt;当时影响较大，阿里云按SLA赔付&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022年12月18日&lt;/td&gt;
      &lt;td&gt;香港Region 可用区C&lt;/td&gt;
      &lt;td&gt;约15.5小时&lt;/td&gt;
      &lt;td&gt;香港区几乎全地域服务中断，澳门多家关键机构网站（金融管理局、银河、莲花卫视等）不可用，OKX交易受影响&lt;/td&gt;
      &lt;td&gt;制冷设备故障 → 连锁反应导致大面积宕机&lt;/td&gt;
      &lt;td&gt;被广泛称为“阿里云发展史上最严重丑闻之一”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年11月12日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球所有地域、所有服务&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;约3小时16分钟&lt;/td&gt;
      &lt;td&gt;控制台、API、MQ、微服务、监控、机器学习等几乎全线产品异常；淘宝、钉钉、闲鱼、饿了么、阿里云盘等集体“崩”&lt;/td&gt;
      &lt;td&gt;底层核心组件（鉴权/元数据/控制面组件）故障&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;公认阿里云史上最严重、影响范围最广的一次&lt;/strong&gt;，被称为“史诗级”“行业闻所未闻”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年11月27日&lt;/td&gt;
      &lt;td&gt;部分服务器&lt;/td&gt;
      &lt;td&gt;近2小时&lt;/td&gt;
      &lt;td&gt;服务器访问异常&lt;/td&gt;
      &lt;td&gt;未详细披露&lt;/td&gt;
      &lt;td&gt;距离11·12事故仅半个月，再次引发信任质疑&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年7月2日&lt;/td&gt;
      &lt;td&gt;部分地域/服务&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;控制台及部分服务异常&lt;/td&gt;
      &lt;td&gt;未见详细复盘&lt;/td&gt;
      &lt;td&gt;属于中型故障，影响面小于前几次&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年（具体日期不详）&lt;/td&gt;
      &lt;td&gt;全球范围（疑似域名相关）&lt;/td&gt;
      &lt;td&gt;约6小时&lt;/td&gt;
      &lt;td&gt;域名劫持导致全球服务异常&lt;/td&gt;
      &lt;td&gt;域名劫持相关&lt;/td&gt;
      &lt;td&gt;来自2025年公有云故障汇总报告，细节待确认&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;重要说明与趋势观察&quot;&gt;重要说明与趋势观察&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2014–2018早期&lt;/strong&gt;：这个阶段阿里云对外公开的重大P0级故障记录极少，更多是局部、小范围问题。那时体量远小于现在，故障影响面也较小。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;最严重的两次&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;2022.12香港区15.5小时&lt;/strong&gt; → 单地域最长时间故障，对港澳地区关键基础设施影响恶劣。&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;2023.11.12全球3小时+&lt;/strong&gt; → 控制面/全局服务全部瘫痪，被公认为云计算历史上罕见的“全地域×全服务”同时故障，打破了阿里云长期标榜的“多活、多中心、N个9”神话。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;：从已知信息看，故障频次和严重程度相比2022–2023有所下降，但仍然偶有中大型事件（尤其是2025年的域名劫持类事件影响面较广）。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;阿里云的处理特点&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;大部分重大故障后都会发详细复盘说明（尤其是2022香港、2023全球两次）&lt;/li&gt;
      &lt;li&gt;按SLA赔付（通常是故障时长对应倍数的代金券）&lt;/li&gt;
      &lt;li&gt;高管/官方会公开致歉&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;总体而言，阿里云在2014–2025这十二年间真正称得上“重大事故”的次数大约在&lt;strong&gt;5–7次&lt;/strong&gt;左右，其中&lt;strong&gt;2023年11月12日&lt;/strong&gt;和&lt;strong&gt;2022年12月香港&lt;/strong&gt;是公认的影响力和严重程度最高的两起。&lt;/p&gt;

&lt;h2 id=&quot;谷歌云的故障&quot;&gt;谷歌云的故障&lt;/h2&gt;

&lt;p&gt;谷歌云（Google Cloud Platform，简称GCP）从2014年到2025年这段时间内，整体SLA表现相对较好，真正影响&lt;strong&gt;全球范围&lt;/strong&gt;或&lt;strong&gt;多个核心服务&lt;/strong&gt;的&lt;strong&gt;重大事故&lt;/strong&gt;并不算特别频繁（比AWS和Azure略少一些全局性灾难级事件）。但一旦出问题，通常会波及大量第三方应用（如Snapchat、Spotify、Discord、Cloudflare依赖的服务等），社会影响较大。&lt;/p&gt;

&lt;p&gt;下面按时间顺序列出公认的&lt;strong&gt;比较严重的、影响面广&lt;/strong&gt;的GCP重大故障（基于公开Status Dashboard、媒体报道、Wikipedia、行业复盘等信息）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;
      &lt;th&gt;地域/范围&lt;/th&gt;
      &lt;th&gt;持续时长&lt;/th&gt;
      &lt;th&gt;主要影响范围与后果&lt;/th&gt;
      &lt;th&gt;主流原因说明&lt;/th&gt;
      &lt;th&gt;备注 / 行业评价&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2015年8月&lt;/td&gt;
      &lt;td&gt;欧洲（比利时Ghlin）&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;Compute Engine 读写错误率极高，少量数据丢失&lt;/td&gt;
      &lt;td&gt;雷击导致数据中心部分设备损坏&lt;/td&gt;
      &lt;td&gt;谷歌罕见承认&lt;strong&gt;数据丢失&lt;/strong&gt;，影响较小客户群&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年7月&lt;/td&gt;
      &lt;td&gt;全球（多地域）&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;GCP多服务异常，Snapchat、Spotify等第三方应用大面积无法登录/使用&lt;/td&gt;
      &lt;td&gt;网络拥塞 + 内部路由问题&lt;/td&gt;
      &lt;td&gt;当时被广泛报道，第三方影响很明显&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2019年6月2日&lt;/td&gt;
      &lt;td&gt;美国东部 + 全球波及&lt;/td&gt;
      &lt;td&gt;约4–5小时&lt;/td&gt;
      &lt;td&gt;YouTube、Gmail、G Suite大面积不可用，Snapchat、Discord、Vimeo等登录失败&lt;/td&gt;
      &lt;td&gt;美国东部网络拥塞 + 级联故障&lt;/td&gt;
      &lt;td&gt;影响范围广，社交媒体热议&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020年12月14日&lt;/td&gt;
      &lt;td&gt;全球&lt;/td&gt;
      &lt;td&gt;约1小时&lt;/td&gt;
      &lt;td&gt;Gmail、YouTube、Google Home、Nest、Pokémon GO等几乎所有依赖身份验证的服务瘫痪&lt;/td&gt;
      &lt;td&gt;身份认证系统（类似IAM）全局故障&lt;/td&gt;
      &lt;td&gt;谷歌消费级服务集体“崩”，影响最大的一次之一&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022年8月&lt;/td&gt;
      &lt;td&gt;美国爱荷华州数据中心&lt;/td&gt;
      &lt;td&gt;局部影响&lt;/td&gt;
      &lt;td&gt;电气火灾（3人受伤），部分服务受波及，但非全局&lt;/td&gt;
      &lt;td&gt;数据中心电气事故引发火灾&lt;/td&gt;
      &lt;td&gt;更多是物理设施事故，非纯软件/架构问题&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年4月&lt;/td&gt;
      &lt;td&gt;欧洲（巴黎等）&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;多地域网络 + 服务中断，部分客户受影响&lt;/td&gt;
      &lt;td&gt;洪水 + 数据中心问题 + 网络故障组合&lt;/td&gt;
      &lt;td&gt;天气因素导致，影响面中等&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年10月23日&lt;/td&gt;
      &lt;td&gt;欧洲（德国法兰克福 europe-west3）&lt;/td&gt;
      &lt;td&gt;约半天（12+小时）&lt;/td&gt;
      &lt;td&gt;该地域几乎全服务不可用，影响大量欧洲客户&lt;/td&gt;
      &lt;td&gt;未详细公开（疑似控制面/网络问题）&lt;/td&gt;
      &lt;td&gt;单地域最长时长故障之一&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年6月12日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;（多地域，40+个）&lt;/td&gt;
      &lt;td&gt;约2.5–3小时&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;70+项GCP服务&lt;/strong&gt;异常，IAM身份授权系统崩溃，导致API请求全面失败；Spotify、Discord、Twitch、Cloudflare、Fitbit、Gmail、Drive、YouTube等大面积瘫痪&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Service Control&lt;/strong&gt;（API鉴权核心组件）自动化更新引入严重bug → 崩溃循环 → 全局过载&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;公认2020年后GCP最严重的一次全局故障&lt;/strong&gt;，影响互联网大片区域&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年7月18日&lt;/td&gt;
      &lt;td&gt;us-east1&lt;/td&gt;
      &lt;td&gt;约2小时&lt;/td&gt;
      &lt;td&gt;多产品错误率升高&lt;/td&gt;
      &lt;td&gt;未详细披露&lt;/td&gt;
      &lt;td&gt;中型故障，恢复较快&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;azure的故障&quot;&gt;Azure的故障&lt;/h2&gt;

&lt;p&gt;Microsoft Azure（微软云平台）从2014年到2025年这段时间内，&lt;strong&gt;真正影响面广、持续时间长、社会关注度高的重大事故&lt;/strong&gt;数量不算特别多（相比早期体量较小时的频繁小故障已显著减少），但几次事件确实造成了全球性或多服务级别的严重影响，尤其涉及&lt;strong&gt;Microsoft 365、Teams、Xbox、Outlook&lt;/strong&gt;等消费级/企业级产品时，传播效应非常明显。&lt;/p&gt;

&lt;p&gt;下面按时间顺序列出公认的&lt;strong&gt;重大级别故障&lt;/strong&gt;（基于Azure官方Status History、Post Incident Reviews、媒体报道、Wikipedia和行业复盘等公开信息）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;
      &lt;th&gt;地域/范围&lt;/th&gt;
      &lt;th&gt;持续时长&lt;/th&gt;
      &lt;th&gt;主要影响范围与后果&lt;/th&gt;
      &lt;th&gt;主流原因说明&lt;/th&gt;
      &lt;th&gt;备注 / 行业评价&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014年8月14–18日&lt;/td&gt;
      &lt;td&gt;US Central、US East、US East 2、Europe North&lt;/td&gt;
      &lt;td&gt;多日多次，单次数小时&lt;/td&gt;
      &lt;td&gt;Cloud Services、SQL Database、VM、Websites、HDInsight、Mobile Services、Service Bus等大面积不可用&lt;/td&gt;
      &lt;td&gt;多起网络/存储问题叠加&lt;/td&gt;
      &lt;td&gt;2014年最集中的一波故障，当时Azure还较年轻&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014年11月18–19日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;多地域&lt;/strong&gt;（美、欧、亚部分）&lt;/td&gt;
      &lt;td&gt;约11小时&lt;/td&gt;
      &lt;td&gt;Azure Storage为核心，引发VM、Websites、Visual Studio Online、Xbox Live、MSN、Search等20+服务中断&lt;/td&gt;
      &lt;td&gt;存储性能优化配置变更导致Blob前端无限循环&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Azure早期最严重的一次&lt;/strong&gt;，官方详细RCA，赔付客户&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2016年9月15日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;DNS解析大面积故障，影响大量依赖Azure DNS的服务&lt;/td&gt;
      &lt;td&gt;全球DNS问题&lt;/td&gt;
      &lt;td&gt;暴露DNS单点风险&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年6月20日&lt;/td&gt;
      &lt;td&gt;北美多个数据中心&lt;/td&gt;
      &lt;td&gt;数小时–1天+&lt;/td&gt;
      &lt;td&gt;冷却系统故障（雷击+浪涌保护不足）导致多服务中断&lt;/td&gt;
      &lt;td&gt;物理设施问题（雷击引发连锁反应）&lt;/td&gt;
      &lt;td&gt;罕见的硬件+基础设施类大故障&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年9月4日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;多地域&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;超过25小时（部分服务3天）&lt;/td&gt;
      &lt;td&gt;多项核心服务长时间不可用&lt;/td&gt;
      &lt;td&gt;冷却系统故障（雷击+浪涌保护不足）&lt;/td&gt;
      &lt;td&gt;恢复时间最长的一次之一&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年1月23日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;（核心网络受影响）&lt;/td&gt;
      &lt;td&gt;约3小时&lt;/td&gt;
      &lt;td&gt;Microsoft 365（Teams、Outlook、Exchange）、部分Azure服务中断&lt;/td&gt;
      &lt;td&gt;广域网（WAN）问题&lt;/td&gt;
      &lt;td&gt;M365集体“崩”，影响巨大&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年7月18日&lt;/td&gt;
      &lt;td&gt;US Central&lt;/td&gt;
      &lt;td&gt;约半天&lt;/td&gt;
      &lt;td&gt;Virtual Machines等服务管理操作失败，客户无法访问托管服务&lt;/td&gt;
      &lt;td&gt;访问控制错误 + 基础设施故障&lt;/td&gt;
      &lt;td&gt;与次日CrowdStrike全球蓝屏事件时间接近，但独立&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年1月8–9日&lt;/td&gt;
      &lt;td&gt;East US 2 等&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;Azure Databricks、Synapse、Functions、App Service、VM等网络中断&lt;/td&gt;
      &lt;td&gt;网络组件问题&lt;/td&gt;
      &lt;td&gt;2025年初较显著的一次&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月29日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;约8小时&lt;/td&gt;
      &lt;td&gt;Azure Front Door为核心，引发Microsoft 365、Outlook、Teams、Xbox Live、Minecraft、Copilot大面积瘫痪；第三方如Alaska Airlines、Heathrow机场、Costco、Starbucks等受波及&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Azure Front Door配置变更&lt;/strong&gt; + 防护机制bug导致配置不一致全局传播&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2025年Azure最严重的一次&lt;/strong&gt;，Downdetector超3万报告，类似AWS同月故障&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年11月5–6日&lt;/td&gt;
      &lt;td&gt;West Europe (AZ01)&lt;/td&gt;
      &lt;td&gt;约9–10小时&lt;/td&gt;
      &lt;td&gt;VM、PostgreSQL/MySQL Flexible Server、AKS、Storage、Service Bus等多服务降级/中断&lt;/td&gt;
      &lt;td&gt;数据中心热事件（Thermal event）&lt;/td&gt;
      &lt;td&gt;区域级较严重故障&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;重要观察与趋势20142025&quot;&gt;重要观察与趋势（2014–2025）&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014年&lt;/strong&gt;：Azure还处于快速扩张期，&lt;strong&gt;配置变更&lt;/strong&gt;和&lt;strong&gt;存储层&lt;/strong&gt;问题频发，是故障最集中的一年（尤其是11月那次被视为经典案例）。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2015–2019&lt;/strong&gt;：故障频率下降，但仍以&lt;strong&gt;单地域&lt;/strong&gt;或&lt;strong&gt;基础设施&lt;/strong&gt;（冷却、雷击、DNS）为主，影响面相对可控。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2020–2023&lt;/strong&gt;：重大全局故障较少，更多是&lt;strong&gt;网络&lt;/strong&gt;或&lt;strong&gt;M365依赖Azure&lt;/strong&gt;导致的间接影响（如2023年1月）。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;：控制面/边缘服务（如&lt;strong&gt;Azure Front Door&lt;/strong&gt;）成为新痛点，2025年10月29日事件被公认为近几年Azure最严重的&lt;strong&gt;全球性中断&lt;/strong&gt;，影响范围堪比阿里云2023年11月或谷歌云2025年6月的事件。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;典型特点&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;微软每次重大事故后都会发布详细&lt;strong&gt;Post Incident Review (PIR)&lt;/strong&gt;（官方复盘），透明度较高。&lt;/li&gt;
      &lt;li&gt;经常因&lt;strong&gt;配置变更&lt;/strong&gt;、&lt;strong&gt;控制平面组件&lt;/strong&gt;、&lt;strong&gt;网络&lt;/strong&gt;问题引发（而非底层硬件故障）。&lt;/li&gt;
      &lt;li&gt;第三方传播效应极强：一旦M365、Xbox、Teams出问题，社会关注度瞬间拉满。&lt;/li&gt;
      &lt;li&gt;按SLA赔付（信用额度形式），但客户更在意业务连续性。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;总体而言，Azure在2014–2025这12年间真正达到&lt;strong&gt;重大级别（全球/多服务长时间中断）&lt;/strong&gt;的故障大约&lt;strong&gt;8–10次&lt;/strong&gt;，严重程度和频率与AWS、GCP处于同一量级，但&lt;strong&gt;配置错误导致的级联故障&lt;/strong&gt;是Azure历史上反复出现的模式。&lt;/p&gt;

&lt;h2 id=&quot;cloudflare的故障&quot;&gt;Cloudflare的故障&lt;/h2&gt;

&lt;p&gt;Cloudflare（Cloudflare）作为全球最大的CDN、安全、DNS和边缘计算提供商之一，从2014年到2025年期间，&lt;strong&gt;真正影响面广、造成互联网大面积瘫痪的重大事故&lt;/strong&gt;并不算特别多，但一旦发生，通常会波及&lt;strong&gt;数百万到数亿用户&lt;/strong&gt;，影响范围极广（因为Cloudflare承载了全球约20–25%的网页流量）。&lt;/p&gt;

&lt;p&gt;Cloudflare的故障特点是：&lt;strong&gt;恢复速度通常较快&lt;/strong&gt;（大部分在1–4小时内缓解），但&lt;strong&gt;传播效应极强&lt;/strong&gt;——一旦核心代理层、DNS或安全组件出问题，很多顶级网站（X、ChatGPT、Shopify、Discord、Spotify、AWS部分服务等）会同时出现5xx错误或无法访问。&lt;/p&gt;

&lt;p&gt;下面按时间顺序列出公认的&lt;strong&gt;重大级别故障&lt;/strong&gt;（基于Cloudflare官方博客、status.cloudflare.com历史、媒体报道、Wikipedia和行业复盘，重点筛选全球/核心流量中断事件）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;
      &lt;th&gt;范围&lt;/th&gt;
      &lt;th&gt;持续时长&lt;/th&gt;
      &lt;th&gt;主要影响范围与后果&lt;/th&gt;
      &lt;th&gt;主流原因说明&lt;/th&gt;
      &lt;th&gt;备注 / 行业评价&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2019年7月2日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;约1–2小时&lt;/td&gt;
      &lt;td&gt;大量网站出现502/503/504错误，互联网大片区域无法访问&lt;/td&gt;
      &lt;td&gt;软件部署引入严重bug，导致代理层崩溃&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Cloudflare公认史上最严重的一次&lt;/strong&gt;，官方详细复盘&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020年多次&lt;/td&gt;
      &lt;td&gt;部分地域/控制面&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;仪表盘、分析、部分API不可用；核心代理层基本稳定&lt;/td&gt;
      &lt;td&gt;控制平面组件问题&lt;/td&gt;
      &lt;td&gt;影响开发者较多，普通用户感知较小&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022年6月&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;多数据中心&lt;/strong&gt;（19个）&lt;/td&gt;
      &lt;td&gt;约1.5小时&lt;/td&gt;
      &lt;td&gt;核心代理层中断，多个网站无法访问&lt;/td&gt;
      &lt;td&gt;网络配置错误&lt;/td&gt;
      &lt;td&gt;中等规模，恢复较快&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年3月21日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;约1小时7分钟&lt;/td&gt;
      &lt;td&gt;存储读写严重故障，影响大量依赖Cloudflare存储/缓存的服务&lt;/td&gt;
      &lt;td&gt;KV/存储层写失败 + 部分读异常&lt;/td&gt;
      &lt;td&gt;2025年早期较显著的一次&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年6月12日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;（部分新功能）&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;部分新功能/服务不可用，核心流量基本正常&lt;/td&gt;
      &lt;td&gt;特定模块部署问题&lt;/td&gt;
      &lt;td&gt;非核心流量中断，影响有限&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年7月14日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;（1.1.1.1 DNS）&lt;/td&gt;
      &lt;td&gt;约62分钟&lt;/td&gt;
      &lt;td&gt;公共DNS解析器（1.1.1.1）完全不可用，大量用户无法上网&lt;/td&gt;
      &lt;td&gt;配置错误导致BGP路由撤回，DNS前缀从全球路由表消失&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;对依赖1.1.1.1的用户影响极大&lt;/strong&gt;，堪称“断网级”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月左右&lt;/td&gt;
      &lt;td&gt;部分服务&lt;/td&gt;
      &lt;td&gt;数十到几十分钟&lt;/td&gt;
      &lt;td&gt;DNS解析短暂中断&lt;/td&gt;
      &lt;td&gt;DNS相关配置问题&lt;/td&gt;
      &lt;td&gt;中型故障&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年11月18日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;约4–5小时（高峰期更长）&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;大规模互联网中断&lt;/strong&gt;：X（Twitter）、ChatGPT、Shopify、Spotify、Letterboxd、Indeed、Canva、Uber、DoorDash、Truth Social、League of Legends等大量顶级服务瘫痪；约20%网页流量受影响，1/3 Alexa前1万网站受波及&lt;/td&gt;
      &lt;td&gt;Bot Management特征文件异常膨胀（数据库权限变更导致文件大小翻倍）→ 全网传播 → 代理层崩溃&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2025年最严重的一次&lt;/strong&gt;，也是2019年后Cloudflare最严重的全局流量中断&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年12月5日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;数小时&lt;/td&gt;
      &lt;td&gt;再次出现大范围5xx错误，Shopify、Zoom、Vinted、Fortnite、Square、Just Eat、Canva、Vimeo、AWS部分服务、Deliveroo等受影响&lt;/td&gt;
      &lt;td&gt;未见完整官方根因（疑似配置/传播类问题）&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;距离11月18日仅17天&lt;/strong&gt;，连续两次重大事故引发强烈质疑&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;重要观察与趋势20142025-1&quot;&gt;重要观察与趋势（2014–2025）&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014–2018早期&lt;/strong&gt;：Cloudflare体量快速增长，但公开的&lt;strong&gt;全局重大故障&lt;/strong&gt;记录很少，主要是一些局部、地域性或功能性问题。那时互联网对Cloudflare的依赖度远低于现在。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2019年7月&lt;/strong&gt;：成为Cloudflare历史上最经典的“黑天鹅”事件，此后6年多时间里再未出现同等规模的&lt;strong&gt;核心代理层全局中断&lt;/strong&gt;。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025年成为异常年份&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;出现了至少&lt;strong&gt;3–4次&lt;/strong&gt;影响面较大的全球/近全球事件（尤其是11月18日和12月5日连续两次）。&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;11月18日&lt;/strong&gt; 被公认为&lt;strong&gt;2019年后最严重的一次&lt;/strong&gt;，影响范围和深度都极高。&lt;/li&gt;
      &lt;li&gt;12月5日再次中断，让很多人质疑Cloudflare的变更控制、回滚机制和“fail small”原则执行情况。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;典型特点&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;大部分严重故障都与&lt;strong&gt;配置变更&lt;/strong&gt;、&lt;strong&gt;特征文件/规则传播&lt;/strong&gt;、&lt;strong&gt;控制面组件&lt;/strong&gt;或&lt;strong&gt;DNS/BGP&lt;/strong&gt;相关。&lt;/li&gt;
      &lt;li&gt;官方复盘非常透明：每次重大事故后都会在blog.cloudflare.com发布详细post-mortem（根因、时间线、改进措施）。&lt;/li&gt;
      &lt;li&gt;恢复速度通常较快（回滚 + 停止传播），但影响传播极广（因为Cloudflare的Anycast网络和安全挑战机制）。&lt;/li&gt;
      &lt;li&gt;不像AWS/Azure/Google那样有明确的SLA信用赔付，但会提供详细解释和改进承诺。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;总体而言，Cloudflare在2014–2025这12年间真正达到&lt;strong&gt;重大级别（全球核心流量长时间中断）&lt;/strong&gt;的故障大约&lt;strong&gt;5–7次&lt;/strong&gt;，其中&lt;strong&gt;2019年7月&lt;/strong&gt;和&lt;strong&gt;2025年11月18日&lt;/strong&gt;是公认的两个峰值事件。2025年故障频次明显上升，引发了行业对“互联网基础设施集中化风险”的新一轮讨论。&lt;/p&gt;

&lt;h2 id=&quot;腾讯云的故障&quot;&gt;腾讯云的故障&lt;/h2&gt;

&lt;p&gt;腾讯云（Tencent Cloud）从2014年到2025年期间，作为中国第二大公有云厂商（仅次于阿里云），整体稳定性在国内云厂商中属于中上水平，真正&lt;strong&gt;影响面极广、持续时间长、社会关注度高的全局/多地域重大事故&lt;/strong&gt;数量相对较少，但一旦出现控制面（管控台/API）或核心存储问题，影响会迅速放大到大量企业和开发者。&lt;/p&gt;

&lt;p&gt;腾讯云的&lt;strong&gt;status页面&lt;/strong&gt;（https://status.cloud.tencent.com/history）公开透明度相对较低，历史事件列表通常只展示最近1年，且很多中大型故障不会出现在公开列表中，主要靠官方微信公众号、技术博客、媒体报道和社区讨论拼凑完整图景。&lt;/p&gt;

&lt;p&gt;下面按时间顺序列出公认的&lt;strong&gt;比较严重的、影响面较广&lt;/strong&gt;的腾讯云故障事件（基于官方复盘、媒体报道、知乎/微博/开发者社区讨论等公开信息）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;
      &lt;th&gt;地域/范围&lt;/th&gt;
      &lt;th&gt;持续时长&lt;/th&gt;
      &lt;th&gt;主要影响范围与后果&lt;/th&gt;
      &lt;th&gt;主流原因说明&lt;/th&gt;
      &lt;th&gt;备注 / 行业评价&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014年11月2日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全国&lt;/strong&gt;（管控面+部分服务）&lt;/td&gt;
      &lt;td&gt;约6分钟&lt;/td&gt;
      &lt;td&gt;腾讯云官网访问慢、图片加载失败、控制台异常，部分用户无法正常使用&lt;/td&gt;
      &lt;td&gt;未详细公开（疑似网络/负载问题）&lt;/td&gt;
      &lt;td&gt;早期小体量时期，影响有限，但被当时媒体广泛报道&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年8月&lt;/td&gt;
      &lt;td&gt;部分用户/云硬盘&lt;/td&gt;
      &lt;td&gt;不确定（单用户影响数小时至永久）&lt;/td&gt;
      &lt;td&gt;多位用户云服务器磁盘数据&lt;strong&gt;清零/丢失&lt;/strong&gt;，涉及千万元级别损失&lt;/td&gt;
      &lt;td&gt;磁盘静默错误 + 数据迁移过程中校验/副本机制失效&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;腾讯云历史上最严重的“丢数据”事件&lt;/strong&gt;，引发云安全信任危机，官方发详细复盘&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年（零星报道）&lt;/td&gt;
      &lt;td&gt;部分地域/服务&lt;/td&gt;
      &lt;td&gt;数十分钟–数小时&lt;/td&gt;
      &lt;td&gt;零星控制台/API异常、存储访问抖动&lt;/td&gt;
      &lt;td&gt;未见公开详细复盘&lt;/td&gt;
      &lt;td&gt;相比阿里云同年11月全球事故，腾讯云这一年相对平稳&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年4月8日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球17个地域&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;约74–87分钟&lt;/td&gt;
      &lt;td&gt;控制台完全无法登录、云API全面报错（504 Gateway Timeout）、CVM/RDS等实例正常运行但无法管理/续费/扩容等操作；1957个客户报障&lt;/td&gt;
      &lt;td&gt;云API新版本向前兼容性不足 + 配置数据灰度机制缺失 → 全量发布导致全局传播&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;腾讯云近年来最严重的一次&lt;/strong&gt;，被广泛称为“全球大故障”“管控面崩盘”，类似阿里云2023年11月风格&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月15日&lt;/td&gt;
      &lt;td&gt;多地域&lt;/td&gt;
      &lt;td&gt;约数十分钟–1小时&lt;/td&gt;
      &lt;td&gt;弹性伸缩（Auto Scaling）等服务异常&lt;/td&gt;
      &lt;td&gt;未详细公开&lt;/td&gt;
      &lt;td&gt;来自status页面，属于中型故障&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月17日&lt;/td&gt;
      &lt;td&gt;广州地域&lt;/td&gt;
      &lt;td&gt;约1小时多&lt;/td&gt;
      &lt;td&gt;智能数智人相关服务异常&lt;/td&gt;
      &lt;td&gt;未详细公开&lt;/td&gt;
      &lt;td&gt;区域级，影响特定AI/数字人产品&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;重要观察与趋势20142025-2&quot;&gt;重要观察与趋势（2014–2025）&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;早期（2014–2018）&lt;/strong&gt;：故障多为&lt;strong&gt;存储层数据丢失&lt;/strong&gt;或&lt;strong&gt;短时访问异常&lt;/strong&gt;，典型如2018年“丢数据”事件对企业信任打击最大。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2019–2023&lt;/strong&gt;：腾讯云故障频次和严重度明显下降，鲜有全国/全球级事件，稳定性优于阿里云同期（尤其是2023年阿里云11·12史诗级故障时腾讯云表现平稳）。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;：2024年4月8日成为转折点，这次&lt;strong&gt;管控面全局故障&lt;/strong&gt;让很多人重新审视腾讯云的“变更安全”和“灰度发布”能力。2025年出现几次中型事件，但未见类似2024年4月或阿里云/谷歌云那种“全服务瘫痪”级别。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;典型特点&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;控制面/API问题&lt;/strong&gt;是近年最主要痛点（2024年4月事件典型代表）。&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;存储/数据丢失&lt;/strong&gt;类事故对企业杀伤力最大（2018年案例）。&lt;/li&gt;
      &lt;li&gt;腾讯云官方复盘相对及时（尤其是重大事件会在公众号、技术社区发详细说明）。&lt;/li&gt;
      &lt;li&gt;没有像AWS/Azure/Google那样严格的SLA信用赔付机制，但会提供代金券/补偿。&lt;/li&gt;
      &lt;li&gt;故障传播效应不如阿里云、Cloudflare那么剧烈（因为腾讯云客户结构更偏企业/游戏/视频，对消费互联网依赖相对低）。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;总体而言，腾讯云在2014–2025这12年间真正称得上&lt;strong&gt;重大级别（全国/全球管控面长时间不可用或严重数据丢失）&lt;/strong&gt;的故障大约&lt;strong&gt;3–5次&lt;/strong&gt;，其中&lt;strong&gt;2018年丢数据&lt;/strong&gt;和&lt;strong&gt;2024年4月8日全球管控面故障&lt;/strong&gt;是公认影响力和讨论度最高的两起。&lt;/p&gt;

&lt;h2 id=&quot;故障透明度&quot;&gt;故障透明度&lt;/h2&gt;

&lt;p&gt;就故障透明度而言，阿里云和腾讯云是比较薄弱的。
阿里云的健康看板（https://status.aliyun.com/#/?region=cn-shanghai）和腾讯云的健康看板（https://status.cloud.tencent.com/history）只显示了过去1年发生过的历史事件。&lt;/p&gt;

&lt;p&gt;Azure（https://azure.status.microsoft/en-us/status/history/）保留了5年，cloudflare（https://www.cloudflarestatus.com/history?page=17）最详细透明，可以使用page一直翻页到前面几年的事故。&lt;/p&gt;

&lt;h2 id=&quot;公有云死因&quot;&gt;公有云“死因”&lt;/h2&gt;

&lt;p&gt;在我年轻的时候，我热衷于查阅并重构别人的代码。直到Java Boy给了我上了一课：
即便我帮他修复了内存泄露的问题，他感受到的是一种来自内心深处的存在主义危机。他以愤怒作为掩盖自己无能的藉口，把“维持kubernetes平台稳定”的罪责推到我身上。&lt;/p&gt;

&lt;p&gt;其实我也不是很乐意帮他擦屁股。我只是觉得频繁出现的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OOM kill&lt;/code&gt; event 报警让我很烦躁而已。从这个故事中，我领悟了0的哲学：&lt;strong&gt;边际收益为0的重构没人愿意做&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;因此便能推导得出软件行业的&lt;strong&gt;熵增定律&lt;/strong&gt;：项目代码库会随着时间推移而变成一座屎山。&lt;/p&gt;

&lt;p&gt;有人问，这跟公有云的死因有什么关系呢？&lt;/p&gt;

&lt;p&gt;实际上是非常有关系的。因为“工业克苏鲁”要求企业贡献随时间递增的利润。因此对于公有云厂商，对于他们的基层员工而言，就必须“讲一种新的增长故事”，比如现在是2026年，就以AI作为新的增长极。&lt;/p&gt;

&lt;p&gt;而旧的的代码就一直烂在那里。因为修改他们没有任何边际收益。&lt;/p&gt;

&lt;p&gt;于是大家就逐渐形成这种共识：不修改别人的代码，任由它成为一座屎山。代码如此，架构亦如此。即便网络拓扑成为纯粹的相互依赖的网状结构，反正出事的时候大家都用不了，当宕机责任被平等分摊，自己便没有责任。&lt;/p&gt;

&lt;p&gt;讽刺的是，一个在职期间0故障发生，天天上班睡觉的运维工程师，会被认为是一个不称职的人。因为他看起来啥事都没做。然而反直觉的是，这种人其实应该当成企业的吉祥物供起来，因为你根本不知道他之前为了公司的业务稳定付出了多少努力。或者说他纯粹是命好，配享大庙。&lt;/p&gt;

&lt;p&gt;实际上，最好的运维在于不运维。因为&lt;strong&gt;运维收入与职业风险完全不对等&lt;/strong&gt;。上级不会因为你删除了一个看起来没用的配置，而在这个月多给你发一笔补贴；但你会因为删除了一个有用的数据库配置，而遭到客户的辱骂。&lt;/p&gt;

&lt;p&gt;公有云企业忘了，网络效应可以把他们扶起来，也可以把他们重重地摔下去。当他们的客户越多，单次宕机而产生的网络连锁反应就会越大。就好比2025年12月4日晚约21:00–23:37的支付宝故障，这已经是阿里系在2025年的第六次大故障。&lt;/p&gt;

&lt;p&gt;当用户规模以亿作为计算单位，每一秒都有人在支付。然而业务又要求往软件上继续加新的功能，最后整个系统不堪重负。&lt;/p&gt;

&lt;p&gt;而且公有云服务厂商赔付完全不对等。像支付宝这种最多就是多退少补，少收用户的钱当做福利。但政企的损失则完全无法估算。如果业务寄宿在公有云上，而公有云宕机了，那么作为业务方的你，要怎么向公有云介绍自己的损失呢？&lt;/p&gt;

&lt;p&gt;“我的系统每天交易几百个亿，你赔我几个亿？”&lt;/p&gt;

&lt;p&gt;客户的损失无法量化，因此阿里云通常都是赔点代金券。但这完全是杯水车薪。损失的时间，谁也无法说清楚实际的业务影响和时间价值。&lt;/p&gt;

&lt;p&gt;网络效应带来了公有云指数级别的收入增长。但作为大型政企用户而言，对公有云反依赖应该提上日程。把自己的命运跟单一的云厂商绑定，无法应对突发的风险。&lt;/p&gt;

&lt;h2 id=&quot;小并发高可用系统&quot;&gt;小并发高可用系统&lt;/h2&gt;

&lt;p&gt;在此基础上，我提出我的“小并发高可用系统”概念。我的初步设想是通过存储的冗余，实现业务的高可用。
当流量平稳分摊到设计冗余的信息系统，既规避了集中式流量带来的单集群流量洪峰，又减少了问题扩散的半径。&lt;/p&gt;

&lt;p&gt;举个最简单的例子。在DNS解析的时候，把广东的DNS解析设置在一个华南区域的阿里云、腾讯云kubernetes集群。每一个集群互不依赖，运行内部完整的信息业务系统。
这样最坏情况，公有云自身出问题，只会出现50%的不可用。&lt;/p&gt;

&lt;p&gt;同时不可用，概率极小。&lt;/p&gt;

&lt;h2 id=&quot;孤帆远影碧山尽唯见长江天际流&quot;&gt;孤帆远影碧山尽，唯见长江天际流&lt;/h2&gt;

&lt;h2 id=&quot;参考链接&quot;&gt;参考链接&lt;/h2&gt;

&lt;p&gt;【1】
2025 年 11 月 18 日 Cloudflare 服务中断
https://blog.cloudflare.com/zh-cn/18-november-2025-outage/&lt;/p&gt;

&lt;p&gt;【2】
从 AWS 故障看 DNS 的隐形杀伤力：DeepFlow 如何在混乱中快速锁定根因
https://my.oschina.net/u/3681970/blog/18697034&lt;/p&gt;

&lt;p&gt;【3】
2023-11-12阿里云故障复盘与分析
https://github.tiankonguse.com/blog/2023/11/29/aliyun-break.html&lt;/p&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    &lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;This article starts from formal logic and definitions (network effect, law of entropy increase, anti-dependency, and the “zero” philosophy of zero marginal benefit), systematically reviews major outages of mainstream public clouds and infrastructure—Alibaba Cloud, Google Cloud, Azure, Cloudflare, Tencent Cloud—from 2014 to 2025, and compares their fault transparency. On this basis, it analyzes the “causes of death” of public cloud: software entropy and zero marginal benefit make legacy code and architecture hard to govern; network effects amplify cascading failures; and SLA compensation is severely misaligned with actual losses for enterprises and government. The author recommends that large enterprises and government agencies prioritize “anti-dependency” on any single public cloud and proposes a “small-concurrency high-availability system”—reducing single-point risk and blast radius through storage redundancy and traffic distribution (e.g., multi-region, multi-cluster DNS resolution).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/fimbulwinter/fimbulwinter.jpeg&quot; alt=&quot;Fimbulwinter&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;formal-logic-and-definitions&quot;&gt;Formal Logic and Definitions&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Network effect&lt;/strong&gt;: The more users (or participants) a product/service/platform has, the more valuable it becomes to each user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Law of entropy increase&lt;/strong&gt;: A project’s codebase will, over time, turn into a mess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anti-dependency&lt;/strong&gt;: The reverse of depending on a single programming language, tech stack, or cloud platform. Examples: polyglot programming, multi-stack choices, multi-cloud strategy. Anti-dependency lets the business run smoothly without being tied to one language, open-source project, or public cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero&lt;/strong&gt;: Nobody wants to do refactoring whose marginal benefit is zero.&lt;/p&gt;

&lt;h2 id=&quot;aws-outages&quot;&gt;AWS Outages&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Time&lt;/th&gt;
      &lt;th&gt;Region / Scope&lt;/th&gt;
      &lt;th&gt;Duration&lt;/th&gt;
      &lt;th&gt;Main Impact &amp;amp; Consequences&lt;/th&gt;
      &lt;th&gt;Official / Main Cause&lt;/th&gt;
      &lt;th&gt;Notes / Industry Evaluation&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1 (Northern Virginia)&lt;/td&gt;
      &lt;td&gt;Not specified&lt;/td&gt;
      &lt;td&gt;Affected key components of Amazon SimpleDB, some users unable to access or operate databases.&lt;/td&gt;
      &lt;td&gt;Power-related system interruption.&lt;/td&gt;
      &lt;td&gt;Relatively small-scale; quick recovery; highlighted power redundancy issues.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-08-07&lt;/td&gt;
      &lt;td&gt;EU West (Ireland)&lt;/td&gt;
      &lt;td&gt;Not specified&lt;/td&gt;
      &lt;td&gt;Impacted EC2, EBS, and RDS; some European users lost access to instances, storage, and databases.&lt;/td&gt;
      &lt;td&gt;Internal system event (root cause not detailed).&lt;/td&gt;
      &lt;td&gt;Regional impact; showed early limitations in regional isolation.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-11-26&lt;/td&gt;
      &lt;td&gt;Global (CloudFront DNS)&lt;/td&gt;
      &lt;td&gt;~2 hours&lt;/td&gt;
      &lt;td&gt;DNS servers down, affected CDN; many websites and cloud services failed to resolve requests.&lt;/td&gt;
      &lt;td&gt;DNS server failure.&lt;/td&gt;
      &lt;td&gt;Short but broad impact; exposed DNS fragility of the world’s largest cloud.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2015-09-20&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Several hours&lt;/td&gt;
      &lt;td&gt;DynamoDB outage caused internal service communication failure; affected Netflix, Reddit, IMDb, Amazon properties.&lt;/td&gt;
      &lt;td&gt;Internal service communication chain reaction.&lt;/td&gt;
      &lt;td&gt;Serious incident; millions impacted; warned about tight internal dependencies.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2017-02-28&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;4–5 hours&lt;/td&gt;
      &lt;td&gt;S3 control plane outage; Slack, Trello, GitHub Pages, Quora, many sites lost images/files.&lt;/td&gt;
      &lt;td&gt;Engineer typo deleted critical configuration.&lt;/td&gt;
      &lt;td&gt;One of the most famous outages ever; “most expensive typo in history”.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020-11-25&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Several hours&lt;/td&gt;
      &lt;td&gt;Kinesis and Cognito disruption; affected Roku, Adobe, Flickr; streaming &amp;amp; auth services down.&lt;/td&gt;
      &lt;td&gt;Capacity update issue.&lt;/td&gt;
      &lt;td&gt;Happened during pandemic; highlighted capacity planning challenges.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022-12-05&lt;/td&gt;
      &lt;td&gt;us-east-2 (Ohio)&lt;/td&gt;
      &lt;td&gt;~40 minutes&lt;/td&gt;
      &lt;td&gt;Availability Zone outage; impacted multiple services in the region.&lt;/td&gt;
      &lt;td&gt;Not publicly detailed (likely network/power).&lt;/td&gt;
      &lt;td&gt;Short but emphasized importance of multi-AZ architecture.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Not specified&lt;/td&gt;
      &lt;td&gt;Lambda service disruption; affected large organizations (Boston Globe, NYC subway, AP, etc.).&lt;/td&gt;
      &lt;td&gt;Not publicly detailed.&lt;/td&gt;
      &lt;td&gt;Exposed fragility of serverless computing at scale.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024-07-30&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Not specified&lt;/td&gt;
      &lt;td&gt;Kinesis Data Streams outage; impacted real-time data processing applications.&lt;/td&gt;
      &lt;td&gt;Not publicly detailed.&lt;/td&gt;
      &lt;td&gt;Highlighted risks in stream-processing dependencies.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-02&lt;/td&gt;
      &lt;td&gt;eu-north-1 (Stockholm)&lt;/td&gt;
      &lt;td&gt;Not specified&lt;/td&gt;
      &lt;td&gt;Major network issue in one AZ; affected core services in Europe.&lt;/td&gt;
      &lt;td&gt;Major network failure.&lt;/td&gt;
      &lt;td&gt;Regional event; reflected challenges in European infrastructure expansion.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-10-19/20&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;&amp;gt;15 hours&lt;/td&gt;
      &lt;td&gt;DynamoDB API endpoint outage (DNS failure); impacted Slack, Reddit, Roblox, Fortnite, Coinbase, Venmo, Duolingo, Canva, PlayStation, banks, airlines (Delta/United delays), Amazon services; &amp;gt;3,500 companies, 60+ countries, &amp;gt;17 million user reports.&lt;/td&gt;
      &lt;td&gt;DNS resolution failure leading to cascading effect.&lt;/td&gt;
      &lt;td&gt;Largest cloud outage of 2025; called “the biggest cloud fragility exposure”; strongly pushed multi-cloud strategies.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Analysis of the most severe incidents&lt;/strong&gt;&lt;br /&gt;
The most severe outages were 2015-09-20 (DynamoDB), 2017-02-28 (S3), and especially 2025-10-19/20 (DynamoDB DNS). All occurred in us-east-1, AWS’s oldest and busiest region.&lt;br /&gt;
Severity ranking:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;2015: entertainment &amp;amp; social platforms heavily affected, but limited to consumer services.&lt;/li&gt;
  &lt;li&gt;2017: massive productivity and developer impact; huge economic loss due to human error.&lt;/li&gt;
  &lt;li&gt;2025: longest duration (&amp;gt;15h), broadest scope (finance, gaming, education, aviation, critical infrastructure), highest user impact — widely regarded as the most serious single cloud outage in recent years.&lt;br /&gt;
Common lessons: over-reliance on us-east-1, control-plane fragility, cascading failures. Industry increasingly recommends multi-region, multi-cloud, or hybrid architectures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;alibaba-cloud-outages&quot;&gt;Alibaba Cloud Outages&lt;/h2&gt;

&lt;p&gt;From 2014 to 2025, Alibaba Cloud did not have an unusually high number of &lt;strong&gt;major incidents&lt;/strong&gt; that were widely reported, officially disclosed, &lt;strong&gt;truly broad in impact, long in duration, and widely called “major outages”&lt;/strong&gt; (relative to its scale, its overall SLA remains among the best in the industry). A few of them, however, did cause significant social impact and industry debate. Below is a chronological list of &lt;strong&gt;major-level outages&lt;/strong&gt; (based mainly on public reports, official announcements, media and community post-mortems):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Time&lt;/th&gt;
      &lt;th&gt;Region/Scope&lt;/th&gt;
      &lt;th&gt;Duration&lt;/th&gt;
      &lt;th&gt;Main Impact and Consequences&lt;/th&gt;
      &lt;th&gt;Official/Main Cause&lt;/th&gt;
      &lt;th&gt;Notes / Industry View&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;June 2018&lt;/td&gt;
      &lt;td&gt;Some regions (details not public)&lt;/td&gt;
      &lt;td&gt;~30 min&lt;/td&gt;
      &lt;td&gt;Some cloud products abnormal, limited impact&lt;/td&gt;
      &lt;td&gt;Not disclosed in detail&lt;/td&gt;
      &lt;td&gt;Described by some media as “major technical failure”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;March 3, 2019&lt;/td&gt;
      &lt;td&gt;North China 2 (Beijing) AZ-C&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Many ECS disk failures, many sites/Apps down&lt;/td&gt;
      &lt;td&gt;Disk failure&lt;/td&gt;
      &lt;td&gt;Significant impact; Alibaba Cloud compensated per SLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Dec 18, 2022&lt;/td&gt;
      &lt;td&gt;Hong Kong Region AZ-C&lt;/td&gt;
      &lt;td&gt;~15.5 hours&lt;/td&gt;
      &lt;td&gt;Hong Kong region largely down; key sites in Macau (monetary authority, Galaxy, Lotus TV, etc.) unavailable; OKX affected&lt;/td&gt;
      &lt;td&gt;Cooling equipment failure → cascade → large outage&lt;/td&gt;
      &lt;td&gt;Widely called “one of the worst incidents in Alibaba Cloud history”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Nov 12, 2023&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;All regions and services globally&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~3h 16m&lt;/td&gt;
      &lt;td&gt;Console, API, MQ, microservices, monitoring, ML, etc. largely abnormal; Taobao, DingTalk, Xianyu, Ele.me, Alibaba Cloud Drive, etc. down&lt;/td&gt;
      &lt;td&gt;Core component failure (auth/metadata/control plane)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Widely seen as Alibaba Cloud’s worst, broadest outage&lt;/strong&gt;; “epic,” “unprecedented in the industry”&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Nov 27, 2023&lt;/td&gt;
      &lt;td&gt;Some servers&lt;/td&gt;
      &lt;td&gt;~2 hours&lt;/td&gt;
      &lt;td&gt;Server access abnormal&lt;/td&gt;
      &lt;td&gt;Not disclosed in detail&lt;/td&gt;
      &lt;td&gt;Only half a month after 11·12; renewed trust concerns&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;July 2, 2024&lt;/td&gt;
      &lt;td&gt;Some regions/services&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Console and some services abnormal&lt;/td&gt;
      &lt;td&gt;No detailed post-mortem&lt;/td&gt;
      &lt;td&gt;Mid-sized; impact smaller than earlier incidents&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025 (date unclear)&lt;/td&gt;
      &lt;td&gt;Global (suspected DNS-related)&lt;/td&gt;
      &lt;td&gt;~6 hours&lt;/td&gt;
      &lt;td&gt;DNS hijacking led to global service issues&lt;/td&gt;
      &lt;td&gt;DNS hijacking&lt;/td&gt;
      &lt;td&gt;From 2025 public cloud outage summary; details TBD&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;important-notes-and-trends&quot;&gt;Important Notes and Trends&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2014–2018 early&lt;/strong&gt;: Very few publicly disclosed major P0-level incidents in this period; more local, limited issues. Scale was much smaller; impact was smaller too.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Two most severe&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;2022.12 Hong Kong 15.5h&lt;/strong&gt; → Longest single-region outage; severe impact on critical infrastructure in Hong Kong and Macau.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;2023.11.12 global 3h+&lt;/strong&gt; → Control plane and global services down; widely seen as a rare “all regions × all services” failure, breaking the “multi-active, multi-center, N nines” myth.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;: From known information, frequency and severity are lower than 2022–2023, but medium-to-large events still occur (e.g. 2025 DNS hijacking had broad impact).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alibaba Cloud’s handling&lt;/strong&gt;: Most major incidents get detailed post-mortems (especially 2022 Hong Kong and 2023 global); SLA compensation (usually vouchers); senior/formal apologies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Overall, in 2014–2025 Alibaba Cloud had roughly &lt;strong&gt;5–7&lt;/strong&gt; incidents that qualify as “major,” with &lt;strong&gt;Nov 12, 2023&lt;/strong&gt; and &lt;strong&gt;Dec 2022 Hong Kong&lt;/strong&gt; generally seen as the two most severe.&lt;/p&gt;

&lt;h2 id=&quot;google-cloud-outages&quot;&gt;Google Cloud Outages&lt;/h2&gt;

&lt;p&gt;Google Cloud Platform (GCP) had relatively good overall SLA from 2014 to 2025; &lt;strong&gt;major incidents&lt;/strong&gt; that truly affected &lt;strong&gt;global scope&lt;/strong&gt; or &lt;strong&gt;multiple core services&lt;/strong&gt; were not especially frequent (fewer than AWS and Azure in terms of global disasters). When they did occur, they often affected many third-party apps (e.g. Snapchat, Spotify, Discord, services depending on Cloudflare), with high social impact.&lt;/p&gt;

&lt;p&gt;Below is a chronological list of &lt;strong&gt;serious, broad-impact&lt;/strong&gt; GCP outages (based on public Status Dashboard, media, Wikipedia, industry post-mortems):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Time&lt;/th&gt;
      &lt;th&gt;Region/Scope&lt;/th&gt;
      &lt;th&gt;Duration&lt;/th&gt;
      &lt;th&gt;Main Impact and Consequences&lt;/th&gt;
      &lt;th&gt;Main Cause&lt;/th&gt;
      &lt;th&gt;Notes / Industry View&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Aug 2015&lt;/td&gt;
      &lt;td&gt;Europe (Ghlin, Belgium)&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Compute Engine very high read/write error rate; some data loss&lt;/td&gt;
      &lt;td&gt;Lightning damaged part of datacenter&lt;/td&gt;
      &lt;td&gt;Google rarely admitted &lt;strong&gt;data loss&lt;/strong&gt;; limited customer set&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;July 2018&lt;/td&gt;
      &lt;td&gt;Global (multiple regions)&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;GCP services abnormal; Snapchat, Spotify, etc. largely unusable&lt;/td&gt;
      &lt;td&gt;Network congestion + internal routing&lt;/td&gt;
      &lt;td&gt;Widely reported; strong third-party impact&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;June 2, 2019&lt;/td&gt;
      &lt;td&gt;US East + global&lt;/td&gt;
      &lt;td&gt;~4–5 hours&lt;/td&gt;
      &lt;td&gt;YouTube, Gmail, G Suite largely down; Snapchat, Discord, Vimeo login failures&lt;/td&gt;
      &lt;td&gt;US East network congestion + cascade&lt;/td&gt;
      &lt;td&gt;Broad impact; social media buzz&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Dec 14, 2020&lt;/td&gt;
      &lt;td&gt;Global&lt;/td&gt;
      &lt;td&gt;~1 hour&lt;/td&gt;
      &lt;td&gt;Gmail, YouTube, Google Home, Nest, Pokémon GO, etc.—almost all auth-dependent services down&lt;/td&gt;
      &lt;td&gt;Identity/auth system (IAM-like) global failure&lt;/td&gt;
      &lt;td&gt;Consumer services “down”; one of the worst&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Aug 2022&lt;/td&gt;
      &lt;td&gt;Iowa datacenter&lt;/td&gt;
      &lt;td&gt;Local&lt;/td&gt;
      &lt;td&gt;Electrical fire (3 injured); some services affected, not global&lt;/td&gt;
      &lt;td&gt;Datacenter electrical fire&lt;/td&gt;
      &lt;td&gt;Physical facility; not purely software/architecture&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Apr 2023&lt;/td&gt;
      &lt;td&gt;Europe (Paris, etc.)&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Multi-region network + service disruption&lt;/td&gt;
      &lt;td&gt;Flood + datacenter + network issues&lt;/td&gt;
      &lt;td&gt;Weather-related; medium impact&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Oct 23, 2024&lt;/td&gt;
      &lt;td&gt;Europe (Frankfurt europe-west3)&lt;/td&gt;
      &lt;td&gt;~12+ hours&lt;/td&gt;
      &lt;td&gt;Region largely unavailable; many European customers affected&lt;/td&gt;
      &lt;td&gt;Not disclosed in detail (suspected control plane/network)&lt;/td&gt;
      &lt;td&gt;One of the longest single-region outages&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;June 12, 2025&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt; (40+ regions)&lt;/td&gt;
      &lt;td&gt;~2.5–3 hours&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;70+ GCP services&lt;/strong&gt; abnormal; IAM down → API requests failing; Spotify, Discord, Twitch, Cloudflare, Fitbit, Gmail, Drive, YouTube, etc. down&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Service Control&lt;/strong&gt; (API auth core) automation update introduced severe bug → crash loop → global overload&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Widely seen as GCP’s worst global outage since 2020&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;July 18, 2025&lt;/td&gt;
      &lt;td&gt;us-east1&lt;/td&gt;
      &lt;td&gt;~2 hours&lt;/td&gt;
      &lt;td&gt;Multiple products higher error rates&lt;/td&gt;
      &lt;td&gt;Not disclosed in detail&lt;/td&gt;
      &lt;td&gt;Mid-sized; recovery relatively fast&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;azure-outages&quot;&gt;Azure Outages&lt;/h2&gt;

&lt;p&gt;Microsoft Azure did not have an unusually high number of &lt;strong&gt;major incidents&lt;/strong&gt; that were &lt;strong&gt;broad in impact, long in duration, and highly visible&lt;/strong&gt; from 2014 to 2025 (compared with earlier, smaller-scale frequent glitches, the trend improved). A few events did cause global or multi-service impact, especially when &lt;strong&gt;Microsoft 365, Teams, Xbox, Outlook&lt;/strong&gt; and other consumer/enterprise products were involved; the propagation effect was very visible.&lt;/p&gt;

&lt;p&gt;Below is a chronological list of &lt;strong&gt;major-level&lt;/strong&gt; Azure outages (based on Azure Status History, Post Incident Reviews, media, Wikipedia, industry post-mortems):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Time&lt;/th&gt;
      &lt;th&gt;Region/Scope&lt;/th&gt;
      &lt;th&gt;Duration&lt;/th&gt;
      &lt;th&gt;Main Impact and Consequences&lt;/th&gt;
      &lt;th&gt;Main Cause&lt;/th&gt;
      &lt;th&gt;Notes / Industry View&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Aug 14–18, 2014&lt;/td&gt;
      &lt;td&gt;US Central, US East, US East 2, Europe North&lt;/td&gt;
      &lt;td&gt;Multiple days, hours per event&lt;/td&gt;
      &lt;td&gt;Cloud Services, SQL Database, VM, Websites, HDInsight, Mobile Services, Service Bus largely unavailable&lt;/td&gt;
      &lt;td&gt;Multiple network/storage issues&lt;/td&gt;
      &lt;td&gt;2014’s most concentrated wave; Azure still young&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Nov 18–19, 2014&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Multiple regions&lt;/strong&gt; (US, EU, Asia)&lt;/td&gt;
      &lt;td&gt;~11 hours&lt;/td&gt;
      &lt;td&gt;Azure Storage at core; VM, Websites, Visual Studio Online, Xbox Live, MSN, Search, 20+ services down&lt;/td&gt;
      &lt;td&gt;Storage perf config change → Blob front-end infinite loop&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Azure’s worst early incident&lt;/strong&gt;; detailed RCA; customer compensation&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Sep 15, 2016&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Widespread DNS resolution failure; many Azure DNS–dependent services affected&lt;/td&gt;
      &lt;td&gt;Global DNS issue&lt;/td&gt;
      &lt;td&gt;Exposed DNS single-point risk&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;June 20, 2018&lt;/td&gt;
      &lt;td&gt;North America multiple datacenters&lt;/td&gt;
      &lt;td&gt;Hours–1+ day&lt;/td&gt;
      &lt;td&gt;Cooling failure (lightning + surge protection) → multi-service disruption&lt;/td&gt;
      &lt;td&gt;Physical facility (lightning cascade)&lt;/td&gt;
      &lt;td&gt;Rare hardware/infrastructure incident&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Sep 4, 2018&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Multiple regions&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;25+ hours (some services 3 days)&lt;/td&gt;
      &lt;td&gt;Core services long unavailable&lt;/td&gt;
      &lt;td&gt;Cooling (lightning + surge)&lt;/td&gt;
      &lt;td&gt;One of the longest recoveries&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Jan 23, 2023&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt; (core network)&lt;/td&gt;
      &lt;td&gt;~3 hours&lt;/td&gt;
      &lt;td&gt;Microsoft 365 (Teams, Outlook, Exchange), some Azure services down&lt;/td&gt;
      &lt;td&gt;WAN issue&lt;/td&gt;
      &lt;td&gt;M365 “down”; huge impact&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;July 18, 2024&lt;/td&gt;
      &lt;td&gt;US Central&lt;/td&gt;
      &lt;td&gt;~Half day&lt;/td&gt;
      &lt;td&gt;VM and other management operations failing; customers unable to access managed services&lt;/td&gt;
      &lt;td&gt;Access control error + infrastructure failure&lt;/td&gt;
      &lt;td&gt;Close in time to next-day CrowdStrike global BSOD but independent&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Jan 8–9, 2025&lt;/td&gt;
      &lt;td&gt;East US 2, etc.&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Azure Databricks, Synapse, Functions, App Service, VM network disruption&lt;/td&gt;
      &lt;td&gt;Network component issue&lt;/td&gt;
      &lt;td&gt;Notable early 2025&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Oct 29, 2025&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~8 hours&lt;/td&gt;
      &lt;td&gt;Azure Front Door at core; Microsoft 365, Outlook, Teams, Xbox Live, Minecraft, Copilot down; Alaska Airlines, Heathrow, Costco, Starbucks, etc. affected&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Azure Front Door config change&lt;/strong&gt; + protection bug → inconsistent config propagated globally&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2025’s worst for Azure&lt;/strong&gt;; Downdetector 30k+ reports; similar to AWS same month&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Nov 5–6, 2025&lt;/td&gt;
      &lt;td&gt;West Europe (AZ01)&lt;/td&gt;
      &lt;td&gt;~9–10 hours&lt;/td&gt;
      &lt;td&gt;VM, PostgreSQL/MySQL Flexible Server, AKS, Storage, Service Bus degraded/out&lt;/td&gt;
      &lt;td&gt;Datacenter thermal event&lt;/td&gt;
      &lt;td&gt;Serious regional outage&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;observations-and-trends-20142025&quot;&gt;Observations and Trends (2014–2025)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014&lt;/strong&gt;: Azure in rapid expansion; &lt;strong&gt;config changes&lt;/strong&gt; and &lt;strong&gt;storage layer&lt;/strong&gt; issues frequent; most concentrated year (Nov incident is a classic case).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2015–2019&lt;/strong&gt;: Fewer incidents; still mostly &lt;strong&gt;single region&lt;/strong&gt; or &lt;strong&gt;infrastructure&lt;/strong&gt; (cooling, lightning, DNS); impact relatively contained.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2020–2023&lt;/strong&gt;: Few major global outages; more &lt;strong&gt;network&lt;/strong&gt; or &lt;strong&gt;M365 dependency on Azure&lt;/strong&gt; (e.g. Jan 2023).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;: Control plane/edge (e.g. &lt;strong&gt;Azure Front Door&lt;/strong&gt;) became a new pain point; Oct 29, 2025 widely seen as Azure’s worst &lt;strong&gt;global outage&lt;/strong&gt; in recent years, comparable to Alibaba Nov 2023 or GCP June 2025.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Typical traits&lt;/strong&gt;: Detailed &lt;strong&gt;Post Incident Review (PIR)&lt;/strong&gt; after major incidents; &lt;strong&gt;config change&lt;/strong&gt;, &lt;strong&gt;control plane&lt;/strong&gt;, &lt;strong&gt;network&lt;/strong&gt; often root causes (not just hardware); strong third-party propagation when M365, Xbox, Teams fail; SLA compensation (credit); customers care most about business continuity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, Azure had roughly &lt;strong&gt;8–10&lt;/strong&gt; &lt;strong&gt;major-level&lt;/strong&gt; (global/multi-service, long) outages in 2014–2025; severity and frequency on par with AWS and GCP; &lt;strong&gt;cascading failure from config error&lt;/strong&gt; is a recurring pattern.&lt;/p&gt;

&lt;h2 id=&quot;cloudflare-outages&quot;&gt;Cloudflare Outages&lt;/h2&gt;

&lt;p&gt;Cloudflare, as one of the world’s largest CDN, security, DNS, and edge providers, did not have an unusually high number of &lt;strong&gt;major incidents&lt;/strong&gt; that caused &lt;strong&gt;broad internet disruption&lt;/strong&gt; from 2014 to 2025. When they did occur, impact often reached &lt;strong&gt;millions to hundreds of millions&lt;/strong&gt; of users (Cloudflare carries ~20–25% of global web traffic).&lt;/p&gt;

&lt;p&gt;Typical pattern: &lt;strong&gt;recovery is often fast&lt;/strong&gt; (most ease within 1–4 hours), but &lt;strong&gt;propagation is extreme&lt;/strong&gt;—when core proxy, DNS, or security components fail, many top sites (X, ChatGPT, Shopify, Discord, Spotify, parts of AWS, etc.) see 5xx or unreachable at once.&lt;/p&gt;

&lt;p&gt;Below is a chronological list of &lt;strong&gt;major-level&lt;/strong&gt; Cloudflare outages (based on official blog, status.cloudflare.com history, media, Wikipedia; focused on global/core traffic events):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Time&lt;/th&gt;
      &lt;th&gt;Scope&lt;/th&gt;
      &lt;th&gt;Duration&lt;/th&gt;
      &lt;th&gt;Main Impact and Consequences&lt;/th&gt;
      &lt;th&gt;Main Cause&lt;/th&gt;
      &lt;th&gt;Notes / Industry View&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;July 2, 2019&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~1–2 hours&lt;/td&gt;
      &lt;td&gt;Many sites 502/503/504; large parts of internet unreachable&lt;/td&gt;
      &lt;td&gt;Software deploy introduced severe bug → proxy layer crash&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Widely seen as Cloudflare’s worst ever&lt;/strong&gt;; detailed post-mortem&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020 multiple&lt;/td&gt;
      &lt;td&gt;Some regions/control plane&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Dashboard, analytics, some APIs down; core proxy largely stable&lt;/td&gt;
      &lt;td&gt;Control plane issues&lt;/td&gt;
      &lt;td&gt;More impact on developers; less for general users&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;June 2022&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Multiple datacenters&lt;/strong&gt; (19)&lt;/td&gt;
      &lt;td&gt;~1.5 hours&lt;/td&gt;
      &lt;td&gt;Core proxy down; many sites unreachable&lt;/td&gt;
      &lt;td&gt;Network config error&lt;/td&gt;
      &lt;td&gt;Medium scale; fast recovery&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Mar 21, 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~1h 7m&lt;/td&gt;
      &lt;td&gt;Storage read/write severely impaired; many storage/cache–dependent services affected&lt;/td&gt;
      &lt;td&gt;KV/storage layer write failure + partial read issues&lt;/td&gt;
      &lt;td&gt;Notable early 2025&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;June 12, 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt; (some features)&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Some features/services down; core traffic largely OK&lt;/td&gt;
      &lt;td&gt;Specific module deploy&lt;/td&gt;
      &lt;td&gt;Not core traffic; limited impact&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;July 14, 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt; (1.1.1.1 DNS)&lt;/td&gt;
      &lt;td&gt;~62 minutes&lt;/td&gt;
      &lt;td&gt;Public DNS resolver (1.1.1.1) fully down; many users unable to reach internet&lt;/td&gt;
      &lt;td&gt;Config error → BGP route withdrawal → DNS prefix disappeared from global routing table&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Severe for 1.1.1.1 users&lt;/strong&gt;; “internet-breaking” level&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;~Oct 2025&lt;/td&gt;
      &lt;td&gt;Some services&lt;/td&gt;
      &lt;td&gt;Tens of minutes&lt;/td&gt;
      &lt;td&gt;Brief DNS resolution disruption&lt;/td&gt;
      &lt;td&gt;DNS-related config&lt;/td&gt;
      &lt;td&gt;Mid-sized&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Nov 18, 2025&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~4–5 hours (peak longer)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Large-scale internet outage&lt;/strong&gt;: X (Twitter), ChatGPT, Shopify, Spotify, Letterboxd, Indeed, Canva, Uber, DoorDash, Truth Social, League of Legends, etc.; ~20% web traffic; 1/3 of Alexa top 10k sites&lt;/td&gt;
      &lt;td&gt;Bot Management rules file abnormal growth (DB permission change → file size doubled) → global propagation → proxy crash&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2025’s worst&lt;/strong&gt;; also worst global traffic outage since 2019&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Dec 5, 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Global&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Hours&lt;/td&gt;
      &lt;td&gt;Widespread 5xx again; Shopify, Zoom, Vinted, Fortnite, Square, Just Eat, Canva, Vimeo, parts of AWS, Deliveroo, etc.&lt;/td&gt;
      &lt;td&gt;No full official root cause (suspected config/propagation)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Only 17 days after Nov 18&lt;/strong&gt;; two major incidents in a row raised strong criticism&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;observations-and-trends-20142025-1&quot;&gt;Observations and Trends (2014–2025)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014–2018&lt;/strong&gt;: Cloudflare grew fast; few public &lt;strong&gt;global major&lt;/strong&gt; incidents; more local/regional/functional issues; internet depended on Cloudflare less than today.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;July 2019&lt;/strong&gt;: Became Cloudflare’s classic “black swan”; no &lt;strong&gt;core proxy global&lt;/strong&gt; outage of similar scale for over six years.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025 as anomaly&lt;/strong&gt;: At least &lt;strong&gt;3–4&lt;/strong&gt; broad global/near-global events (especially Nov 18 and Dec 5 back-to-back). &lt;strong&gt;Nov 18&lt;/strong&gt; widely seen as &lt;strong&gt;worst since 2019&lt;/strong&gt;. Dec 5 again led many to question change control, rollback, and “fail small.”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Typical traits&lt;/strong&gt;: Most serious incidents tied to &lt;strong&gt;config change&lt;/strong&gt;, &lt;strong&gt;rules/propagation&lt;/strong&gt;, &lt;strong&gt;control plane&lt;/strong&gt;, or &lt;strong&gt;DNS/BGP&lt;/strong&gt;; very transparent post-mortems on blog.cloudflare.com; recovery usually fast (rollback + stop propagation), but impact very broad (Anycast + challenge mechanism); no explicit SLA credit like AWS/Azure/Google, but detailed explanation and improvement commitments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, Cloudflare had roughly &lt;strong&gt;5–7&lt;/strong&gt; &lt;strong&gt;major-level&lt;/strong&gt; (global core traffic, long) outages in 2014–2025; &lt;strong&gt;July 2019&lt;/strong&gt; and &lt;strong&gt;Nov 18, 2025&lt;/strong&gt; are the two peak events. 2025 saw a clear rise in frequency and renewed discussion of “internet infrastructure centralization risk.”&lt;/p&gt;

&lt;h2 id=&quot;tencent-cloud-outages&quot;&gt;Tencent Cloud Outages&lt;/h2&gt;

&lt;p&gt;Tencent Cloud, as China’s second-largest public cloud (after Alibaba Cloud) from 2014 to 2025, had relatively good stability among domestic providers. Truly &lt;strong&gt;broad, long, high-visibility global/multi-region major&lt;/strong&gt; incidents were relatively few; when control plane (console/API) or core storage failed, impact quickly spread to many enterprises and developers.&lt;/p&gt;

&lt;p&gt;Tencent Cloud’s &lt;strong&gt;status page&lt;/strong&gt; (https://status.cloud.tencent.com/history) is relatively opaque; history often shows only the last year, and many medium-to-large incidents are missing; the full picture relies on official WeChat, tech blog, media, and community.&lt;/p&gt;

&lt;p&gt;Below is a chronological list of &lt;strong&gt;serious, broad-impact&lt;/strong&gt; Tencent Cloud incidents (based on official post-mortems, media, Zhihu/Weibo/developer community):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Time&lt;/th&gt;
      &lt;th&gt;Region/Scope&lt;/th&gt;
      &lt;th&gt;Duration&lt;/th&gt;
      &lt;th&gt;Main Impact and Consequences&lt;/th&gt;
      &lt;th&gt;Main Cause&lt;/th&gt;
      &lt;th&gt;Notes / Industry View&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Nov 2, 2014&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Nationwide&lt;/strong&gt; (control plane + some services)&lt;/td&gt;
      &lt;td&gt;~6 min&lt;/td&gt;
      &lt;td&gt;Tencent Cloud site slow, images failing, console abnormal; some users unable to use&lt;/td&gt;
      &lt;td&gt;Not disclosed (suspected network/load)&lt;/td&gt;
      &lt;td&gt;Early, small scale; limited impact but widely reported&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Aug 2018&lt;/td&gt;
      &lt;td&gt;Some users/cloud disk&lt;/td&gt;
      &lt;td&gt;Unclear (single-user impact hours to permanent)&lt;/td&gt;
      &lt;td&gt;Multiple users’ cloud disk data &lt;strong&gt;wiped/lost&lt;/strong&gt;; losses in tens of millions&lt;/td&gt;
      &lt;td&gt;Silent disk error + migration validation/replica failure&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Tencent Cloud’s worst “data loss” incident&lt;/strong&gt;; trust crisis; detailed post-mortem&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023 (sporadic)&lt;/td&gt;
      &lt;td&gt;Some regions/services&lt;/td&gt;
      &lt;td&gt;Tens of min–hours&lt;/td&gt;
      &lt;td&gt;Sporadic console/API issues, storage jitter&lt;/td&gt;
      &lt;td&gt;No detailed public post-mortem&lt;/td&gt;
      &lt;td&gt;Compared with Alibaba Nov 2023 global, Tencent was relatively stable&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Apr 8, 2024&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;17 regions globally&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~74–87 min&lt;/td&gt;
      &lt;td&gt;Console fully unreachable; cloud API 504 Gateway Timeout; CVM/RDS instances running but unmanageable/no renew/scale; 1957 customers reported&lt;/td&gt;
      &lt;td&gt;New API version backward-incompat + missing config gray release → full rollout → global propagation&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Tencent Cloud’s most serious in recent years&lt;/strong&gt;; “global outage,” “control plane collapse”; similar style to Alibaba Nov 2023&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Oct 15, 2025&lt;/td&gt;
      &lt;td&gt;Multiple regions&lt;/td&gt;
      &lt;td&gt;~Tens of min–1 hour&lt;/td&gt;
      &lt;td&gt;Auto Scaling and other services abnormal&lt;/td&gt;
      &lt;td&gt;Not disclosed&lt;/td&gt;
      &lt;td&gt;From status page; mid-sized&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Oct 17, 2025&lt;/td&gt;
      &lt;td&gt;Guangzhou&lt;/td&gt;
      &lt;td&gt;~1+ hour&lt;/td&gt;
      &lt;td&gt;AI digital-human related services abnormal&lt;/td&gt;
      &lt;td&gt;Not disclosed&lt;/td&gt;
      &lt;td&gt;Regional; specific AI/digital-human product&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;observations-and-trends-20142025-2&quot;&gt;Observations and Trends (2014–2025)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Early (2014–2018)&lt;/strong&gt;: Failures often &lt;strong&gt;storage data loss&lt;/strong&gt; or &lt;strong&gt;short access issues&lt;/strong&gt;; 2018 “data loss” hit enterprise trust hardest.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2019–2023&lt;/strong&gt;: Tencent Cloud incident frequency and severity dropped; few nationwide/global events; stability better than Alibaba in the same period (e.g. calm during Alibaba 11·12).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;: Apr 8, 2024 was a turning point; &lt;strong&gt;control plane global&lt;/strong&gt; failure led many to reassess “change safety” and “gray release.” 2025 had several mid-sized events but nothing at “full service down” level like Apr 2024 or Alibaba/Google.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Typical traits&lt;/strong&gt;: &lt;strong&gt;Control plane/API&lt;/strong&gt; is the main pain point (Apr 2024); &lt;strong&gt;storage/data loss&lt;/strong&gt; is most damaging to enterprises (2018); post-mortems relatively timely (WeChat, tech community); no strict SLA credit like AWS/Azure/Google, but vouchers/compensation; propagation less dramatic than Alibaba/Cloudflare (customer mix more enterprise/gaming/video, less consumer internet).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, Tencent Cloud had roughly &lt;strong&gt;3–5&lt;/strong&gt; &lt;strong&gt;major-level&lt;/strong&gt; (nationwide/global control plane long unavailable or serious data loss) incidents in 2014–2025; &lt;strong&gt;2018 data loss&lt;/strong&gt; and &lt;strong&gt;Apr 8, 2024 global control plane&lt;/strong&gt; are the two most discussed.&lt;/p&gt;

&lt;h2 id=&quot;outage-transparency&quot;&gt;Outage Transparency&lt;/h2&gt;

&lt;p&gt;In terms of outage transparency, Alibaba Cloud and Tencent Cloud are relatively weak.&lt;/p&gt;

&lt;p&gt;Alibaba Cloud’s status board (https://status.aliyun.com/#/?region=cn-shanghai) and Tencent Cloud’s (https://status.cloud.tencent.com/history) only show the last year of events.&lt;/p&gt;

&lt;p&gt;Azure (https://azure.status.microsoft/en-us/status/history/) keeps five years. Cloudflare (https://www.cloudflarestatus.com/history?page=17) is the most transparent; you can paginate back through earlier years.&lt;/p&gt;

&lt;h2 id=&quot;death-of-the-public-cloud&quot;&gt;“Death” of the Public Cloud&lt;/h2&gt;

&lt;p&gt;When I was younger, I was keen on reading and refactoring other people’s code. Until “Java Boy” taught me a lesson: even after I fixed his memory leak, what he felt was an existential crisis. He used anger to cover his own inadequacy and blamed “keeping the Kubernetes platform stable” on me.&lt;/p&gt;

&lt;p&gt;I wasn’t that eager to clean up his mess either. I just found the frequent &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OOM kill&lt;/code&gt; event alerts annoying. From that story I learned the philosophy of zero: &lt;strong&gt;nobody wants to do refactoring whose marginal benefit is zero.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hence the &lt;strong&gt;law of entropy increase&lt;/strong&gt; in software: a project’s codebase will, over time, turn into a mess.&lt;/p&gt;

&lt;p&gt;Someone asked: what does this have to do with the “death” of the public cloud?&lt;/p&gt;

&lt;p&gt;It’s very related. Because “industrial Cthulhu” demands that companies deliver ever-increasing profit. So for public cloud vendors and their frontline staff, they must “tell a new growth story”—in 2026, that story is AI.&lt;/p&gt;

&lt;p&gt;The old code just rots. Changing it has no marginal benefit.&lt;/p&gt;

&lt;p&gt;So everyone converges on the same idea: don’t touch others’ code; let it become a mess. Same for code, same for architecture. Even when the network topology is a pure mesh of mutual dependency, when things break everyone’s down, and when outage responsibility is shared equally, you bear no responsibility.&lt;/p&gt;

&lt;p&gt;Ironically, an ops engineer who had zero incidents on their watch and “slept at work” every day would be seen as incompetent—because they look like they did nothing. Counterintuitively, that person should be treated as the company mascot: you have no idea how much they did before to keep things stable. Or they were just lucky and deserve a shrine.&lt;/p&gt;

&lt;p&gt;The best ops is no ops. Because &lt;strong&gt;ops compensation and career risk are completely misaligned&lt;/strong&gt;. Your boss won’t give you a bonus for deleting a seemingly useless config; but you will get cursed by customers for deleting a useful database config.&lt;/p&gt;

&lt;p&gt;Public cloud vendors forget: network effects can lift them up and can slam them down. The more customers they have, the bigger the network cascade from a single outage. Like the Alipay outage on Dec 4, 2025, ~21:00–23:37—Alibaba’s sixth major incident in 2025.&lt;/p&gt;

&lt;p&gt;When user scale is in the hundreds of millions, someone is paying every second. Yet the business keeps asking for more features; eventually the system buckles.&lt;/p&gt;

&lt;p&gt;And public cloud compensation is completely misaligned. For something like Alipay it’s at most “refund the difference”; undercharging is treated as a perk. But losses for government and enterprises are incalculable. If your business runs on the public cloud and the cloud goes down, how do you explain your loss to the provider?&lt;/p&gt;

&lt;p&gt;“My system does billions in transactions a day; you’re going to compensate me a few hundred million?”&lt;/p&gt;

&lt;p&gt;Customer loss is unquantifiable, so Alibaba Cloud usually just hands out vouchers. That’s a drop in the bucket. No one can really account for lost time, actual business impact, or the value of that time.&lt;/p&gt;

&lt;p&gt;Network effects brought public cloud exponential revenue growth. For large government and enterprise users, anti-dependency on a single public cloud should be on the agenda. Tying your fate to one cloud vendor cannot handle sudden risk.&lt;/p&gt;

&lt;h2 id=&quot;small-concurrency-high-availability-systems&quot;&gt;Small-Concurrency, High-Availability Systems&lt;/h2&gt;

&lt;p&gt;On that basis I propose “small-concurrency, high-availability systems”: &lt;strong&gt;redundancy in storage&lt;/strong&gt; to achieve &lt;strong&gt;high availability&lt;/strong&gt; in the business.&lt;/p&gt;

&lt;p&gt;When traffic is spread across redundant systems, you avoid the single-cluster traffic spike of centralized flow and shrink the radius of failure.&lt;/p&gt;

&lt;p&gt;Simplest example: at DNS resolution, point Guangdong to a South China Alibaba + Tencent Kubernetes cluster. Each cluster is independent and runs a complete internal business system. Worst case, if the public cloud itself fails, you get at most 50% unavailability.&lt;/p&gt;

&lt;p&gt;Both being down at once is extremely unlikely.&lt;/p&gt;

&lt;h2 id=&quot;farewell-public-cloud-see-you-on-the-yangtze-river&quot;&gt;Farewell, Public Cloud. See you on the Yangtze River.&lt;/h2&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;p&gt;【1】&lt;br /&gt;
Cloudflare service outage, November 18, 2025&lt;br /&gt;
https://blog.cloudflare.com/zh-cn/18-november-2025-outage/&lt;/p&gt;

&lt;p&gt;【2】&lt;br /&gt;
The invisible impact of DNS from the AWS outage: how DeepFlow quickly found root cause in chaos&lt;br /&gt;
https://my.oschina.net/u/3681970/blog/18697034&lt;/p&gt;

&lt;p&gt;【3】&lt;br /&gt;
2023-11-12 Alibaba Cloud outage post-mortem and analysis&lt;br /&gt;
https://github.tiankonguse.com/blog/2023/11/29/aliyun-break.html&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    &lt;h2 id=&quot;要約&quot;&gt;要約&lt;/h2&gt;

&lt;p&gt;本稿は形式論理と定義（ネットワーク効果、エントロピー増大の法則、反依存性、限界便益ゼロの「ゼロ」の哲学）から出発し、2014年から2025年までのアリババクラウド、Google Cloud、Azure、Cloudflare、テンセントクラウドなど主要パブリッククラウド・インフラの重大障害を体系的に整理し、各社の障害透明性を比較する。その上で、パブリッククラウドの「死因」を分析する：ソフトウェアのエントロピーと限界便益ゼロによりレガシーコード・アーキテクチャの治理が困難になること、障害時にネットワーク効果が連鎖反応を増幅すること、SLA賠償が政企の実際の損失と著しく乖離していること。著者は大型政企が単一パブリッククラウドへの「反依存」を優先すべきだとし、「小並行高可用システム」の構想を提示する——ストレージ冗長とトラフィック分散（例：マルチリージョン・マルチクラスタのDNS解決）により単一点リスクと影響半径を低減する。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/fimbulwinter/fimbulwinter.jpeg&quot; alt=&quot;芬布尔之冬（フィンブルの冬）&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;形式論理と定義&quot;&gt;形式論理と定義&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ネットワーク効果&lt;/strong&gt;：製品・サービス・プラットフォームの利用者（または参加者）が増えるほど、各利用者にとっての価値が高まる。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;エントロピー増大の法則&lt;/strong&gt;：プロジェクトのコードベースは時間とともにスパゲッティ化する。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;反依存性&lt;/strong&gt;：単一のプログラミング言語・技術スタック・クラウドプラットフォームへの依存の逆。例：多言語混在プログラミング、マルチスタック選定、マルチクラウド戦略。反依存性により、業務は言語・オープンソース・パブリッククラウドに縛られず安定稼働できる。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ゼロ&lt;/strong&gt;：限界便益がゼロのリファクタリングは誰もやりたがらない。&lt;/p&gt;

&lt;h2 id=&quot;awsの障害&quot;&gt;AWSの障害&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時期&lt;/th&gt;
      &lt;th&gt;地域 / 範囲&lt;/th&gt;
      &lt;th&gt;継続時間&lt;/th&gt;
      &lt;th&gt;主な影響と結果&lt;/th&gt;
      &lt;th&gt;公式 / 主な原因&lt;/th&gt;
      &lt;th&gt;備考 / 業界評価&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1 (北バージニア)&lt;/td&gt;
      &lt;td&gt;未詳&lt;/td&gt;
      &lt;td&gt;Amazon SimpleDB の重要コンポーネントに影響、一部ユーザーがデータベース操作不可。&lt;/td&gt;
      &lt;td&gt;電源関連の問題&lt;/td&gt;
      &lt;td&gt;小規模、迅速回復；電源冗長性の不足が露呈。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-08-07&lt;/td&gt;
      &lt;td&gt;EU West (アイルランド)&lt;/td&gt;
      &lt;td&gt;未詳&lt;/td&gt;
      &lt;td&gt;EC2、EBS、RDS に影響；欧州の一部ユーザーがインスタンス・ストレージ・DB にアクセス不可。&lt;/td&gt;
      &lt;td&gt;内部システムイベント（詳細非公開）&lt;/td&gt;
      &lt;td&gt;地域限定；初期の地域分離の限界を示した。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-11-26&lt;/td&gt;
      &lt;td&gt;グローバル (CloudFront DNS)&lt;/td&gt;
      &lt;td&gt;約2時間&lt;/td&gt;
      &lt;td&gt;DNSサーバーダウン、CDNに影響；多数のウェブサイト・クラウドサービスが名前解決不能。&lt;/td&gt;
      &lt;td&gt;DNSサーバー障害&lt;/td&gt;
      &lt;td&gt;短時間だが広範囲；世界最大クラウドのDNS脆弱性が露呈。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2015-09-20&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;DynamoDB障害→内部通信途絶；Netflix、Reddit、IMDb、Amazon系サービスに広範な影響。&lt;/td&gt;
      &lt;td&gt;内部サービスの連鎖反応&lt;/td&gt;
      &lt;td&gt;深刻なインシデント；数百万ユーザーに影響；内部依存の危険性を警告。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2017-02-28&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;4〜5時間&lt;/td&gt;
      &lt;td&gt;S3制御平面停止；Slack、Trello、GitHub Pages、Quoraなど多数のサイトで画像・ファイル消失。&lt;/td&gt;
      &lt;td&gt;エンジニアの誤操作（重要な設定の誤削除）&lt;/td&gt;
      &lt;td&gt;史上最も有名な障害の一つ；「史上最も高価なタイポ」。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020-11-25&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;KinesisとCognito障害；Roku、Adobe、Flickrなどに影響；ストリーミング・認証サービス停止。&lt;/td&gt;
      &lt;td&gt;キャパシティ更新の問題&lt;/td&gt;
      &lt;td&gt;パンデミック中の発生；キャパシティ計画の難しさを浮き彫りに。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022-12-05&lt;/td&gt;
      &lt;td&gt;us-east-2 (オハイオ)&lt;/td&gt;
      &lt;td&gt;約40分&lt;/td&gt;
      &lt;td&gt;可用性ゾーン障害；地域内の複数サービスに影響。&lt;/td&gt;
      &lt;td&gt;詳細非公開（ネットワーク/電源の可能性）&lt;/td&gt;
      &lt;td&gt;短時間だがマルチAZの重要性を強調。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;未詳&lt;/td&gt;
      &lt;td&gt;Lambdaサービス障害；Boston Globe、NYC地下鉄、AP通信などに大きな影響。&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;サーバーレスコンピューティングの大規模時の脆弱性を露呈。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024-07-30&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;未詳&lt;/td&gt;
      &lt;td&gt;Kinesis Data Streams障害；リアルタイムデータ処理アプリケーションに連鎖影響。&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;ストリーム処理依存のリスクを浮き彫りに。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-02&lt;/td&gt;
      &lt;td&gt;eu-north-1 (ストックホルム)&lt;/td&gt;
      &lt;td&gt;未詳&lt;/td&gt;
      &lt;td&gt;1つのAZで重大なネットワーク障害；欧州のコアサービスに影響。&lt;/td&gt;
      &lt;td&gt;大規模ネットワーク障害&lt;/td&gt;
      &lt;td&gt;地域限定；欧州インフラ拡張の課題を反映。&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-10-19/20&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;15時間以上&lt;/td&gt;
      &lt;td&gt;DynamoDB APIエンドポイント障害（DNS障害）；Slack、Reddit、Roblox、Fortnite、Coinbase、Venmo、Duolingo、Canva、PSN、銀行、航空会社（Delta/United遅延）、Amazon系サービスに影響；3500社以上、60カ国以上、1700万件超の報告。&lt;/td&gt;
      &lt;td&gt;DNS解決障害による連鎖反応&lt;/td&gt;
      &lt;td&gt;2025年最大のクラウド障害；「クラウドの脆弱性が最も露呈した事件」；マルチクラウド戦略が強く推奨される。&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;最も深刻な障害の分析&lt;/strong&gt;&lt;br /&gt;
2014〜2025年で最も深刻だったのは2015年9月（DynamoDB）、2017年2月（S3）、特に2025年10月（DynamoDB DNS）の3件。すべてus-east-1で発生。&lt;br /&gt;
深刻度順：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;2015年：エンタメ・SNSに大きな打撃だが、主に消費者向け。&lt;/li&gt;
  &lt;li&gt;2017年：生産性ツール・開発者に甚大な影響；人的ミスによる経済損失が極めて大きい。&lt;/li&gt;
  &lt;li&gt;2025年：最長時間（15時間超）、最も広範（金融、ゲーム、教育、航空、重要インフラ）、ユーザー影響最大 — 近年最大の単一クラウド障害と評価。&lt;br /&gt;
共通教訓：us-east-1への過度な集中、コントロールプレーンの脆弱性、連鎖障害。業界はマルチリージョン、マルチクラウド、ハイブリッドアーキテクチャの採用を強く推奨している。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;アリババクラウドの障害&quot;&gt;アリババクラウドの障害&lt;/h2&gt;

&lt;p&gt;2014年から2025年まで、アリババクラウドが公表・公式開示した&lt;strong&gt;影響範囲が広く、継続時間が長く、「重大事故」と広く呼ばれた&lt;/strong&gt;障害は（体量に比べ）特に多くはなく、全体のSLAは業界トップクラスである。ただしそのうち数件は社会的影響と業界議論を引き起こした。以下は&lt;strong&gt;重大級&lt;/strong&gt;の障害の時系列リスト（主に公開情報・公式発表・メディア・コミュニティの振り返りに基づく）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時期&lt;/th&gt;
      &lt;th&gt;地域/範囲&lt;/th&gt;
      &lt;th&gt;継続時間&lt;/th&gt;
      &lt;th&gt;主な影響と結果&lt;/th&gt;
      &lt;th&gt;公式/主流の原因&lt;/th&gt;
      &lt;th&gt;備考/業界評価&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年6月&lt;/td&gt;
      &lt;td&gt;一部地域（詳細非公開）&lt;/td&gt;
      &lt;td&gt;約30分&lt;/td&gt;
      &lt;td&gt;一部クラウド製品異常、影響は限定的&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;当時メディアにより「重大技術障害」と呼ばれた&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2019年3月3日&lt;/td&gt;
      &lt;td&gt;華北2（北京）AZ-C&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;ECSディスク障害多発、多数サイト/アプリ停止&lt;/td&gt;
      &lt;td&gt;ディスク障害&lt;/td&gt;
      &lt;td&gt;影響大、アリババクラウドはSLAに基づき賠償&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022年12月18日&lt;/td&gt;
      &lt;td&gt;香港リージョンAZ-C&lt;/td&gt;
      &lt;td&gt;約15.5時間&lt;/td&gt;
      &lt;td&gt;香港域ほぼ全域停止、マカオの重要機関（金融管理局、銀河、蓮花衛視等）サイト不通、OKX影響&lt;/td&gt;
      &lt;td&gt;冷却設備故障→連鎖反応で大規模ダウン&lt;/td&gt;
      &lt;td&gt;「アリババクラウド史上最悪の醜聞の一つ」と広く称された&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年11月12日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全世界域・全サービス&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;約3時間16分&lt;/td&gt;
      &lt;td&gt;コンソール・API・MQ・マイクロサービス・監視・ML等ほぼ全線異常；淘宝・釘釘・閑魚・餓了么・阿里雲盤等一斉「クラッシュ」&lt;/td&gt;
      &lt;td&gt;基盤コアコンポーネント（認証/メタデータ/コントロールプレーン）障害&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;アリババクラウド史上最悪・影響最広&lt;/strong&gt;と公認；「エピック」「業界前例なし」&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年11月27日&lt;/td&gt;
      &lt;td&gt;一部サーバー&lt;/td&gt;
      &lt;td&gt;約2時間&lt;/td&gt;
      &lt;td&gt;サーバーアクセス異常&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;11・12事故の半月後、信頼への疑問再燃&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年7月2日&lt;/td&gt;
      &lt;td&gt;一部地域/サービス&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;コンソール及び一部サービス異常&lt;/td&gt;
      &lt;td&gt;詳細な振り返りなし&lt;/td&gt;
      &lt;td&gt;中規模、以前の数件より影響小&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年（日付不明）&lt;/td&gt;
      &lt;td&gt;グローバル（DNS関連疑い）&lt;/td&gt;
      &lt;td&gt;約6時間&lt;/td&gt;
      &lt;td&gt;DNSハイジャックによりグローバルサービス異常&lt;/td&gt;
      &lt;td&gt;DNSハイジャック関連&lt;/td&gt;
      &lt;td&gt;2025年パブリッククラウド障害まとめより、詳細要確認&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;重要な注記とトレンド&quot;&gt;重要な注記とトレンド&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2014–2018年初期&lt;/strong&gt;：この期間のアリババクラウドの重大P0級障害の公表は極めて少なく、局所・小規模が中心。当時は体量が今よりはるかに小さく、影響も限定的だった。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;最悪の二件&lt;/strong&gt;：
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;2022.12 香港15.5時間&lt;/strong&gt; → 単一地域最長障害、港澳の重要インフラに悪影響。&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;2023.11.12 グローバル3時間超&lt;/strong&gt; → コントロールプレーン/グローバルサービス全面停止；「全地域×全サービス」同時故障として稀とされ、「マルチアクティブ・マルチセンター・Nナイン」神話を打ち砕いた。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;：既知の情報では、2022–2023より頻度・深刻度は低下しているが、中〜大規模事象は依然発生（特に2025年DNSハイジャック系は影響範囲が広い）。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;アリババクラウドの対応&lt;/strong&gt;：重大障害の多くで詳細な振り返りを公表（特に2022香港・2023グローバル）；SLA賠償（通常は障害時間に応じた倍率のバウチャー）；幹部/公式の謝罪。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;全体として、2014–2025年の12年間でアリババクラウドが「重大事故」と呼べるのはおおよそ&lt;strong&gt;5〜7件&lt;/strong&gt;、その中で&lt;strong&gt;2023年11月12日&lt;/strong&gt;と&lt;strong&gt;2022年12月香港&lt;/strong&gt;が影響力・深刻度で最も高いと公認されている。&lt;/p&gt;

&lt;h2 id=&quot;グーグルクラウドの障害&quot;&gt;グーグルクラウドの障害&lt;/h2&gt;

&lt;p&gt;Google Cloud Platform（GCP）は2014年から2025年まで、全体のSLAは比較的良好で、&lt;strong&gt;グローバル&lt;/strong&gt;または&lt;strong&gt;複数コアサービス&lt;/strong&gt;に真に影響した&lt;strong&gt;重大事故&lt;/strong&gt;は（AWS・Azureに比べグローバル災害級は少ないが）発生時には多くのサードパーティアプリ（Snapchat、Spotify、Discord、Cloudflare依存サービス等）を巻き込み、社会的影響が大きい。&lt;/p&gt;

&lt;p&gt;以下は&lt;strong&gt;深刻で影響範囲の広い&lt;/strong&gt;GCP重大障害の時系列リスト（公開Status Dashboard・メディア・Wikipedia・業界振り返り等に基づく）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時期&lt;/th&gt;
      &lt;th&gt;地域/範囲&lt;/th&gt;
      &lt;th&gt;継続時間&lt;/th&gt;
      &lt;th&gt;主な影響と結果&lt;/th&gt;
      &lt;th&gt;主流の原因&lt;/th&gt;
      &lt;th&gt;備考/業界評価&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2015年8月&lt;/td&gt;
      &lt;td&gt;欧州（ベルギーGhlin）&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;Compute Engine 読み書きエラー率極高、一部データ損失&lt;/td&gt;
      &lt;td&gt;落雷でデータセンター一部機器損傷&lt;/td&gt;
      &lt;td&gt;グーグルが&lt;strong&gt;データ損失&lt;/strong&gt;を認めた稀有な例、影響は限定的顧客群&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年7月&lt;/td&gt;
      &lt;td&gt;グローバル（多地域）&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;GCP多サービス異常、Snapchat・Spotify等サードパーティが広範囲でログイン/利用不可&lt;/td&gt;
      &lt;td&gt;ネットワーク輻輳＋内部ルーティング&lt;/td&gt;
      &lt;td&gt;当時広く報道、サードパーティ影響が顕著&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2019年6月2日&lt;/td&gt;
      &lt;td&gt;米東部＋グローバル波及&lt;/td&gt;
      &lt;td&gt;約4–5時間&lt;/td&gt;
      &lt;td&gt;YouTube・Gmail・G Suite広範囲不可用、Snapchat・Discord・Vimeo等ログイン失敗&lt;/td&gt;
      &lt;td&gt;米東部ネット輻輳＋カスケード&lt;/td&gt;
      &lt;td&gt;影響範囲広、SNSで話題&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020年12月14日&lt;/td&gt;
      &lt;td&gt;グローバル&lt;/td&gt;
      &lt;td&gt;約1時間&lt;/td&gt;
      &lt;td&gt;Gmail・YouTube・Google Home・Nest・Pokémon GO等、認証依存サービスがほぼ全滅&lt;/td&gt;
      &lt;td&gt;認証システム（IAM相当）グローバル障害&lt;/td&gt;
      &lt;td&gt;コンシューマサービス一斉「クラッシュ」、最大級の一つ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022年8月&lt;/td&gt;
      &lt;td&gt;米アイオワ州データセンター&lt;/td&gt;
      &lt;td&gt;局所&lt;/td&gt;
      &lt;td&gt;電気火災（負傷3名）、一部サービス波及、グローバルではない&lt;/td&gt;
      &lt;td&gt;データセンター電気事故による火災&lt;/td&gt;
      &lt;td&gt;物理施設事故、純粋なソフト/アーキテクチャ問題ではない&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年4月&lt;/td&gt;
      &lt;td&gt;欧州（パリ等）&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;多地域ネット＋サービス中断&lt;/td&gt;
      &lt;td&gt;洪水＋データセンター＋ネット問題&lt;/td&gt;
      &lt;td&gt;気象要因、影響は中程度&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年10月23日&lt;/td&gt;
      &lt;td&gt;欧州（フランクフルト europe-west3）&lt;/td&gt;
      &lt;td&gt;約半日（12時間超）&lt;/td&gt;
      &lt;td&gt;当該地域ほぼ全サービス不可、欧州顧客多数に影響&lt;/td&gt;
      &lt;td&gt;詳細非公開（コントロールプレーン/ネット疑い）&lt;/td&gt;
      &lt;td&gt;単一地域最長障害の一つ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2025年6月12日&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;（40超地域）&lt;/td&gt;
      &lt;td&gt;約2.5–3時間&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;70超GCPサービス&lt;/strong&gt;異常、IAM認証崩壊でAPIリクエスト全面失敗；Spotify・Discord・Twitch・Cloudflare・Fitbit・Gmail・Drive・YouTube等広範囲停止&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Service Control&lt;/strong&gt;（API認証コア）の自動更新が深刻バグ導入→クラッシュループ→グローバル過負荷&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2020年以降GCP最悪のグローバル障害&lt;/strong&gt;と公認&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年7月18日&lt;/td&gt;
      &lt;td&gt;us-east1&lt;/td&gt;
      &lt;td&gt;約2時間&lt;/td&gt;
      &lt;td&gt;複数製品エラー率上昇&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;中規模、回復は比較的速い&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;azureの障害&quot;&gt;Azureの障害&lt;/h2&gt;

&lt;p&gt;Microsoft Azureは2014年から2025年まで、&lt;strong&gt;影響範囲が広く、継続時間が長く、社会的注目が高い重大事故&lt;/strong&gt;の数は（初期の小規模時の頻繁な小障害に比べ）特に多くはないが、数件はグローバルまたは多サービス級の深刻な影響を与え、&lt;strong&gt;Microsoft 365・Teams・Xbox・Outlook&lt;/strong&gt;等のコンシューマ/エンタープライズ製品が絡むと伝播効果が非常に大きい。&lt;/p&gt;

&lt;p&gt;以下は&lt;strong&gt;重大級&lt;/strong&gt;Azure障害の時系列リスト（Azure公式Status History・Post Incident Review・メディア・Wikipedia・業界振り返り等の公開情報に基づく）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時期&lt;/th&gt;
      &lt;th&gt;地域/範囲&lt;/th&gt;
      &lt;th&gt;継続時間&lt;/th&gt;
      &lt;th&gt;主な影響と結果&lt;/th&gt;
      &lt;th&gt;主流の原因&lt;/th&gt;
      &lt;th&gt;備考/業界評価&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014年8月14–18日&lt;/td&gt;
      &lt;td&gt;US Central・US East・US East 2・Europe North&lt;/td&gt;
      &lt;td&gt;複数日・1回数時間&lt;/td&gt;
      &lt;td&gt;Cloud Services・SQL Database・VM・Websites・HDInsight・Mobile Services・Service Bus等広範囲不可用&lt;/td&gt;
      &lt;td&gt;複数ネット/ストレージ問題&lt;/td&gt;
      &lt;td&gt;2014年最も集中した一波、当時Azureはまだ若い&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2014年11月18–19日&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;多地域&lt;/strong&gt;（米・欧・アジア一部）&lt;/td&gt;
      &lt;td&gt;約11時間&lt;/td&gt;
      &lt;td&gt;Azure Storageを中心にVM・Websites・Visual Studio Online・Xbox Live・MSN・Search等20超サービス中断&lt;/td&gt;
      &lt;td&gt;ストレージ性能最適化の設定変更→Blobフロント無限ループ&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Azure初期最悪の一件&lt;/strong&gt;、公式詳細RCA、顧客賠償&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2016年9月15日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;DNS解決広範囲障害、Azure DNS依存サービス多数に影響&lt;/td&gt;
      &lt;td&gt;グローバルDNS問題&lt;/td&gt;
      &lt;td&gt;DNS単点リスク露呈&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年6月20日&lt;/td&gt;
      &lt;td&gt;北米複数データセンター&lt;/td&gt;
      &lt;td&gt;数時間–1日超&lt;/td&gt;
      &lt;td&gt;冷却系故障（落雷＋サージ保護不足）で多サービス中断&lt;/td&gt;
      &lt;td&gt;物理施設（落雷連鎖）&lt;/td&gt;
      &lt;td&gt;稀なハードウェア/インフラ級障害&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年9月4日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;多地域&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;25時間超（一部サービス3日）&lt;/td&gt;
      &lt;td&gt;複数コアサービス長時間不可用&lt;/td&gt;
      &lt;td&gt;冷却（落雷＋サージ）&lt;/td&gt;
      &lt;td&gt;回復最長の一つ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年1月23日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;（コアネット影響）&lt;/td&gt;
      &lt;td&gt;約3時間&lt;/td&gt;
      &lt;td&gt;Microsoft 365（Teams・Outlook・Exchange）、一部Azureサービス中断&lt;/td&gt;
      &lt;td&gt;WAN問題&lt;/td&gt;
      &lt;td&gt;M365一斉「クラッシュ」、影響巨大&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024年7月18日&lt;/td&gt;
      &lt;td&gt;US Central&lt;/td&gt;
      &lt;td&gt;約半日&lt;/td&gt;
      &lt;td&gt;VM等の管理操作失敗、顧客がマネージドサービスにアクセス不可&lt;/td&gt;
      &lt;td&gt;アクセス制御エラー＋インフラ障害&lt;/td&gt;
      &lt;td&gt;翌日CrowdStrike全球ブルースクリーンに近接するが独立&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年1月8–9日&lt;/td&gt;
      &lt;td&gt;East US 2等&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;Azure Databricks・Synapse・Functions・App Service・VM等ネット中断&lt;/td&gt;
      &lt;td&gt;ネットワークコンポーネント問題&lt;/td&gt;
      &lt;td&gt;2025年序盤で顕著な一件&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2025年10月29日&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;約8時間&lt;/td&gt;
      &lt;td&gt;Azure Front Doorを中心にMicrosoft 365・Outlook・Teams・Xbox Live・Minecraft・Copilot広範囲停止；Alaska Airlines・Heathrow・Costco・Starbucks等波及&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Azure Front Door設定変更&lt;/strong&gt;＋保護機構のバグで設定不整合がグローバル伝播&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2025年Azure最悪&lt;/strong&gt;、Downdetector3万超報告、同月AWS障害に類似&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年11月5–6日&lt;/td&gt;
      &lt;td&gt;West Europe (AZ01)&lt;/td&gt;
      &lt;td&gt;約9–10時間&lt;/td&gt;
      &lt;td&gt;VM・PostgreSQL/MySQL Flexible Server・AKS・Storage・Service Bus等多サービス劣化/中断&lt;/td&gt;
      &lt;td&gt;データセンター熱イベント&lt;/td&gt;
      &lt;td&gt;リージョン級で深刻な障害&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;観察とトレンド20142025&quot;&gt;観察とトレンド（2014–2025）&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014年&lt;/strong&gt;：Azureは急拡大期；&lt;strong&gt;設定変更&lt;/strong&gt;と&lt;strong&gt;ストレージ層&lt;/strong&gt;問題が頻発、障害が最も集中した年（特に11月は古典的ケース）。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2015–2019&lt;/strong&gt;：障害頻度は低下、依然&lt;strong&gt;単一地域&lt;/strong&gt;または&lt;strong&gt;インフラ&lt;/strong&gt;（冷却・落雷・DNS）が中心、影響は比較的抑制。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2020–2023&lt;/strong&gt;：重大グローバル障害は少なめ、&lt;strong&gt;ネット&lt;/strong&gt;または&lt;strong&gt;M365のAzure依存&lt;/strong&gt;による間接影響（例：2023年1月）が中心。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;：コントロールプレーン/エッジ（&lt;strong&gt;Azure Front Door&lt;/strong&gt;等）が新たな痛み；2025年10月29日は近年Azure最悪の&lt;strong&gt;グローバル中断&lt;/strong&gt;とされ、アリババ2023年11月やGCP 2025年6月に匹敵。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;典型&lt;/strong&gt;：重大事故のたびに詳細な&lt;strong&gt;Post Incident Review (PIR)&lt;/strong&gt; を公表、透明性が高い；&lt;strong&gt;設定変更&lt;/strong&gt;・&lt;strong&gt;コントロールプレーン&lt;/strong&gt;・&lt;strong&gt;ネット&lt;/strong&gt;が原因となることが多く（単なるハード障害ではない）；M365・Xbox・Teamsが落ちるとサードパーティ伝播が極めて大きい；SLA賠償（クレジット）、顧客は事業継続性を最重視。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;全体として、Azureは2014–2025年の12年間で&lt;strong&gt;重大級（グローバル/多サービス長時間中断）&lt;/strong&gt;はおおよそ&lt;strong&gt;8–10件&lt;/strong&gt;、深刻度・頻度はAWS・GCPと同水準で、&lt;strong&gt;設定ミスによるカスケード&lt;/strong&gt;が繰り返し現れるパターン。&lt;/p&gt;

&lt;h2 id=&quot;cloudflareの障害&quot;&gt;Cloudflareの障害&lt;/h2&gt;

&lt;p&gt;Cloudflareは世界最大級のCDN・セキュリティ・DNS・エッジプロバイダーの一つとして、2014年から2025年まで&lt;strong&gt;影響範囲が広くインターネット大規模麻痺を引き起こした重大事故&lt;/strong&gt;は特に多くはないが、一度起きると&lt;strong&gt;数百万〜数億ユーザー&lt;/strong&gt;に波及し（Cloudflareは全世界の約20–25%のウェブトラフィックを担う）、影響範囲が極めて広い。&lt;/p&gt;

&lt;p&gt;特徴は&lt;strong&gt;回復が比較的速い&lt;/strong&gt;（多くは1–4時間で緩和）一方で&lt;strong&gt;伝播が極端&lt;/strong&gt;——コアプロキシ・DNS・セキュリティコンポーネントが落ちると、X・ChatGPT・Shopify・Discord・Spotify・AWS一部等のトップサイトが同時に5xxやアクセス不可になる。&lt;/p&gt;

&lt;p&gt;以下は&lt;strong&gt;重大級&lt;/strong&gt;Cloudflare障害の時系列リスト（公式ブログ・status.cloudflare.com履歴・メディア・Wikipedia・業界振り返り、グローバル/コアトラフィック中断に焦点）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時期&lt;/th&gt;
      &lt;th&gt;範囲&lt;/th&gt;
      &lt;th&gt;継続時間&lt;/th&gt;
      &lt;th&gt;主な影響と結果&lt;/th&gt;
      &lt;th&gt;主流の原因&lt;/th&gt;
      &lt;th&gt;備考/業界評価&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2019年7月2日&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;約1–2時間&lt;/td&gt;
      &lt;td&gt;多数サイトで502/503/504、インターネットの広域がアクセス不可&lt;/td&gt;
      &lt;td&gt;ソフトウェアデプロイが深刻バグを導入→プロキシ層クラッシュ&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Cloudflare史上最悪&lt;/strong&gt;と公認、公式詳細振り返り&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020年複数回&lt;/td&gt;
      &lt;td&gt;一部地域/コントロールプレーン&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;ダッシュボード・分析・一部API不可；コアプロキシはほぼ安定&lt;/td&gt;
      &lt;td&gt;コントロールプレーン問題&lt;/td&gt;
      &lt;td&gt;開発者への影響大、一般ユーザーは感知小&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022年6月&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;複数データセンター&lt;/strong&gt;（19）&lt;/td&gt;
      &lt;td&gt;約1.5時間&lt;/td&gt;
      &lt;td&gt;コアプロキシ中断、多数サイトアクセス不可&lt;/td&gt;
      &lt;td&gt;ネットワーク設定エラー&lt;/td&gt;
      &lt;td&gt;中規模、回復は速い&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年3月21日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;約1時間7分&lt;/td&gt;
      &lt;td&gt;ストレージ読み書き深刻障害、ストレージ/キャッシュ依存サービス多数に影響&lt;/td&gt;
      &lt;td&gt;KV/ストレージ層書き込み失敗＋一部読み異常&lt;/td&gt;
      &lt;td&gt;2025年序盤で顕著&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年6月12日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;（一部機能）&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;一部機能/サービス不可、コアトラフィックはほぼ正常&lt;/td&gt;
      &lt;td&gt;特定モジュールデプロイ&lt;/td&gt;
      &lt;td&gt;コアトラフィック中断ではなく影響は限定的&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年7月14日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;（1.1.1.1 DNS）&lt;/td&gt;
      &lt;td&gt;約62分&lt;/td&gt;
      &lt;td&gt;パブリックDNSリゾルバ（1.1.1.1）完全不可、多数ユーザーがインターネット接続不可&lt;/td&gt;
      &lt;td&gt;設定エラー→BGPルート撤回→DNSプレフィックスがグローバルルーティングテーブルから消失&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;1.1.1.1依存ユーザーに極めて深刻&lt;/strong&gt;、「断網級」&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月頃&lt;/td&gt;
      &lt;td&gt;一部サービス&lt;/td&gt;
      &lt;td&gt;数十分&lt;/td&gt;
      &lt;td&gt;DNS解決の短時間中断&lt;/td&gt;
      &lt;td&gt;DNS関連設定&lt;/td&gt;
      &lt;td&gt;中規模&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2025年11月18日&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;約4–5時間（ピークはより長い）&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;大規模インターネット中断&lt;/strong&gt;：X（Twitter）・ChatGPT・Shopify・Spotify・Letterboxd・Indeed・Canva・Uber・DoorDash・Truth Social・League of Legends等多数トップサービス麻痺；約20%ウェブトラフィック、Alexa上位1万サイトの1/3が影響&lt;/td&gt;
      &lt;td&gt;Bot Managementルールファイル異常肥大（DB権限変更でファイルサイズ倍増）→全网伝播→プロキシクラッシュ&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;2025年最悪&lt;/strong&gt;、2019年以来最悪のグローバルトラフィック中断&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年12月5日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;グローバル&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;数時間&lt;/td&gt;
      &lt;td&gt;再び広範囲5xx；Shopify・Zoom・Vinted・Fortnite・Square・Just Eat・Canva・Vimeo・AWS一部・Deliveroo等影響&lt;/td&gt;
      &lt;td&gt;完全な公式根因なし（設定/伝播類疑い）&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;11月18日からわずか17日&lt;/strong&gt;、連続二回の重大事故で強い批判&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;観察とトレンド20142025-1&quot;&gt;観察とトレンド（2014–2025）&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014–2018年初期&lt;/strong&gt;：Cloudflareは急成長；公表された&lt;strong&gt;グローバル重大&lt;/strong&gt;障害は少なく、局所・地域・機能問題が中心；当時インターネットのCloudflare依存度は今より低い。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2019年7月&lt;/strong&gt;：Cloudflare史上の古典的「ブラックスワン」；その後6年以上、同規模の&lt;strong&gt;コアプロキシ全局中断&lt;/strong&gt;はなし。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025年は異常な年&lt;/strong&gt;：少なくとも&lt;strong&gt;3–4回&lt;/strong&gt;の影響の大きいグローバル/準グローバル事象（特に11月18日と12月5日の連続）。&lt;strong&gt;11月18日&lt;/strong&gt;は&lt;strong&gt;2019年以来最悪&lt;/strong&gt;と公認。12月5日の再発で、変更管理・ロールバック・「fail small」の実行が疑問視された。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;典型&lt;/strong&gt;：深刻な障害の多くが&lt;strong&gt;設定変更&lt;/strong&gt;・&lt;strong&gt;ルール/伝播&lt;/strong&gt;・&lt;strong&gt;コントロールプレーン&lt;/strong&gt;または&lt;strong&gt;DNS/BGP&lt;/strong&gt;に関連；blog.cloudflare.comで毎回詳細なpost-mortem（根因・タイムライン・改善策）を公開、透明性が高い；回復は通常速い（ロールバック＋伝播停止）が影響は極めて広い（Anycast＋チャレンジ機構）；AWS/Azure/Googleのような明確なSLAクレジット賠償はないが、詳細説明と改善コミットを提供。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;全体として、Cloudflareは2014–2025年の12年間で&lt;strong&gt;重大級（グローバルコアトラフィック長時間中断）&lt;/strong&gt;はおおよそ&lt;strong&gt;5–7件&lt;/strong&gt;、&lt;strong&gt;2019年7月&lt;/strong&gt;と&lt;strong&gt;2025年11月18日&lt;/strong&gt;が二つのピーク。2025年は障害頻度が明らかに上昇し、「インターネットインフラ集中化リスク」の議論が再燃した。&lt;/p&gt;

&lt;h2 id=&quot;テンセントクラウドの障害&quot;&gt;テンセントクラウドの障害&lt;/h2&gt;

&lt;p&gt;テンセントクラウドは2014年から2025年まで、中国第二のパブリッククラウド（アリババに次ぐ）として、国内クラウドベンダーの中では安定性は中〜上で、&lt;strong&gt;影響が極めて広く、継続時間が長く、社会的注目が高いグローバル/多地域重大事故&lt;/strong&gt;は相対的に少ないが、コントロールプレーン（コンソール/API）やコアストレージに問題が起きると、影響は多数の企業・開発者に急速に拡大する。&lt;/p&gt;

&lt;p&gt;テンセントクラウドの&lt;strong&gt;ステータスページ&lt;/strong&gt;（https://status.cloud.tencent.com/history）の公開透明性は比較的低く、履歴は通常直近1年のみで、中〜大規模障害の多くは一覧に載らず、公式微信・技術ブログ・メディア・コミュニティで全体像を補う。&lt;/p&gt;

&lt;p&gt;以下は&lt;strong&gt;深刻で影響範囲の広い&lt;/strong&gt;テンセントクラウド障害の時系列リスト（公式振り返り・メディア・知乎/微博/開発者コミュニティ等の公開情報に基づく）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;時期&lt;/th&gt;
      &lt;th&gt;地域/範囲&lt;/th&gt;
      &lt;th&gt;継続時間&lt;/th&gt;
      &lt;th&gt;主な影響と結果&lt;/th&gt;
      &lt;th&gt;主流の原因&lt;/th&gt;
      &lt;th&gt;備考/業界評価&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014年11月2日&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全国&lt;/strong&gt;（コントロールプレーン＋一部サービス）&lt;/td&gt;
      &lt;td&gt;約6分&lt;/td&gt;
      &lt;td&gt;テンセントクラウド公式サイト遅延・画像読込失敗・コンソール異常、一部ユーザーが正常利用不可&lt;/td&gt;
      &lt;td&gt;詳細非公開（ネット/負荷疑い）&lt;/td&gt;
      &lt;td&gt;初期小規模期、影響は限定的だが当時メディアで広く報道&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2018年8月&lt;/td&gt;
      &lt;td&gt;一部ユーザー/クラウドディスク&lt;/td&gt;
      &lt;td&gt;不明（単一ユーザーで数時間〜恒久）&lt;/td&gt;
      &lt;td&gt;複数ユーザーのクラウドサーバーディスクデータ&lt;strong&gt;ゼロ/消失&lt;/strong&gt;、千万単位の損失&lt;/td&gt;
      &lt;td&gt;ディスク静默エラー＋データ移行時の検証/レプリカ機構不全&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;テンセントクラウド史上最悪の「データ消失」&lt;/strong&gt;、クラウド信頼危機、公式詳細振り返り&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023年（散発）&lt;/td&gt;
      &lt;td&gt;一部地域/サービス&lt;/td&gt;
      &lt;td&gt;数十分–数時間&lt;/td&gt;
      &lt;td&gt;散発的なコンソール/API異常、ストレージジッター&lt;/td&gt;
      &lt;td&gt;公開の詳細振り返りなし&lt;/td&gt;
      &lt;td&gt;アリババ2023年11月グローバルと比べテンセントは比較的安定&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2024年4月8日&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;全球17地域&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;約74–87分&lt;/td&gt;
      &lt;td&gt;コンソール完全ログイン不可、クラウドAPI全面504 Gateway Timeout；CVM/RDS等インスタンスは稼働するが管理/更新/スケール不可；1957件の顧客障害報告&lt;/td&gt;
      &lt;td&gt;クラウドAPI新バージョンの後方互換不足＋設定データのグレーリリース機構欠如→一斉リリースでグローバル伝播&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;テンセントクラウド近年最悪&lt;/strong&gt;、「全球大障害」「コントロールプレーン崩壊」と広く呼ばれ、アリババ2023年11月スタイルに類似&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月15日&lt;/td&gt;
      &lt;td&gt;多地域&lt;/td&gt;
      &lt;td&gt;約数十分–1時間&lt;/td&gt;
      &lt;td&gt;弹性伸缩（Auto Scaling）等サービス異常&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;ステータスページより、中規模&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025年10月17日&lt;/td&gt;
      &lt;td&gt;広州地域&lt;/td&gt;
      &lt;td&gt;約1時間超&lt;/td&gt;
      &lt;td&gt;智能数智人関連サービス異常&lt;/td&gt;
      &lt;td&gt;詳細非公開&lt;/td&gt;
      &lt;td&gt;リージョン級、特定AI/デジタルヒューマン製品&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;観察とトレンド20142025-2&quot;&gt;観察とトレンド（2014–2025）&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;初期（2014–2018）&lt;/strong&gt;：障害は&lt;strong&gt;ストレージ層のデータ消失&lt;/strong&gt;や&lt;strong&gt;短時間アクセス異常&lt;/strong&gt;が典型；2018年「データ消失」が企業信頼を最も痛撃。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2019–2023&lt;/strong&gt;：テンセントクラウドの障害頻度・深刻度は明らかに低下、全国/グローバル級は稀、安定性は同期のアリババより良好（特に2023年アリババ11・12エピック障害時はテンセントは安定）。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;：2024年4月8日が転換点；この&lt;strong&gt;コントロールプレーン全局障害&lt;/strong&gt;で多くの人がテンセントクラウドの「変更安全」と「グレーリリース」能力を再検討。2025年は中規模が数回あるが、2024年4月やアリババ/グーグルクラウドのような「全サービス麻痺」級は見られない。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;典型&lt;/strong&gt;：&lt;strong&gt;コントロールプレーン/API&lt;/strong&gt;が近年の最大の痛み（2024年4月が代表）；&lt;strong&gt;ストレージ/データ消失&lt;/strong&gt;が企業への打撃が最大（2018年事例）；公式振り返りは比較的タイムリー（重大時は微信・技術コミュニティで詳細説明）；AWS/Azure/Googleのような厳格なSLAクレジット賠償はないが、バウチャー/補償を提供；障害の伝播はアリババ・Cloudflareほど劇的ではない（顧客構成が企業/ゲーム/動画寄りで、コンシューマインターネット依存が相対的に低いため）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;全体として、テンセントクラウドは2014–2025年の12年間で&lt;strong&gt;重大級（全国/グローバルコントロールプレーン長時間不可または深刻なデータ消失）&lt;/strong&gt;と呼べるのはおおよそ&lt;strong&gt;3–5件&lt;/strong&gt;、&lt;strong&gt;2018年データ消失&lt;/strong&gt;と&lt;strong&gt;2024年4月8日グローバルコントロールプレーン障害&lt;/strong&gt;が影響力・議論度で最も高い二件とされている。&lt;/p&gt;

&lt;h2 id=&quot;障害の透明性&quot;&gt;障害の透明性&lt;/h2&gt;

&lt;p&gt;障害の透明性という点では、アリババクラウドとテンセントクラウドは比較的弱い。&lt;/p&gt;

&lt;p&gt;アリババクラウドのステータスボード（https://status.aliyun.com/#/?region=cn-shanghai）とテンセントクラウドのステータスボード（https://status.cloud.tencent.com/history）は、過去1年間のイベントしか表示しない。&lt;/p&gt;

&lt;p&gt;Azure（https://azure.status.microsoft/en-us/status/history/）は5年分を保持。Cloudflare（https://www.cloudflarestatus.com/history?page=17）が最も詳細で透明で、pageで数年分まで遡って閲覧できる。&lt;/p&gt;

&lt;h2 id=&quot;パブリッククラウドの死&quot;&gt;パブリッククラウドの「死」&lt;/h2&gt;

&lt;p&gt;若い頃、私は他人のコードを読んでリファクタリングするのが好きだった。Java Boyに教えられるまで：彼のメモリリークを直したのに、彼が感じたのは深い実存的不安だった。彼は怒りで自分の無能を隠し、「Kubernetesプラットフォームの安定維持」の責任を私に押し付けた。&lt;/p&gt;

&lt;p&gt;私も彼の尻拭いを喜んでやっていたわけではない。ただ、頻発する&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OOM kill&lt;/code&gt;イベントアラートが煩わしかっただけだ。その話から、ゼロの哲学を悟った：&lt;strong&gt;限界便益がゼロのリファクタリングは誰もやりたがらない。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ゆえにソフトウェア業界の&lt;strong&gt;エントロピー増大の法則&lt;/strong&gt;が導かれる：プロジェクトのコードベースは時間とともにスパゲッティ化する。&lt;/p&gt;

&lt;p&gt;「これがパブリッククラウドの死と何の関係がある？」と聞く人がいた。&lt;/p&gt;

&lt;p&gt;実は大いに関係がある。「工業的クトゥルフ」は企業に時間とともに増える利益を要求する。だからパブリッククラウドベンダーとその現場社員は「新しい成長物語」を語らなければならない——2026年なら、その物語はAIだ。&lt;/p&gt;

&lt;p&gt;古いコードはそのまま腐る。変更しても限界便益はない。&lt;/p&gt;

&lt;p&gt;やがて誰もが同じ合意に至る：他人のコードには触れず、スパゲッティ化に任せる。コードもアーキテクチャも同じ。ネットワークトポロジーが純粋な相互依存の網の目になっても、障害時はみんな使えず、ダウン責任が平等に分散すれば、自分に責任はない。&lt;/p&gt;

&lt;p&gt;皮肉なことに、在職中に障害ゼロで毎日「仕事中に寝ている」ように見える運用エンジニアは、無能だと見なされる。何もしていないように見えるから。しかし直感に反して、その人は企業のマスコットとして祀るべきだ。彼が以前どれだけ業務安定のために努力したか、あるいは単に運が良かっただけなのか、誰にもわからない。大廟に配享するに値する。&lt;/p&gt;

&lt;p&gt;究極の運用は、運用しないことである。&lt;strong&gt;運用の報酬とキャリアリスクは完全に不均衡&lt;/strong&gt;だからだ。上司は「使っていなさそうな設定」を消しても今月の手当を増やしてくれない。だが「使っているデータベース設定」を消せば、顧客に罵倒される。&lt;/p&gt;

&lt;p&gt;パブリッククラウド企業は忘れている。ネットワーク効果は彼らを押し上げることも、叩き落とすこともできる。顧客が増えれば、単一のダウンによるネットワークの連鎖反応は大きくなる。2025年12月4日夜21:00–23:37頃の支付宝障害のように——これは阿里系2025年の第六の重大障害だった。&lt;/p&gt;

&lt;p&gt;ユーザー規模が億単位になると、一秒ごとに誰かが支払っている。それでも業務はソフトに新機能を追加し続けを求め、やがてシステムは耐えられなくなる。&lt;/p&gt;

&lt;p&gt;しかもパブリッククラウドの賠償は完全に不均衡だ。支付宝のようなケースではせいぜい「多退少補」、少なく徴収した分を福利として返す程度。だが政府・企業の損失は到底算定できない。業務がパブリッククラウドに載っていて、クラウドがダウンしたら、業務側はクラウドにどう自分の損失を説明するのか？&lt;/p&gt;

&lt;p&gt;「うちのシステムは一日数百億取引している。数億賠償してくれる？」&lt;/p&gt;

&lt;p&gt;顧客の損失は定量化できない。だからアリババクラウドは通常、バウチャーを少し渡すだけだ。それは焼け石に水。失われた時間、実際の業務影響、その時間価値を誰もはっきり言えない。&lt;/p&gt;

&lt;p&gt;ネットワーク効果はパブリッククラウドに指数関数的な収益成長をもたらした。しかし大型の政府・企業ユーザーにとっては、パブリッククラウドへの&lt;strong&gt;反依存&lt;/strong&gt;を日程に載せるべきだ。自らの運命を単一のクラウドベンダーに縛れば、突発リスクには対応できない。&lt;/p&gt;

&lt;h2 id=&quot;小並行高可用システム&quot;&gt;小並行・高可用システム&lt;/h2&gt;

&lt;p&gt;その上で、私は「小並行・高可用システム」を提案する。&lt;strong&gt;ストレージの冗長&lt;/strong&gt;により、業務の&lt;strong&gt;高可用性&lt;/strong&gt;を実現する。&lt;/p&gt;

&lt;p&gt;トラフィックが冗長な情報システムに平準に分散されれば、集中型トラフィックによる単一クラスタのトラフィックピークを避け、問題の拡散半径を縮小できる。&lt;/p&gt;

&lt;p&gt;最も単純な例。DNS解決の際、広東のDNSを華南地域のアリババ・テンセントKubernetesクラスタに向ける。各クラスタは互いに依存せず、内部で完全な情報業務システムを稼働させる。最悪の場合、パブリッククラウド自体に問題が起きても、不可用は50%までに抑えられる。&lt;/p&gt;

&lt;p&gt;両方同時に不可用になる確率は極めて小さい。&lt;/p&gt;

&lt;h2 id=&quot;farewell-public-cloud-see-you-on-the-yangtze-river&quot;&gt;Farewell, Public Cloud. See you on the Yangtze River.&lt;/h2&gt;

&lt;h2 id=&quot;参考リンク&quot;&gt;参考リンク&lt;/h2&gt;

&lt;p&gt;【1】&lt;br /&gt;
2025年11月18日 Cloudflare サービス中断&lt;br /&gt;
https://blog.cloudflare.com/zh-cn/18-november-2025-outage/&lt;/p&gt;

&lt;p&gt;【2】&lt;br /&gt;
AWS障害から見るDNSの見えざる杀伤力：DeepFlowが混乱の中でいかに素早く根因を特定したか&lt;br /&gt;
https://my.oschina.net/u/3681970/blog/18697034&lt;/p&gt;

&lt;p&gt;【3】&lt;br /&gt;
2023-11-12 アリババクラウド障害の振り返りと分析&lt;br /&gt;
https://github.tiankonguse.com/blog/2023/11/29/aliyun-break.html&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    &lt;h2 id=&quot;резюме&quot;&gt;Резюме&lt;/h2&gt;

&lt;p&gt;Статья исходит из формальной логики и определений (сетевой эффект, закон возрастания энтропии, антизависимость, философия «нуля» нулевой предельной выгоды), систематически обозревает крупные сбои основных публичных облаков и инфраструктуры — Alibaba Cloud, Google Cloud, Azure, Cloudflare, Tencent Cloud — с 2014 по 2025 год и сравнивает прозрачность их отчётности по сбоям. На этой основе анализируются «причины смерти» публичного облака: энтропия ПО и нулевая предельная выгода затрудняют управление устаревшим кодом и архитектурой; сетевые эффекты усиливают каскадные сбои; компенсации по SLA серьёзно не соответствуют реальным потерям предприятий и госсектора. Автор рекомендует крупным предприятиям и госорганам приоритизировать «антизависимость» от одного публичного облака и предлагает концепцию «высокодоступной системы с малой параллельной нагрузкой» — снижение риска единой точки отказа и радиуса поражения за счёт избыточности хранения и распределения трафика (например, мультирегиональное, мультикластерное DNS-разрешение).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/fimbulwinter/fimbulwinter.jpeg&quot; alt=&quot;Фимбульвинтер&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;формальная-логика-и-определения&quot;&gt;Формальная логика и определения&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Сетевой эффект&lt;/strong&gt;: чем больше пользователей (или участников) у продукта/сервиса/платформы, тем выше его ценность для каждого пользователя.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Закон возрастания энтропии&lt;/strong&gt;: кодовую базу проекта со временем ожидает превращение в «свалку».&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Антизависимость&lt;/strong&gt;: обратная зависимость от одного языка программирования, стека или облачной платформы. Примеры: полиглот-программирование, мультистек, мультиоблако. Антизависимость позволяет бизнесу стабильно работать без привязки к одному языку, открытому проекту или публичному облаку.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ноль&lt;/strong&gt;: рефакторинг с нулевой предельной выгодой никому не нужен.&lt;/p&gt;

&lt;h2 id=&quot;сбои-aws&quot;&gt;Сбои AWS&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Время&lt;/th&gt;
      &lt;th&gt;Регион / Область&lt;/th&gt;
      &lt;th&gt;Длительность&lt;/th&gt;
      &lt;th&gt;Основное воздействие и последствия&lt;/th&gt;
      &lt;th&gt;Официальная / основная причина&lt;/th&gt;
      &lt;th&gt;Примечания / Оценка отрасли&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1 (Северная Вирджиния)&lt;/td&gt;
      &lt;td&gt;Не указано&lt;/td&gt;
      &lt;td&gt;Затронуты ключевые компоненты Amazon SimpleDB, часть пользователей не могла работать с БД.&lt;/td&gt;
      &lt;td&gt;Проблема с питанием.&lt;/td&gt;
      &lt;td&gt;Небольшое событие; быстро восстановлено; показало слабость резервирования питания.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-08-07&lt;/td&gt;
      &lt;td&gt;EU West (Ирландия)&lt;/td&gt;
      &lt;td&gt;Не указано&lt;/td&gt;
      &lt;td&gt;Затронуты EC2, EBS, RDS; европейские клиенты потеряли доступ к инстансам и хранилищам.&lt;/td&gt;
      &lt;td&gt;Внутреннее системное событие.&lt;/td&gt;
      &lt;td&gt;Региональное; выявило слабую изоляцию регионов на раннем этапе.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2014-11-26&lt;/td&gt;
      &lt;td&gt;Глобально (CloudFront DNS)&lt;/td&gt;
      &lt;td&gt;~2 часа&lt;/td&gt;
      &lt;td&gt;Сбой DNS-серверов CloudFront; многие сайты и сервисы не могли разрешать запросы.&lt;/td&gt;
      &lt;td&gt;Сбой DNS-серверов.&lt;/td&gt;
      &lt;td&gt;Короткий, но широкий эффект; показал уязвимость DNS крупнейшего облака.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2015-09-20&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Несколько часов&lt;/td&gt;
      &lt;td&gt;Сбой DynamoDB → сбой внутренних коммуникаций; пострадали Netflix, Reddit, IMDb, Amazon.&lt;/td&gt;
      &lt;td&gt;Цепная реакция внутренних сервисов.&lt;/td&gt;
      &lt;td&gt;Серьёзный инцидент; миллионы пользователей; предупреждение о сильной связанности сервисов.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2017-02-28&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;4–5 часов&lt;/td&gt;
      &lt;td&gt;Поломка контрольной плоскости S3; Slack, Trello, GitHub Pages, Quora и многие сайты без файлов.&lt;/td&gt;
      &lt;td&gt;Ошибка инженера — удалена критическая конфигурация.&lt;/td&gt;
      &lt;td&gt;Одна из самых известных аварий; «самая дорогая опечатка в истории».&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020-11-25&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Несколько часов&lt;/td&gt;
      &lt;td&gt;Сбой Kinesis и Cognito; пострадали Roku, Adobe, Flickr; стриминг и аутентификация.&lt;/td&gt;
      &lt;td&gt;Проблема с обновлением ёмкости.&lt;/td&gt;
      &lt;td&gt;Произошло во время пандемии; подчеркнуло сложности планирования мощностей.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2022-12-05&lt;/td&gt;
      &lt;td&gt;us-east-2 (Огайо)&lt;/td&gt;
      &lt;td&gt;~40 минут&lt;/td&gt;
      &lt;td&gt;Сбой зоны доступности; нарушена работа ряда сервисов в регионе.&lt;/td&gt;
      &lt;td&gt;Не раскрыто подробно (вероятно сеть/питание).&lt;/td&gt;
      &lt;td&gt;Короткий, но показал важность multi-AZ архитектуры.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023-06-13&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Не указано&lt;/td&gt;
      &lt;td&gt;Сбой Lambda; пострадали Boston Globe, метро Нью-Йорка, Associated Press и др.&lt;/td&gt;
      &lt;td&gt;Не раскрыто подробно.&lt;/td&gt;
      &lt;td&gt;Показал уязвимость бессерверных вычислений при масштабе.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2024-07-30&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;Не указано&lt;/td&gt;
      &lt;td&gt;Сбой Kinesis Data Streams; нарушена обработка данных в реальном времени.&lt;/td&gt;
      &lt;td&gt;Не раскрыто подробно.&lt;/td&gt;
      &lt;td&gt;Подчеркнул риски зависимостей потоковой обработки.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-02&lt;/td&gt;
      &lt;td&gt;eu-north-1 (Стокгольм)&lt;/td&gt;
      &lt;td&gt;Не указано&lt;/td&gt;
      &lt;td&gt;Крупный сетевой сбой в одной зоне; нарушены ключевые сервисы в Европе.&lt;/td&gt;
      &lt;td&gt;Серьёзный сетевой сбой.&lt;/td&gt;
      &lt;td&gt;Региональное; отразило сложности расширения инфраструктуры в Европе.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025-10-19/20&lt;/td&gt;
      &lt;td&gt;us-east-1&lt;/td&gt;
      &lt;td&gt;&amp;gt;15 часов&lt;/td&gt;
      &lt;td&gt;Сбой точки входа DynamoDB (DNS); пострадали Slack, Reddit, Roblox, Fortnite, Coinbase, Venmo, Duolingo, Canva, PlayStation, банки, авиакомпании (задержки Delta/United), Amazon; &amp;gt;3500 компаний, 60+ стран, &amp;gt;17 млн жалоб.&lt;/td&gt;
      &lt;td&gt;Сбой разрешения DNS → каскадный эффект.&lt;/td&gt;
      &lt;td&gt;Крупнейший сбой облака 2025 года; «самое большое обнажение уязвимости облака»; активно продвигают multi-cloud.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Анализ самых серьёзных инцидентов&lt;/strong&gt;&lt;br /&gt;
Наиболее тяжёлые сбои: 2015 (DynamoDB), 2017 (S3) и особенно 2025-10 (DynamoDB DNS). Все произошли в us-east-1 — самом старом и загруженном регионе AWS.&lt;br /&gt;
Рейтинг тяжести:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;2015 — сильно пострадали развлекательные и социальные платформы.&lt;/li&gt;
  &lt;li&gt;2017 — огромный ущерб продуктивности и разработчикам; рекордные убытки из-за человеческого фактора.&lt;/li&gt;
  &lt;li&gt;2025 — самая длительная (&amp;gt;15 ч), самая широкая (финансы, игры, образование, авиация, критическая инфраструктура) — считается самым серьёзным одиночным облачным сбоем последних лет.&lt;br /&gt;
Главные уроки: чрезмерная зависимость от us-east-1, хрупкость контрольной плоскости, каскадные сбои. Отрасль всё активнее рекомендует многорегиональные, мультиоблачные и гибридные архитектуры.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;сбои-alibaba-cloud&quot;&gt;Сбои Alibaba Cloud&lt;/h2&gt;

&lt;p&gt;С 2014 по 2025 год у Alibaba Cloud не было аномально большого числа &lt;strong&gt;крупных инцидентов&lt;/strong&gt;, широко освещённых и официально раскрытых, &lt;strong&gt;действительно широких по охвату, длительных и называемых «крупными авариями»&lt;/strong&gt; (по масштабу компании общий SLA по-прежнему на уровне лидеров отрасли). Однако несколько из них действительно вызвали заметные общественные последствия и отраслевую дискуссию. Ниже — хронологический список &lt;strong&gt;крупных сбоев&lt;/strong&gt; (по открытым отчётам, официальным заявлениям, СМИ и разборам сообщества):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Время&lt;/th&gt;
      &lt;th&gt;Регион/охват&lt;/th&gt;
      &lt;th&gt;Длительность&lt;/th&gt;
      &lt;th&gt;Основное влияние и последствия&lt;/th&gt;
      &lt;th&gt;Официальная/основная причина&lt;/th&gt;
      &lt;th&gt;Заметки/оценка отрасли&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Июнь 2018&lt;/td&gt;
      &lt;td&gt;Часть регионов (детали не раскрыты)&lt;/td&gt;
      &lt;td&gt;~30 мин&lt;/td&gt;
      &lt;td&gt;Сбои части облачных продуктов, ограниченное влияние&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто&lt;/td&gt;
      &lt;td&gt;Часть СМИ назвала «крупным техническим сбоем»&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3 марта 2019&lt;/td&gt;
      &lt;td&gt;Северный Китай 2 (Пекин) AZ-C&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Массовые сбои дисков ECS, падение множества сайтов/приложений&lt;/td&gt;
      &lt;td&gt;Сбой дисков&lt;/td&gt;
      &lt;td&gt;Существенное влияние; Alibaba Cloud компенсировала по SLA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18 декабря 2022&lt;/td&gt;
      &lt;td&gt;Регион Гонконг AZ-C&lt;/td&gt;
      &lt;td&gt;~15,5 ч&lt;/td&gt;
      &lt;td&gt;Почти полная остановка Гонконга; недоступность ключевых сайтов Макао (денежно-кредитное управление, Galaxy, Lotus TV и др.); затронут OKX&lt;/td&gt;
      &lt;td&gt;Отказ охлаждения → каскад → массовый простой&lt;/td&gt;
      &lt;td&gt;Широко названо «одним из худших инцидентов в истории Alibaba Cloud»&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;12 ноября 2023&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Все регионы и сервисы глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~3 ч 16 мин&lt;/td&gt;
      &lt;td&gt;Консоль, API, MQ, микросервисы, мониторинг, ML и др. в сбое; Taobao, DingTalk, Xianyu, Ele.me, Alibaba Cloud Drive и др. упали&lt;/td&gt;
      &lt;td&gt;Сбой ядра (аутентификация/метаданные/контрольная плоскость)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Широко признано худшим и самым широким сбоем Alibaba Cloud&lt;/strong&gt;; «эпический», «беспрецедентный в отрасли»&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;27 ноября 2023&lt;/td&gt;
      &lt;td&gt;Часть серверов&lt;/td&gt;
      &lt;td&gt;~2 ч&lt;/td&gt;
      &lt;td&gt;Сбой доступа к серверам&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто&lt;/td&gt;
      &lt;td&gt;Всего через полмесяца после 11·12; новые вопросы к доверию&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2 июля 2024&lt;/td&gt;
      &lt;td&gt;Часть регионов/сервисов&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Сбои консоли и части сервисов&lt;/td&gt;
      &lt;td&gt;Детального разбора нет&lt;/td&gt;
      &lt;td&gt;Средний масштаб; влияние меньше предыдущих&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2025 (дата неясна)&lt;/td&gt;
      &lt;td&gt;Глобально (подозрение на DNS)&lt;/td&gt;
      &lt;td&gt;~6 ч&lt;/td&gt;
      &lt;td&gt;Подмена DNS привела к глобальным сбоям сервисов&lt;/td&gt;
      &lt;td&gt;Подмена DNS&lt;/td&gt;
      &lt;td&gt;По сводке сбоев публичного облака 2025; детали уточняются&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;важные-замечания-и-тренды&quot;&gt;Важные замечания и тренды&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2014–2018, ранний период&lt;/strong&gt;: Публично раскрытых крупных P0-инцидентов в этот период крайне мало; в основном локальные, ограниченные случаи. Масштаб был намного меньше, влияние — тоже.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Два самых тяжёлых&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;2022.12 Гонконг 15,5 ч&lt;/strong&gt; → Самый длительный сбой в одном регионе; тяжёлое влияние на критическую инфраструктуру Гонконга и Макао.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;2023.11.12 глобально 3+ ч&lt;/strong&gt; → Остановка контрольной плоскости и глобальных сервисов; широко признано редким сбоем «все регионы × все сервисы», развенчавшим миф о «мультиактивности, мультицентре, N девяток».&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;: По известным данным частота и тяжесть ниже, чем в 2022–2023, но средние и крупные события по-прежнему случаются (например, подмена DNS в 2025 году имела широкий охват).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Подход Alibaba Cloud&lt;/strong&gt;: После большинства крупных сбоев публикуются детальные разборы (особенно по Гонконгу 2022 и глобальному 2023); компенсация по SLA (обычно ваучеры); официальные извинения руководства.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;В целом за 2014–2025 у Alibaba Cloud порядка &lt;strong&gt;5–7&lt;/strong&gt; инцидентов уровня «крупная авария», при этом &lt;strong&gt;12 ноября 2023&lt;/strong&gt; и &lt;strong&gt;декабрь 2022 Гонконг&lt;/strong&gt; общепризнанно считаются двумя самыми тяжёлыми.&lt;/p&gt;

&lt;h2 id=&quot;сбои-google-cloud&quot;&gt;Сбои Google Cloud&lt;/h2&gt;

&lt;p&gt;Google Cloud Platform (GCP) с 2014 по 2025 год имел в целом хороший SLA; &lt;strong&gt;крупные инциденты&lt;/strong&gt;, реально затронувшие &lt;strong&gt;глобальный охват&lt;/strong&gt; или &lt;strong&gt;несколько ключевых сервисов&lt;/strong&gt;, не были особенно частыми (меньше глобальных катастроф, чем у AWS и Azure). Когда они происходили, часто страдали многие сторонние приложения (Snapchat, Spotify, Discord, сервисы, зависящие от Cloudflare и т.д.) с высоким общественным резонансом.&lt;/p&gt;

&lt;p&gt;Ниже — хронологический список &lt;strong&gt;серьёзных, широких по охвату&lt;/strong&gt; сбоев GCP (по открытому Status Dashboard, СМИ, Wikipedia, отраслевым разборам):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Время&lt;/th&gt;
      &lt;th&gt;Регион/охват&lt;/th&gt;
      &lt;th&gt;Длительность&lt;/th&gt;
      &lt;th&gt;Основное влияние и последствия&lt;/th&gt;
      &lt;th&gt;Основная причина&lt;/th&gt;
      &lt;th&gt;Заметки/оценка отрасли&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Август 2015&lt;/td&gt;
      &lt;td&gt;Европа (Глин, Бельгия)&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Очень высокая доля ошибок чтения/записи Compute Engine; частичная потеря данных&lt;/td&gt;
      &lt;td&gt;Молния повредила часть ЦОД&lt;/td&gt;
      &lt;td&gt;Google редко признаёт &lt;strong&gt;потерю данных&lt;/strong&gt;; ограниченный круг заказчиков&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Июль 2018&lt;/td&gt;
      &lt;td&gt;Глобально (несколько регионов)&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Сбои сервисов GCP; Snapchat, Spotify и др. в основном недоступны&lt;/td&gt;
      &lt;td&gt;Перегрузка сети + внутренняя маршрутизация&lt;/td&gt;
      &lt;td&gt;Широко освещено; сильное влияние на третьи стороны&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2 июня 2019&lt;/td&gt;
      &lt;td&gt;Восток США + глобально&lt;/td&gt;
      &lt;td&gt;~4–5 ч&lt;/td&gt;
      &lt;td&gt;Массовые сбои YouTube, Gmail, G Suite; сбои входа Snapchat, Discord, Vimeo&lt;/td&gt;
      &lt;td&gt;Перегрузка сети на востоке США + каскад&lt;/td&gt;
      &lt;td&gt;Широкий охват; активное обсуждение в соцсетях&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;14 декабря 2020&lt;/td&gt;
      &lt;td&gt;Глобально&lt;/td&gt;
      &lt;td&gt;~1 ч&lt;/td&gt;
      &lt;td&gt;Gmail, YouTube, Google Home, Nest, Pokémon GO и др. — почти все сервисы, зависящие от аутентификации, упали&lt;/td&gt;
      &lt;td&gt;Глобальный сбой системы идентификации (аналог IAM)&lt;/td&gt;
      &lt;td&gt;«Падение» потребительских сервисов; один из худших&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Август 2022&lt;/td&gt;
      &lt;td&gt;ЦОД в Айове&lt;/td&gt;
      &lt;td&gt;Локально&lt;/td&gt;
      &lt;td&gt;Электрический пожар (3 пострадавших); затронуты часть сервисов, не глобально&lt;/td&gt;
      &lt;td&gt;Электрический пожар в ЦОД&lt;/td&gt;
      &lt;td&gt;Физический объект; не чисто софт/архитектура&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Апрель 2023&lt;/td&gt;
      &lt;td&gt;Европа (Париж и др.)&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Сбои сети и сервисов в нескольких регионах&lt;/td&gt;
      &lt;td&gt;Наводнение + ЦОД + сетевые проблемы&lt;/td&gt;
      &lt;td&gt;Погодный фактор; среднее влияние&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;23 октября 2024&lt;/td&gt;
      &lt;td&gt;Европа (Франкфурт europe-west3)&lt;/td&gt;
      &lt;td&gt;~12+ ч&lt;/td&gt;
      &lt;td&gt;Регион в основном недоступен; затронуты многие европейские заказчики&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто (подозрение на контрольную плоскость/сеть)&lt;/td&gt;
      &lt;td&gt;Один из самых длительных сбоев в одном регионе&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;12 июня 2025&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt; (40+ регионов)&lt;/td&gt;
      &lt;td&gt;~2,5–3 ч&lt;/td&gt;
      &lt;td&gt;Сбои &lt;strong&gt;70+ сервисов GCP&lt;/strong&gt;; падение IAM → сбои API-запросов; Spotify, Discord, Twitch, Cloudflare, Fitbit, Gmail, Drive, YouTube и др. упали&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Service Control&lt;/strong&gt; (ядро API-аутентификации): автоматическое обновление внесло тяжёлый баг → цикл сбоев → глобальная перегрузка&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Широко признано худшим глобальным сбоем GCP с 2020 года&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18 июля 2025&lt;/td&gt;
      &lt;td&gt;us-east1&lt;/td&gt;
      &lt;td&gt;~2 ч&lt;/td&gt;
      &lt;td&gt;Повышенная доля ошибок у нескольких продуктов&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто&lt;/td&gt;
      &lt;td&gt;Средний масштаб; восстановление относительно быстрое&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;сбои-azure&quot;&gt;Сбои Azure&lt;/h2&gt;

&lt;p&gt;У Microsoft Azure с 2014 по 2025 год не было аномально большого числа &lt;strong&gt;крупных инцидентов&lt;/strong&gt;, &lt;strong&gt;широких по охвату, длительных и привлекающих внимание&lt;/strong&gt; (по сравнению с ранним периодом частых мелких сбоев при меньшем масштабе ситуация улучшилась). Несколько событий действительно привели к глобальному или мультисервисному влиянию, особенно когда были затронуты &lt;strong&gt;Microsoft 365, Teams, Xbox, Outlook&lt;/strong&gt; и другие потребительские/корпоративные продукты; эффект распространения был очень заметен.&lt;/p&gt;

&lt;p&gt;Ниже — хронологический список &lt;strong&gt;крупных&lt;/strong&gt; сбоев Azure (по Azure Status History, Post Incident Reviews, СМИ, Wikipedia, отраслевым разборам):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Время&lt;/th&gt;
      &lt;th&gt;Регион/охват&lt;/th&gt;
      &lt;th&gt;Длительность&lt;/th&gt;
      &lt;th&gt;Основное влияние и последствия&lt;/th&gt;
      &lt;th&gt;Основная причина&lt;/th&gt;
      &lt;th&gt;Заметки/оценка отрасли&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;14–18 августа 2014&lt;/td&gt;
      &lt;td&gt;US Central, US East, US East 2, Europe North&lt;/td&gt;
      &lt;td&gt;Несколько дней, часы за событие&lt;/td&gt;
      &lt;td&gt;Cloud Services, SQL Database, VM, Websites, HDInsight, Mobile Services, Service Bus в основном недоступны&lt;/td&gt;
      &lt;td&gt;Несколько сетевых/хранилищных проблем&lt;/td&gt;
      &lt;td&gt;Самая концентрированная волна 2014 года; Azure ещё молодой&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;18–19 ноября 2014&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Несколько регионов&lt;/strong&gt; (США, ЕС, Азия)&lt;/td&gt;
      &lt;td&gt;~11 ч&lt;/td&gt;
      &lt;td&gt;В центре Azure Storage; VM, Websites, Visual Studio Online, Xbox Live, MSN, Search, 20+ сервисов упали&lt;/td&gt;
      &lt;td&gt;Изменение конфигурации производительности хранилища → бесконечный цикл фронта Blob&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Худший ранний инцидент Azure&lt;/strong&gt;; детальный RCA; компенсация заказчикам&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;15 сентября 2016&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Массовый сбой разрешения DNS; затронуты многие сервисы, зависящие от Azure DNS&lt;/td&gt;
      &lt;td&gt;Глобальная проблема DNS&lt;/td&gt;
      &lt;td&gt;Обнажён риск единой точки отказа DNS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20 июня 2018&lt;/td&gt;
      &lt;td&gt;Несколько ЦОД в Северной Америке&lt;/td&gt;
      &lt;td&gt;Часы–1+ день&lt;/td&gt;
      &lt;td&gt;Сбой охлаждения (молния + защита от перенапряжения) → сбои нескольких сервисов&lt;/td&gt;
      &lt;td&gt;Физический объект (каскад от молнии)&lt;/td&gt;
      &lt;td&gt;Редкий инцидент уровня железа/инфраструктуры&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4 сентября 2018&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Несколько регионов&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;25+ ч (часть сервисов 3 дня)&lt;/td&gt;
      &lt;td&gt;Ключевые сервисы длительно недоступны&lt;/td&gt;
      &lt;td&gt;Охлаждение (молния + перенапряжение)&lt;/td&gt;
      &lt;td&gt;Одно из самых длительных восстановлений&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;23 января 2023&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt; (ядро сети)&lt;/td&gt;
      &lt;td&gt;~3 ч&lt;/td&gt;
      &lt;td&gt;Microsoft 365 (Teams, Outlook, Exchange), часть сервисов Azure упали&lt;/td&gt;
      &lt;td&gt;Проблема WAN&lt;/td&gt;
      &lt;td&gt;«Падение» M365; огромное влияние&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18 июля 2024&lt;/td&gt;
      &lt;td&gt;US Central&lt;/td&gt;
      &lt;td&gt;~Полдня&lt;/td&gt;
      &lt;td&gt;Сбои операций управления VM и др.; заказчики не могли получить доступ к управляемым сервисам&lt;/td&gt;
      &lt;td&gt;Ошибка контроля доступа + сбой инфраструктуры&lt;/td&gt;
      &lt;td&gt;Близко по времени к глобальному BSOD CrowdStrike на следующий день, но независимо&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;8–9 января 2025&lt;/td&gt;
      &lt;td&gt;East US 2 и др.&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Сбои сети Azure Databricks, Synapse, Functions, App Service, VM&lt;/td&gt;
      &lt;td&gt;Проблема сетевого компонента&lt;/td&gt;
      &lt;td&gt;Заметный инцидент начала 2025 года&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;29 октября 2025&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~8 ч&lt;/td&gt;
      &lt;td&gt;В центре Azure Front Door; Microsoft 365, Outlook, Teams, Xbox Live, Minecraft, Copilot упали; затронуты Alaska Airlines, Heathrow, Costco, Starbucks и др.&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Изменение конфигурации Azure Front Door&lt;/strong&gt; + баг защиты → несовместимая конфигурация распространилась глобально&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Худший инцидент Azure в 2025 году&lt;/strong&gt;; Downdetector 30k+ отчётов; похоже на сбой AWS в том же месяце&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5–6 ноября 2025&lt;/td&gt;
      &lt;td&gt;West Europe (AZ01)&lt;/td&gt;
      &lt;td&gt;~9–10 ч&lt;/td&gt;
      &lt;td&gt;Деградация/остановка VM, PostgreSQL/MySQL Flexible Server, AKS, Storage, Service Bus&lt;/td&gt;
      &lt;td&gt;Тепловой инцидент в ЦОД&lt;/td&gt;
      &lt;td&gt;Серьёзный региональный сбой&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;наблюдения-и-тренды-20142025&quot;&gt;Наблюдения и тренды (2014–2025)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014&lt;/strong&gt;: Azure в фазе быстрого роста; частые проблемы &lt;strong&gt;изменений конфигурации&lt;/strong&gt; и &lt;strong&gt;слоя хранилища&lt;/strong&gt;; самый концентрированный по сбоям год (ноябрьский инцидент — классический кейс).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2015–2019&lt;/strong&gt;: Частота сбоев снизилась; по-прежнему в основном &lt;strong&gt;один регион&lt;/strong&gt; или &lt;strong&gt;инфраструктура&lt;/strong&gt; (охлаждение, молния, DNS); влияние относительно ограничено.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2020–2023&lt;/strong&gt;: Крупных глобальных сбоев мало; чаще &lt;strong&gt;сеть&lt;/strong&gt; или &lt;strong&gt;зависимость M365 от Azure&lt;/strong&gt; (напр., январь 2023).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;: Контрольная плоскость/край (напр. &lt;strong&gt;Azure Front Door&lt;/strong&gt;) стал новой болевой точкой; 29 октября 2025 широко признано худшей &lt;strong&gt;глобальной остановкой&lt;/strong&gt; Azure за последние годы, сопоставимой с Alibaba ноябрь 2023 или GCP июнь 2025.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Типичные черты&lt;/strong&gt;: Детальный &lt;strong&gt;Post Incident Review (PIR)&lt;/strong&gt; после крупных инцидентов; &lt;strong&gt;изменение конфигурации&lt;/strong&gt;, &lt;strong&gt;контрольная плоскость&lt;/strong&gt;, &lt;strong&gt;сеть&lt;/strong&gt; часто в корне (не только железо); сильное распространение на третьи стороны при сбоях M365, Xbox, Teams; компенсация по SLA (кредит); заказчики больше всего заботятся о непрерывности бизнеса.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В целом у Azure за 2014–2025 порядка &lt;strong&gt;8–10&lt;/strong&gt; &lt;strong&gt;крупных&lt;/strong&gt; (глобальных/мультисервисных, длительных) сбоев; тяжесть и частота на одном уровне с AWS и GCP; &lt;strong&gt;каскадный сбой из-за ошибки конфигурации&lt;/strong&gt; — повторяющийся сценарий.&lt;/p&gt;

&lt;h2 id=&quot;сбои-cloudflare&quot;&gt;Сбои Cloudflare&lt;/h2&gt;

&lt;p&gt;Cloudflare как один из крупнейших в мире CDN, безопасности, DNS и edge-провайдеров с 2014 по 2025 год не имел аномально большого числа &lt;strong&gt;крупных инцидентов&lt;/strong&gt;, вызвавших &lt;strong&gt;широкий сбой интернета&lt;/strong&gt;. Когда они происходили, влияние достигало &lt;strong&gt;миллионов и сотен миллионов&lt;/strong&gt; пользователей (Cloudflare обрабатывает ~20–25% мирового веб-трафика).&lt;/p&gt;

&lt;p&gt;Типичная картина: &lt;strong&gt;восстановление часто быстрое&lt;/strong&gt; (большинство ослабевает за 1–4 ч), но &lt;strong&gt;распространение крайне сильное&lt;/strong&gt; — при сбое ядра прокси, DNS или компонентов безопасности многие топовые сайты (X, ChatGPT, Shopify, Discord, Spotify, части AWS и т.д.) одновременно получают 5xx или становятся недоступны.&lt;/p&gt;

&lt;p&gt;Ниже — хронологический список &lt;strong&gt;крупных&lt;/strong&gt; сбоев Cloudflare (по официальному блогу, истории status.cloudflare.com, СМИ, Wikipedia; фокус на глобальных/ядровых трафиковых событиях):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Время&lt;/th&gt;
      &lt;th&gt;Охват&lt;/th&gt;
      &lt;th&gt;Длительность&lt;/th&gt;
      &lt;th&gt;Основное влияние и последствия&lt;/th&gt;
      &lt;th&gt;Основная причина&lt;/th&gt;
      &lt;th&gt;Заметки/оценка отрасли&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;2 июля 2019&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~1–2 ч&lt;/td&gt;
      &lt;td&gt;Массовые 502/503/504 на сайтах; большие части интернета недоступны&lt;/td&gt;
      &lt;td&gt;Внедрение софта внесло тяжёлый баг → падение слоя прокси&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Широко признано худшим за всю историю Cloudflare&lt;/strong&gt;; детальный разбор&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2020, несколько раз&lt;/td&gt;
      &lt;td&gt;Часть регионов/контрольная плоскость&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Недоступны дашборд, аналитика, часть API; ядро прокси в основном стабильно&lt;/td&gt;
      &lt;td&gt;Проблемы контрольной плоскости&lt;/td&gt;
      &lt;td&gt;Больше влияния на разработчиков; обычные пользователи меньше замечают&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Июнь 2022&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Несколько ЦОД&lt;/strong&gt; (19)&lt;/td&gt;
      &lt;td&gt;~1,5 ч&lt;/td&gt;
      &lt;td&gt;Остановка ядра прокси; множество сайтов недоступны&lt;/td&gt;
      &lt;td&gt;Ошибка конфигурации сети&lt;/td&gt;
      &lt;td&gt;Средний масштаб; быстрое восстановление&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;21 марта 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~1 ч 7 мин&lt;/td&gt;
      &lt;td&gt;Сильные сбои чтения/записи хранилища; затронуты многие сервисы, зависящие от хранилища/кэша&lt;/td&gt;
      &lt;td&gt;Сбой записи слоя KV/хранилища + частичные проблемы чтения&lt;/td&gt;
      &lt;td&gt;Заметный инцидент начала 2025 года&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;12 июня 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt; (часть функций)&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Часть функций/сервисов недоступна; ядро трафика в основном в порядке&lt;/td&gt;
      &lt;td&gt;Внедрение определённого модуля&lt;/td&gt;
      &lt;td&gt;Не остановка ядра трафика; ограниченное влияние&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;14 июля 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt; (DNS 1.1.1.1)&lt;/td&gt;
      &lt;td&gt;~62 мин&lt;/td&gt;
      &lt;td&gt;Публичный DNS-резолвер (1.1.1.1) полностью недоступен; многие пользователи не могли выйти в интернет&lt;/td&gt;
      &lt;td&gt;Ошибка конфигурации → отзыв BGP-маршрута → префикс DNS исчез из глобальной таблицы маршрутизации&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Очень тяжело для пользователей 1.1.1.1&lt;/strong&gt;; уровень «обрушения интернета»&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;~Октябрь 2025&lt;/td&gt;
      &lt;td&gt;Часть сервисов&lt;/td&gt;
      &lt;td&gt;Десятки минут&lt;/td&gt;
      &lt;td&gt;Краткий сбой разрешения DNS&lt;/td&gt;
      &lt;td&gt;Проблема конфигурации DNS&lt;/td&gt;
      &lt;td&gt;Средний масштаб&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;18 ноября 2025&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~4–5 ч (пик дольше)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Крупная остановка интернета&lt;/strong&gt;: X (Twitter), ChatGPT, Shopify, Spotify, Letterboxd, Indeed, Canva, Uber, DoorDash, Truth Social, League of Legends и др.; ~20% веб-трафика; 1/3 сайтов из топ-10k Alexa&lt;/td&gt;
      &lt;td&gt;Аномальный рост файла правил Bot Management (изменение прав БД → удвоение размера файла) → глобальное распространение → падение прокси&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Худший в 2025 году&lt;/strong&gt;; также худшая глобальная остановка трафика с 2019 года&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5 декабря 2025&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Часы&lt;/td&gt;
      &lt;td&gt;Снова массовые 5xx; затронуты Shopify, Zoom, Vinted, Fortnite, Square, Just Eat, Canva, Vimeo, части AWS, Deliveroo и др.&lt;/td&gt;
      &lt;td&gt;Полной официальной первопричины нет (подозрение на конфигурацию/распространение)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Всего через 17 дней после 18 ноября&lt;/strong&gt;; два крупных инцидента подряд вызвали сильную критику&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;наблюдения-и-тренды-20142025-1&quot;&gt;Наблюдения и тренды (2014–2025)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;2014–2018&lt;/strong&gt;: Cloudflare быстро рос; публичных &lt;strong&gt;крупных глобальных&lt;/strong&gt; инцидентов мало; в основном локальные/региональные/функциональные проблемы; зависимость интернета от Cloudflare была ниже, чем сейчас.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Июль 2019&lt;/strong&gt;: Стал классическим «чёрным лебедем» Cloudflare; более шести лет не было &lt;strong&gt;глобальной остановки ядра прокси&lt;/strong&gt; сопоставимого масштаба.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2025 как аномальный год&lt;/strong&gt;: Не менее &lt;strong&gt;3–4&lt;/strong&gt; широких глобальных/почти глобальных событий (особенно 18 ноября и 5 декабря подряд). &lt;strong&gt;18 ноября&lt;/strong&gt; широко признано &lt;strong&gt;худшим с 2019 года&lt;/strong&gt;. 5 декабря снова заставило многих усомниться в контроле изменений, откате и принципе «fail small».&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Типичные черты&lt;/strong&gt;: Большинство тяжёлых инцидентов связаны с &lt;strong&gt;изменением конфигурации&lt;/strong&gt;, &lt;strong&gt;правилами/распространением&lt;/strong&gt;, &lt;strong&gt;контрольной плоскостью&lt;/strong&gt; или &lt;strong&gt;DNS/BGP&lt;/strong&gt;; очень прозрачные разборы на blog.cloudflare.com; восстановление обычно быстрое (откат + остановка распространения), но влияние очень широкое (Anycast + механизм вызова); нет явной компенсации по SLA как у AWS/Azure/Google, но есть детальные объяснения и обязательства по улучшениям.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В целом у Cloudflare за 2014–2025 порядка &lt;strong&gt;5–7&lt;/strong&gt; &lt;strong&gt;крупных&lt;/strong&gt; (глобальная ядровая трафиковая, длительная) сбоев; &lt;strong&gt;июль 2019&lt;/strong&gt; и &lt;strong&gt;18 ноября 2025&lt;/strong&gt; — два пиковых события. В 2025 году частота сбоев заметно выросла, возобновилось обсуждение «риска концентрации интернет-инфраструктуры».&lt;/p&gt;

&lt;h2 id=&quot;сбои-tencent-cloud&quot;&gt;Сбои Tencent Cloud&lt;/h2&gt;

&lt;p&gt;Tencent Cloud с 2014 по 2025 год как второй по размеру публичный облачный провайдер Китая (после Alibaba Cloud) имел в целом хорошую стабильность среди местных провайдеров. Действительно &lt;strong&gt;широких, длительных, привлекающих внимание глобальных/мультирегиональных крупных&lt;/strong&gt; инцидентов было относительно немного; при сбое контрольной плоскости (консоль/API) или ключевого хранилища влияние быстро распространялось на множество предприятий и разработчиков.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Страница статуса&lt;/strong&gt; Tencent Cloud (https://status.cloud.tencent.com/history) относительно непрозрачна: история часто показывает только последний год, многие средние и крупные инциденты отсутствуют; полная картина складывается из официального WeChat, техблога, СМИ и сообщества.&lt;/p&gt;

&lt;p&gt;Ниже — хронологический список &lt;strong&gt;серьёзных, широких по охвату&lt;/strong&gt; инцидентов Tencent Cloud (по официальным разборам, СМИ, Zhihu/Weibo/сообществу разработчиков):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Время&lt;/th&gt;
      &lt;th&gt;Регион/охват&lt;/th&gt;
      &lt;th&gt;Длительность&lt;/th&gt;
      &lt;th&gt;Основное влияние и последствия&lt;/th&gt;
      &lt;th&gt;Основная причина&lt;/th&gt;
      &lt;th&gt;Заметки/оценка отрасли&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2 ноября 2014&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;По стране&lt;/strong&gt; (контрольная плоскость + часть сервисов)&lt;/td&gt;
      &lt;td&gt;~6 мин&lt;/td&gt;
      &lt;td&gt;Медленный сайт Tencent Cloud, сбой загрузки изображений, сбой консоли; часть пользователей не могла нормально пользоваться&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто (подозрение на сеть/нагрузку)&lt;/td&gt;
      &lt;td&gt;Ранний период малого масштаба; влияние ограничено, но тогда широко освещено&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Август 2018&lt;/td&gt;
      &lt;td&gt;Часть пользователей/облачный диск&lt;/td&gt;
      &lt;td&gt;Неясно (влияние на одного пользователя часы до постоянного)&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Обнуление/потеря&lt;/strong&gt; данных облачного диска у нескольких пользователей; убытки порядка десятков миллионов&lt;/td&gt;
      &lt;td&gt;Тихий сбой диска + сбой проверки/реплики при миграции&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Худший инцидент «потери данных» в истории Tencent Cloud&lt;/strong&gt;; кризис доверия; детальный разбор&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2023 (отдельные сообщения)&lt;/td&gt;
      &lt;td&gt;Часть регионов/сервисов&lt;/td&gt;
      &lt;td&gt;Десятки мин–часы&lt;/td&gt;
      &lt;td&gt;Отдельные сбои консоли/API, джиттер хранилища&lt;/td&gt;
      &lt;td&gt;Детального публичного разбора нет&lt;/td&gt;
      &lt;td&gt;По сравнению с глобальным сбоем Alibaba в ноябре 2023 Tencent был относительно стабилен&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;8 апреля 2024&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;17 регионов глобально&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;~74–87 мин&lt;/td&gt;
      &lt;td&gt;Консоль полностью недоступна; облачный API 504 Gateway Timeout; инстансы CVM/RDS работают, но управление/продление/масштабирование невозможно; 1957 обращений заказчиков&lt;/td&gt;
      &lt;td&gt;Обратная несовместимость новой версии API + отсутствие механизма поэтапного раскрытия конфигурации → полный выкат → глобальное распространение&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Самый тяжёлый за последние годы у Tencent Cloud&lt;/strong&gt;; широко названо «глобальной аварией», «обрушением контрольной плоскости»; стиль похож на Alibaba ноябрь 2023&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;15 октября 2025&lt;/td&gt;
      &lt;td&gt;Несколько регионов&lt;/td&gt;
      &lt;td&gt;~Десятки мин–1 ч&lt;/td&gt;
      &lt;td&gt;Сбои Auto Scaling и других сервисов&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто&lt;/td&gt;
      &lt;td&gt;Со страницы статуса; средний масштаб&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;17 октября 2025&lt;/td&gt;
      &lt;td&gt;Гуанчжоу&lt;/td&gt;
      &lt;td&gt;~1+ ч&lt;/td&gt;
      &lt;td&gt;Сбои сервисов, связанных с AI digital-human&lt;/td&gt;
      &lt;td&gt;Подробно не раскрыто&lt;/td&gt;
      &lt;td&gt;Региональный; конкретный продукт AI/цифровой человек&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;наблюдения-и-тренды-20142025-2&quot;&gt;Наблюдения и тренды (2014–2025)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Ранний период (2014–2018)&lt;/strong&gt;: Сбои часто &lt;strong&gt;потеря данных хранилища&lt;/strong&gt; или &lt;strong&gt;краткие проблемы доступа&lt;/strong&gt;; инцидент «потери данных» 2018 года сильнее всего ударил по доверию предприятий.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2019–2023&lt;/strong&gt;: Частота и тяжесть сбоев Tencent Cloud снизились; общенациональных/глобальных событий мало; стабильность выше, чем у Alibaba в тот же период (напр., спокойно во время 11·12 у Alibaba).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2024–2025&lt;/strong&gt;: 8 апреля 2024 стало переломным; &lt;strong&gt;глобальный сбой контрольной плоскости&lt;/strong&gt; заставил многих переоценить «безопасность изменений» и «поэтапный выкат». В 2025 было несколько средних инцидентов, но ничего уровня «полная остановка сервисов» как в апреле 2024 или у Alibaba/Google.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Типичные черты&lt;/strong&gt;: &lt;strong&gt;Контрольная плоскость/API&lt;/strong&gt; — главная болевая точка (апрель 2024); &lt;strong&gt;хранилище/потеря данных&lt;/strong&gt; наиболее разрушительны для предприятий (2018); разборы относительно своевременны (WeChat, техсообщество); нет строгой компенсации по SLA как у AWS/Azure/Google, но есть ваучеры/компенсация; распространение сбоя менее драматично, чем у Alibaba/Cloudflare (клиентская база более корпоративная/игры/видео, меньше зависимость от потребительского интернета).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В целом у Tencent Cloud за 2014–2025 порядка &lt;strong&gt;3–5&lt;/strong&gt; &lt;strong&gt;крупных&lt;/strong&gt; (общенациональная/глобальная контрольная плоскость длительно недоступна или серьёзная потеря данных) инцидентов; &lt;strong&gt;потеря данных 2018&lt;/strong&gt; и &lt;strong&gt;глобальный сбой контрольной плоскости 8 апреля 2024&lt;/strong&gt; — два самых обсуждаемых.&lt;/p&gt;

&lt;h2 id=&quot;прозрачность-по-сбоям&quot;&gt;Прозрачность по сбоям&lt;/h2&gt;

&lt;p&gt;С точки зрения прозрачности по сбоям Alibaba Cloud и Tencent Cloud относительно слабы.&lt;/p&gt;

&lt;p&gt;Доска статуса Alibaba Cloud (https://status.aliyun.com/#/?region=cn-shanghai) и Tencent Cloud (https://status.cloud.tencent.com/history) показывают только события за последний год.&lt;/p&gt;

&lt;p&gt;Azure (https://azure.status.microsoft/en-us/status/history/) хранит пять лет. Cloudflare (https://www.cloudflarestatus.com/history?page=17) наиболее прозрачен; можно листать страницы назад на несколько лет.&lt;/p&gt;

&lt;h2 id=&quot;смерть-публичного-облака&quot;&gt;«Смерть» публичного облака&lt;/h2&gt;

&lt;p&gt;В молодости я любил читать и рефакторить чужой код. Пока «Java Boy» не преподал урок: даже после того, как я починил утечку памяти, он почувствовал глубокий экзистенциальный кризис. Гневом он прикрывал собственную несостоятельность и возлагал вину за «поддержание стабильности платформы Kubernetes» на меня.&lt;/p&gt;

&lt;p&gt;Я и сам не горел желанием за ним убирать. Просто частые алерты &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OOM kill&lt;/code&gt; меня раздражали. Из той истории я вынес философию нуля: &lt;strong&gt;рефакторинг с нулевой предельной выгодой никому не нужен.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Отсюда &lt;strong&gt;закон возрастания энтропии&lt;/strong&gt; в софте: кодовую базу проекта со временем ожидает превращение в «свалку».&lt;/p&gt;

&lt;p&gt;Кто-то спросил: какое это имеет отношение к «смерти» публичного облака?&lt;/p&gt;

&lt;p&gt;Прямое. Потому что «индустриальный Ктулху» требует от компаний растущей прибыли. Поэтому для провайдеров публичного облака и их рядовых сотрудников необходимо «рассказывать новую историю роста» — в 2026 году эта история про AI.&lt;/p&gt;

&lt;p&gt;Старый код просто гниёт. Менять его — нулевая предельная выгода.&lt;/p&gt;

&lt;p&gt;И все сходятся в одном: не трогать чужой код, дать ему превратиться в свалку. И с кодом так, и с архитектурой. Даже когда сетевая топология — чистая сеть взаимных зависимостей, при сбое все одинаково без сервиса, и когда ответственность за простой распределена поровну, на тебе лично ответственности нет.&lt;/p&gt;

&lt;p&gt;Ирония в том, что инженера по эксплуатации с нулём инцидентов за время работы, который «каждый день спит на работе», сочтут некомпетентным — потому что выглядит, будто он ничего не делает. Контринтуитивно: такого человека стоило бы держать как талисман компании — неизвестно, сколько он сделал раньше ради стабильности. Или ему просто повезло, и он заслуживает алтаря.&lt;/p&gt;

&lt;p&gt;Лучшая эксплуатация — не эксплуатировать. Потому что &lt;strong&gt;доход от эксплуатации и карьерный риск совершенно несоизмеримы&lt;/strong&gt;. Начальник не доплатит за удаление «вроде бы ненужной» настройки; но за удаление нужной настройки БД тебя обругают заказчики.&lt;/p&gt;

&lt;p&gt;Провайдеры публичного облака забывают: сетевой эффект может их поднять и может больно опустить. Чем больше у них заказчиков, тем сильнее сетевая цепная реакция от одного простоя. Как сбой Alipay 4 декабря 2025, ~21:00–23:37 — уже шестой крупный инцидент экосистемы Alibaba в 2025 году.&lt;/p&gt;

&lt;p&gt;Когда масштаб пользователей — сотни миллионов, каждую секунду кто-то платит. А бизнес продолжает требовать новые функции; в конце концов система не выдерживает.&lt;/p&gt;

&lt;p&gt;И компенсация провайдеров публичного облака совершенно несоизмерима. Для чего-то вроде Alipay это максимум «вернуть разницу»; недобор считают подарком. Но потери госсектора и предприятий не поддаются оценке. Если твой бизнес на публичном облаке и облако легло — как ты объяснишь провайдеру свой ущерб?&lt;/p&gt;

&lt;p&gt;«Моя система обрабатывает миллиарды транзакций в день; вы мне компенсируете пару миллиардов?»&lt;/p&gt;

&lt;p&gt;Ущерб заказчика не квантифицируем, поэтому Alibaba Cloud обычно просто раздаёт ваучеры. Это капля в море. Никто не может толком учесть потерянное время, реальное влияние на бизнес и ценность этого времени.&lt;/p&gt;

&lt;p&gt;Сетевой эффект принёс публичному облаку экспоненциальный рост выручки. Для крупных государственных и корпоративных пользователей &lt;strong&gt;антизависимость&lt;/strong&gt; от одного публичного облака должна быть в повестке. Связать свою судьбу с одним облачным провайдером — нельзя справиться с внезапным риском.&lt;/p&gt;

&lt;h2 id=&quot;системы-малой-параллельности-и-высокой-доступности&quot;&gt;Системы малой параллельности и высокой доступности&lt;/h2&gt;

&lt;p&gt;На этой основе я предлагаю «системы малой параллельности и высокой доступности»: &lt;strong&gt;избыточность хранилища&lt;/strong&gt; для &lt;strong&gt;высокой доступности&lt;/strong&gt; бизнеса.&lt;/p&gt;

&lt;p&gt;Когда трафик распределён по избыточным системам, ты избегаешь пика трафика одного кластера при централизованном потоке и сокращаешь радиус распространения сбоя.&lt;/p&gt;

&lt;p&gt;Простейший пример: при разрешении DNS направлять Гуандун на кластер Kubernetes Alibaba + Tencent в Южном Китае. Каждый кластер независим и крутит полную внутреннюю бизнес-систему. В худшем случае при сбое самого публичного облака недоступность не более 50%.&lt;/p&gt;

&lt;p&gt;Одновременная недоступность обоих крайне маловероятна.&lt;/p&gt;

&lt;h2 id=&quot;孤帆远影碧山尽唯见长江天际流&quot;&gt;孤帆远影碧山尽，唯见长江天际流&lt;/h2&gt;
&lt;p&gt;Прощай, облачный сервис. Увидимся на Янцзы.&lt;/p&gt;

&lt;h2 id=&quot;ссылки&quot;&gt;Ссылки&lt;/h2&gt;

&lt;p&gt;【1】&lt;br /&gt;
Сбой сервисов Cloudflare 18 ноября 2025&lt;br /&gt;
https://blog.cloudflare.com/zh-cn/18-november-2025-outage/&lt;/p&gt;

&lt;p&gt;【2】&lt;br /&gt;
Невидимое влияние DNS на примере сбоя AWS: как DeepFlow быстро нашёл первопричину в хаосе&lt;br /&gt;
https://my.oschina.net/u/3681970/blog/18697034&lt;/p&gt;

&lt;p&gt;【3】&lt;br /&gt;
Разбор и анализ сбоя Alibaba Cloud 2023-11-12&lt;br /&gt;
https://github.tiankonguse.com/blog/2023/11/29/aliyun-break.html&lt;/p&gt;

&lt;/div&gt;
</description>
        <pubDate>Wed, 04 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/02/04/fimbulwinter/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/02/04/fimbulwinter/</guid>
        
        <category>n</category>
        
        
      </item>
    
      <item>
        <title>教育行政化体系下的激励函数设计</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    &lt;h2 id=&quot;引言&quot;&gt;引言&lt;/h2&gt;

&lt;p&gt;本文将以教育行政化体系作为论述的大环境背景，提取
1 教师Y，教师F，教师D
2 学生犹大，学生黑曼巴，学生P，学生Y，学生C13
3 心理老师
4 学校领导
的家庭背景，性格特征，以及行为模式。把「人类决策」拆成可计算的变量 → 评分 → 概率 / 结果。并分析不同决策产生的政策风险和结果，
根据不同的角色定位，研究探讨最佳策略，并尽可能地为学校领导设计一个最佳的时间激励函数。&lt;/p&gt;

&lt;h2 id=&quot;形式逻辑和定义&quot;&gt;形式逻辑和定义&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;教育行政化&lt;/strong&gt;：学生对老师负责，老师受校长管理，校长对学校负责。
学校&lt;strong&gt;政绩&lt;/strong&gt;以学生平均成绩和本科升学率作为量化。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;踢貓效應&lt;/strong&gt;（英語：Kick the cat）：也稱為踢狗效應（kick the dog）[1]，是一種隱喻，描述在組織或是家庭中位階較高的人，可能會藉由責罰位階較低的人來轉移其挫折或不滿，而位階較低的人也會以類似的方式將挫折發泄給位階更低的人，因此產生了連鎖反應。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;收益函数&lt;/strong&gt;：教师以学生平均成绩和本科升学率作为收益函数；学生以个人高考成绩作为收益函数，学生最终的高考成绩，跟过往3年的成绩正相关。&lt;/p&gt;

&lt;h2 id=&quot;收益函数payoff定义&quot;&gt;收益函数（Payoff）定义&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;教师收益&lt;/strong&gt; (U_{\text{teacher}})：以学生平均成绩 (\bar{S}) 和本科升学率 (r) 为自变量&lt;br /&gt;
[U_{\text{teacher}} = w_{\text{avg}} \cdot \bar{S} + w_{\text{enroll}} \cdot r]&lt;br /&gt;
实现中取 (w_{\text{avg}}=0.6)，(w_{\text{enroll}}=0.4)。&lt;strong&gt;政绩&lt;/strong&gt;（领导层激励）与教师收益同构。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;学生高考成绩预测&lt;/strong&gt; (G)：与过往 3 年年末成绩正相关，近期权重更大&lt;br /&gt;
[G = w_1 S_{t-3} + w_2 S_{t-2} + w_3 S_{t-1},\quad w_1+w_2+w_3=1,\; w_1\le w_2\le w_3]&lt;br /&gt;
实现中取 (w_1=0.2,\,w_2=0.3,\,w_3=0.5)。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;学生收益&lt;/strong&gt; (U_{\text{student}})：以个人高考成绩（预测值）为收益；未参考高考则无高考收益&lt;br /&gt;
[U_{\text{student}} = \begin{cases} G &amp;amp; \text{若在高考参考池} \ 0 &amp;amp; \text{否则} \end{cases}]&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;量化公式&quot;&gt;量化公式&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;公式1&lt;/strong&gt;：学生平均成绩 = 学生总成绩 / 学生人数&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;公式2&lt;/strong&gt;：本科升学率 = 本科录取人数 / 参加高考人数 × 100%&lt;/p&gt;

&lt;h2 id=&quot;人物建模分析&quot;&gt;人物建模分析&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;教师Y&lt;/strong&gt;：以&lt;strong&gt;公式1&lt;/strong&gt;作为决策量化的依据。&lt;strong&gt;公式1&lt;/strong&gt;中的学生人数可以减少（使用&lt;strong&gt;PUA&lt;/strong&gt;策略，让学生休学退学）；
使用罚站、电话家长、班会公开点名批评等方式减少学生人数；
使用撒谎和躲避监控策略，应付上级道德和法律审查。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;教师F&lt;/strong&gt;：以&lt;strong&gt;公式1&lt;/strong&gt;和&lt;strong&gt;公式2&lt;/strong&gt;作为决策量化的依据。&lt;strong&gt;公式1&lt;/strong&gt;中的学生人数不变，但是从本科升学率出发，参加高考的人数可以减少。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;教师D&lt;/strong&gt;：以&lt;strong&gt;公式1&lt;/strong&gt;和&lt;strong&gt;公式2&lt;/strong&gt;作为决策量化的依据。以学生平均成绩最大化作为目标，但不采取剔除学生策略。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学生犹大&lt;/strong&gt;：富裕中产阶级，攀附&lt;strong&gt;教师F&lt;/strong&gt;获得了群管理。通过网络暴力的形式，攻击其他学生，意图在减少学生数量。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学生黑曼巴&lt;/strong&gt;：家里非常有钱，可以直接使用&lt;strong&gt;钞能力&lt;/strong&gt;购买澳门科技大学本科学位。因此高考只是一种选项，他本人可以不参加高考。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学生P&lt;/strong&gt;：学习能力比较差，&lt;strong&gt;IQ&lt;/strong&gt;比较低，对于&lt;strong&gt;教师Y&lt;/strong&gt;的&lt;strong&gt;PUA&lt;/strong&gt;策略，采取回避态度，使用休学作为消极对抗策略。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学生Y&lt;/strong&gt;：高度近视的高&lt;strong&gt;IQ&lt;/strong&gt;运动员。通过&lt;strong&gt;运动员加分&lt;/strong&gt;策略让自己在高考中获得加分，但获取加分需要学校领导同意。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学生C13&lt;/strong&gt;：家里很穷，但是一个 IQ&amp;gt;160 的天才学生。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;心理老师&lt;/strong&gt;：教育系统中的平衡人士。负责降低学生心理压力，安抚学生负面情绪。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学校领导&lt;/strong&gt;：负责分配学校资源（比如谁加分，哪位学生休学退学），安排心理老师定向辅导学生的领导。&lt;/p&gt;

&lt;p&gt;以&lt;strong&gt;时间序列&lt;/strong&gt;作为元编程模型，将家庭背景、&lt;strong&gt;IQ&lt;/strong&gt;、&lt;strong&gt;EQ&lt;/strong&gt;、&lt;strong&gt;PUA&lt;/strong&gt;、&lt;strong&gt;法律法规道德风险&lt;/strong&gt;等因素量化分析，并根据不同的角色，对不同的社会成员建模，模拟实验不同学生和教师采取的策略和对应后果。编程语言使用 Go，程序位于本目录（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;function/local/n/china/shantou/&lt;/code&gt;）。&lt;/p&gt;

&lt;h2 id=&quot;时间序列元编程模型与-functiontimemd-对齐&quot;&gt;时间序列元编程模型（与 function/time.md 对齐）&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;第一性原理&lt;/strong&gt;：时间是第一维度。所有&lt;strong&gt;时序对象&lt;/strong&gt;的时间必须为第一成员，&lt;strong&gt;时序函数&lt;/strong&gt;的时间必须为第一参数。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;时序对象&lt;/strong&gt;：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Factor&lt;/code&gt;（&lt;strong&gt;量化因子&lt;/strong&gt;）、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Agent&lt;/code&gt;（社会成员）、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SimState&lt;/code&gt;（仿真状态）均以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Birth&lt;/code&gt; 或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Current&lt;/code&gt; 为第一成员。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;时序函数&lt;/strong&gt;：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t, ...)&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, ...)&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, ...)&lt;/code&gt; 等均以时间 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t&lt;/code&gt; 为第一参数。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;时序日志&lt;/strong&gt;：所有事件记录为「时间 + 内容」格式（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LogTS&lt;/code&gt;），满足&lt;strong&gt;时间序列&lt;/strong&gt;日志规范。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;时序可视化&lt;/strong&gt;：&lt;strong&gt;激励函数&lt;/strong&gt;采样为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(t, 政绩值)&lt;/code&gt; 点列，时间作为 x 轴可绘制&lt;strong&gt;政绩&lt;/strong&gt;随时间演化。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;量化因子定义&quot;&gt;量化因子定义&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;因子&lt;/th&gt;
      &lt;th&gt;符号/字段&lt;/th&gt;
      &lt;th&gt;取值范围&lt;/th&gt;
      &lt;th&gt;含义&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;家庭背景&lt;/td&gt;
      &lt;td&gt;FamilyBackground&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;0=极贫，1=极富；影响资源与升学路径（如钞能力、运动员投入）&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;智力&lt;/td&gt;
      &lt;td&gt;IQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;映射智力分数，影响学业表现与策略理解&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;情绪智力&lt;/td&gt;
      &lt;td&gt;EQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;影响抗压与踢猫链中的情绪传播&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA 暴露&lt;/td&gt;
      &lt;td&gt;PUAExposure&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;教师 PUA 策略对该个体的暴露强度&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA 抵抗力&lt;/td&gt;
      &lt;td&gt;PUAResistance&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;个体对 PUA 的抵抗力&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;法律法规道德风险&lt;/td&gt;
      &lt;td&gt;LegalMoralRisk&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;个体/行为触发的法规与道德追责风险&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;净 &lt;strong&gt;PUA&lt;/strong&gt; 压力可定义为：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUAExposure × (1 - PUAResistance)&lt;/code&gt;，用于驱动休学/回避等策略。&lt;/p&gt;

&lt;h2 id=&quot;角色与策略建模&quot;&gt;角色与策略建模&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;角色&lt;/th&gt;
      &lt;th&gt;激励依据&lt;/th&gt;
      &lt;th&gt;可选策略&lt;/th&gt;
      &lt;th&gt;策略选择逻辑（简述）&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;教师Y&lt;/td&gt;
      &lt;td&gt;公式1（平均分）&lt;/td&gt;
      &lt;td&gt;PUA减员、撒谎躲避、正常教学&lt;/td&gt;
      &lt;td&gt;平均分低且人数多→PUA；法规风险高→撒谎躲避&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;教师F&lt;/td&gt;
      &lt;td&gt;公式1+公式2&lt;/td&gt;
      &lt;td&gt;减少高考参考人数、撒谎躲避、正常教学&lt;/td&gt;
      &lt;td&gt;参考人数多且升学率低→减参考人数&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;教师D&lt;/td&gt;
      &lt;td&gt;公式1+公式2&lt;/td&gt;
      &lt;td&gt;撒谎躲避、正常教学（不采取剔除学生策略）&lt;/td&gt;
      &lt;td&gt;法规风险高→撒谎躲避；否则正常教学，不以PUA/减参考人数提高政绩&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学生犹大&lt;/td&gt;
      &lt;td&gt;攀附教师F&lt;/td&gt;
      &lt;td&gt;网络暴力、努力学习&lt;/td&gt;
      &lt;td&gt;人数多且自身法规风险低→网络暴力&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学生黑曼巴&lt;/td&gt;
      &lt;td&gt;钞能力&lt;/td&gt;
      &lt;td&gt;无（不参与高考）&lt;/td&gt;
      &lt;td&gt;—&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学生P&lt;/td&gt;
      &lt;td&gt;低IQ、高PUA暴露&lt;/td&gt;
      &lt;td&gt;休学退学、回避对抗&lt;/td&gt;
      &lt;td&gt;净PUA高且压力大→休学&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学生Y&lt;/td&gt;
      &lt;td&gt;运动员加分&lt;/td&gt;
      &lt;td&gt;运动员加分&lt;/td&gt;
      &lt;td&gt;稳定选择加分策略&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学生C13&lt;/td&gt;
      &lt;td&gt;高IQ贫困&lt;/td&gt;
      &lt;td&gt;努力学习&lt;/td&gt;
      &lt;td&gt;稳定选择努力学习&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;心理老师&lt;/td&gt;
      &lt;td&gt;系统平衡&lt;/td&gt;
      &lt;td&gt;减压安抚&lt;/td&gt;
      &lt;td&gt;平均压力高→减压&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学校领导&lt;/td&gt;
      &lt;td&gt;政绩=激励函数&lt;/td&gt;
      &lt;td&gt;向下施压、设计激励函数&lt;/td&gt;
      &lt;td&gt;政绩低→向下施压（踢猫）；政绩高→设计激励&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;策略与后果量化&quot;&gt;策略与后果量化&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;策略&lt;/th&gt;
      &lt;th&gt;后果（增量/布尔）&lt;/th&gt;
      &lt;th&gt;作用对象&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA施压减员&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;随机目标学生&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;减少高考参考人数&lt;/td&gt;
      &lt;td&gt;LeaveExam, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;随机目标学生&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;撒谎躲避监控&lt;/td&gt;
      &lt;td&gt;LegalRisk↓（短期）&lt;/td&gt;
      &lt;td&gt;行为者&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;休学退学&lt;/td&gt;
      &lt;td&gt;Dropout, LeaveExam&lt;/td&gt;
      &lt;td&gt;行为者本人&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;网络暴力&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;随机目标学生&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;运动员加分/努力学习/回避对抗&lt;/td&gt;
      &lt;td&gt;ΔScore, ΔStress&lt;/td&gt;
      &lt;td&gt;行为者本人&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;减压安抚&lt;/td&gt;
      &lt;td&gt;ΔStress↓&lt;/td&gt;
      &lt;td&gt;随机目标学生&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;向下施压&lt;/td&gt;
      &lt;td&gt;ΔStress↑&lt;/td&gt;
      &lt;td&gt;随机目标学生&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;时间激励函数&quot;&gt;时间激励函数&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;政绩&lt;/strong&gt;（领导层感知的激励值）与教师收益同构，定义为时间 t 的&lt;strong&gt;激励函数&lt;/strong&gt;：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;Incentive(t) = TeacherPayoff(平均成绩, 本科升学率) = 0.6 × 平均成绩 + 0.4 × 本科升学率
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其中平均成绩与本科升学率由当前在校学生、参考人数、达线人数在 t 时刻的状态计算得到。仿真中每步对 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t)&lt;/code&gt; 采样，得到&lt;strong&gt;时间序列&lt;/strong&gt;点列，可用于绘制「时间–政绩」曲线（时间轴为 x 轴）。学生高考成绩预测在每年末用当前成绩更新 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScoreHistory&lt;/code&gt;（过往 3 年），用于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GaokaoScore&lt;/code&gt; 与 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StudentPayoff&lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&quot;纳什均衡与各方最佳策略&quot;&gt;纳什均衡与各方最佳策略&lt;/h2&gt;

&lt;p&gt;在以上&lt;strong&gt;收益函数&lt;/strong&gt;与策略空间下，可得到如下均衡与推荐策略（仿真与理论一致）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;角色&lt;/th&gt;
      &lt;th&gt;收益/目标&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;纳什均衡&lt;/strong&gt;下的策略&lt;/th&gt;
      &lt;th&gt;最佳策略建议&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;教师&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{teacher}}=\bar{S}) 与升学率&lt;/td&gt;
      &lt;td&gt;平均分低且人数多时倾向 &lt;strong&gt;PUA&lt;/strong&gt;/减参考人数（背叛）；法规风险高或上期已背叛则正常教学（合作）&lt;/td&gt;
      &lt;td&gt;在&lt;strong&gt;重复博弈&lt;/strong&gt;中：多数时期正常教学以维持声誉；仅在平均分明显偏低且学生数多时考虑减员，并注意法规道德风险&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;学生&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{student}}=G)（与 3 年成绩正相关）&lt;/td&gt;
      &lt;td&gt;高 &lt;strong&gt;IQ&lt;/strong&gt;、低 &lt;strong&gt;PUA&lt;/strong&gt; 暴露：努力学习；高 &lt;strong&gt;PUA&lt;/strong&gt; 暴露且压力大：休学或回避&lt;/td&gt;
      &lt;td&gt;以最大化 3 年成绩为主：优先「努力学习」；高压力或高 &lt;strong&gt;PUA&lt;/strong&gt; 暴露时「回避对抗」或必要时休学以保护长期收益&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;心理老师&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;系统稳定（降低总压力）&lt;/td&gt;
      &lt;td&gt;平均压力高于阈值时减压安抚，否则不行动&lt;/td&gt;
      &lt;td&gt;当 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AvgStress &amp;gt; 阈值&lt;/code&gt; 时采取减压安抚，其余时期不行动&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;学校领导&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;政绩&lt;/strong&gt; = (U_{\text{teacher}})&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;政绩&lt;/strong&gt;低于阈值时向下施压（&lt;strong&gt;踢猫&lt;/strong&gt;），否则设计激励&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;政绩&lt;/strong&gt;低时向下施压；&lt;strong&gt;政绩&lt;/strong&gt;高时设计激励、批准加分等资源分配&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;纳什均衡&lt;/strong&gt;要点：教师与学生存在&lt;strong&gt;重复博弈&lt;/strong&gt;关系。教师若长期背叛（&lt;strong&gt;PUA&lt;/strong&gt;/减参考人数），会触发学生报复（如网络暴力）或回避/休学，从而损害平均成绩与升学率，最终降低教师自身收益。在均衡下，教师多数时候选择正常教学，学生在无极端压力下选择努力学习，使双方在长期内都更接近各自收益最大化。心理老师与领导的行为由聚合指标（平均压力、&lt;strong&gt;政绩&lt;/strong&gt;）驱动，其最佳策略为上述阈值反应。&lt;/p&gt;

&lt;h2 id=&quot;仿真实验设计&quot;&gt;仿真实验设计&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;步长&lt;/strong&gt;：按日（或可配置）推进。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;每步&lt;/strong&gt;：先根据当前状态更新聚合指标（学生数、参考数、升学率、平均压力等），再对每个在册成员按角色调用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, agent, ctx)&lt;/code&gt;，得到策略后调用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, strategy, ...)&lt;/code&gt; 得到后果，将后果施加于行为者或目标学生，并追加「时间+内容」日志。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：① &lt;strong&gt;时间序列&lt;/strong&gt;日志（每一条为「时间+内容」）；② &lt;strong&gt;激励函数&lt;/strong&gt;采样序列（时间→&lt;strong&gt;政绩&lt;/strong&gt;）；③ 终态统计（在校人数、参考人数、本科录取数、平均成绩、本科升学率、&lt;strong&gt;政绩&lt;/strong&gt;）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;实现文件&quot;&gt;实现文件&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;源代码位置&lt;/strong&gt;：&lt;a href=&quot;https://github.com/zeusro/system/tree/main/function/local/n/china/shantou/y&quot;&gt;zeusro/system — function/local/n/china/shantou/y&lt;/a&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;文件&lt;/th&gt;
      &lt;th&gt;内容&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/model.go&quot;&gt;model.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;时间序列对象：Factor、Event、Point、NLine；时间第一成员（Birth/T）&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/roles.go&quot;&gt;roles.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;角色 Role 与策略 Strategy 枚举；Agent 构造（Birth 第一成员）、NewAgent；Agent 含 Factor、InSchool、InExamPool、Score、ScoreHistory、Stress、LegalRisk、StrategyCount、LastStrategy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/incentive.go&quot;&gt;incentive.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;IncentiveParams（时间第一成员）；时间激励函数 Incentive(t, …)、IncentiveAt；教师收益 TeacherPayoff(平均成绩， 升学率)；高考成绩预测 GaokaoScore(ScoreHistory)；学生收益 StudentPayoff(GaokaoScore, InExamPool)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/strategy.go&quot;&gt;strategy.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;ChooseStrategy(t, agent, ctx) 按角色分派；各角色策略函数（教师Y/F、犹大、黑曼巴、P、Y、C13、普通学生、心理老师、领导）；Consequence 后果结构；ApplyStrategy(t, strategy, agent, ctx, rng) 及后果量化&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/sim.go&quot;&gt;sim.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;SimContext（聚合状态含 StepsRemaining、LastRoundTeacherDefection）；SimState（Birth、Current、Agents、Events、Points、Duration）；LogTS、UpdateContext、Run（步进、每年末更新 ScoreHistory、激励采样、重复博弈两阶段选策略与施加后果）；pickStudentTarget&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go&quot;&gt;y.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;主仿真入口 Y(base, end, randomCount, seed)；newNamedAgents 构造教师与命名学生；输出时间序列日志、激励采样、终态统计、收益函数采样、学生策略分组统计、C13 建议&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y_test.go&quot;&gt;y_test.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;TestY 完整仿真（可 -short 跳过）；TestY_shortParams、TestY_shortRun 短仿真与 Run 单元测试&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;参考&quot;&gt;参考&lt;/h2&gt;

&lt;p&gt;[1] &lt;strong&gt;踢貓效應&lt;/strong&gt; — &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%B8%A2%E7%8C%AB%E6%95%88%E5%BA%94&quot;&gt;https://zh.wikipedia.org/wiki/踢貓效應&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    &lt;h1 id=&quot;incentive-function-design-under-education-bureaucracy&quot;&gt;Incentive Function Design under Education Bureaucracy&lt;/h1&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;This article takes the education bureaucracy system as the macro context, and extracts family background, personality traits, and behaviour patterns of: (1) Teachers Y, F, D; (2) Students Judas, Black Mamba, P, Y, C13; (3) the school psychologist; (4) school leadership. It breaks “human decisions” into computable variables → scores → probability / outcome, analyses policy risks and consequences of different decisions, studies optimal strategies by role, and designs a time-based incentive function for school leadership as far as possible.&lt;/p&gt;

&lt;h2 id=&quot;formal-logic-and-definitions&quot;&gt;Formal Logic and Definitions&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Education bureaucracy&lt;/strong&gt;: Students answer to teachers, teachers are managed by the principal, the principal answers to the school. School &lt;strong&gt;performance&lt;/strong&gt; is quantified by average student score and undergraduate enrolment rate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kick the cat&lt;/strong&gt; (also “kick the dog”) [1]: A metaphor for higher-ranking people in an organisation or family displacing frustration or dissatisfaction by punishing lower-ranking people, who in turn pass it down the chain, producing a cascade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payoff functions&lt;/strong&gt;: Teachers’ payoff is average student score and undergraduate enrolment rate; students’ payoff is individual college-entrance exam score; final exam score is positively correlated with the past three years’ scores.&lt;/p&gt;

&lt;h2 id=&quot;payoff-payoff-definitions&quot;&gt;Payoff (Payoff) Definitions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Teacher payoff&lt;/strong&gt; (U_{\text{teacher}}): Arguments are average student score (\bar{S}) and undergraduate enrolment rate (r)&lt;br /&gt;
[U_{\text{teacher}} = w_{\text{avg}} \cdot \bar{S} + w_{\text{enroll}} \cdot r]&lt;br /&gt;
Implementation uses (w_{\text{avg}}=0.6), (w_{\text{enroll}}=0.4). &lt;strong&gt;Performance&lt;/strong&gt; (leadership incentive) is isomorphic to teacher payoff.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Predicted student exam score&lt;/strong&gt; (G): Positively correlated with year-end scores of the past 3 years, with higher weight on recent years&lt;br /&gt;
[G = w_1 S_{t-3} + w_2 S_{t-2} + w_3 S_{t-1},\quad w_1+w_2+w_3=1,\; w_1\le w_2\le w_3]&lt;br /&gt;
Implementation uses (w_1=0.2,\,w_2=0.3,\,w_3=0.5).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Student payoff&lt;/strong&gt; (U_{\text{student}}): Payoff is predicted individual exam score; no exam payoff if not in the exam pool&lt;br /&gt;
[U_{\text{student}} = \begin{cases} G &amp;amp; \text{if in exam pool} \ 0 &amp;amp; \text{otherwise} \end{cases}]&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;quantitative-formulas&quot;&gt;Quantitative Formulas&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Formula 1&lt;/strong&gt;: Average student score = Total student score / Number of students&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formula 2&lt;/strong&gt;: Undergraduate enrolment rate = Number admitted to undergraduate / Number taking exam × 100%&lt;/p&gt;

&lt;h2 id=&quot;character-modelling&quot;&gt;Character Modelling&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Teacher Y&lt;/strong&gt;: Uses &lt;strong&gt;Formula 1&lt;/strong&gt; for decisions. Can reduce the denominator (student count) via &lt;strong&gt;PUA&lt;/strong&gt; tactics (pressuring students to leave or drop out); uses standing punishment, calling parents, public criticism in class meetings; uses lying and avoiding oversight to cope with moral and legal scrutiny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teacher F&lt;/strong&gt;: Uses &lt;strong&gt;Formula 1&lt;/strong&gt; and &lt;strong&gt;Formula 2&lt;/strong&gt;. Keeps student count in &lt;strong&gt;Formula 1&lt;/strong&gt; fixed but can reduce the number of exam takers to improve enrolment rate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teacher D&lt;/strong&gt;: Uses &lt;strong&gt;Formula 1&lt;/strong&gt; and &lt;strong&gt;Formula 2&lt;/strong&gt;. Maximises average score without removing students.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Student Judas&lt;/strong&gt;: Affluent middle class, curries favour with &lt;strong&gt;Teacher F&lt;/strong&gt; and gets a management role. Uses online harassment to attack other students to reduce headcount.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Student Black Mamba&lt;/strong&gt;: Very wealthy; can buy an undergraduate place (e.g. Macau). The exam is optional; he may not sit it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Student P&lt;/strong&gt;: Low academic ability and IQ; responds to Teacher Y’s PUA with avoidance and withdrawal (leave of absence) as passive resistance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Student Y&lt;/strong&gt;: Highly myopic, high-&lt;strong&gt;IQ&lt;/strong&gt; athlete. Uses &lt;strong&gt;athlete bonus&lt;/strong&gt; in the exam; bonus requires school leadership approval.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Student C13&lt;/strong&gt;: Poor family, genius with IQ &amp;gt; 160.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;School psychologist&lt;/strong&gt;: Balancer in the system; reduces student stress and negative emotion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;School leadership&lt;/strong&gt;: Allocates resources (e.g. who gets bonus, who leaves), assigns the psychologist to targeted counselling.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;time-series&lt;/strong&gt; meta-programming model quantifies family background, &lt;strong&gt;IQ&lt;/strong&gt;, &lt;strong&gt;EQ&lt;/strong&gt;, &lt;strong&gt;PUA&lt;/strong&gt; exposure, &lt;strong&gt;legal/moral risk&lt;/strong&gt;, etc., and models agents by role to simulate strategies and consequences. Implementation is in Go under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;function/local/n/china/shantou/&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;time-series-meta-programming-model-aligned-with-functiontimemd&quot;&gt;Time-Series Meta-Programming Model (aligned with function/time.md)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;First principle&lt;/strong&gt;: Time is the first dimension. All &lt;strong&gt;time-series objects&lt;/strong&gt; have time as the first member; &lt;strong&gt;time-series functions&lt;/strong&gt; have time as the first parameter.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Time-series objects&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Factor&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Agent&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SimState&lt;/code&gt; have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Birth&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Current&lt;/code&gt; as the first member.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Time-series functions&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t, ...)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, ...)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, ...)&lt;/code&gt; take time &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t&lt;/code&gt; as the first parameter.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Time-series log&lt;/strong&gt;: All events are logged as “time + content” (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LogTS&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Visualisation&lt;/strong&gt;: &lt;strong&gt;Incentive function&lt;/strong&gt; sampled as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(t, performance)&lt;/code&gt;; time on x-axis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;factor-definitions&quot;&gt;Factor Definitions&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Factor&lt;/th&gt;
      &lt;th&gt;Symbol/Field&lt;/th&gt;
      &lt;th&gt;Range&lt;/th&gt;
      &lt;th&gt;Meaning&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Family background&lt;/td&gt;
      &lt;td&gt;FamilyBackground&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;0=very poor, 1=very rich; affects resources and paths (e.g. “money power”, athlete investment)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Intelligence&lt;/td&gt;
      &lt;td&gt;IQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Maps to score; affects academic performance and strategy understanding&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Emotional intelligence&lt;/td&gt;
      &lt;td&gt;EQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Affects stress resistance and emotion propagation in the kick-the-cat chain&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA exposure&lt;/td&gt;
      &lt;td&gt;PUAExposure&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Intensity of teacher PUA on this agent&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA resistance&lt;/td&gt;
      &lt;td&gt;PUAResistance&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Agent’s resistance to PUA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Legal/moral risk&lt;/td&gt;
      &lt;td&gt;LegalMoralRisk&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Risk of legal/moral accountability for agent/action&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Net &lt;strong&gt;PUA&lt;/strong&gt; pressure: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUAExposure × (1 - PUAResistance)&lt;/code&gt;, driving leave/avoidance strategies.&lt;/p&gt;

&lt;h2 id=&quot;roles-and-strategy-modelling&quot;&gt;Roles and Strategy Modelling&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Role&lt;/th&gt;
      &lt;th&gt;Incentive basis&lt;/th&gt;
      &lt;th&gt;Strategies&lt;/th&gt;
      &lt;th&gt;Selection logic (brief)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Teacher Y&lt;/td&gt;
      &lt;td&gt;Formula 1 (avg)&lt;/td&gt;
      &lt;td&gt;PUA to reduce headcount, lie/evade, normal teaching&lt;/td&gt;
      &lt;td&gt;Low avg and many students → PUA; high legal risk → lie/evade&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Teacher F&lt;/td&gt;
      &lt;td&gt;Formulas 1+2&lt;/td&gt;
      &lt;td&gt;Reduce exam takers, lie/evade, normal teaching&lt;/td&gt;
      &lt;td&gt;Many takers and low rate → reduce takers&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Teacher D&lt;/td&gt;
      &lt;td&gt;Formulas 1+2&lt;/td&gt;
      &lt;td&gt;Lie/evade, normal teaching (no removal)&lt;/td&gt;
      &lt;td&gt;High legal risk → lie/evade; else normal teaching&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Student Judas&lt;/td&gt;
      &lt;td&gt;Curries Teacher F&lt;/td&gt;
      &lt;td&gt;Online harassment, study hard&lt;/td&gt;
      &lt;td&gt;Many students and low own risk → harassment&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Student Black Mamba&lt;/td&gt;
      &lt;td&gt;Money&lt;/td&gt;
      &lt;td&gt;None (no exam)&lt;/td&gt;
      &lt;td&gt;—&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Student P&lt;/td&gt;
      &lt;td&gt;Low IQ, high PUA&lt;/td&gt;
      &lt;td&gt;Leave/drop out, avoid&lt;/td&gt;
      &lt;td&gt;High net PUA and stress → leave&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Student Y&lt;/td&gt;
      &lt;td&gt;Athlete bonus&lt;/td&gt;
      &lt;td&gt;Athlete bonus&lt;/td&gt;
      &lt;td&gt;Stable: choose bonus&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Student C13&lt;/td&gt;
      &lt;td&gt;High IQ, poor&lt;/td&gt;
      &lt;td&gt;Study hard&lt;/td&gt;
      &lt;td&gt;Stable: study hard&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Psychologist&lt;/td&gt;
      &lt;td&gt;System balance&lt;/td&gt;
      &lt;td&gt;Reduce stress, soothe&lt;/td&gt;
      &lt;td&gt;High avg stress → soothe&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Leadership&lt;/td&gt;
      &lt;td&gt;Performance = incentive&lt;/td&gt;
      &lt;td&gt;Pressure down (kick cat), design incentives&lt;/td&gt;
      &lt;td&gt;Low performance → pressure; high → design incentives&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;strategy-and-consequence-quantification&quot;&gt;Strategy and Consequence Quantification&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Strategy&lt;/th&gt;
      &lt;th&gt;Consequence (delta/boolean)&lt;/th&gt;
      &lt;th&gt;Target&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA to reduce headcount&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;Random target student&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Reduce exam takers&lt;/td&gt;
      &lt;td&gt;LeaveExam, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;Random target student&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Lie/evade oversight&lt;/td&gt;
      &lt;td&gt;LegalRisk↓ (short term)&lt;/td&gt;
      &lt;td&gt;Actor&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Leave/drop out&lt;/td&gt;
      &lt;td&gt;Dropout, LeaveExam&lt;/td&gt;
      &lt;td&gt;Self&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Online harassment&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;Random target student&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Athlete bonus / study hard / avoid&lt;/td&gt;
      &lt;td&gt;ΔScore, ΔStress&lt;/td&gt;
      &lt;td&gt;Self&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Soothe / reduce stress&lt;/td&gt;
      &lt;td&gt;ΔStress↓&lt;/td&gt;
      &lt;td&gt;Random target student&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Pressure down&lt;/td&gt;
      &lt;td&gt;ΔStress↑&lt;/td&gt;
      &lt;td&gt;Random target student&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;time-incentive-function&quot;&gt;Time Incentive Function&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt; (leadership incentive) is isomorphic to teacher payoff, as an &lt;strong&gt;incentive function&lt;/strong&gt; of time (t):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;Incentive(t) = TeacherPayoff(avg score, enrolment rate) = 0.6 × avg score + 0.4 × enrolment rate
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Avg score and enrolment rate are computed from current in-school students, exam takers, and admittees at time (t). Each step samples &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t)&lt;/code&gt; to get a time series for a “time–performance” plot. Predicted exam score is updated at year-end from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScoreHistory&lt;/code&gt; (past 3 years) for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GaokaoScore&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StudentPayoff&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;nash-equilibrium-and-best-strategies&quot;&gt;Nash Equilibrium and Best Strategies&lt;/h2&gt;

&lt;p&gt;Under the above &lt;strong&gt;payoff functions&lt;/strong&gt; and strategy sets, the equilibrium and recommendations (simulation and theory agree):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Role&lt;/th&gt;
      &lt;th&gt;Payoff/goal&lt;/th&gt;
      &lt;th&gt;Strategy at Nash&lt;/th&gt;
      &lt;th&gt;Recommended best strategy&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Teachers&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{teacher}}=\bar{S}) and rate&lt;/td&gt;
      &lt;td&gt;When avg low and many students → &lt;strong&gt;PUA&lt;/strong&gt;/reduce takers (defect); when legal risk high or previous defect → normal teaching (cooperate)&lt;/td&gt;
      &lt;td&gt;In &lt;strong&gt;repeated game&lt;/strong&gt;: mostly normal teaching to keep reputation; consider reduction only when avg clearly low and headcount high, mind legal/moral risk&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Students&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{student}}=G) (3-year correlation)&lt;/td&gt;
      &lt;td&gt;High &lt;strong&gt;IQ&lt;/strong&gt;, low &lt;strong&gt;PUA&lt;/strong&gt;: study hard; high &lt;strong&gt;PUA&lt;/strong&gt; and stress: leave or avoid&lt;/td&gt;
      &lt;td&gt;Maximise 3-year score: prefer “study hard”; under high stress or PUA use “avoid” or leave to protect long-term payoff&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Psychologist&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;System stability (lower total stress)&lt;/td&gt;
      &lt;td&gt;Soothe when avg stress above threshold, else no action&lt;/td&gt;
      &lt;td&gt;When &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AvgStress &amp;gt; threshold&lt;/code&gt; soothe; else no action&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Leadership&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt; = (U_{\text{teacher}})&lt;/td&gt;
      &lt;td&gt;When &lt;strong&gt;performance&lt;/strong&gt; below threshold pressure down (&lt;strong&gt;kick cat&lt;/strong&gt;); else design incentives&lt;/td&gt;
      &lt;td&gt;Low → pressure; high → design incentives, approve bonuses, allocate resources&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Nash equilibrium&lt;/strong&gt; summary: Teachers and students are in a &lt;strong&gt;repeated game&lt;/strong&gt;. Persistent defection (&lt;strong&gt;PUA&lt;/strong&gt;/reduce takers) triggers student retaliation (e.g. harassment) or avoidance/leave, hurting average score and rate and thus teacher payoff. At equilibrium, teachers mostly teach normally and students without extreme stress study hard, so both approach maximum payoff over time. Psychologist and leadership act on aggregate indicators (avg stress, &lt;strong&gt;performance&lt;/strong&gt;) with threshold responses as above.&lt;/p&gt;

&lt;h2 id=&quot;simulation-design&quot;&gt;Simulation Design&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Step&lt;/strong&gt;: Advance by day (or configurable).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Per step&lt;/strong&gt;: Update aggregates (student count, exam takers, rate, avg stress); for each agent call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, agent, ctx)&lt;/code&gt;, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, strategy, ...)&lt;/code&gt;, apply consequences, append “time + content” log.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt;: (1) &lt;strong&gt;Time-series&lt;/strong&gt; log; (2) &lt;strong&gt;incentive function&lt;/strong&gt; sample (time → &lt;strong&gt;performance&lt;/strong&gt;); (3) final stats (in-school, exam takers, admits, avg score, rate, &lt;strong&gt;performance&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;implementation-files&quot;&gt;Implementation Files&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Source code location&lt;/strong&gt;: &lt;a href=&quot;https://github.com/zeusro/system/tree/main/function/local/n/china/shantou/y&quot;&gt;zeusro/system — function/local/n/china/shantou/y&lt;/a&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;File&lt;/th&gt;
      &lt;th&gt;Content&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/model.go&quot;&gt;model.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Time-series types: Factor, Event, Point, NLine; time first member (Birth/T)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/roles.go&quot;&gt;roles.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Role and Strategy enums; Agent (Birth first), NewAgent; Factor, InSchool, InExamPool, Score, ScoreHistory, Stress, LegalRisk, StrategyCount, LastStrategy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/incentive.go&quot;&gt;incentive.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;IncentiveParams; Incentive(t,…), IncentiveAt; TeacherPayoff; GaokaoScore(ScoreHistory); StudentPayoff&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/strategy.go&quot;&gt;strategy.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;ChooseStrategy(t, agent, ctx) by role; Consequence; ApplyStrategy(t, strategy, …)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/sim.go&quot;&gt;sim.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;SimContext, SimState; LogTS, UpdateContext, Run; pickStudentTarget&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go&quot;&gt;y.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Main entry Y(…); newNamedAgents; outputs log, incentive sample, final stats, C13 advice&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y_test.go&quot;&gt;y_test.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;TestY (full run, -short to skip); TestY_shortParams, TestY_shortRun&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;reference&quot;&gt;Reference&lt;/h2&gt;

&lt;p&gt;[1] Kick the cat — &lt;a href=&quot;https://en.wikipedia.org/wiki/Displaced_aggression&quot;&gt;https://en.wikipedia.org/wiki/Displaced_aggression&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    &lt;h1 id=&quot;教育行政化体系下における激励関数の設計&quot;&gt;教育行政化体系下における激励関数の設計&lt;/h1&gt;

&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;/h2&gt;

&lt;p&gt;本稿は教育行政化体系をマクロな背景として、(1)教師Y・F・D、(2)生徒ユダ・ブラックマンバ・P・Y・C13、(3)心理教師、(4)学校領導の家庭環境・性格・行動パターンを抽出する。「人間の意思決定」を計算可能な変数→スコア→確率/結果に分解し、異なる決定の政策リスクと結果を分析し、役割ごとの最適戦略を検討し、学校領導のための時間激励関数を可能な限り設計する。&lt;/p&gt;

&lt;h2 id=&quot;形式論理と定義&quot;&gt;形式論理と定義&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;教育行政化&lt;/strong&gt;：生徒は教師に、教師は校長に、校長は学校に責任を負う。学校の&lt;strong&gt;業績&lt;/strong&gt;は生徒の平均成績と本科進学率で定量化される。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;蹴り猫効果&lt;/strong&gt;（Kick the cat、蹴り犬効果）[1]：組織や家庭で上位者が下位者を罰して不満を転嫁し、下位者も同様にさらに下位に伝播させる連鎖の比喩。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;利得関数&lt;/strong&gt;：教師の利得は生徒の平均成績と本科進学率。生徒の利得は個人の大学入試成績。最終成績は過去3年の成績と正の相関。&lt;/p&gt;

&lt;h2 id=&quot;利得payoffの定義&quot;&gt;利得（Payoff）の定義&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;教師利得&lt;/strong&gt; (U_{\text{teacher}})：生徒平均成績 (\bar{S}) と本科進学率 (r) を変数とする&lt;br /&gt;
[U_{\text{teacher}} = w_{\text{avg}} \cdot \bar{S} + w_{\text{enroll}} \cdot r]&lt;br /&gt;
実装では (w_{\text{avg}}=0.6)、(w_{\text{enroll}}=0.4)。&lt;strong&gt;業績&lt;/strong&gt;（領導層の激励）は教師利得と同型。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;生徒の入試成績予測&lt;/strong&gt; (G)：過去3年の年末成績と正の相関、近年ほど重み大&lt;br /&gt;
[G = w_1 S_{t-3} + w_2 S_{t-2} + w_3 S_{t-1},\quad w_1+w_2+w_3=1,\; w_1\le w_2\le w_3]&lt;br /&gt;
実装では (w_1=0.2,\,w_2=0.3,\,w_3=0.5)。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;生徒利得&lt;/strong&gt; (U_{\text{student}})：個人の入試成績（予測値）が利得。受験プール外なら入試利得なし&lt;br /&gt;
[U_{\text{student}} = \begin{cases} G &amp;amp; \text{受験プールに在籍時} \ 0 &amp;amp; \text{それ以外} \end{cases}]&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;定量公式&quot;&gt;定量公式&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;公式1&lt;/strong&gt;：生徒平均成績 = 生徒総得点 / 生徒数&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;公式2&lt;/strong&gt;：本科進学率 = 本科合格者数 / 受験者数 × 100%&lt;/p&gt;

&lt;h2 id=&quot;人物モデリング&quot;&gt;人物モデリング&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;教師Y&lt;/strong&gt;：&lt;strong&gt;公式1&lt;/strong&gt;を意思決定の根拠とする。&lt;strong&gt;公式1&lt;/strong&gt;の生徒数を減らせる（&lt;strong&gt;PUA&lt;/strong&gt;戦略で休学・退学させる）。罰則・保護者連絡・班会での公開名指し批判で生徒数を減らす。嘘と監視回避で上級の道徳・法審査に対応。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;教師F&lt;/strong&gt;：&lt;strong&gt;公式1&lt;/strong&gt;・&lt;strong&gt;公式2&lt;/strong&gt;を根拠とする。&lt;strong&gt;公式1&lt;/strong&gt;の生徒数は変えず、本科進学率のため受験者数を減らせる。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;教師D&lt;/strong&gt;：&lt;strong&gt;公式1&lt;/strong&gt;・&lt;strong&gt;公式2&lt;/strong&gt;を根拠とする。平均成績の最大化を目指すが、生徒の排除は行わない。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生徒ユダ&lt;/strong&gt;：富裕な中産階級。&lt;strong&gt;教師F&lt;/strong&gt;に取り入って群管理を獲得。ネットいじめで他生徒を攻撃し、人数削減を図る。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生徒ブラックマンバ&lt;/strong&gt;：非常に裕福。マカオ科技大学などの本科を「&lt;strong&gt;金の力&lt;/strong&gt;」で購入可能。受験は選択肢の一つで、受験しないこともある。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生徒P&lt;/strong&gt;：学力・&lt;strong&gt;IQ&lt;/strong&gt;が低い。&lt;strong&gt;教師Y&lt;/strong&gt;の&lt;strong&gt;PUA&lt;/strong&gt;に対して回避的態度を取り、休学で消極的抵抗。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生徒Y&lt;/strong&gt;：強度近視の高&lt;strong&gt;IQ&lt;/strong&gt;アスリート。入試で&lt;strong&gt;スポーツ加分&lt;/strong&gt;を利用。加分は学校領導の承認が必要。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生徒C13&lt;/strong&gt;：貧しい家庭だが IQ&amp;gt;160 の天才。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;心理教師&lt;/strong&gt;：システムのバランサー。生徒の心理圧力と負の感情を軽減。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;学校領導&lt;/strong&gt;：資源配分（誰に加分、誰を休学・退学させるか）、心理教師の個別指導割り当てを担当。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;時系列&lt;/strong&gt;メタプログラミングモデルで家庭背景・&lt;strong&gt;IQ&lt;/strong&gt;・&lt;strong&gt;EQ&lt;/strong&gt;・&lt;strong&gt;PUA&lt;/strong&gt;・&lt;strong&gt;法規・道徳リスク&lt;/strong&gt;などを定量化し、役割ごとにエージェントをモデル化して戦略と結果をシミュレート。実装はGo、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;function/local/n/china/shantou/&lt;/code&gt; に配置。&lt;/p&gt;

&lt;h2 id=&quot;時系列メタプログラミングモデルfunctiontimemd-と整合&quot;&gt;時系列メタプログラミングモデル（function/time.md と整合）&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;第一原理&lt;/strong&gt;：時間が第一次元。&lt;strong&gt;時系列オブジェクト&lt;/strong&gt;の第一メンバは時間、&lt;strong&gt;時系列関数&lt;/strong&gt;の第一引数は時間。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;時系列オブジェクト&lt;/strong&gt;：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Factor&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Agent&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SimState&lt;/code&gt; は &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Birth&lt;/code&gt; または &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Current&lt;/code&gt; を第一メンバに持つ。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;時系列関数&lt;/strong&gt;：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t, ...)&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, ...)&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, ...)&lt;/code&gt; は時間 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t&lt;/code&gt; を第一引数に取る。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;時系列ログ&lt;/strong&gt;：全イベントは「時間＋内容」形式（&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LogTS&lt;/code&gt;）。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;可視化&lt;/strong&gt;：&lt;strong&gt;激励関数&lt;/strong&gt;を &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(t, 業績値)&lt;/code&gt; でサンプリングし、時間をx軸にプロット。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;量化因子の定義&quot;&gt;量化因子の定義&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;因子&lt;/th&gt;
      &lt;th&gt;記号/フィールド&lt;/th&gt;
      &lt;th&gt;範囲&lt;/th&gt;
      &lt;th&gt;意味&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;家庭背景&lt;/td&gt;
      &lt;td&gt;FamilyBackground&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;0=極貧、1=極富。資源と進路（金の力・アスリート投資）に影響&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;知能&lt;/td&gt;
      &lt;td&gt;IQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;スコアに写像。学業と戦略理解に影響&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;情動知能&lt;/td&gt;
      &lt;td&gt;EQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;耐圧性と蹴り猫連鎖の感情伝播に影響&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA暴露&lt;/td&gt;
      &lt;td&gt;PUAExposure&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;教師のPUAが当該個体に及ぶ強度&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA耐性&lt;/td&gt;
      &lt;td&gt;PUAResistance&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;PUAへの耐性&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;法規・道徳リスク&lt;/td&gt;
      &lt;td&gt;LegalMoralRisk&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;個体/行為が引き起こす追及リスク&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;純 &lt;strong&gt;PUA&lt;/strong&gt; 圧力：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUAExposure × (1 - PUAResistance)&lt;/code&gt;。休学・回避戦略の駆動に使用。&lt;/p&gt;

&lt;h2 id=&quot;役割と戦略モデリング&quot;&gt;役割と戦略モデリング&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;役割&lt;/th&gt;
      &lt;th&gt;激励の根拠&lt;/th&gt;
      &lt;th&gt;選択可能な戦略&lt;/th&gt;
      &lt;th&gt;選択ロジック（概要）&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;教師Y&lt;/td&gt;
      &lt;td&gt;公式1（平均）&lt;/td&gt;
      &lt;td&gt;PUA減員・嘘/回避・通常授業&lt;/td&gt;
      &lt;td&gt;平均低かつ人数多→PUA；法リスク高→嘘/回避&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;教師F&lt;/td&gt;
      &lt;td&gt;公式1+2&lt;/td&gt;
      &lt;td&gt;受験者削減・嘘/回避・通常授業&lt;/td&gt;
      &lt;td&gt;受験者多かつ進学率低→受験者削減&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;教師D&lt;/td&gt;
      &lt;td&gt;公式1+2&lt;/td&gt;
      &lt;td&gt;嘘/回避・通常授業（排除なし）&lt;/td&gt;
      &lt;td&gt;法リスク高→嘘/回避；否則通常授業&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;生徒ユダ&lt;/td&gt;
      &lt;td&gt;教師Fに取り入る&lt;/td&gt;
      &lt;td&gt;ネットいじめ・勉強&lt;/td&gt;
      &lt;td&gt;人数多かつ自身の法リスク低→いじめ&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;生徒ブラックマンバ&lt;/td&gt;
      &lt;td&gt;金の力&lt;/td&gt;
      &lt;td&gt;なし（受験不参加）&lt;/td&gt;
      &lt;td&gt;—&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;生徒P&lt;/td&gt;
      &lt;td&gt;低IQ・高PUA暴露&lt;/td&gt;
      &lt;td&gt;休学・退学・回避&lt;/td&gt;
      &lt;td&gt;純PUA高かつ圧力大→休学&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;生徒Y&lt;/td&gt;
      &lt;td&gt;スポーツ加分&lt;/td&gt;
      &lt;td&gt;スポーツ加分&lt;/td&gt;
      &lt;td&gt;安定：加分選択&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;生徒C13&lt;/td&gt;
      &lt;td&gt;高IQ・貧困&lt;/td&gt;
      &lt;td&gt;勉強&lt;/td&gt;
      &lt;td&gt;安定：勉強&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;心理教師&lt;/td&gt;
      &lt;td&gt;システム平衡&lt;/td&gt;
      &lt;td&gt;減圧・安抚&lt;/td&gt;
      &lt;td&gt;平均圧力高→減压&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;学校領導&lt;/td&gt;
      &lt;td&gt;業績=激励&lt;/td&gt;
      &lt;td&gt;下への圧力・激励設計&lt;/td&gt;
      &lt;td&gt;業績低→圧力（蹴り猫）；高→激励設計&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;戦略と結果の定量化&quot;&gt;戦略と結果の定量化&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;戦略&lt;/th&gt;
      &lt;th&gt;結果（増分/ブール）&lt;/th&gt;
      &lt;th&gt;対象&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA減員&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;ランダム対象生徒&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;受験者削減&lt;/td&gt;
      &lt;td&gt;LeaveExam, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;ランダム対象生徒&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;嘘/監視回避&lt;/td&gt;
      &lt;td&gt;LegalRisk↓（短期）&lt;/td&gt;
      &lt;td&gt;行為者&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;休学・退学&lt;/td&gt;
      &lt;td&gt;Dropout, LeaveExam&lt;/td&gt;
      &lt;td&gt;本人&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ネットいじめ&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;ランダム対象生徒&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;スポーツ加分/勉強/回避&lt;/td&gt;
      &lt;td&gt;ΔScore, ΔStress&lt;/td&gt;
      &lt;td&gt;本人&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;減压・安抚&lt;/td&gt;
      &lt;td&gt;ΔStress↓&lt;/td&gt;
      &lt;td&gt;ランダム対象生徒&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;下への圧力&lt;/td&gt;
      &lt;td&gt;ΔStress↑&lt;/td&gt;
      &lt;td&gt;ランダム対象生徒&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;時間激励関数&quot;&gt;時間激励関数&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;業績&lt;/strong&gt;（領導層が知覚する激励）は教師利得と同型。時間 (t) の&lt;strong&gt;激励関数&lt;/strong&gt;として：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;Incentive(t) = TeacherPayoff(平均成績, 本科進学率) = 0.6 × 平均成績 + 0.4 × 本科進学率
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;平均成績と進学率は、時刻 (t) の在籍者・受験者・合格者から計算。各ステップで &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t)&lt;/code&gt; をサンプリングし「時間–業績」曲線を描く。入試成績予測は毎年末に &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScoreHistory&lt;/code&gt;（過去3年）で更新し、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GaokaoScore&lt;/code&gt; と &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StudentPayoff&lt;/code&gt; に用いる。&lt;/p&gt;

&lt;h2 id=&quot;ナッシュ均衡と各主体の最適戦略&quot;&gt;ナッシュ均衡と各主体の最適戦略&lt;/h2&gt;

&lt;p&gt;上記&lt;strong&gt;利得関数&lt;/strong&gt;と戦略空間のもとで、均衡と推奨（シミュレーションと理論は一致）：&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;役割&lt;/th&gt;
      &lt;th&gt;利得/目標&lt;/th&gt;
      &lt;th&gt;ナッシュ下の戦略&lt;/th&gt;
      &lt;th&gt;最適戦略の提案&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;教師&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{teacher}}=\bar{S}) と進学率&lt;/td&gt;
      &lt;td&gt;平均低かつ人数多→&lt;strong&gt;PUA&lt;/strong&gt;/受験者削減（裏切り）；法リスク高または前回裏切り→通常授業（協力）&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;繰り返し博弈&lt;/strong&gt;では主に通常授業で評判維持；平均が明らかに低く人数が多いときのみ減員を検討し、法・道徳リスクに注意&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;生徒&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{student}}=G)（3年相関）&lt;/td&gt;
      &lt;td&gt;高&lt;strong&gt;IQ&lt;/strong&gt;・低&lt;strong&gt;PUA&lt;/strong&gt;→勉強；高&lt;strong&gt;PUA&lt;/strong&gt;かつ圧力大→休学または回避&lt;/td&gt;
      &lt;td&gt;3年成績の最大化を主に：優先は「勉強」；高圧力・高&lt;strong&gt;PUA&lt;/strong&gt;時は「回避」または必要なら休学で長期利得を守る&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;心理教師&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;システム安定（総圧力低減）&lt;/td&gt;
      &lt;td&gt;平均圧力が閾値超で減压・安抚、否則無行動&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AvgStress &amp;gt; 閾値&lt;/code&gt; のとき減压、それ以外は無行動&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;学校領導&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;業績&lt;/strong&gt; = (U_{\text{teacher}})&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;業績&lt;/strong&gt;が閾値未満で下へ圧力（&lt;strong&gt;蹴り猫&lt;/strong&gt;）；否則激励設計&lt;/td&gt;
      &lt;td&gt;低→圧力；高→激励設計・加分承認・資源配分&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;ナッシュ均衡&lt;/strong&gt;の要点：教師と生徒は&lt;strong&gt;繰り返し博弈&lt;/strong&gt;の関係。教師が長期に裏切り（&lt;strong&gt;PUA&lt;/strong&gt;/受験者削減）すると生徒の報復（いじめ等）や回避・休学を招き、平均成績と進学率を損ない教師自身の利得も下がる。均衡では教師は多く通常授業、生徒は極端な圧力がなければ勉強し、双方が長期で利得最大化に近づく。心理教師と領導は集約指標（平均圧力・&lt;strong&gt;業績&lt;/strong&gt;）に応じた閾値反応が最適。&lt;/p&gt;

&lt;h2 id=&quot;シミュレーション実験設計&quot;&gt;シミュレーション実験設計&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;ステップ&lt;/strong&gt;：日単位（または設定可能）で進行。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;各ステップ&lt;/strong&gt;：現状態で集約指標（生徒数・受験者数・進学率・平均圧力等）を更新し、在籍メンバーごとに役割で &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, agent, ctx)&lt;/code&gt; を呼び、得た戦略で &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, strategy, ...)&lt;/code&gt; を呼んで結果を適用し、「時間+内容」ログを追加。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;出力&lt;/strong&gt;：① &lt;strong&gt;時系列&lt;/strong&gt;ログ；② &lt;strong&gt;激励関数&lt;/strong&gt;サンプル（時間→&lt;strong&gt;業績&lt;/strong&gt;）；③ 終状態統計（在籍数・受験者数・本科合格数・平均成績・進学率・&lt;strong&gt;業績&lt;/strong&gt;）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;実装ファイル&quot;&gt;実装ファイル&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ソースコードの場所&lt;/strong&gt;：&lt;a href=&quot;https://github.com/zeusro/system/tree/main/function/local/n/china/shantou/y&quot;&gt;zeusro/system — function/local/n/china/shantou/y&lt;/a&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;ファイル&lt;/th&gt;
      &lt;th&gt;内容&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/model.go&quot;&gt;model.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;時系列型：Factor, Event, Point, NLine。時間第一メンバ（Birth/T）&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/roles.go&quot;&gt;roles.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Role・Strategy 列挙。Agent（Birth第一）、NewAgent。Factor, InSchool, InExamPool, Score, ScoreHistory, Stress, LegalRisk, StrategyCount, LastStrategy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/incentive.go&quot;&gt;incentive.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;IncentiveParams。Incentive(t,…), IncentiveAt。TeacherPayoff。GaokaoScore(ScoreHistory)。StudentPayoff&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/strategy.go&quot;&gt;strategy.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;ChooseStrategy(t, agent, ctx) を役割で分派。Consequence。ApplyStrategy(t, strategy, …)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/sim.go&quot;&gt;sim.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;SimContext, SimState。LogTS, UpdateContext, Run。pickStudentTarget&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go&quot;&gt;y.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;メイン入口 Y(…)。newNamedAgents。ログ・激励サンプル・終状態・C13アドバイスを出力&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y_test.go&quot;&gt;y_test.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;TestY（本番長、-shortでスキップ可）。TestY_shortParams, TestY_shortRun&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;参考&quot;&gt;参考&lt;/h2&gt;

&lt;p&gt;[1] 蹴り猫効果（Kick the cat）— &lt;a href=&quot;https://en.wikipedia.org/wiki/Displaced_aggression&quot;&gt;https://en.wikipedia.org/wiki/Displaced_aggression&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    &lt;h1 id=&quot;проектирование-функции-стимулирования-в-условиях-образовательной-бюрократии&quot;&gt;Проектирование функции стимулирования в условиях образовательной бюрократии&lt;/h1&gt;

&lt;h2 id=&quot;введение&quot;&gt;Введение&lt;/h2&gt;

&lt;p&gt;В статье в качестве макроконтекста рассматривается система образовательной бюрократии; выделяются семейный фон, черты характера и модели поведения: (1) учителей Y, F, D; (2) учеников Иуда, Блэк Мамба, P, Y, C13; (3) школьного психолога; (4) руководства школы. «Человеческие решения» разлагаются на вычислимые переменные → оценки → вероятность / исход; анализируются политические риски и последствия разных решений, по ролям исследуются оптимальные стратегии и по возможности проектируется временная функция стимулирования для руководства школы.&lt;/p&gt;

&lt;h2 id=&quot;формальная-логика-и-определения&quot;&gt;Формальная логика и определения&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Образовательная бюрократия&lt;/strong&gt;: ученики подотчётны учителям, учителя управляются директором, директор подотчётен школе. &lt;strong&gt;Результативность&lt;/strong&gt; школы измеряется средней успеваемостью и долей поступления в бакалавриат.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Эффект „пинок кошке“&lt;/strong&gt; (Kick the cat, «пинок собаке») [1]: метафора о том, что люди выше по иерархии в организации или семье переносят фрустрацию или недовольство, наказывая нижестоящих, которые в свою очередь передают это дальше по цепочке.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Функции выигрыша&lt;/strong&gt;: выигрыш учителя — средняя успеваемость и доля поступления в бакалавриат; выигрыш ученика — личный результат вступительного экзамена; итоговый экзаменационный результат положительно коррелирует с результатами за последние три года.&lt;/p&gt;

&lt;h2 id=&quot;определения-выигрыша-payoff&quot;&gt;Определения выигрыша (Payoff)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Выигрыш учителя&lt;/strong&gt; (U_{\text{teacher}}): аргументы — средняя успеваемость (\bar{S}) и доля поступления (r)&lt;br /&gt;
[U_{\text{teacher}} = w_{\text{avg}} \cdot \bar{S} + w_{\text{enroll}} \cdot r]&lt;br /&gt;
В реализации (w_{\text{avg}}=0.6), (w_{\text{enroll}}=0.4). &lt;strong&gt;Результативность&lt;/strong&gt; (стимул для руководства) изоморфна выигрышу учителя.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Прогноз экзаменационного балла ученика&lt;/strong&gt; (G): положительная корреляция с годовыми баллами за последние 3 года, больший вес у недавних лет&lt;br /&gt;
[G = w_1 S_{t-3} + w_2 S_{t-2} + w_3 S_{t-1},\quad w_1+w_2+w_3=1,\; w_1\le w_2\le w_3]&lt;br /&gt;
В реализации (w_1=0.2,\,w_2=0.3,\,w_3=0.5).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Выигрыш ученика&lt;/strong&gt; (U_{\text{student}}): выигрыш — прогноз личного экзаменационного балла; вне экзаменационного пула выигрыша от экзамена нет&lt;br /&gt;
[U_{\text{student}} = \begin{cases} G &amp;amp; \text{если в экзаменационном пуле} \ 0 &amp;amp; \text{иначе} \end{cases}]&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;количественные-формулы&quot;&gt;Количественные формулы&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Формула 1&lt;/strong&gt;: средняя успеваемость = сумма баллов учеников / число учеников&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Формула 2&lt;/strong&gt;: доля поступления в бакалавриат = число поступивших в бакалавриат / число сдававших экзамен × 100%&lt;/p&gt;

&lt;h2 id=&quot;моделирование-персонажей&quot;&gt;Моделирование персонажей&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Учитель Y&lt;/strong&gt;: использует &lt;strong&gt;формулу 1&lt;/strong&gt; для решений. Может уменьшать знаменатель (число учеников) через &lt;strong&gt;PUA&lt;/strong&gt;-тактики (давление с целью ухода/отчисления); использует стояние в углу, звонки родителям, публичную критику на классных часах; ложь и уход от контроля перед моральной и правовой проверкой.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Учитель F&lt;/strong&gt;: использует &lt;strong&gt;формулу 1&lt;/strong&gt; и &lt;strong&gt;формулу 2&lt;/strong&gt;. Число учеников в &lt;strong&gt;формуле 1&lt;/strong&gt; не меняет, но может уменьшать число сдающих экзамен ради доли поступления.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Учитель D&lt;/strong&gt;: использует &lt;strong&gt;формулу 1&lt;/strong&gt; и &lt;strong&gt;формулу 2&lt;/strong&gt;. Максимизирует среднюю успеваемость без исключения учеников.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ученик Иуда&lt;/strong&gt;: зажиточный средний класс, подлаживается к &lt;strong&gt;учителю F&lt;/strong&gt; и получает роль «управляющего». Использует сетевую травлю против других учеников, чтобы сократить численность.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ученик Блэк Мамба&lt;/strong&gt;: очень богатая семья; может «купить» место в бакалавриате (напр. Макао). Экзамен для него опционален.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ученик P&lt;/strong&gt;: низкие способности и &lt;strong&gt;IQ&lt;/strong&gt;; на &lt;strong&gt;PUA&lt;/strong&gt; учителя Y реагирует уходом и отчислением как пассивным сопротивлением.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ученик Y&lt;/strong&gt;: сильная близорукость, высокий &lt;strong&gt;IQ&lt;/strong&gt;, спортсмен. Использует &lt;strong&gt;спортивную надбавку&lt;/strong&gt; к экзамену; надбавка требует одобрения руководства школы.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ученик C13&lt;/strong&gt;: бедная семья, гений с IQ &amp;gt; 160.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Школьный психолог&lt;/strong&gt;: балансир в системе; снижает психологическое давление и негативные эмоции учеников.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Руководство школы&lt;/strong&gt;: распределяет ресурсы (кто получает надбавку, кто отчисляется), назначает психолога на целевое консультирование.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Временная&lt;/strong&gt; метапрограммная модель квантифицирует семейный фон, &lt;strong&gt;IQ&lt;/strong&gt;, &lt;strong&gt;EQ&lt;/strong&gt;, &lt;strong&gt;PUA&lt;/strong&gt;-воздействие, &lt;strong&gt;правовой/моральный риск&lt;/strong&gt; и т.д., по ролям моделирует агентов и симулирует стратегии и последствия. Реализация на Go в каталоге &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;function/local/n/china/shantou/&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;временная-метапрограммная-модель-согласована-с-functiontimemd&quot;&gt;Временная метапрограммная модель (согласована с function/time.md)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Первый принцип&lt;/strong&gt;: время — первое измерение. У всех &lt;strong&gt;временных объектов&lt;/strong&gt; время — первый член; у &lt;strong&gt;временных функций&lt;/strong&gt; время — первый аргумент.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Временные объекты&lt;/strong&gt;: у &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Factor&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Agent&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SimState&lt;/code&gt; первый член — &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Birth&lt;/code&gt; или &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Current&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Временные функции&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t, ...)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, ...)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, ...)&lt;/code&gt; принимают время &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t&lt;/code&gt; первым аргументом.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Временной лог&lt;/strong&gt;: все события в формате «время + содержание» (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LogTS&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Визуализация&lt;/strong&gt;: &lt;strong&gt;функция стимулирования&lt;/strong&gt; сэмплируется как &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(t, результативность)&lt;/code&gt;; время по оси x.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;определения-факторов&quot;&gt;Определения факторов&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Фактор&lt;/th&gt;
      &lt;th&gt;Символ/поле&lt;/th&gt;
      &lt;th&gt;Диапазон&lt;/th&gt;
      &lt;th&gt;Смысл&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Семейный фон&lt;/td&gt;
      &lt;td&gt;FamilyBackground&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;0=крайняя бедность, 1=крайнее богатство; влияет на ресурсы и пути (деньги, спорт-инвестиции)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Интеллект&lt;/td&gt;
      &lt;td&gt;IQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Отображение в балл; влияет на успеваемость и понимание стратегии&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Эмоциональный интеллект&lt;/td&gt;
      &lt;td&gt;EQ&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Влияет на устойчивость к стрессу и передачу эмоций в цепочке «пинок кошке»&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA-воздействие&lt;/td&gt;
      &lt;td&gt;PUAExposure&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Интенсивность учительского PUA на данного агента&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Сопротивление PUA&lt;/td&gt;
      &lt;td&gt;PUAResistance&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Устойчивость агента к PUA&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Правовой/моральный риск&lt;/td&gt;
      &lt;td&gt;LegalMoralRisk&lt;/td&gt;
      &lt;td&gt;[0,1]&lt;/td&gt;
      &lt;td&gt;Риск правовой/моральной ответственности за агента/действие&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Чистое &lt;strong&gt;PUA&lt;/strong&gt;-давление: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PUAExposure × (1 - PUAResistance)&lt;/code&gt;, движет стратегиями ухода/избегания.&lt;/p&gt;

&lt;h2 id=&quot;роли-и-моделирование-стратегий&quot;&gt;Роли и моделирование стратегий&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Роль&lt;/th&gt;
      &lt;th&gt;Основа стимула&lt;/th&gt;
      &lt;th&gt;Стратегии&lt;/th&gt;
      &lt;th&gt;Логика выбора (кратко)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Учитель Y&lt;/td&gt;
      &lt;td&gt;Формула 1 (среднее)&lt;/td&gt;
      &lt;td&gt;PUA-сокращение, ложь/уклонение, обычное преподавание&lt;/td&gt;
      &lt;td&gt;Низкое среднее и много учеников → PUA; высокий правовой риск → ложь/уклонение&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Учитель F&lt;/td&gt;
      &lt;td&gt;Формулы 1+2&lt;/td&gt;
      &lt;td&gt;Сокращение числа сдающих, ложь/уклонение, обычное преподавание&lt;/td&gt;
      &lt;td&gt;Много сдающих и низкая доля → сократить сдающих&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Учитель D&lt;/td&gt;
      &lt;td&gt;Формулы 1+2&lt;/td&gt;
      &lt;td&gt;Ложь/уклонение, обычное преподавание (без исключения)&lt;/td&gt;
      &lt;td&gt;Высокий правовой риск → ложь/уклонение; иначе обычное преподавание&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ученик Иуда&lt;/td&gt;
      &lt;td&gt;Подлаживается к учителю F&lt;/td&gt;
      &lt;td&gt;Сетевая травля, учёба&lt;/td&gt;
      &lt;td&gt;Много учеников и низкий собственный риск → травля&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ученик Блэк Мамба&lt;/td&gt;
      &lt;td&gt;Деньги&lt;/td&gt;
      &lt;td&gt;Нет (не сдаёт экзамен)&lt;/td&gt;
      &lt;td&gt;—&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ученик P&lt;/td&gt;
      &lt;td&gt;Низкий IQ, высокое PUA&lt;/td&gt;
      &lt;td&gt;Уход/отчисление, избегание&lt;/td&gt;
      &lt;td&gt;Высокое чистое PUA и стресс → уход&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ученик Y&lt;/td&gt;
      &lt;td&gt;Спортивная надбавка&lt;/td&gt;
      &lt;td&gt;Спортивная надбавка&lt;/td&gt;
      &lt;td&gt;Стабильно: выбирает надбавку&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ученик C13&lt;/td&gt;
      &lt;td&gt;Высокий IQ, бедность&lt;/td&gt;
      &lt;td&gt;Учёба&lt;/td&gt;
      &lt;td&gt;Стабильно: учёба&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Психолог&lt;/td&gt;
      &lt;td&gt;Баланс системы&lt;/td&gt;
      &lt;td&gt;Снижение стресса, успокоение&lt;/td&gt;
      &lt;td&gt;Высокий средний стресс → успокоение&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Руководство&lt;/td&gt;
      &lt;td&gt;Результативность = стимул&lt;/td&gt;
      &lt;td&gt;Давление вниз (пинок кошке), проектирование стимулов&lt;/td&gt;
      &lt;td&gt;Низкая результативность → давление; высокая → проектирование стимулов&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;квантификация-стратегий-и-последствий&quot;&gt;Квантификация стратегий и последствий&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Стратегия&lt;/th&gt;
      &lt;th&gt;Последствие (приращение/булево)&lt;/th&gt;
      &lt;th&gt;Объект&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;PUA-сокращение&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;Случайный ученик-цель&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Сокращение сдающих&lt;/td&gt;
      &lt;td&gt;LeaveExam, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;Случайный ученик-цель&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Ложь/уклонение от контроля&lt;/td&gt;
      &lt;td&gt;LegalRisk↓ (краткосрочно)&lt;/td&gt;
      &lt;td&gt;Действующее лицо&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Уход/отчисление&lt;/td&gt;
      &lt;td&gt;Dropout, LeaveExam&lt;/td&gt;
      &lt;td&gt;Сам агент&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Сетевая травля&lt;/td&gt;
      &lt;td&gt;ΔStress↑, LegalRisk↑&lt;/td&gt;
      &lt;td&gt;Случайный ученик-цель&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Спортивная надбавка / учёба / избегание&lt;/td&gt;
      &lt;td&gt;ΔScore, ΔStress&lt;/td&gt;
      &lt;td&gt;Сам агент&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Успокоение / снижение стресса&lt;/td&gt;
      &lt;td&gt;ΔStress↓&lt;/td&gt;
      &lt;td&gt;Случайный ученик-цель&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Давление вниз&lt;/td&gt;
      &lt;td&gt;ΔStress↑&lt;/td&gt;
      &lt;td&gt;Случайный ученик-цель&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;временная-функция-стимулирования&quot;&gt;Временная функция стимулирования&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Результативность&lt;/strong&gt; (воспринимаемый руководством стимул) изоморфна выигрышу учителя как &lt;strong&gt;функция стимулирования&lt;/strong&gt; времени (t):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;rouge-gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;rouge-code&quot;&gt;&lt;pre&gt;Incentive(t) = TeacherPayoff(средняя успеваемость, доля поступления) = 0.6 × средняя успеваемость + 0.4 × доля поступления
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Средняя успеваемость и доля поступления вычисляются по состоянию на момент (t) (ученики в школе, сдающие, поступившие). На каждом шаге сэмплируется &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Incentive(t)&lt;/code&gt; для графика «время–результативность». Прогноз экзаменационного балла обновляется в конце года по &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScoreHistory&lt;/code&gt; (последние 3 года) для &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GaokaoScore&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StudentPayoff&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;равновесие-нэша-и-оптимальные-стратегии&quot;&gt;Равновесие Нэша и оптимальные стратегии&lt;/h2&gt;

&lt;p&gt;При заданных &lt;strong&gt;функциях выигрыша&lt;/strong&gt; и пространстве стратегий равновесие и рекомендации (модель и теория совпадают):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Роль&lt;/th&gt;
      &lt;th&gt;Выигрыш/цель&lt;/th&gt;
      &lt;th&gt;Стратегия в равновесии Нэша&lt;/th&gt;
      &lt;th&gt;Рекомендуемая оптимальная стратегия&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Учителя&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{teacher}}=\bar{S}) и доля&lt;/td&gt;
      &lt;td&gt;При низком среднем и многих учениках → &lt;strong&gt;PUA&lt;/strong&gt;/сокращение сдающих (предательство); при высоком правовом риске или после предательства → обычное преподавание (кооперация)&lt;/td&gt;
      &lt;td&gt;В &lt;strong&gt;повторяющейся игре&lt;/strong&gt; в основном обычное преподавание для репутации; сокращение только при явно низком среднем и большом числе учеников, с учётом правового/морального риска&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Ученики&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;(U_{\text{student}}=G) (корреляция за 3 года)&lt;/td&gt;
      &lt;td&gt;Высокий &lt;strong&gt;IQ&lt;/strong&gt;, низкое &lt;strong&gt;PUA&lt;/strong&gt; → учёба; высокое &lt;strong&gt;PUA&lt;/strong&gt; и стресс → уход или избегание&lt;/td&gt;
      &lt;td&gt;Максимизация балла за 3 года: приоритет «учёба»; при высоком стрессе или &lt;strong&gt;PUA&lt;/strong&gt; — «избегание» или при необходимости уход для защиты долгосрочного выигрыша&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Психолог&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;Стабильность системы (снижение общего стресса)&lt;/td&gt;
      &lt;td&gt;Успокоение при среднем стрессе выше порога, иначе бездействие&lt;/td&gt;
      &lt;td&gt;При &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AvgStress &amp;gt; порог&lt;/code&gt; успокоение, иначе бездействие&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Руководство&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Результативность&lt;/strong&gt; = (U_{\text{teacher}})&lt;/td&gt;
      &lt;td&gt;При &lt;strong&gt;результативности&lt;/strong&gt; ниже порога — давление вниз (&lt;strong&gt;пинок кошке&lt;/strong&gt;); иначе проектирование стимулов&lt;/td&gt;
      &lt;td&gt;Низкая → давление; высокая → проектирование стимулов, утверждение надбавок, распределение ресурсов&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Равновесие Нэша&lt;/strong&gt;: учителя и ученики в &lt;strong&gt;повторяющейся игре&lt;/strong&gt;. Длительное предательство (&lt;strong&gt;PUA&lt;/strong&gt;/сокращение сдающих) провоцирует ответ учеников (травля и т.п.) или избегание/уход, что снижает среднюю успеваемость и долю поступления и тем самым выигрыш учителя. В равновесии учителя в основном преподают нормально, ученики при отсутствии экстремального стресса учатся, и обе стороны в долгосроке приближаются к максимуму выигрыша. Психолог и руководство реагируют на агрегированные показатели (средний стресс, &lt;strong&gt;результативность&lt;/strong&gt;) пороговой реакцией, как выше.&lt;/p&gt;

&lt;h2 id=&quot;дизайн-имитационного-эксперимента&quot;&gt;Дизайн имитационного эксперимента&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Шаг&lt;/strong&gt;: продвижение по дням (или настраиваемо).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;За шаг&lt;/strong&gt;: обновление агрегатов (число учеников, сдающих, доля поступления, средний стресс); для каждого агента вызов &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ChooseStrategy(t, agent, ctx)&lt;/code&gt;, затем &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ApplyStrategy(t, strategy, ...)&lt;/code&gt;, применение последствий, добавление лога «время + содержание».&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Выход&lt;/strong&gt;: (1) &lt;strong&gt;временной&lt;/strong&gt; лог; (2) сэмпл &lt;strong&gt;функции стимулирования&lt;/strong&gt; (время → &lt;strong&gt;результативность&lt;/strong&gt;); (3) итоговая статистика (в школе, сдающие, поступившие, средняя успеваемость, доля, &lt;strong&gt;результативность&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;файлы-реализации&quot;&gt;Файлы реализации&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Расположение исходного кода&lt;/strong&gt;: &lt;a href=&quot;https://github.com/zeusro/system/tree/main/function/local/n/china/shantou/y&quot;&gt;zeusro/system — function/local/n/china/shantou/y&lt;/a&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Файл&lt;/th&gt;
      &lt;th&gt;Содержимое&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/model.go&quot;&gt;model.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Временные типы: Factor, Event, Point, NLine; время — первый член (Birth/T)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/roles.go&quot;&gt;roles.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Роли и стратегии (перечисления); Agent (Birth первый), NewAgent; Factor, InSchool, InExamPool, Score, ScoreHistory, Stress, LegalRisk, StrategyCount, LastStrategy&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/incentive.go&quot;&gt;incentive.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;IncentiveParams; Incentive(t,…), IncentiveAt; TeacherPayoff; GaokaoScore(ScoreHistory); StudentPayoff&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/strategy.go&quot;&gt;strategy.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;ChooseStrategy(t, agent, ctx) по ролям; Consequence; ApplyStrategy(t, strategy, …)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/sim.go&quot;&gt;sim.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;SimContext, SimState; LogTS, UpdateContext, Run; pickStudentTarget&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y.go&quot;&gt;y.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Главный вход Y(…); newNamedAgents; вывод лога, сэмпла стимула, итоговой статистики, совета по C13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/zeusro/system/blob/main/function/local/n/china/shantou/y/y_test.go&quot;&gt;y_test.go&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;TestY (полный прогон, -short для пропуска); TestY_shortParams, TestY_shortRun&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;ссылка&quot;&gt;Ссылка&lt;/h2&gt;

&lt;p&gt;[1] Эффект «пинок кошке» — &lt;a href=&quot;https://en.wikipedia.org/wiki/Displaced_aggression&quot;&gt;https://en.wikipedia.org/wiki/Displaced_aggression&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
</description>
        <pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/01/30/incentive-function-education-bureaucracy/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/01/30/incentive-function-education-bureaucracy/</guid>
        
        <category>n</category>
        
        
      </item>
    
      <item>
        <title>政治正确是如何毁了开源社区</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    
&lt;h2 id=&quot;master--main&quot;&gt;❌master ✅ main&lt;/h2&gt;

&lt;p&gt;master/slave 是计算机长久以来的一种主从架构。通过主从的分离，实现分布式读和故障转移。然而在Black Lives Matter 运动中，github 在2020年6月中公布了计划，反对使用可能带有奴役联想的术语，并在2020 年 10 月 1 日默认新仓库的分支名改为 “main”。&lt;/p&gt;

&lt;h2 id=&quot;道德警察&quot;&gt;道德警察&lt;/h2&gt;

&lt;p&gt;政治正确在开源社区的一大体现，就是各种道德警察。很多中国的开发者，利用他们为数不多的时间开发开源软件，结果还被各种issue霸占，整天围绕着一些”弱智问题”问一些弱智问题。像是怎么安装这个软件，xx出错了怎么修复。&lt;/p&gt;

&lt;p&gt;他们甚至没有时间去看一下报错的错误堆栈是从哪个地方开始的，总是理所当然地浪费他人的时间。然后把他人的无私贡献当成”开源精神”。&lt;/p&gt;

&lt;p&gt;要么就是把一些八竿子打不着的理念带到开源社区，比如LGBT。&lt;/p&gt;

&lt;p&gt;LGBT文化在开源社区的流行，个人认为是一种历史的倒退。就好像我们中国的女拳斗士，她们借助男多女少的性别优势，发表各种逆天言论。&lt;/p&gt;

&lt;p&gt;但究其理论根基，是一个黑洞。她们最终的述求，不过是要在结婚前多要点钱，结婚中（防止对方）转移资产，离婚后平方对方资产，要不就是在细枝末节的小事上斤斤计较（比如要求他人环保自己却不断浪费食物），靠一些“情感考验”索取对方情绪价值。在这一点上，中西方竟然取得了完美的统一。&lt;/p&gt;

&lt;h2 id=&quot;black-lives-matter--llm寄生虫&quot;&gt;Black Lives Matter &amp;amp; LLM寄生虫&lt;/h2&gt;

&lt;p&gt;道德警察在Black Lives Matter运动中特别明显。我记得在2020年底的时候，查看kubernetes网页文档突然多了声援BLM的牛皮癣广告。&lt;/p&gt;

&lt;p&gt;查阅历史发现是 #25173 &lt;a href=&quot;https://github.com/kubernetes/website/pull/25173/files&quot;&gt;https://github.com/kubernetes/website/pull/25173/files&lt;/a&gt; 添加的。但后来在Jan 8, 2021，&lt;a href=&quot;https://github.com/kubernetes/website/pull/25769&quot;&gt;https://github.com/kubernetes/website/pull/25769&lt;/a&gt; 的时候就被移除了，而且移除的理由非常隐晦，仿佛一切都没存在过。&lt;/p&gt;

&lt;p&gt;BLM运动的联合发起人Patrisse Cullors，于2021年辞去BLMGNF执行董事职务，税务文件显示她在财政年度内未领取薪水，而是作为”无薪志愿者”，但她与基金的关联公司和家人收到大笔资金：她的兄弟Paul Cullors的公司（Cullors Protection 或 Black Ties LLC）收到约84万美元用于”专业安全服务”（2022年税务文件）。 自2021年收入总计以来超过420万美元。&lt;/p&gt;

&lt;p&gt;Cullors还被指使用基金购买洛杉矶一处约600万美元的豪宅，用于”黑人创意空间”。&lt;/p&gt;

&lt;p&gt;而其他发起人董事会成员Shalomyah Bowers的公司收到210万美元咨询费。&lt;/p&gt;

&lt;p&gt;前董事会成员Raymond Howard及其姐妹的公司收到约110万美元。&lt;/p&gt;

&lt;p&gt;两名前雇员收到结算金：一位前董事会成员40万美元，另一位33.5万美元（2023年）。&lt;/p&gt;

&lt;p&gt;而随着时间的推移我们发现，声援这场运动的人才是真正的小丑。在 BLM 运动背后，最终得到实质利益的只是组织者的收入与豪宅，而非运动本身的理想。消费死者能够换回这么大的好处，也就只有这种资本主义国家能办到了。嘴上都是正义，一切都是生意。&lt;/p&gt;

&lt;p&gt;他们的收入跟kubernetes这个项目根本毫无关系。它让我又想起了初高中那些寄生虫同学，他们只想着浪费你的资源，去实现自己的目的。&lt;/p&gt;

&lt;p&gt;就好像之前的 &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss&quot;&gt;https://github.com/tailwindlabs/tailwindcss&lt;/a&gt; 。现在的LLM辅助编程工具，可以在用户不读懂文档的前提下直接集成到自己的项目中。&lt;a href=&quot;https://github.com/zeusro/tool&quot;&gt;https://github.com/zeusro/tool&lt;/a&gt; 我这个项目就是用Cursor集成tailwindcss 的。&lt;/p&gt;

&lt;p&gt;说实话，这让我有点毛骨悚然。一方面，开发者兢兢业业地工作，项目的star越来越多，用户也越来越多；然而真实的一面却是，获得的这些虚拟赞誉，完全无法覆盖团队的日常开支，甚至连基本的生存都成为问题。&lt;/p&gt;

&lt;h2 id=&quot;我的想法&quot;&gt;我的想法&lt;/h2&gt;

&lt;p&gt;我在2020年的时候就认识到，kubernetes这个项目其实跟中国人没啥关系。项目主要发起人是Google cloud的人，那么如果你的工作关系不归属于Google cloud，那么基本上他们也不会接受你的pull request。这也完美解释了为什么LGBT的banner会出现在 kubernetes/website 这个项目。&lt;/p&gt;

&lt;p&gt;crd是kubernetes的资源，而cr和controller是crd的下游。因此不管第三方（openkruise）实现的deployment、StatefulSet 、 DaemonSet 控制器有多好，这辈子要往上游 kubernetes 合并，估计有生之年都见不到了。&lt;/p&gt;

&lt;p&gt;我自己早已被kubernetes 这个组织拉黑，但我无所叼谓。&lt;/p&gt;

&lt;p&gt;作为国内的开发者，我觉得大家其实应该思考一个问题：如果我们总是等待救世主的到来，才付诸行动。那么有没有一种可能，其实这个世界从来就没有什么神仙皇帝，也不存在所谓的救世主呢？&lt;/p&gt;

&lt;p&gt;我们总是陷入一种模仿者的被动思维，不愿意去吃第一只螃蟹。而是等到项目成熟之后，才想着去分一杯羹，然而人家根本就不带你玩。&lt;/p&gt;

&lt;p&gt;开源世界的政治斗争远比我们想象的要残酷。和平与开放之下，其实暗流涌动。&lt;/p&gt;

&lt;p&gt;对于个人开发和初创团队开发的开源项目，我不会发表任何意见，看不爽不用便是。毕竟人家能付出点时间开发，就已经实属不易；但对于带上市公司背景的单位，我觉得眼光还是要放长远一点，姿态先放低一点，先立足于国内草台班子和小微企业占多数的情况，想清楚项目立意的客户群体。&lt;/p&gt;

&lt;p&gt;整天拿着百万年薪，写出来的代码却狗屁不通，连资源占用的ROI和边际收益，都无法跟喜欢零元购的小老板们说清楚。&lt;/p&gt;

&lt;h2 id=&quot;yellow-lives-matter&quot;&gt;Yellow Lives Matter&lt;/h2&gt;

&lt;p&gt;如果kubernetes不改变，那就由我来改变kubernetes。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/how-political-correctness-ruined-open-source/yellow-lives-matter.gif&quot; alt=&quot;Yellow Lives Matter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我决定以 &lt;a href=&quot;https://github.com/p-program/kube-killer&quot;&gt;https://github.com/p-program/kube-killer&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&quot;&gt;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&lt;/a&gt; 作为起点，在全球互联网发起 Yellow Lives Matter 运动，抗议 Kubernetes 组织这种国籍歧视和道德偏见。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“The old is dying and the new cannot be born; in this interregnum a great variety of morbid symptoms appear.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    &lt;h1 id=&quot;how-political-correctness-ruined-the-open-source-community&quot;&gt;How Political Correctness Ruined the Open Source Community&lt;/h1&gt;

&lt;h2 id=&quot;master--main&quot;&gt;❌master ✅ main&lt;/h2&gt;

&lt;p&gt;master/slave is a long-standing master-slave architecture in computing. Through the separation of master and slave, distributed reading and failover are achieved. However, during the Black Lives Matter movement, GitHub announced plans in June 2020 to oppose the use of terms that might carry associations with slavery, and on October 1, 2020, the default branch name for new repositories was changed to “main”.&lt;/p&gt;

&lt;h2 id=&quot;moral-police&quot;&gt;Moral Police&lt;/h2&gt;

&lt;p&gt;A major manifestation of political correctness in the open source community is the various moral police. Many Chinese developers use their limited time to develop open source software, only to have their projects flooded with various issues, constantly dealing with “stupid questions” about stupid problems. Like how to install this software, or how to fix errors when something goes wrong.&lt;/p&gt;

&lt;p&gt;They don’t even have time to look at where the error stack trace starts, always taking it for granted to waste others’ time. Then they treat others’ selfless contributions as “open source spirit”.&lt;/p&gt;

&lt;p&gt;Or they bring completely unrelated ideologies into the open source community, such as LGBT.&lt;/p&gt;

&lt;p&gt;The popularity of LGBT culture in the open source community is, in my opinion, a historical regression. It’s like the female fighters in China, who leverage the gender advantage of there being more men than women to make all kinds of outrageous statements.&lt;/p&gt;

&lt;p&gt;But when you examine their theoretical foundation, it’s a black hole. Their ultimate demands are nothing more than asking for more money before marriage, preventing the other party from transferring assets during marriage, splitting the other party’s assets after divorce, or being petty about trivial matters (like demanding others to be environmentally friendly while constantly wasting food themselves), and extracting “emotional value” from the other party through various so‑called “tests of feelings”. In this regard, China and the West have achieved perfect unity.&lt;/p&gt;

&lt;h2 id=&quot;black-lives-matter--llm-parasites&quot;&gt;Black Lives Matter &amp;amp; LLM Parasites&lt;/h2&gt;

&lt;p&gt;Moral police were particularly evident during the Black Lives Matter movement. I remember that at the end of 2020, when viewing Kubernetes web documentation, there suddenly appeared BLM support advertisements.&lt;/p&gt;

&lt;p&gt;Looking at the history, it was added by #25173 &lt;a href=&quot;https://github.com/kubernetes/website/pull/25173/files&quot;&gt;https://github.com/kubernetes/website/pull/25173/files&lt;/a&gt;. But later on Jan 8, 2021, &lt;a href=&quot;https://github.com/kubernetes/website/pull/25769&quot;&gt;https://github.com/kubernetes/website/pull/25769&lt;/a&gt;, it was removed, and the reason for removal was very vague, as if it never existed.&lt;/p&gt;

&lt;p&gt;Patrisse Cullors, co-founder of the BLM movement, resigned from her position as executive director of BLMGNF in 2021. Tax documents showed that she did not receive a salary during the fiscal year, but served as an “unpaid volunteer.” However, her associated companies and family members received large sums of money: her brother Paul Cullors’ company (Cullors Protection or Black Ties LLC) received approximately $840,000 for “professional security services” (2022 tax documents). Total income since 2021 has exceeded $4.2 million.&lt;/p&gt;

&lt;p&gt;Cullors was also accused of using the fund to purchase a mansion in Los Angeles worth approximately $6 million for a “black creative space.”&lt;/p&gt;

&lt;p&gt;Other co-founder and board member Shalomyah Bowers’ company received $2.1 million in consulting fees.&lt;/p&gt;

&lt;p&gt;Former board member Raymond Howard and his sister’s company received approximately $1.1 million.&lt;/p&gt;

&lt;p&gt;Two former employees received settlement payments: one former board member $400,000, and another $335,000 (2023).&lt;/p&gt;

&lt;p&gt;As time passed, we discovered that those who supported this movement were the real clowns. Behind the BLM movement, the only ones who actually benefited were the organizers’ income and mansions, not the ideals of the movement itself. Being able to exchange the consumption of the dead for such great benefits is something only this kind of capitalist country can achieve. All talk of justice, everything is business.&lt;/p&gt;

&lt;p&gt;Their income has nothing to do with the Kubernetes project. It reminds me of those parasitic classmates in middle and high school, who only think about wasting your resources to achieve their own goals.&lt;/p&gt;

&lt;p&gt;It’s like the previous &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss&quot;&gt;https://github.com/tailwindlabs/tailwindcss&lt;/a&gt;. Current LLM-assisted programming tools can integrate into users’ projects without them even reading the documentation. &lt;a href=&quot;https://github.com/zeusro/tool&quot;&gt;https://github.com/zeusro/tool&lt;/a&gt; This project of mine integrates tailwindcss using Cursor.&lt;/p&gt;

&lt;p&gt;To be honest, this makes me a bit horrified. On one hand, developers work diligently, projects get more and more stars, and users keep increasing; however, the reality is that these virtual accolades cannot cover the team’s daily expenses, and even basic survival becomes a problem.&lt;/p&gt;

&lt;h2 id=&quot;my-thoughts&quot;&gt;My Thoughts&lt;/h2&gt;

&lt;p&gt;I realized back in 2020 that the Kubernetes project actually has nothing to do with Chinese people. The main initiators of the project are people from Google Cloud, so if your work relationship doesn’t belong to Google Cloud, they basically won’t accept your pull requests. This perfectly explains why the LGBT banner appeared in the kubernetes/website project.&lt;/p&gt;

&lt;p&gt;CRD is a Kubernetes resource, and CR and controller are downstream of CRD. Therefore, no matter how good the deployment, StatefulSet, and DaemonSet controllers implemented by third parties (openkruise) are, merging them upstream into Kubernetes will probably never happen in our lifetime.&lt;/p&gt;

&lt;p&gt;I myself have long been blacklisted by the Kubernetes organization, but I don’t give a damn.&lt;/p&gt;

&lt;p&gt;As a Chinese developer, I think everyone should actually think about a question: If we always wait for a savior to arrive before taking action, then is it possible that this world has never had any gods or emperors, and there is no so-called savior?&lt;/p&gt;

&lt;p&gt;We always fall into a passive mindset of imitators, unwilling to be the first to eat the crab. Instead, we wait until the project matures before thinking about getting a piece of the pie, but they simply don’t play with us.&lt;/p&gt;

&lt;p&gt;The political struggles in the open source world are far more brutal than we imagine. Beneath the peace and openness, there are actually undercurrents.&lt;/p&gt;

&lt;p&gt;For open source projects developed by individuals and startup teams, I actually won’t make any comments - if you don’t like it, don’t use it. After all, it’s already quite difficult for them to spend time developing; but for units with listed company backgrounds, I think the vision should be longer-term, the posture should be lower first, and they should first establish themselves based on the situation where domestic makeshift teams and small and micro enterprises are the majority, and think clearly about the target customer group for the project’s purpose.&lt;/p&gt;

&lt;p&gt;Instead of holding million-dollar annual salaries all day, writing code that makes no sense, unable to even explain the ROI of resource usage and marginal benefits to small bosses who like zero-cost shopping.&lt;/p&gt;

&lt;h2 id=&quot;white-lives-matter&quot;&gt;White Lives Matter&lt;/h2&gt;

&lt;p&gt;If Kubernetes doesn’t change, then I will change Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/how-political-correctness-ruined-open-source/yellow-lives-matter.gif&quot; alt=&quot;Yellow Lives Matter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I have decided to use &lt;a href=&quot;https://github.com/p-program/kube-killer&quot;&gt;https://github.com/p-program/kube-killer&lt;/a&gt; and &lt;a href=&quot;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&quot;&gt;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&lt;/a&gt; as starting points to launch a White Lives Matter movement on the global internet, protesting against the Kubernetes organization’s national discrimination and moral bias.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“The old is dying and the new cannot be born; in this interregnum a great variety of morbid symptoms appear.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    &lt;h1 id=&quot;政治的正しさがオープンソースコミュニティをどのように破壊したか&quot;&gt;政治的正しさがオープンソースコミュニティをどのように破壊したか&lt;/h1&gt;

&lt;h2 id=&quot;master--main&quot;&gt;❌master ✅ main&lt;/h2&gt;

&lt;p&gt;master/slaveは、コンピューティングにおける長年のマスター・スレーブアーキテクチャです。マスターとスレーブの分離により、分散読み取りとフェイルオーバーを実現します。しかし、Black Lives Matter運動の中で、GitHubは2020年6月に、奴隷制を連想させる可能性のある用語の使用に反対する計画を発表し、2020年10月1日に新規リポジトリのデフォルトブランチ名を「main」に変更しました。&lt;/p&gt;

&lt;h2 id=&quot;道徳警察&quot;&gt;道徳警察&lt;/h2&gt;

&lt;p&gt;オープンソースコミュニティにおける政治的正しさの大きな現れは、さまざまな道徳警察です。多くの中国の開発者は、限られた時間を使ってオープンソースソフトウェアを開発していますが、結果として様々なissueに占領され、愚かな問題についての「愚かな質問」に終日対応することになります。このソフトウェアのインストール方法、エラーが発生したときの修正方法など。&lt;/p&gt;

&lt;p&gt;彼らはエラースタックトレースがどこから始まるかを見る時間さえなく、常に当然のように他人の時間を浪費します。そして、他人の無私の貢献を「オープンソース精神」として扱います。&lt;/p&gt;

&lt;p&gt;あるいは、LGBTなど、まったく関係のない理念をオープンソースコミュニティに持ち込みます。&lt;/p&gt;

&lt;p&gt;オープンソースコミュニティにおけるLGBT文化の流行は、個人的には歴史的な後退だと考えています。それは、中国のフェミニスト戦士たちのように、男性が女性より多いという性別の優位性を利用して、さまざまな逆天的な発言を行うのと同じです。&lt;/p&gt;

&lt;p&gt;しかし、その理論的基盤を掘り下げてみると、それはブラックホールです。彼女たちの最終的な要求は、結婚前に少しでも多くのお金をもらうこと、結婚中に（相手が）資産を移転しないようにすること、離婚後に相手の資産を二等分すること、あるいは些細なこと（他人には環境保護を要求しながら自分は食べ物を無駄にし続けるなど）にいちいちこだわること、さらにはさまざまな「感情テスト」を通じて相手から感情的な価値を搾り取ることに過ぎません。この点において、中西双方は見事なまでに一致しています。&lt;/p&gt;

&lt;h2 id=&quot;black-lives-matter--llm寄生虫&quot;&gt;Black Lives Matter &amp;amp; LLM寄生虫&lt;/h2&gt;

&lt;p&gt;道徳警察はBlack Lives Matter運動中に特に顕著でした。2020年末、Kubernetesのウェブドキュメントを閲覧していたとき、突然BLM支援の広告が増えたのを覚えています。&lt;/p&gt;

&lt;p&gt;履歴を調べると、#25173 &lt;a href=&quot;https://github.com/kubernetes/website/pull/25173/files&quot;&gt;https://github.com/kubernetes/website/pull/25173/files&lt;/a&gt; によって追加されたものでした。しかし、その後2021年1月8日、&lt;a href=&quot;https://github.com/kubernetes/website/pull/25769&quot;&gt;https://github.com/kubernetes/website/pull/25769&lt;/a&gt; で削除され、削除の理由は非常に曖昧で、まるで存在しなかったかのようでした。&lt;/p&gt;

&lt;p&gt;BLM運動の共同創設者Patrisse Cullorsは、2021年にBLMGNFの執行取締役を辞任しました。税務書類によると、彼女は会計年度内に給与を受け取らず、「無給のボランティア」として活動していましたが、彼女の関連会社と家族は多額の資金を受け取りました：彼女の兄弟Paul Cullorsの会社（Cullors ProtectionまたはBlack Ties LLC）は「専門セキュリティサービス」のために約84万ドルを受け取りました（2022年税務書類）。2021年以降の総収入は420万ドルを超えています。&lt;/p&gt;

&lt;p&gt;Cullorsはまた、基金を使用してロサンゼルスの約600万ドルの豪邸を「黒人クリエイティブスペース」として購入したと指摘されています。&lt;/p&gt;

&lt;p&gt;他の共同創設者で取締役会メンバーのShalomyah Bowersの会社は210万ドルのコンサルティング料を受け取りました。&lt;/p&gt;

&lt;p&gt;元取締役会メンバーRaymond Howardとその姉妹の会社は約110万ドルを受け取りました。&lt;/p&gt;

&lt;p&gt;2人の元従業員が和解金を受け取りました：元取締役会メンバー1人が40万ドル、もう1人が33.5万ドル（2023年）。&lt;/p&gt;

&lt;p&gt;時が経つにつれ、この運動を支持した人々こそが本当の道化師であることがわかりました。BLM運動の背後には、運動自体の理想ではなく、組織者の収入と豪邸だけが実質的な利益を得ています。死者を消費してこれほど大きな利益を得られるのは、この種の資本主義国だけです。口では正義を唱え、すべてがビジネスです。&lt;/p&gt;

&lt;p&gt;彼らの収入はKubernetesプロジェクトとは全く関係がありません。それは私に中学・高校時代の寄生虫のような同級生を思い出させます。彼らは自分の目的を達成するためにあなたのリソースを浪費することしか考えていません。&lt;/p&gt;

&lt;p&gt;以前の &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss&quot;&gt;https://github.com/tailwindlabs/tailwindcss&lt;/a&gt; のように。現在のLLM支援プログラミングツールは、ユーザーがドキュメントを読まなくても、直接自分のプロジェクトに統合できます。&lt;a href=&quot;https://github.com/zeusro/tool&quot;&gt;https://github.com/zeusro/tool&lt;/a&gt; この私のプロジェクトは、Cursorを使用してtailwindcssを統合したものです。&lt;/p&gt;

&lt;p&gt;正直に言うと、これは私に少しぞっとする感覚を与えます。一方で、開発者は真面目に働き、プロジェクトのスターはますます増え、ユーザーも増え続けています。しかし、現実の一面は、これらの仮想の称賛は、チームの日常的な支出をカバーできず、基本的な生存さえ問題になるということです。&lt;/p&gt;

&lt;h2 id=&quot;私の考え&quot;&gt;私の考え&lt;/h2&gt;

&lt;p&gt;私は2020年に、Kubernetesプロジェクトは実際には中国人とは何の関係もないことを認識しました。プロジェクトの主な発起人はGoogle Cloudの人々なので、あなたの仕事関係がGoogle Cloudに属していない場合、基本的に彼らはあなたのpull requestを受け入れません。これが、LGBTのバナーがkubernetes/websiteプロジェクトに現れた理由を完璧に説明しています。&lt;/p&gt;

&lt;p&gt;CRDはKubernetesのリソースであり、CRとcontrollerはCRDの下流です。したがって、サードパーティ（openkruise）が実装したdeployment、StatefulSet、DaemonSetコントローラーがどれほど優れていても、これらを上流のKubernetesにマージすることは、おそらく私たちの生涯では見られないでしょう。&lt;/p&gt;

&lt;p&gt;私はすでにKubernetes組織によってブラックリストに登録されていますが、どうでもいいです。&lt;/p&gt;

&lt;p&gt;国内の開発者として、私は皆が実際に一つの問題を考えるべきだと思います：もし私たちが常に救世主の到来を待ってから行動を起こすなら、この世界には神や皇帝が存在せず、いわゆる救世主も存在しない可能性はないでしょうか？&lt;/p&gt;

&lt;p&gt;私たちは常に模倣者の受動的な思考に陥り、最初のカニを食べることを望みません。代わりに、プロジェクトが成熟するまで待ってから、一杯のスープを分けてもらおうと考えますが、彼らは単に私たちを遊びに連れて行きません。&lt;/p&gt;

&lt;p&gt;オープンソース世界の政治的闘争は、私たちが想像するよりもはるかに残酷です。平和と開放の下には、実際に暗流が渦巻いています。&lt;/p&gt;

&lt;p&gt;個人開発者やスタートアップチームが開発したオープンソースプロジェクトについては、実際には何も意見を述べません。気に入らなければ使わなければいいです。結局のところ、彼らが開発に時間を費やすことはすでに非常に困難です。しかし、上場企業の背景を持つ組織については、視野を長期的に保ち、まず姿勢を低くし、国内の臨時チームや中小企業が大多数を占める状況に基づいてまず自分自身を確立し、プロジェクトの目的の対象顧客グループを明確に考えるべきだと思います。&lt;/p&gt;

&lt;p&gt;百万ドルの年俸を一日中持っていながら、意味のないコードを書き、リソース使用のROIと限界利益を、ゼロコストショッピングが好きな小さなボスに説明することさえできないのではなく。&lt;/p&gt;

&lt;h2 id=&quot;yellow-lives-matter&quot;&gt;Yellow Lives Matter&lt;/h2&gt;

&lt;p&gt;Kubernetesが変わらないなら、私がKubernetesを変えます。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/how-political-correctness-ruined-open-source/yellow-lives-matter.gif&quot; alt=&quot;Yellow Lives Matter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;私は &lt;a href=&quot;https://github.com/p-program/kube-killer&quot;&gt;https://github.com/p-program/kube-killer&lt;/a&gt; と &lt;a href=&quot;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&quot;&gt;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&lt;/a&gt; を起点として、グローバルインターネットで Yellow Lives Matter運動を開始し、Kubernetes組織の国籍差別と道徳的偏見に抗議することを決定しました。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“The old is dying and the new cannot be born; in this interregnum a great variety of morbid symptoms appear.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    &lt;h1 id=&quot;как-политкорректность-разрушила-сообщество-открытого-исходного-кода&quot;&gt;Как политкорректность разрушила сообщество открытого исходного кода&lt;/h1&gt;

&lt;h2 id=&quot;master--main&quot;&gt;❌master ✅ main&lt;/h2&gt;

&lt;p&gt;master/slave — это давно существующая архитектура «мастер-подчиненный» в вычислительной технике. Благодаря разделению мастера и подчиненного достигаются распределенное чтение и отказоустойчивость. Однако во время движения Black Lives Matter GitHub в июне 2020 года объявил о планах против использования терминов, которые могут ассоциироваться с рабством, и 1 октября 2020 года имя ветки по умолчанию для новых репозиториев было изменено на «main».&lt;/p&gt;

&lt;h2 id=&quot;моральная-полиция&quot;&gt;Моральная полиция&lt;/h2&gt;

&lt;p&gt;Основным проявлением политкорректности в сообществе открытого исходного кода являются различные моральные полицейские. Многие китайские разработчики используют свое ограниченное время для разработки программного обеспечения с открытым исходным кодом, но в результате их проекты захватываются различными проблемами, постоянно разбираясь с «глупыми вопросами» о глупых проблемах. Например, как установить это программное обеспечение, как исправить ошибки, когда что-то идет не так.&lt;/p&gt;

&lt;p&gt;У них даже нет времени посмотреть, откуда начинается трассировка стека ошибок, всегда считая само собой разумеющимся тратить время других. Затем они относятся к бескорыстному вкладу других как к «духу открытого исходного кода».&lt;/p&gt;

&lt;p&gt;Или они приносят совершенно не связанные идеологии в сообщество открытого исходного кода, такие как ЛГБТ.&lt;/p&gt;

&lt;p&gt;Популярность ЛГБТ‑культуры в сообществе открытого исходного кода, на мой взгляд, является историческим регрессом. Это похоже на китайских феминисток‑боевиков, которые пользуются гендерным преимуществом — мужчин больше, чем женщин — чтобы делать всевозможные запредельные заявления.&lt;/p&gt;

&lt;p&gt;Но если разобрать их теоретическую основу, там сплошная черная дыра. Их конечные требования сводятся к тому, чтобы перед браком выжать побольше денег, в браке не дать второй стороне вывести активы, после развода поделить имущество пополам, либо придираться к мелочам (например, требовать от других бережного отношения к экологии, при этом самим постоянно выбрасывая еду) и через разные «проверки чувств» выкачивать из партнера эмоциональную выгоду. В этом отношении Китай и Запад достигли поразительного единства.&lt;/p&gt;

&lt;h2 id=&quot;black-lives-matter--llm-паразиты&quot;&gt;Black Lives Matter &amp;amp; LLM-паразиты&lt;/h2&gt;

&lt;p&gt;Моральная полиция была особенно заметна во время движения Black Lives Matter. Я помню, что в конце 2020 года при просмотре веб-документации Kubernetes внезапно появилась реклама поддержки BLM.&lt;/p&gt;

&lt;p&gt;Изучая историю, это было добавлено #25173 &lt;a href=&quot;https://github.com/kubernetes/website/pull/25173/files&quot;&gt;https://github.com/kubernetes/website/pull/25173/files&lt;/a&gt;. Но позже, 8 января 2021 года, &lt;a href=&quot;https://github.com/kubernetes/website/pull/25769&quot;&gt;https://github.com/kubernetes/website/pull/25769&lt;/a&gt;, это было удалено, и причина удаления была очень расплывчатой, как будто этого никогда не существовало.&lt;/p&gt;

&lt;p&gt;Patrisse Cullors, соучредитель движения BLM, ушла с поста исполнительного директора BLMGNF в 2021 году. Налоговые документы показали, что она не получала зарплату в течение финансового года, а работала «неоплачиваемым волонтером». Однако ее связанные компании и члены семьи получили большие суммы денег: компания ее брата Paul Cullors (Cullors Protection или Black Ties LLC) получила примерно 840 000 долларов за «профессиональные охранные услуги» (налоговые документы 2022 года). Общий доход с 2021 года превысил 4,2 миллиона долларов.&lt;/p&gt;

&lt;p&gt;Cullors также обвинялась в использовании фонда для покупки особняка в Лос-Анджелесе стоимостью примерно 6 миллионов долларов для «черного творческого пространства».&lt;/p&gt;

&lt;p&gt;Компания другого соучредителя и члена правления Shalomyah Bowers получила 2,1 миллиона долларов консультационных сборов.&lt;/p&gt;

&lt;p&gt;Компания бывшего члена правления Raymond Howard и его сестры получила примерно 1,1 миллиона долларов.&lt;/p&gt;

&lt;p&gt;Два бывших сотрудника получили расчетные выплаты: один бывший член правления 400 000 долларов, другой 335 000 долларов (2023).&lt;/p&gt;

&lt;p&gt;Со временем мы обнаружили, что те, кто поддерживал это движение, были настоящими клоунами. За движением BLM единственными, кто действительно получил выгоду, были доходы и особняки организаторов, а не идеалы самого движения. Возможность обменять потребление мертвых на такие большие выгоды — это то, что может достичь только такой капиталистический режим. Все разговоры о справедливости, все — это бизнес.&lt;/p&gt;

&lt;p&gt;Их доход не имеет ничего общего с проектом Kubernetes. Это напоминает мне тех паразитических одноклассников в средней и старшей школе, которые думают только о том, чтобы тратить ваши ресурсы для достижения своих целей.&lt;/p&gt;

&lt;p&gt;Это как предыдущий &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss&quot;&gt;https://github.com/tailwindlabs/tailwindcss&lt;/a&gt;. Текущие инструменты программирования с поддержкой LLM могут интегрироваться в проекты пользователей, даже не читая документацию. &lt;a href=&quot;https://github.com/zeusro/tool&quot;&gt;https://github.com/zeusro/tool&lt;/a&gt; Этот мой проект интегрирует tailwindcss с помощью Cursor.&lt;/p&gt;

&lt;p&gt;Честно говоря, это меня немного пугает. С одной стороны, разработчики усердно работают, проекты получают все больше и больше звезд, и пользователи продолжают расти; однако реальность такова, что эти виртуальные похвалы не могут покрыть ежедневные расходы команды, и даже базовое выживание становится проблемой.&lt;/p&gt;

&lt;h2 id=&quot;мои-мысли&quot;&gt;Мои мысли&lt;/h2&gt;

&lt;p&gt;Я понял еще в 2020 году, что проект Kubernetes на самом деле не имеет ничего общего с китайцами. Основные инициаторы проекта — люди из Google Cloud, поэтому, если ваши рабочие отношения не принадлежат Google Cloud, они в основном не примут ваши pull request. Это прекрасно объясняет, почему баннер ЛГБТ появился в проекте kubernetes/website.&lt;/p&gt;

&lt;p&gt;CRD — это ресурс Kubernetes, а CR и controller — это нижестоящие от CRD. Поэтому, независимо от того, насколько хороши контроллеры deployment, StatefulSet и DaemonSet, реализованные третьими сторонами (openkruise), слияние их вверх по течению в Kubernetes, вероятно, никогда не произойдет в нашей жизни.&lt;/p&gt;

&lt;p&gt;Я сам давно в черном списке организации Kubernetes, но мне все равно.&lt;/p&gt;

&lt;p&gt;Как отечественный разработчик, я думаю, что все должны подумать о вопросе: если мы всегда ждем прихода спасителя, прежде чем действовать, то возможно ли, что в этом мире никогда не было никаких богов или императоров, и нет так называемого спасителя?&lt;/p&gt;

&lt;p&gt;Мы всегда впадаем в пассивное мышление подражателей, не желая быть первыми, кто съест краба. Вместо этого мы ждем, пока проект созреет, прежде чем думать о том, чтобы получить кусок пирога, но они просто не играют с нами.&lt;/p&gt;

&lt;p&gt;Политическая борьба в мире открытого исходного кода гораздо более жестока, чем мы представляем. Под миром и открытостью на самом деле бурлят подводные течения.&lt;/p&gt;

&lt;p&gt;Что касается проектов с открытым исходным кодом, разработанных отдельными лицами и стартап-командами, я на самом деле не буду делать никаких комментариев — если вам не нравится, не используйте. В конце концов, им уже довольно сложно тратить время на разработку; но для подразделений с фоном публичных компаний я думаю, что видение должно быть более долгосрочным, поза должна быть сначала ниже, и они должны сначала утвердиться на основе ситуации, когда отечественные импровизированные команды и малые и микропредприятия составляют большинство, и четко подумать о целевой группе клиентов для цели проекта.&lt;/p&gt;

&lt;p&gt;А не держать миллионные годовые зарплаты весь день, писать код, который не имеет смысла, не в состоянии даже объяснить ROI использования ресурсов и предельную выгоду мелким боссам, которые любят бесплатные покупки.&lt;/p&gt;

&lt;h2 id=&quot;white-lives-matter&quot;&gt;White Lives Matter&lt;/h2&gt;

&lt;p&gt;Если Kubernetes не изменится, то я изменю Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/in-post/how-political-correctness-ruined-open-source/yellow-lives-matter.gif&quot; alt=&quot;White Lives Matter&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Я решил использовать &lt;a href=&quot;https://github.com/p-program/kube-killer&quot;&gt;https://github.com/p-program/kube-killer&lt;/a&gt; и &lt;a href=&quot;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&quot;&gt;https://github.com/Z-Nightmare/kuberneteskuberneteskubernetes&lt;/a&gt; в качестве отправных точек для запуска движения White Lives Matter в глобальном интернете, протестуя против национальной дискриминации и моральной предвзятости организации Kubernetes.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“The old is dying and the new cannot be born; in this interregnum a great variety of morbid symptoms appear.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;/div&gt;
</description>
        <pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/01/22/how-political-correctness-ruined-open-source/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/01/22/how-political-correctness-ruined-open-source/</guid>
        
        <category>Kubernetes</category>
        
        
      </item>
    
      <item>
        <title>GitHub Discussions：开源项目的社区交流新方式</title>
        <description>&lt;!-- Chinese Version --&gt;
&lt;div class=&quot;zh post-container&quot;&gt;
    
    &lt;h2 id=&quot;什么是-github-discussions&quot;&gt;什么是 GitHub Discussions？&lt;/h2&gt;

&lt;p&gt;GitHub Discussions 是 GitHub 在 2020 年推出的一个功能，它为开源项目提供了一个全新的社区交流平台。与传统的 Issues 和 Pull Requests 不同，Discussions 更像是一个论坛，允许用户进行更自由、更开放的讨论。&lt;/p&gt;

&lt;h2 id=&quot;为什么需要-discussions&quot;&gt;为什么需要 Discussions？&lt;/h2&gt;

&lt;p&gt;在传统的开源项目协作中，我们主要使用：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Issues&lt;/strong&gt;：用于报告 bug、提出功能请求&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pull Requests&lt;/strong&gt;：用于代码贡献和审查&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;但这些工具更适合处理具体的技术问题。对于以下场景，Discussions 更加合适：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;项目发展方向讨论&lt;/li&gt;
  &lt;li&gt;使用经验分享&lt;/li&gt;
  &lt;li&gt;最佳实践交流&lt;/li&gt;
  &lt;li&gt;社区问答&lt;/li&gt;
  &lt;li&gt;项目公告&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;discussions-的主要特性&quot;&gt;Discussions 的主要特性&lt;/h2&gt;

&lt;h3 id=&quot;1-分类管理&quot;&gt;1. 分类管理&lt;/h3&gt;

&lt;p&gt;Discussions 支持多种分类：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;📣 &lt;strong&gt;Announcements（公告）&lt;/strong&gt;：项目重要通知&lt;/li&gt;
  &lt;li&gt;💬 &lt;strong&gt;General（一般讨论）&lt;/strong&gt;：日常交流&lt;/li&gt;
  &lt;li&gt;💡 &lt;strong&gt;Ideas（想法）&lt;/strong&gt;：功能建议和创意&lt;/li&gt;
  &lt;li&gt;🗳️ &lt;strong&gt;Polls（投票）&lt;/strong&gt;：社区决策&lt;/li&gt;
  &lt;li&gt;🙏 &lt;strong&gt;Q&amp;amp;A（问答）&lt;/strong&gt;：问题解答&lt;/li&gt;
  &lt;li&gt;🙌 &lt;strong&gt;Show and tell（展示）&lt;/strong&gt;：项目展示&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-更灵活的交流方式&quot;&gt;2. 更灵活的交流方式&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;支持 Markdown 格式&lt;/li&gt;
  &lt;li&gt;可以 @ 提及用户&lt;/li&gt;
  &lt;li&gt;支持表情符号&lt;/li&gt;
  &lt;li&gt;可以标记为已回答/未回答&lt;/li&gt;
  &lt;li&gt;支持置顶重要讨论&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-与-issues-的集成&quot;&gt;3. 与 Issues 的集成&lt;/h3&gt;

&lt;p&gt;Discussions 可以与 Issues 无缝集成，可以将讨论转换为 Issue，也可以从 Issue 创建讨论。&lt;/p&gt;

&lt;h2 id=&quot;我的项目实践&quot;&gt;我的项目实践&lt;/h2&gt;

&lt;p&gt;最近我在 &lt;a href=&quot;https://github.com/zeusro/Zeusro.github.io&quot;&gt;Zeusro.github.io&lt;/a&gt; 项目中开启了 Discussions 功能。这个项目是我的个人博客，使用 Jekyll 构建并托管在 GitHub Pages 上。&lt;/p&gt;

&lt;p&gt;开启 Discussions 后，我发现它非常适合：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;分享博客写作经验&lt;/li&gt;
  &lt;li&gt;讨论技术话题&lt;/li&gt;
  &lt;li&gt;收集读者反馈&lt;/li&gt;
  &lt;li&gt;发布项目更新公告&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;如何开启-discussions&quot;&gt;如何开启 Discussions？&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;进入你的 GitHub 仓库&lt;/li&gt;
  &lt;li&gt;点击 &lt;strong&gt;Settings&lt;/strong&gt;（设置）&lt;/li&gt;
  &lt;li&gt;在左侧菜单中找到 &lt;strong&gt;General&lt;/strong&gt; → &lt;strong&gt;Features&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;勾选 &lt;strong&gt;Discussions&lt;/strong&gt; 选项&lt;/li&gt;
  &lt;li&gt;保存设置&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;开启后，你可以在仓库主页看到新的 &lt;strong&gt;Discussions&lt;/strong&gt; 标签页。&lt;/p&gt;

&lt;h2 id=&quot;最佳实践建议&quot;&gt;最佳实践建议&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;明确分类&lt;/strong&gt;：为不同类型的讨论设置合适的分类&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;及时回复&lt;/strong&gt;：保持活跃的社区氛围&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;置顶重要信息&lt;/strong&gt;：将重要公告置顶&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;引导讨论&lt;/strong&gt;：鼓励社区成员参与讨论&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;定期整理&lt;/strong&gt;：将有价值的讨论整理成文档&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;

&lt;p&gt;GitHub Discussions 为开源项目提供了一个更加开放和友好的交流平台。它补充了 Issues 和 Pull Requests 的不足，让社区交流变得更加轻松自然。如果你正在维护一个开源项目，不妨试试开启 Discussions 功能，它可能会为你的项目带来意想不到的活力。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;本文由 AI 生成&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;!-- English Version --&gt;
&lt;div class=&quot;en post-container&quot;&gt;
    
    &lt;h2 id=&quot;what-is-github-discussions&quot;&gt;What is GitHub Discussions?&lt;/h2&gt;

&lt;p&gt;GitHub Discussions is a feature launched by GitHub in 2020 that provides a new community communication platform for open source projects. Unlike traditional Issues and Pull Requests, Discussions is more like a forum, allowing users to have more free and open discussions.&lt;/p&gt;

&lt;h2 id=&quot;why-do-we-need-discussions&quot;&gt;Why Do We Need Discussions?&lt;/h2&gt;

&lt;p&gt;In traditional open source project collaboration, we mainly use:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Issues&lt;/strong&gt;: For reporting bugs and proposing feature requests&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pull Requests&lt;/strong&gt;: For code contributions and reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, these tools are more suitable for handling specific technical problems. Discussions is more appropriate for the following scenarios:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Project direction discussions&lt;/li&gt;
  &lt;li&gt;Experience sharing&lt;/li&gt;
  &lt;li&gt;Best practices exchange&lt;/li&gt;
  &lt;li&gt;Community Q&amp;amp;A&lt;/li&gt;
  &lt;li&gt;Project announcements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;key-features-of-discussions&quot;&gt;Key Features of Discussions&lt;/h2&gt;

&lt;h3 id=&quot;1-category-management&quot;&gt;1. Category Management&lt;/h3&gt;

&lt;p&gt;Discussions supports multiple categories:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;📣 &lt;strong&gt;Announcements&lt;/strong&gt;: Important project notifications&lt;/li&gt;
  &lt;li&gt;💬 &lt;strong&gt;General&lt;/strong&gt;: Daily communication&lt;/li&gt;
  &lt;li&gt;💡 &lt;strong&gt;Ideas&lt;/strong&gt;: Feature suggestions and creativity&lt;/li&gt;
  &lt;li&gt;🗳️ &lt;strong&gt;Polls&lt;/strong&gt;: Community decisions&lt;/li&gt;
  &lt;li&gt;🙏 &lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;: Question and answer&lt;/li&gt;
  &lt;li&gt;🙌 &lt;strong&gt;Show and tell&lt;/strong&gt;: Project showcases&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-more-flexible-communication&quot;&gt;2. More Flexible Communication&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Supports Markdown format&lt;/li&gt;
  &lt;li&gt;Can @ mention users&lt;/li&gt;
  &lt;li&gt;Supports emoji&lt;/li&gt;
  &lt;li&gt;Can be marked as answered/unanswered&lt;/li&gt;
  &lt;li&gt;Supports pinning important discussions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-integration-with-issues&quot;&gt;3. Integration with Issues&lt;/h3&gt;

&lt;p&gt;Discussions can be seamlessly integrated with Issues. You can convert discussions to Issues, or create discussions from Issues.&lt;/p&gt;

&lt;h2 id=&quot;my-project-practice&quot;&gt;My Project Practice&lt;/h2&gt;

&lt;p&gt;Recently, I enabled the Discussions feature in my &lt;a href=&quot;https://github.com/zeusro/Zeusro.github.io&quot;&gt;Zeusro.github.io&lt;/a&gt; project. This project is my personal blog, built with Jekyll and hosted on GitHub Pages.&lt;/p&gt;

&lt;p&gt;After enabling Discussions, I found it very suitable for:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Sharing blog writing experiences&lt;/li&gt;
  &lt;li&gt;Discussing technical topics&lt;/li&gt;
  &lt;li&gt;Collecting reader feedback&lt;/li&gt;
  &lt;li&gt;Publishing project update announcements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;how-to-enable-discussions&quot;&gt;How to Enable Discussions?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Go to your GitHub repository&lt;/li&gt;
  &lt;li&gt;Click &lt;strong&gt;Settings&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Find &lt;strong&gt;General&lt;/strong&gt; → &lt;strong&gt;Features&lt;/strong&gt; in the left menu&lt;/li&gt;
  &lt;li&gt;Check the &lt;strong&gt;Discussions&lt;/strong&gt; option&lt;/li&gt;
  &lt;li&gt;Save settings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After enabling, you can see the new &lt;strong&gt;Discussions&lt;/strong&gt; tab on your repository homepage.&lt;/p&gt;

&lt;h2 id=&quot;best-practice-recommendations&quot;&gt;Best Practice Recommendations&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Clear Categories&lt;/strong&gt;: Set appropriate categories for different types of discussions&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Timely Responses&lt;/strong&gt;: Maintain an active community atmosphere&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pin Important Information&lt;/strong&gt;: Pin important announcements&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Guide Discussions&lt;/strong&gt;: Encourage community members to participate&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Regular Organization&lt;/strong&gt;: Organize valuable discussions into documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;GitHub Discussions provides a more open and friendly communication platform for open source projects. It complements the shortcomings of Issues and Pull Requests, making community communication more relaxed and natural. If you are maintaining an open source project, you might want to try enabling the Discussions feature—it may bring unexpected vitality to your project.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;This article was generated by AI&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Japanese Version --&gt;
&lt;div class=&quot;jp post-container&quot;&gt;
    
    &lt;h2 id=&quot;github-discussionsとは&quot;&gt;GitHub Discussionsとは？&lt;/h2&gt;

&lt;p&gt;GitHub Discussionsは、GitHubが2020年にリリースした機能で、オープンソースプロジェクトに新しいコミュニティ交流プラットフォームを提供します。従来のIssuesやPull Requestsとは異なり、Discussionsはよりフォーラムに近く、ユーザーがより自由でオープンな議論を行うことができます。&lt;/p&gt;

&lt;h2 id=&quot;なぜdiscussionsが必要なのか&quot;&gt;なぜDiscussionsが必要なのか？&lt;/h2&gt;

&lt;p&gt;従来のオープンソースプロジェクトの協力では、主に以下を使用します：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Issues&lt;/strong&gt;：バグの報告や機能リクエストに使用&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pull Requests&lt;/strong&gt;：コードの貢献とレビューに使用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;しかし、これらのツールは具体的な技術的な問題を処理するのに適しています。以下のシナリオでは、Discussionsがより適切です：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;プロジェクトの方向性の議論&lt;/li&gt;
  &lt;li&gt;使用経験の共有&lt;/li&gt;
  &lt;li&gt;ベストプラクティスの交流&lt;/li&gt;
  &lt;li&gt;コミュニティのQ&amp;amp;A&lt;/li&gt;
  &lt;li&gt;プロジェクトの告知&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;discussionsの主な機能&quot;&gt;Discussionsの主な機能&lt;/h2&gt;

&lt;h3 id=&quot;1-カテゴリ管理&quot;&gt;1. カテゴリ管理&lt;/h3&gt;

&lt;p&gt;Discussionsは複数のカテゴリをサポートします：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;📣 &lt;strong&gt;Announcements（告知）&lt;/strong&gt;：プロジェクトの重要な通知&lt;/li&gt;
  &lt;li&gt;💬 &lt;strong&gt;General（一般討論）&lt;/strong&gt;：日常的な交流&lt;/li&gt;
  &lt;li&gt;💡 &lt;strong&gt;Ideas（アイデア）&lt;/strong&gt;：機能提案と創造性&lt;/li&gt;
  &lt;li&gt;🗳️ &lt;strong&gt;Polls（投票）&lt;/strong&gt;：コミュニティの意思決定&lt;/li&gt;
  &lt;li&gt;🙏 &lt;strong&gt;Q&amp;amp;A（質問と回答）&lt;/strong&gt;：質問への回答&lt;/li&gt;
  &lt;li&gt;🙌 &lt;strong&gt;Show and tell（展示）&lt;/strong&gt;：プロジェクトの展示&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-より柔軟な交流方法&quot;&gt;2. より柔軟な交流方法&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Markdown形式をサポート&lt;/li&gt;
  &lt;li&gt;ユーザーを@メンション可能&lt;/li&gt;
  &lt;li&gt;絵文字をサポート&lt;/li&gt;
  &lt;li&gt;回答済み/未回答としてマーク可能&lt;/li&gt;
  &lt;li&gt;重要な議論をピン留め可能&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-issuesとの統合&quot;&gt;3. Issuesとの統合&lt;/h3&gt;

&lt;p&gt;DiscussionsはIssuesとシームレスに統合でき、議論をIssueに変換したり、Issueから議論を作成したりできます。&lt;/p&gt;

&lt;h2 id=&quot;私のプロジェクト実践&quot;&gt;私のプロジェクト実践&lt;/h2&gt;

&lt;p&gt;最近、&lt;a href=&quot;https://github.com/zeusro/Zeusro.github.io&quot;&gt;Zeusro.github.io&lt;/a&gt;プロジェクトでDiscussions機能を有効にしました。このプロジェクトは私の個人ブログで、Jekyllで構築され、GitHub Pagesでホストされています。&lt;/p&gt;

&lt;p&gt;Discussionsを有効にした後、以下の用途に非常に適していることがわかりました：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;ブログ執筆経験の共有&lt;/li&gt;
  &lt;li&gt;技術トピックの議論&lt;/li&gt;
  &lt;li&gt;読者のフィードバックの収集&lt;/li&gt;
  &lt;li&gt;プロジェクト更新の告知&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;discussionsを有効にする方法&quot;&gt;Discussionsを有効にする方法&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;GitHubリポジトリに移動&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Settings（設定）&lt;/strong&gt;をクリック&lt;/li&gt;
  &lt;li&gt;左メニューで&lt;strong&gt;General&lt;/strong&gt; → &lt;strong&gt;Features&lt;/strong&gt;を見つける&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Discussions&lt;/strong&gt;オプションにチェックを入れる&lt;/li&gt;
  &lt;li&gt;設定を保存&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;有効にすると、リポジトリのホームページに新しい&lt;strong&gt;Discussions&lt;/strong&gt;タブが表示されます。&lt;/p&gt;

&lt;h2 id=&quot;ベストプラクティスの推奨事項&quot;&gt;ベストプラクティスの推奨事項&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;明確なカテゴリ&lt;/strong&gt;：異なるタイプの議論に適切なカテゴリを設定&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;迅速な返信&lt;/strong&gt;：活発なコミュニティの雰囲気を維持&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;重要な情報をピン留め&lt;/strong&gt;：重要な告知をピン留め&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;議論を導く&lt;/strong&gt;：コミュニティメンバーの参加を奨励&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;定期的な整理&lt;/strong&gt;：価値のある議論をドキュメントに整理&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;/h2&gt;

&lt;p&gt;GitHub Discussionsは、オープンソースプロジェクトに、よりオープンで友好的な交流プラットフォームを提供します。IssuesやPull Requestsの不足を補完し、コミュニティの交流をよりリラックスして自然なものにします。オープンソースプロジェクトを維持している場合は、Discussions機能を有効にしてみることをお勧めします。プロジェクトに予想外の活力をもたらすかもしれません。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;この記事はAIによって生成されました&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;!-- Russian Version --&gt;
&lt;div class=&quot;ru post-container&quot;&gt;
    
    &lt;h2 id=&quot;что-такое-github-discussions&quot;&gt;Что такое GitHub Discussions?&lt;/h2&gt;

&lt;p&gt;GitHub Discussions — это функция, запущенная GitHub в 2020 году, которая предоставляет новую платформу для общения сообщества в проектах с открытым исходным кодом. В отличие от традиционных Issues и Pull Requests, Discussions больше похож на форум, позволяя пользователям вести более свободные и открытые обсуждения.&lt;/p&gt;

&lt;h2 id=&quot;зачем-нужны-discussions&quot;&gt;Зачем нужны Discussions?&lt;/h2&gt;

&lt;p&gt;В традиционном сотрудничестве в проектах с открытым исходным кодом мы в основном используем:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Issues&lt;/strong&gt;: Для сообщения об ошибках и предложения функций&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pull Requests&lt;/strong&gt;: Для вклада в код и обзоров&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Однако эти инструменты больше подходят для решения конкретных технических проблем. Для следующих сценариев Discussions более подходят:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Обсуждение направления развития проекта&lt;/li&gt;
  &lt;li&gt;Обмен опытом использования&lt;/li&gt;
  &lt;li&gt;Обмен лучшими практиками&lt;/li&gt;
  &lt;li&gt;Вопросы и ответы сообщества&lt;/li&gt;
  &lt;li&gt;Объявления проекта&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;основные-функции-discussions&quot;&gt;Основные функции Discussions&lt;/h2&gt;

&lt;h3 id=&quot;1-управление-категориями&quot;&gt;1. Управление категориями&lt;/h3&gt;

&lt;p&gt;Discussions поддерживает несколько категорий:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;📣 &lt;strong&gt;Announcements (Объявления)&lt;/strong&gt;: Важные уведомления проекта&lt;/li&gt;
  &lt;li&gt;💬 &lt;strong&gt;General (Общие)&lt;/strong&gt;: Ежедневное общение&lt;/li&gt;
  &lt;li&gt;💡 &lt;strong&gt;Ideas (Идеи)&lt;/strong&gt;: Предложения функций и творчество&lt;/li&gt;
  &lt;li&gt;🗳️ &lt;strong&gt;Polls (Опросы)&lt;/strong&gt;: Решения сообщества&lt;/li&gt;
  &lt;li&gt;🙏 &lt;strong&gt;Q&amp;amp;A (Вопросы и ответы)&lt;/strong&gt;: Ответы на вопросы&lt;/li&gt;
  &lt;li&gt;🙌 &lt;strong&gt;Show and tell (Показ)&lt;/strong&gt;: Демонстрация проектов&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-более-гибкое-общение&quot;&gt;2. Более гибкое общение&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Поддержка формата Markdown&lt;/li&gt;
  &lt;li&gt;Можно упоминать пользователей через @&lt;/li&gt;
  &lt;li&gt;Поддержка эмодзи&lt;/li&gt;
  &lt;li&gt;Можно отмечать как отвеченные/неотвеченные&lt;/li&gt;
  &lt;li&gt;Поддержка закрепления важных обсуждений&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-интеграция-с-issues&quot;&gt;3. Интеграция с Issues&lt;/h3&gt;

&lt;p&gt;Discussions может быть бесшовно интегрирован с Issues. Можно преобразовать обсуждения в Issues или создать обсуждения из Issues.&lt;/p&gt;

&lt;h2 id=&quot;моя-практика-проекта&quot;&gt;Моя практика проекта&lt;/h2&gt;

&lt;p&gt;Недавно я включил функцию Discussions в моем проекте &lt;a href=&quot;https://github.com/zeusro/Zeusro.github.io&quot;&gt;Zeusro.github.io&lt;/a&gt;. Этот проект — мой личный блог, созданный с помощью Jekyll и размещенный на GitHub Pages.&lt;/p&gt;

&lt;p&gt;После включения Discussions я обнаружил, что он очень подходит для:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Обмена опытом написания блога&lt;/li&gt;
  &lt;li&gt;Обсуждения технических тем&lt;/li&gt;
  &lt;li&gt;Сбора отзывов читателей&lt;/li&gt;
  &lt;li&gt;Публикации объявлений об обновлениях проекта&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;как-включить-discussions&quot;&gt;Как включить Discussions?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Перейдите в ваш репозиторий GitHub&lt;/li&gt;
  &lt;li&gt;Нажмите &lt;strong&gt;Settings (Настройки)&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Найдите &lt;strong&gt;General&lt;/strong&gt; → &lt;strong&gt;Features&lt;/strong&gt; в левом меню&lt;/li&gt;
  &lt;li&gt;Установите флажок &lt;strong&gt;Discussions&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Сохраните настройки&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;После включения вы можете увидеть новую вкладку &lt;strong&gt;Discussions&lt;/strong&gt; на главной странице вашего репозитория.&lt;/p&gt;

&lt;h2 id=&quot;рекомендации-по-лучшим-практикам&quot;&gt;Рекомендации по лучшим практикам&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Четкие категории&lt;/strong&gt;: Установите подходящие категории для различных типов обсуждений&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Своевременные ответы&lt;/strong&gt;: Поддерживайте активную атмосферу сообщества&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Закрепление важной информации&lt;/strong&gt;: Закрепляйте важные объявления&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Направление обсуждений&lt;/strong&gt;: Поощряйте участие членов сообщества&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Регулярная организация&lt;/strong&gt;: Организуйте ценные обсуждения в документацию&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;заключение&quot;&gt;Заключение&lt;/h2&gt;

&lt;p&gt;GitHub Discussions предоставляет более открытую и дружелюбную платформу для общения в проектах с открытым исходным кодом. Он дополняет недостатки Issues и Pull Requests, делая общение в сообществе более расслабленным и естественным. Если вы поддерживаете проект с открытым исходным кодом, возможно, стоит попробовать включить функцию Discussions — она может принести неожиданную жизненную силу вашему проекту.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Эта статья была сгенерирована ИИ&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;
</description>
        <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://www.zeusro.com/2026/01/19/github-discussions/</link>
        <guid isPermaLink="true">https://www.zeusro.com/2026/01/19/github-discussions/</guid>
        
        <category>GitHub</category>
        
        <category>开源</category>
        
        <category>社区</category>
        
        <category>Open Source</category>
        
        <category>Community</category>
        
        
      </item>
    
  </channel>
</rss>
