跟同事聊天,他原先是在一著名手机厂商研发中心工作,主要是做该厂商手持终端设备上的系统软件,于是自然聊到“摩托,也要骡拉”上来。近几年该厂的发展很不景气,好几年也没见一款拿得出手的手机,在中国的市场占有率从前三降到排名之外,连在国贸的冠名大厦都卖掉了。同事说起来也是颇多无奈,讲述了他看到的情况。
据他观察,该公司内部是出现了这个几个问题:
1. 基础平台不稳定,大量功能被任意加到平台里面,导致越来越复杂,后期维护扩展完全不可能
2. 产品设计部的设计到产品研发,中间经历太长时间,不能响应市场需求
3. 产品研发到最后才发现功能缺陷或者性能缺陷,最后只能 cancel
这些问题的产生原因相信见仁见智。撇开管理层和多部门间合作的问题,个人觉得这是传统软件开发模式下出现的典型问题,特别是基于瀑布模式的软件开发。不能很快地响应变化,前期环节很难得到后面环节的反馈。由于开发模型是线性的,只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险;早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。这样就会导致很多启动初期信心满满都看好的项目最后只能前赴后继地陷入“焦泥坑”。实际过程中会加入更多的开发人员,使用更多的先进开发工具试图解决问题,但对于开发问题的解决,这些都是作用不大的,甚至是帮倒忙的。Brooks' law 告诉我们,“Adding manpower to a late software project makes it later.”
“开发过程中变数太多了!”同事感慨到,于是又说到敏捷方法的拥抱变化。其实敏捷何尝能减少变化。软件开发的过程就是将问题域映射到软件系统,然后提供软件层面的解决方案。这里面天然存在两个“再创造”的过程:问题域的分析建模,软件的实现运行。任何一个环节的复杂性都会被放大累积进整个过程的复杂性,那么有没有一劳永逸的办法来解决这两个问题?同样是 Fred Brooks 告诉我们 “there is no Silver Bullet.”
软件开发的复杂性可以分为两种:本质复杂性和附加复杂性。其中附加复杂性包括人的复杂、工具技术的复杂,外部的复杂等。这些附加复杂性都是希望被限制到最小限度,可能造成的影响被限制在最小范围内。这也是各种软件开发方法试图解决的主要问题。至于本质复杂性,主要是问题域本身的业务复杂,这是社会、组织,甚至各种因素造成的不可逃避的问题,是任何软件方法都不可能抹掉的。因此,如何减少附加复杂性,尽可能解决本质复杂性,就是软件开发方法的使命,也是判断软件方法是否有效的唯一标准。可悲的是,传统的软件开发大多是着眼于通过增加附加复杂性来解决本质复杂性,或者通过文档、或者通过层层审批、或者通过 freeze code base等等,但最后都被证明是刻舟求剑、缘木求鱼。
与传统方法不同,敏捷方法就是试图解决软件开发过程中的附加复杂性,把对解决本质复杂性的关注重新放到舞台的中央,并提供应对本质复杂性的足够可能。对于解决附加复杂性,敏捷宣言有“可工作的软件胜于详尽冗繁的文档”,也有很多相关的实践来保持对附加复杂性的不侵入,就不赘述了。那么敏捷是如何拥抱本质复杂性呢?那就是保持简单和客户 involved。
简单,于是可以足够轻量来调整原来的实现;简单,于是团队内部容易达到领域知识共享;简单,于是开发过程透明性大大增强......这一切的结果都指向“ 响应变化”。user case 简单了,就很容易来进行确认,包括前期和客户的需求确认,也包括后期开发结果的确认。代码简单了,就很容易进行重构,增进设计,逐步兼容添加问题域中的复杂性。开发计划简单了,现在不用关心几个月后的事情,只需要关注到下一个迭代和当前 release 涉及的需求。“简约,而不简单”,大家都轻松了,有时间培养自己的业余兴趣了。
这是从开发团队的角度来看到响应变化。客户 involved 就使得这些变化能被客户感知和认同,让客户尽可能主动思考现实问题域中的复杂性是否有改进的地方,规避了可能的风险,也有利于培养出长期积极的合作关系。这是一个很良性的互动过程,也是一个逐步走向双赢的过程。这也是项目管理层和公司决策层会喜欢看到的结果。
“这些都很美好,但执行起来还得看人”,同事又抛出了这样的论点。我默然,世界上最复杂的莫过于人了。不管方法理论上多么完美,实践起来多么容易,只有真正有合适的人,让合适的人去做合适的事,才能不致于明珠暗投,徒然神伤了。呜呼
分享到:
相关推荐
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...
《360手机卫士的基础之一:插件化方案漫谈》《360手机卫士的基础之一:插件化方案漫谈》《360手机卫士的基础之一:插件化方案漫谈》《360手机卫士的基础之一:插件化方案漫谈》《360手机卫士的基础之一:插件化方案...
谈兼容内核之一:ReactOS怎样实现系统调用.pdf 漫谈兼容内核之二:关于kernel -win32的对象管理.pdf 漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 漫谈兼容内核之四:Kernel-win32的进程管理.pdf 漫谈兼容内核...
漫谈电力信息化现状与发展.docx
漫谈电力信息化现状与发展.pdf
cnki 数字图书馆论文。pdf格式
01.漫谈兼容内核之一:Wine的系统结构.pdf 02.漫谈兼容内核之二:关于kernel-win32的对象管理.pdf 03.漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 04.漫谈兼容内核之四:Kernel-win32的进程管理.pdf 05.漫谈...
架构漫谈(一):什么是架构? 架构漫谈(二):认识概念是理解架构的基础 架构漫谈(三):如何做好架构之识别问题 架构漫谈(四):如何做好架构之架构切分 架构漫谈(五):什么是软件 架构漫谈(六):软件架构...
《漫谈高数》系列文章深入探讨了高等数学的核心概念,尤其聚焦于级数理论及其在实际问题中的应用。在首篇文章《漫谈高数(一)泰勒级数的物理意义》中,作者巧妙地将复杂的数学原理与直观的物理意义相结合,使读者能够...
华为防火墙技术漫谈,理论篇共包含十章,涵盖了会话与状态检测、安全策略、攻击防范、NAT、GRE 、L2TP 、IPSec 、SSL、双机热备、出口选路的原理、应用场景及配置方法
藏经阁-360手机卫士插件化漫谈 本文将围绕360手机卫士插件化的发展历程,探索其技术架构和设计理念,分析其解决方案对Android应用程序的影响,并讨论其在业界的应用前景。 一、360手机卫士插件化的发展历程 360...
藏经阁-360手机卫士 插件化漫谈 本文将对360手机卫士插件化漫谈的技术架构进行详细的分析和解读,主要涉及到插件化、动态加载、模块化、灵活性和稳定性等技术领域。 首先,插件化是360手机卫士的一项关键技术,它...
华为防火墙技术漫谈完整版共3个压缩卷,此为卷一,全部下载3个压缩卷后,放在同一文件夹下,然后解压缩即可。 华为防火墙技术漫谈》介绍华为传统防火墙关键技术原理、应用场景和配置方法,主要包括安全策略、攻击...
《漫谈设计模式》这本书深入浅出地介绍了多种设计模式,通过代码实例帮助读者理解和应用这些模式。在这个压缩包“ramblingonpatterns-1.0”中,你将找到书中的代码示例,它们覆盖了各个章节的关键知识点。 1. **...
【天文漫谈】考试题目和答案涵盖了多个天文知识点,这些知识点包括但不限于: 1. **星座识别**:北斗七星属于大熊座,而非小犬座、小熊座或大犬座。在冬夜21:00左右,可以观察到猎户座。在秋夜,长江流域以南地区...
在计算机技术发展的早期阶段,程序设计是一项极具挑战性的任务,往往由极少数智力和技术超群的人来完成。这一时期的编程活动较为随意,缺乏标准化的过程管理,导致了一系列问题的出现,如程序质量低劣、错误频繁发生...
防火墙基本原理、架构入门书籍,高清扫描版,有需要的同学不要错过呀!
Java安全是指在Java编程和应用开发过程中采取的一系列措施,旨在保护Java应用程序、系统和数据免受恶意攻击、数据泄露和其他安全威胁的影响。Java安全主要涉及以下几个方面: 代码安全性:Java提供了强大的安全机制...
这份资料可能由一位在数学领域有深厚造诣的专家撰写,其目的是为学习者提供一个不同于传统教科书的视角来看待高数。作者试图通过非传统的讲解方式,帮助读者更好地理解和掌握高数的基本概念、定理和应用。 高等数学...
《漫谈兼容内核》是毛德操先生的一本深入探讨操作系统内核兼容性问题的专业著作。这本书主要针对计算机科学中的核心主题——操作系统内核,尤其是如何实现不同系统间的兼容性,提供了丰富的理论知识和实践经验。 ...