您如何防止复杂的解决方案或设计?

时间:2008-09-17 18:48:43

标签: complexity-theory analysis

很多时候,我们发现自己正在处理一个问题,但却发现创建的解决方案比问题要复杂得多。是否有控制,最佳实践,技术等可以帮助您控制工作场所的并发症?

14 个答案:

答案 0 :(得分:13)

让新人看一看。

答案 1 :(得分:5)

如果太难测试,你的设计太复杂了。这是我使用的第一个指标。

答案 2 :(得分:5)

根据我的经验,设计一个过于笼统的案例往往会产生太多的复杂性。

工程文化鼓励设计减少对环境的假设;这通常是一件好事,但有些人认为太过分了。例如,如果你的汽车设计没有承担特定的引力,那么可能会很好,没有人真的会在月球上驾驶你的汽车,如果他们这样做了,那就不行了,因为没有氧气使燃料燃烧。

困难的部分是,开发出“任意行星上的工作”设计的人通常被认为是聪明的,所以你可能不得不更加努力地争辩他的设计也是聪明。

理解权衡,因此您可以在良好的假设和错误的假设之间做出决定,这将大大有助于避免不必要的复杂设计。

答案 3 :(得分:3)

以下是一些让设计更简单的想法:

  • 阅读一些编程书籍和文章,然后在工作中应用并编写代码
  • 阅读其他人编写的大量代码(好的和坏的)(比如开源项目),并学习看哪些有效,哪些无效
  • 构建安全网(单元测试)以使用您的代码进行实验
  • 使用版本控制启用回滚,如果这些实验转错了
  • TDD (test driven development)BDD (behaviour driven development)
  • 改变你的态度,问你如何做到这一点,“它只是工作”(约定优于配置可以帮助那里;或者询问Apple如何做到这一点)
  • 练习(如爵士乐手 - 用代码堵塞,试试Code Kata
  • 多次编写相同的代码,使用不同的语言并经过一段时间后
  • 学习使用新概念的新语言(如果你使用静态语言,学习动态语言;如果你使用程序语言,学习功能性语言; ......)[每年一种语言就是对的]
  • 请某人审核您的代码,并积极询问如何使您的代码更简单,更优雅(然后使其
  • 通过做上述事情(时间有助于积极思考)获得多年的努力

答案 4 :(得分:2)

我创建了一个设计等,然后我看着它并尝试去除(激烈地)所有似乎不需要的东西。如果事实证明我需要它以后在我抛光设计时我会重新添加它。我会在几次迭代中执行此操作,随着时间的推移进行精炼。

答案 5 :(得分:2)

阅读Michael C. Feathers的“有效使用遗留代码”。

关键是,如果您的代码有效,并且您需要更改设计,那么没有什么比使您的代码单元可测试更好,并将您的代码分成更小的部分。

答案 6 :(得分:2)

使用测试驱动开发并遵循Robert C. Martin的Three Rules of TDD

  1. 除非要通过失败的单元测试,否则不允许编写任何生产代码。
  2. 您不得再编写任何单元测试,而不是足以使其失败;编译失败就是失败。
  3. 您不能再编写足以通过一次失败的单元测试的生产代码。
  4. 通过这种方式,您不太可能获得不需要的代码。你将始终专注于让一件重要的事情发挥作用,并且在复杂性方面永远不会超越自己。

答案 7 :(得分:1)

首先测试可能对此有所帮助,但并不适合所有情况。而且它无论如何都不是灵丹妙药。

从小开始是另一个好主意。你真的需要将所有10个设计模式都填充到这个东西中吗?首先尝试“愚蠢的方式”。不完全削减它?好吧,这样做“稍微不那么愚蠢”。等

审核。正如别人写的那样,两双眼睛更好。更好的是两个大脑。你的伴侣可能只是看到一个简化的房间,或者你认为只是因为你花费了很多时间来攻击它而成为一个有问题的区域。

使用精益语言。 Java等语言或有时候C ++似乎有时会鼓励讨厌的,错综复杂的解决方案。简单的事情往往跨越多行代码,你只需要使用3个外部库和一个大框架来管理所有代码。考虑使用Python,Ruby等 - 如果不是你的项目,那么私人使用。它可以改变你的思维方式以支持简单性,并确保简化是可能的。

答案 8 :(得分:0)

一旦你成为一名程序员,这将是不可避免的。如果你认真地估计了你的努力或解决了你的解决方案无效的问题,那么就停止编码并与你的项目经理交谈。我总是喜欢和我一起参加会议,问题是A,你可以做x需要3天,或者我们可以尝试y需要6天。不要自己做出选择。

答案 9 :(得分:0)

  • 每一步都与其他程序员交谈。设计中的眼睛越多,在代码库中变得过于僵化之前,就越有可能在早期发现过于复杂的方面。
  • 不断问自己,你将如何使用目前正在进行的工作。如果答案是您不确定,请停下来重新考虑您正在做的事情。
  • 我发现记下如何潜在地简化我目前正在处理的事情是很有用的。这样,一旦我真正使用它,就可以更容易地重新进行重构或重做,而不是弄乱那些甚至不起作用的东西。

答案 10 :(得分:0)

这是一个微妙的平衡行为:一方面你不想要设计和实现时间太长的东西,另一方面你不想要一个不够复杂的黑客来处理下一个一周的问题,甚至更糟糕的是需要重写以适应。

我认为有用的几种技巧:

如果某些事情看起来比你想要的更复杂,那么一旦你想完它就不要坐下来实施它。在剩下的时间里找一些其他事情要做。很多时候,我最终想到了问题早期部分的不同解决方案,以后会消除很多复杂性。

以类似的方式让别人可以反弹意见。确保你可以向他们解释为什么复杂性是合理的!

如果您因为认为将来有理由而增加复杂性,那么尝试在将来建立 时使用它。如果你不能(现实地)想象需要一年或三年的复杂性,那么现在支付它可能是不合理的。

答案 11 :(得分:0)

通过将任务序列化为一系列较小的任务来减少您正在使用的数据量。大多数人在编码时只能在头脑中保持六个(正或负)条件,因此请将其作为实施单位。设计你需要完成的所有任务,然后无情地破解设计,这样你就不必再通过模块玩六个以上的路径了。

这是从Bendazo的帖子开始 - 简化直到它变得容易。

答案 12 :(得分:0)

我问客户为什么他们需要一些功能。我尝试找到他们的请求的底部,并确定他们遇到的问题。这往往比我(或他们)想到的更简单的解决方案。

当然,如果您了解客户的工作习惯以及他们必须解决的问题,您可以从一开始就更好地了解他们的问题。如果你“了解他们”了解他们,那么你就能更好地理解他们的言论。因此,与您的用户建立密切的工作关系。这是工程学的第零步。

答案 13 :(得分:0)

花时间详细命名系统的概念,找到相关的名称,这会使系统更加熟悉。不要犹豫是否重命名概念,与你所知道的世界的联系越好,你的大脑就越能与之合作。

向那些从干净,简单的解决方案中获得成功的人征求意见。

只实现当前项目所需的概念(对未来打样或通用系统的需求会使您的设计变得臃肿)。