架构设计的宏观视角

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

在建筑世界中,工人和建筑师之间的分工清晰:工人负责实际的建造,而建筑师则专注于设计结构。这一原则同样适用于软件开发领域,其中程序员承担着代码编写的角色,相当于搬运“砖块”,而软件架构师则负责整体的架构设计,确保软件的基础结构稳固且合理。正如建筑师需要对建筑的基础有深入了解,软件架构师也必须对软件的底层架构有全面的认识。这不意味着架构师需要亲自去实现底层技术,而是要理解这些技术的核心原理和关键信息。这样,架构师就能够有效地指导开发过程,保证软件架构的稳定性和高效性。

应用程序的基础架构

要理解一个程序的底层架构本质上是在探索计算机如何工作以及程序是如何在这些计算机上运行的。不论是手机、汽车还是其他任何形式的智能设备,它们都可以被视为一种“计算机”。这些计算机基本上都是由中央处理单元(CPU)、存储设备以及各种输入输出设备组成的系统。CPU的角色是执行指令,处理数据;而存储设备则用于保留这些指令和数据。当计算机启动时,CPU会从存储设备的特定位置读取指令,然后按照这些指令进行操作,完成一条指令后继续执行下一条。通过这种方式,计算机开始执行各种任务,从而实现其功能。

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

编程性是计算机的一个核心特征,使得中央处理器(CPU)能够执行各种各样的任务。CPU可以处理的指令主要分为以下几种类型:

  1. 计算类指令:这类指令使CPU能够执行基本的数学运算,例如加、减、乘、除以及三角函数运算如正弦(sin)和余弦(cos)等。

  2. I/O类指令:输入/输出指令负责与存储设备及其他输入输出设备进行数据的读写操作。

  3. 指令跳转类:这类指令允许CPU在满足特定条件时改变执行的指令序列,即跳转到程序中的新位置继续执行。

尽管CPU能够识别和执行的指令集相对有限,但它根据存储在存储设备中的程序来确定执行哪些指令,这些程序是由软件工程师或程序员设计和编写的。因为程序可以以无限种方式编写,所以计算机可以执行的任务种类也几乎是无限的。这种灵活性和可编程性是计算机能够完成广泛任务和复杂运算的基础。

开放设计的外部设备支持是计算机架构的另一个关键特征,它允许计算机与多种多样的外部设备连接和交互。这些设备可以是输入设备(如键盘、鼠标)、输出设备(如显示器、打印机)、或者其他类型的设备(例如汽车的马达控制系统)。重要的是,中央处理器(CPU)并不需要了解这些外部设备的具体功能或如何内部运作;它的角色限于通过数据交换与这些设备通信。

CPU与外部设备的交互主要通过端口进行,每个端口对应一个设备编号。CPU可以通过这些端口发送或接收数据,实现与外部设备的通信。例如,CPU可能向打印机的特定端口发送数据以打印文档,或从键盘的端口接收数据来了解用户按下了哪个键。这种设计使得计算机能够支持广泛的外部设备,而无需CPU直接管理设备的具体操作,从而极大地扩展了计算机的功能和应用范围。

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

随着底层基础架构的不断强化和完善,应用程序开发变得更加专注和高效。开发者可以将更多的精力集中在应用程序的业务逻辑上,而不是底层技术的具体实现。这个过程中,开发者主要关注的是如何构建应用程序的业务架构,也就是应用架构。应用架构的设计考虑到了应用的业务需求,而这些需求根据应用所处的领域而有所不同。

尽管不同领域的业务架构可能存在巨大差异,它们之间仍然存在许多共通点。这包括遵循的架构原则和设计范式。设计范式为解决特定类型的问题提供了一种标准化的方法,有助于提高开发效率和应用的可维护性。为了促进这一点,许多设计范式已经被形式化为应用程序框架,使得开发者可以更容易地实现复杂的业务逻辑。

例如,在用户界面设计领域,MVC(模型-视图-控制器)框架提供了一种分离应用逻辑和用户界面的方法,广泛应用于多种编程语言和平台,包括但不限于Angular(JavaScript)、Zend(PHP)、Django(Python)。在游戏开发领域,游戏引擎如Phaser(JavaScript)和Unity3D(C#)提供了一套丰富的工具和库,帮助开发者高效创建游戏,包括图形渲染、物理模拟和音频管理等。

通过使用这些框架和工具,开发者可以更加专注于创造独特的用户体验和业务价值,而不需要从头开始解决每一个技术问题。这不仅加快了开发过程,也提高了软件的质量和性能。

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

架构设计的宏观视角


客户端应用程序开发面临的主要挑战之一是操作系统和设备的多样性。不同的客户端设备,如个人电脑、平板电脑、手机、手表和汽车,运行着各自的操作系统,例如Windows、macOS、Linux、Android、iOS和Windows Mobile等。这种多样性要求开发者为每种设备和操作系统单独设计和开发应用程序,显著增加了开发和维护的复杂度。

浏览器的出现极大地简化了跨平台应用程序的开发。通过提供一个统一的编程接口,浏览器使得开发者能够构建一次,到处运行的Web应用程序。这不仅改变了软件的分发方式,使得用户可以即刻使用应用程序而无需安装,还减少了开发者针对不同平台开发多个版本的需求。

从技术角度看,即取即用的概念并不仅限于Web应用。例如,苹果的iOS操作系统采取了一种方法,当应用程序长时间未使用时,会自动将其从设备中删除,而在用户下一次需要时,系统又会自动重新安装该应用。这种策略不仅节省了存储空间,而且为用户提供了一种无缝的体验,减少了对设备存储容量的担忧。

软件包的体积足够小,其行为与Web应用几乎无异,区别主要在于Web应用运行的是更高级别的JavaScript脚本,而非直接的机器码。JavaScript的高级指令使得程序体积相对较小,但由于它是文本形式的指令,其执行效率通常低于机器码。然而,这种情况正在随着WebAssembly的发展而改变。WebAssembly允许更接近机器码的编程,使得在浏览器中运行的代码可以更快,同时保持了跨平台的特性,这对前端开发带来了新的可能性。

浏览器的角色在这里变得非常独特,可以视为操作系统之上的另一层操作系统。浏览器的普及程度直接影响到开发者的选择:一旦某个浏览器成为主流,开发者便倾向于在其上开发应用,这可能会导致底层操作系统的作用被边缘化,变得仅仅作为运行浏览器的平台,这是许多操作系统制造商所担忧的。相反,如果浏览器的用户基础较小,那么它所能触及的用户群也会相对有限,这减少了开发者在此平台上开发应用的兴趣。

在PC端,经过多年的浏览器之战,目前市场主要被Chrome、Internet Explorer、Safari、Firefox等几大浏览器所占据。有趣的是,移动端浏览器的竞争似乎是从中国开始激烈起来的,特别是微信小程序的推出,实际上引发了一场新的浏览器战争。微信小程序提供了一种轻量级的应用解决方案,它不需要下载安装,即用即走,这对传统的应用分发模式构成了挑战,并且在很大程度上改变了用户的使用习惯和开发者的开发策略。微信小程序的成功不仅展示了浏览器技术的力量,也反映了移动互联网时代用户需求的变化和技术发展的新方向。

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

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


架构设计的宏观视角

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

对于那些担心成为架构师的难度的人,这里有一个鼓励的观点:成为一名架构师并不是不可达到的目标,而是一个逐步掌握和深化理解的过程。如果将编码技能比作是武功的各种招式,那么架构能力就类似于内功,是支撑招式有效运用的基础。架构能力的培养,本质上是对知识体系的不断梳理、学习和融会贯通。

具备架构思维意味着能够从更宏观的视角理解和设计软件系统,这对于任何软件开发人员来说都是一项宝贵的技能。它不仅仅是为了成为团队中的架构师,而是为了在技术决策、系统设计和问题解决中能够更加高效和有洞察力。

即使你不直接从事某个特定技术领域的工作,比如云计算或是浏览器开发,了解这些领域的基本原理和架构思想对你解决实际问题和设计解决方案时也是极有帮助的。理解云计算的本质可以帮助你更好地利用云资源,优化应用的性能和成本。同样,了解浏览器的工作原理可以让你更有效地开发Web应用,提升用户体验。

最重要的是,架构思维的培养是一个逐步的过程,通过不断学习、实践和反思,任何有志于提升自己技能的开发人员都可以逐步建立起自己的架构能力,从而在职业生涯中脱颖而出。

原文始发于微信公众号(二进制跳动):架构设计的宏观视角

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204699.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!