实战型开发2/3--架构设计

在这里插入图片描述
这里谈及在代码设计阶段以及重构阶段要考虑的架构方面问题,可以说是开发过程中的中层阶段;
在这里插入图片描述
主要是将

  • < the art of unix programming>
  • < clean architecture>
  • < the pragmatic programmer>
  • < design patterns>
    等几本书结合实践做一个融合总结,一些书在architect上面开始大量重复了(e.g. 《code complete》等)这里略过,大师们的看法也是高度相似的;

principle-pattern-practice

如果谈到如何去做程序设计,和大多数领域知识类似,遵循抽象的层级:principle-pattern-practice;
或者[dikw]
这种的数据到智慧的抽象模式,越往智慧级别的事情抽象就越干练关键;

复杂度&生产力

这个在本blog已经谈及很多次了,也是我个人会把《the art of unix programming》列为基本讲程序设计的书之首的原因;
书中在讲了程序设计的哲学,以及大量unix设计的模块之后,总结的时候,会说这本书归结到一点的话,就是KISS原则;
但是个人还是更推崇其中的一句话:“Controlling complexity is the essence of computer programming”
KISS因为说的太多,而且描述过于“轻松”,逐渐变成了依据“正确的废话”了,大家都知道,但是已经不再实质性遵守;
而“Controlling complexity”则在日常的开发中,给我更多的启示,也是我和team lead们工作的重心,就是反复审视系统,来看复杂度上是否有做到最简;

< clean architecture >中关于architecture的论述中,有两点觉得比较遗憾:1,没有谈及生产力,更多的把architect论述为未来扩展性和变化特性而准备;2,没有围绕复杂度来将整本书串起来。

复杂度->生产力->成本

复杂度高到一定程度的时候,项目中的整体关键开发因素开始和复杂度成正比:

  • 开发成本
  • 稳定性
    真正到了“屎山”的程度,开发成本开始接近无限大了,稳定性进入脆弱的平衡。

两个可以解耦的系统,分离状态复杂度是m+n,搞砸了揉到一起就是m*n,最后就会编程项目的成本和稳定性问题,这个就是架构设计的现实意义。

beyond 架构设计

当然手握复杂度这个终极评判标准,在复杂度尚可的时候,违反设计原则就无所谓了。
如果只是几个人的短期项目,或者demo阶段,这个时候去遵照设计模式就不会带来实际收益,如果还要拉长开发时间的话,那就果断“违纪”吧。

控制和变量

整体上< clean architecture >依旧是非常卓越,关于“控制”和“变量”的论述让人眼前一亮。

说来确实很神奇,从60多年前,编程这件事情开始以来,很快在30-40年间开始逐步稳定,其中的洞见几乎被发掘充分了。
通过编程落地的“知识”(人工智能,图形学等等)还在快速发展,但是编程这件事情本身,已经发展接近充分了,我们也可以发现带来洞见的编程数据在2000年前后一波爆发之后,近20年来也不多了。

那么早期的三种编程模型,就带来了对于控制和变量的三种限制:

  • 结构化编程(也就是if else这种,不要goto):限制了直接的控制转移
  • 面向对象编程(主要是多态):以安全的方式实现多态(取代了函数指针),因此限制了间接的控制转移(函数指针),最后带来了插件式构建系统的可能,让面向接口开发(而不是面向实现开发)成为可能;
  • 函数式编程(主张不做变量赋值的pure function):限制了变量的赋值,变量的赋值是万恶之源,尽量限制;

三种限制带来三种关键的对于复杂度的控制;

边界和分层

然后编程的事情,就是更多探讨边界和分层方式的问题;

patterns

solid原则

这个大家很熟悉了,但是觉得可以再精简一些:

  • Single responsibility principle:责任单一,中文更精炼一些:高内聚,低耦合
  • dependency inversion principle:面向接口(抽象)编程,而不是实现编程,这里让抽象变得分离的更清晰,降低了系统的复杂度;

composition over inheritance

同标题,也是有效的降低了复杂度;

others

然后就是design patterns里常用的设计模式了;
不一一列举了;

架构的终极负责人

就是技术lead;
事关技术的生产力和团队研发成本,搞砸了出现问题,技术lead站出来对此事负责,认定这一点,好于其他一切;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/149186.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NSSRound#1 Basic]sql_by_sql - 二次注入+布尔盲注||sqlmap

进入注册界面后   假设sql&#xff1a;update user set password ‘’ where username ‘’ and password ‘’     此时如果我们注册的用户名是admin’–、admin’#、admin’–的话   update user set password ‘123’ where username ‘admin’#’ and passwor…

[架构之路-231]:计算机硬件与体系结构 - 性能评估汇总,性能优化加速比

目录 一、计算机体系结构 二、计算机性能评估 2.1 分类方法1 2.2 分类方法2 三、常见的专项性能测试工具 3.1 浮点运算性能&#xff08;FLOPS&#xff09; 3.2 综合理论性能法 3.3 历史基准测试&#xff08;跑分软件&#xff09;&#xff1a;通过运行典型的综合性的程序…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目&#xff0c;先看项目质量&#xff08;有源码论文&#xff09; 项目链接&#xff1a;医疗预约挂号平台git地址 演示视频&#xff1a;医疗预约挂号平台 功能结构图 登录注册模块&#xff1a;该模块具体分为登录和注册两个功能&#xff0c;这些…

想要精通算法和SQL的成长之路 - 最长连续序列

想要精通算法和SQL的成长之路 - 最长连续序列 前言一. 最长连续序列1.1 并查集数据结构创建1.2 find 查找1.3 union 合并操作1.4 最终代码 前言 想要精通算法和SQL的成长之路 - 系列导航 并查集的运用 一. 最长连续序列 原题链接 这个题目&#xff0c;如何使用并查集是一个小难…

R语言教程课后习题答案(持续更新中~~)

R语言教程网址如下 https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/index.html 目录 source()函数可以运行保存在一个文本文件中的源程序 R向量下标和子集 数值型向量及其运算 日期功能 R因子类型 source()函数可以运行保存在一个文本文件中的源程序…

【C语言】动态通讯录(超详细)

通讯录是一个可以很好锻炼我们对结构体的使用&#xff0c;加深对结构体的理解&#xff0c;在为以后学习数据结构打下结实的基础 这里我们想设计一个有添加联系人&#xff0c;删除联系人&#xff0c;查找联系人&#xff0c;修改联系人&#xff0c;展示联系人&#xff0c;排序这几…

快速了解Spring Cache

SpringCache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单的加一个注解&#xff0c;就可以实现缓存功能。 SpringCache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现。例如&#xff1a; EHChche Redis Caffeine 常用注解&#xff1a; Enabl…

Vue中如何进行分布式路由配置与管理

Vue中的分布式路由配置与管理 随着现代Web应用程序的复杂性不断增加&#xff0c;分布式路由配置和管理成为了一个重要的主题。Vue.js作为一种流行的前端框架&#xff0c;提供了多种方法来管理Vue应用程序的路由。本文将深入探讨在Vue中如何进行分布式路由配置与管理&#xff0…

全志ARM926 Melis2.0系统的开发指引⑧

全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…

【BBC新闻文章分类】使用 TF 2.0和 LSTM 的文本分类

一、说明 NLP上的许多创新是如何将上下文添加到词向量中。常见的方法之一是使用递归神经网络

SSM-XML整合

SSM-XML整合 核心配置文件 maven坐标 <dependencies><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><!--数据…

解决dockerfile创建镜像时pip install报错的bug

项目场景&#xff1a; 使用docker-compose创建django容器 问题描述 > [5/5] RUN /bin/bash -c source ~/.bashrc && python3 -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple: 0.954 Looking in indexes: https://…

Next.js 入门笔记

前言 之前初步体验了 React 的魅力, 又看文档理解了一下 useState 和 useEffect, 目前初步理解的概念是: useState 用来声明在组件中使用并且需要修改的变量 useEffect 用来对 useState 声明的变量进行初始化赋值 可能理解的不太准确, 不过大概差不多是这么个意思. 但是再往后…

1.3.OpenCV技能树--第一单元--图像的基础操作(基础篇)

文章目录 1.文章内容来源2.图像的基本操作2.1.图像加载2.2.图像显示2.3.数据读取2.4.截取图像2.5.颜色通道提取2.5.1.保留红色处理2.5.2.保留绿色处理2.5.3.保留蓝色处理 3.易错点总结与反思 1.文章内容来源 1.题目来源: 2.资料来源:https://edu.csdn.net/skill/opencv/opencv…

软技能继续挑战网络安全领域

根据 ISACA 的一份新报告&#xff0c;新的网络安全调查结果指出了网络安全专家缺乏的领域&#xff0c;其中人际技能、云计算和安全措施是网络安全专家最突出的技能缺陷。 59% 的网络安全领导者表示他们的团队人手不足。50% 的受访者表示有非入门级职位的职位空缺&#xff0c;而…

八大排序源码(含优化)

文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好&#xff0c;我是纪宁&#xff0c;这篇文章是关…

GPT系列论文解读:GPT-2

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

VUE3照本宣科——认识VUE3

VUE3照本宣科——认识VUE3 前言一、命令创建项目1.中文官网2.菜鸟教程 二、VUE3项目目录结构1.public2.src&#xff08;1&#xff09;assets&#xff08;2&#xff09;components 3. .eslintrc.cjs4. .gitignore5. .prettierrc.json6.index.html7.package.json8.README.md9.vit…

进程调度算法之时间片轮转调度(RR),优先级调度以及多级反馈队列调度

1.时间片轮转调度算法(RR) round Robin 1.算法思想 公平地、轮流地为各个进程服务&#xff0c;让每个进程在一定时间间隔内都可以得到响应。 2.算法规则 按照各进程到达就绪队列的顺序&#xff0c;轮流让各个进程执行一个时间片&#xff08;如100ms&#xff09;。 若进程未…

Linux 文件上传、下载

1、通过FinalShell工具虚拟机进行数据交换 在FinalShell软件的下方窗体中&#xff0c;提供了Linux的文件系统视图&#xff0c;可以方便的&#xff1a; 浏览文件系统&#xff0c;找到合适的文件&#xff0c;右键点击下载&#xff0c;即可传输到本地电脑 浏览文件系统&#xff0…