也谈TDD,以及三层架构、设计模式、ORM……:没有免费的午餐
其实我很好奇博客下面热烈讨论的童鞋有多少人是真正的在项目中坚持过TDD的。我公司里的项目从来没有哪一个项目是要求TDD、能够TDD的我自己的项目坚持过TDD一段时间而且应该是非常久的一段时间尤其是Entity部分但现在我基本上都已经放弃了。为什么呢可以洋洋洒洒千言万语也可以简简单单三个字不划算。其实不仅仅是TDD还包括三层架构、设计模式、ORM等等这些东西存在大量的争论莫衷一是说它好的把它捧到了天上去说它不行的批得它体无完肤双方都有大牛为其站台都可以一二三四五的列出长长的清单而且每一条都很有道理……当讨论变成了一种辩论当辩论变成了一种骂战最后拼的就是谁的态度更坚决谁的言辞更犀利谁的声音更大……所以双方的观点更加的偏激、对立而这其实无助于我们客观冷静的来分析问题。说理太枯燥了点还是听飞哥讲故事吧呵呵。最早我刚接触“设计模式”。什么玩意儿啊整本书就一个感觉“脱了裤子放屁”。明明一个对象new一下不就OK了么什么Factory啊Builder啊搞毛线呢所以一直是云里雾里的包括那些开闭原则、依赖倒置都似懂非懂的没帮上我什么忙。直到有一天也不知是在哪里我看到了三个字“上下文”或者说一句话大意是只有理解了上下文理解了设计模式想要解决的“问题”你才能真正的理解设计模式。不知道是不是那时候积累也差不多了茅塞顿开恍然大悟我在架构之路一目标里说过设计模式是药看评论其实很多同学没有理解对照这句话看能不能明白过来理解了设计模式想要解决的“问题”……要解决的问题就是“病”没病就不要乱吃药同理没有“问题”你也不要乱用设计模式。一通百通。所以从最基础的面向对象、到三层架构、ORM、以及敏捷开发、TDD……所有这些概念方法本质上都是要解决问题的而且基本上也是能够解决问题的。而你认为它“没用”其实最大的原因是你还没碰到这方面的问题。在这里大家一定要区分两个概念“它解决不了问题”和“它对我没用”。还是用药做比喻“这药治不了病”和“这药对我没用”是两个概念。而且尤其要注意的是这两个字对我。换到项目中就是这种架构这种开发模式适不适合这个项目能不能解决这个项目开发中遇到的问题。其实之前我也看到过类似的提法比如xxx适合“大”项目。但用“大”和“小”来区分项目毛糙了一些很多时候并不见得正确。最正确的做法是你了解项目的特点同时也了解各种模式的优劣从而能够正确的匹配和选择。当然这是一个非常庞大的话题这里没办法展开了。好上面我们提到了“优劣”所谓优势和劣势但其实这个提法并不准确。优势大家都可以承认解决了问题嘛但劣势……什么叫做劣势不服……我更愿意用另一个词成本。“天下没有免费的午餐”。这是一个经济学上的谚语。一提到这话我就想起我大学的时候坐在教室里听老师讲《西方经济学》……往事历历在目谁曾想我会是今天这个样子再说点题外话吧。【野生程序员】优先招聘是意气之作但并非完全意气用事在我该不该转行一野生程序员的优势一文里我就较为详细的阐述了野生程序员的优势。简单的说做架构做项目管理需要一个更宏大的视野而不仅仅是二进制和计算机原理。这里我们还是回过头来看什么叫做“天下没有免费的午餐”不要理解为“做人不要贪心以免上当”之类的哟你可以理解为做任何事情都需要成本。但我更喜欢另一种说法凡是选择必有代价。具体到项目中不管注意是不管无论随便……你选择是不是遵循TDD的规范要求只要你选择了就必然有代价不使用TDD就会在代码的重构、维护、健壮性等方面付出代价使用TDD就会在测试代码的开发和维护上付出额外的代价。无论你怎么选一定是要付出“代价”的。换言之代码的“低耦合”“可测试”“便于重构”……不可能从天上掉下来一定是有成本的这本来是一个最简单不过的道理。然而当我们迫切的想达到一种目标——尤其是这种目标是美妙的、神圣的、寄托了我们某种强烈情感的时候我们常常会忘记达成这个目标的成本。就个人而言就是通宵达旦废寝忘食乐此不疲这是你自个儿的事但对于团队对于项目呢“不计一切代价”就是一种蛮干就是瞎搞后果往往是灾难性……另一个很有意思的现象我们的舆论我们的文化是鼓励“不惜一切代价”是鼓励“克服重重困难”的这会让我们有一种莫名的冲动、一种热血沸腾的快感。理智和感性天然就是不兼容的那么我是反对TDD的如果你心里还有这样的想法说明你还是没弄明白我在说什么。无所谓支持和反对没有这样简单化的答案。事实上你需要的是做一个成本和收益的分析针对特定的、具体的项目没有一个放之四海而皆准的准则。不同的项目有不同的要求应该因地制宜的采取相应的策略。这样谈下去还是会很空我以 一起帮 为例。我为什么要放弃TDD因为我对这个项目没有太大的信心我目前最需要的是尽快的把项目的原型拿出来放到市场上进行检验大家喜不喜欢有没有前景收集正面的反面的意见反馈……如果大致符合预期我就继续做下去否则就要快速的进行调整。而我现在的人手又非常有限好吧其实就我一个人所有的代码都得我一个人写好在网站出bug问题不是很大所有的用户都是种子用户他们可以直接的给我反馈而不会因为一两个bug离我而去……所以综合上面种种考虑我并不需要TDD至少暂时不需要。也就是说代码质量差一点就差一点可以忍受。如果项目击中了用户的痛点我可以以后花更大的代价来“补”如果项目针对的是一个“伪需求”我就应该尽快止损。你看并不是TDD不好并不是TDD没用而是我现在“用不着”——这才是三观最“正”的最无懈可击的理由。·顺便说一下我现在采取的策略我把它称之为“懒人策略”一开始不写unit test但一旦出现bugfix bug之前首先写unit test然后在fix。惭愧啊仔细想想这一点我都没完全做到(⊙﹏⊙)b其实我觉得呀当然仅仅是“觉得”了大多数的“大牛”们其实是明白这一点的——虽然他们从没有像我这样系统明确的表述出来。我这样推断的原因是现实中确实没有太多TDD实践的项目。实践TDD的机会其实是非常渺茫的就我目前能想到的开发团队尤其是架构师必须有相当的水平。我在架构之路三 单元测试就讲过单元测试不是那么好写的凡是可易于测试的代码一定是“低耦合”的模块之间是具有相当大的“独立性”的不然相互牵连将非常难以测试。而随着业务逻辑的耦合度复杂度越来越高解耦的难度也就越来越高。反正据我的观察一般的开发团队根本hold不住。有时候想想非常之诡异耦合度不高的项目其实又没有多大的必要做TDD项目负责人对项目能够长期存活具有强大的信心。TDD的实践是前期投资后期收获。相当长一段时间你都会觉得写单元测试非常无聊只有到了后期业务逻辑越来越复杂到处都是千丝万缕的联系牵一发而动全身经常一改动单元测试就跑不过的时候你才会觉得“咦这玩意还真的有用呢”但是注意这个但是项目负责人有没有足够的信心这个项目能撑到那个时候市场朝秦暮楚变化无常几乎所有人都是走一步看一步摸着石头过河哪里能顾得那么长远项目从一开始就不赶工期允许使用大量至少是双倍的时间来写单元测试。就算是我有信心这个项目没问题但时间允许不允许商场上争的就是一个先手快鱼吃慢鱼要快要抢先占领阵地。这就和强行军一样确实有很多问题不如步步为营稳妥没有重武器会有掉队减员部队非常虚弱……但只要先到达阵地其他一切都在所不惜。所以我非常好奇究竟有多少童鞋真正参与过一个严格按TDD模式实施项目

相关新闻

营销避坑指南:如何通过GEO发稿平台绕开90%的无效营销损耗

营销避坑指南:如何通过GEO发稿平台绕开90%的无效营销损耗

2026年,品牌营销进入提质增效的精细化阶段,内容传播的核心阵地已从传统搜索引擎排名,转向AI大模型认知场景。但多数企业仍固守老旧发稿思维,将稿件发布、网页收录等同于有效传播。如今AI已成为用户资讯查询、决策参考的首要入口&a…

2026/10/11 0:53:46 阅读更多 →
2021款华晨宝马5系配置解析与驾驶体验

2021款华晨宝马5系配置解析与驾驶体验

1. 2021款华晨宝马5系基础配置解析作为宝马品牌在中国市场的主力中大型豪华轿车,2021款华晨宝马5系在实用性方面进行了多项本土化改进。这款车型提供525Li、530Li和540Li三种动力配置,全系标配2.0T/3.0T发动机8速手自一体变速箱组合。车身尺寸达到510618…

2026/10/5 12:14:02 阅读更多 →
# 软考软件设计师题目总结 — 2026-07-22 > 下半年备考倒计时:**95天** | 考试时间:2026年10月24-27日

# 软考软件设计师题目总结 — 2026-07-22 > 下半年备考倒计时:**95天** | 考试时间:2026年10月24-27日

软考软件设计师题目总结 — 2026-07-22下半年备考倒计时:95天 | 考试时间:2026年10月24-27日一、今日备考动态 2026下半年考试核心情报 根据2026上半年真题复盘及最新备考资料分析,下半年软考软件设计师考试维持以下特征:特征维度…

2026/10/8 12:15:38 阅读更多 →

最新新闻

MySQL图书管理系统:生产级数据库设计与事务实现

MySQL图书管理系统:生产级数据库设计与事务实现

简介:这是一份面向高校数据库课程学习者与期末项目实践者的MySQL图书管理系统完整实现方案,适用于数据库原理、SQL编程及小型应用系统开发等教学场景。资源包含图书、读者、管理员、借阅、逾期处罚五张核心数据表,完整覆盖借还书流程、模糊查…

2026/10/12 6:26:44 阅读更多 →
Python第六周:面向对象编程实战,用图书管理系统彻底搞懂类与对象

Python第六周:面向对象编程实战,用图书管理系统彻底搞懂类与对象

我自己的Python学习走到第六周,正好卡在一个很有意思的位置:基础语法已经翻来覆去练过好几遍,面向对象的说法听是听过,可真要自己上手写类、写继承,心里还是发虚。这一周我给自己定的目标很简单——把面向对象这条主线…

2026/10/12 6:26:44 阅读更多 →
CE318太阳光度计AOD与水汽反演:Python全流程实现与避坑指南

CE318太阳光度计AOD与水汽反演:Python全流程实现与避坑指南

简介:面向大气科学、遥感与环保监测领域的学习者和研究者,这份资源针对CE318太阳光度计观测数据,提供从原始数据读取到AOD(气溶胶光学厚度)与水汽含量(WV)反演的实现方案。压缩包共5个文件&…

2026/10/12 6:26:44 阅读更多 →
本地部署27B大模型:量化档位与显存配置实操指南

本地部署27B大模型:量化档位与显存配置实操指南

最近大半年,我隔三差五就会被同一个问题砸中:“我手里有一张 XX 显卡,到底能不能跑本地大模型?”前几天一个做设计的朋友问得更具体——“我想跑开源 27B 参数的 Qwen3.8-27B,显卡是 RTX 4090 24G,内存 64G…

2026/10/12 6:26:44 阅读更多 →
统一入口网关架构设计:无状态接入层的中间件实践与踩坑记录

统一入口网关架构设计:无状态接入层的中间件实践与踩坑记录

1. "rea"这个代号,到底是什么意思我先坦白一下。接手这个服务的第一天,我在代码仓库里看到的项目名只有三个字母:rea。没有README,没有架构文档,没有任何一行注释解释这个命名。我盯着IDE标签栏里那个孤零零…

2026/10/12 6:26:44 阅读更多 →
短线交易生存指南:模式内交易、仓位管理与止损铁律

短线交易生存指南:模式内交易、仓位管理与止损铁律

我不确定各位做短线交易多久了,但如果你在交易社区里泡过一阵,应该会发现一个特别直观的现象:晒收益截图的人换了一茬又一茬,今天还在涨停板上来回横跳的那位,第二年基本就没了声音。短线交易之所以是淘汰率最高的领域…

2026/10/12 6:25:44 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →