
大家好,我是Tony Bai。
“如果你没有坏,就不要修它。” (If it ain't broke, don't fix it.)
这句老生常谈的工程谚语,最近在r/golang 社区的一次热议中再次得到了血淋淋的验证。
一位开发者 分享了他即使成功将一个 Python 服务重写为 Go,并取得了显著的性能提升,却依然感到挫败和后悔的经历。
你可以将其看成是一个关于 Go vs Python 的技术故事,但在我眼中这更像是一堂关于技术决策、团队协作和职场生存的必修课。
故事的开端听起来像是一个典型的技术爽文。
作者说服了管理层,让他将现有的 API 网关从 Python/Flask 重写为 Go。理由非常充分且“正确”:性能和并发。
经过两个月的努力,重写非常成功:
从技术指标上看,这是一场完胜。Go 语言在这个场景下再次证明了其在云原生和高并发领域的统治力。
然而,当新系统上线后,现实给了作者一记重拳。
用户感知到了什么?Absolutely nothing.(完全没有。)
响应时间从 45ms 降到了 38ms。这 7ms 的提升,除了作者盯着 Grafana 监控面板自我陶醉外,没有任何用户能察觉到区别。
团队感知到了什么?
巨大的风险和负担。
原来的 Python 版本虽然性能稍逊,但完全能扛住现有的负载,而且团队所有人都知道如何维护它。现在,系统变成了一个只有作者一人能懂的 Go 服务。
结果就是:作者成为了唯一的维护者(Single Point of Failure),任何报警都只能找他,哪怕是在半夜或周末。
这篇帖子引发了数百条评论,虽然有些评论非常“毒舌”,但其中蕴含的工程智慧却发人深省。
正如一位开发者指出的:“你花了公司两个月的薪水和机会成本,解决了一个并不存在的问题。”
在商业环境中,技术是手段,不是目的。如果性能提升不能转化为用户体验的改善(如更流畅的交互)或成本的显著降低(如服务器费用减半),那么这种优化就是没有商业价值的。
不少人犀利地指出,这种重构往往是出自开发者的私心——为了学习新技术、为了给简历镀金。
“这就是为什么我不想让程序员做商业决策。他们会为了微秒级的性能提升,制造出一系列未来的维护挑战。”
在一个 Python 团队中引入 Go,打破了技术栈的同质性。这不仅增加了维护成本,还降低了团队的“巴士系数”(Bus Factor)。
“有时候,最好的技术选择,就是你团队已经掌握的那一个。”
注:巴士系数(Bus Factor)是一个用于衡量团队或项目中关键人员的依赖程度的指标。它的核心概念是,如果某些关键成员(例如开发人员、设计师或管理人员)因意外(如被公交车撞到)而无法继续工作,项目仍能以多大程度上保持运作。
那么,这是否意味着我们在 Python/Java/Node 团队中就不能引入 Go 了?当然不是。但需要满足特定的前提:
这个故事告诉我们,成为一名 Senior 工程师,不仅仅意味着写出更快的代码,更意味着懂得何时不写代码。
Go 是一把锋利的“屠龙刀”,但如果你的面前并没有龙,用它来切菜,可能不仅切不好,还会伤到自己。
下次当你想要重写一个服务时,请先问自己三个问题:
如果答案不确定,或许最好的选择是——Don't fix what's not broke.
资料链接:https://www.reddit.com/r/golang/comments/1qr9375/rewrote_our_python_api_gateway_in_go_and_now_its/
你的“重构”悔恨录
“重写”是每个程序员都曾有过的冲动。在你的职业生涯中,是否也曾因为执着于某种“新技术”或“极致性能”,而给团队带来了意想不到的麻烦?或者,你见过哪些典型的“简历驱动开发”案例?
欢迎在评论区分享你的故事!让我们在别人的教训中,学会做更成熟的决策。👇
如果这篇文章让你停下来思考了 30 秒,别忘了点个【赞】和【在看】,并转发给那个正准备“大干一场”的同事!
点击下面标题,阅读更多干货!
- 从 Python 到 Go:我们失去了什么,又得到了什么?
- “6个月,47个微服务”:一场由“简历驱动”引发的架构灾难
- 从Go“叛逃”到Java,再回归:一位开发者关于“魔法”与“显式”的深度反思
🔥 还在为“复制粘贴喂AI”而烦恼?我的新极客时间专栏《AI原生开发工作流实战》将带你:
扫描下方二维码👇,开启你的AI原生开发之旅。
