9

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

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

  1. 以 CLI 命令的形式编写用例(这是一个命令行应用程序)
  2. 写一些帮助
  3. 设计类、数据文件的结构和各个部分的功能工作流程。

现在,我在这整个部分真的很慢。我已经建立了一个个人 wiki 并使用它来编写这些规范,但我清楚地感觉到我缺乏经验和清晰的方法论。

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

在从事个人中型项目时,在开始编码之前您会指定什么?如何?

提前致谢

4

6 回答 6

11

有很多比我有更好经验的人可以在这里帮助您详细说明,但我有一点我认为始终值得牢记。

您不需要第一次就做到 100% 完美。事实上,如果你以此为目标,你可能永远都不会完成。现实情况是,在您构建系统一次之前,您不会完全理解设计。

刚开始,继续推进,掌握单元测试覆盖率,当你更好地理解系统及其复杂性,然后逐步重构以改进它

于 2009-01-18T00:40:30.887 回答
6

在从事个人中型项目时,在开始编码之前您会指定什么?

我指定了功能规范:

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

为了风险管理,我要补充一点,我想要开发的一些东西意味着使用一些我不熟悉的软件;为了尽量减少与此相关的风险,我还做了一些一次性原型设计。

如何?

我用笔和纸概述了一个功能规范。我写的一些是高层次的(业务级别的“愿景”文档),还有一些是低层次的,更像是设计(一些 UI 细节)。有时我停下来想知道如何组织它,但接着又继续说,推理每个页面或多或少地与每个主题相关,我可以稍后再思考如何组织页面(很像你的维基,也许)。

我事先做了也没有指定软件架构:

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

我确实对现在的架构有理论依据,但我没有记录这些原因:

  • 我是唯一的开发者
  • 实际架构由代码记录
  • 架构的原因在我的脑海中,并且可以通过诸如源代码中的命名约定以及各种组件的依赖关系之类的东西[重新]发现

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

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

至于测试,我写了一点代码,然后测试;或编写一个测试,然后编写将通过该测试的功能。我不是在做“大爆炸集成”,即几个月的写作没有任何测试。

我的流程中最大的弱点之一(或缺少的东西)是提前估算工作量,然后根据估算跟踪实施......这是这个“个人”项目流程与我的付费项目之间的区别之一d 在商业上为别人做。不过,我怀疑这是否好:如果估算是商业上的最佳实践,那么也许我“应该”在个人项目中也这样做。

于 2009-01-18T00:45:17.053 回答
4

基本上,屏幕。它们是用户和软件之间的接口。所以我尝试识别每个用例(用户将搜索我的产品 - 用户将产品添加到其球童 - 用户将检查其球童)并为每个用例创建一个屏幕链。

最良好的祝愿。

于 2009-01-18T01:00:37.537 回答
3

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

  • 画一些粗略的图表
  • 记下一些想法/笔记
  • 写一些伪代码
  • 考虑主要用例
  • 考虑潜在的问题

不要在这上面花费超过半小时,也不要陷入过多的文档或前期设计中。一旦您对自己的工作方式有一个模糊的想法,就立即开始编码。随着您继续开发,您会感觉到代码是否足够好。如果你不开心,想想你不喜欢什么,然后记住这些教训重新开始。经常和尽快地重构,越早越好。如果某件事“感觉不对”,那可能不是。

于 2009-01-18T01:08:08.600 回答
3
  1. 像你一样编写用例。
  2. 选择 1 个用例并完全实现它,其他什么都不实现。这包括单元测试、帮助和错误处理——一切。将此版本称为 1。
  3. 实施下一个用例。这可能只是添加代码,或者可能需要完全重新设计。没关系,你知道你现在在做什么。制作一个新版本。
  4. 重复步骤 3。
于 2009-01-27T01:17:21.213 回答
1
  1. 绘制屏幕
  2. 绘制数据关系(rdbms 或内存中)
  3. 开始编码
  4. 起泡、冲洗、重复(或用程序员术语 GOTO 1)

我将从最小的实现开始,并在每次迭代中添加更多功能。

于 2009-01-18T04:30:29.487 回答