软件是什么?
这是一个经典的计算机科学观点,最早由著名计算机科学家Niklaus Wirth(Pascal语言设计者)在其著作《Algorithms + Data Structures = Programs》(1976年)中提出。它的核心思想是:
1. 分解视角
软件的本质可拆解为两个核心组成部分:
数据结构:如何组织和存储数据(如数组、链表、树、图等)
算法:如何处理这些数据(如排序、搜索、动态规划等)
2. 辩证关系
数据结构是算法的"操作对象",算法的效率往往依赖于数据结构的选择(例如用哈希表加速查找)
算法是数据结构的"灵魂",没有算法操作的数据结构只是静态存储
3. 现代扩展
随着软件复杂度提升,这一公式可扩展为:
软件 = (数据结构 + 算法) × 设计模式 × 架构 × 工程化
但数据结构与算法始终是底层基础,就像建筑中的砖块与施工方法。
代码中的硬件的输入输出、软件变量、信息序列化的传递、中间件、数据库的信息存储,都是数据结构,而所有代码的逻辑执行,都是对这些数据结构进行的增删查改操作。
而随着软件概念的越来越大,一个软件由最初的单人或几人分工即可完成,到达了现在可能千人、万人甚至更多人的合作完成,那么软件概念已经不再局限在代码的基础上,软件是一个工程化的过程。
它包括了软件需求分析、设计方案、代码书写、功能性能测试、部署运维等一个工程化的过程。
工程化是一个自顶向下的分层设计,并且为了确保这些设计在横向和纵向传递中不失真,那么需要规范、文档以及流程来保障这个过程。这些内容不只是技术层面的,还有管理层面。
工程化完毕后,对于局部软件而言,可能还是一个庞大的内容,那么需要模块化,以便协同开发、快速定位问题、提升代码的复用性等等。同时使用好的设计模式,以降低代码的耦合度。
逻辑即算法,变量即数据机构,不要把这两个概念放到太大的范围去理解。