首页 > 其他分享 >软件复杂度

软件复杂度

时间:2022-11-30 09:48:37浏览次数:32  
标签:依赖 迭代 项目管理 复杂度 业务 套路 软件

在 《人月神话》和《卓有成效的程序员》这两本经典的书籍中都提到:

软件设计与开发的核心就在于控制复杂度

软件为什么会出现复杂? 有哪些复杂问题? 有什么通用的解决方案呢?我们从下面两种拆分方法来看:

一、空间 + 时间 + 人

在看软件复杂度时,除了时空信息之外,还应看人这个不确定因素。

空间复杂度

依赖多,规则多,客户多,流量大这些都是空间维度可能会面临的问题,在这样的背景下,相关领域知识需要每个参与者都掌握,这里如果存在认知偏差,就会造成需求和交付的偏差。

空间复杂度的解决套路:

  • 关注点分离:业务上按照通用&非通用,核心&非核心,主流程&辅流程做分离;技术上按照功能性需求&非功能性需求分离。
  • 依赖原则依赖稳定,对内对外服务必须有SLA机制;依赖服务抽象化,对外接口不依赖服务实现细节;分层依赖,上层服务不依赖下层服务,平台业务稳定性不依赖业务方服务;组合优于继承,减少依赖。
  • 认知减负: KISS原则,简单就是美,若无必要,勿增实体;统一语言,尤其是组织内部对同一事物、各种名词概念理解一致;统一架构规范,包括代码规范、架构分层规范、上线发布规范等;文档既代码,防止信息丢失,做好知识传承。

时间复杂度

“天下武功,唯快不破”,互联网产品更是遵循这样的规律,一招鲜吃遍天,慢竞争对手一步,可能就会被淘汰出局。在这种快速试错的环境下,我们需要更早地交付业务价值。因此,很多时候产品无法深思熟虑,开发也未必有都有充足时间详细设计。因此我们往往在知识最不充分的时候,做出了最重要的决定。

时间复杂度的解决套路:

  • 迭代开发:按照敏捷迭代开发模式,随着每个迭代,不断获取市场和用户对产品的反馈以及环境(竞对、技术等)的变迁,不断建立新的认识,在随后的迭代计划中做出调整,响应具体的变化。
  • 战略编程,是指重视设计并愿意投入时间,短时间内可能会降低工作效率,但是长期看,会增加系统的可维护性和迭代效率,但必须要做到不过度设计。
  • 适当的扩展性,比如:预留字段,通过流程引擎来满足工作流程的快速响应,通过UI组件化配合UI的编辑器来快速调整用户界面的变化;通过插件技术来将容易变化且相对复杂的逻辑从主流程中剥离出来进行扩展等。

人员复杂度

软件是人大脑的思维产物,互联网最重要的资产就是人。人员复杂度就类似让一群高智商人群,像一群舞蹈演员对外部(如音乐)感应作出合理响应,并且与舞伴进行默契的行动、表情配合,始终呈现一些良好的作品。

人员复杂度的解决套路:

  • 情境管理:正视人的成长诉求和规律,根据能力&意愿进行合理工作分配,并做好核心岗位的人员互备工作;
  • 减少不必要的协同:比如“两张披萨饼团队”,只有绝对必要时才召开会议。
  • 理性思考:建立指标体系;在各个环节可引入“第十人理论”,防止出现重大错误。

二、业务 + 技术 + 项目管理

软件研发的复杂工作主要有这些:

  • 业务复杂度: 从客户(利益相关方)视角看;
  • 技术复杂度: 从实现视角看;
  • 项目管理复杂度: 从协作视角看;

软件复杂度 = 业务复杂度 + 技术复杂度 + 项目管理复杂度

业务复杂度

业务复杂度对应了客户的业务需求,比如业务流程多,参与者多等,因而这种复杂度往往会随着需求规模的增大而增加。

业务复杂度解决套路:

  • 提前想全各利益相关方。
  • 站在更高层抽象提炼各方诉求。
  • 尽可能的拥抱变化,做到关注点分离。

技术复杂度

技术复杂度来自需求的质量属性,诸如安全、高性能、高并发、高可用性、低成本等需求,为软件设计带来了极大的挑战。让人难受的是这些因素彼此之间又可能互相矛盾互相影响。

技术复杂度解决套路:

  • 按照业务特征做取舍:用空间换时间,用时间换空间。
  • 关注行业新技术适用场景。

项目管理复杂度

项目管理复杂度:随着参与方的增多,沟通的成本会指数级放大。项目管理的挑战在有限的资源约束下,以项目成功为目标的对项目全过程计划、组织、指挥、协调、控制、评价。

项目管理复杂度解决套路:

  • 确保参与方目标一致。
  • 定期做好信息同步,定期收集反馈。

总结

复杂度增长带来的风险往往是后知后觉的,等到问题出现时,往往已经形成一段时间,或者坑往往是很久以前埋的。

如果你所写的业务代码生命周期只有几个月,那么多半在代码变得不可维护之前就可以下线了,那可以不用关注太多,能用就行。但是如果不是,我们就需要尽力控制,就算是因为进度而临时打破窗户也要尽快补上,避免腐化到问题很严重了。

标签:依赖,迭代,项目管理,复杂度,业务,套路,软件
From: https://www.cnblogs.com/ghj1976/p/ruan-jian-fu-za-du.html

相关文章

  • web相关概念回顾以及web服务器软件_概念
    web相关概念回顾1.软件架构:1.C/S:客户端/服务器端2.B/S:浏览器/服务器2.资源分类1.静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以......
  • 浅谈工作与生活分离的企业内部沟通软件
    现在很多年轻员工在工作的时候很容易出现拖拉现象,工作不能够按时完成或者是在工作时间做一些自己的私事,严重影响到了工作进度,老实说,所有的企业都希望自己的员工在上班时间能......
  • 国外软件外包项目网站(适用软件兼职)
    Elance是国外成熟的一套业务外包平台,外包项目类型以软件和网站为主,这个平台上包含平面和动画设计,网站设计,软件编码设计,商业计划寻找技术合作商等各类需求。注意事项:古人云好......
  • 亚马逊云科技与黑莓扩大合作,将BlackBerry QNX基础软件迁移上云
    在亚马逊云科技2022re:Invent全球大会上,黑莓公司(BlackBerryLimited)(纽约证券交易所代码:BB;多伦多证券交易所代码:BB)宣布进一步利用亚马逊云科技,首次通过云服务将BlackBerry®......
  • 时间空间复杂度分析
    时间复杂度「时间复杂度」(Timecomplexity)定性描述该算法的运行时间大O符号表示法(BigO)):T(n)=O(f(n))表示一个算法的渐进时间复杂度,f(n)表示代码次数之和,O表示......
  • 【软件工程】UML中类之间的六大关系
    前言快速回忆一、泛化关系(Generalization)说明:这种关系就是面向对象语言中的继承关系,逻辑上可以用"isa"表示。代码体现:子类继承父类。UML符号:​​一条实线+空心箭头​​。图......
  • 软件离线许可(License)实现原理
    我们经常使用各种开发软件,比如IntelliJIDEA、Navicat、VisualStudio等,这些软件都有一个特点,就是要收费。一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够......
  • manjaro下为octave安装control软件包
    最近在看《算法之美》,里面配套的代码是octave的,安装好了软件后,运行代码,发现提示没有发现packagecontrol一、打开图形化的octave软件,通过帮助菜单--octave软件包,自动......
  • 【开发必备】你会安装哪些开发相关的软件?
    背景作为一名开发人员,你的电脑都装什么开发相关的软件?今天和大家分享下一些软件的安装步骤按照我认为的重要性,以及熟悉程度列出如下清单。VirtualBoxUbuntuMASSdock......
  • 多表查询、Navicat软件、PyMySQL模块
    目录多表查询、Navicat软件、PyMySQL模块一、多表查询的两种方法1.准备工作2.第一种:连表操作3.第二种:子查询总结与结论:二、多表查询练习题1.课堂多表查询练习题2.以上练......