我们中的许多人从头开始设计和开发系统,他们遇到过必须对项目架构做出艰难决定的情况。在构建体系结构合理且可扩展的系统时,您或者您是否会在“下一步”中划清界限?
我已经建立了一个在架构方面相当崩溃的大型网站。有一个带有前端代码的Web层,然后是处理要完成的实际工作的业务和数据层。逻辑分离的各个层共存于同一物理机器上。通过使用Web服务层/层,可能存在物理上的,甚至是简单的逻辑上的分离。出于各种原因,它没有以这种方式实施。决定是对还是错只是意见问题。从我的角度来看,我一直处在其他相对简单的应用程序过度设计的情况下。
在为新项目设计架构时,您考虑了哪些因素?您是否拥有经常使用的一致项目设计,从一开始就是n层,还是在每个项目进入时进行评估?
重复这些经历,我常常想知道处于同一位置的其他人如何证明并做出这些考虑。我相信我们所有人都会有不同的意见,但我相信理解这些意见背后的思维过程将具有启发性。
答案 0 :(得分:3)
给定问题的正确架构完全取决于问题。你的问题太笼统,不能提供真正的答案,除了说我保持架构尽可能简单,以考虑所有已知和预期的要求,但没有更简单。
编辑:
对于“典型”业务解决方案,以下是我考虑的一些因素:
UI
业务层
数据持久性
交叉切割
答案 1 :(得分:2)
好吧,让我成为那个告诉你的人 - 干脆做吧。专注于你现在的任何要求,但不要试图解决所有可能的未来特征,想象的需求变化和各种发展过程。
Joel撰写了一篇很棒的文章:Don't Let Architecture Astronauts Scare You。
分析您拥有的任何要求,无论您的软件需要什么功能,请查看您以前使用类似项目的经验并继续使用。
伟大的建筑从来没有出现在第一次脑力激荡会议之外。您可以从一种方法开始,随着天气变化调整您的课程,进行代码审查会议,以产生改进架构的想法,将一些不良代码重构为优质和可重复使用的组件,最后您的车库将变成一座城堡。 / p>
关注KISS principle并避免过早优化。
您是否拥有经常使用的一致项目设计?
当然。个人或团队开发自己的风格,解决典型问题的技术,可重复使用的组件,这些组件将形成您的工具集。每次开始一个新项目时,为什么要扔掉它们?
你从一开始就是n级吗?
我努力做到。它服务于一致性,清洁结构和关注点分离的目标。
或者您是否评估每个项目的进展情况
那也是。可能有不同的方法来解决问题并以最有效的方式解决问题。
答案 2 :(得分:1)
在构建体系结构合理且可扩展的系统时,您或者您是否会在“下一步”中划清界限?
我不明白这部分问题。
在为新项目设计架构时,您考虑了哪些因素?您是否拥有经常使用的一致项目设计,从一开始就是n层,还是在每个项目进入时进行评估?
我很幸运能够在小团队中完成几乎所有的工作,不幸的是,几乎所有的工作都在高流动率的团队中完成。我已经学会了从不尝试自己构建一个系统;团队合作的结果更好。有时候我们已经完成了快速原型制作,但如果团队很好,我发现你可以用白板,索引卡和纸张设计获得惊人的效果。
我们肯定不拥有一致的项目设计;每个架构都可能是项目的一次性 - 但我几乎专门从事研究和高级开发。
考虑的因素:
团队是否认为架构能够完成工作?胜过所有其他考虑因素。
初级团队成员或新人可以轻松学习架构吗?其他团体会窃取你最好的人,他们会离开去创办公司。在一个案例中,我们有一个团队,他们太忙于为现场请求学习新架构,即使他们所拥有的架构正在阻止它们。
架构的结构是否反映了需要创建它的组织的结构? :-)有点舌头,但我们需要相信我们可以用人和时间来建立它,而不是完美的开发团队。因此,能够识别与个人匹配的体系结构是件好事。
是否存在我们不理解的部分 - 或者更糟糕的是,我们害怕哪些部分?如果是这样,主要的危险信号。
漂亮吗?在与其他团队的人共进午餐时,我们会为此感到自豪吗?如果没有,设计/架构可能还不够好。
是否有可识别的新想法?别人可以借鉴的东西? (这在研究环境中很重要,但我怀疑其他地方并不重要。)
答案 3 :(得分:1)
我发现预先考虑性能瓶颈通常是非常糟糕的做法。您可以花费大量的前期优化,最终没有明显的差异。
我们现在有一些很棒的重构工具和很多关于开发模式的资源。因为工具已经变得更好了,所以我不会花费与架构功能相同的时间。非常粗略我的过程是这样的:
如果你以这种方式工作,你会发现你在简单方面犯了错误。模式,第三方工具等在解决特定问题时可能非常棒,但我想记住,每次添加类似的东西时,它都会提高以后维护应用程序所需的理解条件。所以我从简单开始,只有在特别获得某些东西时才增加复杂性。
在与其他建筑师打交道时,我的嘴巴确实很不好,即使是一个小的,简单的应用程序也会达到依赖注入框架,Nhibernate,NUnit,滚动他们自己的日志库,编写3x单元测试因为他们有代码行等等。所有这些工具都有特定的例子,投资回报率(投资回报率,“砰然一声”)非常好,而其他情况则不然。一个优秀的架构师可以尽可能以最低的时间/成本提供尽可能多的价值。
答案 4 :(得分:1)
我的观察是,真正优秀的建筑师会花时间深入了解已知的要求,并在理解未来的灵活性提供方面使用相当大的判断力。
他们也理解层的逻辑和物理分离之间的区别。
我常常看到两种模式中的一种:
(如果您需要解决的唯一架构问题是您的解决方案中有多少层,那么您确实很幸运: - )
答案 5 :(得分:0)
我使用Spring - 它都是内置的。
答案 6 :(得分:0)
我最初考虑域的复杂性。如果是复杂的,在商业,商业或工业,而不是计算机或数据科学,我默认使用基于对象域模型的架构。
接下来我会考虑规模,关键性,期望和其他非功能性要求。