简单之美
0 前言
禅宗 本来无一物, 顿悟 想入非非
积级反思,不断追求完美, 想象力和创造力的结合 + 软件开发思想比较完整
- 思想是解决一切问题的根本,
- 思想是明显灯,虽然有时也会变为桎梏
- 思想必须坚持成为习惯
Robert C Martin - Agile software development : Principles , Patterns , and Practices 软件是美的,简单的。
所谓混乱状态就是出现问题的时候,没有人知道如何做才是最好的。一套完整的思想体系可以解决。
1 无级生太级
创造性需要想象力。 获取知识,使用知识
简单、想象、文化
什么样的信息是有效的? 简洁、明确的思想表述,层次清晰的分类信息,令人信服的论证
所有的方法论都有上下文。
简单的原则,富于想象的精神,文化的视角来认识软件开发
1.1 创造力的根源
钱学森认为人有三种思维类型:逻辑思维、形象思维、灵感思维。 我们说,软件开发越来越需要创造力,越来越需要形象思维
我有一个有趣的想法:如果人们愿意定心敛神,细细体会熟视无睹的事物,一定可以得到超出想象的收获。 。什么是软件?本质上就是那些特定于CPU的二进制指令的集合。
在汇编语言中,数据结构的概念是很淡的,更不要说围绕数据结构展开的算法了。数据结构和算法的繁荣发生在比汇编语言高一级的编程语言中,例如C语言。 那些隐藏在幕后的技术,使我们可以仅仅关注于抽象的程序,而几乎不考虑硬件的问题。
C语言在一定程度上解决了人类在数学计算和逻辑推理上的抽象。 算法就是数学问题的求解过程。在使用C语言来实现一个软件系统时,逻辑思维占了绝对的比重。
企业级信息系统需要解决的是领域问题,而不单单是数学运算问题。 处理领域问题就像战场上的一个个战役,指挥官决策(问题求解)时,可以参考和依据的现象太复杂了,他必须借助面形的思维(经验、习惯以及形象思维)才能指挥队伍朝正确的方向前进。java 语言恰好是面形思维的好工具。(tomcat 源码带来的启发)
从 C 到 Java 隐喻式编程,Java 培养了我在软件领域的想象。 软件的美和价值在于创造,创造来源于想象。他需要一定的技能。
1.2 本质的把握
软件或软件开发的本质?艺术性的科学工作。
一个有趣的社会现象。 我们在这4年里学到了最重要的知识——做人和做事的方法
按照我们前面的说法,建立一个思想体系是最重要的。也就是说,只有在一个完整的上下文中思考才能真正解决问题。所以,我尝试用一条线索把上面的概念串联起来。
毫无目标的追逐会使有限的积累能力稀释,积累知识和技能的方法。 总之:思想体系没有建立,找不到建立思想体系的方法,以及不会应用思想体系来解决问题,我们就无法把握本质。也就是说只有在完整的上下文中才能解决问题。
网络连接的重要性,信息与计算能力的传递。 尽量使应用程序和容器隔离。
从 java rmi 到 web service , SOA 架构的基石。 SOA 确立了整合系统的思想, ESB 提供了准备就绪的服务。 根据以往经验,思考新的概念,解释,解释再解释,最后把这些新概念转化为思想体系。 这就是认知方法的本质。
1.3 简单的追求
作何时候都不要轻易丢弃一个非常简单的原则,作何时候都不要固执于一个具体的想法细节。 我们需要做的其实只有一件事,基于领域模型的计算。本质的就是简单的。 在我看来,企业应用软件很简单。它主要包括三个部分:一个领域模型,一组基于领域模型的计算,以及用来和用户交互的界面。这是一个基本的思路。 老实说,为了恪守简单的原则,我们应该逐渐进入细节。
在这个例子中,思考领域模型的时候不要立即开始考虑数据库的因素。可以做到吗?答案是,很多软件开发人员都做不到。他们总是忍不住会立即去考虑效率、领域模型中各元素的关系如何在数据库中的表达、OR Mapping工具在使用中的一些限制等。
实践中的复杂性是因为背景知识的缺乏,主要工作是收集信息,而信息量不是成功的关键,而是对他的应用。
越简单,越准确,越简单思路越清晰。
第二章 关于软件开发方法论的思考
以 CMM 和 敏捷为例 文化是方法论的基础,也是方法论的运行环境。割裂文化来实施方法论,就像建造空中楼阁。 你对场景故事的思考和感悟将是本书价值的重要组成部分。
2.1 方法论的实践场景
宗方 berry 孔如之 Ralph 【纯粹的技术人员】 Ken 孔如之的经理 王蓉 于伦 李小兵
Scrum 不是一种制度,而是软件开发的需要。它本身不解决任何问题,它有一些实践供我们参考,仅此而己。关键还是开发人员的主动性。 目标只有一个:如何提高开发人员的主动性。
2.2 CMM 的精髓
能力成熟度模型,对软件开发过程的关注。 当人们需要共同完成一件事情时,常常需要一些契约来规范人们的行为。在软件开发中,这些契约以过程的形式存在着。 为了使契约更加合理,软件开发组织需要对过程进行系统地思考和总结。这是一种持续的行为。另外,在软件开发实践中,过程会不断地得到优化。那些更合理的过程,会被保存下来并重复使用,最终成为知识资产的一部分。 在理想的情况下,CMM所关注的软件开发过程,应该是解决软件开发中各种混乱现象的一种理想方案。但是,在现实中,CMM往 往被很多软件开发组织、甚至软件开发人员个人所排斥。
CMM 的价值
- 系统性的,质量保证,配置管理,需求管理,项目管理,软件开发管理,同行评审,项目资源协调,人员培训,
- 大量实践有效的模型
- CMM 鼓励基于推荐的模型和活动来定义自己的软件开发过程。。CMM会依据规范来评估自定义的软件开发过程,换句话说,CMM是一个参考模型,它不要求软件开发组织严格遵守。CMM只是建议,在软件开发组织自定义的活动和CMM规范推荐的活动之间做一些映射。这些映射可以非常灵活。
我认识一位SEI认证的CMM评估师。在与他的交流中,我深刻地体会到,CMM其实是一个非常灵活的模型。事实上,只要有想象力和创造力,你定义的软件开发过程,将会完全适合你的组织现状和企业文化。你可以为不同类型的项目定制不同的过程,从而最大限度地提升工作效率。
报告存在的意义不在于应对质量检查,它的意义在于将来有可能从这些文档中提炼出有价值的观点。
2.2.2 成熟之路
我相信,在我们这个美丽的星球上,有不少值得尊敬的、成熟的软件开发组织。遗憾的是,我至今还未接触到它们。 不经历 CMM 很难体会到敏捷开发的意义。 所以,我更愿意把CMM看作是一条成熟之路。
2.3 敏捷软件开发的精髓
追求人的主动性,是智力活 动密集性企业的最高目标。 追求主动性的原因在于,评价智力活动的成果是一件非常困难的事情,如果缺少了人的主动性,一切工作都会流于表面,组织的目标就会无法实现。
有一家顶尖的高科技企业,对员工采取军事化的管理,企业的规模和技术能力以惊人的速度在发展。这种现象超出了我的理解。军事化管理只有在狂热的理想主义支持下,才能激发人的主动性。狂热的理想主义在一个商业化企业中是无法持久的。
狂热的理想主义 提高软件开发人员的主动性有两种方法
- 传播信仰
- 建立一系列以人为本的的实践与方法集,用习惯和文化融合成员。敏捷软件开发致力于第二种方法。
Alistair cockBurn Agile software development: the corporation game 2th edition
一书中,从西方人的角度,对人的因素进行了分析。我总结了一下,在他看来,软件开发中的人主要有以下的缺陷: •人的沟通永远是不完全的,完全的沟通是没有必要的;
•人是古怪的;
•人们通常宁可保守地失败,也不冒险用不同的方式追求成功;
•人们喜欢临时创造而不喜欢积累;
•人们不能始终如一。
在我看来,项目经理最重要的工作,应该是为软件开发提供服务。他是那个扫清路障的人、积极进言者、精神鼓舞者,而不是那个拿着时间表、冲着软件开发人员发火的人。要保证软件开发的进度,项目经理的频繁干预,不是一件好事。组织必须培养有责任、有追求的团队。这类团队,应该围绕着一位主刀医生角色的软件开发人员展开工作。
敏捷方法中的实践就像导演提供的剧本。在影片拍摄期间,导演总是会要求你完成那些设计好的动作和台词,从而快速进入角色。相比而言,敏捷方法中的“剧本 ”更加简单,它给人们留下了巨大的发挥空间,当然,与此同时,它也对人们的能力提出了较高的要求。
2.3.2 海岸灯塔
敏捷方法的支持者在理论上是理想主义者,在实践中是实用主义者。他们似乎指出了一个激动人心的方向,但是真正的终点其实还很远。遗憾的是,敏捷方法的可操作性是很差的。其原因在于,所有的一切都依赖于人本身。想象一下,我们强调对人的关注。可是,谁来对人关注?还是需要依赖某些人——具有特殊权力的人。在敏捷方法的游戏规则中,针对这些特权人本身并没有什么约束。他们可以关注人,可以懂得如何关注人;也可以不这么做,或是不懂得如何做。
英国人类学家泰勒认为,文化是一个复杂的总体,它包括知识、信仰、艺术、伦理道德、法律、风俗,以及作为社会成员的个人,通过学习获得任何其他能力和习惯。文化通常起源于个人和群体的习惯。当人们的习惯,融入到日常的生活中时,文化就产生了。
2.4 更好的软件开发方法
最好的开发方法就是最适合企业文化的开发方法。 企业文化: 经营经营者、管理者的价值观,组织成员的结构和背景 企业经营者和管理者的价值观,是评判组织成员价值(从组织的角度)的标准.在现实中,那些与价值观相左的贡献,常常会因为一些狭隘的认识而变得毫无意义。比方说,保 守稳健的价值观会排斥激进创新,崇尚残酷竞争的价值观会排斥内敛独善等。
十几年前上大学的时候,我和哲学老师关系不错,经常一起聊天。有一次聊到了中庸之道。他告诉我,中庸,不是僵硬地居中于两个极端,而是一种非常动态和灵活的平衡。就像秤砣:秤砣在秤杆上来回移动,最终使重物与秤砣保持了平衡。换句话说,目标和能力是客观存在的两端,中庸之道就是这两者之间的平衡点。一旦找到了这个点,目标就容易实现了。
CMM为企业文化的建立贡献了自己的价值,它尝试建立一种科学的软件开发方法。这种尝试是开创性的,所以常常伴随着剧痛;换句话说,实施CMM,会使以往的开发方法受到全方位的挑战,各种显性或隐性的激烈对抗将层出不穷。 纵观历史,文化的形成,往往源自于严酷的制度。与之类似,在组织的软件开发方法形成之初,求助于制度也不失为一种办法。
事实上,软件开发方法是企业文化的集中反映。和社会文化不同(有着漫长的形成过程),企业文化(常常体现在软件开发方法中)需要快速形成。一种好的办法是,在兼容并蓄、博采众长的价值观基础上快速建立制度,然后用中庸之道进行调整。
什么样的调整呢?比方说,当规模变大时,我们应该在组织的软件开发方法中加入一些精细开发的思想。迄今为止,我还没有见到过精细开发的案例。这也许和我所能接触到的软件企业的规模有关。我接触到的很多软件开发组织,精细开发思想是很糟糕的。在这些企业中,一个软件开发人员往往要兼顾很多任务,而任务的指派基本上是随机的。 软件开发人员常常被视作没有任何差别(个性、技能、兴趣等)的资源。这种想法,无论从个人的角度来看还是从组织的角度来看,都是有 问题的。
从个人的角度,粗犷分工不利于软件开发人员自身知识的积累。如果没有知识的积累,生产效率会变得极为低下。 从公司的角度,粗犷分工会造成大量重复投入的学习成本。
当随意安置的个人与小团队文化不适应的时候,同样会带来严重的生产效率问题。
2.4.2 聚焦
现实中的问题盘根错节。我们应该规划出一张路线图,用聚焦的眼光,逐个解决软件开发中的问题,并建立最适合自己的软件开发方法。
2.5 方法论的执行
2.5.1 关于执行
中国近代哲学史上有一种观点,即地理环境决定了文化差异。中西方的对比,农业文明与商业文明的差异。 中国是一个国土资源丰富的国家,农业是最重要的支柱产业。农业的特点是,居住地固定、很少迁徙。人们长期聚集在一起劳动和繁衍,这样的生活方式使家庭血缘关系成了社会中的主导关系。而家庭血缘关系中天然的长幼次序,又促进了家长制文化的形成。与中国不同,西方的希腊和罗马都是海岛国家,由于航海技术的成熟,商业贸易非常发达。人们通过航海,来往于不同的国家和文明。当时,来自各地的人聚居在一起,社会的主导关系,是商品交换中的利益关系而不是家庭血缘关系。人们通过大量人为建立的规则来保证自己利益。在这个过程中,逐步产生了民主和平的思想。
要求管理者承担保证执行效果的责任。要求承担执行效果的责任,可以促使管理者对方案的执行进行更加深入的思考,从而保证真正的执行成功。管理岗位不是一块可以坐下来休息的台阶,而是从另一个角度,观察并辅助方案执行成功的阵地。
•是源于个人意志还是众人意志?
•如果源于个人意志,是家长意志还是创作者意志?
•如果源于众人意志,是众人的主动追求还是众人的妥协产物?
要做到众人意志的统一是非常困难的。在软件开发实践中,总是会在众人意志不统一的情况下产生妥协的方案,这些妥协的方案往往会给软件开发组织带来无数潜在的问题。
2.5.2 约束与习惯
事实上,仅仅关注执行力是错误的。这就像头痛医头、脚痛医脚,缺乏解决问题的全局眼光。在执行力上关注越多,偏离执行的本质就越远。
软件开发方法不是解决执行问题的银弹。从约束到习惯的演变过程才是关键。你看,软件开发过程带来约束,长期的约束形成习惯,丰富的习惯促生文化,文化制造氛围,氛围产生最佳的执行效果。神奇的逻辑,约束最终将转变成自然!如果我们没有经历从约束到习惯、习惯到文化、文化到氛围的演变过程,就不可能在本质上提升执行效果。这就是我的解答。
我雇用那些成功交付过项目的人。
第 3 章 关于需求的思考
需求就像一束光的源点,失之毫厘,谬以千里。 首先,我们需要准确表达 需求,术语和讲故事是两种好的辅助手段; 其次,我们要和客户一起推动需求的变化,需求变化不是成本的代名词,被动接受需求变化才是吞噬成本的罪魁祸首。
3.1 实践场景
“哈哈,”孔如之笑道:“如果我们帮助客户弄清楚他们的想法,做得了就做,如果成本太高,我们可以给一个详细的解释。大多数客户也是讲道理的,况且,TFC项目是个开口合同。”孔如之进一步解释:“如果我们不清楚客户的想法,那就惨了,他以为我们会做一些事,我们自己认为不在项目的范围内,客户会对我们的承诺和信用打问号的。”
需求故事的讲述技巧
3.2 需求开发
3.2.1 准确表达
最简单的句式和最简单的信息,是传递信息最准确的方式。 成本永远不是拒绝需求问题的理由。 领域术语是准确表达的关键。
开拓型项目,持续型项目 在实践中,这两种类型的项目碰到的需求问题有一些差别:在开拓型项目中,人们经常被客户的需求所淹没;在持续型项目中,人们经常因为领域问题上的理解差异,产生大量隐性的开发成本。
无论哪种类型的项目,都有一个共性。那就是,客户往往不能提出准确的需求(更不用说有系统地提出需求)。我认为,期 望通过一两位专家就能把所有的需求传递给软件开发人员是不现实的。不现实的原因有三点: 首先,客户是一个群体,提出需求的人只是客户中的一小部分人; 其次,提出需求的客户并不能完整地考虑到所有的场景; 最后(也是最重要的),客户往往不能准确表达出自己的需求。
准确表达需求,需要特殊的技能和方法。理论上,提出需求的人必须经过专业的训练。 消除歧义取决于交流者的语境。准确表达的本质,是指信息的准确传递,而特定的领域知识是准确表达的基础。
最简单的句式和最简单的信息,是传递信息最准确的方法。 我一直认为,需要经过再解释的需求,不是一份合格的文档。它会带来歧义、返工和无法预料的后续成本。
要想解决需求问题,关键有两点。这两点都需要需求分析人员的努力。第一,需求分析人员应该使用客户提供的常识和素材,为客户提供他们可以理解的完整故事。事实上,单纯限制需求变化,只会演变为一场两败俱伤的战争;第二,需求分析人员要积累领域知识,提升对需求的预判能力,并把预判应用到软件实现中去。
- 真正站在客户的立场上来考虑软件开发成本,是解决需求问题的最佳方法。这就是上面所说的第一个关键
- 软件项目的成本绝大部分被用于软件实现。而只有好的实现(灵活性和扩展性),才能降低项目成本。
总而言之,在追求准确表达需求的过程中,软件开发组织要克服对需求不断修正的排斥心理。我们要学会站在客户的立场, 成本永远不是拒绝解决需求问题的理由。