65.9K
CodeProject 正在变化。 阅读更多。
Home

价值领域的软件开发

starIconstarIconstarIconstarIconstarIcon

5.00/5 (12投票s)

2019年11月1日

CPOL

17分钟阅读

viewsIcon

25796

本文探讨了软件开发与应用研究的相似之处,并从中得出结论。

免责声明

本文是我个人对软件开发本质的看法。本文并非旨在成为一篇科学论文,因此许多陈述都故意直接而大胆,以使文本简短。我已尽力根据我自己的观察和现有资料来阐述软件开发的本质,但我并非商业理论家、科学哲学家或社会学家,我可能完全错了。此外,这可能不适用于所有类型的软件(例如嵌入式软件),但据我看来,至少涵盖了商业应用开发过程。而且,本文不可避免地是从开发者的角度撰写的,尽管我也希望了解其他观点。

本文为上一篇文章提供了背景:《软件项目失败的心理原因》(建议阅读)。

“我们真正的发现来自于混乱,来自于去那些看起来错误、愚蠢和荒谬的地方。”Chuck Palahniuk

致谢

我要感谢Gerard Garcia先生提供的宝贵意见。

一切始于需求

根据维基百科的定义,需求是生物体健康生存所必需的东西。……就需求而言,缺乏会导致明确的不利后果:功能障碍或死亡……,需求是安全、稳定和健康生活所必需的……“。在软件开发的情况下,有三个主要的共生体(也称为利益相关者)共同存在,并从已开发的解决方案中受益,我将其定义为软件及任何其他支持性产物(文档、流程、政策……)。这些共生体是

  • 客户——驱动解决方案开发的实体,并从部署解决方案中获益;
  • 企业——从提供解决方案中获益的实体(所有者、股东、管理层等);
  • 开发者——从构建解决方案中获益的实体(程序员、架构师、分析师、质量工程师等)。

可能还有更多的共生体,例如“运营”,但我为简化起见只保留三个。

这三个共生体各自有自己的需求集,应由公司提供的解决方案来满足。

图1. 利益相关者的需求。

对于客户来说,解决方案必须满足的最重要的需求是

  • 效用——表示解决方案在多大程度上解决了特定客户的问题。就软件而言,效用可以分解为提供的功能、便利性、性能、可靠性等。
  • 灵活性——表示解决方案在多大程度上适应客户面临的新挑战。通常可以将其表示为对变更请求的准备程度和响应时间。
  • 可负担性——通常可以将其表示为实现积极投资回报的需求。

对于企业来说,解决方案必须满足的最重要的需求是

  • 利润——以维持企业所需的财务收益衡量
  • 可预测性——表示公司内部和外部环境的稳定性。
  • 增长——防止停滞和衰退。

对于开发者来说,解决方案必须满足的最重要的需求

为了使这种共生关系蓬勃发展,软件解决方案必须在一定程度上满足所有这些需求。未能满足某些需求会导致其他需求的潜在多米诺骨牌效应和共生关系的终结。

没有需求是孤岛

需求是相互关联的,当一个需求得到满足时,满足另一个需求的潜在能力就会增强。另一方面,未能满足一个需求会导致未能满足另一个需求。例如,更高的灵活性可以增加利润,因为可以向客户销售更多功能。

下图展示了这一概念,其中椭圆代表需求,线条代表关系,箭头表示(潜在的)正向或负向放大的方向(假设所有其他因素不变)。

图2. 需求之间的关系(解释见附录)

如前所述,放大可能是负面的。在这种情况下,未能满足一个需求会导致其他需求的失败。下面的示例图(是图2的衍生图)显示了代码质量低下如何未能满足灵活性需求。这会在整个集合中沿着关系线传播涟漪效应。负面影响用灰色阴影的强度表示(灰色越深,影响越大),并且该过程分为几个阶段,由红色的垂直线标记,因为影响会随着时间的推移而传播,并损失其价值。

图3. 未满足的需求及其后果(图2中图形的可能扩展之一)

低代码质量通常归因于难以理解和修改的代码。这会影响灵活性,因为公司无法快速响应客户不断变化的需求。灵活性会影响利润可预测性增长,因为产品可能会落后于竞争对手,预算和进度会超支,并且适应新市场或产生产品衍生产品的能力会降低。较低的利润会影响可负担性,因为公司的价格竞争力会降低。它还会影响效用,因为新功能、优化或其他改进会延迟。它还影响收入,因为紧张的预算可能会迫使公司寻求更便宜的劳动力或削减现有福利。较低的利润会影响自主性,因为当预算收紧时,控制机制也会收紧。最后,它会影响精通,因为培训机会减少,工作速度比质量更重要。

所举的例子实际上是简化的,因为为了清晰起见,省略了一些关系。在实际情况中,反馈会沿着所有线条传播(参见图2),直到采取纠正措施或公司陷入困境。

另一个简化的例子展示了商业远见缺乏如何影响对增长的需求,以及这种负面影响如何沿着关系线传播。我将留给读者练习证明这个过程(使用附录中的表格)。

图4. 另一个未满足的需求及其后果(图2中图形的可能扩展之一)

从需求到价值

在软件开发的背景下,我们将价值定义为任何满足需求的事物(介于价值的伦理定义和效用的经济定义之间)。某事物(产物、事件、过程、物质对象等)越能满足需求,它所代表的价值就越高。

在软件上下文中,满足上述需求的常见价值总结如下(此列表并非详尽无遗,许多价值通常会满足一个以上需求):

  • 对于效用——软件功能、运行速度、可用性、低故障率、低缺陷率、用户培训、与业务流程的对齐。
  • 对于灵活性——接受变更请求的准备程度、开发速度、沟通质量。
  • 对于可负担性——可负担的许可证价格、稳定的价格、灵活的价格。
  • 对于利润——原始货币价值、利润稳定性、客户保留率。
  • 对于可预测性——透明的开发流程、员工保留率、客户保留率、成本稳定性、接受变更请求的准备程度、开发速度。
  • 对于增长——客户群增长、产品组合增长。
  • 对于收入——原始货币价值、付款的规律性、福利。
  • 对于自主性——透明的排程、工作时间灵活性、信任。
  • 对于精通——培训、对质量的认可、自主发挥的自由。
  • 对于目的——与个人价值观的一致性、来自客户的认可、来自企业的认可。

成功的共生关系的目标是在所有三个共生体之间尽可能多地创造价值,同时保持所有需求的最佳平衡

软件开发作为一项研究活动

为了找到最能满足利益相关者需求的价值,软件开发团队必须主动搜索和评估所有可能的解决方案。随着需求的不断变化,这是一个持续互动、追逐移动目标的挑战。因此,软件开发类似于应用科学研究,探索未知创造新事物(否则就会重用现有软件)。软件开发过程的阶段可以映射到科学研究的阶段,尽管两个社区使用的词汇不同。

图5. 软件开发与科学研究过程阶段。

软件解决方案开发和科学研究的阶段在以下方面相似:

  • 投标或功能请求,是客户需求的初始观察,相当于科学研究中对观察的解释(我们实际看到什么)。
  • 需求/业务分析,是问题界定的阶段,相当于提出一个恰当地切中观察到的问题的正确问题。
  • 设计+实现阶段相当于提出假设,并预测如何满足客户的需求以及可能产生哪些后果。这是心智构建和心智实验的快速迭代,通过启发式方法探索可能解决方案的多维空间。当你观察到设计和代码(本质上是在不同抽象层次上相同)如何快速地相互验证和影响,直到工作最终完成时,这种相似性就显而易见了。
  • 最后,部署是一个验证假设和预测的实验,这些假设和预测主要以软件的形式表达。技术和功能假设得到验证,并形成新的变更请求。

驾驭混乱

研究,其本质上是一个创造性过程,是内在不可预测的,且无法保证成功(因为好的想法永远无法保证)。由于软件开发与应用科学研究非常相似(或者大胆地说,实际上就是),不确定性是软件开发整个过程和每个阶段固有的。

投标或功能请求通常是一个开放式问题,考虑到此时掌握的信息量,只能近似回答。讽刺的是,项目范围和成本通常在这个阶段就已固定,当时项目还只是一个“猜测”。这个阶段的持续时间和效果是无法预测的,并且受到参与方数量、地理位置、沟通效率、商业策略、经济状况等因素的强烈影响。

需求/业务分析本质上是迭代的,因为会一直循环直到满足某个可接受的阈值,这通常只是参与者的一种集体“直觉”(有时称为最小可行产品)。无论花多少时间进行分析,需求完整性始终是一个开放性问题。此阶段的持续时间(迭代次数)和效果受到参与方数量、地理位置、天气、领域专家可用性、沟通效率、工具可用性或专家能力的强烈影响(有时客户会指定最不称职的人作为领域专家)。

设计+实现的持续时间和结果取决于需求的质量、沟通、技能、现有代码和设计的质量以及参与人员的能力。这个阶段需要高度的创造力责任心开放性,并且受到与前一阶段相同问题的 $影响。

部署阶段持续时间和结果的不可预测性主要来自于客户无法强制执行采用速度,但沟通也起着重要作用。

生产线谬论

许多公司犯了一个错误,认为软件解决方案的构建就像大规模生产汽车一样。问题在于,汽车生产是一个制造已知事物(车身、发动机、车轮等)的许多实例的过程,在功能和材料方面存在一些差异。问题通常得到了很好的理解和界定,方法也得到了很好的掌握,并且标准是外部强制执行的。因此,许多经理犯了一个错误,认为将一个定义明确的流程应用于软件开发最终会带来成功。他们认为,一群被固定在特定岗位的流水线工人严格遵循当前流行的流程(例如SCRUM)将带来成功。

鉴于以上所述,这是一个谬论,因为任何流程都无法替代人的智慧、知识、经验和奉献精神。此外,不恰当的流程会压制所有这些必需的品质,导致比没有流程更糟糕的结果。用研究的领域来解释,这意味着无论多少普通的工人在遵循最复杂的流程,都无法取代一个爱因斯坦,因为“一台机器可以做五十个普通人的工作,但没有一台机器能做一个非凡人的工作”,而软件工厂生产线本身就可以被想象成一台机器。另一方面,如果找到了聪明、有知识、有经验、有奉献精神的人,并向他们展示一个目标,他们通常会提出一个合理的最小化流程(这并不意味着“轻量级”,而是“恰当定制”),并且在很少的监督下就能实现目标。然而,实际上,大多数项目管理员似乎更愿意完全控制平庸的流程,而不是对超高效的流程“失控”

全力以赴

软件开发与应用科学研究一样,是一个全力以赴的流程,具有不可预测的时间框架和结果。可以使用风险缓解技术(现成组件、设计模式、最佳实践、质量保证、项目审查程序、短迭代、保险、过度报价等),但固有的不确定性无法消除。这表明应用于科学研究和软件开发的管理策略应该相似,并基于聘用合适的人员,提供适当的工具和管理风险

“元过程”

这篇文章可能暗示我们应该放弃对成功和可预测的软件开发的任何希望,但事实并非如此。通过认识和拥抱在递归的“元过程”中交织的混乱和可预测部分的共存,可以实现成功,就像阴阳结合了秩序与混乱一样。

图6. 无形递归“元过程”,又称迭代开发(可预测阶段遵循一个较小的“元过程”)。

 

无形的“元过程”由相关人员的智慧、知识、经验和奉献精神驱动。一方面,这令人不安,因为它无法施加严格的控制。另一方面,它又是自由的,因为人们的创造力和秩序性都可以间歇性地参与其中。积极的一面是,智慧、知识、经验和奉献精神是极大地减轻固有的不可预测性和混乱的因素。一方面,人们可以通过避免做无用或有害的事情(他们能更好、更快地识别出来)来更好地实现目标。另一方面,他们在进行实验/设计、编写和测试代码时,往往会严格注意工作质量(因为他们理解按正确顺序生产的质量产物的价值)。

附注:警惕虚假价值

如果不谨慎,从价值角度处理软件开发可能会产生一些危险的后果,因为有些价值在采用后会被证明是虚假的,并最终对企业造成致命影响。

其中一种价值,常常在公司行为准则中明确提出,是礼貌,即在态度和行为上表现出对他人的尊重。礼貌在社交方面是一个重要的价值,因为它通过防止攻击行为的失控爆发来促进社会的稳定。问题在于,企业和社会的运作环境不同。对于一个社会来说,稳定比效率更重要,因为(至少在当今世界)社会并不生活在自然选择的达尔文世界中。而公司则生活在一个竞争激烈的、被称为“自由市场”的攻击性自然选择的世界中。在这个世界里,效率比礼貌更重要。一个健康的公司应该始终提倡建设性争论而不是礼貌的共识,因为前者会导致创造性的解决方案,而后者会导致技能型无能

注:您可能对我的以下文章感兴趣——“誓约三角”,其中我讨论了支撑商业软件开发以确保健康合作的道德美德。

注:您也可能对我的文章感兴趣——《21世纪的“外科手术团队”》,其中我介绍了如何构建成功的软件开发团队。

附录

下表解释了第二章中定义的需求之间的关系。

需求对需求关系 成功放大 失败放大
可负担性 → 增长 低价或灵活价格促进市场份额增长 高价或固定价格阻碍市场份额增长。
可负担性 → 可预测性 低价或灵活价格使解决方案免疫市场波动 高价或固定价格使解决方案容易受到市场波动的影响
自主性 → 灵活性 高度的开发者自主性促进了对变化的创造性处理 低度的开发者自主性阻碍了对变化的创造性处理
自主性 → 增长 高度的开发者自主性促进了对产品(们)的创造性处理 低度的开发者自主性阻碍了对产品(们)的创造性处理
自主性 → 精通 高度的开发者自主性激励技能提升 低度的开发者自主性阻碍技能提升
自主性 → 效用 高度的开发者自主性促进了对客户问题的创造性处理 低度的开发者自主性阻碍了对客户问题的创造性处理
灵活性 → 增长 变化的能力为增长提供了机会。 无法变化错失了增长的机会。
灵活性 → 可预测性 变化的能力使工作更可预测 无法变化使工作更不可预测
灵活性 → 利润 变化的能力鼓励客户为变化付费 无法变化不鼓励客户为变化付费
灵活性 → 效用 变化的能力可以与客户需求保持一致 无法变化妨碍了与客户需求的同步
增长 → 精通 扩张激励开发者自我改进 停滞使开发者失去自我改进的动力
增长 → 目的 扩张使开发者有建设未来的感觉 停滞剥夺了开发者建设未来的感觉
收入 → 灵活性 高薪激励开发者采取主动和长远思考 低薪阻碍开发者采取任何超出最低限度的行动
收入 → 可预测性 高薪激励开发者采取主动和长远思考 低薪阻碍开发者采取任何超出最低限度的行动
收入 → 效用 高薪鼓励积极处理客户问题 低薪阻碍积极处理客户问题
精通 → 可负担性 高技能缩短了开发时间 低技能延长了开发时间
精通 → 灵活性 高技能促进技术上的灵活解决方案 低技能妨碍技术上的灵活解决方案
精通 → 可预测性 高技能使开发更容易 低技能使开发困难
精通 → 效用 高技能允许满足客户需求 低技能只允许完成目前可行的。
可预测性 → 自主性 稳定的公司更愿意信任开发者 不稳定的公司更愿意控制开发者
可预测性 → 增长 稳定的公司可以规划长期增长 不稳定的公司倾向于巩固现有市场地位
可预测性 → 收入 稳定的公司可以负担更高的薪酬和福利 不稳定的公司削减薪酬和福利
利润 → 可负担性 富裕的公司可以在价格上竞争 贫穷的公司无法在价格上竞争
利润 → 自主性 富裕的公司更愿意信任开发者 贫穷的公司更愿意控制开发者
利润 → 增长 富裕的公司可以规划长期增长 贫穷的公司在巩固现有市场地位方面面临困难
利润 → 收入 富裕的公司可以负担更高的薪酬和福利 贫穷的公司削减薪酬和福利
利润 → 精通 富裕的公司可以负担培训并投资于质量 贫穷的公司在培训和质量上节省开支
利润 → 效用 富裕的公司有能力开发昂贵的功能 贫穷的公司没有能力开发昂贵的功能
目的 → 灵活性 认可促进了对变化的创造性处理 缺乏认可阻碍了对变化的创造性处理
目的 → 增长 认可促进了对产品(们)的创造性处理 缺乏认可阻碍了对产品(们)的创造性处理
目的 → 精通 认可激励开发者自我改进 缺乏认可阻碍开发者自我改进
目的 → 可预测性 认可激励遵守排期 缺乏认可阻碍遵守排期
效用 → 可预测性 满足客户需求解决方案具有强大的市场地位 未能满足客户需求的解决方案市场地位薄弱
效用 → 利润 满足客户需求的解决方案可以卖出更高的价格 未能满足客户需求的解决方案必须廉价才能证明购买的合理性
效用 → 目的 满足客户需求的解决方案让开发者有价值感 未能满足客户需求的解决方案剥夺了开发者的价值感
© . All rights reserved.