我可以编写代码…但是设计得不好。有什么建议么?[关闭]


83

我觉得我擅长一点一点地编写代码,但是我的设计确实很糟糕。问题是,我该如何改善设计,进而成为更好的设计师?

我认为学校在教授人们如何善于解决数学问题方面做得很好,但让我们承认一个事实,即在学校创建的大多数应用程序的长度通常约为1000-2000行,这意味着这大部分是学术活动并不能反映现实世界软件的复杂性-大约几十万到几百万行代码。

在这里,我认为,即使像topcoder / project euler这样的项目也不会有太大帮助,它们可能会提高您的数学问题解决能力-但您可能会成为一名学术程序员;对精美,干净的东西更感兴趣的人,对大多数应用程序程序员处理的日常琐事和毛茸茸的东西完全不感兴趣。

所以我的问题是如何提高我的设计技能?也就是说,设计中小型应用程序的能力是否会涉及几千行代码?如何学习设计技巧,以帮助我构建更好的html编辑器套件或gimp等图形程序?


1
“让我们承认一个事实,就是在学校创建的大多数应用程序通常大约有1000到2000行长,这意味着这主要是一次学术练习,并不反映现实世界软件的复杂性。”:我在教书的那儿有两个一个学期软件项目,由十名学生组成的团队在6到8个月的时间内开发了相当复杂的应用程序。另外,许多公司(至少在德国是这样)为想要在完成学业之前进行一些练习的学生提供短期合同。
Giorgio

Answers:


87

真正擅长于某件事的唯一方法是尝试,大幅度失败,重试,再失败的次数少于以前,并且随着时间的流逝,逐渐积累经验,以识别导致失败的原因,以便以后可以处理潜在的失败情况。在学习您喜欢的第一人称射击游戏中学习演奏乐器,驾驶汽车或赚取严重的PWN年龄时,这是如此,就像学习软件开发的任何方面一样。

没有真正的捷径,但是您可以做一些事情来避免在获得经验时遇到麻烦。

  • 确定一个好的导师。没有什么比能够与已经缴纳会费的人谈论您的问题更好的了。指导是帮助快速学习的好方法。
  • 阅读,阅读更多内容,练习所读内容,并在整个职业生涯中重复一遍。我从事这项工作已有20多年了,但我仍然每天都会学习一些新知识。不仅学习前期设计,还学习紧急设计,测试,最佳实践,过程和方法。所有这些因素都会对您的设计如何出现,形成以及更重要的是随着时间的流逝产生不同程度的影响。
  • 找时间修补。您可以通过工作场所参与一个大型项目,也可以自己练习。通过将您的新知识付诸实践,并观察这些事情将如何工作,与您的阅读相结合。这也是与导师进行良好讨论的必要条件。
  • 获取处理一些技术以外的工作场所。这可能是一个项目,也可能是一个论坛。可以让您在同龄人之外的圈子中测试您的理论和想法,以便对事物保持新的观点。
  • 要有耐心。认识到赚钱经验会花费时间,并学会接受您需要退缩一段时间以了解失败原因和失败原因。
  • 记录您的任务,想法,失败和成功的日记或博客。这不是绝对必要的,但是我发现,随着时间的流逝如何发展,技能如何发展以及思想如何变化,对您很有益处。我每隔几个月就会回到自己的日记中,看看4-5年前我写的东西。发现那段时间我学到了多少,真是令人大开眼界。这也提醒我,我有时会出错。这是健康的提醒,可以帮助我改善。

45
+1尝试失败。因为当您不了解为什么会有设计模式时,就无法有效地使用该模式。
Mert Akcakaya 2012年

2
+1个很好的答案,但我发现它有些不完整。我认为,到目前为止,最重要的贡献是对重构有很好的胃口。编写,查看理论的内容(文章,书籍或指导者),重构/重写,回到理论,重构/重写-这将使您有时间专注于结构,同时使用熟悉的代码。成为自己最糟糕的批评家。我还要说,非常重要的一点是,您永远不要因为不断重新审视自己的工作而失去这种胃口。
vski 2012年

1
@vski我可以包含很多概念,但问题是这些概念本身是否会为获得OP认为自己是一名经过改进的设计师所需的经验提供一条合理的途径。在我的回答范围内,我将重构视为一种实践(根据第二点)。练习Clean Code,Test First,BDD和许多其他概念也是如此。我采用的方法是,随着时间的推移,要发展到一定的水平,随着所获得的经验和知识的发展,设计技能应会出现和增长,因此需要很多技能和经验。:)
S.Robins 2012年

2
+1获得指导。理想情况下,请您的指导者与您一起进行代码审查。当涉及到更好,更清洁的设计时,让其他人阅读和批评您的代码确实可以为您提供帮助。
狮子座

2
“曾经尝试过。曾经失败过。没关系。再试一次。再次失败。失败更好。” ---塞缪尔·贝克特(Samuel Beckett)。
Peter K.

16

好吧,这个问题没有金苹果,我觉得也许这是每个程序员自己都应该找到适合自己的方法。无论如何,这是我的看法。

可以阅读有关该主题的书籍。好书。很棒的书。但是我发现这些书仅对尝试构建和设计应用程序的人有用,但是失败了。

对我来说,一切都与经验有关。当我还是一名新手时,我会阅读有关如何设计的书籍。那时我不太了解其中的内容。当我开始工作并不得不自己设计应用程序时,我的应用程序非常混乱。他们工作了,但是很难维持。然后我又读了那些书-这次我更好地理解了它们。

现在,我继续犯新错误并从旧错误中吸取教训。


10
这里有一个很重要的观点值得我们大声疾呼:不断犯错误;不要继续犯同样的错误-从错误中学习,并做新的事情。
Bevan 2012年

11

停止设计并学习重构代码。通过不断进行积极的重构而进行的增量开发将使最终产品比任何前期设计都要干净得多。


2
恕我直言,紧急设计是一件美丽的事情,但如果没有纪律,您就有可能创建“紧急意大利面”。前期设计的问题是,人们将其视为一个全有或全无的主张,当情况恶化时会给它一个不好的代表。这让我想起了Joel的一篇文章,他提到设计很重要。尽管需要足够的前期设计才能有所作为,但又不会浪费您的时间,资源,也没有机会通过干净的代码有机地呈现出精美的辅助设计。
罗宾斯(S.Robins)

@ S.Robins:我认为OP仍在攻击规模较小的项目,这些项目可以通过TDD和连续重构很好地完成。因此,他可以学习所需的学科,以了解更复杂的项目需要多少设计。
凯文·克莱恩

我以为可能是这种情况,但是我觉得可能有必要添加一个对立的暗示,那就是“任何前期设计”可能会变得更糟,因为它纯粹是新兴的。但是,我确实同意,构建OP所寻求的必要体验的方法是,在一开始时就不必担心设计和专注于编写精巧且简洁的代码。:-)
S.Robins

我不同意重构总能带来最佳设计。当然,重构通常使您能够探索和理解问题,但是好的设计并不总是通过重构而逐步出现的。有时,您会看到更好的解决方案,并且意识到您当前的代码与之相距甚远,因此重写比重构快得多。
乔治

我最近有这种经验:我一直在进行重构和重构,并且一次又一次地遇到同样的问题:我正在使用迭代器来编码某些东西,并且代码一直在变得复杂。然后,我决定忘记迭代器,不得不重写很多代码,但是逻辑变得比以前更清晰,更简洁。我不知道您是否称其为“积极的重构”:应用程序的整体结构没有改变,但是一些基本部分被扔掉并从头开始重写。
Giorgio

7

当然,请阅读有关模式的知识,但首先要阅读有关反模式的知识。识别反模式很重要,而且比为什么原因更容易理解为什么不应该以这种方式完成某件事。

例如,请参见http://sourcemaking.com/antipatterns/software-development-antipatterns

编写代码,以便在需求更改时可以快速调整代码(这在生产环境中非常常见)。

对添加“仅一个小技巧”超级怀疑。这里又一个,那里又一个,代码变得不可维护。

重视开放原则

编写测试(与TDD中一样)。他们迫使您在实际实施设计之前就仔细考虑您的设计。

浏览开源项目的代码(大小合理的项目)。通常,我曾经惊讶于看到如此多的抽象级别。现在我明白这不是出于艺术目的,而是出于这种目的。


4

我认为对良好设计非常重要的一个原则是分解:如果一个类太大(超过300至400行代码),则将其分解为较小的类;如果方法太大(例如,超过50行代码),则将其分解;如果一个项目包含50个以上的类,则将其分解。

关键是估计系统的大小并构造几个抽象层(例如,子系统,应用程序,项目,模块,类,方法),这些抽象层允许您将代码分解为可理解的单元,它们之间的关系清晰且几乎没有依赖关系。


1
尽管您的建议中有一些优点,但是代码行并不重要,行为却很重要。如果您的方法做的不只一件事情,可能是时候重构它了。如果那件事只是调用自己执行某件事的方法,然后将它们缝合在一起,那很好。
2013年

1
@jer:当然,这是经验法则。正如您所说,调用100个其他方法的方法只是将事物缝合在一起(它正在调用子功能列表)。我更多地考虑的是包含一些真实逻辑的方法:如果您必须来回滚动很多以了解方法的作用,通常这是一个不好的信号。如果您查看具有很多成员的类定义,那也是同样的事情(并且该类不仅是大量的固定属性集合)。
Giorgio

“项目包含50多个类,对其进行分解”并不严重
动态的

@ yes123:这是一个想法。这实际上取决于您正在开发什么,使用哪种语言等等
Giorgio

我认为有必要指出,这对前期设计无济于事(因为您正在重构),但将有助于学习模式和最佳实践,以改善您的未来设计。
Craig Bovis

0

很难,我们真正在谈论的是抽象而不是创建更好的代码的能力,但是有两件事会让您变得更好,而一件事会让您变得更快乐:

“更好”

A)找到您可以找到的最佳设计师,并将程序配对/一起进行设计。请他们在解决问题时解释他们的想法,不要满足于“感觉正确”并继续挖掘。该过程也将有助于“指导”党

B)想象一切都是个人演员,以及他们之间的对话。每个参与者都应该有一个单一的角色/职责,并且他们各自负责不同的系统。如果该对话有效,并且每个演员都感到连贯一致,那么您就在路上。

和“更快乐”

C)如果您已尽力而为,但仍然没有发生,那么接受某些人无法做些事情并没有错。您可以编写紧凑,出色的代码,但永远无法设计或架构。所以呢?我不能参加太妃糖的体育运动,我也不好看,我的驾车永远也不会比一般人更好。陶醉并利用您的擅长。


-1

以我的个人经验,阅读他人代码是“灵感”的良好来源。我的意思是尝试理解他人的设计并问自己为什么他/她以这种方式做事?

您可以找到很多开源项目进行研究。

无论如何,您都需要练习。


-1

不要生活在恐惧中

力求简单

倾听您的用户

尝试很多想法

创建一些东西,然后做得更好

致力于增加价值的事物,放弃没有价值的事物


-1

学习提出正确的问题。通常,您会从不同角度看问题来改进设计。特别是,这将帮助您摆脱专注于解决当前问题的注意力,而将更多精力放在解决多个相关问题的解决方案上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.