做的比完美的要好吗? - 第2部分
有关为上述问题找到正确答案的更多见解和想法。
第1部分以我的代码正常工作结束,但只有一部分(3个输入中的2个)。 经过大量的重构过程,其中我能够修复一个部分但又破坏了另一个部分,我了解到我必须从头开始放弃我的自我并对我的算法实现产生怀疑。 这并不容易,但是必须做到。
反思并挑战自己的工作,原来是我本可以做的最好的事情。 我又一次问自己-我忠于算法的快乐流程吗? 我能看到更大的图景吗? 我真的需要保留2个不同的队列吗? 我是否在正确的位置“发送”了数据包? 回答这些问题使我意识到我的某些实现需要更改,无论是主要的还是次要的。 进行此回滚阶段使我充满信心,并指出了我需要修复和重构的内容。 我什至喜欢调试过程(通常会感到恐惧)。
最后,所有3个输入都是正确的,原始项目的运行时间大大加快,并且内存使用量也减少了。
在重新开始之前,我想分享一些从追求最佳实践(也称为完美)中汲取的具体经验教训,而不仅仅是从该项目的工作中学到的东西。
对象/方法/数据结构不存在,您需要吗? 创造它。
STL的队列是我决定用C ++而不是C来实现项目的主要原因,它们提供了我需要的确切功能。 好吧,几乎完全一样。 在流程的某个阶段,我需要遍历队列,这不是您对队列所做的事情。 在线寻找解决方案时,我看到的答案大多是“如果您需要迭代,不需要队列,请使用列表”,但是列表并不能给我所有的队列好处。 我决定创建一个函数,该函数将队列的“快照”作为列表,以便对其进行迭代,而不会影响原始队列:
区域情报研究所
在概述代码中的内存分配并确保自己正在“清理”自己时,我的(出色的)导师向我介绍了RAII设计模式和shared_ptr的用法。 我决定使用它,并采用这种思维方式-在当前没有资源使用的情况下,应将其从内存中释放出来。 这也需要重构和另一组测试,但是,这也是我一直在寻找,学习新方法并尽可能完美地做事的目的。
编译“聚会”
为了保持最佳实践,我决定拆分文件,为代码中的每个对象提供不同的文件(和标头)。 您可能会想-有什么大不了的? 这是编译器进入的地方。我几乎放弃了与正在向我抛出不清楚错误的编译器的战斗,但是我处于一种“完美”的状态。 多亏了我的导师,我逐步进行了此过程,以消除问题并了解真正困扰编译器的问题。 这花了一些时间,但是我对编译过程学到了很多东西,我可以自信地说编译错误不再让我感到恐惧了:)
我的绘画
我一直在指着他们,我想分享最后一幅建筑图,我一直遵循直到最后一行:
我做完了吗 等等,我想要“完美”!
我的项目完美吗? 可能不是,还有很多其他事情可以使它变得更好(更明智的数据结构,编译优化,测试和文档丢失等),但是我实现了我的目标,并且做到了。 我认为,作为软件工程师,我应该采取始终以实现“完美”为目标的方法。 但是,该项目向我表明,这需要时间和精力,而在现实生活中,这并非总是如此。 做的比完美的好吗? 不,但是您定义了什么意味着完美。
您可以在这里找到我的代码,很想听听您的建议和意见,因为它可以帮助我成为一名更好的软件工程师。
From: https://hackernoon.com/is-done-better-than-perfect-part-2-3d05ca67a937