10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

许式伟:架构设计的宏观视角

  • 2019-05-05
  • 本文字数:4749 字

    阅读完需:约 16 分钟

许式伟:架构设计的宏观视角

本文内容选自《许式伟的架构课》


在信息科技高度发展的今天,我们每个人随时随地都可以接触到由程序驱动的智能电子设备,包括手机(如 iPhone、oppo 拍照手机)、平板电脑(如 iPad)、手表(如 iWatch、小天才智能手表)、音箱(如天猫精灵)、汽车(如特斯拉)等等。


这些东西背后是怎么工作的?单就其中的软件系统而言,这些小小的设备上往往运行着成千上万个软件模块,这些模块是如何如此精密地一起协作的?


对此,我过去接触过很多的软件开发工程师,或者架构师,很多人对这些原理也是一知半解,虽然“知其然”,但却“不知其所以然”。甚至有些朋友可能觉得,学这些有什么用处呢,在我看来,这部分内容恰恰是我们成为架构师很重要的一门基础课

为什么需要建立宏观视角?

如同造房子有建筑工人(负责搬砖)和建筑师(负责架构设计)一样,软件系统的开发过程同样需要有程序员(负责搬“砖”)和架构师(负责架构设计)。作为架构师,我们需要的第一个能力是宏观的全局掌控能力。


如果把应用程序比作一座大厦,那么我们作为大厦的架构师,需要把大厦的结构搭建好,让程序员可以把砖填充进去,我们都知道,一个大厦的结构建得是否稳固,与地基密不可分。


所以,我们首先就需要从大厦的地基开始,熟悉这座大厦。毕竟,你对所依赖的基础架构了解得越全面,做业务架构设计就会越发从容。


介绍基础架构的知识点并不是让你真的去实现它们。但你仍然需要懂得它们的核心思想是什么,知道有哪些信息是你必须深刻理解的,以便可以更好地驾驭它们。


我们的整个专栏内容也会从基础架构开始讲起,最后逐步过渡到业务架构,到最终完成一个完整应用程序的设计过程。


那么,在今天的开篇第一篇,我们需要站在宏观视角,从基础架构开始,逐渐来解剖一个应用程序的整体构成,我希望,通过今天的文章,可以让你对于一个程序的全貌,形成完整的认识。

应用程序的基础架构

我们想学习一个程序的基础架构,其实就是弄清楚电脑的工作原理,以及程序的运行原理。


无论是什么样的智能电子设备,手机也好,汽车也罢,它们都可以称为“电脑”。所有的电脑都可以统一看作由中央处理器+存储+一系列的输入输出设备构成。


中央处理器,也就是我们平常说的 CPU,负责按指令执行命令;存储负责保存数据,包括我们要执行的命令,也是以数据形式保存在存储中的。


每次在打开电脑的电源后,中央处理器都会从存储的某个固定位置处开始读入数据(也就是指令),并且按指令执行命令,执行完一条指令就会继续执行下一条指令。电脑就这样开始工作了。


你可能会说,就这么简单?是的,就是这么简单。


那这么简单的话,为何电脑能够完成这么多复杂而多样化的工作?


这整个过程,在我看来主要依赖两点。


第一是可编程性。大体来说,中央处理器(CPU)的指令分为如下这几类。


  • 计算类,也就是支持我们大家都熟知的各类数学运算,如加减乘除、sin/cos 等等。

  • I/O 类,(从存储读写数据)从输入输出设备读数据、写数据。

  • 指令跳转类,在满足特定条件下跳转到新的当前程序执行位置。


虽然, CPU 指令是一个很有限的指令集,但是 CPU 执行的指令序列(或者叫“程序”)并不是固定的,而是依赖保存在存储中的数据—— 由软件工程师(或者叫“程序员”)编写的软件来决定。指令序列的可能性是无穷的,这也就意味着电脑能够做的事情的可能性也是无穷的。


第二是开放设计的外部设备支持。虽然我们电脑可以连接非常非常多种类的外部设备,比如键盘、打印机、屏幕、汽车马达等等,但 CPU 并不理解这些设备具体有什么样的能力,它只和这些设备交换数据。它能够做的是从某个编号的设备(通常这个设备编号被称为“端口”)读入一段数据,或者向设备的端口写入一段数据。


例如,当你在键盘上按下了 A 的时候,CPU 可以从键盘连接的端口读到一段数据,通过这段数据来表达你按了“A”,可能 CPU 会向打印机连接的端口发送一段数据,来驱动打印机打印特定的文本;还有可能 CPU 会向汽车马达所在的端口发送数据,来驱动马达转动,从而让汽车按照预期来行驶。


值得注意的是,CPU 知道的是如何和这些设备交换数据,但是并不理解数据代表什么含义。这些外部设备的厂商在提供设备硬件的同时,往往也需要提供和硬件匹配的软件,来完成和 CPU 的协作,让软件工程师可以轻松使用这些设备。


从上面可以看出,电脑的 CPU 是一个非常简洁的模型,它只读入和写出数据,对数据进行计算。这也是为什么我们往往把电脑也叫作“计算机”,这是因为 CPU 这个计算机的大脑的确只会做“计算”。


这个基础的设计体系,我们很多人都知道,这就是冯·诺依曼计算机体系。1945 年 6 月,冯·诺依曼以“关于 EDVAC 的报告草案”为题起草的长达 101 页的总结报告,定义了“冯·诺依曼体系结构”,他现在也被称为计算机之父。我想看到这里,你应该不难理解他的伟大之处了吧?


有了这个基础的计算机体系之后,我们就可以编写软件了。


当然我们遇到的第一个问题是直接用机器指令编写软件太累,而且这些机器指令像天书一样没人看得懂,没法维护。


所以,编程语言+编译器就出现了。编译器负责把我们人类容易理解的语言,转换为机器可以理解的机器指令,这样一来就大大解放了编写软件的门槛。


在编写软件不是问题时,我们遇到的第二个问题,就是多个软件在同一个电脑上怎么共处。多个软件大家往同一个存储地址写数据冲突怎么办?一起往打印机去发送打印指令怎么办?有的软件可能偷偷搞破坏怎么办?


于是,操作系统就出现了。


首先要解决的是软件治理的问题。它要建立安全保护机制,确保你的电脑免受恶意软件侵害。同时,它也要建立软件之间的协作秩序,让大家按照期望的方式进行协作。比如存储你写到这里,那么我就要写到别处;使用打印机要排队,你打完了,我才能接着去打印。


操作系统其次解决的是基础编程接口问题。这些编程接口一方面简化了软件开发,另一方面提供了多软件共存(多任务)的环境,实现了软件治理。


例如,对于屏幕设备,操作系统需要提供多任务窗口系统,以避免屏幕被多个软件画得乱七八糟;对于键盘输入设备,操作系统引入焦点窗口,以确定键盘输入的事件被正确发送到正确的软件程序。


你会发现,今天的我们开发软件的时候,已经处于一些基础的架构设计之中。像冯·诺依曼计算机体系,像操作系统和编程语言,这些都是我们开发一个应用程序所依赖的基础架构。


基础架构解决的是与业务无关的一些通用性的问题,这些问题往往无论你具体要做什么样的应用都需要面对。而且,基础架构通常以独立的软件存在,所以也称为基础软件。


例如,我们熟知的 Linux、Nginx、MySQL、PHP 等这些软件都属于基础软件,这些基础软件极大地降低了应用开发的难度。在今天软件服务化的大趋势下,很多基础软件最终以互联网服务的方式提供,这就是所谓的“云计算”。

完整的程序架构是怎样的?

讲完了程序的地基,让我们来总览一下程序的完整架构。


在越强大的基础架构支撑下,应用程序开发需要关注的问题就越收敛,我们的开发效率就越高。在我们只需要关注应用程序本身的业务问题如何构建时,我们说自己是在设计应用程序的业务架构(或者叫“应用架构”)。


业务架构虽然会因为应用的领域不同而有很大的差异,但不同业务架构之间,仍然会有许多共通的东西。它们不只遵循相同的架构原则,还可以遵循相同的设计范式。


一些设计范式被人们以应用程序框架的方式固化下来。例如,在用户交互领域有著名的 MVC 框架(如 JavaScript 语言的 Angular,PHP 语言的 Zend,Python 语言的 Django),在游戏开发领域有各种游戏引擎(如 JavaScript 语言的 Phaser,C# 语言的 Unity3D),等等。


对于一个服务端应用程序来说,其完整的架构体系大体如下:



对于客户端应用程序来说,和服务端的情况会有非常大的差别。客户端首先面临的是多样性的挑战。


单就操作系统来说,PC 就有 Windows、Mac、Linux 等数十种,手机也有 Android、iOS,Windows Mobile 等等。而设备种类而言就更多了,不只有笔记本、平板电脑,还有手机、手表、汽车,未来只会更加多样化。


第一个想消除客户端的多样性,并且跨平台提供统一编程接口的,是浏览器。


可能在很多人看来,浏览器主要改变的是软件分发的方式,让软件可以即取即用,无需安装。但从技术角度来说,底层操作系统对软件的支持同样可以做到即取即用。


这方面苹果在 iOS 上已经在尝试,大家可能已经留意到,如果你一个软件很久没有用,iPhone 就会把这个软件从本地清理出去,而在你下一次使用它时又自动安装回来。假如软件包足够小,那么这种行为和 Web 应用就毫无区别。不同之处只在于 Web 应用基于的指令不是机器码,而是更高阶的 JavaScript 脚本。


JavaScript 因为指令更高阶,所以程序的尺寸比机器码会有优势。但另一方面来说 JavaScript 是文本指令,表达效率又要比机器码低。但这一点也在发生变化,近年来 WebAssembly 技术开始蓬勃发展,JavaScript 作为浏览器的机器码的地位会被逐步改变,我们前端开发会面临更多的可能性。


浏览器的地位非常特殊,我们可以看作操作系统之上的操作系统。一旦某种浏览器流行起来,开发人员都在浏览器上做应用,那么必然会导致底层操作系统管道化,这是操作系统厂商所不愿意看到的。


而如果浏览器用户量比较少,那么通过它能够触达的用户量就太少,消除不同底层操作系统差异的价值就不存在,开发人员也就不乐意在上面开发应用。


我们知道,PC 的浏览器之战打到今天,基本上就剩下 Chrome、Internet Explorer、Safari、Firefox 等。有趣的是,移动浏览器的战场似乎是从中国开始打起的,这就是微信引发的小程序之战,它本质上是一场浏览器的战争。


浏览器是一个基础软件,它能够解决多大的问题,依赖于它的市场占有率。但是基于同样的浏览器技术核心也可以构建出跨平台的应用框架。我们看到 React Native 就是沿着这个思路走的。当然这不是唯一的一条路,还有人会基于类似 QT 这样的传统跨平台方案。


整体来说,对于一个客户端应用程序来说,其完整的架构体系大体如下



对于架构师来说,不仅仅只是想清楚业务应该怎么去做好分解,整个应用从底到最顶层的上层建筑,每一层都需要进行各种决策。先做 iOS 版本,还是先做小程序?是选择 Java 还是 Go 语言?这些都是架构的一部分。

结语

今天,我们从“计算机是如何工作”开始,一起登高鸟瞰,总览了程序完整的架构体系。


可能有人看到今天的内容心里会有些担心:“原来架构师要学这么多东西,看来我离成为架构师好远。”


好消息是:我们就是来打消这个担心的。如果我们把写代码的能力比作武功招式,那么架构能力就好比内功。内功修炼好了,武功招式的运用才能得心应手。而架构能力的提升,本质上是对你的知识脉络(全身经络)的反复梳理与融会贯通的过程。具备架构思维并不难,而且极有必要。不管今天的你是不是团队里的一位架构师,对任何一位程序员来说,具备架构思维将会成为让你脱颖而出的关键。


这就像你没有从事云计算行业,但是你仍然需要理解云计算的本质,需要驾驭云计算。你也不必去做出一个浏览器,但是你需要理解它们的思考方式,因为你在深度依赖于它们。


作者介绍:


许式伟,七牛云 CEO,ECUG 社区发起人。曾就职于金山、盛大,在搜索和分布式存储相关技术领域有十几年的研发经验。在金山,他以首席架构师的身份主导了 WPS Office 2005 的架构设计和开发。在创立金山实验室后,作为技术总监主导了分布式存储开发,后加入盛大创新院,并成功推出“盛大网盘”和“盛大云”。


这些年,他扛过国产软件研发的大旗,忍受过在 Office 和盗版夹击下的艰难求生,经历过公司转型和个人转型交织的洗礼。2011 年,他成为一名创业者,建立了七牛,专注企业级存储服务。


这个专栏是他第一次完整、系统地分享自己的架构经验和思考,老许将毫无保留地分享自己近 20 年的经验总结,让你一定能够学有所得


推荐阅读:


许式伟:毕业 2 年成为首席架构师,我的技术学习方法论


2019-05-05 19:557712

评论

发布
暂无评论
  • 架构师训练营第十周作业

    如果把软件比作一个生命,那显然软件也是会经历从无到有,从小到大,从简单到复杂这样的一个历程。在这个历程过程中,软件会受两个核心因素影响:一是业务本身的发展,二是软件本身的架构设计。业务本身是决定软件能存活多久,软件能进化到多复杂。近些年随着

    2020-12-27

  • 软件开发丨关于软件重构的灵魂四问

    在软件工程学中重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

    2020-08-28

  • 架构师训练营第 4 周学习总结

    学习了程序的设计模式(程序的架构),本周开始学习系统架构。

    2020-06-30

  • ARM 新宠:苹果的 M1 芯片因何而快?

    CPU工作原理和设计是怎样的,基于ARM指令集的M1芯片有什么特点?

    2021-08-20

  • 12|物理机上程序运行的硬件环境是怎么样的?

    物理机上程序运行的硬件环境是怎么样的呢?

    2021-09-03

  • Java Web(五)Web

    B/S架构:Browser/Server,浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Wb资源,服务器把Wb资源发送给浏览器即可

    2022-11-12

  • 架构师训练营第二周总结

    编程的近代史是从纸带机、汇编语言开始的,进而不断发展出形形色色的编程语言,这是一个从机器执行角度思考,到从编程语言使用者角度思考的变迁。现在主流的几种编程范式,和各种所谓的高级语言的出现,都是为了提高软件开发人员解决现实问题的效率,降低出错

    2020-12-06

  • c 语言简介

    C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。

    2021-02-24

  • 一篇神文让你深入理解计算机系统——学习笔记

    程序运行时系统看上去总是只有这个程序在运行,就好像这个程序独占了CPU,主存和I/O设备。但运行程序的数量总比CPU数量多,这是由上下文切换实现的 在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到新进程时

    2021-10-14

  • “攻城狮”实用指南之 Linux CPU 性能优化

    软件“攻城狮”在做应用程序开发时,往往都绕不开一个话题,那就是性能优化。无论是初入职场的小菜鸟,还是摸爬 滚打多年的程序高手,面对程序的性能优化问题,经常还是感到头疼无比。实际上,性能优化一直都是大多数软件工程师头上的“紧箍咒”。

    2021-07-14

  • 架构之: 软件架构漫谈

    每一个程序员心中都有个架构师的梦想,架构是如此的重要,以至于每个程序员都在谈架构,仿佛没有架构的软件是没有灵魂的,不想做架构师的程序员不是一个好的码农一样。

    2021-06-01

  • 重学计算机组成原理 (4)- 还记得纸带编程吗?

    以前写程序用“打孔卡(Punched Card),没法像今天,掏出键盘就能打字,而是要先在脑海/纸写出程序,然后在纸带/卡片上打洞。这样,要写的程序、要处理的数据,就变成一条条纸带或者一张张卡片,之后再交给当时的计算机去处理。

    2021-12-15

  • 用户故事 | 操作系统发烧友:看不懂?因为你没动手

    作为一名操作系统“发烧友”,我是怎样跟操作系统结缘的呢?

    2021-08-23

  • 读《程序是怎样跑起来的》体会

    在几年的工作和学习中,发现计算机知识体系尤为重要,自己还有所欠缺,想要从头到尾好好的夯实一下计算整个体系的相关知识,搭建计算机知识体系架构。因此决定细致的重读阅读这些计算机经典书籍,该书是上本书<<计算机是怎样跑起来的>>同系列计算机原理基础书

    2022-11-29

  • 开篇词|练好基本功,优秀工程师成长第一步

    能来回穿梭于底层与高层之间,不至于手忙脚乱,我最大的依仗就是深厚的计算机基础。

    2022-07-20

  • 软件架构那些事 | InfoQ 大咖说

    本期《大咖说》,我们将聊聊软件架构的前世今生,探讨当下软件架构的发展现状与挑战,与广大程序员谈谈架构师的职业发展。

  • 镜舟:打造行业顶级国产 OLAP 数据库

    数据库是主要的软件载体,在IT基础设施架构中处于核心位置,与操作系统、中间件共同构成计算机系统最基础的三大核心软件。随着数字经济时代到来,数据量爆炸式扩张,国产化替代加速,国产数据库正迎来政策红利和巨大的发展机遇,数据库产品也正经历新一轮变革

    2023-03-21

  • 18|拓展阅读:再聊聊 ARM、RISC-V 与中国的机会

    重要观点:ARM结局尚未确定,而RISC- V是作为“开源独立”精神的代表而不依赖于任何国家存在的。因此,不仅仅在中国,在欧洲、日本、印度,都有非常活跃的RISC-V团队,当然美国若干个团队也是很活跃的。

    2021-09-03

  • Android 通用流行框架大全,大厂面试题汇总

    我们都知道,所有的程序软件包括操作系统都是运行在内存中的,然而我们的操作系统一般是存放在硬盘上的,当我们按下开机键的时候,此时内存中什么程序也没有,因此需要借助某种方式,将操作系统加载到内存中,而完成这项任务的就是 BIOS 。

    2021-10-21

  • 结束语 | 生活可以一地鸡毛,但操作系统却是心中的光

    我开发Cosmos是基于兴趣,是对技术的探索和追求……

    2021-08-25

发现更多内容

为企业全方位解决进销存管理难题的ERP套件

力软低代码开发平台

基于Python+UIautomation的WindowsGUI自动化测试实战(二)-计算器

Python 自动化测试 GUI UIaotumation

重磅通知!OpenAI又放大招:官宣开放API接口-3.5版本 需求大涨,机遇与挑战并存,谁能拔得头筹?

加入高科技仿生人

人工智能 开源 openai ChatGPT

ICLR 2023 | 网易伏羲3篇论文入选,含强化学习、自然语言处理等领域

网易伏羲

小程序容器作为软件中间件技术不可忽视的价值

FinFish

小程序容器 小程序技术 软件中间件

Soul 云原生网关最佳实践

阿里巴巴中间件

阿里云 云原生 实践 云原生网关

下一站,冠军|走进2022 OceanBase数据库大赛12强

OceanBase 数据库

数据库 oceanbase

OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

阿里巴巴中间件

阿里云 开源 云原生 OpenKruise

软件测试/测试开发 | 测试平台开发-前端开发之Vue.js 框架的使用

测试人

纵存科技加入龙蜥社区,共建高性能存储软件栈

OpenAnolis小助手

开源 合作伙伴 龙蜥社区 CLA 纵存科技

更高效、更实用的跨端开发选择

FinFish

flutter finclip 小程序容器 跨端框架

瓴羊Quick BI与Power BI之争:数据大屏优势明显

对不起该用户已成仙‖

软件测试/测试开发 | 一步一步学测试平台开发-Vue restful请求

测试人

软件测试 自动化测试 测试开发 测试平台

引领云数仓创新浪潮 HashData闪耀PostgreSQL中国技术大会

酷克数据HashData

ChatGPT潜能很大,问题也是

引迈信息

人工智能 低代码开发 应用开发 ChatGPT JNPF

新思科技发布《2023年开源安全和风险分析》报告

InfoQ_434670063458

开源 新思科技 软件安全

Tuxera NTFS2023版读写NTFS磁盘功能工具

茶色酒

Tuxera NTFS2023

微服务引擎 MSE 企业版全新升级

阿里巴巴中间件

阿里云 微服务 云原生

使用 Pulumi 打造自己的多云管理平台

亚马逊云科技 (Amazon Web Services)

Amazon S3

新思科技为三星SDS公司开源使用和风险管理提供自动治理解决方案

InfoQ_434670063458

开源 软件开发 新思科技 软件安全

Apache IoTDB v1.0.1 发布|修复分区计算,优化集群启停流程

Apache IoTDB

IoTDB

数据库革新拐点已来——MatrixOne Beta Program Recap

MatrixOrigin

云原生 分布式数据库 MatrixOrigin MatrixOne

首批!阿里云容器服务 ACK 顺利通过信通院云原生混部项目评估

阿里巴巴中间件

阿里云 容器 云原生

隐私计算技术路线介绍及对比

隐语SecretFlow

隐私计算

2022 IoTDB Summit:阿里白渐《迈向物联网时代大数据计算平台——MaxCompute 基于IoTDB构建解决方案》

Apache IoTDB

大数据 时序数据库 IoTDB

使用metrics-server监控k8s的资源指标

tiandizhiguai

DevOps 微服务 云原生 k8s

基于Python+UIautomation的WindowsGUI自动化测试实战(一)-记事本

自动化测试 GUI UIaotumation

what量化合约系统开发&源码丨clear合约量化系统开发技术(Demo案例)

I8O28578624

ChatGPT辅助编程

鲸品堂

ChatGPT 企业号 3 月 PK 榜

软件测试/测试开发 | 测试平台开发-前端开发之Vue router路由设计

测试人

软件测试 测试开发 测试平台

许式伟:架构设计的宏观视角_架构_许式伟_InfoQ精选文章