如何设计,绘制和绘制复杂的软件?可以使用哪些工作流程或工具?

时间:2010-02-13 09:35:22

标签: architecture

我已经编程了几年,现在正在大学学习计算机科学。每次我编写一些东西,我都会通过启动编辑器和即兴创作来实现。写作方法,我去的课程。当然,我事先考虑过,我拿出草图纸并写下我的想法,做一些事情要做的事情等等。这可以用来编写一些代码或简单而相对较小的软件,但是怎么样呢复杂的?

当你想制作一个复杂的软件时,你如何编写蓝图?建筑师在开始任何实际工作之前对建筑物进行蓝图,并遵循标准。我希望程序员能做到,但我从来没有听说过。有哪些方法,工具和步骤可以用来做到这一点。

我不想要意见。

我想要具体的东西:图表?地图?工具?技术?分步流程? ...

5 个答案:

答案 0 :(得分:7)

现在的标准答案很简单:绘制UML图表。

多年来,答案应该是:“绘制流程图”,“绘制Nassi-Shneiderman图”,“绘制Warnier / Orr图”,“绘制数据流图”等等

同时他们都会得到好的答案和错误的答案。现实是这个问题没有一个正确的答案,原因很简单,没有人真正知道软件究竟是什么

在人们跳到我的喉咙之前,让我解释一下我的意思。

当建筑师创建建筑物的蓝图时,最终产品是清晰的:它将是一个带有墙壁,门,窗等的物理结构。我们的建筑师会画一条线说:“这是一堵墙” ;将绘制另一条线并说:“这是从屋顶到地下室的电视天线电缆”。使用一些关于尺寸(比例),颜色和线条类型的惯例,他将能够与其他人沟通需要构建的东西以及如何将它们组合在一起。

可能会对细节产生一些误解,但没有人会怀疑他们正在看的2D模型实际上代表了一个建筑物。即使需要多个图表(例如每层一个图表),也很容易将它们联系起来。

对于软件系统,我们尚未达到这个水平!第一个问题是“你将如何建模软件”?

如果使用面向对象的方法,您将把软件描述为属于“类”的一组“对象”,这些对象彼此相关(如“类图”中所述),具有给定的行为( “状态图”)并以某种方式进行交互(如一组“协作图”中所述)。

没有单一的图表可以显示软件系统的所有方面。这就是为什么UML包含许多不同类型的图表。

如果您使用结构化方法,您将系统描述为一组处理组件,将输入转换为输出(DFD)和设置数据实体(作为ER图) )。

任何图表都有效,只要其含义对所有相关方都清楚。实际上,通过在白板上绘制两个框并在它们之间划一条线来开始设计会话是很常见的:“好的,这是连接到我们的Web服务器的浏览器......”。

问题在于每个图表的含义。

实际上,我们有一种很好的通用方式来表示系统的数据部分:实体关系图(或类图的“静态部分”)可以直接转换为实时数据库。我将此归结为关系数据库在关系代数中有充分根据的事实,同时,它们使用了任何人都可以掌握的简单概念(表,外键,连接......)。所有其他数据表示都已被删除(没有更多的数据库!)。

我们缺乏对软件动态方面的共同认可观点;一些统一的观点,既理论上合理又不难以使用。

这就是我的建议。

  1. 请记住,架构的最小目的是创建对系统的共同理解。
  2. 尽可能多地学习图表。
  3. 使用最合适的图表来说明您要关注的方面。
  4. 提供一种方法来联系不同的图表(根据我的经验,这是最容易被忽视的方面,你最终得到了一堆非常详细的模型,这些模型并不合适!!!)。
  5. 不断修改模型,以反映您在设计过程中获得的新理解。

答案 1 :(得分:4)

首先,我喜欢Mind-Maps来想象这个软件应该做什么以及相关的约束是什么(技术,性能,集成点等)。我喜欢将FreeMind(OSS)用于此目的。我认为只是谈论要求和写下要求之间存在很大差异,因为后者迫使你更准确地思考它们。特别是如果您不熟悉问题域。

当我完成这项工作时,我的头脑中通常会有很好的蓝图,并立即开始编码。如果没有,我开始用伪UML表示法在纸上绘制草图。 UML是一种建模语言,专门用于此目的。它为类,方法,交互流等定义了常见的可视化表示。随着您在编写代码时对问题的洞察力增加,您的设计会随着时间的推移而发生变化并不罕见。每次发生这种情况时,重要的是不要犹豫是否适应您的设计。

根据要建模的问题的大小,您可能会发现使用UML工具很有帮助。但通常它们非常严格且不灵活。特别是当我决定更改代码的设计时,我的UML图表会非常快速地失去同步。我真正喜欢的是Visual Studio类设计器,因为它以相反的方式工作,我可以将代码放在它上面,并生成一个可视化(简单的UML)表示。

答案 2 :(得分:3)

  

建筑师在开始任何实际工作之前为建筑物设计蓝图,并遵循标准。

那是因为有许多领域事先都有确切的知识。涉及的内容,规则,物理定律,要考虑的规则。这就是为什么有可能将整个事情涂抹到最后的钉子上。

软件与众不同。你想做什么,就可以做什么。你可以接触任何东西,没有人可以告诉你它的好坏。因为没有标准。只有主观意见。

  

每次我编写一些东西,我都是通过启动编辑器和即兴创作来实现的。写作方法,我去的课程。当然,我事先考虑过,我拿出草图纸,写下我的想法,做一些事情要做的事情等等。

通常这样做。在开始项目之前,您可以尝试一些框架,工具和体系结构。例如,做一些测试项目,以了解尝试“蓝图”未来软件所需的内容。

  

我不想要意见。

这里的每个答案都是一个意见。因为没有可以回归的标准。经验和意见。

  

我想要具体的东西:图表?地图?工具?技术?分步流程?

最有用的是:

  1. 从一开始就让用户参与到您的项目中。收集定期反馈以调整您的课程。

  2. 敏捷并遵循某种迭代过程。首先,绘制UI草图。获得反馈。然后,您实现了一些常规功能。得到反馈。调整你的课程。实现更多功能。等等。迟早会有足够的肉去v.1。

  3. 如果您绝对需要一些严格的指导原则,请使用UML (Unified Modeling Language)获取图表和图表,并采用RUP (Rational Unified Process)或其类似物。您可以关注Scrum,还有一些组织活动已经解决。

答案 3 :(得分:1)

如果您对软件的设计和开发过程感兴趣,您应该参加软件工程讲座。

其他答案已经在这方面给出了一些暗示;然而,一个不容忽视的重要方面是,在开始设计之前,您应该以software requirements specification的形式写下您的软件应该做的事情:

  

软件需求规范是对该软件的完整描述   系统的行为   发达。它包括一组用途   描述所有情况的案例   用户将与之交互   软件。用例也是已知的   作为功​​能要求。在   除了用例外,SRS也是如此   包含非功能性(或   补充)要求。   非功能性要求是   施加约束的要求   关于设计或实施(例如   作为绩效工程   要求,质量标准或   设计约束)。

这样的文档可以帮助您保持专注,明确实际使用案例,发现潜在缺陷,定义某些目标(例如关于绩效)。该规范也将成为验证最终实现的基础(您的软件是否按预期执行了操作?)并帮助您创建测试场景。

答案 4 :(得分:1)

我的“循序渐进”过程就是:

  1. 创建原型。它不需要做太多,在很多情况下拖动表单设计器上的一些控件就可以了。然后与客户/最终用户一起浏览原型。 (这是重要的部分 - 如果你只是创建原型并把它扔到墙上,它就没有任何好处。)解释当你展示原型时你认为软件是如何工作的,并听听客户说。再一次,倾听比解释更重要。在那之后,您应该对客户的需求有充分的了解。
  2. 现在我通常拿出纸和笔,然后开始绘制高级模块结构。也许也是重要的类,但不是每个最后的实现细节。在这一步之后,我知道我需要哪些模块,每个模块的责任是什么,我如何测试每个模块。
  3. 以您所知的方式完成实施(至少,我或多或少地按您所描述的方式进行)。但您首先只实现基本核心功能。否则你一定会错过关键功能,因为你太忙于添加铃声和口哨声。
  4. 冲洗并重复:您现在有一个功能有限的程序,回到您的客户,显示它,让它们玩它。看看他们如何尝试使用它:它们在哪里失败?他们在找什么,找不到?
  5. 书籍提示:Release It