软件架构设计¶
本文最初作为知乎专栏的README,当时的构思是这样的:
前几天发现知乎可以写专栏了,抱着试试看看的心思申请了一下。现在专栏开通了,我的 感想是:又多一个累赘……
所以我就构思一下我可以在这里写什么。作为方向性的构思,我先想到如下几条:
- 必须写我非常熟悉的,这样我可以少动点脑筋,随口就来。
- 因为我是做这一行的,有的是人想探我的底线。所以,这里肯定不会碰我工作有关的方 向。读者也请不要和我讨论和架构选择相关的问题。这好比打牌,我可以告诉你牌是怎 么打的,但你不要跑过来看我的底牌
- 目标读者。我考虑的目标读者是软件相关领域的从业人员和在校学生。特别是后者。笔 者读书时的理想一直是当老师,这也算是过个干瘾。另外,自己写软件写了二十多年了 ,从对软件一无所知到现在也叫有几个成功产品经验了,深感我们国家软件教育之落后 。这句话不是说要崇洋媚外。笔者职业生涯中,团队中一直不乏来自不同国家的工程师 ,我们的软件学生确实在基础训练上不如别人。笔者这样说,不是说自己就可以改变什 么,而是说明,这个Gap是存在的,既然如此,这个事情就可以做。至于做的意义——意 义这种东西,那是哲学家的问题,我不讨论。
然后就是写作思路,我的想法是先定软件构架的概念——不是学术的那种概念,而是和读者 对齐软件构架是什么这个问题。是为了理解上的对齐,而不是严谨的范围区分,这两者的 区别是什么,读者很快可以看到。然后我会先介绍开发的一些基本的技能,比如怎么做单 元测试,怎么做数据结构定义等。这些知识看来简单,实际上很多开发者都学错了,在这 种问题上有错误的理解,后面我们谈什么都没有用,之后我们才会看是谈构架设计上的各 种考量。
基本上我会想到哪里写到哪里,根据读者的讨论也会走到不同的方向,欢迎读者一起讨论 。
最后,笔者是过来讨论问题的,读者来讨论,无论表达什么观点我都非常感激,但不要指 望仅过来装逼:)。装逼是一件快乐的事,但失去了要做的事情本身,仅剩下装,这个装 起来实在很丑。所以,我们要虚心实腹地“顺便装”,不要为装而装,那是很丑的。
对于软件工程师来说,什么意见会造成Patch的生成,什么意见完全是无效代码,这个其实 是很清楚的。对于无效代码,如果是无关紧要的tag我不管,但对那些我看不顺眼,解释又 会浪费逻辑空间的,我不会跟你废话,我会直接删除,所以,Please,装逼可以,请用干 货装。也许你会说,“难道你就可以肯定你是对的吗?难道你不应该谦虚一点吗? ”,你说 得对,我在这个问题上,我就是武断的。这正是软件和自然语言的讨论不同的地方。软件 每个表述,某种程度上,都是单一结果的,每行代码改进去,我们都预期唯一的结果(唯 一的含义可以斟酌,但方向是这个方向)。软件工程师是最在乎“断”的人之一了。对的判 断,和错的判断,对软件工程师来说都是“有效的”,无用的判断,才是无效的。因为软件 的成本都来自逻辑量(代码量),if(a&b&c&(d|e|f))这个判断如果写反了,前面加一个! 就解决问题了,但如果这个判断整个写乱了,这个代码就彻底没有用了。
我说的这个“有效(对/错)/无效”的名称空间就好像老子写《道德经》前面的道可道非常 道,名可名非常名一样,是全文的根本。后面读者们应该可以看到,我的所有表述,其实 都是对这个空间定义的证明。
Contents:
- 什么是软件架构
- 大型软件架构设计
- 架构师具体设计什么
- Use Case图有什么用?
- 使用软件的四种方法
- 从单元测试理解软件
- 名可名
- 小国寡民
- 需求分析的中心思路
- 关于自然语言编程的方向问题
- 反者道之动——欣赏架构设计的基本逻辑
- 让代码变立体
- 生成优秀的架构
- 分支设计要领
- 怎样做项目管理
- 谈谈子女教育问题
- 两种基本的构架表述方法
- 弱者道之用——谈技术工作中的守弱问题
- 在Linux下做性能分析
- 架构设计的0层逻辑
- 解耦设计
- 怎么做高层设计
- 理解架构版本
- PCIE总线的保序模型
- 做与不做都是战略
- 海洋战术式的软件设计方法
- 解耦和不解耦
- 再谈“守弱”
- 互斥算法设计
- 英文版本的“弱者道之用”
- 什么是“守”
- 从用户功能开始构架系统框架
- Linux发行版的库软件包组织
- 地址空间的故事
- 工作和读书有什么不同
- 怎样快速调试Linux内核
- 架构设计中的“少了”和“多了”的问题
- 怎样做代码Review
- 怎样做客户访谈
- RancherOS架构分析
- 再谈什么是软件架构
- 大道曰守,当时曰行
- 不为天下先
- 关于AI的胡说八道
- 学习本质?
- “设计的流程”和“代码的流程”
- 概要设计不是代码
- “病病”
- 关于架构师的爱恨情仇——《黑客帝国》世界观解读
- Linux Socket 0拷贝特性
- 用户态DMA的问题
- Multiprocess Support for Linux IOMMU driver
- Linux RAS特性分析
- 写论文
- 基于“语义”编程
- 从学习assert的用法开始理解如何写“专业的程序”
- 架构的存在性
- Makefile概念入门
- ARM服务器进展小结
- 怎么做初步的需求分析
- 关于设计方案中的逻辑链问题
- 从逻辑链问题讨论怎么做高层设计
- 工程逻辑链
- 为什么你会在你的数据中心中部署ARM服务器
- 如何为libvirt设置虚拟主机
- 给普通人解释Spectre和Meltdown安全漏洞
- 给程序员解释Spectre和Meltdown漏洞
- Is retpoline really safe?
- 逻辑链,道,学和架构工作的本质
- Serverless是什么——谈如何捕获一个特性的架构本质
- 道法自然
- 自然,守弱和Plan B
- 守弱的内涵和外延
- 找到道法自然的“度”
- Specification的写法问题
- 小姐和丫鬟的故事
- 知不知
- PCIE总线的地址问题
- 气和深度学习
- 单元测试的效果问题
- Requirement Analyzing vs. Voting
- 抽离设计逻辑
- 盗夸
- 抽象还是不抽象的问题
- Tegra TX2一瞥
- Progress and confusion of the IOMMU name space
- 一样还是不一样
- 运营还是交付
- 科普一下GPL和开源软件
- 怎么确定道
- 回调还是直调
- 接口的封装层次问题
- git的基本架构欣赏
- 让设计自生
- 架构控制的从权问题
- 设计的需求问题
- 性能优化的目标问题
- 加速器和其他硬件的区别
- 君子与其练达不若朴鲁与其曲谨不若疏狂
- 有无之道——一个新的软件架构定义
- 什么是管理
- 从香农熵谈设计文档写作
- YVR18资料关注点
- 理解关联
- 如何撰写技术交底书
- 再谈什么是高层设计
- 再谈“法自然”的设计思路
- 设计规范
- 开源交付
- 道纪
- X86上的ARM Linux调试环境
- IOMMU的现状和发展
- 单元测试的强与弱问题
- 做事,做名,绩效主义,以及架构战略
- 没有规则的规则
- 大成若缺
- 非易失内存随想
- 参考平台
- 一个例子:名的边界效应
- 抽象问题的模型
- 另一个例子:名的边界效应
- Zircon架构简单分析1: Overview
- 在qemu中模拟设备
- 国产操作系统问题
- 软件飞线
- 状态机方法
- 一些典型的架构设计错误
- 从CPU和TPU的不同语言抽象看抽象原则
- 限制管理
- WarpDrive as a General Heterogeneous Platform
- Multiarch概念调查
- ARM NUC
- UML有没有用
- 推演一个Buffer分配的语法设计
- 架构师和项目经理的基本职责问题
- 锁使用设计
- 从内核终止用户态程序的IO访问
- epoll和select
- 状态机退出方法
- 不为天下先2
- 设计逻辑和代码逻辑
- 流水线深度
- 谁是主线?
- 理解指令集
- 给使用设备的进程发信号
- Linux设备异常复位逻辑分析
- 投资开源社区的基本逻辑
- 一个Linux死锁信息分析
- 如何说谎
- 代码生成器
- 弟子规:美国军方禁止在C语言程序中使用malloc
- 自下而上和自上而下的设计
- 正面竞争
- 不知为美
- 高层封装的设计战略
- 产业生态的原理和作用
- 弯道问题
- 无名概念的深入探讨
- 解释On-Chip Debug和Off-Chip Debug
- 接口和名称空间辨识
- RISCV WMO和TSO具体解决什么问题
- 利益链
- 从C的for和Python的for聊起
- 安全建模问题讨论
- Accelerator vs. Co-processor
- 一个逻辑空间控制的例子:uacce生命周期管理
- 软件构架设计的入题角度问题
- 接口分层的问题
- 对Cache Coherence的重理解
- 接口定义的工作模型
- Linux net和net-next分支的维护策略
- WarpDrive用户态方案重构建议
- 主线逻辑
- 架构设计的粗与细问题
- 狂人日记读后感——名称空间囚笼
- 写程序和写小说的区别
- 再谈《弟子规》问题
- 理解弱内存顺序模型
- 思维上的洞2
- 后软件时代和技术沙盘陷阱
- 怎么做项目管理2
- 语言的控制力问题
- 分享我的Linux内核开发环境
- 开发视图
- 概念视图
- 处理视图
- 语言控制力问题
- 新手设计文档典型错误
- 讨论:OpenCL2.0SVM有什么好?
- 设计逻辑的细致和严密问题
- 逻辑的平面和立体问题
- 自由和约束
- 给非专业人士介绍架构设计工作
- AML工作原理快速调研
- qemu PCIe总线结构
- ARM64 Linux Kernel 5.7无法GDB调试问题
- 分层抽象
- 见素抱朴:一个关于交付的例子
- 三个锦囊
- 多核MMU和ASID管理逻辑
- PMA和PA方案对比
- 真假架构设计
- 怎样写标准提案
- 安全问题的本质
- 名称内涵的发展
- 标准和设计的区别
- cond/mutex模型
- 一个例子:架构的重要性和从权
- nvdimm AD模式的内核应用模型
- 早期架构设计问题
- 所谓内部设计
- “知不知”如何影响决策的?
- “优秀架构设计”
- Linux Kernel架构赏析
- 说说对协程的看法
- 架构设计和实施的对齐和同步问题
- 一个关于4+1视图的案例:从概念视图开始
- “硬件状态机”
- 设计的减熵原理
- 架构设计入门知识
- 架构设计的大忌:我没错
- “解决方案”
- 讨论一下eBPF
- 交付中的Version和Revision
- 约束选择
- 在概念空间选择方案
- git submodule的理解
- 思维的串行化要求
- 什么是函数式编程
- 管理上的判断和技术上的判断
- 基于逻辑链建立约束
- 高级需求分析
- 假共享内存(False Sharing)
- 芯片验证软件的4+1方法
- 软件之硬
- 诚其意
- 把什么放入架构设计
- ARMv8的安全特性的主线逻辑
- 指令寻址模式
- 线程的本质
- 限制的可移动性
- 2020年又写的一个什么是架构设计的定义
- 政善治
- 概念空间建模要领
- 例子和全集定义
- 编译阶段和运行阶段算力
- 逻辑闭包和抽象概念定义
- 主语问题
- 关于概念空间,接口的一些具体讨论
- 构架和没错问题的进一步讨论
- 专家意见和编辑意见
- 架构设计和普通设计的区别