http://www.cnblogs.com/feng9exe/p/5592577.html

什么是软件设计的复杂度

软件技术发展的使命之一就是控制复杂度(Complexity)。从高级语言的产生,到结构化编程,再到面向对象编程、组件化编程等等。关于复杂度的定义并不一致,想要详细了解的可以读读The Many Faces of Complexity in Software Design.

英文中Complex和Complicated有着微妙的不同。但总结起来,软件复杂度偏负面意义,包括两个要点: 
- 难以理解 (难以维护和扩展。) 
- 无法预测行为

复杂度是随着软件规模不断扩大而必然产生的。它本身又是一个相对的概念,同一个系统对于设计者、开发者,以及维护者而言,复杂度是不同的。不同时期,一个程序员所能掌握的复杂度也是不同的,这也是一个程序员不断提升的目标。

既然业界已经对抗复杂度几十年了,我们就来整理一下。

以分解降低复杂度

以分解的方式进行的设计,主要特点是: 
- 分离职责(Seperation of Concerns,参考单一职责原则) 
- 关注接口(定义交互)

这是最常使用的技术了。将一个大问题,不断的拆解为各个小问题进行分析研究,然后再组合到一起。在西方称为Divide and Conquer Principle (分而治之原则)。

在结构化编程的时代,提倡模块化(Modularization)。最早提出软件复杂度的工程师提出了基于组件的软件(Component Based Software)。不知道是不是从乐高积木上得到的启发,将系统中拆分为不同的组件,各自实现,然后再组装在一起。

在架构设计中,无论是C/S风格,分层,还是N-Tier,SOA,和前面组件式一样,都是在进行分解,它们都更加强调组合交互。设计上,分分职责,定义好接口,就可以各自开发了。然后将交互限定于接口层,就能够很好的控制整个系统的复杂度。

比如应用层使用一个语音库(Speech Library,一个以库的形式的模块化应用), 根本不用关心其内部实现,只要了解如何使用它的API就可以了。

软件复杂度与分而治之相关推荐

  1. 读张逸的领域驱动设计之应对软件复杂度笔记

    2019独角兽企业重金招聘Python工程师标准>>> 张逸的<领域驱动战略设计实战>地址,付费的,价格¥59,还能接受. Eric Evans认为"很多应用程 ...

  2. 阿里研究员谷朴:警惕软件复杂度困局

    作者 | 张瓅玶(谷朴)  阿里巴巴研究员 **导读:**对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪 ...

  3. 阿里研究员:警惕软件复杂度困局

    简介:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考 ...

  4. 领域驱动设计 软件核心复杂性应对之道_DDD - 领域驱动设计对软件复杂度的应对(上)...

    不管是因为规模与结构制造的理解力障碍,还是因为变化带来的预测能力问题,最终的决定因素还是因为需求.Eric Evans 认为"很多应用程序最主要的复杂性并不在技术上,而是来自领域本身.用户的 ...

  5. 【转】阿里研究员:警惕软件复杂度困局

    阿里研究员:警惕软件复杂度困局 原创 谷朴 阿里技术 8月24日 阿里妹导读:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演 ...

  6. 读后:警惕软件复杂度困局

    软件工程师们常常自嘲,"when things work, nobody knows why" 警惕软件复杂度困局一文中提出了几个值得深思的观点,在此记录一下. 原文地址: 警惕软 ...

  7. 软件复杂度和圈复杂度

    作者:翁松秀 软件复杂度和圈复杂度 软件复杂度 1,起源与应用 成立于1976的McCabe & Associates公司开发出了McCabe Cyclomatic Complexity Me ...

  8. 对抗软件复杂度的战争

    作者:晓斌 阿里技术风险与效能团队 服务一个人的系统,和服务一亿人的系统,复杂度有着天壤之别.本文从工程师文化.组织战略.公司内部协作等角度来分析软件复杂度形成的原因,并提出了一些切实可落地的解法. ...

  9. 代码规范-对抗软件复杂度

    1.为什么需要代码规范 任何系统性的项目都需要架构设计,而架构设计的核心命题是控制复杂度. 但随着项目的不断迭代,复杂度就会不断上升,研发效率就会不断下降. 而代码规范正是对抗软件复杂度的有效手段,通 ...

最新文章

  1. Java的学习之路(1)
  2. PHP+Mysql数据库操作简类
  3. careercup-高等难度 18.9
  4. 王者归来:分布式调度解决方案 ElasticJob 重启!
  5. golang中的base64
  6. linux /home recovering journal,linux报错:/dev/sdb2:recovering journal
  7. @ngrx入坑angular的schema,爽的一逼!
  8. RC952-FXE1-BL用户使用手册(存档)
  9. 香港城市大学计算机专业选课,香港城市大学传播与新媒体专业课程设置
  10. 计算机术语中 1gb等于 mb.,GB、MB、KB分别是什么意思,大小分别是多少?
  11. springboot项目logback.xml或者logback-spring.xml中读取不到application.yml或application.properties配置文件中的配置解决办法
  12. 蒙牛、小米、比亚迪,明星企业为何扎堆换LOGO?
  13. 计算机网络:20 网络应用需求
  14. java毕业生设计演唱会网上订票购票系统计算机源码+系统+mysql+调试部署+lw
  15. 云锵基金 2019 年 03 月简报
  16. 是否必须支持虚拟化的CPU才能安装64位系统?
  17. Excel如何快速删除空白行?替换部分字符?
  18. 计算机毕业设计(附源码)python疫情医疗物资管理系统
  19. pycharm使用eval reset不能重置
  20. 常用正则验证 :手机号、验证码、密码、邮箱等验证

热门文章

  1. Java 集合系列12之 Hashtable详细介绍(源码解析)和使用示例
  2. dubbo简易实现_分别利用自定义的注册中心和zookeeper
  3. Linux命令之目录和文件操作
  4. 002.AngularJs调用Restful实现CRUD
  5. Linux shell创建空文件(0字节大小)文件方法
  6. 设计模式 (一) 初次体验
  7. LeetCode 91. 解码方法
  8. SpringCloud系列博客父工程xml依赖
  9. 最简单的Jdbc连接Oracle代码
  10. 手机发送验证码的业务逻辑探究-主要是安全性,响应性