Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

前期设计够用就好

  • 2014 年 5 月 14 日
  • 本文字数:1254 字

    阅读完需:约 4 分钟

本文建议前期做足够的架构设计,以便提供项目启动所需的结构,统一团队愿景以及评估可能的风险。

前期做完整设计的瀑布模型时代已经结束,但那是说开发人员应该在完全没有任何设计草图的情况下开始一个新的软件项目吗?如果没有进行充分的考虑就开始编写代码,却在数周后发现最初做的技术选择完全错误,那会发生什么?如果没有考虑设计原则和模式,系统设计成一个大泥球,那会发生什么?

另外,如果 UML 很大程度上被看作是开发人员编码路上的障碍,那是说团队不应该使用任何图形化的方式来一起交流他们想要构建的系统的设计?难道就没有一种方法既能创建刚好够用的前期设计,又不成为开发人员的负担,同时又能保证整个团队清楚如何按照计划取得项目的成功?有没有一种方法可以用来与所有团队成员交流设计,以保证他们正在构建同样的东西?

Simon Brown 是一位来自欧洲的软件架构师和咨询师。最近,在布达佩斯 Craft 大会上,他在题为《敏捷与软件架构的本质》的演讲中试图解答这些问题,并就最小的初步设计和设计交流方式提供了建议。

演讲从“没有架构就不是解决方案”的假设开始,Brown 建议做足够的前期设计,直到组件层。他基于他的C4 模型将系统分成几层,如下图所示(该图片来自会议幻灯片-PDF ):

首先,需要考虑系统将如何使用以及它对其它系统有什么依赖。然后拟定容器。容器是一个可部署单元,如Web 服务器、应用服务器、数据库、浏览器插件等等。这包括针对将要使用的技术做一些决策,因为系统实现不是“技术无关的”。接下来是容器内的组件。一个组件通常是一个高度相关的类的集合,它们一起实现了一项特定的系统功能。组件由模块或程序包来体现。Brown 举了一个例子,其中就有这样一个出自其项目 techtribesjed 的组件,如下图所示:

图片的左侧是最初的组件,由两层构成,包括一个服务层和一个数据访问层,每层都有自己的程序包,但组件随后会整合进一个单独的程序包中,如图片右侧所示。在某些情况下,Dao 接口以及分成两层和两个程序包是必要的,但在这种情况下,为了简单起见,Brown 决定将两个合为一个。虽然本图给出了接口和类,但并不是说前期设计要详细到这种程度。只是决定组件本身,而不是它包含的类或者接口。

在设计好了系统的总体结构,并且到了组件层之后,前期设计过程还包含下图所示的两个阶段:

对于架构师而言,与整个团队分享他的愿景是很重要的,这样一来,他们都会构建同样的东西。图表很有用,可以使用工具画,也可以手工草绘。重要的是要有一个图形化的系统表述,包括它的结构、容器和组件,团队成员可以在接下来的任何时间查看这一表述。

另一个重要的阶段是评估系统构建过程中可能存在的风险。Brown 建议使用风险风暴来识别这样的风险。整个团队分析架构模型,每个人都指出哪里可能有实现问题。对于该阶段,他建议包含概念验证或者一个系统原型。

最后一个建议与领导力相关。据 Brown 说,如果有一个领导者做系统架构,大多数团队都表现上佳,而如果系统足够大,更成熟的团队会使多人分担这一角色,以保证团队有上佳表现。

查看英文原文: Just Enough Up-front Design

2014 年 5 月 14 日 20:181814
用户头像

发布了 256 篇内容, 共 72.9 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

Java服务,内存OOM问题如何快速定位?

老大哥

Java 程序员 后端

你应该了解的MySQL锁分类

X先生

MySQL 数据库 sql 数据库优化

​程序员离职后收到原公司 2400 元,被告违反竞业协议赔 18 万

程序员生活志

程序员 职场

防止APP窃取用户隐私问题,OPPO安全在行动

OPPO安全

App 安全 隐私保护 数据隐私 sdk

克隆虚拟机

yuanhang

Java架构师JVM启动流程和内存结构,程序员必看!

老大哥

Java 程序员 后端

没想到 Hash 冲突还能这么玩,你的服务中招了吗?

老大哥

Java 程序员 后端

第13周 作业

Jaye

oeasy 教您玩转linux 之010208 满屏乱码 bb

o

解Bug之路-Nginx 502 Bad Gateway

无毁的湖光

nginx Linux TCP

第十三周作业

olderwei

极客大学架构师训练营

商业通识 : 商业从哪里来?

Walker

学习 得到 个人成长 商业

服务化反面案例

心平气和

服务化 权限

开源流数据公司 StreamNative 正式加入 CNCF,积极推动云原生策略发展

Apache Pulsar

云原生 pulsar Apache Pulsar 消息系统 消息中间件

大专生拿到阿里offer,却担心背调不过,网友:985在你面前黯淡无光

程序员生活志

面试 职场 阿里

What's new in Dubbo-go v1.5.1

apache/dubbo-go

dubbo 服务端 Go 语言

架构师训练营第13周作业

架构师训练营第十三周作业

张明森

Spring 5 中文解析核心篇-集成测试之TestContext(上)

青年IT男

单元测试 Spring5 JUnit

「查缺补漏」巩固你的RocketMQ知识体系

Kerwin

Java RocketMQ

关于二进制的补码,反码,正负数表示以及Java代码测试

Zexho

Java 补码 位运算 反码 计算机知识

模板方法模式——看看 JDK 和 Spring 是如何优雅复用代码的

简爱W

Java 程序员 java架构

对PageRank的理解

2流程序员

PageRank 算法

周冬辉

超详细:完整的推荐系统架构设计

博文视点Broadview

架构 算法 推荐系统

大数据

yuanhang

Centos 7 虚拟机

我的大厂面试经历

老大哥

Java 程序员 后端

架构师训练营第 0 期第 13 周作业

无名氏

Hessian Bug修复

心平气和

php 序列化 hessian

为什么一个还没毕业的大学生能够把 IO 讲的这么好?

cxuan

Java 后端 io

全票通过!易观开源项目DolphinScheduler进入Apache孵化器

易观大数据

GPU容器虚拟化:用户态和内核态的技术和实践详解

GPU容器虚拟化:用户态和内核态的技术和实践详解

前期设计够用就好_架构_Abel Avram_InfoQ精选文章