软件工程教科书太落后:软件工程是一个学习过程,代码只是学习的副产品


这是阿尔贝托·布兰多利尼(Alberto Brandolini)的观点,他在Event Storming中提出了这一点(他实际上是在谈论软件开发,但我不想就软件工程与开发之间的区别进行学术讨论,我在这里将它们视为平等)。
实际上,我一直将软件工程(SE)视为一个学习过程,但是直到阅读了Brandolinins Event Storming之后,我才以清晰的眼光表达了这一观点,这也使我很清楚自己就是以这种方式看到SE。
简而言之:对于任何非平凡的SE项目,主要挑战是了解领域,这主要是一个学习过程。这种观点在领域驱动的设计社区中也很突出,并且由Eric Evans本人表达:大多数软件项目的关键复杂性在于理解领域本身。
 
敏捷过程被证明如此成功和有用也就不足为奇了:它们强调集体学习。更好的是,敏捷是SE的一种非常科学的方法:我们从讨论中(在开发人员和客户之间)虚构假设,然后在实验中对其进行测试以得出新的见解和更深刻的理解。另一方面,基于计划的过程是一个相当归纳的方法,它基于许多假设,直到最后才进行测试和验证(只是问问自己:您会以这种方式获得博士学位吗?)
 
当我们最终承认SE是一个学习过程时,我们需要围绕它构建方法,过程,工具和技术,以创建一个环境,通过不断的实验和反馈可以进行快速,共享的学习:

  • 轻量级要求允许快速了解域以及为谁实施对象的方式和原因:影响图(Godzic),事件风暴(Brandolini),用户故事,用户故事映射(Patton)。
  • 轻量级的开发和工程过程,其重点是通过不断的反馈进行集体学习:带有eXtreme Programming(XP)实践的敏捷/ Scrum。
  • 强调集体学习和实验的一种合适的设计方法:域驱动设计
  • 通过应用仔细的原型设计,可以找到最适合当前问题的体系结构。
  • 一种编程语言,可以更轻松地将域映射到代码中:面向对象的,类似Java的语言,C# ……(我实际上将针对使用Haskell进行研究,但这是另一篇文章的主题)
  • 使开发人员专注于领域学习而不是处理低级管道的技术:Spring,Thymeleaf,REST,React / Angular / Vue /…,Hibernate,Web,Mobile,IDE等等。

 
不幸的是,我所阅读和研究过的所有SE教科书(我都有相当一部分……)似乎都没有以任何更深层次的方式涵盖上述所有内容,而只是以相当学术性的方式向读者抛出了通常话题的清单。这些书似乎只是简单地将SE视为方法,流程,工具和技术的集合,作为达到目的的一种手段,需要以某种方式加以应用。通过这些课程学习的学生已经获得了很多关于SE的书籍知识,但是却不知道如何将它们真正组合在一起以及如何真正地学习这些知识。
更糟糕的是,我所知道的任何SE教科书都没有传达出SE是一种学习过程的想法。
我认为,造成这种情况的主要原因之一是,所有这些书都是很久以前写的,只扩展了“较新的”主题,例如敏捷/ Web /云/无论如何,但一直坚持到最后90年代/ 2000年代初期的SE思维定势(想一想:Sommerville现在是第10版…)
因此,我的目的是编写一本关于应用型现代SE的教科书,它将涵盖上面讨论的所有问题-我认为这是非常需要的教科书。它将基于我在FHV的SE课程中的教学经验,再加上我本人和行业合作伙伴的实际经验。