
提纲:
引文
一 系统软件的初级阶段
二 (系统)软件的量化阶段
三 并发类系统软件的目标原则
四 并发类系统软件的核心问题和本质
五 “正确性与性能”即一致性与并发,可重塑系统软件架构
六 结语我在思考一个问题:
设计一个系统软件,其架构设计,应该遵循什么样的原则?
通常,我们会认为,架构设计原则大致如下:
1. 模块化:将系统划分为独立的功能模块,每个模块负责特定的任务,降低耦合度,提高代码复用率。
2. 分层结构:采用分层架构,将逻辑分离为表示层、业务逻辑层和数据访问层,使各层职责清晰,易于理解和维护。
3. 松散耦合:确保各个组件之间尽可能少地直接依赖,利用抽象接口或事件驱动的方式进行交互。
4. 高内聚:每个模块或组件应当专注于单一职责,内部元素紧密协作,减少不必要的复杂性。
5. 无状态设计:在可能的情况下,尽量设计成无状态的服务,这样可以更容易地实现水平扩展,并减少会话管理带来的负担。
6. 幂等性:对于重复的操作,确保结果一致,即使操作被多次执行也不会产生副作用。
7. 最小惊讶原则:设计应直观且符合直觉,避免出乎意料的行为,让开发者和用户都能快速理解并正确使用。
8. 持续改进:架构不是一成不变的,应该预留一定的灵活性以应对未来的需求变化和技术进步。
9. 性能优先:在不影响可靠性和安全性的前提下,始终关注性能优化,从算法选择到硬件资源利用都要精益求精。
10. 开放闭合原则:对扩展开放,对修改封闭,即系统能够方便地添加新功能,而不需要改动已有代码。
如果答案是如上类似的样子,很显然,其中一些原则是在规避系统的复杂性试图以简代繁,因此总是有“小心翼翼地摸着石头过河”的模样。
因此,我在想:为什么需要“持续改进?”——如果一个事情的来龙去脉内在机理外在功能我们都已经全部掌握(形神兼备内外兼通),那么我们是否就可以设计出一个 “能长期稳定运行”的软件系统?事实上,软件技术已经发展了70+年了,人类尚没有能掌握软件技术的全部内容(或甚至是只知皮毛?),没有总结出软件技术的要点,所以也只能迭代式地构建软件系统(当然也因需应对不断变化的新需求而不断迭代的应用类软件则需要小步快跑)。迭代虽然是应对未知世界的法宝,但也在彰显我们“已知”部分的渺小。
如果不是所有的软件都能有稳定的需求,我们退而求其次:对于较为成熟稳定的系统软件,如操作系统、数据库、分布式文件系统、中间件等,这些系统是否能被重构,是否有希望能做好顶层设计,使得我们能一次性地构建起一个“能长期稳定运行”的系统软件?
人类在研发软件技术方面,成绩巨大,这70+年来,我们从早期阶段(20世纪50年代-60年代)的机器语言与汇编语言起步,到结构化编程与操作系统兴起(20世纪60年代末-70年代),再到面向对象编程及互联网崛起(20世纪80年代-90年代)、组件化、分布式计算与Web应用(20世纪90年代末-21世纪初)、以及移动计算与大数据时代(21世纪初至今),经历了这些阶段,人类实现了:编程语言多样化:从最初的机器码(面向机器的原始阶段)到如今种类繁多的高级语言,每种语言都有其特定用途和技术优势;软件工程方法论成熟:结构化、面向对象、敏捷开发等多种方法论不断演进(面向程序员的初级阶段),提升了软件项目的成功率;中间件与服务导向架构(SOA):这些技术增强了系统的灵活性和互操作性,便于构建复杂的分布式系统(面向用户的应用发展阶段);安全性和隐私保护增强:面对日益增长的安全威胁,加密技术和隐私政策不断完善,保障了用户数据的安全;开源运动蓬勃发展:Linux、Apache、Mozilla Firefox、PostgreSQL等项目证明了社区合作的力量,促进了技术创新和技术共享。
软件技术的发展不仅改变了信息技术本身,也深刻影响了社会各个层面的生活方式和工作模式。未来,随着量子计算、边缘计算等新兴领域的探索,软件技术将继续保持快速发展的态势。
但是,软件技术蓬勃发展的同时,也显然表明,软件技术的发展,尚处于一个初级阶段。
在这样的系统软件的初级阶段,我们是不是可清醒地认知到,我们对系统类软件的顶层设计方法,还知之甚少?如果答案显而易见确实是知之甚少,那么我们是不是还可以问自己一些基本的问题:
如果我们能探知如上问题,则有望开辟系统软件的新面貌,系统软件的设计原则和架构,也许会有翻天覆地的变化。如果走到那一天,则人类跨过了系统软件的初级阶段,会进入一个新的阶段?
那样的一个新的阶段,会是什么样子呢?是什么因素能推动(系统)软件进入一个新阶段呢?
认知事务的过程是一个复杂且多层次的活动,涉及感知、理解、分析和综合等多个步骤。虽然不同的理论和学科可能对这一过程有不同的描述,但可以概括为几个关键阶段。例如,认知过程主要包括:
再往后,还可以包括深度理解(Deep Comprehension)、完全认知(Complete Cognition)、规律化总结(Pattern Recognition and Generalization)、应用与实践(Application and Practice)、反思与修正(Reflection and Adjustment)等,我们不再一一指出。
重要的是,我们对系统软件的研发,还没有进入到量化阶段。由此,人类已经积累的软件知识和经验,依然在初级阶段。
那么,对系统软件的研发怎么才能步入到量化阶段?
这显然是一个开放的问题,也是一个需要我们摸索的问题。
现在,我们再来问自己几个问题:
我们处于一个幸运的时代,我们遇上了软件技术蓬勃发展的阶段,更遇上了各种软件百花齐放的时代,这使得我们的思路得以打开,有机会能跨越(并发类)系统软件而研究其共同本质。我认为,基于他们共同的本质而建立量化体系,是一条可以建立完备的量化系统的好方法。
而想要建立量化体系,首先需要明确目标。
前述,我们谈到软件系统架构设计原则,那些原则是经验积累而成的,并没有科学的方法论始终贯穿在软件系统架构设计的过程中,因此所积累出的设计原则角度丰富多彩、似乎很有道理而侧重体感,但缺乏系统化、形式化的体系或方法贯穿其中。
因此,我们进一步下沉问题到并发类的系统软件,避免问题太高而过于抽象、以致不能落地。
我们聚焦于讨论:并发类系统软件的目标原则。
首先,我们看什么是并发类软件系统的目标。
有人认为:并发类软件系统的设计目标是为了确保系统能够在多任务环境中高效、可靠地运行,同时满足性能、响应性和资源利用等方面的要求。他们认为并发类软件系统设计时需要考虑的主要目标,可能会包括:
1. 高效性(Efficiency)
2. 响应性(Responsiveness)
3. 可扩展性(Scalability)
4. 可靠性(Reliability)
5. 安全性(Security)
6. 易维护性(Maintainability)
7. 兼容性(Compatibility)
8. 灵活性(Flexibility)
9. 公平性(Fairness)
10. 透明性(Transparency)
是的,这些目标都有用,我们不去质疑。但是,这些目标的来源是来自哪里?为什么是这些而不是还有其他更多的内容?这些目标似乎还是基于经验而没有一套方法论对其进行理论支持。在没有方法论的背景下,也许是没有从并发类系统软件的角度跨系统地统一思考:该类软件需要解决的核心问题是什么?该类软件的核心本质是什么?下篇为您分析
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。