为什么我们不能更有效地捕获软件设计?[关闭]


14

作为工程师,我们所有人都“设计”人工制品(建筑物,程序,电路,分子...)。那是一个活动(动词设计),产生某种结果(动词设计)。

我认为我们都同意,名词设计与工件本身是不同的实体。

软件业务(实际上,在任何需要增强生成的产品工件的业务中)的关键活动是了解“设计(名词)”。但是,作为一个社区,我们似乎在记录它方面完全失败了,这可以从人们重新发现有关其代码基础的事实的大量努力中得到证明。让某人向您展示他们的代码设计,然后看看您得到了什么。

我认为软件设计具有以下特点:

  • 一个明确的规范,说明该软件应该做什么以及其性能如何
  • 代码的显式版本(这部分很简单,每个人都拥有)
  • 关于代码的每个部分如何用于实现规范的说明(例如,规范片段和代码片段之间的关系)
  • 一个理由,为什么代码是事情是这样的(例如,为什么一个特定的选择,而不是另一个)

不是设计就是代码的特定视角。例如,[不特别说明] UML图不是设计。相反,它们是可以从代码派生的属性,或者可以说是希望从代码派生的属性。但是作为一般规则,您不能从UML派生代码。

为什么经过50多年的软件构建,为什么我们没有常规的方法来表达这一点?(请通过明确的示例与我自相矛盾!)

即使我们这样做,大多数社区似乎都非常关注于获取“代码”,以至于无论如何都会迷失于设计中。(恕我直言,直到设计成为工程的目的,从设计中提取出工件之后,我们才可以解决这个问题)。

您认为什么是记录设计的方式(就我所描述的而言)?明确引用论文会很好。为什么您认为特定的和一般的方法没有成功?我们该如何改变呢?

[我有自己的想法,这些使上面的项目符号观点更加充实,但是我对其他人的回答很感兴趣……而且很难实施我的方案[[也许这是真正的问题:-]]]

EDIT 2011/1/3:一个回答线程暗示“文档”(大概是文本的,尤其是非正式的)可能就足够了。我想我应该澄清一下,我不相信这一点。CASE工具从80年代开始出现,但是早期的工具大多只是捕获所绘制图形的像素。尽管这些工具在商业上取得了一定的成功,但实际上并没有太大帮助。一个关键的见解是,如果附加的“设计”工件无法正式解释,那么您将无法获得任何认真的工具帮助。我认为,同样的见解适用于任何长期有用的设计捕获形式:如果没有正式的结构,它将不会有任何实际用途。文本文档几乎无法通过此测试。


1
同意UML-充其量是一种交流工具,有助于设计描述,但本身并不是设计。但是,最糟糕的是,UML是图形源代码。
2010年

量化“它做得如何”
Steven A. Lowe 2010年

在构建系统时,我满足了许多“非功能性”要求:使用语言进行编码,使用数据库,以100mS的平均响应时间处理1E10记录,...您不能将它们排除在规范之外。(在没有非功能性要求的情况下,永远循环是任何功能性规范的必要程序)。我关于“​​设计”捕获的全部观点是要处理另一个非功能性需求:“可维护”。
艾拉·巴克斯特

您的讨论看起来很有趣,但是我仍然不确定问题到底是什么。您是否认为您可以尝试举一个具体的例子或澄清您对什么感兴趣的东西。我正在考虑类似FFT的示例,在该示例中,您可以看到问题中的4个项目要点的全貌,并希望在捕获到结果后想对结果做些什么。
n1ckp 2011年

我不知道这个问题的原因,但这是弗雷德·布鲁克斯Fred Brooks)的“设计设计”的主题。(如果您已经很熟悉,则表示歉意。)他讨论了编程和体系结构中的示例。他特别指出,获取基本原理(针对设计和拒绝的替代设计)确实有用,并且不能被当前工具很好地使用。
Paul D. Waite'2

Answers:


8

我认为有几个原因导致我们仍然不擅长此事。

  1. 长期以来,人们虽然像房子一样使用软件,但是他们正在使用建筑过程和流程。“软件架构师”是所有程序员都想要的标题。在过去的十年中,软件架构师几乎破产了。瀑布式流程的想法是,首先让架构师说出软件的工作方式和外观,然后让人们绘制如何构造软件的图,最后让代码猴子按照规范来实现这些漂亮的工作流/ UML图。现在被广泛嘲笑。因此,事实上,整个行业都在走错路40年。

  2. 我们使用的工具不断变化和完善。编程是一个逻辑难题,我们提出了更好的想法和技术来抽象该难题并使之易于理解。我们建模的方式必须以相同的速度发展,但它落后了。改进的技术可以抽象出编程难题,这也意味着我们可以增加复杂性。因此,我们做到了。编程始终处于程序员所能处理的复杂性的边缘。

  3. 描述程序的方式是一种抽象。如果我们能提出一种抽象软件的好方法,那么我们也可以将该抽象直接添加到开发工具中,从而为编程添加另一个抽象/简化。这已经发生过很多次了。这种抽象的例子是函数,类和库。

  4. 因此; 如果您拥有成功准确的软件模型,则该模型将等同于该软件。哪一种方式使整个工作毫无意义,这又反过来证明了以上第1点:对软件进行建模比以前认为的要有用得多。相反,最好从代码中提取有关软件的数据。从代码的实际外观创建UML模型比创建UML模型并尝试实现该理论模型更具启发性。


2
不同意你的最后一点。是的,它与软件相当,但是当(不是如果)您发现某事毕竟不是一个好主意时,重绘模型比重构实际软件要容易得多。我不会低估设计步骤的重要性。
Joris Meys 2010年

1
@Joris Meys:问题是,在实施之前,您将不知道什么以及什么不是好主意。(除非是琐碎的情况,但无论如何您都不会过多使用UML图)。同样,您不应该高估重构代码的难度。我建议阅读有关XP和测试驱动设计的Kent Becks书籍。
Lennart Regebro

@Lennart:技巧小费
Joris Meys 2010年

2
@Lennart:您与Job之间的区别在于您似乎同意可能需要某种表达的规范,尽管我不知道您当前可编程的抽象集是如何做到这一点的。但是想象一下,我需要一个提取主要频率的信号处理程序。注意,我没有建议如何。您可能决定使用快速傅立叶变换,并且我肯定会在实现FFT位的代码中找到足迹。但是,您决定使用明确记录的FFT的事实又在哪里呢?我相信您需要它,除非您的读者都知道。
伊拉·巴克斯特

1
@艾拉·巴克斯特(Ira Baxter):“我们选择使用FFT实现信号处理”怎么样?您知道源代码有注释。而且我也可以将其写入自述文件中。规范的明确表达是代码。诸如“我们选择通过FFT实现它”之类的文本行既不是明确的,也不是按照您的原始帖子来设计的。它是实现的文档。您似乎最终陷入了争论,但是我不明白您要反对的是什么。
Lennart Regebro

5

您可能对审查软件可追溯性文献感兴趣。没有特别的顺序:

  • CUBRANIC,D.,MURPHY,GC,SINGER,J。和BOOTH KELLOGG,S。Hipikat:用于软件开发的项目存储器。软件工程学报31,6(2005),446–65。
  • TANG,A.,BABAR,MA,GORTON,I.和HAN,J.对建筑设计原理的使用和文献的调查。参加第五届IEEE / IFIP软件体系结构工作会议(2005年)。
  • RAMESH,B.,POWERS,T.,STUBBS,C.和EDWARDS,M.实施需求可追溯性:一个案例研究。在国际需求工程学研讨会论文集(约克,1995年)中。
  • HORNER,J。和ATWOOD,ME设计原理:原理和障碍。在第4届北欧人机交互会议:变化的角色(挪威,奥斯陆,2006年)中。
  • CLELAND-HUANG,J.,SETTIMI,R.,ROMANOVA,E.,BERENBACH,B。和CLARK,S。自动跟踪的最佳实践。计算机40,6(2007年6月),27-35。
  • ASUNCION,H.,FRANÇOIS,F。和TAYLOR,RN一个端到端的工业软件可追溯性工具。在欧洲软件工程师学会和ACM SIGSOFT国际软件工程基础(ESEC / FSE)第六次联席会议上进行的研究(杜布罗夫尼克,2007年)。

请注意,这只是冰山一角,我确定我已经遗漏了一些关键文件。

另外,我自己在Arcum上所做的工作是程序员向IDE表达横切设计习惯用法的一种方式。一旦表达出来,程序员就可以转换其源代码以使用替代实现:

顺便说一句,Arcum也与您的DMS工作有关。


1
为此+1。RT并不是全部,但这是朝着实际解决问题迈出的几个积极步骤之一,而不是为此而作旧的借口。
2011年

2

在我的humbe观点中,UML对程序而言是计划,对建筑物而言。单独的计划并不是计划之外的设计,您需要为此提供材料规格(使用的代码工具),建筑物的一般视图(整个软件的一些示意图,包括GUI设计),建筑物如何在周围环境中种植(有关软件如何与他人交互/植入OS的清晰方案),软件如何适应气候和土壤(与硬件交互),……许多设计书籍都试图对其进行定义,但与此同时在科学很多事情上,每个科学家都有自己的定义。

现在,我也不同意您的意见,即您不能从UML派生代码。如果您有提及的其他信息,则可以。但是真正的代码不再是设计,​​而是工件。您也不能从计划中提取真实的石头和混凝土,但是您需要计划将真实的石头和混凝土放置在正确的形式和正确的位置。

有鉴于此,我发现下面的文章很有趣(当我在寻找图形软件时,我是在不同的背景下遇到的,但是……)。用图形方法描述设计对我来说很有意义,尽管-再说一次-这在我看来只是设计的一部分。有趣的是,这种方法为理解和重构设计(而不是重构软件)提供了一个框架,如以下论文所述:

还有很多其他方法可以描述设计(的一部分),例如结构化设计(HIPO图表)集成程序设计设计模式,...

但是,只要没有制定行业标准,就不可能采用“常规”的方式来表达这一点。即使超过50年。老实说,如果您的公司找到表达设计的好方法,您是否会与世界分享?


如果您的公司找到了执行此操作的好方法,那么程序员将告诉其他所有人很快。:-)
Lennart Regebro 2010年

我认为您想念我关于UML(和任何其他“单”符号)的观点。UML编码之前是您要如何构建软件的约束。其他所有符号也是如此(是的,我已经看过很多,有一段时间了)。给定一个约束,可以说产生满足该约束的代码(玩笑方法:生成所有可能的程序,并检查哪些与该约束匹配,然后选择其中一个)。从这个意义上讲,您可以“从UML生成代码”。但是(如果我们坚持使用类图),该代码将无法实现您想要的功能...
Ira Baxter 2010年

……其他大多数符号方案也都遭受了这一困扰,它们实际上并没有捕获程序应做的工作的规范。他们也没有提供任何理由。为什么您的UML图表的形状是?我可以在不破坏图表的情况下更改代码的哪一部分?我可以改变不破坏图表背后意图的方式吗?
艾拉·巴克斯特

@Ira:访问您的网页后,对我来说变得更加清晰。但是我必须承认,在这些问题上进行高层语义讨论超出了我的专业知识。但是,如果您将真实代码视为设计的一部分,那么实际工件在哪里?在我看来,UML或其他任何表示法都是代码结构的蓝图,而这正是我希望将其称为设计的一部分。实际上比实际的代码还多。注意这一部分。它不是设计,但仍然是它的重要贡献。再一次,以我的拙见。基本原理等可以添加到说明中。
Joris Meys 2010年

@Joris:大多数图解符号都可以看作是代码的投影(推断出的工件)(至少在完成后),也可以看作是构建代码的指南(蓝图)。有很多可能的图表(答案中列出了一些)。哪些是您拥有的代码的基础,哪些仅仅是偶然的?流程图是克,因此应符合条件。但是我非常有信心某些代码块的流程图不会被视为其设计的一部分。那么,根本是什么?什么意外
伊拉·巴克斯特

2

根据我个人的经验,我认为我们很好地掌握了软件的设计。对于我们在平台上实现的每个功能,我们都有一个需求和设计文档数据库。我想我的情况也许很独特。这是一些需要考虑的事情。

我们团队中的每个人都具有工程学学位...主要是EE或CE。工程学将设计作为课程的一部分。

我认为有很多来自CS背景的所谓软件工程师。软件设计不是大多数CS程序的组成部分。我并不是说所有CS专业的学生都不擅长设计,但我敢打赌,大多数人没有接受过正规的教育。我认为很多人都认为,如果您可以编程就可以设计软件,那是不对的。鉴于许多程序员没有工程背景,因此许多软件项目没有一支擅长捕获设计的团队也就不足为奇了。


那么,您使用什么特定的方法编写需求和设计文档呢?(我看着您的简历,并期望从国防领域见到某人,这很惊讶)。我认为按要求您是指一些自然语言文字?...如果是这样,您对此无可辩驳吗?(我将自然语言要求与正式规范区分开来)。他们完成了吗?和设计文件?它们是否完全针对当前的运输系统是最新的?我同意很多所谓的程序员和软件工程师不是,所以我们可以坚持讨论应该做什么。
艾拉·巴克斯特

1
我不确定我们的方法是否有特定名称。我们的要求是自然语言要求和高级设计文档之间的混合。我们通常进行两轮编辑。首先,我们用简单的英语记录功能需要做什么。然后,我们从用户的角度确切指定它将如何工作。该文件有两个目标。第一,我们希望提供一份可以由我们的营销团队进行审核的文档,以确保我们满足我们的业务需求。第二,我们想提供一个文件,供我们的质量检查小组用来进行测试。
Pemdas'1

1
我们的设计文件更加正式和详细。它们始终包括以下内容:某种用例分析,对折衷的任何解释或我们选择特定做事方式的原因,对其他设计的引用,显式接口定义,数据结构等。对于特定代码如何满足某些要求,我们不一定要有明确的评论。我不确定这是否重要。
Pemdas'1

1
我想说我们的文件是最新的95%。一些事情在这里和那里溜走。
Pemdas'1

2

我看到两个问题。

首先是保持代码和文档同步是很困难的。如果它们是分开的,它们将有所不同,并且文档将变得无用。程序员尝试使用工具来使它们保持同步(例如CASE-tools),但是这些工具介于程序员和他们的代码之间,造成的伤害大于好处。领域驱动设计的关键见解之一(Evans,2004年)是,好的设计确实很难,因此,要想从中获得一些收益,您必须:

  • 选择程序的最小区域,即良好的设计将带来巨大的收益,即所谓的核心领域
  • 努力工作,以一种所有团队成员一直使用的通用语言的形式来获得良好的设计
  • 尽可能使设计成为代码的一部分

设计方法的另一个大问题是我们的设计方法不够数学。渗漏的抽象无法从中得出可靠的结论,严格应用逻辑和清晰真理的世界被称为数学,程序员通常会回避。

我们拥有的一些数学工具(例如形式方法)非常笨拙。

Map-reduce是编程中数学的一个很好的例子。核心思想是:当您进行关联的二进制操作时,可以非常轻松地分配其执行。二进制运算是具有两个参数的函数,关联性表示(a + b)+ c = a +(b + c)

a1 + a2 + ... + a99 + b1 + b2 + ... + b99 + c1 + c2 + ... + c99是

(a1 + a2 + ... + a99)+(b1 + b2 + ... + b99)+(c1 + c2 + ... + c99)其中As,Bs和Cs可以简单地添加到不同的位置,收集结果并立即总结。

Map-reduce是一个非常简单的想法。可以在一张纸上描述。如果您可以假设读者对关联性的概念有牢固的掌握,那么请放到很小的纸上。现在,尝试在不使用术语“关联性”或间接引用术语的情况下向某人解释map-reduce。我赌你。

没有数学抽象的软件设计就像试图做架构而又不用费心学习几何。

也许Haskell可以逐步解决此问题。对我来说,使用范畴论中的概念来描述程序似乎很有希望。类别理论是如此抽象,以至于数学家都很少使用它,但是显然,类别超出了人们的认识,似乎足够抽象,可以描述软件的结构。我们会找出答案的。慢慢来

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.