posts - 56, comments - 77, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

卡尔.波普尔与敏捷开发

Posted on 2009-09-28 23:05 切尔斯基 阅读(2139) 评论(0)  编辑  收藏
HTML clipboard

卡尔.波普尔的理论能很好的解释目前的科学, 艺术, 政治, 社会等方面一般性的问题. 它对软件开发过程中一些显而易见的问题有着明确的答案. 比如, 我们都知道我们无法证明软件已经没有Bug, 用波普尔的话说就是: 科学理论都是假说, 爱因斯坦的竞争理论表明对牛顿理论的即使如海王星发现般严格的检验都不能确保其正确性, 即对白天鹅的一千次观察都不足以断言黑天鹅的不存在. 能否证伪是科学和非科学的分界线.

而敏捷是软件开发领域逐渐得到采用的理论和方法. 那敏捷这种具体领域的理论和实践是否能够与卡尔.波普尔一般性的哲学理论相契合呢?

若波普尔的理论是普适的, 能否指出敏捷的一些问题呢?

波普尔理论摘要:

<<卡尔.波普尔摘要: 科学的方法>>
<<卡尔.波普尔摘要: 客观知识>>
<<卡尔.波普尔摘要: 三个世界>>
<<卡尔.波普尔摘要: 历史决定论与历史多元论>>
<<卡尔.波普尔摘要: 民主与专制>>
<<卡尔.波普尔摘要: 批评与理性主义, 怀疑主义, 以及启蒙运动>>
<<卡尔.波普尔摘要: 宽容, 冲突, 以及多元论>>
<<卡尔.波普尔摘要: 知识分子, 科学家, 哲学家的职业道德>>
<<卡尔.波普尔摘要: 社会科学, 艺术, 及进化论>>

1. 波普尔强调无知, 可错性, 和试错法. 这导致了XP"反馈"的价值观, 导致了迭代的实践(迭代不是敏捷独有的, 这说明迭代也是一种一般性的方法)

"""

诸神自始就未向我们昭示万物的秘密,

但随着时间的推移,

通过探索我们会学习并懂得更好的东西

"""

在解释反馈的价值观时, Kent Beck批评了"从一开始就选择正确的方法, 不是更容易吗"的想法:

  • 我们可能不知道"正确"的做法是什么

  • 今天正确的, 明天可能就是错误的

  • 今天正确的做法可能需要很长时间来完成, 环境变化会使你的方案失效, 在你完成它之前

关于试错与迭代的关系, 参考<<敏捷质疑: 迭代开发>>

2. 波普尔认为我们应从问题开始, 然后提出一个初步的解决方案, 经过批评性讨论, 前进到下一个问题. 这导致了测试驱动的开发

"""

整个过程可由我称作四个一组的图解的简化的图解表示:P1→TT→CD→P2[问题1→尝试性理论→批评性讨论→问题2]

我们可以从某个问题P1开始——无论理论问题还是历史问题——接着做出尝试性解答——推测的或假设的解答,一种尝试性理论——把它提交按照证据进行的批评性讨论,如果可得到证据的话,结果出现新的问题P2。

因此,科学的概貌就是:

  1. 我们选择某个有趣的问题

  2. 我们提出一种大胆的理论作为尝试性解决办法

  3. 我们尽最大努力批评这种理论,这意味着我们试图驳倒它

  4. 如果成功地驳倒了它,那么我们就试图提出一种新的理论,我们又会对它进行批评

  5. 如此等等

这样,即使我们没有成功地提出一种令人满意的理论,也会了解到许多东西:会了解到关于这个问题的一些情况,我们将知道它的困难所在。

"""

我们必须从失败的测试开始, 这是我们要解决的问题. 完成初步的产品代码使其可通过测试, 即初步解决了这个问题; 然后尽力批评产品代码, 就是写另外的测试, 争取让其失败; 若失败, 则进一步编写产品代码, 如此循环

这是典型的 TDD 循环, 除了重构. 那么重构在哪里?

3. 波普尔对更好的理论或科学进步的追求, 导致了重构

"""

没有真理的标准, 但存在着科学进步的理性标准:

  1. 新的假定必须解释旧的假定成功解释的一切事物

  2. 必须至少避免旧的假定的一些错误, 即它在可能之处应能经得住旧的假定所不能经受的一些批判性检验

  3. 在可能之处, 它应当解释旧的假定不能解释或预言的事物

"""

这也是重构的标准:

  1. 重构必须保证不破坏原来的功能, 即新的假定必须解释旧的假定成功解释的一切事物

  2. 必须支持已经出现的一些原来代码无法支持的扩展性需求, 或者消除旧代码的一些可维护性方面的问题, 如重复代码等

  3. 在可能之处, 支持一些就要出现的原来代码无法支持的扩展性需求

在波普尔的P1→TT→CD→P2[问题1→尝试性理论→批评性讨论→问题2]循环中, 批评性讨论总是导致了更好理论, 也导致了TDD过程中对重构的必然需求

4. 波普尔反对大词, 反对晦涩难懂的表达, 崇尚简单性. 这符合XP的价值观, 甚至可以帮助修正人们对于XP"简单性"价值观的误解

"""

每个知识分子都有一个很特殊的责任。他拥有学习的特权和机会。作为回报,他对于同胞(或对于社会)有责任尽可能简单、清楚、谦虚地描述他的研究结果。知识分子所做的最糟的事情——主要罪过——是试图对同胞自命为伟大的预言家,给他们留下令人迷惑的哲学的印象。任何不能简单、清楚地讲话的人都应住口,继续下些功夫,直至能这样做为止

我在上面(第1点)所说的主要罪过——受过不充分教育的人的傲慢——简而言之,就是夸夸其谈,佯装具有我们所不具有的智慧。它的诀窍是:同义反复和琐屑之事再加上自相矛盾的胡言。另一个诀窃是:写下一些几乎无法理解的夸大的言词,不时添加一些琐屑之事。这会受到高兴地在如此“深奥”的书中发现自己原也具有这样的思想的读者的喜爱。(现在任何人都能看到皇帝的新装正在流行!)

我认为,每个知识分子的责任就是意识到他所处的优越地位。他有责任尽可能把文章写得简单明白,而且尽可能用规范的形式写;永远不要忘记那些困扰着人类而且要求用新的大胆而耐心思考去处理的重大问题,不要忘记那种承认自己所知甚少的苏格拉底式的谦虚。与处理琐碎问题的琐碎哲学家不同,我认为哲学的主要任务就是批判性地沉思宇宙和我们在宇宙中的地位,这也包括我们的认识能力以及我们行善和作恶的能力

叔本华最明智的意见之一(虽然这可能并不是他最有独创性的意见)是:“在一切艺术中……简单性是必不可少的……;至少忽视它始终是危险的。”我想,他指的是对一种简单性的追求,而我们尤其可在伟大作曲家的主题中看到这种简单性。例如,我们从《后宫诱逃》可以看出,最后的结果可能是复杂的,但莫扎特仍然可以骄傲地回答约瑟夫皇帝:其中没有一个多余的音符

"""

基本上可以认为波普尔反对华丽的过度设计

有一种观点, 认为简单就是用最直白的方式实现功能, 然而如果是这样, Kent Beck又怎会把简单看作XP价值观中最具智力色彩的一个? 这里波普尔给出了相似的观点: 最后的结果可能是复杂的,但莫扎特仍然可以骄傲地回答约瑟夫皇帝:其中没有一个多余的音符

5. 波普尔对启蒙运动的赞赏, 对理性批评的支持, 对宽容的要求, 也与XP对勇气, 尊重等价值观的推崇一致

"""

敢于显示智慧!要敢于运用自己的理智. 这就是启蒙运动的口号

你可能是正确的,我可能是错误的;即使我们的批评性讨论不能使我们明确决定谁是正确的,我们仍会希望在讨论后对事情看得更清楚。我们都可以互相学习,只要我们不忘记,真正重要的不是谁正确,而是我们更接近真理

宽容是认识到我们人的可错性的必然结果:人孰无过,我们一直在犯错误。因此让我们互相谅解对方的愚行。这是天赋人权的第一个原则

"""

6. 波普尔对文化冲突的喜好, 对多元论的执着, 最大程度的支持着代码集体所有与结对编程

"""

他们将欢迎与来自另一个世界、另一个框架的伙伴进行的讨论,因为它给予他们一个机会,去发现他们迄今尚未感觉到的枷锁,打碎它们,从而超越自己。当然,冲破牢房不是常规的事情:它只能是批评的努力——创造性努力——的结果. 非常明显,这种自我解放的、冲破此刻的牢房的理想,又会成为一个框架或一个牢房的一部分——换言之,我们永远不会绝对自由。但是我们可以拓宽我们的牢房,至少能抛开甘受束缚的人的狭隘性

当两种或更多的不同文化相接触时,人们认识到他们长久以来认为理所当然的风俗习惯不是“当然的”,不是唯一可能的风俗习惯,既不是上帝所颁布的,也不是人性的一部分。他们发现他们的文化是人及其历史的杰作。从而它开辟了充满种种新的可能性的世界:它打开了窗子,放进了新鲜空气。这是一种社会学的规律,解释了许多东西,它在希腊历史中无疑起了重要的作用

这个猜想是,这种冲突未必总是导致流血的战斗和破坏性战争,而可能也是富有成效的和促进生命的发展的原因。它甚至会导致像希腊文化那样的无可匹敌的文化的发展

"""

7. 波普尔理性批评的态度, 又指导着如何处理结对编程中常见的问题

"""

如果相碰撞的文化之一认为自己优越于所有文化,那么文化碰撞就会失去其一些价值,如果另一种文化也这样认为,则尤其如此:这破坏了文化碰撞的主要价值,因为文化碰撞的最大价值在于它能引起批评态度的事实 。尤其是,如果其中一方相信了自己不如对方,那么,如信仰主义者和存在主义者所常常描述的那样,向另一方学习的批评态度就会被一种盲目接受、盲目地跳入新的魔圈或者皈依所取代。

你可能是正确的,我可能是错误的;即使我们的批评性讨论不能使我们明确决定谁是正确的,我们仍会希望在讨论后对事情看得更清楚。我们都可以互相学习,只要我们不忘记,真正重要的不是谁正确,而是我们更接近真理

严肃的批评性讨论总是困难的。总会夹杂进一些人类的非理性的成分。理性的即批评性的讨论的许多参加者都感到,要摆脱人们在辩论会中染上的习气特别困难,他们必须了解,在一场辩论中获胜是微不足道的,只有澄清人们的问题,只有促进人们对自己的观点或其对手的观点的进一步理解,哪怕是最轻微的澄清和最微小的促进,才是巨大的成功。如果你在一场讨论中获胜,但它未能帮助你至少稍微改变或澄清你的思想,那么你应把它视为纯粹的损失

"""

8. 波普尔关于客观知识的理论, 也可以从另一个角度指导我们正确的对待结对过程中的意见不一致

"""

用语言表达我们的思想,或者更好一些,把它们写下来,是大不相同的。因为这样它们就成为可批评的了. 在这之前,它们是我们自身的一部分。我们也许有怀疑。但是我们不能以批评一个用语言系统阐述的命题,或者更好一些,写下的报告那样的方式批评它们。因此,“知识”至少有一种重要的意义——“提交批评的用语言系统阐述的理论”的意义。这就是我所称的“客观意义上的知识”

知识本质上在于体外人工制品,或产物,或制度

"""

当我们说出我们的观点, 或者更进一步, 写出代码来表达我们的观点, 让它们成为客观知识, 有助于我们把批评聚焦在问题上, 而不是针对人

结对是最直接的批评, 这也暗含着任何一方不是在教导, 而是在接受批评

9. 这里有一个有趣的推论. 批评是波普尔理论的核心手段, 实际上意味着沟通是XP的核心价值观, 结对是XP的核心实践

比如, 波普尔认为: "客观性, 不能依靠科学家本人的客观性来保证, 必须依靠批评:可被描述为科学的客观性的事物完全建立在批评传统之上,这种批评传统总是不顾任何反对,使人们能批评占统治地位的教条。换言之,科学的客观性不是个别科学家的事情,而是相互批评的社会结果,科学家中友好与敌对的分工的社会结果,他们的合作的社会结果,也是他们的竞争的社会结果"

那么XP中对类似"简单性"之类的要求, 也必须建立在批评的基础上, 不能依靠单个开发者的决定, 必须至少是结对, 轮换结对来完成, 代码必须集体所有

10. 波普尔对框架神话的反对, 指导者如何处理采用敏捷开发过程中价值观不一致的问题, 敏捷与其它软件开发过程理论的碰撞问题

组织内部价值观一致, 事情自然顺利的多. 对于大部分情况下的组织价值观不一致, 波普尔有另一个角度的观点: 顺利的不意味着是富有成效的, 最终取得一致意见也不意味着是富有成效的; 参与者学到的越多, 越富有成效. 这意味着: 向他们提出的有趣的问题和困难的问题越多, 吸引他们思考的新的答案越多, 他们的观点越是发生动摇, 以及讨论之后他们越是能对事物有不同看法. 简言之, 他们的知识视野越是开阔

结论就是波普尔认为在不同的框架间进行讨论, 是困难的, 但不是不可能的

波普尔主张批评的多元论, 即为了寻求真理,应允许所有理论--多多益善——与所有其他理论竞争。这种竞争在于对理论的理性讨论,在于对它们的批评性淘汰。讨论应当是理性的--这意味着它应当关注相竞争的理论的真理:在批评性讨论过程中似乎更接近真理的理论是更好的理论,更好的理论取代了较差的理论。因此正是真理的问题利害攸关

因此, 哪怕你最终全面接受了敏捷, 在此之前, 应有一个理性讨论和实践的阶段, 而不是迷信. 这也意味着, 在推行敏捷的时候, 哪怕你全面否定了之前的软件开发理论, 在此之前, 也应该有一个理性讨论的阶段, 而不是盲从. 顺利和一致是好事, 但可能错过发现更好理论的机会

手里有波普尔这个锤子, 到处都是钉子. 另请参阅其它牵强附会之作:

<<敏捷外传>>

<<姑苏慕容与软件开发>>

<<独孤九剑与软件开发>>


只有注册用户登录后才能发表评论。


网站导航: