原创 张汉东 2025-10-24 22:51 日本
二十年前的今天,我刚踏上程序员之路,满怀着改变世界的理想。二十年后的今天,我想和你聊聊这些年最深的感悟。
今天是 10月 24,程序员节。
二十年前的今天,我刚踏上程序员之路,满怀着改变世界的理想。二十年后的今天,我想和你聊聊这些年最深的感悟。
技术不是寻找完美,而是在约束中寻找足够好。
硬件到 AI,每一层的“最佳实践”都是权衡的产物。
妥协 ≠ 退让,而是工程成熟的尺度与边界。
引子:程序员节,谈一件“逆耳”的事
技术圈最显眼的常态,是永不停歇的“宗教之争”: Vim vs Emacs,Tabs vs Spaces,React vs Vue,Cpp vs Rust, ChatGPT vs Claude 等等。
每隔几年,新的"圣战"就会爆发。有人宣称某技术是未来,有人坚守另一派为正统。这些争论激烈得像宗教战争,仿佛守护的不是技术选择,而是信仰本身。
为什么会这样?因为大多数人没有理解技术的本质。
技术的本质是什么?是权衡与妥协。
不是完美的解决方案,不是绝对的真理,而是在约束条件下的最优权衡。每一个技术决策,都是在理想与现实之间画出的那条曲线。
一、硬件:在物理定律与经济约束之间
让我们从最底层说起。
CPU 的演进史,就是一部妥协史。
Intel 的 CISC 追求指令的强大功能,ARM 的 RISC 追求简洁可并行。两大阵营争斗多年,最后呢 ?Intel 在微架构里悄悄用上了 RISC 的思想,ARM 在新架构里也加入了复杂指令。
为什么主频停在了 5GHz 左右?不是工程师不够努力,而是功耗墙就在那里。每提高 1GHz,功耗可能翻倍,散热成了不可能完成的任务。于是我们转向多核,转向多核、超标量、向量化与异构(CPU+GPU+NPU)。我们用并发的复杂性来换单核无法再给的速度。
存储的层级结构更是妥协的艺术:
L1 缓存:极快但极小
L2/L3 缓存:稍慢但稍大
内存:更慢但更大
SSD/HDD:最慢但最大
L1/L2/L3 Cache → DRAM → SSD → HDD,层层下沉、层层变慢也变便宜。整个 memory hierarchy 就是速度/容量/成本的结构化妥协。再加上写回、预取、NUMA 拓扑与一致性协议(如 MESI),我们用复杂性换来“看起来像一体”的性能。
这不是设计缺陷,而是在速度、容量、成本三者间寻找平衡点。
二、操作系统:自由、性能与安全的永恒博弈
操作系统是抽象的大师,但每一层抽象都有代价。
Linux 选择了宏内核,牺牲模块化换取性能;微内核追求优雅的隔离,却在现实中因性能问题(有消息传递开销)边缘化。虚拟内存让每个进程以为自己独占整个地址空间,代价是页表、TLB、缺页中断的复杂机制。于是我们再引入 eBPF、io_uring、用户态网络栈等把热路径前移的方法,在安全与性能之间重新画线。
调度算法永远在做不可能的权衡:
追求公平?牺牲吞吐量
追求响应?牺牲公平性
追求实时?牺牲灵活性
吞吐、延迟、公平、实时性,任何调度器都只能在其中择其二三。所谓“完全公平(CFS,完全公平调度器)”,其实是足够公平,它只是"完全公平"的近似。。这不是退步,而是承认多目标优化的现实边界。
三、编程语言:人机对话的翻译难题
每种语言都代表一种哲学立场,一种特定的妥协方式。
C 语言的哲学是"信任程序员",给你全部的自由和责任,代价是内存安全与并发安全几乎全靠纪律与经验。
Java 说 "Write once, run anywhere",JIT/GC 减轻了很多痛苦,但启动时延、内存开销与运行时复杂性是默认账单。
Rust 选择了"零成本抽象"和所有权系统,把痛苦提前到编译期。所有权、借用检查、零成本抽象,让运行时更安全高效;代价是学习曲线、编译时长与语法复杂度。这是“编译期多吃苦,运行时少流血”的妥协。
Python 牺牲速度换来极致表达与生态;Go 牺牲一些范式与特性换来工程简单、部署轻;C++ 用复杂度去追求性能与泛型威力。没有完美语言,只有适配问题域的妥协点。
语言之争的本质,是不同问题域下的妥协哲学之争。
四、算法:在理想与现实间寻找出路
理论计算机科学告诉我们很多问题是 NP 完全的,现实告诉我们客户等不了那么久。
于是我们发明了:
启发式 / 贪心:不保证全局最优,但够快、够好。
近似算法:用误差界换时间界。
随机化算法:用概率保证换确定性开销。
数据结构的选择:Bloom Filter 以假阳性换内存省;LRU/LFU 以命中率近似换实现简洁。
快速排序的平均复杂度 O(nlogn)很美好,最坏情况O(n²)很糟糕,但我们还是用它。因为最坏情况很少发生。
算法之美,常常是,知道何时停止追求完美。不追求数学的完美,追求统计上的可用。
五、密码学:用确定性伪造随机性
密码学可能是最诗意的妥协。
真随机来自物理世界(量子/热噪声等),工程上难以稳定获取,于是我们用伪随机数生成器(PRNG)从种子出发,产出对攻击者“计算上不可区分”的序列。现代密码构件(流/分组密码、KDF、MAC)大多建立在这种“足够像随机”的假设上。
我们知道 PRNG(伪随机数生成器)产生的不是真随机,但只要在多项式时间内无法区分,我们就认为它"够随机"。整个现代密码学体系,都建立在这个"计算上安全"的妥协之上。
密码学,就是伪随机向真随机的妥协。数学上它并不“真”,工程上它足够“安全”。
这是一种优雅的哲学:承认我们无法触及真正的混沌,但可以用秩序模仿混沌,用数学守护这个美丽的假象。
六、工程实践:理想架构与交付压力
每个程序员都有过这样的经历:
设计时画出优雅的架构图,上线后发现到处是权宜之计。我们在完美设计与交付压力间反复拉扯:
CAP/一致性等级:强一致牺牲可用与延迟,最终一致换来扩展与韧性。
可维护性 vs 性能:“能跑得更快”和“能长期维护”常常不可兼得。
技术债与遗留系统:向后兼容、灰度发布、A/B 与降级策略,是对业务连续性的现实让步。
流程文化:敏捷 vs 规范、文档 vs 交付、自治 vs 合规……组织同样在妥协。
能上线、能迭代、能稳定演进,往往比一次性“完美架构”更有价值。这是工程的常态。
支撑整个软件世界运转的,不是教科书上的完美设计,而是可持续的妥协艺术。
七、AI Agent:在通用智能之前
人工智能的历史,就是不断降低预期的历史。
我们梦想 AGI(通用人工智能),现实给了我们狭义 AI。我们期待机器理解世界,它们只是在拟合数据分布。我们想要真正的智能,得到的是"看起来像智能"的模型。
深度学习牺牲可解释性换来泛化能力;大模型牺牲效率换来通用性;对齐(Alignment)让输出更“人类可接受”,但限制了原始能力。
这是一连串确定性与不确定性的妥协。
Agent,就是 AGI 的妥协:用可控的模块化智能替代尚不可达的通用智能 。
而 AI 编程呢?是在人类认知与系统复杂度之间的妥协。
_认知的妥协_:让模型分担样板与搜索空间,人专注问题定义与评审。
_创造与控制的妥协_:用约束、RAG、Guardrail 把生成式的不确定“框”在产品可接受范围。
_语言的妥协_:用自然语言表达意图,再由模型映射到严格的代码与接口世界。
AI 不是“完美的程序员”,但它让人类与复杂系统达成了可工作的中间态。
八、妥协的哲学:不是失败,是智慧
年轻时,我总想找到完美的解决方案。写代码追求零 bug,做架构追求永不过时,选技术追求一步到位。
二十年后我才明白:成熟不是找到完美方案,而是知道何时、为何、如何妥协。
妥协不是放弃理想,而是在约束条件下寻找最优解。就像凸优化问题,全局最优可能不可达,但我们可以找到足够好的局部最优。
真正的高手,不是那些永不妥协的人,而是那些妥协得恰到好处的人。他们知道:
在哪里可以让步,在哪里必须坚守
什么是核心需求,什么是锦上添花
如何在理想和现实间搭建可行的桥梁
结语:1024的意义
1024,2 的 10 次方,计算机世界的基础单位。
但它也提醒我们:即便在这个建立在 0 和 1 之上的二进制世界里,现实依然充满灰度。每一个系统、每一行代码、每一个架构决策,都是在完美与可行之间的精心权衡。
技术的进步,不是消除妥协,而是找到更优雅的妥协方式。从汇编到高级语言,从单机到分布式,从瀑布到敏捷,我们一直在学习如何更好地妥协。
所以,当你下次遇到技术选型的争论,不妨想想:他们争的不是对错,而是不同的妥协策略。
当你为代码不够完美而苦恼,记住:能上线的系统,胜过完美的设计。
当你面对架构的 trade-off,要知道:妥协不是技术债,而是工程智慧。
写在最后
1024快乐,致所有在约束中创造可能的程序员们。
我们不是代码机器,而是在物理定律、商业需求、人性弱点的夹缝中,用智慧和妥协构建数字文明的建筑师。
正因为世界不完美,我们的工作才有意义。正因为需要妥协,技术才成为艺术。
愿你在下一个二十年里,继续优雅地妥协,继续在不完美中创造美好。
因为这,就是技术的本质。
