软件工程是一个学习过程,工作代码是一个副作用

2021-01-19 07:04:40

我得出的结论是,软件工程主要是一种学习上的努力,而工作代码则是一种副作用。

这句话实际上不是我的,但我要解释阿尔贝托·布兰多利尼(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的书籍知识,但是却不知道如何将它们真正地组合在一起以及该知识与真实世界的SE之间的真正联系。更糟糕的是,我所知道的任何SE教科书都没有传达出SE是一种学习过程的想法。我认为,造成这种情况的主要原因之一是,所有这些书都是很久以前写的,只扩展了“较新的”主题,例如敏捷/ Web /云/无论如何,但一直坚持到最后90年代/ 2000年代初期的SE思维定势(想一想:Sommerville现在是第10版…),

因此,我的目的是编写一本关于应用型现代SE的教科书,它将涵盖上面讨论的所有问题-我认为这是非常需要的教科书。它将基于我在FHV的SE课程中的教学经验,再加上我本人和行业合作伙伴的实际经验。目前,这只是我脑海中的一个愿景,但我想尽快进入。不幸的是,在2022年春季之前,我将一直从事繁重的教学工作,但这将使我有足够的时间来获得更多的SE教学经验,并反映出我对本书的态度,这将在以后的文章中分享。