你如何开始设计一个大型系统?

时间:2008-08-19 04:26:33

标签: java oop architecture

我已经提到我将成为一个大型新系统背后的唯一开发人员。除此之外,我将设计一个UI和数据库模式。

我相信我会得到一些指导,但我希望能够脱掉他们的袜子。在准备的同时我能做些什么,以及当我坐在计算机上时,我需要记住什么?

要记住的一些事情:我是第一个真正的编程工作的大学生。我将使用Java。我们已经设置了SCM,并进行了自动化测试......所以工具不是问题。

10 个答案:

答案 0 :(得分:10)

你对OOP了解多少?如果是这样,请查看Spring和Hibernate以保持您的实现干净并orthogonal。如果你这样做,你会发现TDD是保持设计紧凑和精益的好方法,特别是因为你已经“自动化测试”了。

更新: 看看第一批答案,我不能不同意。特别是在Java领域,您应该找到大量的导师/资源来使用对象来处理您的应用程序,不是以数据库为中心的方法。数据库设计通常是微软人员的第一步(我每天都会这样做,但我在恢复计划中,呃,Alt.Net)。如果您将重点放在需要交付给客户的位置并让ORM弄清楚如何保留您的对象,那么您的设计应该更好。

答案 1 :(得分:5)

这听起来非常像我的第一份工作。直接离开大学,我被要求设计数据库和业务逻辑层,而其他人则会处理UI。与此同时,老板正在看着我的肩膀,不愿意放弃曾经是他的孩子,现在是我的,并用手指戳它。三年后,开发商逃离了公司,我们距离实际销售任何东西还有X个月的时间。

最大的错误在于过于雄心勃勃。如果这是你的第一份工作,那么 会犯错误, 需要在你写完之后改变工作的方式。我们有各种各样的功能,使系统比它需要的更复杂,无论是在数据库级别还是在向其他开发人员提供的API中。最后,整个过程太复杂了,不能立刻支持所有人,只是死了。

所以我的建议:

  1. 如果你不确定单手承担这么大的工作,不要。告诉你的雇主,让他们找到或雇用某人为你工作,谁可以帮助你。如果需要将人员添加到项目中,那么应该在开始时进行,而不是在事情开始出错之后。

  2. 仔细考虑产品的用途,并将其归结为您能想到的最简单要求。如果给你规格的人不是技术人员,试着去看看他们写的是什么会实际工作和赚钱。与客户和销售人员交谈,了解市场。

  3. 承认你错了并不可耻。如果事实证明整个系统需要重写,因为你在第一个版本中犯了一些错误,那么最好尽快承认这一点,这样你就可以了。相应地,不要试图建立一个可以预测第一个版本中每个可能的偶然事件的架构,因为你不知道每个偶然事件是什么,只会弄错。写一次是为了丢掉并重新开始 - 你可能没必要,第一个版本可能没问题,但如果你这样做就承认。

答案 2 :(得分:3)

我也不同意从数据库开始。数据库只是您的业务对象如何持久化的工件。我不知道Java中的等价物,但.Net拥有诸如SubSonic之类的强大工具,可以让您的数据库设计在迭代业务对象设计时保持流畅。我首先要说的是(甚至在决定引入什么技术之前)关注过程并确定你的名词和动词......然后从那些抽象中构建出来。嘿,它确实在“现实世界”中起作用,就像OOP 101教你的那样!

答案 3 :(得分:2)

在开始编码之前,请规划好数据库架构 - 其他一切都将从中流出。尽早使数据库合理正确将为您节省时间和麻烦。

答案 4 :(得分:2)

最重要的是能够抽象出系统的复杂性,这样一旦你开始就不会陷入困境。

  • 首先阅读规范就像一个故事(浏览它)。不要停留在那里然后分析它的每个要求。这样您就可以在没有太多细节的情况下获得系统的整体情况。此时,您将开始识别系统的主要功能组件。开始放下这些(如果你愿意,可以使用思维导图工具)。

  • 然后取出每个组件并开始爆炸(并将每个细节与规范文档中的要求捆绑在一起)。对所有组件执行此操作,直到满足所有要求为止。

  • 现在,您应该开始查看组件之间的关系,以及各个组件之间是否有重复的功能或功能(然后您可以将其拉出以创建实用程序组件等)。现在,您可以在脑海中获得详细的需求详细地图。

  • 现在,您应该考虑设计数据库,ER图,类设计,DFD,部署等。

首先执行最后一步的问题是,您可能会陷入系统复杂性的困境,而不会首先获得全面的理解。

答案 5 :(得分:1)

我反过来这样做。我发现做数据库模式优先使系统陷入数据驱动设计中,很难从持久性中抽象出来。我们首先尝试进行域模型设计,然后将数据库模式建立在那些模式上。

然后是基础设施设计:团队应该首先考虑如何构建程序的约定。然后我们共同努力首先就系统的通用功能设计达成一致(例如,每个人都需要的东西,如持久性,日志记录等)。这成为系统的框架。

在我们将剩下的功能分开之前,我们首先共同努力。

答案 6 :(得分:1)

根据我的经验,最后考虑数据库的Java应用程序(.NET也)在进入企业环境时很可能表现不佳。你需要真正考虑你的观众。你没有说它是否是一个网络应用程序。无论哪种方式,您在实施的基础架构在考虑如何处理数据时都很重要。

无论您考虑采用何种方法,如何获取和保存数据及其对性能的影响应该是您的首要任务之一。

答案 7 :(得分:1)

我建议考虑如何使用此应用程序。未来的用户将如何使用它?我确定你至少知道这个应用程序需要处理的内容,但我的第一个建议是“考虑用户以及他或她需要什么”。

在普通纸上画出来,想一想在哪里划分代码。记住不要将逻辑与GUI代码混合(常见错误)。通过这种方式,您将设置为将来的应用程序范围扩展到servlet和/或applet或任何平台。分层,以便您可以更快地响应大的更改而无需重建所有内容。图层不应该看到除最近的相邻图层之外的任何其他图层。

从真正的核心功能开始。所有耗费时间的东西(这将使你的项目延迟4周)对于大多数用户来说并不重要。一旦您确定可以准时交货,就可以在以后添加。

顺便说一下。尽管这与设计无关,但我只是想说你不会按时交付。对时间消耗做出切合实际的估计然后加倍:-)我假设你不会在这个项目中独自一人,随着项目的进展,人们会来来往往。您可能需要在项目中途培训人员,人们去度假/需要手术等。

答案 8 :(得分:0)

将大系统分成小块。 并且不要认为它太复杂,因为它通常不是。通过思考太复杂,它只会破坏你的想法,最终破坏设计。有些人认为你可以更容易地做同样的事情,然后重新设计它。

至少这是我设计中的主要错误。

保持简单!

答案 9 :(得分:0)

我基于

找到了关于开始一个新的大项目的非常有见地的想法
  • 共同良好做法
  • 测试驱动开发
  • 和务实的方法

在书中Growing Object-Oriented Software, Guided by Tests

它仍处于开发阶段,但前三章可能是您正在寻找的内容,恕我直言也值得一读。