原型与清洁代码的早期阶段


43

我正在计划/开始一些个人项目,这些项目最终可能会成为我的日常工作。这让我开始思考,应该从哪个方向开始?

  • 只是原型-编写仅能正常工作的基本代码,这可能会花费我大量时间进行优化和重构,以便于轻松扩展。

  • 从一开始就编写干净,优化和文档化的代码,请记住,如果过了一段时间它就不具有成本效益,它将被删除。

更新:将YAGNI与sunpech和M.Sameer的答案结合起来对我来说非常有意义:)谢谢大家的帮助。


1
还看到:当重构
蚊蚋

Answers:


39

第三种选择是……通过测试驱动的开发编写干净的代码,以实现当今使用YAGNI所需的要求。

暂时不需要编写代码但将来可能会编写代码的诱惑有很多缺点…… 您将不需要它

  • 花在添加,测试或改进必要功能上的时间。
  • 必须调试,记录和支持新功能。
  • 任何新功能都会限制将来的操作,因此现在不必要的功能可能会阻止以后实现必要的功能。
  • 在实际需要该功能之前,很难完全定义其功能并对其进行测试。如果未正确定义和测试新功能,即使最终需要它,也可能无法正常工作。
  • 它导致代码膨胀;该软件变得越来越大,越来越复杂。除非有规范和某种版本控制,否则使用该功能的程序员可能不知道该功能。
  • 添加新功能可能会建议其他新功能。如果还实现了这些新功能,则可能会导致滚雪球效应的滚雪球效应。

结果,您不仅应该只是原型……也不应该从头开始编写干净,优化和文档化的代码,要记住,如果在一段时间内它不会具有成本效益,那么它将被丢弃。

编写您现在需要的代码,从而知道自己将能够最好地满足今天和明天的需求。


4
尽管我不喜欢成熟的TDD,但是这始终是个不错的建议,因为遵循TDD会迫使您编写干净,文档齐全的代码。
韦恩·莫利纳

1
我认为他的意思是,如果不成功,他将放弃整个项目。如果是这样,那么这个答案似乎与“编写干净的代码”没有什么不同。
Jeremy

@杰里米,你以为我的回答正确。但是这个答案不一样。它基于严格的编程方式,而其他人则基于经验,请确保它们在某些情况下看起来相似,但至少是不相同的:)至少从我看来:)
JackLeo

1
@JackLeo我认为重点是,一旦您达到一定的经验水平,“我努力工作的代码”和“我刚刚编写的代码”之间就不再有区别了。
Ant P

@AntP确实。六年后思考这个问题很有趣:)
JackLeo

16

照常...

这取决于

如果您要进行原型设计以减轻风险或暴露未知因素,请对其进行编码,并期望在完成后将其丢弃

如果您要进行迭代优化的原型,只需对其进行编码,并希望经常对其进行修改和重构。

如果您开始编写实际产品,但称其为原型,那么您可以懒惰,那就不要懒惰,并在第一时间写得好


2
+1好帖子!我要补充一点,尽管在开发了该功能后它似乎没有用,但切勿丢弃原型。我总是控制每个工作的原型,因为有时我会参考它们以获取提示和提示。
maple_shaft

1
@maple_shaft:是的,“扔掉”是一个隐喻,例如“不必尝试重构它,计划重写它”
Steven A. Lowe

2
我说您应该懒惰,并且第一次写得很好,这样您就不必再回头再去重新访问它了。
Blrfl 2011年

第三句话让我很开心。
克里斯托弗·弗朗西斯科

10

如果您正在制作原型,为什么要考虑使用干净的代码?原型设计的初衷是为了证明一个概念或构想,然后将其丢弃。

我要在这里与大多数人不同意,如果您已经在考虑编写干净的代码或快速完成原型制作之间的选择,请选择后者。特别是在谈论早期开发时。我并不是说永远不要编写干净的代码,而是要说出主意,看看这是前进的方向,然后再将其整理干净-重构。

作为软件开发人员,我们非常着迷于正确地做事并在第一时间进行清理,以至于我们没有意识到这不是我们要交付的代码,而是解决问题的方法

我认为编码就像写论文一样:

在写论文时,我们从某个地方开始,勾勒出想法,轮廓等。它不会包含所有细节或没有任何完成的外观–本质上是第一稿,然后是第二稿,依此类推。许多东西将被重写,替换和/或什至删除,直至获得更精致和更精美的纸张。(显然,此类比喻并不能说代码像纸一样真正完成或最终完成。)


+1很好的答案:)早期我发生了很多事情,因此跳入大型项目可能会导致相同的结果……这就是我所担心的。
JackLeo 2011年

“作为软件开发人员,我们非常着迷于正确地做事并在第一时间进行清理,以至于我们没有意识到这不是我们要交付的代码,而是解决问题的方法。” 我想说的是相反的话:“我们永远没有时间做正确的事,但是我们总是有时间去做。”
克里斯托弗·弗朗西斯科

6

原型有两种类型:

  • 不断进化的原型,通过不断改进和修复不断发展,最终成为最终产品。
  • 一次性原型的存在只是为了使需求收集和客户反馈在项目的早期阶段更加有效,然后被完全丢弃,最终产品的开发从头开始。

根据Capers Jones的说法,进化原型会生产出低质量的最终产品,这将需要更多的精力和更长的时间才能达到稳定。

因此,如果您正在考虑进行原型设计,以便客户尽快看到一些东西,以帮助您更好地了解需求,并获得有关需求的更多详细信息,最好是使用一次性原型,并在以后使用干净的代码进行开发。如果您负担不起,请从头开始编写干净的代码,并仔细维护它,但正如其他人建议的那样,请不要过度优化,也不要添加任何东西直到您需要它们为止。


很好的一点是,用于显示不同类型的原型,我还没有考虑过:)在这里给我一点食物:)
JackLeo

同意这一点!
理查德·托皮奇

一次性原型的最大风险在于,管理层将难以理解为什么生产版本与原型相比需要花费这么长时间,以及为什么原型上的工作应该被“浪费”。当然,如果这是您自己的创业公司,那么就不会有这样的管理,这使它变得容易得多。
Jan Hudec

5

我出于任何原因都不愿意原谅肮脏的编码。以我的经验,以快速而肮脏为原型的借口的人对任何代码(包括生产)都持这种态度。如果有人创建了一个混乱的原型,那么他将以任何代码创建混乱。原型开发并不意味着脏编码,而是意味着可以简化测试最重要用例的假设。该代码可能未经过正式测试,或未考虑所有细节,但仍应精心设计和实施。清洁是能力的标志,有能力的程序员自然对混乱的代码感到厌恶,无论其目的是什么。


我忘了提一件事。我一遍又一遍地看到它,人们出于“原型制作”的目的而写得又快又脏,而出于生产目的,它变得痛苦而丑陋。由于一旦完成并开始工作,人们就会不断增加绷带,一团糟。
Gene Bushuyev 2011年

您的观点很不错-“如果可以,为什么还要重写?” 对于许多年轻公司来说,这是一个问题,即使在我目前的职位上,当大型公司使用具有10年历史的CMS来升级到今天的标准也很痛苦时,我仍然看到它。这就是为什么我问这样的问题,我不不想在这里犯错。虽然您的回答主要是说我正在寻找写草率代码的借口。不,sunpech和M.Sameer明白了。原型就是制造一些东西,看看世界将如何反应。如果有效,请做好。
JackLeo 2011年

1

从一开始就编写干净,优化和文档化的代码。我自己无法做到这一点,这是一个真正的问题。我不是编码员,但我曾在软件开发公司的客户管理角色中担任过相当多的工作,由于他们给了我很多好主意,所以我有时会为某些东西构建原型。几乎每次原型都被交给开发人员,后者“清理”并将其转变为运输产品。当我检查源代码时,仍然是我糟糕的代码的80-90%。


0

我的一位同事热情地支持反复进行原型设计,并告诫人们必须有足够的纪律才能扔掉每个原型并重新编写,而且不仅要确保不受上一轮决定的实施细节的影响,然后最终要做的就是多次以不同的风格编写相同的原型。他半严肃地建议,如果您确实附加了一些您无法舍弃的出色代码,则应将其打印出来,删除源代码控制存储库,然后将打印输出发布给自己-它会消失的时间足够长,以至于它无法渗透到下一个迭代中。


这篇文章很难阅读(文字墙)。您介意将其编辑为更好的形状吗?
蚊蚋

您能提出您认为问题出在哪里吗?也许句子​​太长了,正如我刚刚注意到的那样,其中只有两个。还要别的吗?
汤姆W

-1

您始终可以从使其开始工作(完全)开始,然后对其进行修改以使其变得干净,然后从经济上考虑使其变小/变小。我将从您扔掉的一些实验开始,然后在您掌握了可行的方法后将其TDD重新存在。


-1

两者都很好。我都喜欢。他们彼此不矛盾。

我喜欢原型。原型正在发展我的创造力。我正在测试许多可能的解决方案。快速地进行操作使我有可能测试许多解决问题的方法。

我喜欢编写干净,经过良好测试的代码。它发展了我的核心技能。我通常选择一种原型,或者对其进行改进,或者从头开始重写。

但是,您永远不要将生产代码中的原型弄错。原型永远都不能投入生产。应始终将其标记为原型。最好在您自己的分支机构中进行所有原型制作。


-2

我倾向于说极端情况几乎总是有害的。

我建议保持干净,有据可查的原型之间的平衡。当您为图书馆或平台进行开发时,就没有与我接触的经验,因此我会更多地向原型方向发展。从一开始,对于将Android置于紧身胸衣的平台(例如Android或容器),尤其如此。这意味着您实现了他们的接口,然后他们打电话给您。

根据我自己的经验,大多数代码的寿命不会很长。就是说,通过实现功能来快速入门。迟早(大多数情况下会更快),由于下一个功能,您需要重新整理/重构现有代码,尤其是处理复杂的部分。请注意进行适当的自动化测试,以使无障碍的重构成为可能。与上述类似Android的平台相同:由于紧密耦合且没有可测试性设计,它们经常使自动化测试变得不那么容易。然后,您可以将测试基础提升到更高的水平,例如集成测试。

我写了一篇文章,可能会给您一些有关启动的提示:https : //medium.com/@ewaldbenes/start-lean-why-its-best-to-split-your-next-coding-project-by-feature-70019290036d

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.