咳咳,TLDR,草草而就瞎说两句。标题不沾点 AI 是没人看了。
在软件开发的漫长历史中,诞生了无数旨在提升代码质量、可维护性和可扩展性的程序设计原则。如果有一天 AGI 接管了世界,要清空我记忆中的所有准则,只允许保留两个,我会毫不犹豫地选择它们:
1. KISS(Keep It Simple, Stupid)
保持简单,大道至简。
我最欣赏的设计模式之一便是装饰器模式,它在 Web 服务端框架中无处不在。登录鉴权、频次控制、日志审计再到核心业务逻辑,诸多模块都需要这种层层叠加、灵活控制输入输出的能力。
装饰器所蕴含的哲学宏大深远,甚至契合宇宙的运转规律——月亮装饰地球,地月系统装饰太阳,而整个太阳系又装饰着银河。这正应了那句诗:“你站在桥上看风景,看风景的人在楼上看你”。
业务领域的复杂性是客观存在的,但将复杂的领域模型转化为同样复杂的技术架构,绝非值得炫耀的功勋。复杂的系统架构毫无美感可言,往往只透露出一种“失控”的信号。
我们的任务是化繁为简。当然,需求源头本身的复杂性暂且按下不表。对于既成事实,最有效的方法莫过于分而治之,由此衍生出分层、分模块等经典的架构模式。
以人体自身为例,最复杂的模块莫过于神经系统。当复杂性无法被简化时,将其集中约束在一处,而非扩散至整个系统,这也是简化设计的重要思路之一。
2. DRY(Don't Repeat Yourself)
不要重复自己,保持一致性。
没有冗余意味着信息只存在于唯一一处,这天然保证了极致的全局一致性与极低的维护成本——任何变更只需修改一个地方。
然而,冗余并非总是坏事。
在分布式存储领域,Paxos 算法是保证高可用与强一致性的基石之一。但在实际中,我们常常为了性能做出妥协,例如引入缓存(一种读写冗余),转而追求最终一致性或会话级别的一致性。
不重复自己,但可以“替代”他人。开源世界正是因为这种“一言不合就另起炉灶”的活力,才催生了百花齐放的轮子,给了开发者更多选择。
再看人类自身,本质上也是一个高效的“复读机”,太阳底下无新事。复制本身就是一种保护机制,在稳定中寻求突变。
所以,DRY 原则并不绝对排斥冗余,关键在于建立确保最终一致性的有效机制。
程序员常自嘲命名是编程中最难的事,其本质是对核心概念的厘清。一个混乱的系统,往往源于概念的模糊和边界的纠缠。它不仅存在冗余,还充满了重叠——同一个事物被分裂成无数碎片,又散落在各处。因此,精准定义、简洁命名,确实是极具挑战与技术含量的工作。
AI Coding 时代,有何不同?
世界有时像个“草台班子”。许多设计准则、架构模式和研发流程在理论上无比美好,但一旦加入“人类”这个变量,一切都会变得有趣且充满意外。无论公司规模多大、团队经验多丰富,总会在意想不到的地方冒出低级错误。这个结论已被反复验证,并将在未来持续上演。
因此,“先扛住,再优化”,敏捷迭代,小步快跑,接受不完美才是常态。
那么,AI 会是那个“完美程序员”吗?
如今时代变了,AI 似乎正在成为程序员的主体。我们是否可以将 AI 视为绝对理性的工具,将古往今来所有优秀的架构准则、设计模式、编码规范作为不可违背的“规则”一股脑塞给它,从而打造出一个理想中的“完美程序员”?
我的结论是:没指望。
这倒不是对 AI 的能力缺乏信心,而是对指挥 AI 工作的人类缺乏信心。这本身也是个伪命题,技术终究服务于业务,业务形态决定了技术路线。如果产品方向尚且不明,技术架构又将依附于何处?拥抱变化才是永恒的课题。
但这并非否定技术前瞻性的价值。以视频产品为例,在设计“观看历史”功能时,如果要考虑扩展性,很可能会想到多设备隔离的需求,那么存储设计就不能仅基于登录账号。如果未来同设备也需要隔离观看记录呢?比如家庭中不同成员共用一台设备看动画片,切换虚拟账号就变得合理。这时,同设备与跨设备的隔离需求,在技术层面可以是同一个解决方案。
越是宏观的架构设计,与产品方向的绑定就越深,也越难预测和预留扩展性。指望 AI 预先洞察一切是不现实的。
不过,在一些更具体的细节上,AI 确实能做得更好。
从小处着手
例如,代码中那些神秘的“魔法数字”,理应被语义明确的枚举或常量取代;任何逻辑重复到第二遍时,就应该立刻触发重构的念头。
当然,前提是 AI 能在其上下文窗口内察觉到这种重复。上下文不需要无限大,也不应该无限大。就像对入口参数的校验,并不需要贯穿调用链路上的每一个函数,核心在于划定合理的边界。在边界处,我们互不信任,严防死守;在边界内,我们给予究极信任,追求高效协同。
“草台班子”模式,有时反而是小团队的典范。再往深处想,过度思考本身就是一种过度设计,其本质是增加了系统的复杂度。两个模块有时序依赖,一个简单的同步调用就能搞定,非要解耦成基于消息队列的异步架构,只会短期内徒增实现成本和理解调试的难度。
资源有限的草台班子没空想太多,它是完美主义的反义词,唯一的信条就是“动起来,活下去”。
因此,它有两个值得肯定的特质:
- 不盲从:质疑权威,大家都是草台班子,凭什么你能做的我就不能做?
- 脚踏实地:着眼于当下高 ROI(投资回报率)地解决问题。想到就做,方法虽土但管用,正所谓“功夫再高,也怕菜刀”。
当然,“想到就做”与想清楚短期目标、敲定方案细节并不矛盾。毕竟,“一句话需求”可是能害死程序员的。
要成为真正的典范,还需要打上一个补丁:长期主义,即对长期目标保持执着追求的信念。
总之,坚守初心,保持简单。在快速迭代的 AI 编程时代,这些经典原则的价值,反而在对比中愈发凸显。更多关于编码规范与工程实践的深入讨论,也欢迎你来 云栈社区 交流分享。