许式伟的架构课
许式伟
七牛云CEO
立即订阅
19948 人已学习
课程目录
已更新 71 讲 / 共 77 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 怎样成长为优秀的软件架构师?
免费
基础平台篇 (21讲)
01 | 架构设计的宏观视角
02 | 大厦基石:无生有,有生万物
03 | 汇编:编程语言的诞生
04 | 编程语言的进化
05 | 思考题解读:如何实现可自我迭代的计算机?
06 | 操作系统进场
07 | 软件运行机制及内存管理
08 | 操作系统内核与编程接口
09 | 外存管理与文件系统
10 | 输入和输出设备:交互的演进
11 | 多任务:进程、线程与协程
12 | 进程内协同:同步、互斥与通讯
13 | 进程间的同步互斥、资源共享与通讯
14 | IP 网络:连接世界的桥梁
15 | 可编程的互联网世界
16 | 安全管理:数字世界的守护
17 | 架构:需求分析 (上)
18 | 架构:需求分析 (下) · 实战案例
19 | 基础平台篇:回顾与总结
加餐 | 我看Facebook发币(上):区块链、比特币与Libra币
加餐 | 我看Facebook发币(下):深入浅出理解 Libra 币
桌面开发篇 (16讲)
20 | 桌面开发的宏观视角
21 | 图形界面程序的框架
22 | 桌面程序的架构建议
23 | Web开发:浏览器、小程序与PWA
24 | 跨平台与 Web 开发的建议
25 | 桌面开发的未来
26 | 实战(一):怎么设计一个“画图”程序?
27 | 实战(二):怎么设计一个“画图”程序?
28 | 实战(三):怎么设计一个“画图”程序?
29 | 实战(四):怎么设计一个“画图”程序?
30 | 实战(五):怎么设计一个“画图”程序?
31 | 辅助界面元素的架构设计
课外阅读 | 从《孙子兵法》看底层的自然法则
加餐 | 想当架构师,我需要成为“全才”吗?
32 | 架构:系统的概要设计
33 | 桌面开发篇:回顾与总结
服务端开发篇 (14讲)
34 | 服务端开发的宏观视角
35 | 流量调度与负载均衡
36 | 业务状态与存储中间件
37 | 键值存储与数据库
38 | 文件系统与对象存储
39 | 存储与缓存
40 | 服务端的业务架构建议
41 | 实战(一):“画图”程序后端实战
42 | 实战(二):“画图”程序后端实战
43 | 实战(三):“画图”程序后端实战
44 | 实战(四):“画图”程序后端实战
45 | 架构:怎么做详细设计?
46 | 服务端开发篇:回顾与总结
加餐 | 如何做HTTP服务的测试?
服务治理篇 (11讲)
47 | 服务治理的宏观视角
48 | 事务与工程:什么是工程师思维?
49 | 发布、升级与版本管理
50 | 日志、监控与报警
加餐 | 怎么保障发布的效率与质量?
51 | 故障域与故障预案
52 | 故障排查与根因分析
53 | 过载保护与容量规划
54 | 业务的可支持性与持续运营
55 | 云计算、容器革命与服务端的未来
56 | 服务治理篇:回顾与总结
架构思维篇 (8讲)
57 | 心性:架构师的修炼之道
用户故事 | 站在更高的视角看架构
58 | 如何判断架构设计的优劣?
59 | 少谈点框架,多谈点业务
60 | 架构分解:边界,不断重新审视边界
加餐 | 实战:“画图程序” 的整体架构
61 | 全局性功能的架构设计
62 | 重新认识开闭原则 (OCP)
许式伟的架构课
登录|注册

05 | 思考题解读:如何实现可自我迭代的计算机?

许式伟 2019-04-30
你好,我是七牛云许式伟。
在“03 | 汇编:编程语言的诞生”中,我给出了一个架构思考题:
第一台以键盘 + 显示器为标准输入输出的现代计算机出现后,一个最小功能集,但计算能力可自我迭代的计算机应该是什么样的?
从需求上来说,我们期望它有如下能力。
键盘和显示器的驱动程序。
当时最主流的外置存储设备(不一定是现代的硬盘)的驱动程序。
一个汇编程序编辑器。可从存储中读取汇编程序代码,修改并保存到存储中。
一个汇编编译器。可将汇编程序代码编译成机器代码程序,并保存到存储中。
支持执行一段保存在外置存储设备中的机器代码程序。
那么,它的变化点和稳定点分别是什么?为此,你会怎么设计,设计出哪些子系统,每个子系统的规格是什么?扩展性上有哪些考虑?

需求分析

我们前面谈架构思维时提到:做架构,第一件事情要学会做需求分析
需求分析的重要性怎么形容都不过分。准确的需求分析是做出良好架构设计的基础。我个人认为,架构师在整个架构的过程中,至少应该花费三分之一的精力在需求分析上。
这也是为什么很多非常优秀的架构师换到一个新领域后,一上来并不能保证一定能够设计出良好的架构,而是往往需要经过几次迭代才趋于稳定,原因就在于:领域的需求理解是需要一个过程的,对客户需求的理解不可能一蹴而就。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《许式伟的架构课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(52)

  • Enthusiasm
    总结:设计系统架构的前提是用户需求分析,用户需求包括分析出稳定需求点和变化需求点。从功能上看,稳定需求点一般是实现偏核心需求的需求点,变化需求点往往是实现偏扩展性需求的需求点。从层次结构上看,稳定需求点往往在系统层次的底层,而变化需求点往往在更加抽象层(上层)。从从属关系上看,稳定点需要提供功能给变化点使用,变化点调用稳定点提供的功能。从时间顺序看,稳定需求往往先现是变化点实现的基础,变化点通过调用已经实现的稳定点提供的功能来实现更为抽象的功能。
    系统架构类似于一个栈的结构,人机交互(变化点)放在栈顶,底层工作(稳定点)置于栈底。
    这节课程让我联想到网络中的OSI 7层模型。大概其也体现了这种软件架构思想。好处就是架构清晰,职责明确,功能规范等等。
    以往我认为的架构设计类似上面的描述,描述起来类似按自顶向下顺序,采用分治思想完成。但许老师的方法又有些巧:架构好比搭积木,许老师是先有了很多积木(需求点),然后把再确定这些积木放在哪一层次的格子里。这简化了架构设计的难度,好比用市场经济代替计划经济,很有趣。
    架构设计博大精深,灵活多变,初学课程的我们,对架构设计的学习,也只能算是盲人摸象。

    作者回复: 很赞的总结

    2019-05-02
    1
    84
  • s
    已经很久没有看到这么赞的文章了,起初踏入编程的大门就是想创造,在我眼里设计一个项目仿佛完成一个完美的艺术品。工作了以后感觉这份激情渐渐的被磨平,面对客户需求,仅仅是 "他指哪,我打哪",软件的产出仅仅只是换钱的砝码。这篇文章又把我的梦想拉了回来。技术能解决的问题都不叫问题,唯独思想的升华是无价的,万分感激!

    作者回复: 这是我听到的最好的赞美,感谢。能够唤醒人们对架构之美的追求,无疑是我最大的动力。

    2019-05-08
    32
  • 山口谈退隐去了
    看完这篇文章让我想起了在一本育儿书上看到过这么一句话:“当人们使用‘需求’这个词的时候,他们所说的常常是一个能够满足需求的解决方案而不是需求本身”。而需求分析就是为了找到问题,然后告诉人们,你其实还可以这么做而不是你应该这么做。

    作者回复: 赞,很多人都有这个误区,以解决方案代替需求。要清醒认知这一点并不容易。

    2019-05-08
    24
  • 梦醒十分
    老师授课知识的角度很有深度,更贴切的说是一种思维方式,这种深度思考,从事情的本质重新推演与复盘的思考方式是很值得学习的。因为我们大部分人应该都没有想过自己去重新设计一个计算机的实现。

    作者回复: 从无到有到万物,我们这个课的脉络之一就是重新从零构建整个信息世界,这一点在开篇词中提到过,这一点非常非常关键。另一个脉络是架构思维的递进,这一章重点是需求分析。这两个脉络相辅相成,交织在一起。

    2019-04-30
    23
  • WL
    请问一下老师, 03和05两篇文章中的"可自我迭代的计算机"中的"可自我迭代"是啥意思, 是指的是计算机可以执行各种各样的外部程序吗?

    作者回复: 指功能可以越来越强大,是活的机器,而不是能力固定的机器

    2019-04-30
    13
  • Enthusiasm
    “活到老学到老”啊,突然意识到,不光是软件架构如此,连计算机系统架构也是如此。
    我们从小学计算机,每门计算机课程的第一课总是概述“计算机由硬件系统和软件系统构成”。
    今天,许老师通过抽象出“稳定点”和“变化点”的概念,从另一个角度带给我对这句话更深的理解,才让明白这句话的真正含义。
    原来,所谓的硬件系统就是“稳定点”,软件系统就是“变化点”。
    原来,一句最最平淡无奇的描述,一个最最基础的系统,也蕴含着“架构思维”。
    万事万物其实是相通的,我的梦想就是,透过这些表象的描述,看到思想的本质。

    作者回复: 硬件系统就是“稳定点”,软件系统就是“变化点”。挺好的总结。

    2019-05-02
    11
  • 裴海港
    我觉得拿一个软件系统的架构作为例子是不是更好,因为对于有些人来说,BIOS,ROM,文件系统,驱动程序这些过于抽象,难有代入感,不便于消化吸收。

    作者回复: 这个例子的确有点复杂。不过这些概念引入的时候都有相应的内容介绍,而且也是理解计算机很重要的基础,所以在例子类型上没有刻意避免。您可以说一下哪个概念比较难以理解,这样我可以多补充一下相关背景知识。

    2019-04-30
    6
  • Dimple
    拿到一个需求,需要做明确的需求分析,这是对我目前水平来说最有用的方式。文中讲的需求分析,让我受益很深。

    不过实践部分,有点吃力,还需要细细品味才行。

    作者回复: 做任何事情,首先要有正确的姿势,然后就是千锤百炼、熟能生巧了。

    2019-04-30
    6
  • 请问老师,最终架构图中的文件系统和现实中的操作系统是什么关系?文件系统是否是操作系统的一个子系统?或者说操作系统是否就是从文件系统中衍生出来的具有更多功能的文件系统?谢谢!

    作者回复: 挺好的问题。这里的文件系统子系统,它的交付物是什么?假设还没有操作系统这样的基础软件,它是否可以是包(package)?我觉得是可以的,虽然这样无法实现文件锁这样的多进程协同能力,但是我们实现的是单进程的计算机,不需要有文件锁这种东西。

    2019-04-30
    4
  • ljf10000
    内置/外置存储是这样划分?内置存储应该是ram/rom/flash这些cpu可直接寻址的设备,其它不可直接寻址的设备是外置存储。CPU启动必然是从一个非易失的内置存储上某条指令开始。

    作者回复: 对的

    2019-05-01
    3
  • ljf10000
    1。这里外置存储应该包括我们平常所说的内存和硬盘。现在允许cpu直接执行存储上的指令,除了内存,可能大家熟悉的只有flash了。

    2。如果没有cpu直接执行外置存储上指令的能力,就是有sh也没用,毕竟sh也是保存在外置存储上。

    作者回复: 1、不包括内存。外置存储(外存)是指cpu不直接支持的存储。cpu直接支持的叫内置存储,包括:寄存器、内存(RAM)、主板上的ROM。

    2、cpu并没有直接执行外置存储上指令的能力。它通过支持虚拟内存做到支持外置存储的。虚拟内存在某一个页不存在的时候发生缺页中断,缺页中断由某个函数响应,再把缺的页从外存读进来。

    2019-04-30
    3
  • Geek_88604f
    请问许老师,用户执行ls命令的时候,从系统架构图上看各模块之间是如何交互的?

    作者回复: ls会调用文件系统,文件系统会调用外置存储的驱动程序,驱动程序会调用cpu的端口io指令。

    2019-05-01
    2
  • gopherliu
    我突然想起个事,关于稳定点和变化点。各个银行的手机app大同小异,有必要每个银行都造一遍轮子?甚至就是所有的手机app都是基本的那一套。最为稳定的一点就是:账户密码。这玩意有必要每个app来一份吗?难道就不能有一个每个人单独的、唯一的数字身份?为了争夺用户,却给用户带来的更多的麻烦。还有,用户的数据为啥就不能属于用户自己的呢,被各大互联网巨头利用过来、利用过去的。对于此,许老师有何看法?

    作者回复: 账号密码,这个是个选择权的问题,确实是产品经理和架构师要考虑的点。现在蛮多软件都直接接微信或支付宝账号的。用户数据属于用户有点理想化,因为数据是在使用软件过程中产生的,更多只能通过法律途径解决,而挺难技术层面解决。

    2019-04-30
    1
    2
  • gbfa
    文章中提到做架构第一步是需求分析,那后面如何将需求逐步过渡到具体实现,能否提炼出几个比较通用的步骤?

    作者回复: 后面会涉及这块,这本身也是这个专栏的一个关键脉络。

    2019-04-30
    2
  • 郝志强
    架构图中,汇编语言放在第二层不太理解,虽说可以理解为是CPU指令的高层次包装,我感觉应该放在最上层,请老师指正?

    作者回复: 语言分内核和库(扩展)。内核是表达方式,库是领域知识或科技成果。语言内核在第二层,库在应用层。

    2019-09-25
    1
  • 老男孩
    第一遍没明白,看了第二遍似乎明白点了。中央处理器->bios->操作系统->中间件->我们编写的可执行的机器码。控制权是通过一种约定或者是抽象一层一层向外扩展,稳定性也是从里到外逐渐衰减。可以完成的功能是也从极简到复杂多样化。我们在设计的时候应该找到稳定点和变化点,或者是稳定层或者变化层,变化的依赖稳定的抽象,而是不是稳定依赖变化。极简及稳定,复杂及变化。
    2019-07-09
    1
  • Smallfly
    许老师,对于汇编编译器的需求不确定性我不是很能理解:

    1. CPU 增加指令,需要更换 CPU,也就是升级硬件,升级硬件的同时可以升级汇编编译器。对用户来说汇编编译器就像是 CPU 的说明书,不需要可编程。

    2. 汇编编译器为什么需要根据宏编译指令迭代呢?如果是,这说明宏不是抽象的设计,会导致汇编指令无限膨胀。就像计算器提供加减乘除,不管怎么组合,计算器都能完成任务,而不应该用加减乘除组合出一个计算器算不出来的东西。


    综合这两点看,似乎汇编编译器也应该是稳定的需求。

    作者回复: 1、适应cpu对汇编语言开发团队,已经是新功能了,这是变化;
    2、宏不会增加指令,只是一种代码模板,宏机制是汇编语言的一个新功能,用来提供更高阶的编程范式。

    2019-06-26
    1
  • Smallfly
    BIOS 从外置存储固定地址加载程序并执行,那是不是说,外置存储必须要在这个地址上放置引导程序。是 BIOS 要求外置存储必须遵循的协议。

    作者回复: 是的

    2019-06-26
    1
  • 乘风
    老师写的确实是经典,自身功力不够不能了解其中的脉络。看了几遍,感觉懂了一些,又感觉没懂,对这几遍做一个总结吧:
    1.需求分析是架构设计中最重要的事,只有彻底的分析清楚需求才能明白系统内部的部件和各部件之间的交互流程,清晰的展现系统工作流程。
    2.如何去分析一个需求。首先考虑系统的整体,然后对整体进行细分,细分的过程还意味着重新组合,把每一个需求点都分析到位,找出其中的稳定和变化点。
    3.稳定点和变化点。稳定点是系统的核心能力,比如上文提到的驱动程序、执行程序的能力,而变化点是基于稳定点的上层功能(大部分),考虑开放性设计,比如编译器、外置存储都可能会快速迭代,所以我能否认为驱动程序是一种标准规范,对外体现是这个标准,内部实现仍然是根据标准完成的,只是实现方式不同。
    4.计算机的启动过程。计算机通电后会到固定地址(ROM主板)执行一段BIOS程序,BIOS程序可以将执行能力交给外置存储上的程序。外置存储存储的程序使计算机拥有自我迭代的能力。
    很感谢老师的文章。



    2019-05-11
    1
  • 猿工匠
    厉害👍,动手学习计算机结构设计和系统。学习了。
    2019-05-02
    1
收起评论
52
返回
顶部