2009-04-28 22 views
15

在我看来,设计能力很难得到开发/编码技能。如何提高软件设计技能?

当遇到需求时,如何设计功能模块, 如何正确构建程序架构?

顺便说一下,有一些书有关吗?

回答

21

我认为答案是最平庸的程序员通常不会做的:阅读其他人的代码并从中学习,分析它的优点和缺点,并且将自己的编程技巧整合到你看到的有趣内容中。 许多已经发明的好技术,将增强您的编码技能,并为您节省大量时间。

在开源项目中有许多高质量的代码用于研究。

4

试错法是了解您自己的设计如何改进的最佳方法。总是寻找更好的解决方案。你犯了什么错误?哪一部分比需要的灵活性要差?是什么让你必须破解你所做的设计决定?

想想设计的含义,而不是纯粹的灵活性和优雅。为了使这个可重用,你做了什么权衡?你是否遵循seperation of concernssingle responsibility principleOpen closed principle?你知道这些是什么以及它们的含义吗?

还研究设计模式形式的专家的工作。

Design Patterns Explained by Shalloway,读Head first design patterns

但是请记住,这些都不是灵丹妙药解决方案,并采取一切用少许盐。使用你自己的创意和保持PRAGMATIC。

+0

我会说尝试和错误将是改善您的设计最糟糕的技术。通常在不用打字的情况下花几天时间就可以节省很多精力,并且产生更好的设计,这对于项目的成功来说是非常有利的。 – piotr 2009-04-28 09:12:57

9

我认为这一切都归结于经验。能够阅读一套要求并将其转化为一个好的,干净的,可维护的软件设计是编程中最难的事情之一(imho),并且你不会仅仅通过阅读一本书就能学会。这是关于尝试,犯错误,从错误中学习,以及了解过去设计或未设计的设计。

对我来说,通常有助于我真正花时间在UML中创建一个好的设计,例如类图。它经常帮助我识别可以在整个软件应用程序中重用的组件,并可以使用某种设计模式等。

几本书,我可以推荐:Software Architecture in Practice,这是关于软件架构很好的一本书,并通过Design Patterns四人帮,这是你可以使用任何设计模式有很大的参考。

2

我不相信有任何经验和才能的替代品,我从来没有读过一本关于软件设计的书,我可以从的教学设计中推荐,尽管已经阅读了很多。有些人擅长,在获得经验的时候会变得更好,有些人不会,也从来没有学过。伤心,但是真的。

2

我认为通过查看一些可用的优秀开源项目的设计。阅读代码并查看开源项目的设计是学习设计的最佳方式。

6

不要说“试错”,我们可以说“迭代”。

无论你在设计什么,只要知道你没有完整的知识,就用最好的信息给你。那么你无疑会遇到一个令事情复杂化的无法预料的问题。这是当你不得不问自己出了什么问题以及采取什么不同的做法时。然后回头重新设计/重新实现你的新理解。重复。总是第二次猜测你的设计,并寻找更好的解决方案。例如,“Firefox如何实现查找?哦,我看,他们不使用弹出窗口,而且它更干净。”

通过接受你会犯错误并愿意解决的事实,你已经领先一步。

随着您获得经验,您的迭代将会变得更长,并且偶尔您会第一次做对 - 毫无疑问,因为您可以预见过去的错误和解决方案。

就书本而言,如果我没有记错的话,“史蒂夫的脑子里面”讲述了如何迭代是苹果公司发展的内在因素。

2

我同意迄今为止最多的建议,他们都是有效的 - 阅读代码,看书,尝试东西。

在我看到最大收获的情况下,无论是个人还是团队成员都是双重攻击: 1.让他们离开他们的舒适区 - 即陌生的领域或语言,拿走拐杖。 2.可能更重要的是,将他们与已经有经验的人配对。

辅导有很多提供,你可以自己到达那里,但一个良好的导师可以为你节省年的痛苦

0

当然,经验是正确的答案。但除此之外,我认为在你自己的语境中理解模式有一些需要说明的地方:当你构建你的应用程序时,做出对你来说务实的设计决定。换句话说,不要这样做,因为这是'最佳实践',或者是因为一个更有经验的程序员告诉你的。做他们,因为了解为什么,它可以帮助你(或其他程序员)与代码工作,并更好地理解它。我发现在数据库设计等方面也是如此。从直观的维护角度来看,做什么是有意义的。如果你真的认真思考过(或者从各种陷阱中学习),你会发现自动进行某种“模式”或练习而不积极尝试。

当然,我不建议任何人在真空中工作;当然,他们并不积极追求和整合设计模式。我只是认为,在你自己的背景下(并且出于具体的,实际的原因)理解它们是帮助大多数人将事物去神秘化的原因。无论如何,这是我的经验。阅读书籍对我来说总是感觉像学习一样。好帮助的东西,但旁边的小土豆进入斜坡。想想你的决定,并能够为他们辩护。始终以更好的方式开放。