软件设计/架构问题

19

我已经编程一段时间了,并学习了几种编程语言。我编写了许多小工具之类的程序。我认为自己在编程本身方面掌握得非常好,比如说语法方面没有问题,我对底层的运作有很好的理解(合理的汇编知识)等。

但我的大问题是:我就是不能设计更大/更复杂的应用程序。我学习了面向对象编程原则、设计模式,学习了一些基本的Lisp编程和其他相关知识以期能够帮助我解决这个问题。

但无论我尝试什么,花费多长时间,我都做不到。我的设计总是感觉有些不对劲。因此我从来没有完成过一个更大的项目,我对程序结构总是感到不满意。

你是否遇到过类似的问题?你是如何解决的?你有什么提示可以给我吗?


1
这是一个典型的programmers.stackexchange.com问题。 - Junior Mayhé
6个回答

13

我认为经验是关键因素。每个设计都会在某个时候失败,然后就取决于你去改进它并从错误中学习。

在我看来,好的软件设计不是通过读几本书就能学到的。


12

设计本身是一个迭代的过程。你首先从某个设计开始,然后逐步改进。

设计并不是关于达到完美,即使在更大的应用程序中也无法实现。设计是关于做出好的平衡和权衡,在最终提供符合要求的良好、强大和可维护的应用程序的过程中达成共识。

你永远不会在各个方面都做得100%正确。

阅读一些有关设计/架构的好书不能直接让你成为这方面的明星,但它肯定会给你可以用来改进和完善你的技能的工具。

以下是一些书籍的示例:

当然,实践经验也很重要。


有什么好的书籍推荐可以入门吗? - sorgenkind

4
 design bigger/more complex applications

当你说“设计更大/更复杂的应用程序”时,我想你心里想的是通常被称为“企业级应用程序”的东西。 您可以查看 这个问题,其中讨论了各种标准,以帮助尝试客观地确定是什么使应用程序成为企业级应用程序。
谈到这些问题,
  1. 小型应用程序可能不一定有很多这些相关问题。

  2. 即使是企业应用程序,由于需要解决的诸多问题,区别在于哪些问题更重要。此外,在出现冲突问题的情况下,选择哪一个问题比另一个问题更重要。

在设计应用程序时,如果您考虑到这些问题并根据这些问题做出设计决策,那将是一种朝着正确方向前进的方式。然而,这比说起来容易。尽管这个列表看似简单,但对于初学者来说,设计正确通常非常难以实现,经验丰富的架构师也会因此失去睡眠/头发/生命。 其中一些决定只能通过经验学习。在我个人的经验中,对我有很大帮助的是与有经验的架构师一起工作并接受他们的监督。能够学习和获得他们的知识和经验的好处是您可以学到书籍/博客无法教授的东西。
But no matter what i try, how long i try: i just can't get it right. 
My designs always seem wrong to me somehow. 

坦率地说,你完全不是判断的合适人选。你怎么知道你的设计是错的呢?唯一真正能说明设计错误的方法是如果你的应用程序不能实现它的预期功能。
如果你想对你的设计进行一些验证,那我建议你找一个曾经参与过与你所拥有的类似规模项目的人,并请他们从他们的角度审查你的设计。这样会给你一个很好的想法,告诉你你的设计到底在哪里。
Cause of that i never drawn through a bigger project, i'm kinda never satisfied 
with the structure of my program.

很不幸,设计企业应用程序的一些真正复杂性是由于各种其他情况的影响而无法模拟的。有些可能是组织约束,例如我的客户的首席技术官不允许使用X技术,还有一些是我们需要将我们的应用程序与某个供应商正在使用的自制MS Access应用程序集成。这些应用程序和其设计的复杂性是必须要经历的,通常可以从中学到很多东西。
为了获得这样的经验,您必须在提供此类机会的地方工作。通常我所看到的是,公司越大,他们的IT环境就越复杂,这就给了出现复杂场景的最好机会。

3

首先看一下Uncle Bob Martin的原则,每个设计模式都涵盖了其中的一些原则,要特别关注开放封闭原则,我们总是做不到这一点,但经验的增长使得这变得更加容易。

我认为尝试解决问题并进行重构是一个很好的方法,它有助于问题更敏感地被发现,给出解决方案,并使我们摆脱如何解决它的压力。


2

尝试一步步进行,不要一次性设计所有内容。

  1. 定义你的应用需求。
  2. 考虑你需要的对象,尽可能让每个对象简单明了,并且具体化,不要创建包含多种功能的庞大对象。
  3. 思考对象之间的关系。

通过反复试验来得到最佳结果。在完成几个项目后,你将拥有足够的经验,在第一次就能做出正确的设计(虽然对于许多项目来说,没有“正确”的设计)。

记住,让你的设计尽可能简单化,使用复杂的设计来解决简单问题并不是一个好选择。


1

再加点日历智慧:「不要重复自己」和「尽量减少依赖」。不过,这两者常常产生冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接