初探架构之美_结构优化设计

初探架构之美_结构优化设计中国科学技术大学软件学院 王松 原创作品版权所有转载请注明出处本科时就听说过《架构之美》这本书,但一直觉得会很深奥而没敢去看。这次课外阅读书籍中再次出现这本书,于是下定决心拜读一下这本著作。敲了几年代码,总觉得代码比较实际,架构比较空洞。“虚幻”的架构往往让人摸不着头脑,因为架构难以落在纸上,人们谈起架构时又总是以一种只可意会不可言传的姿态。美丽的架构无法定义,可它却一定是自然的、

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

中国科学技术大学软件学院   王松   原创作品版权所有转载请注明出处

        本科时就听说过《架构之美》这本书,但一直觉得会很深奥而没敢去看。这次课外阅读书籍中再次出现这本书,于是下定决心拜读一下这本著作。

        敲了几年代码,总觉得代码比较实际,架构比较空洞。“虚幻”的架构往往让人摸不着头脑,因为架构难以落在纸上,人们谈起架构时又总是以一种只可意会不可言传的姿态。美丽的架构无法定义,可它却一定是自然的、简单的、可复用的、人文的,甚至是外行人也可以细细品味其思想的。

        什么是架构?我们将“架构”作为一个名词,它意味着一组工件,包括像蓝图和构建规范这样的文档。这些工件描述了要构建的对象。Jim Waldo和其他人曾指出,没有什么过程可以保证你学了以后就能创造出好的架构,更不必说美的架构了,所以我们将更关注工件,而非过程。从这些能看出,虽然我们无法学习创造美的架构的步骤,但是我们可以通过学习判断怎样的架构是美的来帮助我们不断发现架构中的缺陷。那些被我们所津津乐道的架构,都是大师们在日常工作里经历了大量的错误、重复的尝试、无数的代码、长久的考验所积淀下来的。如果我们也能找出架构中的不足不断改进,总有一天会创造出美的架构。

        架构之美体现了关注点的分离与结合。在软件设计中,设计师需要考虑多方面的关注点。漂亮的设计让这些关注点尽可能分离,然后以最简单的机制结合在一起,从而得到高内聚、低耦合的系统。而这些关注点往往都包含以下几点:

功能性

         产品向它的用户提供哪些功能?

可变性

        软件将来可能需要哪些改变?哪些改变不太可能发生,不需要特别容易进行这些改变?

性能

        产品将达到怎样的性能?

容量

        多少用户将并发使用该系统?该系统将为用户保存多少数据?

生态系统

        在部署的生态环境中,该系统将与其他系统进行哪些交互?

模块化

        如何将编写软件的任务分解为工作指派(模块),特别是这些模块可以独立地开发,并能够准确而容易地满足彼此的需要?

可构建性

        如何将软件构建为一组组件,并能够独立实现和验证这些组件?哪些组件应该复用其他的产品,哪些应该从外部供应商处获得?

产品化

        如果产品将以几种变体的形式存在,如何开发一个产品线,并利用这些变体的共性?产品线中的产品以怎样的步骤开发?在创建一条软件产品线时,要进行哪些投资?开发产品线中不同变体的选择,预期会得到怎样的回报?特别是,是否可能先开发最小的有用产品,然后再添加(扩展)组件,在不改变以前编写的代码的情况下,开发产品线的其他成员?

安全性

        产品是否需要用户认证,或者必须限制对数据的访问?数据的安全性如何得到保证?如何抵挡“拒绝服务”攻击或其他攻击?

        好的架构必须满足系统的利益相关人的功能和质量关注点。那么超过足够好的架构是怎样的呢?我们要从这些好的结构中进一步筛选,就要设立更高的门槛。首先,我们应该关注架构的实用性,它必须每天都被许多人使用。但是,在使用它之前它应该先构建,所以我们应该关注该架构的可构建性。接下来,我们想寻找那些展示了持久性的架构,也就是说,那些经过了时间考验的架构。最后,我们还想寻找这样一些架构,它们的特征让使用、构建、测试这些架构的开发人员和测试人员,以及由它而形成的系统的用户感到由衷的高兴。

        作者通过“混乱大都市”和“设计之城”两个例子向我们展示了架构如何对软件项目产生深远的影响。架构几乎会影响所有与之相关的人和事。从这两个例子,我们可以看出好的架构是很多因素的结果,包括以下方面(但不限于此):

  • 确实进行有意为之的前端设计。(许多项目甚至还没开始,就因为这一点而失败了。)
  • 设计者的素质和经验。(以前犯过一些错误是有帮助的,这能在下一次为你指出正确方向!)
  • 在开发过程中,保持清晰的设计观点。
  • 授权团队负责软件的整体设计,而团队也承担起这一责任。
  • 不要害怕改变设计:没有什么是一成不变的。
  • 让合适的人加入到团队中,包括设计者、程序员和经理,确保开发团队的规模合适。确保他们具有健康的工作关系,因为这些关系将不可避免地影响代码的结构。
  • 在合适的时候做出设计决定,当你知道所有必要信息时再做出决定。延迟那些暂时不能做出的决定。
  • 好的项目管理,以及合适的最后期限。

        最后作者通过企业级应用架构、系统架构、最终用户应用架构以及语言与架构这些方面举例说明了经典架构的美丽之处。

        我们总是认为不良的架构只是会影响到软件的代码,但是读完这本书后,我发现,不良的架构的影响不仅限于代码,它会进一步影响到人、团队、过程和时间表。开发团队的成员,尤其是新成员会被系统的复杂性惊吓到,项目会给他们带来巨大的压力,尤其是规划新的功能会导致极大的恐惧。由于系统的复杂性,所以即使是最简单的变更都需要花费大量的实践,从而导致管理项目的开发周期显得极其困难。

        记得之前和宿舍的人一起讨论工程实践的概要设计时,他问了我几个架构设计的问题,但当我问到他们的需求是什么时,他却没法给我明确的答复。我无法想象他们在没有抓准需求的情况下做出的概要设计会是什么样的。正如此书中所讲的,“重要的是要在开始设计系统之前知道你打算设计什么。如果你不知道它是什么,也不知道它将做什么,暂时不要开始设计它。只设计你知道需求的东西。”

        “混乱大都市”之所以混乱的一个重要原因:在项目开始之初,团队并不知道要构建的是什么。在规划“大都市”的早期阶段,有太多的架构师。面对糊涂的需求,他们都拿着一块拼不起来的拼图,试图独自工作。他们在工作时没有考虑到整个项目,所以当他们试图将这些拼图拼在一起时,就拼不起来了。没有时间进一步思考架构,软件设计的各个部分有一些重叠,于是开始了“大都市”的城市规划灾难。

        很多同学不理解工程实践开题时为什么要做那么细致的需求调研,还要对系统做出整体的概要设计。看完这本书,我开始明白这么做的意图。如果我们在需求不清,整体设计不明的情况下就开始了项目的开发,最后我们的软件肯定会成为另一个“混乱大都市”,甚至仅仅只能称作“凌乱小房间”。

        对于我们平时遇到的这些小项目而言,我们需要决定的关注点可能没有那些架构名人堂中的经典之作那么多。但我们同样应该在项目的早期就决定一些基本的关注点,它能确保代码能够容易而一致地增长,这些决定包括:顶层文件结构,我们如何对事物命名,“内部”展示的风格,共用的编码惯例,选择单元测试框架,支持基础设施(例如版本控制、适合的构建系统的持续集成)。

        当作出了设计决定后,就要进行品质控制过程。常见的品质控制手段包括:结对编程,对没有结对编程的工作进行代码/设计复审,对每一段代码进行单元测试。一提到测试,估计很多程序员就开始烦恼了。大部分都很讨厌测试环节,但是测试却又非常重要。一组好的自动化测试可以让我们在进行架构变更时风险最小。编写单元测试确保了每个代码模块的内聚性,也确保了与系统其他部分之间的松耦合。单元测试迫使我们仔细考虑每个单元的接口,确保该单元的API是有意义的,内部是一致的。

        读完整本书后感觉架构不再是那么神秘了,而是与每一位程序员都息息相关的,只要不断从所经历的项目的架构中吸取经验,我们也能成为架构大师。在读这本书期间,我担任着工程实践项目的组长,架构的设计也是我的任务之一。利用书中所学,我也开始一步步规划起属于我的“设计之城”。纸上得来终觉浅,只有在实践中慢慢摸索,才能体会到架构的美丽之处。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/203647.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【机器学习】F1分数(F1 Score)详解及tensorflow、numpy实现

    【机器学习】F1分数(F1 Score)详解及tensorflow、numpy实现F1-Score相关概念F1分数(F1Score),是统计学中用来衡量二分类(或多任务二分类)模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0。真实1真实0预测1TruePositive(TP)真阳性FalsePositive(FP)假阳性预测0Fals…

    2022年10月14日
  • ETL开发工具KETTLE使用教程「建议收藏」

    ETL开发工具KETTLE使用教程「建议收藏」Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录。若存在,则更新。Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。Kettle中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个…

  • 万字图解Java多线程

    万字图解Java多线程前言java多线程我个人觉得是javaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,本篇文章将使用实例+图解+源码的方式来解析java多线程。文章篇幅较长,大家也可以有选择的看具体章节,建议多线程的代码全部手敲,永远不要相信你看到的结论,自己编码后运行出来的,才是自己的。什么是java多线程?进程与线程进程当一个程序被运行,就开启了一个进程,比如启动了qq,w.

  • break 和 continue 的区别_continue的用法

    break 和 continue 的区别_continue的用法break和continue区别和用法的视频教程:https://ke.qq.com/course/149432?tuin=57912c43有技术问题或者面试方面想学习交流的加我个人微信renlliang2013,本人建了一个微信答疑群,有学习疑问的同学加我拉你进群。想搞清楚break和continue的用法以及区别必须要记住的两件两句话!我们大家先记住一句话:break再循环…

  • 浮动工具栏在哪里_设置面板的布局方式为边界布局

    浮动工具栏在哪里_设置面板的布局方式为边界布局使用BCG界面库,工具栏的一些用法就和MFC不一样了,MFC的CFrameWnd直接有一个设置浮动工具条位置的函数可以调用,而BCG没有,因为其对于TOOLBAR的底层实现和MFC那一套实现流程完全不同。BCG库的代码设置浮动工具栏的位置,又折腾了我几个小时,通过看其源码加改调用函数改参数调试,最后终于出来了,也不知此法好不好。代码如下: voidCMainFrame::RePos

  • 神经网络loss函数意义_lossfunction

    神经网络loss函数意义_lossfunctionL1Loss平均绝对误差(MAE),用于回归模型对于包含NNN个样本的batch数据D(x,y)D(x,y)D(x,y),losslossloss计算如下:loss=1N∑n=1Nlnloss=\frac{1}{N}\sum_{n=1}^{N}l_{n}loss=N1​∑n=1N​ln​其中,ln=∣xn−yn∣l_{n}=\left|x_{n}-y_{n}\right|ln​=∣xn​−yn​∣classL1Loss(_Loss):__constants__=[‘redu

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号