设计您即将编写的软件时,您遵循的工作流程是什么?

时间:2009-01-18 00:29:10

标签: architecture projects-and-solutions

我开始研究一个相当复杂的软件。这是一个个人项目,但我仍然付出了很多努力。 现在,我习惯于处理其他人的解决方案/设计或者以非常可控的方式发展的项目。

这一次,我开始两次编写基础知识,我很快就发现自己陷入困境。所以我休息了一下,决定在编写单行之前写下完整的解决方案。我所做的(按顺序)是:

  1. 以CLI命令的形式编写用例(这是一个命令行应用程序)
  2. 写一些帮助
  3. 设计类,数据文件的结构和各个部分的功能工作流程。
  4. 现在,我整个部分的速度都很慢。我已经建立了一个个人维基,我用它来编写这些规范,但我很清楚我缺乏经验和明确的方法论。

    我知道软件设计是一个非常复杂的主题,并且已经写了很多关于它的书籍,但我希望你能分享你的经验/建议/方法。

    在处理个人,中型项目时,您在开始编码之前指定了什么?怎么样?

    提前致谢

6 个答案:

答案 0 :(得分:11)

有很多人比我更有经验来帮助你详细说明,但我认为总有一点值得记住。

你不需要第一次100%完美。事实上,如果你的目标是你甚至可能永远不会完成。实际情况是,在您构建系统一次之前,您将无法完全理解设计。

刚开始,继续前进,保持单元测试覆盖率的顶部,并且当您更好地理解系统及其复杂性时,逐步重构以改进它

答案 1 :(得分:6)

  

在处理个人,中型项目时,您在开始编码之前指定了什么?

我指定功能规范:

  • 我担心这可能太容易了,如果我刚刚开始编码(这是“怎么样”),忘记“为什么”和“我想编码什么”(对于“相当复杂”的软件,几个月或者可能需要几年才能发展。)
  • 我还想或多或少地理解我将要开发的“范围”:为了大致评估(到一个数量级):
    • 会有多大
    • 我能否完成
    • 是否值得开始
    • 首先可以开发哪个子集

为了风险管理,我会补充一点,我想开发的一些内容暗示使用了一些我不熟悉的软件;为了最大限度地降低与此相关的风险,我还做了一些小小的原型设计。

  

如何?

我用笔写了一篇功能规范。我写的一些内容是高级(业务级“愿景”文档),有些是较低级别的,更像是设计(一些UI细节)。有时我停下来并且对如何组织它感到困惑,但接着继续,推断每个页面对每个主题都或多或少有凝聚力,以后我可以解释如何组织页面(很像你的wiki,也许)。

我事先并没有指定软件架构

  • 我开始考虑基本架构(一些小组件)开发,然后添加代码;并且,当我添加代码时,如果任何组件变得太大而复杂,那么我将它细分为几个较小的组件......这是一个演化过程...正如它在 Systemantics 中所说的那样, A工作的复杂系统不可能从一个简单的系统中发展出来。
  • 我没有记录架构;或者更确切地说,架构的唯一文档是代码本身:例如,源代码排列到源目录,命名空间和DLL的方式。

我确实对该架构有理论上的理由,但我没有记录这些原因:

  • 我是唯一的开发者
  • 实际架构由代码
  • 记录
  • 架构的原因在我的脑海中,并且可以通过源代码中的命名约定以及各种组件的依赖性
  • 等发现。

如果(仅当)我不是唯一的开发人员,那么我认为值得记录架构及其基本原理。

我上面所说的关于软件架构的内容也适用于软件处理的数据

至于测试,我稍微编码然后测试它;或编写测试,然后编写将通过该测试的功能。我没有做“大爆炸整合”,即没有任何测试就写了几个月。

我的流程中最大的弱点之一(或者缺少的东西)是提前估算工作量,然后根据估算跟踪实施情况......这是这个'个人之间的差异之一'项目流程与付费项目,我会为其他商业人士做。我怀疑这是否合适:如果估算是商业上的最佳实践,那么也许我应该在个人项目中做到这一点。

答案 2 :(得分:4)

基本上,屏幕。它们是用户和软件之间的接口。因此,我尝试确定每个用例(用户将搜索我的产品 - 用户将向其球童添加产品 - 用户将检查其球童)并为每个用户创建一系列屏幕。

祝福。

答案 3 :(得分:3)

我发现一张白纸和一支笔是最好的起点:

  • 草绘一些粗略的图表
  • 记下一些想法/笔记
  • 写一些伪代码
  • 通过主要用例思考
  • 想到潜在的问题

不要花费超过半小时的时间,不要陷入过多的文档或前期设计中。一旦你对你想要的方式有一个模糊的想法,就开始编码。随着您的继续开发,您会感觉代码是否足够好。如果你不开心,想想你不喜欢什么,并重新考虑这些课程。经常很快地重构,越早越好。如果某事不“感觉正确”,那可能不是。

答案 4 :(得分:3)

  1. 像你一样写下用例。
  2. 选择1个用例并完全实现,不执行任何其他操作。这包括单元测试,帮助和错误处理 - 一切。请拨打此版本1。
  3. 实施下一个用例。这可能只是添加代码,或者可能需要完全重新设计。没关系,你知道你现在在做什么。发布新版本。
  4. 重复步骤3.

答案 5 :(得分:1)

  1. 绘制屏幕
  2. 绘制数据关系(rdbms或in-memory)
  3. 开始编码
  4. 泡沫,冲洗,重复(或在程序员 - 语言GOTO 1中)
  5. 我将从最小的实现开始,并在每次迭代中添加更多功能。