三个月前,我正在做一个项目,然后突然出现了另一个紧急项目,我被要求转移我的注意力。
从明天开始,我将回到旧项目。我意识到我不记得自己在做什么。我不知道从哪里开始。
我该如何记录一个项目,这样无论何时回头,离我离开任何地方都不会花费我几分钟的时间。有最佳做法吗?
三个月前,我正在做一个项目,然后突然出现了另一个紧急项目,我被要求转移我的注意力。
从明天开始,我将回到旧项目。我意识到我不记得自己在做什么。我不知道从哪里开始。
我该如何记录一个项目,这样无论何时回头,离我离开任何地方都不会花费我几分钟的时间。有最佳做法吗?
Answers:
我只是想提供一些建议,这些建议在您当前的情况下将无用,但是您可以立即开始实施它,以在将来提供帮助。
当然,有很明显的候选人,例如待办事项清单和签发日志;查看最近添加的问题应该为您提供一个有关退出项目时的工作线索。
在我之前从事的项目中,人们应该保留项目日志作为质量管理过程的一部分。内容没有明确说明,但其想法是每天记录与项目有关的事情,这可能对将来的继续工作或完成时的审查活动有用;例如:
有关项目质量的意见
该代码可以使用一些重构
进行了快速实施以使其正常工作,但ABC会更好。
您不想正式记录在问题跟踪器中的待办事项/问题
“应该使此方法有效,
x < 0
但是目前不在范围内。
设计决策 -尤其是不重要的决策。
我们的标准排序功能执行快速排序,但是在排序条件下,这并不能保持相等的项目顺序,这是我们在这里需要的。
最明显的算法是ABC,但在这里失败了,因为它
x
可能是负数,因此我们需要通用形式(Wikipedia链接)。
遇到的问题以及如何解决。我个人认为非常重要的一点是:每当遇到问题时,请在日志中记录下来。
签出了代码,但给出了错误XYZ0123,结果我首先不得不将组件C升级到1.2或更高版本。
后两点非常重要。我经常遇到类似的情况或问题-有时是在完全不同的项目中-想到“嗯,我记得花了一天时间,但是又有什么解决办法?”
一段时间后返回项目时,回读项目日志(无论是您自己的日志还是最新的开发人员的日志),应使您重新回到离开时的流程,并警告您一些陷阱。否则可能会再次陷入。
待办事项列表很神奇。通常,您需要为每个项目保留一个活动的待办事项清单,即使在您忙于编程时,如果您想到必须完成的事情而又不能立即执行,那么该清单也会列入清单。将此列表放在电子文件或项目文件夹中的电子表格或文本文件中的知名位置,或在纸质日志中。
另外,每当您离开项目过夜(或在周末)时,记下便笺并在便笺上写下您打算做的下一件事情,然后将其粘贴到监视器上。这样一来,您第二天早上很快就会回来。
编辑:
我应该提及的是,待办事项清单(特别是按地点和项目划分的优先事项清单)是《完成事情》一书的关键部分,我发现这本书很有影响力。
todo
makefile中具有将其转储出去的目标也很有用。
现在,从明天开始,我将回到我的旧项目,并且我意识到我不记得自己在做什么以及从哪里开始!
我的猜测是您还没有完成下一节的任何工作。因此,查找待办事项列表将不起作用。
我希望知道如何记录该项目,这样无论何时回头,从我离开的地方到我走的时间都不会超过几分钟!
首先,您需要一个跟踪待办事项的系统。您现在有这样的系统吗?您如何管理当前的项目工作?
明天我可能会被公共汽车撞到,我的团队会很好地理解我90%以上的动作项目。这是因为我有一个用于记录我的凝聚力的系统:
另外,我使用VCS并在适当的地方注释我的代码。
因为我是主要开发人员,所以这对我和我的团队都有效。您可以为团队使用某种问题跟踪系统。或在使用敏捷时积压。有很多选择。如果您真的对此感兴趣,请继续阅读“完成工作”或其他相关的任务管理方法,这些方法几乎完全是由于您的描述而存在。
系统的细节与其内聚系统无关,您可以使用它。而您使用它。并使用它。这个很重要。比您不使用的完美系统更为重要。不要做“我的大部分工作都在这里,但是有些在我脑海中”,否则您会讨厌自己回到一个项目。
另外,请确保您的注释解释代码“为什么”,而不仅仅是代码“什么”。阅读“这是使用IE8修复错误”并回顾代码的作用比仅仅解释技术细节的注释要容易得多。
我认为,“恢复”代码项目有两个部分:
我认为,如果您以正确的方式进行版本控制,那么这将是您的“另一脑”。
你从哪里离开过?只要您经常提交代码,请查看您的最后一个变更集。它很可能会在您的脑海中慢跑。如果不是,请查看过去的内容,从最早的和重播的提交开始。
至于剩下要做的事情,积压应该可以达到这个目的(或待办事项清单,或者您想命名的任何东西。基本上是将来的项目)。
我不是专职软件开发人员。我是一个在晚上和周末都进行黑客攻击的程序员。因此,当工作或其他非编程性工作具有更高的优先级时,有时我可以花上几天甚至几周的时间,甚至不必一目了然地编写代码。以上已证明是非常有效的。
这并不是一个完整的答案-已经有很多非常好的人提到重要的事情,例如如何使用VCS和项目管理软件-而是在附录中添加了我在其他任何地方都没有看到的几点,我觉得很有帮助,我希望其他人也能有所帮助。
人们通常给TODO列出了他们计划做的事情在未来,但因为节目需要集中,因为我们可以中断在任何时候,我发现写下来它的帮助我在做什么,即使现在,或我将在几秒钟内开始的工作。你可能会觉得你在区是你不可能忘记的解决方案,正好打在你那啊哈的时刻,但是当你的同事你的立方体下降到你展示他的感染脚趾的照片,而你只有开始starting自己的胳膊才能最终摆脱他,您可能希望您写下一个快速便笺,即使只是在Post-It™便笺上也是如此。
当然,使用其他一些更持久的介质可能会更好(我特别喜欢OmniFocus),但是重点是至少要把它放在某个地方,即使您在20分钟之内完成然后扔掉Post-It™。尽管您可能会发现该信息很有用,但可以将时间表或发票发送给客户,或者当老板/客户问您正在从事什么工作并且您忘记时。如果将所有这些注释放到一个盒子,抽屉或文件夹中,那么当遇到一个大的中断(一个中断的项目)时,您就可以浏览它们,并记住为使代码达到目的而做的很多事情返回项目时找到它。
我的办公桌旁边有一个3“ x 4”的白板,所以当我开始一个项目时,我可以集思广益解决我在一个项目中遇到的所有问题的解决方案。它可能是架构图,用例,风险和障碍列表,或者任何与您相关的事物。
一些更形式化的方法要求您以某种纸质或电子格式生成图表和用例等作为“可交付成果”,但是我发现这会带来很多额外的工作,并且会变成一系列以结束而告终的子项目。与主要项目的实际目的背道而驰,只是您必须要做的一部分正式过程,但是没有人关注。至少从我的经验来看,白板是最简单有效的方法。它具有您想要的持久性(使用摄像头),最重要的是可以让您立即提出想法。
我用手中的笔会更好,因此将我的想法倾倒在白色的表面上对我来说很自然,但是如果您觉得不是这种情况,那么以下一些问题可能会帮助您确定相关的内容:
(当我初次写下想法时,我只担心它们对我当前的自我有意义。一旦思想下降,我就可以更批判地看待它们,并进行更改以确保它们对我的未来自我或他人有意义。太担心了即将他人沟通的。你写下来,最初会导致作家的块一个由相互竞争的目标堵塞脑海中首先它弄下来,担心清晰度更高版本)。
我建议您花钱购买一块至少3“ x 4”的体面的白板,并将其挂在正常工作的空间中。与任何虚拟系统相比,物理白板有许多优点。
如果仅在会议室中使用白板,然后用手机拍摄快照,则会失去许多好处。如果您通过编程赚钱,那么买一个像样的白板是值得的。
如果您有其他项目的中断,填补了白板的一个,你可能需要求助于手机上的快照,但至少你必须是 3个月时,“紧急”项目完成后,你必须回到另一个。如果您想在白板上重新创建它,则可能只需要15分钟,您会发现您可以在此过程中进行很多改进,这使得花费很少的时间非常值得。
我发现飞机的隐喻很有帮助:开始和完成项目就像在飞机上飞行一样。如果您在飞行途中纾困,飞机将不仅坐在空中等待您返回飞机,还需要某种方式从当前项目/航班转到下一个项目/航班。实际上,如果您正处于从凤凰城飞往法戈的航班中间,并且被告知您需要中断该航班才能乘坐另一架飞机从丹佛飞往底特律,则需要在丹佛降落第一架飞机(幸运的是,它离您的飞行路线不远-并非总是发生真正的中断),并且有人必须弄清楚如何处理货物和乘客。他们不仅会坐着永远等待。
对于项目而言,这样做的重点是从一个项目过渡到另一个项目会花费大量时间,并留下很多必须解决的失败目标。
在一个项目中有明显的和不可避免的有很多,而你的工作,并且继续在你的脑袋不是每一个想法可以被序列化的书面媒体,而不是那些想法丝毫每次被序列化反序列化时将保持不变。尽管我们可以用书面形式部分地反映我们的想法,但这是一种有损的格式。
问题(如我所见)是项目经理和其他业务人员将项目视为一系列步骤,这些步骤通常可以随意重新排序(除非对其甘特图有明确的依赖性),并且可以轻松地在人们之间分配或延迟到最方便的时间进行业务。
任何进行过大量编程的人都知道,软件项目不能像乐高积木一样被视为可以随意移动。我发现,乘飞机旅行的隐喻至少可以使利益相关者获得一些具体的东西,他们可以思考这些东西,显然不能将其视为一系列异想天开的步骤。至少可以很容易地理解您的观点,即此类中断需要付出一定的代价。当然,这仍然是他们的决定,但是您希望在他们中断一个项目给您另一个项目之前让他们意识到这一点。不要好斗,但是要提供有用的信息和开发人员的有用观点,随时准备从您那里做他们需要的一切,而只是提供您可能不知道的信息,如果您不告诉他们。
有很长的答案。这是关于最能帮助我的一小段内容:
但是,由于缺乏上下文,随着时间的流逝,差异,提交评论,便利贴,待办事项列表或看板可能会被误解。因此,这是最重要的一件事:
main
,对于一个很大的程序来说,它是相当抽象的。然后,我可以更深入地研究,例如,了解程序如何自行清理的体系结构。此外,干净的代码意味着函数/变量/等。具有有意义的名称并说明其含义。如果我改写Spaghetti / Write-Only代码,那么我经常会在第二天的早晨/月/年醒来,看一下我的代码,唯一的想法就是去那里。何时是相同的..
我该如何记录一个项目,这样无论何时回头,离我离开任何地方都不会花费我几分钟的时间。
首先,这意味着您可以在几分钟内轻松掌握项目中的一些高级描述和代码结构,而不是成千上万行没有明显结构和注释的代码。
有最佳做法吗?
以下是我在整个20多年的职业生涯中从小型到大型项目所采用的最佳实践,它们为我和我的团队提供了很好的服务。随着项目的增长,按照列出的顺序进行应用:
使用版本控制可以让您免费跟踪发生了什么,何时以及谁应用了更改。它还使您可以随时轻松回退到早期版本。
模块化您的代码(取决于语言和编程环境,使用类,模块,包,组件)。
记录您的代码。其中包括每个文件顶部的摘要文档(这是做什么的?为什么?如何使用它?),以及函数,过程,类和方法级别的特定注释(它的作用是什么?参数和返回值/类型?副作用?)。
TODO
FIXME
在编码时添加和注释。这有助于记住为什么会不可避免地输入您的代码库,然后稍后再询问WTF?。例如:
//TODO shall actually compute X and return it
... some code that does not compute X yet (maybe returns a fixed value instead)
//FIXME make this constant time instead of n^2 as it is now
... some code that works but is not efficient yet
养成绘制图表以记录结构和复杂行为的习惯,例如模块/对象/系统之间的调用顺序等。就我个人而言,我更喜欢UMLet,因为它易于使用,创建漂亮的图形,并且最重要的是不会妨碍您的操作。但是,当然,您应该使用找到的能完成工作的任何绘图工具。请记住,任何此类图纸的目的都是为了进行简洁的交流,而不是详细说明系统(!!)。
尽早添加单元测试。单元测试不仅非常适合回归测试,而且还是模块使用文档的一种形式。
尽早添加代码外部文档。从自述文件开始,该自述文件描述了运行和开发项目所需的依赖项,如何安装它,如何运行它。
养成自动执行重复性任务的习惯。例如,编译/构建/测试周期应以某种形式编写脚本(例如,在JavaScript使用中grunt
,在Python中fabric
,在Java中Maven
)。当您回来时,这将帮助您快速入门。
随着项目的发展,通过生成源代码文档(使用某种形式的JavaDoc风格的注释和适当的工具从中生成HTML或PDF)来添加更多文档。
如果您的项目超出了单个组件的范围,并且具有更复杂的部署,请确保添加设计和架构文档。再次注意,这样做的目的是传达结构和依赖性,而不是细节。
除了有关项目跟踪,ToDo列表,Trello等的建议外,我读过的一些东西对您在练习TDD时有帮助,这是在您返回项目时总是通过新的失败测试来退出项目(明天) ,下周或下个月)
坐下,进行“运行测试”,然后从上次停下来的地方接起。
next-steps
。我不确定您对修订控制方法的具体细节有什么担心,这与测试失败的基本前提有关,它可以帮助您重新启动大脑。再次,这是在除了标准的方法,例如积压建议,待办列表等
对我而言,我发现恢复项目的最简单方法就是保持工作记录的连续记录。我发现Microsoft的“ OneNote”特别适合保存和分组笔记页面。尤其是,搜索栏使快速查找关于某物的笔记变得极为容易。
我在OneNote中做的一些事情可帮助我恢复项目的进度:
每日/每周日志 -每天或每周保存进度日志,以帮助您确定项目的进度。
待办事项列表 -我有一个常规的待办事项列表,但我还为正在处理的项目保留了一个单独的待办事项列表,这样我就可以记住我尚未为项目做的事情。有时我还会在代码中保留// TODO:项目。
项目注释 -我注意到的内容包括指向问题/项目跟踪项的链接,代码片段,遇到的问题,做出的决策,潜在解决方案的计划和描述,代码更改列表,代码存储库目录的链接,项目的电子邮件以及指向的链接项目文档。
因此,每当我回到项目时,我都可以打开笔记,几乎可以立即看到该项目取得了多少进展,还有多少工作要做,甚至看到了我的思路。