极客时间-左耳听风-软件开发与架构设计的原则

2024-01-23 22:28

本文主要是介绍极客时间-左耳听风-软件开发与架构设计的原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

软件开发与架构设计的原则

PS:内容为左耳听风的读书笔记,该节内容多为作者职业生涯的总结,平时需要反复提醒自己,细看内容其实有很多需要慢慢体会。

软件开发

不重复性

只要相似的代码出现不止一处,就必须将其共性抽象出来,形成唯一的方法

KISS原则

大道至简原则,例如宜家简约且高效的设计和生产方式

面向接口而非实现原则

  1. 注重接口而非实现,依赖接口而非实现
  2. 组合优于继承

命令查询分离原则

当一个方法通过返回一个值来响应一个请求的时候,就具有查询的性质
当一个方法要改变对象状态的时候,就具有命令的性质
在设计时应该尽量使接口单一化,保证方法的行为严格限于命令或者查询

按需设计的原则

只设计必需的功能,避免过度设计;只实现目前需要的功能,以后需要的功能以后再添加

迪米特法则

最少知识原则,概括为不要和陌生人讲话

正式表述为:对象O中的一个方法M,应该只能访问以下对象中的方法:

  • 对象O
  • 与O直接相关的组件对象
  • 由方法M创建或实例化的对象
  • 作为方法M的参数的对象

SOLID原则

  1. 单一职责原则:一个类应该只承担一个职责,并且应该把这个职责尽可能地履行好,是高内聚低耦合原则的引申
  2. 开闭原则:模块应该可扩展但不可修改,模块对扩展开放,而对修改封闭
  3. 里氏代换原则:子类型必须能够替换父类型
  4. 接口隔离原则:在接口中而不是在类中实现功能,而且使用多个专门的接口比单一的总接口更好
  5. 依赖倒置原则:高层模块不应该依赖于低层模块的实现,而应该依赖于高层的抽象

共同封闭原则

一个包中所有的类应该对同一种类型的变化关闭。简单而言,一起修改的类应该组合在同一个包中

共同重用原则

不应该将未被重用的类和重用的类组合在一起

好莱坞原则

控制反转或依赖注入DI

高内聚低耦合

约定优于配置原则

约定优于配置原则倡导一些公认的配置方式和信息作为内部的默认规则来使用

关注点分离

在软件开发中通过各种手段将问题的各个关注点分开。一个问题被分解为独立且较小的问题时往往更容易得到解决。

契约式设计原则

对于类的一个方法,其契约中都存在一个前提条件以及后续条件

前提条件用于说明方法接受什么样的参数数据
后续条件说明这个方法完成时的状态
即:期望的是什么,要保证的什么,要保持的是什么?

无环依赖原则

解决了包之间的关系耦合问题

架构设计

关注收益而不是技术

  • 降低技术门槛,加快整个团队的开发效率
  • 让整个系统运行得稳定 → 需要对有计划和无计划的宕机提出相应的解决方案
  • 通过简化和自动化来降低成本

如果系统架构不能在以上三点发挥作用,就没有意义了

以服务和API为视角

公司存在运维和开发两个角色,需要有统一的视角和目标即从服务和API的角度看问题(作为后端开发需要学习并掌握K8s)

选择主流和成熟的技术

大部分情况下选择Java没错

完备性比性能重要

  • 优先使用科学,严谨的技术模型,只以不严谨的模型作为补充,例如用ACID的关系数据库,然后用NoSQL做补充
  • 不必过分担心性能问题

制定并遵循标准规范

  • 服务间调用的协议标准和规范:Restful API路径,状态码等等
  • 一些命名的标准和规范
  • 日志和监控的规范:日志格式,监控数据,采样要求,日志报警等等
  • 配置的规范:操作系统配置,中间件配置,软件包配置等
  • 中间件使用规范
  • 软件和开发库版本最好在整个组织架构内每年升级,然后在团队内保持统一

重点强调:

  1. Restful API的规范非常重要
  2. Zipkin链路追踪,监控系统宁愿瘫痪也不干扰业务应用
  3. 每年至少要有一次软件版本升级的评审

重视可扩展性和可维护性

  1. 通过服务编排来降低服务之间的耦合
  2. 通过服务发现或服务网关来降低服务依赖带来的运维复杂度
  3. 遵循软件设计原则和最佳实践 → SOLID,SOA或Spring Cloud等架构的实践

对控制逻辑全面收口

控制逻辑:是用来决定程序是多线程还是分布式,使用数据库还是文件,以及如何实现配置,部署,运维,监控,事务控制,服务发现,弹性收缩,灰度发布,高并发等。

不要迁就技术债务

  1. 使用老旧技术
  2. 不合理的设计
  3. 缺少配套设施

不要依赖经验

  1. 用足够多的时间查找相关资料
  2. 收集,对比各家公司或开源世界的做法
  3. 比较各种方案的优点后形成自己的决策

提防与应对X-Y问题

实际上遇到的问题是X,却误认为需要解决Y,追问原始需求可以帮助我们找到真正的问题。

对新技术激进胜于保守

这篇关于极客时间-左耳听风-软件开发与架构设计的原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637717

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现n*k时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。请你返回 nums中好子序列的最长长度。 实例1: 输入:nums = [1,2,1,1,3],