第一章 软件究竟是什么:从代码幻象到本体复合体
关于软件是什么,当代世界存在一个根深蒂固却几乎从未被认真追问的默认答案:软件就是代码。这个答案如此深入人心,以至于整个软件教育体系、软件开发流程、软件产业评价和软件人才标准,几乎全部建立在这一前提之上。学软件就是学编程,做软件就是写代码,评价软件就是看功能,培养软件人才就是教语法和框架。然而,正是这个看似不言自明的答案,构成了理解软件最深层的障碍。
代码之所以不是软件的本体,最根本的原因在于:代码只是软件的显影层,不是软件的存在层。正如一张X光片不是骨骼本身,一幅地图不是领土本身,代码只是把软件的内在结构、运行逻辑和世界关系以特定符号形式显影出来的表达介质。同一个软件系统,可以用Java写,也可以用Python写,还可以用Go写,语言不同、代码完全不同,但软件本身可以是同一个。这就说明代码不是软件的本体,而只是本体的某一种符号投影。
那么软件的本体到底是什么?本书的核心判断是:软件是数字SDE。S代表Structure,即数字结构——对象如何组织、模块如何划分、数据如何存储、页面如何进入、角色如何分权、状态如何转换。D代表Difference,即数字差异序列——任务如何推进、条件如何分支、用户如何输入、反馈如何修正、路径如何生成。E代表Entanglement,即数字特征纠缠——用户行为、业务规则、数据结构、算法模型、权限逻辑、外部平台、商业目标和现实限制之间的深层牵连网络。三者不可分割,共同构成一个软件存在物。
更重要的是,这个定义同时统一了计算机科学三门核心基础课:数据结构就是软件的S,算法就是软件的D,数据库就是软件的E[3]。这三门课过去被当作三个独立的技术领域来教授,从未被放在统一的本体框架中理解。SDE第一次把它们的关系讲清楚了:它们不是三个并列的技术专题,而是软件存在物的三个不可分割的维度。
进一步说,代码观、功能观和工具观这三种传统软件观,之所以能长期共存,是因为它们各自抓住了软件的一个侧面,但都没有触及软件的存在本体。代码观把软件等同于源代码文本,认为写代码就是做软件。功能观把软件等同于功能清单,认为功能完整就是软件完成。工具观把软件等同于人的延伸工具,认为软件好用就是软件成功。这三种观念在各自的语境中都有合理性,但它们共同的问题是:都把软件的某种外部表现当成了软件本身。
代码观的要害在于混淆了显影层与本体层。一个音乐作品可以用五线谱记录,也可以用简谱记录,还可以用数字音频格式存储,但音乐本身不是任何一种记谱法。同理,软件可以用Java写,也可以用Python写,还可以用Rust重写,语言不同代码完全不同,但软件本身可以是同一个。这就证明代码不是软件的本体。功能观的要害在于混淆了使用效果与存在方式。两个功能清单完全相同的软件,其内部结构、运行效率、扩展能力和长期稳定性可以天差地别。功能相同不代表软件相同,这说明功能不是软件的本体。工具观的要害在于把软件降格为人的附属品。但今天的软件系统已经远远超越了"工具"的范畴——一个大型平台系统不是某个人的工具,而是一个自运行的数字世界,它有自己的对象、规则、历史和生态。
那么什么才是软件的本体?答案必须满足两个条件:第一,它在代码被完全重写后仍然保持不变;第二,它能解释为什么有些软件能成立而有些不能。数字SDE恰好满足这两个条件。代码重写后,如果S(结构)、D(流程)、E(世界)保持不变,软件就是同一个;如果S、D、E中任何一维被破坏,软件就崩塌了。一个软件不能运行,要么是S不成立(结构混乱),要么是D不成立(流程跑不通),要么是E不成立(与现实世界脱节)。软件的一切成败都可以在SDE三维中找到解释。
传统软件教育的一个巨大幻觉,在于它以为"知识很多"就等于"体系成熟"。于是课程表越来越长,技术栈越来越厚,学生背了越来越多的语法,工程师记住了越来越多的框架,可是在这一切繁荣的背后,软件学本身却长期处在一种失语状态之中。人们很少问:为什么软件一定会分成数据结构、算法、数据库这三个核心层面?为什么页面、模块、状态、对象、路由会自然构成一个结构世界?为什么算法永远绕不开目标、流程、反馈、修正?为什么数据库总会从"存东西"演化到"形成平台世界"?为什么一个APP做大之后,会突然呈现出某种"生命感",仿佛它不再只是被人使用,而是在反过来塑造人?这些问题一旦被提出,传统软件观就会迅速显露出它的贫弱。所以,今天真正迫切的,不是再多开几门框架课程,不是再发明几个工程术语,也不是再堆几套代码规范,而是必须重写软件学本身。
人类文明正在进入一个前所未有的阶段:不是机器退出历史舞台,而是机器的中心地位开始被软件吞并。今天这个世界表面上看仍然有工厂、有道路、有房屋、有商品、有学校、有医院,但这些"看得见的世界"越来越深地被一层看不见的软件结构统摄着。人的支付行为背后是软件,人的学习路径背后是软件,人的健康记录背后是软件,人的社交关系背后是软件,公司的生产调度背后是软件,国家的治理接口背后也是软件。软件已经不只是一个行业,不只是一个专业,而是在事实上成为现代文明的神经系统、组织系统、调度系统和解释系统。然而,最令人震惊的事情恰恰在这里:在这样一个软件无所不在的历史节点,人类却依然没有一门真正成熟的"软件学"。有软件工程,有计算机科学,有程序设计,有数据库原理,有算法分析,但这些全都不是软件学本身。它们要么讲局部技能,要么讲局部流程,却很少有人真正停下来严肃地追问:软件究竟是什么?只要这个问题没有被回答,所有关于软件教育、AI编程、数字治理的讨论,就都缺少一个真正稳定的房角石。
正是在这样的背景下,SDE软件学才显现出它的必要性与历史性。SDE所提供的,不是又一套"解释软件的外加标签",而是一套能够直接切入软件本体的三维结构。S是结构,D是差异序列,E是特征纠缠。软件之所以成为软件,不可能没有结构:页面要有层级,对象要有关系,状态要有组织,模块要有边界,路由要有连接,前后端要有接口,这一切都属于结构问题,因此都属于S。软件之所以会"活起来",不可能没有差异序列:输入、判断、执行、评估、反馈、修正、迭代,这一切都不是静态形状,而是流程推进,因此都属于D。软件之所以会形成平台、形成画像、形成历史、形成趋势、形成世界,不可能没有特征纠缠:用户特征在纠缠,内容特征在纠缠,规则特征在纠缠,行为特征在纠缠,数据库之所以重要,正是因为它沉积了这种纠缠,因此这一切都属于E。于是,一个极其简洁却极其强力的软件本体公式就出现了:软件=S+D+E。这一公式一旦成立,传统软件科学三门基础课就第一次真正获得统一解释。