今天在reddit看到微软某大牛的博客(https://blogs.msdn.microsoft.com/ericgu/2017/06/22/notdd/),说到拒绝TDD(测试驱动开发,下文统一使用TDD)的事情。我很有感触。感兴趣的可以看看原文,我大概总结一下原文的意思(TL;DR):1、大多数TTD做的好的,都是设计和重构牛逼的;2、如果TDD的第三步(重构)去掉,剩下的只有一堆耦合很高的测试,写测试耗时很长,测试很难写。所以新手在学习编程时,学会设计和重构才是最重要的,而设计和重构是通过经验获得的,没有很死的规则。

下面有个很有意思的评论,说现在只要有人反对TDD的思想,别人就会鄙视他/她。那些TDD的推崇者,说TDD做不好的,是“没有按照正确的方式”来做。于是团队里某个TDD拥护者想给其他人展示“正确的方式”:写了一个小程序,包含300个测试;程序到了QA,几天内发现90个bug;都是典型的UI bug;修复前两个bug花了三天,因为很多测试要重写……

上面的例子有些夸张,不知道是否属实。我对TDD有大概的认识,不过向来不感冒。大概是因为我对于编程的理解,和TDD有本质的不同。TDD要求测试优先,我不知道有没有人在实践中,会先把测试写出来,再去写代码。这个是我不能理解的。如果要写测试,必然是要测试的东西都设计好了,接口成形了。实际上,我们往往在实现的过程中,才可以逐渐把接口抽象出来。也就是说,写程序的过程,是一个重构的过程,重要的是写出一些代码来,才有的重构,才有的测试。

程序的设计是需要重构的,一开始没有人能把所有细节想清楚,往往一开始是不管设计的,只要写出来一个能够用的程序,可能设计很糟糕,但是至少有个重构的对象,剩下的就是在不改变功能的情况下,来对程序进行各种变换修改了。作家写作也是一样的,先不管他,把能想到的都写出来,然后再调整、修改、润色,这和写程序一模一样。

不知道大家看到大触绘画没有,或者雕刻家雕刻,这些都有个共同的特点,就是一开始只是画个大概和轮廓,然后再一遍一遍地雕琢细节。我认为写程序本质上和画画、雕刻、写作等艺术创作的过程是一样,你有个灵感,写一些东西,重构一下,再重构一下,直到你认为成形了。唯一不一样的,是程序的有些部分需要实际运行才能确认是否正确,我想这才是测试的价值:你对于某一部分没有信心,所以写个测试来确保这块能够正常运行,通常这部分都是和外部系统交互的。

把测试提到最重要的部分,用测试来保证程序的正确性,是本末倒置的表现,也是一种教条主义。就像所谓各种敏捷的方法论一样,虽然有一定的价值,然而按照全部规则来做的,无疑会出现各种问题。团队都是不一样的,敏捷也要理解精髓,自定义实践,而不是拿别人总结的规则来生搬硬套。

posted @ 2017-07-03 10:58 Leading 阅读(5454) 评论(58) 推荐(19) 编辑
摘要: 难以置信,我居然工作快两年了。我从入职时,西装革履,到现在,牛仔T恤。我的工作是IT咨询顾问,但实际做的事情,就和一个程序员差不多。没人把我当成一个顾问。在客户领导和很多同事眼里,我和外包的程序员没有区别。我在一份简历中写道:顾问的核心价值并不在于他知道什么,做过什么,而在于他强大广泛的知识背景、学... 阅读全文
posted @ 2015-06-13 14:04 Leading 阅读(2075) 评论(15) 推荐(9) 编辑
摘要: Oanda fxTrade, with Chinese language, there are clearly three font rendering styles. I can not bear the java one. 阅读全文
posted @ 2015-05-08 23:14 Leading 阅读(1061) 评论(0) 推荐(0) 编辑
摘要: 项目上要基于现有代码开发,却碰到了很多让人蛋疼的代码。例如下面这个,大家看看能找到多少槽点: 1 public static String addDate(String date, String into) throws Exception 2 { 3 String ... 阅读全文
posted @ 2014-12-01 18:08 Leading 阅读(369) 评论(1) 推荐(0) 编辑
摘要: 摘要:你会学到一种原创的同时循环两个列表的方法。类似于Python或者Haskell的zip函数,非常简洁直观,效果如下:$ paste $tmpfile1echo $list2 | tr ' ' '\n' > $tmpfile2paste $tmpfile1 $tmpfile2rm --f... 阅读全文
posted @ 2014-05-01 00:48 Leading 阅读(7199) 评论(0) 推荐(2) 编辑
摘要: 首先来个效果图(卖个关子,本图含有玄机……)还有这幅图,不知各位读者能否观察出与上图的不同之处:1. 介绍话说微软的控制台程序(cmd和Powershell)默认字体十分难看,网上有不少文章讲怎么修改字体。大多数都是通过切换代码页(936到437),然后选择一个在注册表添加的字体。但是中文字体却少有设定的。如果能用微软雅黑做中文字体就好了,但是微软雅黑定义上不是等宽字体,所以没法直接使用。后来不经意间,我发现了Windows自己有个FontLink功能,也就是说,如果某个字体有不能显示的字符,就用一些备用字体来替换(熟悉Java的同学,记得fontconfig.properties吧)。这些可 阅读全文
posted @ 2013-02-06 23:39 Leading 阅读(23547) 评论(6) 推荐(1) 编辑
摘要: 最近我写的一个客户端程序出了问题,即很多用户同时掉线时(例如在打开很多客户端的电脑上拔掉网线),有很小的概率服务器会出现异常。异常的Trace显示,这是对已经关闭的TcpClient写入数据时导致的。具体是调用NetworkStream.BeginWrite方法时,出现InvalidOperationException,消息是“写操作不支持”。而这个异常甚至没有在BeginWrite的MSDN文档中出现。我查看了一下代码,主要原因是很多用户同时掉线,很可能同时出现心跳停止。在用户退出时,会向所有其他用户发送通知消息。这时,如果一个用户退出时向其他用户发送消息,而那个用户正好也在退出,其TcpC 阅读全文
posted @ 2012-10-24 17:24 Leading 阅读(6148) 评论(0) 推荐(0) 编辑
摘要: 使用Emacs的人,如果肯折腾,肯定有重新映射键盘的经历。我原来经常看到的是把Ctrl和Capslock交换,但是我感觉没什么道理,因为Ctrl已经用的很熟练了,换了反而不方便,而且对其他程序影响太大。那么我们就要使用默认的方式吗?除非你想把手弄抽筋,否则还是调整一下的好。今天我就说一下整体的键盘配置,可以不影响正常使用,提升总体舒适感,又可以同时方便Vi和Emacs的使用。首先我把所有Windows特殊的按键都给取消了(例如Ctrl+Shift或Ctrl+Space切换输入法,连续按五次Shift出现辅助功能等),只用一个中文输入法切换,设为Ctrl+Home。这些是有用的,首先,玩游戏的同 阅读全文
posted @ 2012-09-29 12:58 Leading 阅读(2655) 评论(3) 推荐(1) 编辑
摘要: 阅读全文
posted @ 2012-09-24 15:58 Leading 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 因为这个问题,我很想抽微软。网上其他人有类似的问题,我也碰到了,没有很好的解决方案。这个问题是Winsock所特有的(最起码所有的问题都是在Windows平台下)。一般在使用UDP Socket时,我们发出去数据,是不管它到不到达的,而且UDP并不是面向连接的,所以在收到这个错误时,会感觉很奇怪:“连接被重置10054”。这个错误一般是使用UDP Socket接受时收到(这里我不讲具体的语言了,不管你用C#、Python还是C,在Windows下都会有类似的问题,只要你调用类似ReceiveFrom函数)。这是上一次Send操作向一个地址发送,但是那个地址没有Socket监听(例如对等体崩溃) 阅读全文
posted @ 2012-06-24 18:15 Leading 阅读(9263) 评论(2) 推荐(1) 编辑
点击右上角即可分享
微信分享提示