写点什么

[读书随笔] 从哲学上的问题分类看 TDD

用户头像
老狗
关注
发布于: 2020 年 05 月 05 日
[读书随笔]从哲学上的问题分类看TDD

动物不会向自己提出问题,但是程序猿是自我发问的动物。


因为在喜马拉雅上听了了复旦哲学王子王德峰教授的《马克思主义的时代解读》有些认知上的耳目一新,所以在五一加班期间,开始拜读王德峰教授的《哲学导论》,看到一个把人类问题分为五大类型的分类方法。清晰的边界可以让认识更透彻,在看这些问题的时候,恰巧偶然跟人聊起TDD来了,所以试着按这个角度去看TDD解决的问题。这五类问题分别是:经验问题,形式问题,预测问题,抉择问题,,超验问题。

经验问题

经验问题的基本特征是,他的解答最终要得到来自感性经验的支持。

通俗的说,经验问题就是可以通过观察可以回答的问题。这个问题我曾经这么写过,然后测试通过了,或者程序正常上线了,就是通过这个可观测的结果来验证问题的正确性,并且一次验证以后,在短时间内不会自行消失。

TDD实际上是把问题通过任务拆解,拆分为一个个经验问题,例如

given:
两个数 1 和2
when:
sum
then:
3

然后去尝试回答这个问题,

int sum(int a, int b){
return a + b;
}



当可观察的结果,测试通过的一抹绿出现的时候,就完成了这次经验问题的回答。

而同样的一个经验问题,在无单元测试的场景下,可验证的方式被拉到了代码被部署的过程中,如果在目前流行的微服务架构中,可能被推到了集成测试,问题解决的过程被拉长实际上会占用思考的猿的精力的。

而非TDD后期写单元测试的过程,流程是,首先猿把需求作为问题,用程序做了一次尝试回答,然后又根据回答想了一个验证回答的方式,最后相当于用另一种方式复述了问题,最后得到一个可观察的结果的过程。这个过程有两个问题,首先根据一个业务这样的大问题,尝试面面俱到的回答容易顾此失彼,其次,复述问题不一定能完美的复述问题。而一个经过规范练习的会TDD的猿,写测试+写代码的时间=非TDD写代码的时间,而非TDD还要补测试。

形式问题

就是先验的从概念中分析出它的内涵来,然后凭借形式的推论来解决问题。

这个定义一出来,就大抵就是数据结构和算法,设计模式之类的东西了。诸如几个车站之间如何安排线路的问题,如果直接针对这个业务去直接思考问题,可能会很难实现,比如两站之间的线路规划,直接用穷举解决一切然后比较大小固然可以,但是聪明的猿会有更好的办法,比如先把这些数据抽象成图,然后借助图的各种算法,来完成这个计算。固然我等CRUD猿不见得有多少机会实践算法,但是这种把问题抽象,然后以数学这类纯粹逻辑去推断的思维方式,是算法和数据结构的精华所在。

TDD的任务拆解的过程,也是类似于这样一个过程,把一些细节从需求中拆解出来,然后凭借推理,确定,这些细节过了,这个需求就过了的这样一个过程。

预测问题

这类问题有个共同特征,就是根据以往经验,预知未来的一项经验事实。

猿的生存环境中存在各种预测问题,小到代码这么写行不行,大到这个语言会不会火。回到TDD的话题,TDD编程是在回答一个经验问题的模型,而非TDD编程实际上是一个回答预测问题的模型。如果在非TDD的过程中,编写代码实质上是通过过往写代码的经验,去预测我这样写大概能满足整个需求,直到上线,才告诉你,你预测是是不是准确,而TDD的过程也并非提前揭晓了答案,测试通过不代表没有Bug,但是TDD的过程大部分时间是在解决一个个经验问题,合并在一起才是一个预测问题,显然同样是做一个预测,TDD的方式要简单的多。

抉择问题

这类问题是在先以解决了预测问题的情况下才能提出来,所以这类问题的不是在于未来会发生什么,而是应该选择什么样的未来

如果把软件生产过程看成瀑布式的,未来关于一个点的需求永远不会变更,那代码写成什么样子都无所谓,又不是不能用,但坏菜就坏在需求是不断变更的,未来(不是一年后,可能就是3天后)这部分业务可能要扩展,可能要变更,所以,才有了好代码或者一坨那个啥的代码之分。所以重构是一个有良知的猿必须做的事情,为接收代码的人,也为可能为接收代码的自己。重构是TDD过程中的重要部分,有人把重构称之为代码整理的技术,而在有一定重构代码的手法以后,重构更像一个选择的艺术。这段代码是重构成工厂还是构建者一方面是来自目前的代码,也包含着程序猿对未来业务的预测。

超验问题

这类问只所向与问之所问界很“不切实际”:首先他们的对象即不是经验上可观察到的事项,也不是逻辑思维所关注的纯形式;第二,他们所追求的解答,既不是感性世界的经验描述和预测,也不是感性世界之逻辑模型的建构。但他们不因此是空无内容的。他们之所向既有他们之所问构成。是哲学的研究领域。

TDD是一种流程,肯定不可能解答超验问题,上升不到那个层次,在这个角度的说是一种玄之又玄的东西,有位“道长”说在编程中悟道,我还没达到这个超验的地步。



总结

他山之石,可以工玉,读一些提升认知层次的书的时候,对已经知道或者已经掌握的一些东西总会有新的认识,也不知道我能表达出几分。所以在这里胡言乱语一番,仅做记录和总结。

发布于: 2020 年 05 月 05 日阅读数: 62
用户头像

老狗

关注

还未添加个人签名 2019.05.16 加入

还未添加个人简介

评论

发布
暂无评论
[读书随笔]从哲学上的问题分类看TDD