<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>BIT &amp; 42</title><link>https://CoderAmedal.github.io/</link><description>Recent content on BIT &amp; 42</description><generator>Hugo -- 0.160.1</generator><language>zh-CN</language><copyright>2025 Bit &amp;amp; 42. 这是生命、宇宙以及一切的终极版权声明</copyright><lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://CoderAmedal.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Rust Unlimited Intro - Three Times Failed</title><link>https://CoderAmedal.github.io/en/posts/three-times-rust-learning/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/en/posts/three-times-rust-learning/</guid><description>&lt;h1 id="rust-unlimited-intro---three-times-failed"&gt;Rust Unlimited Intro - Three Times Failed&lt;/h1&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Rust has topped Stack Overflow&amp;rsquo;s &amp;ldquo;most loved language&amp;rdquo; survey for years, but its learning curve is equally famous. I started and quit learning Rust three times since 2023 before finally getting past the initial barrier. This is the story of that journey.&lt;/p&gt;
&lt;h2 id="why-learn-rust"&gt;Why Learn Rust?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance &amp;amp; Safety&lt;/strong&gt;: Memory safety without garbage collection — no more GC pause nightmares or segfaults&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern Toolchain&lt;/strong&gt;: Cargo, rustfmt, and Clippy create a seamless build/test/lint experience that makes C++ tooling feel archaic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type System That Catches Bugs Early&lt;/strong&gt;: The compiler catches an incredible amount of errors before runtime — fewer 3 AM on-call wake-ups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Growing Industry Adoption&lt;/strong&gt;: From Linux kernel modules to cloud infrastructure (AWS, Cloudflare), Rust is becoming the standard for systems-level work&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="three-attempts-three-failures"&gt;Three Attempts, Three Failures&lt;/h2&gt;
&lt;h3 id="attempt-1-ownership-sent-me-running"&gt;Attempt 1: Ownership sent me running&lt;/h3&gt;
&lt;p&gt;The first three chapters of The Rust Book felt comfortable — modern syntax, immutability by default, elegant pattern matching. Then Chapter 4 on Ownership hit:&lt;/p&gt;</description></item><item><title>Java还有救吗？</title><link>https://CoderAmedal.github.io/posts/java-future/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/java-future/</guid><description>&lt;h1 id="java还有救吗"&gt;Java还有救吗？&lt;/h1&gt;
&lt;h2 id="这个问题背后的情绪"&gt;这个问题背后的情绪&lt;/h2&gt;
&lt;p&gt;每隔一段时间就会有&amp;quot;Java 已死&amp;quot;的讨论。坦白说，Java 确实有让人不爽的地方：代码冗长、启动慢、内存占用大、框架配置繁琐。和 Go 的简洁、Rust 的性能、Kotlin 的语法糖比起来，Java 显得有些老态龙钟。&lt;/p&gt;
&lt;p&gt;但我觉得这问题的前提就错了——&lt;strong&gt;语言不是用来比的，是用来干活儿的。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="java-真正的竞争力是什么"&gt;Java 真正的竞争力是什么&lt;/h2&gt;
&lt;p&gt;三个字：&lt;strong&gt;生态、人才、兼容。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="生态"&gt;生态&lt;/h3&gt;
&lt;p&gt;Spring Boot、MyBatis、Netty、Kafka、Elasticsearch、Hadoop、Flink……几乎所有中间件和基础设施都对 Java 有一流支持。这不是一朝一夕能追赶的。&lt;/p&gt;
&lt;h3 id="人才"&gt;人才&lt;/h3&gt;
&lt;p&gt;Java 开发者的存量是其他语言难以比拟的。一个公司如果用 Go 或 Rust 创业，招人的难度和成本都会显著高于 Java。不是每个人都能为技术品味买单。&lt;/p&gt;
&lt;h3 id="兼容"&gt;兼容&lt;/h3&gt;
&lt;p&gt;Java 的向后兼容性是业界标杆。十年前写的代码今天还能跑，这在一些业务场景中是无价之宝。银行、保险、政务这些行业的系统换代周期极长，Java 的稳定性就是核心竞争力。&lt;/p&gt;
&lt;h2 id="java-这几年的自救"&gt;Java 这几年的自救&lt;/h2&gt;
&lt;p&gt;Java 的演进速度最近明显加快了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java 17/21 LTS&lt;/strong&gt;：稳定可靠的新时代基线&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟线程（Project Loom）&lt;/strong&gt;：彻底解决了&amp;quot;一个请求一个线程&amp;quot;的资源瓶颈，不需要再用 WebFlux 写回调地狱&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record 类&lt;/strong&gt;：再也不用写 getter/setter/equals/hashCode 了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模式匹配 + switch 表达式&lt;/strong&gt;：语法表达力大幅提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valhalla（值类型）&lt;/strong&gt;：解决 &lt;code&gt;Integer&lt;/code&gt; vs &lt;code&gt;int&lt;/code&gt; 的装箱地狱，性能进一步提升&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Panama（外部函数和内存 API）&lt;/strong&gt;：告别 JNI 的噩梦&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虚拟线程是真正意义上的 game changer——它能在一个 JVM 实例上跑数百万个轻量级线程，与 Go 的 goroutine 正面对标，还不需要破坏现有的 &lt;code&gt;Thread&lt;/code&gt; API。&lt;/p&gt;</description></item><item><title>三入三废的Rust的入门</title><link>https://CoderAmedal.github.io/posts/three-times-rust-learning/</link><pubDate>Fri, 24 Oct 2025 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/three-times-rust-learning/</guid><description>&lt;h1 id="三入三废的rust的入门"&gt;三入三废的Rust的入门&lt;/h1&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;Rust 连续多年在 Stack Overflow 的&amp;quot;最受喜爱语言&amp;quot;调查中排第一，但同样有名的还有它的学习曲线。我从 2023 年开始，前后三次打开 The Rust Book，又三次关上——直到最近才终于摸到了一点门道。这篇文章记录我反复放弃又重新开始的过程，以及这次觉得终于&amp;quot;入门了&amp;quot;的几个关键点。&lt;/p&gt;
&lt;h2 id="为什么要学-rust"&gt;为什么要学 Rust&lt;/h2&gt;
&lt;p&gt;对我个人而言，有几个朴素的动机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;写过高并发服务被 GC 停顿坑过&lt;/strong&gt;：Rust 无 GC 的内存安全保证，解决了&amp;quot;要性能还是安全&amp;quot;的两难&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cargo 生态太舒服了&lt;/strong&gt;：一个命令搞定构建、依赖、测试、发布，比 C++ 的 CMake 地狱友好太多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型系统的安全感&lt;/strong&gt;：Rust 的类型系统让很多 bug 在编译期就被拦截，而不是半夜被报警叫起来排查&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三次放弃的心路历程"&gt;三次放弃的心路历程&lt;/h2&gt;
&lt;h3 id="第一次所有权直接劝退"&gt;第一次：所有权直接劝退&lt;/h3&gt;
&lt;p&gt;第一次翻开 The Rust Book，前三章还挺舒服——语法挺现代的，变量默认不可变，模式匹配很优雅。到 第四章 所有权那里，一切戛然而止。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; s1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; s2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;println!&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, s1); &lt;span style="color:#75715e"&gt;// 编译错误！
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我真的愣住了，心想&amp;quot;凭什么赋值一下就把原变量废了？&amp;quot;——后来才明白这是 Rust &lt;strong&gt;所有权转移（move）&lt;/strong&gt; 的核心，目的是在编译期就标记哪些内存只能有一个 owner。当时理解不了这套心智模型，就放弃了。&lt;/p&gt;
&lt;h3 id="第二次生命周期劝退"&gt;第二次：生命周期劝退&lt;/h3&gt;
&lt;p&gt;几个月后又鼓起勇气再读，这次咬着牙过了所有权。但到了生命周期标注，再次崩溃：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;longest&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(x: &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;str&lt;/span&gt;, y: &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;str&lt;/span&gt;) -&amp;gt; &lt;span style="color:#66d9ef"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#39;a&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;str&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; x.len() &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; y.len() { x } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; { y }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;'a&lt;/code&gt; 是什么？为什么需要手动标？编译器不是能推导生命周期吗？——实际上编译器有时候确实搞不清返回的引用到底来自哪个参数，需要人工标注来约束。但当时的我不理解背后的借用检查器逻辑，只觉得是在和编译器打架。&lt;/p&gt;</description></item><item><title>绿导师："数据即知识，压缩即智能"的个人解读</title><link>https://CoderAmedal.github.io/posts/data-compression-intelligence/</link><pubDate>Sat, 20 Sep 2025 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/data-compression-intelligence/</guid><description>&lt;h1 id="绿导师数据即知识压缩即智能的个人解读"&gt;绿导师：&amp;ldquo;数据即知识，压缩即智能&amp;quot;的个人解读&lt;/h1&gt;
&lt;h2 id="这句话从哪里来"&gt;这句话从哪里来&lt;/h2&gt;
&lt;p&gt;这句话出自 Marcus Hutter（人称&amp;quot;绿导师&amp;rdquo;），他是 AIXI 理论模型的提出者，Hutter Prize（压缩人类知识竞赛）的发起人。原话大致是：&amp;ldquo;data is knowledge, compression is intelligence&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;第一次听到这句话时我觉得它很玄学——压缩不就是 zip 吗，跟智能有什么关系？后来慢慢理解了其中的深意。&lt;/p&gt;
&lt;h2 id="压缩的本质是找规律"&gt;压缩的本质是找规律&lt;/h2&gt;
&lt;p&gt;压缩算法做的事情很简单：&lt;strong&gt;找到数据中的冗余，用更短的符号表示它。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;举个例子：字符串 &lt;code&gt;&amp;quot;ABABABABABAB&amp;quot;&lt;/code&gt;，可以压缩为 &lt;code&gt;&amp;quot;AB×6&amp;quot;&lt;/code&gt;。这个压缩过程的前提是算法&amp;quot;发现&amp;quot;了重复模式 &lt;code&gt;&amp;quot;AB&amp;quot;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这和智能有什么关系？&lt;strong&gt;智能的本质就是发现模式。&lt;/strong&gt; 人类看到天空乌云密布就知道要下雨，这不是玄学，是因为我们的大脑从过去的经验数据中&amp;quot;压缩&amp;quot;出了一个模式：乌云 → 下雨。&lt;/p&gt;
&lt;h2 id="从信息论的角度看"&gt;从信息论的角度看&lt;/h2&gt;
&lt;p&gt;Shannon 的信息论告诉我们：&lt;strong&gt;信息量 = 不确定性的大小&lt;/strong&gt;。一个完全随机的序列无法被压缩，因为它没有规律。而一个能被高度压缩的数据集，说明它内部存在很强的规律性。&lt;/p&gt;
&lt;p&gt;这和机器学习的训练过程完全一致：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型训练 = 从海量数据中提取共同模式（压缩）&lt;/li&gt;
&lt;li&gt;模型推理 = 用提取的模式来解释或预测新数据（解压）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPT 系列模型本质上做了一件事：&lt;strong&gt;用几十亿个参数将互联网上的文本压缩成了一个&amp;quot;世界模型&amp;quot;&lt;/strong&gt;。参数越少、效果越好 = 压缩率越高、失真越低。&lt;/p&gt;
&lt;h2 id="hutter-prize-的启发"&gt;Hutter Prize 的启发&lt;/h2&gt;
&lt;p&gt;Hutter Prize 的规则很简单：谁能把 1GB 的维基百科文本压缩得最小，谁就拿奖。这背后是一个哲学假设：&lt;strong&gt;压缩能力 = 理解能力&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一个只会做字符替换的压缩算法（比如 gzip）无法真正压缩维基百科到极致，因为它不理解语义。但一个理解&amp;quot;中国首都 = 北京&amp;quot;这个知识的人（或 AI），看到文中第三次出现&amp;quot;中国的首都是北京&amp;quot;时，就可以用极短的引用来代替。&lt;/p&gt;
&lt;p&gt;这和人类学习知识如出一辙：&lt;strong&gt;学得越透彻 = 能用越少的关键概念复述整个知识体系。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="对我日常工作的启发"&gt;对我日常工作的启发&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;写代码本质上也是一种压缩。&lt;/strong&gt; 好的抽象就是对重复模式的压缩——把常见逻辑提取成函数、类、模块，本质上和 zip 做的是同一件事。DRY（Don&amp;rsquo;t Repeat Yourself）原则就是编程中的压缩原则。&lt;/p&gt;
&lt;p&gt;反过来看，如果我们发现某个模块难以抽象、代码总是重复——那可能是因为我们对业务模式本身的理解还不够深，还没能找到那个可以被压缩的规律。&lt;/p&gt;
&lt;h2 id="小结"&gt;小结&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;压缩即智能&amp;quot;不是一个可以写在简历上的实用技能，但它提供了一种理解 AI 和智能的元视角：&lt;strong&gt;智能 = 从经验中学习规律 = 压缩数据中的冗余&lt;/strong&gt;。这个框架虽然简化了问题，但用来思考学习和知识体系构建，还是挺有用的。&lt;/p&gt;</description></item><item><title>Podman与Docker的架构分析</title><link>https://CoderAmedal.github.io/posts/podman-docker-architecture/</link><pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/podman-docker-architecture/</guid><description>&lt;h1 id="podman与docker的架构分析"&gt;Podman与Docker的架构分析&lt;/h1&gt;
&lt;h2 id="为什么要关注这个对比"&gt;为什么要关注这个对比&lt;/h2&gt;
&lt;p&gt;Docker Desktop 从 2021 年起对大型企业收费，加上 Docker 本身的一些架构问题（守护进程单点故障、root 权限依赖），促使很多人开始考虑替代方案。Podman 是目前最成熟的替代者。&lt;/p&gt;
&lt;p&gt;我从一个日常使用容器的开发者的角度，聊聊这两个工具的核心差异。&lt;/p&gt;
&lt;h2 id="架构差异"&gt;架构差异&lt;/h2&gt;
&lt;h3 id="docker守护进程模型"&gt;Docker：守护进程模型&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户 → docker CLI → dockerd（守护进程）→ containerd → runc → 容器
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Docker 的核心问题是&lt;strong&gt;所有操作都经过一个 root 权限的常驻守护进程（dockerd）&lt;/strong&gt;。这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dockerd 挂了，所有容器的管理能力就没了&lt;/li&gt;
&lt;li&gt;dockerd 本身是 root 权限运行，是一个安全风险面&lt;/li&gt;
&lt;li&gt;日志、网络等资源都受 dockerd 控制，难以用 systemd 等标准工具管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="podman无守护进程模型"&gt;Podman：无守护进程模型&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户 → podman CLI → 直接 fork → conmon → runc → 容器
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Podman 没有后台守护进程。每次运行容器时，Podman 直接 fork 出一个子进程，通过 conmon 作为容器的监控进程。这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;没有单点故障&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可以用 systemd 管理容器&lt;/strong&gt;（配合 &lt;code&gt;podman generate systemd&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;天然支持 rootless&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rootless-容器的实际意义"&gt;rootless 容器的实际意义&lt;/h2&gt;
&lt;p&gt;Docker 也有 rootless 模式（Docker 19.03+ 引入），但是通过用户态模拟实现的，存在一些限制。Podman 的 rootless 模式从一开始就是核心设计目标，实现得更加成熟。&lt;/p&gt;</description></item><item><title>Vibe Coding 带来的思考与反思</title><link>https://CoderAmedal.github.io/posts/vibe-coding-reflection/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/vibe-coding-reflection/</guid><description>&lt;h1 id="初次使用vibe-coding-带来的思考与反思"&gt;初次使用Vibe Coding 带来的思考与反思&lt;/h1&gt;
&lt;h2 id="什么是-vibe-coding"&gt;什么是 Vibe Coding&lt;/h2&gt;
&lt;p&gt;Vibe Coding 是最近流行起来的一个说法，大致意思是：&lt;strong&gt;对着 AI 编程助手描述你想要的功能，然后让它生成代码，不满意就继续对话调整——整个过程像是在跟代码&amp;quot;聊天&amp;quot;，而不是在写代码。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;今年尝试了 Cursor 和 Claude 的编码助手之后，对 Vibe Coding 有了切身体验，这篇是我的个人反思。&lt;/p&gt;
&lt;h2 id="直观的感受高效与不安并存"&gt;直观的感受：高效与不安并存&lt;/h2&gt;
&lt;p&gt;第一次用 AI 生成一个完整的 CRUD 接口时，我的感觉是震撼的——几行自然语言描述，几十行代码自动生成，import 全都正确，异常处理都帮我写好了。前后不到一分钟。&lt;/p&gt;
&lt;p&gt;但紧接着就是一种隐隐的不安：&lt;strong&gt;这段代码真的正确吗？每一行的意图我都理解吗？如果有隐蔽的 bug，我能发现吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这种不安感其实很准确——AI 生成的代码看起来都对，但偶尔会在一些意想不到的地方出问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生成的 SQL 没考虑到索引设计，在大表上会跑全表扫描&lt;/li&gt;
&lt;li&gt;错误处理写得很&amp;quot;教科书&amp;quot;，但缺乏对业务异常场景的判断&lt;/li&gt;
&lt;li&gt;并发场景下的代码往往有微妙的线程安全问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vibe-coding-最适合做什么"&gt;Vibe Coding 最适合做什么&lt;/h2&gt;
&lt;p&gt;经过一段时间的实践，我觉得 AI 编码助理在以下几个场景中确实非常高效：&lt;/p&gt;
&lt;h3 id="1-样板代码boilerplate"&gt;1. 样板代码（boilerplate）&lt;/h3&gt;
&lt;p&gt;CRUD、DTO 转换、配置解析、API 接入——这些重复性高、逻辑性低的工作，AI 完成得又快又好。我甚至不需要检查太多细节。&lt;/p&gt;
&lt;h3 id="2-探索不熟悉的技术栈"&gt;2. 探索不熟悉的技术栈&lt;/h3&gt;
&lt;p&gt;想快速试一下某个框架的用法？让 AI 生成一段 demo 代码，比翻文档快得多。它可能不是最佳实践，但至少能让你快速看到效果。&lt;/p&gt;
&lt;h3 id="3-单元测试编写"&gt;3. 单元测试编写&lt;/h3&gt;
&lt;p&gt;这是我觉得 AI 最有价值的用途之一。给定一个函数，让 AI 生成各种边界条件的测试用例，它往往能覆盖到一些你没想起来的场景。&lt;/p&gt;
&lt;h3 id="4-代码审查辅助"&gt;4. 代码审查辅助&lt;/h3&gt;
&lt;p&gt;把一段代码贴给 AI，让它分析潜在问题（安全漏洞、性能隐患、代码异味），作为人工审查的补充，效果意外地好。&lt;/p&gt;
&lt;h2 id="vibe-coding-最不适合做什么"&gt;Vibe Coding 最不适合做什么&lt;/h2&gt;
&lt;h3 id="1-核心业务逻辑"&gt;1. 核心业务逻辑&lt;/h3&gt;
&lt;p&gt;涉及复杂的业务规则、状态机、事务处理时，AI 容易出错。而且错误的代价很高——测试不一定能抓到所有边界条件。&lt;/p&gt;</description></item><item><title>对计算机各个专业及面向的场景的理解与思考</title><link>https://CoderAmedal.github.io/posts/cs-major-career-reflection/</link><pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/cs-major-career-reflection/</guid><description>&lt;h1 id="对计算机各个专业及面向的场景的理解与思考"&gt;对计算机各个专业及面向的场景的理解与思考&lt;/h1&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;计算机专业在高校中已分化出十几个方向——计科、软工、网工、信安、物联网、大数据、人工智能……在校时总觉得这些专业各有千秋，毕业后才逐渐体会到，它们之间的界限在工作场景中其实相当模糊。这篇文章是我工作几年后对各专业方向的一些个人理解。&lt;/p&gt;
&lt;h2 id="计科-vs-软工理论与工程的取舍"&gt;计科 vs 软工：理论与工程的取舍&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;h2 id="网络工程与信息安全从通才到专才"&gt;网络工程与信息安全：从通才到专才&lt;/h2&gt;
&lt;p&gt;网络工程专业的处境有些尴尬——纯网络运维的岗位越来越少，云原生和 SDN 让传统网工的技能包在缩水。但网络基础扎实的同学转 DevOps/SRE 其实有天然优势，因为排查线上问题时，网络层往往是第一层怀疑对象。&lt;/p&gt;
&lt;p&gt;信息安全在近五年迎来了爆发。从渗透测试、安全运维到安全开发（DevSecOps），岗位细化程度很高。不过有一点需要注意：安全是一个&lt;strong&gt;需要持续投入&lt;/strong&gt;的方向，漏洞库和攻击手法每天都在更新，比起普通开发岗，它更接近&amp;quot;手艺活&amp;quot;——经验积累的边际收益极高。&lt;/p&gt;
&lt;h2 id="大数据与人工智能热潮下的真实场景"&gt;大数据与人工智能：热潮下的真实场景&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;大数据方向&lt;/strong&gt; 的核心不是 Hadoop、Spark 这些工具本身（它们会更新换代），而是对&lt;strong&gt;分布式计算的思维方式&lt;/strong&gt;——数据分片、shuffle、容错、流批统一。在实际工作中，大部分公司的大数据需求其实是&amp;quot;数据仓库 + ETL + 报表&amp;quot;，真正需要调优大规模集群的场景并没有想象中那么多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人工智能方向&lt;/strong&gt; 这两年的人才供给已经远超需求。大多数 AI 岗位的实际工作内容是数据清洗、特征工程、模型调参，能真正从事算法创新或前沿研究的坑位极少。对于大多数公司来说，调个 API、fine-tune 一个开源模型就够用了。如果只是跟风选 AI，不如先问自己：&lt;strong&gt;你是喜欢调模型，还是喜欢解决业务问题？&lt;/strong&gt; 后者在任何一个方向都能走得远。&lt;/p&gt;
&lt;h2 id="物联网软硬件的交叉地带"&gt;物联网：软硬件的交叉地带&lt;/h2&gt;
&lt;p&gt;物联网是软硬件的交叉地带：嵌入式 C、RTOS、通信协议（MQTT、CoAP）、端侧推理。这个方向的岗位相对分散，大厂有专门的 IoT 部门，中小厂更多是在传统嵌入式开发上叠加联网能力。&lt;strong&gt;如果你喜欢可感知的物理世界反馈（点个灯、驱动个电机），这个方向会有很强的成就感。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="对我自己的反思"&gt;对我自己的反思&lt;/h2&gt;
&lt;p&gt;回头看，我觉得专业选择没有想象中那么重要——更重要的是在学习过程中形成的&lt;strong&gt;问题分解能力和学习习惯&lt;/strong&gt;。工作中用到的具体技术，大部分都是现学的。所以比起纠结选哪个专业，不如关注能不能在某个方向上持续深度学习、积累可复用的方法论。&lt;/p&gt;
&lt;p&gt;这也是我写这个博客的初衷：记录学习过程中的思考，而不是搬运他人已有的知识。&lt;/p&gt;</description></item><item><title>Neo4j图数据库的使用和常用场景分析</title><link>https://CoderAmedal.github.io/posts/neo4j-usage-scenarios/</link><pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/neo4j-usage-scenarios/</guid><description>&lt;h1 id="neo4j图数据库的使用和常用场景分析"&gt;Neo4j图数据库的使用和常用场景分析&lt;/h1&gt;
&lt;h2 id="图数据库解决了什么关系型数据库做不好的事"&gt;图数据库解决了什么关系型数据库做不好的事&lt;/h2&gt;
&lt;p&gt;关系型数据库用外键和 JOIN 来表达实体间的关系，这在关系层级较浅（一两层）时工作得很好。但当关系深度达到三四层甚至更多时，SQL 的 JOIN 会急剧膨胀，性能断崖式下降。&lt;/p&gt;
&lt;p&gt;举个例子：&lt;strong&gt;查找&amp;quot;和用户 A 有共同好友的所有用户&amp;quot;&lt;/strong&gt;——在 SQL 中需要自连接好友表两次，而在 Neo4j 中，这只是一行自然表达的 Cypher 语句。&lt;/p&gt;
&lt;p&gt;图数据库的核心优势：&lt;strong&gt;关系是一等公民，遍历关系的成本是 O(1)&lt;/strong&gt;，而不是 JOIN 的 O(n)。&lt;/p&gt;
&lt;h2 id="典型使用场景"&gt;典型使用场景&lt;/h2&gt;
&lt;h3 id="1-社交网络与推荐系统"&gt;1. 社交网络与推荐系统&lt;/h3&gt;
&lt;p&gt;最经典的场景。用户-好友-帖子-点赞-评论构成了一个天然的图。Neo4j 可以轻松查询：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;二度/三度人脉&lt;/li&gt;
&lt;li&gt;共同好友推荐&lt;/li&gt;
&lt;li&gt;基于&amp;quot;购买了 A 的人也购买了 B&amp;quot;的协同过滤&lt;/li&gt;
&lt;li&gt;内容传播路径追踪&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-反欺诈与风控"&gt;2. 反欺诈与风控&lt;/h3&gt;
&lt;p&gt;欺诈行为往往是&lt;strong&gt;团伙作案&lt;/strong&gt;：一群虚假账户共享相似的设备、IP、银行卡。在关系型数据库中检测这种环形关联非常困难，但 Neo4j 可以用路径查询快速发现：&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;/ul&gt;
&lt;h3 id="3-知识图谱"&gt;3. 知识图谱&lt;/h3&gt;
&lt;p&gt;知识图谱本质就是实体-关系-实体的三元组。Neo4j 天然适合：&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;/ul&gt;
&lt;h3 id="4-权限与组织架构"&gt;4. 权限与组织架构&lt;/h3&gt;
&lt;p&gt;公司组织架构是天然的树/图结构。Neo4j 在处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;汇报链查询&lt;/li&gt;
&lt;li&gt;权限继承&lt;/li&gt;
&lt;li&gt;RBAC 角色层级&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;等场景时比递归 SQL 简洁得多。&lt;/p&gt;
&lt;h3 id="5-网络与基础设施拓扑"&gt;5. 网络与基础设施拓扑&lt;/h3&gt;
&lt;p&gt;CMDB、微服务依赖图、网络拓扑、路由分析——这些都是图结构的天然应用场景。用 Neo4j 存储后，可以通过路径查询快速回答&amp;quot;服务 A 宕机会影响哪些下游&amp;quot;这类问题。&lt;/p&gt;
&lt;h2 id="cypher-基础语法感受"&gt;Cypher 基础语法感受&lt;/h2&gt;
&lt;p&gt;Cypher 是 Neo4j 的查询语言，风格上有点像 SQL 但专门为图设计。几个基础操作：&lt;/p&gt;</description></item><item><title>《Java 并发编程的艺术》个人总结</title><link>https://CoderAmedal.github.io/posts/java-concurrency-art-summary/</link><pubDate>Sat, 23 Mar 2024 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/java-concurrency-art-summary/</guid><description>&lt;h1 id="java-并发编程的艺术个人总结"&gt;《Java 并发编程的艺术》个人总结&lt;/h1&gt;
&lt;h2 id="为什么读这本书"&gt;为什么读这本书&lt;/h2&gt;
&lt;p&gt;工作中写并发代码的机会不少——线程池、缓存、异步处理——但遇到诡异的可见性问题或死锁时，往往只能靠加 &lt;code&gt;synchronized&lt;/code&gt; 碰运气。这本书系统地梳理了 Java 内存模型和并发工具的设计原理，读完确实对调试并发问题有了更清晰的思路。&lt;/p&gt;
&lt;h2 id="核心知识点梳理"&gt;核心知识点梳理&lt;/h2&gt;
&lt;h3 id="1-并发编程的挑战"&gt;1. 并发编程的挑战&lt;/h3&gt;
&lt;p&gt;书中开篇说的三个核心问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文切换&lt;/strong&gt;：线程多了，CPU 花在切换上的时间比干活还多&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;/ul&gt;
&lt;p&gt;经验上，&lt;strong&gt;线程数 ≈ CPU 核数 × 2（取决于 IO 密集还是计算密集）&lt;/strong&gt; 是一个比较可靠的起点。&lt;/p&gt;
&lt;h3 id="2-java-内存模型jmm"&gt;2. Java 内存模型（JMM）&lt;/h3&gt;
&lt;p&gt;这是全书最重要的一章。JMM 控制的是&lt;strong&gt;一个线程对共享变量的写入何时对另一个线程可见&lt;/strong&gt;。核心概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;happens-before 规则&lt;/strong&gt;：程序顺序、volatile、锁、传递性等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;volatile&lt;/strong&gt;：保证可见性和禁止指令重排序，但不保证原子性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锁&lt;/strong&gt;：&lt;code&gt;synchronized&lt;/code&gt; 和 &lt;code&gt;ReentrantLock&lt;/code&gt; 同时保证原子性和可见性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;并发编程中大部分诡异 bug 的根因都是&lt;strong&gt;对 JMM 的理解不到位&lt;/strong&gt;——以为一个线程写完了另一个线程就一定能读到。&lt;/p&gt;
&lt;h3 id="3-并发基础组件"&gt;3. 并发基础组件&lt;/h3&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;&lt;code&gt;volatile&lt;/code&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;code&gt;synchronized&lt;/code&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;code&gt;ReentrantLock&lt;/code&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;code&gt;AtomicInteger/Long/Reference&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CAS 无锁原子操作&lt;/td&gt;
&lt;td&gt;计数器、状态机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CountDownLatch&lt;/code&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;code&gt;CyclicBarrier&lt;/code&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;code&gt;Semaphore&lt;/code&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;h3 id="4-线程池"&gt;4. 线程池&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ThreadPoolExecutor&lt;/code&gt; 的核心参数关系：&lt;/p&gt;</description></item><item><title>主流关系型数据库的差异及性能分析</title><link>https://CoderAmedal.github.io/posts/rdbms-comparison-performance/</link><pubDate>Sun, 24 Apr 2022 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/posts/rdbms-comparison-performance/</guid><description>&lt;h1 id="主流关系型数据库的差异及性能分析"&gt;主流关系型数据库的差异及性能分析&lt;/h1&gt;
&lt;h2 id="一份中立的对比"&gt;一份中立的对比&lt;/h2&gt;
&lt;p&gt;工作中先后接触过 MySQL、PostgreSQL、Oracle，也用过 SQL Server 和 SQLite。每个数据库都有自己的设计哲学和适用场景。这篇文章整理一下个人理解，不吹不黑，尽量实事求是。&lt;/p&gt;
&lt;h2 id="核心差异速览"&gt;核心差异速览&lt;/h2&gt;
&lt;h3 id="mysql互联网的首选"&gt;MySQL：互联网的首选&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心优势&lt;/strong&gt;：简单、运维成熟、社区庞大。&lt;/p&gt;
&lt;p&gt;MySQL 的设计哲学是&amp;quot;够用就好&amp;quot;。它不像 PostgreSQL 那样追求 SQL 标准的完备性，而是优先保证简单场景下的性能。InnoDB 存储引擎是绝大多数场景的唯一选择——B+ 树索引、MVCC、行级锁。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;需要注意的点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对复杂查询（窗口函数、CTE）的支持较晚，直到 8.0 才比较完善&lt;/li&gt;
&lt;li&gt;JSON 支持和全文索引够用但不强&lt;/li&gt;
&lt;li&gt;复制架构基于 binlog，GTID 复制在管理上很便利&lt;/li&gt;
&lt;li&gt;幻读问题：InnoDB 在可重复读隔离级别下通过 Next-Key Lock 解决，但实际上还是可能发生（快照读 vs 当前读）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：OLTP、互联网业务、读写分离架构、中小规模数据。&lt;/p&gt;
&lt;h3 id="postgresql功能最完备的开源数据库"&gt;PostgreSQL：功能最完备的开源数据库&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心优势&lt;/strong&gt;：SQL 标准兼容性最好、扩展性强、适合复杂查询。&lt;/p&gt;
&lt;p&gt;PostgreSQL 是一个&amp;quot;学院派&amp;quot;数据库，它的功能完备程度在某些方面甚至超过商业数据库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最完整的窗口函数、CTE、递归查询支持&lt;/li&gt;
&lt;li&gt;优秀的 JSON/JSONB 支持（可以当半个文档数据库用）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;丰富的索引类型&lt;/strong&gt;：B-Tree、Hash、GiST、SP-GiST、GIN、BRIN&lt;/li&gt;
&lt;li&gt;原生支持地理空间数据（PostGIS）&lt;/li&gt;
&lt;li&gt;外键、触发器、函数等支持非常完整&lt;/li&gt;
&lt;li&gt;MVCC 实现基于多版本行存储，会产生死元组，需要定期 VACUUM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;需要注意的点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;连接开销比 MySQL 大，高并发短连接场景需要连接池（PgBouncer）&lt;/li&gt;
&lt;li&gt;VACUUM 和 ANALYZE 需要关注，否则性能会逐渐下降&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：复杂业务逻辑、数据分析、GIS、需要高度 SQL 标准兼容的场景。&lt;/p&gt;
&lt;h3 id="oracle企业级标杆"&gt;Oracle：企业级标杆&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;核心优势&lt;/strong&gt;：最成熟的优化器、最完善的高可用方案、最强的硬件利用率。&lt;/p&gt;
&lt;p&gt;Oracle 的核心竞争力在于它的优化器和 RAC（Real Application Clusters）。Oracle 的 CBO 优化器的成熟度是其他数据库难以比拟的——同样的复杂查询，Oracle 往往能选出更优的执行计划。RAC 实现了多节点共享存储的集群架构，提供了极高的可用性。&lt;/p&gt;</description></item><item><title>简历</title><link>https://CoderAmedal.github.io/resume/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://CoderAmedal.github.io/resume/</guid><description>&lt;h1 id="简历"&gt;简历&lt;/h1&gt;
&lt;h2 id="软件开发工程师---袁小昆"&gt;软件开发工程师 - 袁小昆&lt;/h2&gt;
&lt;h3 id="下载简历"&gt;下载简历&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://CoderAmedal.github.io/resume/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88-%E8%A2%81%E5%B0%8F%E6%98%86.pdf"&gt;下载 PDF 简历&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>