软件,不简单

软件的鸿沟

并不是每个人,都可以制造一个软件,它可能是一个简单的应用,目的是让计算机为我所用。

人们在生活中,所使用的自然语言中的很多 普适 的「形容词」,一般都在人与人的沟通中,由客体根据自身特点和实际场景进行 解释 。 例如,「好看」,每个人的解释都不一样。

计算机也有语言和各种方言,人们习惯性的称之为「代码」,并一般用「代码」来指代「源代码」。计算机语言,是「程序员」发起的与计算机沟通的「单向语言」(计算机和「程序员」沟通并不这样「说话」)。而在计算机的代码中,从来没有出现过「好看」,这样的形容词。

代码,代码,到底用码代表了什么?

与硬件交互的代码,更多的是指挥硬件,如何进行逻辑运算、管理内存、读写硬盘——毫无面向普通人的「应用价值」。

与生活应用相关的代码,更多的解决人们的实际问题——社交、购物、出行等等等等。

软件和普通人,存在着巨大的鸿沟。

一般人无法理解,在软件领域里:架构,是骨架;场景,是肌肉;数据,是血液;界面,是皮肤;体验,是外衣。

这一切,都需要代码表达。

跨越鸿沟的程序员

黑客也是创造者,与画家、建筑师、作家一样。—— Paul Graham: Hackers and Painters: Big Ideas from the Computer Age

优秀的程序员,既是自然语言的翻译师,又是复杂软件系统的建筑师,还得是懂得体验的交互设计师。

拥有系统性认知的能力

「盲人摸象」的故事,是说在缺乏整体的「系统性大局观」的条件下,每个人都用自己的手,去感受大象的外形。

现如今,面对更为复杂的世界,每个人获取信息的带宽,却是有限的。有限的时间和精力,不可能认知无限的未知。碎片化与社交化所形成的认知方式,使得每个个体,更难以形成系统化的知识脉络。

系统性认知,是从已知中找到一个全面且条理性强的普适规律——知识,并能够用规律,有效地推理未知。系统性,是全面性和条理性的综合体现。

对特定场景的系统性认知,是软件在此类场景下产生应用价值的前提。其中,包含两个要素:抽象和建模。

  • 抽象——提炼概念

场景的参与者是多视角的,通过简单的几个现象或者场景,就能够迅速捕获、提炼出关键概念,这是一项典型的「认知技能」。为一个正确的概念取名,是沟通的前提——名不正则言不顺。对于新生事物,新概念的出现,需要大量的传播成本,才能使得每个受众——人,产生 与期望相符 的「正确理解」。

  • 建模——理清关系

通过场景之间、参与者之间的关联分析,能够找出多个视角各自的关注点,是建模的基础。缺乏实际经验,缺乏站在人性角度的思考,是难以建立一个让多方认可的模型。

深刻理解软件的局限性

在克服了硬件的局限性之后,还需要通过三类最基本的数据处理方式,建造出五花八门的应用软件。

  • 条处理
    • 典型以表单交互为源,逐级驱动
    • 异步调用为主,异步中断比较困难
    • 容易产生分布式事务
    • 处理时长为秒级以内
  • 流处理
    • 典型以多维、高维事件为源,内存计算为主
    • 单点故障较容易产生,多实例并行计算一致性较难保证
    • 计算前,采用数据字典进行压缩编码,有利于提高降低内存开销
    • 处理时长为毫秒级或者更短
  • 批处理
    • 典型以数据库或文件中的批量数据为源,以并行计算任务为主
    • 一般由集中的调度器,进行任务的调度
    • 处理时长为秒级以上,分钟级较为常见

软件为什么变复杂

提高单个硬件的稳定性

大部分的硬件的「工况」都是不可靠的,导致软件也缺乏了必要的「工作环境」:

  • 断电会无法工作
  • 过热会自燃烧毁
  • 遇水会短路烧毁
  • 摔打会自燃解体
  • 光纤被铲车挖断
  • 电线被老鼠咬断

因此,世上也没有谁,能够保证硬件至软件的100%可靠,不同的可靠性,所带来的成本开销,肯能是指数级增长的。

硬件的品类与品质越多,其稳定性提升的「高可用软件方案」也越多、越复杂。

——软件变复杂了。

为应用场景提供更多的基础能力

人类社会的发展,是通过知识的积累和传承。而认知这个「实验过程」,永远不会停下脚步。为了让硬件产生「应用价值」,软件则需要在不断克服「硬件稳定性不足」的条件下,虚拟化出「人、财、物、事」的社会镜像,以满足各种各样的「成熟的旧规则」和「不成熟的新想法」。

人类有记忆,所以寄希望于用硬件存储,来模拟一个「永不遗忘」的虚拟记忆。 人类有沟通,所以寄希望于用通信网络,来模拟一个「万物相连」的虚拟沟通。 人类有逻辑,所以寄希望于用逻辑规则,来模拟一个「适时而变」的虚拟规则。

——软件变复杂了。

要满足定性和定量的双重要求

软件的底层——硬件——是机械性的,不管归结于基因或是传承,各个层面的软件,都体现着这样的「非黑即白的逻辑性」。也就是说,「天生丽质」的软件,自然而然的具备了定量条件下逻辑计算的能力。

没有任何一门软件语言,具备原生的「定性关键词」。相比于「好与坏」,软件其实只懂得「合适」。也就是说,给定一个标准,软件可以告诉你,给定的对象与标准之间的差距有多少,并根据这个差距,再通过一个给定的公式,得出是否合适的结论。

社会中的沟通,很多场景下都是基于不太确定的概念以及定性的形容词,人们需要解释,或者自行解释。比如, XXXX 的解释权,归YYY所有;请 拉好 扶手。

——软件变复杂了。

要满足人的无限的心理预期

人性的弱点之一,在于「外貌协会」。

响应,布局,配色,文案,手势,一切都要符合用户的心理预期。

无需解释的表达,才能不需要说明书。

人们还希望计算机理所应当的具备:

  • 永不丢失的记忆
  • 呼之即来的速度
  • 因需即变的更新

——软件变复杂了。

无数个我们

我们在虚拟的世界里,制造了无数个我们的影子。

我们希望在虚拟的世界里,我们的记忆永远不会被忘记。

我们希望在虚拟的世界里,实现我们的奇思妙想。

我们还不希望其他人通过这些影子,拼凑出现实世界中的自己。

我们还希望计算机帮助我们加速认知...