论文《没有银弹》中提到所有软件开发都包括了本质性工作(essential task)和附属性工作(accidental task)。本质性工作是指创造出一种由抽象的软件实体所组成的复杂概念结构,可简单理解为建模。而附属性工作则是指将这个模型用编程语言实现出来。虽然本质性工作更加有价值,但是就当下而言,软件开发的附属性的工作占比非常高,甚至 90% 都有可能,不过随着工具的不断发展,这部分的占比正在逐渐减低,研发设计人员可以将更多的精力投入到本质性工作。比如使用更加易用的高级编程语言,基于高度集成化的开发环境来提升研发效率,或者在人工智能的辅助下进行创作。
尽管在工具的辅助下,软件开发的附属性工作的占比会大大降低,甚至在未来,本质性工作会成为软件研发人员的主要工作内容,但是我个人认为软件开发的的复杂度依旧难以降低。为什么呢?简单而言:软件开发中的主要难度是集中在本质性工作上,而这部分工作暂时缺少好的工具来降低复杂度。这里引用「没有银弹」的作者的一段话来进一步的解释:
软件本身在概念(conceptual)建构上存先天的困难;亦即如何从抽象性问题,发展出具体概念上的解决方案。 — 没有银 (个人备注:这也就是所谓的「解命题」的能力)
Frederick Brooks 在当时(1980年代)认为造成本质性困难的原因:附加性的困难会随着工具的改善而逐渐淡化,反而是本质性的困难最难以解决,因为大部分的活动是发生在人们的脑海里,缺乏有效的辅助工具。不过作者的想法受限于时代,在当下2023年, AI 成熟度不断提升( GPT4 刚刚发布),也许本质性工作的复杂度也可以被工具不断的降低(我可能有点太乐观了),如果真的可以做到,那么接下来会催生出什么样的人机共生的关系呢?或更具体的将:软件研发过程将变为一种什么样的形式?过往软件工程师的工作可能会被大量的取代,特别是附属性的编程工作,但是也会有新的工作类型出现,一种和机器合作的研发模式。