前两天,我写了篇别再只当“Go语言API调用工程师”了!,文章发出后,后台的讨论很热烈,也让我看到了很多来自一线开发者的真实思考。
其中一个非常普遍且有价值的观点是:“我们当前的业务场景,真的需要这么深的技术吗?”
这个质疑很有道理。的确,在不同的业务场景下,对技术深度的要求天差地别。有些金融或ToB业务,QPS可能 1 都不到,但稳定和安全是第一位的。同时,很多成功的独立开发者,他们开发一个小工具,快速上线,用户量不大,也一样能获得很好的回报。
这些现实让我开始反思:我所提倡的“理解底层”,是不是在某些场景下,被异化成了一种无意义的“技术内卷”?
今天,我想聊聊我的答案:我们可能都误解了“理解底层”的真正目的。它从来不只关乎性能。
目的之一:为了“确定性”,而不是“高性能”
对于一个1 QPS的系统,性能确实不重要。但如果这个QPS的交易,涉及数百万的资金清算,那什么最重要?
是稳定性、是可靠性、是100%的确定性。
你是否遇到过,因为不理解 channel 的阻塞和缓冲机制,导致 goroutine 在某个错误分支上被永久挂起,最终造成了缓慢的内存泄漏,直到服务 OOM 重启?
你是否遇到过,因为不理解数据库的事务隔离级别,导致在高并发(哪怕只是瞬间的并发)下,读到了“脏数据”,造成了账目不一致?
你是否遇到过,因为不理解操作系统的文件句柄限制,导致一个平时没问题的服务,在某个大促或月末结算的瞬间,因为打开了过多文件而崩溃?
在这些场景下,“理解底层”不是为了让程序跑得更快,而是为了让你在写下每一行代码时,都对它在各种极端情况下的行为有十足的把握。
对于高价值、低QPS的系统,这种确定性,远比性能优化那几个百分点重要得多。它直接关系到业务的生命线。
目的之二:为了“开发效率”,而不是“运行效率”
很多人有个误区,认为理解底层等于花大量时间去优化,会降低开发效率。
恰恰相反。在很多时候,对底层的理解,是为了让你在遇到问题时,能用最快的速度定位和解决,从而极大地提升“综合开发效率”。
举个例子:一个服务在容器里跑得好好的,突然有一天性能急剧下降。
不懂底层的人: 会一头扎进业务代码里,查日志、加监控、改逻辑,折腾好几天,最后发现是运维调整了K8s的CPU Limit。
懂底层的人: 看到现象后,会立刻形成一个思维检查清单:“业务代码问题?不太像。GC问题?有可能。容器资源问题?可能性很大。” 他会直接去查容器的 CPU Throttling 指标,可能几分钟就定位了根源。
“知道去哪里找问题”,本身就是一种极高的效率。
对于独立开发者或者小团队来说,创始人/核心开发的时间是最宝贵的资源。快速解决问题、避免在“灵异事件”上空耗,就是省钱、省时间。你不需要把系统优化到极致,但你需要有快速“破案”的能力,而这种能力,就来自于你对“下一层”的理解。
目的之三:为了“技术自由”,而不是“技术内卷”
我们来定义一下什么是“技术内卷”:为了优化而优化,用屠龙之技去杀鸡,把简单的方案复杂化。
比如,为了一个10 QPS的内部系统,非要上Service Mesh,非要搞极致的内存优化,这就是内卷。
那什么是“技术自由”?
技术自由是,你拥有广泛且深入的知识储备,从而在面对任何问题时,都能游刃有余地选择最“恰当”的解决方案。
面对一个简单的后台管理系统,你能判断出“一把梭”的单体应用就是最高效的方案,并快速交付。
面对一个高并发的秒杀场景,你能立刻意识到需要动用缓存、消息队列、原子操作等一系列底层知识去构建一个可靠的系统。
当老板让你评估一个新技术时,你能凭借对网络、操作系统、编译原理的理解,快速看透它的本质、优劣和适用场景,而不是仅仅停留在看几篇官方的“Hello World”文档。
“理解底层”不是让你在所有项目里都用上“核武器”,而是让你知道工具箱里有“核武器”,并且清楚地知道它的威力、副作用和使用时机。
写在最后:我们到底在追求什么?
技术服务于业务,这是一个永恒的真理。
对于绝大多数公司和工程师来说,我们的目标,是用技术手段,在有限的成本和时间内,去解决一个具体的商业问题。
在这个过程中,“理解底层”不是鄙视链,更不是技术人自嗨的“军备竞赛”。它是一种“兜底”能力,是一种“解耦”能力——让你能把问题从复杂的业务逻辑中解耦出来,放到正确的层次去解决。
所以,别再纠结于“1 QPS要不要懂底层”了。
不如换个问法:“当那个1 QPS的、价值连城的系统,在你意想不到的地方崩溃时,你希望自己是那个束手无策的人,还是那个能从容地找到症结所在的人?”
我想,答案不言自明。