summaryrefslogtreecommitdiff
path: root/2025
diff options
context:
space:
mode:
Diffstat (limited to '2025')
-rw-r--r--2025/12/19/临床研究中盲态规则存在的原因/index.html2
-rw-r--r--2025/12/20/谈谈软件工程/index.html366
-rw-r--r--2025/12/25/二〇二五年十二月二十五日/index.html2
3 files changed, 368 insertions, 2 deletions
diff --git a/2025/12/19/临床研究中盲态规则存在的原因/index.html b/2025/12/19/临床研究中盲态规则存在的原因/index.html
index 3e966206..6c55f9e9 100644
--- a/2025/12/19/临床研究中盲态规则存在的原因/index.html
+++ b/2025/12/19/临床研究中盲态规则存在的原因/index.html
@@ -219,7 +219,7 @@
<div class="icon arrow-left"></div>
<div class="post-link">
- <a href="/2025/12/25/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/">Prev</a>
+ <a href="/2025/12/20/%E8%B0%88%E8%B0%88%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/">Prev</a>
</div>
</div>
diff --git a/2025/12/20/谈谈软件工程/index.html b/2025/12/20/谈谈软件工程/index.html
new file mode 100644
index 00000000..41f46e90
--- /dev/null
+++ b/2025/12/20/谈谈软件工程/index.html
@@ -0,0 +1,366 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+<meta http-equiv="X-UA-Compatible" content="ie=edge">
+
+ <meta name="author" content="韩暮秋">
+
+
+ <meta name="subtitle" content="暮秋小屋">
+
+
+ <meta name="description" content="这里是暮秋小屋,思念和灵感的寄存处">
+
+
+ <meta name="keywords" content="韩暮秋,MuqiuHan,'Muqiu Han', 'muqiu han', muqiuhan">
+
+
+
+
+ <title>
+
+ 谈谈软件工程 |
+ 暮秋小屋
+ </title>
+
+
+
+ <link rel="icon" href="/favicon.ico">
+
+
+ <style>
+ @font-face {
+ font-family: CarroisSong;
+ src: url('/fonts/CarroisSong.ttf');
+ }
+ </style>
+
+
+
+ <!-- stylesheets list from _config.yml -->
+
+ <link rel="stylesheet" href="/css/style.css">
+
+
+
+
+
+ <!-- scripts list from _config.yml -->
+
+ <script
+ src="/js/menu.js"></script>
+
+
+
+
+
+ <script
+ src="https://polyfill.alicdn.com/polyfill.js?features=es6"></script>
+ <script
+ id="MathJax-script"
+ async
+ src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/mathjax/3.2.0/es5/tex-mml-chtml.js"></script>
+
+
+
+
+ <meta name="generator" content="Hexo 6.3.0"></head>
+ <body>
+ <div class="mask-border">
+ </div>
+
+ <div class="wrapper">
+
+ <div class="header">
+ <div class="flex-container">
+ <div class="header-inner">
+ <div class="site-brand-container">
+ <a href="/">
+
+ 暮秋小屋
+
+ </a>
+ </div>
+ <div id="menu-btn" class="menu-btn" onclick="toggleMenu()">
+ 菜单
+ </div>
+ <nav class="site-nav">
+ <ul class="menu-list">
+
+
+ <li class="menu-item">
+ <a href="/">
+ 主页
+ </a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/categories/gallery/">
+ 日记本
+ </a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/tags/Medicine/">
+ 医学
+ </a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/tags/Technique/">
+ 计算机/互联网
+ </a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/tags/Life/">
+ 生活
+ </a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/archives">
+ 全部
+ </a>
+ </li>
+
+
+
+ <li class="menu-item">
+ <a href="/about">
+ 关于
+ </a>
+ </li>
+
+
+
+ <li class="menu-item search-btn">
+ <a href="#">Search</a>
+ </li>
+
+ </ul>
+ </nav>
+ </div>
+ </div>
+</div>
+
+ <div class="main">
+ <div class="flex-container">
+ <article id="post">
+
+
+ <div class="post-head">
+ <div class="post-info">
+ <div class="tag-list">
+
+
+ <span class="post-tag">
+ <a href="/tags/Technique/">
+ Technique
+ </a>
+ </span>
+
+
+ </div>
+ <div class="post-title">
+
+
+ 谈谈软件工程
+
+
+ </div>
+ <span class="post-date">
+ Dec 20, 2025
+ </span>
+ </div>
+ <div class="post-img">
+
+ <div class="h-line-primary"></div>
+
+ </div>
+</div>
+ <div class="post-content">
+ <p>#软件工程</p>
+<blockquote>
+<p>在有限认知下,持续对抗系统熵增,在相互冲突的目标间做出最优权衡,以可工程化的方式交付价值。</p>
+</blockquote>
+<p>一、复杂性是固有属性,而非偶然缺陷</p>
+<p>软件复杂性源于<strong>状态空间的指数级爆炸</strong>。一个仅有100个布尔变量的系统,其状态空间已达 $2^{100}$(约 $10^{30}$),远超人类认知极限。</p>
+<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例:复杂度不在于代码行数,而在于状态组合</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Order</span>:</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="variable language_">self</span>.paid = <span class="literal">False</span> <span class="comment"># 2^1</span></span><br><span class="line"> <span class="variable language_">self</span>.shipped = <span class="literal">False</span> <span class="comment"># 2^2</span></span><br><span class="line"> <span class="variable language_">self</span>.cancelled = <span class="literal">False</span> <span class="comment"># 2^3</span></span><br><span class="line"> <span class="comment"># 3个布尔值 -&gt; 8种合法状态,但业务规则会禁止某些组合</span></span><br><span class="line"> <span class="comment"># 真实系统有上千个状态变量 -&gt; 灾难</span></span><br></pre></td></tr></table></figure>
+<p>复杂性是软件的本质,无法消除,只能转移或控制。这与建筑工程有本质区别,桥梁不会自发产生新状态。</p>
+<p>二、 熵增是不可逆热力学过程</p>
+<p>组织沟通结构的混乱会精确映射为代码结构的混乱。代码在没有外力干预下必然走向腐烂。</p>
+<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">graph TD</span><br><span class="line"> A[需求变更] --&gt; B[快速补丁]</span><br><span class="line"> B --&gt; C[技术债务]</span><br><span class="line"> C --&gt; D[开发速度下降]</span><br><span class="line"> D --&gt; E[更多补丁]</span><br><span class="line"> E --&gt; C</span><br><span class="line"> style C fill:#f00,stroke:#333,stroke-width:2px</span><br></pre></td></tr></table></figure>
+<p>技术债务的利息是<strong>超线性</strong>增长的。一个类被10个模块依赖时,修改它的成本不是10倍,而是约 $O(n^2)$ 倍,因为需要理解所有依赖方的上下文。</p>
+<p>三、人类认知约束</p>
+<p>人类工作记忆容量为 $7 \pm 2$ 个信息单元。这是代码审查、架构设计、故障排查的硬性天花板。</p>
+<ul>
+<li><strong>微观影响</strong>:函数参数超过5个,Bug率指数上升(认知过载)</li>
+<li><strong>宏观影响</strong>:微服务拆分粒度需匹配团队规模(2个披萨团队原则)</li>
+</ul>
+<p><strong>工程化手段</strong>:通过<strong>抽象</strong>和<strong>封装</strong>将信息压缩到认知边界内。</p>
+<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 坏:每次调用需理解10个参数</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">processOrder</span><span class="params">(<span class="type">int</span> userId, <span class="type">int</span> productId, String addr, ... )</span> <span class="comment">// 8+参数</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 好:将认知负荷压缩到1个概念</span></span><br><span class="line">orderProcessor.handle(<span class="keyword">new</span> <span class="title class_">OrderContext</span>(...)); <span class="comment">// 单一职责</span></span><br></pre></td></tr></table></figure>
+<p>四、权衡是唯一的决策动作</p>
+<p>不存在&quot;最佳实践&quot;,只存在&quot;在特定约束下的最优权衡&quot;。</p>
+<table>
+<thead>
+<tr>
+<th style="text-align:left">维度</th>
+<th style="text-align:left">方案A</th>
+<th style="text-align:left">方案B</th>
+<th style="text-align:left">权衡代价</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td style="text-align:left"><strong>一致性</strong></td>
+<td style="text-align:left">强一致 (分布式锁)</td>
+<td style="text-align:left">最终一致 (事件驱动)</td>
+<td style="text-align:left">可用性↓ vs 延迟↓</td>
+</tr>
+<tr>
+<td style="text-align:left"><strong>性能</strong></td>
+<td style="text-align:left">缓存热点数据</td>
+<td style="text-align:left">实时查询DB</td>
+<td style="text-align:left">一致性风险 vs 成本↑</td>
+</tr>
+<tr>
+<td style="text-align:left"><strong>交付</strong></td>
+<td style="text-align:left">重构老系统</td>
+<td style="text-align:left">增量迁移</td>
+<td style="text-align:left">短期风险 vs 长期成本</td>
+</tr>
+<tr>
+<td style="text-align:left"><strong>灵活性</strong></td>
+<td style="text-align:left">抽象接口</td>
+<td style="text-align:left">硬编码</td>
+<td style="text-align:left">复杂度↑ vs 开发速度↑</td>
+</tr>
+</tbody>
+</table>
+<p><strong>决策框架</strong>:每次技术选型必须回答:</p>
+<ol>
+<li>优化了什么指标?(延迟、吞吐、正确性)</li>
+<li>牺牲了什么?(成本、一致性、简单性)</li>
+<li>牺牲是否可接受?(业务是否允许P99.9延迟上升50ms?)</li>
+</ol>
+<p>五、工程化 = 可重复 + 可验证 + 可协作</p>
+<p>代码本身是廉价的,<strong>可维护、可演进的系统</strong>才是工程目标。</p>
+<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line"> subgraph &quot;工程化三支柱&quot;</span><br><span class="line"> A[自动化测试] --&gt; D[可验证]</span><br><span class="line"> B[CI/CD流水线] --&gt; E[可重复]</span><br><span class="line"> C[Code Review + 文档] --&gt; F[可协作]</span><br><span class="line"> end</span><br><span class="line"> D &amp; E &amp; F --&gt; G[对抗熵增]</span><br></pre></td></tr></table></figure>
+<p><strong>关键指标</strong>:</p>
+<ul>
+<li><strong>MTTR</strong>(平均修复时间) &lt; <strong>MTBF</strong>(平均故障间隔)是伪命题。真实目标是:<strong>MTTR 必须小于业务容忍的极限</strong>。</li>
+<li><strong>Bus Factor</strong>:核心模块的 Bus Factor=1 时,系统已处于高风险状态,与人无关,是工程化失败。</li>
+</ul>
+<hr>
+<p>自然界趋向无序,软件工程通过持续注入<strong>负熵</strong>(规范、测试、重构)维持秩序。</p>
+<p>在认知约束下,通过严格的工程纪律,将不可控的复杂性转化为可控的复杂性,并在永恒的权衡中追求局部最优解。</p>
+<p>没有银弹,只有<strong>在正确的时间,为正确的目标,做出正确的权衡,并准备好为选择付出代价</strong>。</p>
+
+</div>
+
+<script>
+ window.onload = detectors();
+</script>
+ <div class="post-footer">
+ <div class="h-line-primary"></div>
+ <nav class="post-nav">
+ <div class="prev-item">
+
+ <div class="icon arrow-left"></div>
+ <div class="post-link">
+ <a href="/2025/12/25/%E4%BA%8C%E3%80%87%E4%BA%8C%E4%BA%94%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/">Prev</a>
+ </div>
+
+ </div>
+ <div class="next-item">
+
+ <div class="icon arrow-right"></div>
+ <div class="post-link">
+ <a href="/2025/12/19/%E4%B8%B4%E5%BA%8A%E7%A0%94%E7%A9%B6%E4%B8%AD%E7%9B%B2%E6%80%81%E8%A7%84%E5%88%99%E5%AD%98%E5%9C%A8%E7%9A%84%E5%8E%9F%E5%9B%A0/">Next</a>
+ </div>
+
+ </div>
+ </nav>
+</div>
+
+
+ <div class="post-comment">
+
+
+
+
+
+
+
+</div>
+
+
+</article>
+ </div>
+ </div>
+
+ <div class="footer">
+ <div class="flex-container">
+ <div class="footer-text">
+
+
+ 韩暮秋 |
+
+
+ 希望路过的人可以添点柴火让这里暖和点
+
+ </div>
+ </div>
+</div>
+
+ </div>
+
+
+ <div class="search-popup">
+ <div class="search-popup-overlay">
+ </div>
+ <div class="search-popup-window" >
+ <div class="search-header">
+ <div class="search-input-container">
+ <input autocomplete="off" autocapitalize="off" maxlength="80"
+ placeholder="Search Anything" spellcheck="false"
+ type="search" class="search-input">
+ </div>
+ <div class="search-close-btn">
+ <div class="icon close-btn"></div>
+ </div>
+ </div>
+ <div class="search-result-container">
+ </div>
+ </div>
+</div>
+
+<script>
+ const searchConfig = {
+ path : "/search.xml",
+ top_n_per_article: "1",
+ unescape : "false",
+ trigger: "auto",
+ preload: "false"
+ }
+</script>
+<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/search.js"></script>
+<script src="/js/search.js"></script>
+
+
+
+ </body>
+</html>
diff --git a/2025/12/25/二〇二五年十二月二十五日/index.html b/2025/12/25/二〇二五年十二月二十五日/index.html
index 8cc766b8..db3539e5 100644
--- a/2025/12/25/二〇二五年十二月二十五日/index.html
+++ b/2025/12/25/二〇二五年十二月二十五日/index.html
@@ -245,7 +245,7 @@
<div class="icon arrow-right"></div>
<div class="post-link">
- <a href="/2025/12/19/%E4%B8%B4%E5%BA%8A%E7%A0%94%E7%A9%B6%E4%B8%AD%E7%9B%B2%E6%80%81%E8%A7%84%E5%88%99%E5%AD%98%E5%9C%A8%E7%9A%84%E5%8E%9F%E5%9B%A0/">Next</a>
+ <a href="/2025/12/20/%E8%B0%88%E8%B0%88%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/">Next</a>
</div>
</div>