我经常发现我对某个功能的工作不完整,特别是在设计阶段。我发现了几个原因:
我已经知道我的这种行为已经有一段时间了,但我仍然发现我无法弥补。你遇到过类似的问题吗?你如何解决它们?
答案 0 :(得分:9)
我使用了几种技术。第一个是简单的纸质待办事项清单。早上我写下当天的任务。我尝试着完成一项任务,直到我可以完成任务。只有当我完成自己的满足时,我才会将其交叉。我的待办事项列表可以帮助我保持专注。当一个中断进来时,我可以有意识地选择是否足以打断我现在正在做的事情。
我使用的第二种技术是放弃设计“完成”的想法。相反,我专注于我开始称之为“继承”的东西,其中设计经历了可预测的阶段。每个阶段都很好地支持当前功能,并且在下一阶段将在某个时候成功完成。这让我做得很好,这是我值得骄傲的工作,而不会过度设计。
我有直觉,有一小部分此类继承(如http://www.threeriversinstitute.org/FirstOneThenMany.html)可以涵盖大部分设计。与此同时,我试着记住“足以让这一天充满麻烦”。
答案 1 :(得分:5)
我经常遇到这个问题。
我的解决方案是笔记本。 (旧式纸张类)。
我写出了我计划如何将解决方案作为项目符号概述列表实施,然后我尝试充实列表中的每个点。
通常,在这个过程中,我遇到了一些我没想过的问题。
当然,80/20规则仍然适用......当我实际执行我没有想到的实现时,我仍会遇到一些事情,但是根据经验,这些规则往往会减少。
编辑:如果我在这个过程结束时仍然不确定,我会把一个一次性原型试验台放在一起......重要的是要确保它是一次性的,因为否则你冒着在你身上包含一些讨厌的黑客的风险真正的代码库。答案 2 :(得分:3)
当您处于项目的规划阶段时,特别是在软件开发领域,很容易错过边缘案例和细节。请不要觉得这是个人失败;这是一种特有的东西。
为了解决这个问题,出现了许多软件开发方法。最近,许多开发团队已经转向“敏捷”方法,这些方法专注于快速开发,几乎没有前期技术设计(毕竟,许多复杂性只有在您真正开始开发时才会发现)。我目前正在使用Scrum系统,这在我的小团队中非常出色:
http://en.wikipedia.org/wiki/Agile_methods
http://en.wikipedia.org/wiki/Scrum_%28development%29
如果您发现您的组织不接受他们认为方法的根本转变,那么可能值得研究他们是否同意开发原型系统。这意味着您可以编写一个功能来调查所涉及的技术,并判断它是否可行,而不必承诺完全开发,质量标准,测试计划等。一旦可行性得到证实或证明,原型应该被丢弃。 ,然后可以开始适当的发展,包括你在这个过程中学到的所有东西。
如果您的问题与时间管理更相关,那么我建议采用“完成任务”方法(http://en.wikipedia.org/wiki/Getting_things_done)。这是务实和简单的,专注于提高您的工作效率,而不会使您的信息与您当前的工作不相关。我发现有时候我对项目/功能的想法感到不知所措,当我有足够的资源可以有效地工作时,将所有内容写下来并将其归档以后真的很有帮助。
我希望这有帮助,祝你好运!
答案 3 :(得分:3)
通信。
不要急于陷入编程错误的最好方法是沟通。是的,良好的问责制。如果办公室中的另一个人参与了这个过程,结果就越好。如果程序员只是在不关心任何其他人的情况下完成任务,那么错误的可能性就会更大。
问责制核对清单:
肩胛骨康拉德通常足以帮助。功能规格很好,他们通常会回答所有这些想法。但是,有时与另一个人的谈话可以帮助你,你可以更快地进行更改。
答案 4 :(得分:0)
我通过多年的错误(尽管仍在制作它们)了解到,我想要反复使用或分发的几乎任何东西都需要正确设计。因此,燃烧足够的时间将结束你的乐观。
当受到管理层的压力时,我告诉他们我无论如何都要考虑这个问题,所以我应该在它便宜的时候做。我在纸上也是如此,所以我实际上可以证明我正在做某些事情而且我的手指放在键盘上,这两者都为管理提供了一种舒缓的效果。 ; - )
答案 5 :(得分:0)
冒着听起来很明显的风险 - 悲观。我有一些经历,我认为“这应该需要几个小时”,最终需要花费几天天,因为所有出现意外的小事情。
到目前为止,我发现管理事物的最好方法是(很像安德鲁的答案)将设计和要求作为起点。然后我经历并寻找设计中的弱点,陷阱和其他用例等。我试着把它看作一个批判性的练习 - 还没有编写代码,所以这是完全无情的时间,并寻找每一个弱点。寻找您必须处理的错误条件,以及您认为完成每个功能/功能所需的任何时间,请大量填充该数量。我曾经有过多次将我的初步估计值加倍,但仍然没有那么远。
作为一个程序员来实现项目调试的时间非常困难 - 编写代码很容易估算,但是将其调试成功能有效的代码完全是另一回事。因此,我发现它没有确切的科学,但我只是填充了一大堆任务,所以我有足够的喘息空间进行调试。
另见Evidence Based Scheduling这是FogCreek为其FogBugz产品开发的调度中一个引人入胜的概念。
答案 6 :(得分:0)
你和世界其他地方。
您需要更多更详细的设计,更准确的估计,并且愿意接受有时最佳解决方案不一定是最佳解决方案(例如,您可以在汇编程序中编写一些循环以获得最佳性能,但这将是花费的时间远远超过
for (i=1; i<=10; i++) {}
)。对导弹系统的会计软件包来说,花在做这件事上的时间是否真的值得。
答案 7 :(得分:0)
我喜欢设计,但随着时间的推移,我发现前面的设计很像将城堡建成天空 - 这是太多的猜测,无论受过良好教育,都缺少实际实施和使用设计的关键反馈
所以今天我更愿意接受这一点,在实现设计的过程中,我会学习很多关于它的新东西,并且需要将这些学习反馈到设计中。这样做是一项有趣的技能,包括保持设计灵活性的技巧,保持简单,无重复,内聚和分离,以小的,受控的步骤(=重构)改变设计,并编写必要的广泛的自动化测试套件,使这种变化安全。
对我而言,这似乎是一种更有效的方法,而不是在“前期设计推测”方面做得更好 - 而且另外它使我同样为不可避免的时刻做好准备,因为一个简单的不可思议的变化需要改变设计在要求中。
答案 8 :(得分:0)
分裂,分裂,分裂。列出所有完成项目所需的步骤,然后列出那些步骤需要完成的所有步骤,依此类推,直到达到原子项为止绝对确保你可以在一天或更短的时间内完成。添加所有这些值的持续时间以达到一段时间。
然后翻倍。现在你有一个数字,如果令人沮丧,至少在某种程度上是现实的。
答案 9 :(得分:0)
如果可能,请在发布前“睡在您的设计上”。我发现离开工作后,我常常想到我错过的事情。这通常发生在我睡觉前躺在床上,甚至在第二天洗澡时。
我还发现,有一位我信任的同行/朋友在分发之前会对我所拥有的内容进行评估。其他人几乎总能看到我没想到或误解的东西。
答案 10 :(得分:0)
我喜欢像其他人所说的那样做。在伪代码中记下您的应用程序的流程。这会立即突出显示一些可能需要进一步关注的详细区域,这些区域预先不明显。
对于可以验证您的方法是否满足其需求的业务用户,伪代码也是可读的。
使用伪代码还会创建一组很好的方法,可以在最终解决方案中用作接口。一旦伪代码相当紧张,寻找模式并回顾一些常见的GOF模式。它们不一定非常完美,但是使用它们会使您不得不在以后必须重新编写代码时修改它们。
花一两个小时编写伪代码,以后可以节省一些宝贵的时间: 1.出现了一个对象模型 2.该程序的流程明确为其他人定义 它可以作为您的设计的文档进行一些改进 4.评论更容易添加,并且对于其他人审阅您的代码会更清楚。
祝你好运!
答案 11 :(得分:0)
我发现确保你选择好设计的最佳方法是确保你理解问题,了解你所拥有的限制,并知道什么是必须的和好的。 -haves。
理解这个问题将涉及与有需要的人交谈,并让他们坚持首先需要完成的工作,而不是他们认为应该如何完成。一旦你知道实际发生了什么,你就可以回过头来讨论一下如何做的要求。
了解您的局限性可能非常简单:需要在iPhone上运行;必须是一个Web应用程序;需要与已经存在的Java代码和部署设置集成;等等。这可能非常困难:您不知道您的用户群的潜在规模是多少(数百?数千?百万?);你不知道你是否需要进行本地化(如果你不确定,假设你必须这样做。)
必备品vs,好有可能:这可能是最困难的部分。用户经常对“要求”(“它应该看起来就像Excel”)有情感依恋,而这些要求实际上并不是“必须发生”的一部分。您经常需要兼顾功能与期望以获得可接受的实现。你不能总是给每个人一匹小马。
确保你写下这一切!即使它一直在发展,或者设计很小,有了“这就是我们现在计划做的事情”指南,指导您何时需要做出有关提交资源的决定,这样可以更容易地限制自己实施一个非常酷的whiz-bang功能,而不是一个无聊的必须做的事。
答案 12 :(得分:0)
由于您认识到您需要提供快速解决方案,或许它会让您慢下来意识到如果您在设计上花费更多的前期时间,您可以更快地解决问题并尽快交付。例如,如果你花3个小时设计和30个小时编写代码,这可能意味着如果你花6个小时设计,你可能只需花费10个小时编写代码。 (这些不是实际数字的例子)。您可以尝试在接下来的几个项目中为自己量化。做一些你平时表现的事情,看看你实际做的设计/编码/测试和调试的比例。然后在下一个项目中故意增加您在设计阶段花费的时间百分比,看看它是否缩短了其他阶段所需的时间。由于项目可能完全不同,您将不得不尝试使用此项目以获得真正的基线。将其作为测试,看看您是否可以提高其他阶段的性能,从而提供更快的产品,如果您花费20%的时间或50%的时间或100%的设计时间。
请记住,在此过程的后期,您发现设计问题更难解决(而且更耗时)。