企业定制软件开发不是计算机科学,需要解决的不是编译原理也不是组合数学。那么,企业定制软件开发的核心问题是什么?
越来越感觉到,从事一个领域不需要有特别深刻的理解,但起码要知道做这个领域的事情,需要解决的核心问题是什么。比如说,开发C/S结构软件,状态同步(C/S状态同步以及窗口之间的状态同步)就是核心问题之一,而开发B/S结构的软件,状态同步就不是那么核心的问题。如果事先知道需要有这些核心问题需要考虑,在日常应对接踵而来的具体的事务的时候,就能够把解决问题的层次抬到更宏观的层面。
目前而言,个人感觉企业定制软件开发的核心问题有两个:
1、如何保证所有参与者(包括客户在内的开发团队,以及最终用户)的沟通强度,使其能够满足完成开发目标的需要
2、如何管理企业定制带来的软件自身内在的高复杂度,使得复杂度不会超过团队的维护能力范围
在前面一篇介绍组织的Blog中,谈到了核心问题中的第一个,沟通强度问题。团队而言,刨去个人能力,最重要的就是人与人之间的沟通。没有好的沟通,即便团队的个体能力都超级强,也无法形成合力。但只要有好的沟通,至少可以做到人尽其用。假设一个标准人的生产力是1/day。某些特别强的人可以达到3/day。但是如果需要达到10/day的生产力才能在市场允许的时间下完成项目,那么就无法用一个人来完成之间事情,所以才会有团队存在的必要。但是有两个标准人,并不会达到1+1=2/day的生产力。可能只有1.5。有三个标准人,更加不会达到1+1+1=3/day的生产力,很有可能有1.8。那么是什么制约了团队的整体生产力,那就是沟通。当两个相关联的任务A和B是一个人做的时候,关于任务A的知识存在于左脑,关于任务B的知识存在于右脑。那么结合两个任务的知识把其组装起来的沟通效率就是大脑内部的电信号的速度。但是如何任务A是由Dev甲完成的,任务B是由Dev乙完成的,那么整合两个任务的效率就受到人嘴皮的震动频率的约束,受到表达能力的约束,受到理解能力的约束。有人研究过,两个人即便是面对面,传输的比特率也要低于最早的拨号式Modem。更不用说,有的时候开发团队是分布式的。在无法看到表情,肢体语言,无法共享白板,只能在越洋电话里听到声音,而且其中还有一方是非工作时间,在这种情况下,1+1几乎很难达到1/day的生产力。什么是高效的团队,就是能够让1+1的值尽可能大的团队。如何变得高效,让沟通变得更加高效。怎么样让沟通变得高效高强度?这就是我们要处理的核心问题。
第一个问题可以应用于所有的人的团队行为之中。人只要聚集成群,就会有沟通问题。所谓,有人的地方就有江湖。第二个问题则特定于企业定制软件开发。对于互联应用开发,也许复杂度的管理是其次的,最需要关注的是大用户量下的可扩展性。但是对于企业定制软件开发,由于业务自身的复杂度,导致了定制软件的复杂度。特别是业务的组合,导致的组合复杂性。假设在理想情况下,一个系统可以分解为模块A,B,C,其复杂度都是2。在复杂度管理良好的情况下 ,这些模块是被明确划分的,要理解A,只需要关注A,以及B与C少量与A交互的部分,也许理解的复杂度只是2 + 0.5.。但是在复杂度没有管理的情况下,所有的“逻辑”(也就是复杂度)都是随意地放置的。那么也就是没法办法保证,读A的逻辑只需要关注A,甚至这个A都是不存在的,你看到的知识一个系统,包含了A,B,C的功能,是完整的一块。这个时候要真正了解这个系统行为,可能就需要2 * 2 * 2 = 8这么高的代价了。随着模块(变量,方法,类,包,模块,Bundle)的增加,我们需要同时理解的东西也在不断增加。不去可以地管理复杂度,很有可能,我们需要了解一块功能,就需要把所有的代码都去阅读一遍。或者说,改动了一个方法,使得整个项目都需要重新被测试,因为没有地方是可以被信任的。如何管理复杂度?这就是我们要处理的核心问题。
有意思的事情是,这两个核心问题是重叠的。把人,角色等同于类,接口,都抽象地看成点。把沟通理解为人与人之间的联系问题。把复杂度也理解为类与类的依赖问题。那么沟通问题和复杂度的管理问题都是如何把这些点联上线,组成一个高效的图的问题。这个图,就是一张关于“依赖”的图。人与人之间的依赖,类与类之间的依赖,包与包之间的依赖。依赖的另外的一个名字就是Coupling。而我们追求的就是Cohesion。Coupling(耦合)/ Cohesion(内聚)这两个词的妙处在于,明白的人根据自己的经验,一看就点头。不明白的人,由于没有对应的经验,无论怎么解释,都是摸不着头脑。正是因为其“妙不可言”性,所以我可以说这两个词就是所有问题的答案(你也无法反驳)。但至少我们可以知道企业定制软件开发的核心问题其实就是一个:就是管理好人与人之间的Dependency,包与包之间的Dependency,使得信息可以在高度依赖的人与人之间快速传递(强调Coupling带来的消息传递的效率),而理解又可以局限在高度内聚的模块内部(强调Cohesion带来的维护便利),但同时又不能让某人过度被依赖倒置工作过劳死了,被依赖得越多要求其体能越好,对于包的内聚也一样,高内聚做到极致就是最小的编译单元(类?),又会导致包的粒度过小,使得包的数量变得巨大,失去了维护的便利性。我们需要做的,就是在To Depend or Not To Depend中,根据场景作出取舍。
那么抽象而言,无论是解决沟通问题还是复杂度问题都可以归纳为:
1、设置目标指标
2、度量现有的指标,观测现有的依赖图
3、做出依赖图的调整计划,并执行
4、观察指标的变化
5、重复步骤3,4,直到目标达到
但是问题是:
1、如何度量指标?沟通的效率?代码的质量?都很能度量。
2、如何观测现有的依赖图?包的依赖还可以观测,但是团队的协作是比较难观测的。
3、如何对依赖图做调整?重构?Change Agent?人不比代码那么容易改变。
4、如果指标不是简单数字,怎么比较?怎么知道指标是朝着目标发生变化?
这四个问题,几乎没有硬的科学问题。管理复杂系统的复杂度,可能是一门硬的科学。但是夹杂了人的因素的企业定制软件开发,一定不是一门硬的科学。那么,数学公式不是这些问题的答案。那么该朝哪个方向努力?
TO BE CONTINUED
分享到:
相关推荐
实施软件生产线主要涉及三个关键活动:核心资产开发、软件产品开发和支持这两项活动的技术和组织管理。 - **核心资产开发**:这是软件生产线的基础,包括设计、实现和维护一系列可重用的软件组件、架构模式和其他...
本主题聚焦于“软件开发文档模板”,特别是“软件开发计划”及其编写指南,这两大核心元素对于确保项目的顺利进行至关重要。 软件开发计划是整个项目生命周期的蓝图,它详细描述了从项目启动到交付的各个阶段、任务...
在IT行业中,微信小程序开发、APP开发以及软件定制开发是三个关键领域,它们涉及一系列复杂的流程,以确保最终产品能够满足客户的需求。以下是对这些领域的主要流程和特点的详细分析。 首先,微信小程序开发通常有...
3. **嵌入式软件开发与硬件设计**:结合软件和硬件两个层面,研究如何高效地进行嵌入式系统的开发。 #### 四、参考资料 为了帮助学生更好地理解和掌握课程内容,推荐了一些参考书籍和资源: - 网络资源:Google、...
【软件开发过程与模型】 软件开发过程是将需求转化为可运行软件的一系列步骤,它涉及到项目的各个阶段,包括但不限于需求分析、设计、编码、测试和维护。软件开发不仅仅是技术活动,更是一个涉及到管理、沟通和协作...
**原型法概述**:原型法是一种先进的系统开发方法,强调在软件开发初期构建一个功能简化但直观的“软件样机”——即原型,通过与用户持续的互动与反馈循环,逐步完善和细化系统功能,直至达到最终需求标准。...
《人件集》和《十公里半》这两份文件可能包含了更多关于人性化软件开发的实践案例、理论分析和经验分享,通过深入阅读,我们可以从中获取更丰富的知识和启示,进一步提升软件开发的人性化程度。
在IT领域,有时候我们需要对比两个文件夹中的内容,找出它们之间的差异,以便进行版本控制、数据同步或问题排查。在这种情况下,"绝好的两个文件夹下面文件差异的比较软件" 提供了一个高效的解决方案。虽然软件是...
这个框架为软件项目的生命周期提供了一个清晰、有序的指导原则,确保软件开发过程中的各个环节能够有效衔接。软件开发过程通常包括需求分析、设计、编码、测试以及维护等多个阶段。 #### 二、软件开发模型的重要性 ...
该项目是一款专为餐饮行业设计的综合软件解决方案,涵盖了系统管理后台和移动端应用两大部分,旨在提升餐饮企业的运营效率和服务质量。下面将详细阐述这个项目的相关知识点。 首先,系统管理后台作为整个软件的核心...
这不仅包括硬件设备的购置费用,如服务器、网络设备、计算机终端,还涵盖了软件投入,如ERP(企业资源规划)、CRM(客户关系管理)、BI(商业智能)等系统的购买和定制开发。此外,实施和维护费用、员工培训成本、...
【计算机软件开发合同详解】 计算机软件开发合同是规范软件开发过程中的权责分配、合作内容、费用结算、验收标准和违约责任的重要法律文件。以下是对《上海市计算机软件开发合同示范文本》的详细解读: 1. **合作...
软件开发生命周期是软件工程的核心概念,涵盖软件整个生命周期的各个阶段,包括需求分析、设计、实现、测试、维护等。软件开发生命周期的目的是为了提高软件的质量、可靠性和效率,降低开发成本和时间。 软件是什么...
软件开发方法是计算机科学领域的一个核心话题,主要关注如何高效、高质量地构建和维护软件系统。本资料深入探讨了软件的基本概念、特征、分类以及开发技术的发展历程,旨在提供全面的软件开发知识。 1. **软件的...
1. **需求调研**:这是项目启动的第一步,涉及软件开发方与需求方之间的深度沟通,旨在明确项目的核心需求和技术细节。 2. **设计阶段**:在明确了需求之后,进入设计阶段。这一阶段主要包括UI设计和后台UI设计两...
本文将深入探讨这两个关键问题,并结合实际案例分析如何更好地平衡成本与价值,确保信息化项目的成功实施。 #### 一、企业信息化的成本问题 企业信息化的成本主要涉及硬件设备购置、软件开发或购买、系统集成、...
### 银行软件开发知识大全 #### 一、引言与背景 随着中国经济的快速发展,金融业成为支撑国家经济发展的核心力量之一。与此同时,信息技术在银行业的应用日益广泛,不仅提高了服务效率,还增强了客户的体验感。...
实验过程中的调试和测试实践,增强了学生的问题解决能力和代码质量意识,为后续的软件开发学习奠定了坚实的基础。同时,实验也暴露了学生的不足,促使他们在后续学习中持续提高和深化对这些技能的理解和应用。
- **跨平台兼容性**:能够在.NET和J2EE两个平台上运行,为企业提供了更多的选择自由度。 **2.3 Fix ES2007的使用案例** - **安全管理**:通过Fix ES2007,企业可以简化安全管理流程,提高安全性。 - **流程自动...