伟大的记忆是伟大的编程的要求

时间:2009-02-21 08:15:11

标签: memory

你认为拥有一个伟大的记忆是一个伟大的程序员吗?

我不认为自己是一个优秀的程序员,但我认为我很体面。但我的记忆真的很糟糕,所以我发现自己总是不得不提醒自己该怎么做。我的意思是“我知道在哪里看”但有时它让我觉得我只是一个蹩脚的程序员。更糟糕的是,我总是忘记源代码中的内容或我在某些情况下使用的算法。

回想一下你在生活中遇到过的优秀程序员,难道他们似乎都没有惊人的回忆吗?

24 个答案:

答案 0 :(得分:48)

当然很有帮助,但这里是Einstein's number

  记者采访了艾伯特   爱因斯坦。在采访结束时,   记者问他是否可以   爱因斯坦的电话号码,所以他可以   如果他还有其他问题,请致电。

     

“当然”爱因斯坦回答道。他   拿起电话簿和   抬起他的电话号码,然后写道   它放在一张纸上,交给他   记者。

     记者惊慌失措地说,“你   被认为是最聪明的人   在世界上,你不记得了   你自己的电话号码?“

     爱因斯坦回答说:“我为什么要这样做   当我知道在哪里时,记住一些东西   找到它?“

答案 1 :(得分:19)

将您的短期记忆视为堆叠(非静态),并且不要期待更多。我回到了一个月前我写的代码,它几乎就像别人写的那样......它只需要一段时间才能回到同一区域。

我被戏弄了,经常因为面包屑而给自己留下评论......但它确实有效。如果我完成一些功能并说“AHA,那绝对是非常棒的!”,我会立即评论我的复杂性,因为我肯定会忘记。

现在,用两个问题回答一个问题:

  1. 上周三你有什么午餐?
  2. hash_foo()中'counter'的目的是什么?
  3. 至少,使用#2,你可以快速返回并查看/记住。

答案 2 :(得分:16)

只要你能记住g-o-o-g-l-e是如何拼写的,你就没事了。 :)

但严重的是,你确实需要在yoru短期记忆中同时记录几件事。我认为长期记忆不那么重要。只要你知道存在某些东西,你之前就已经看到了某些东西,然后当它变得相关时,你会知道你可以挖掘它。

经验丰富的程序员通常可以反复使用API​​,细节等等,但根据我的经验,从不是一个坐下来记忆死记硬背的案例。这是一次又一次地使用东西的自然结果。

答案 3 :(得分:16)

我有这个同事编写非常糟糕的代码,难以维护。我得出结论,他的问题是好记忆。他只是能够记住他在哪里放置了什么功能。因此,他不必编写不言自明的代码。他只记得那个垃圾。我们其他人很难搞清楚他的代码。

我确信好记忆不是那个家伙唯一的问题。但我相信如果他的记忆变得更糟,他的代码会有所改善。

答案 4 :(得分:14)

我会说相反,拥有良好的记忆可能会导致编写只有作者可以理解的代码,因为她记得其逻辑的细节。另一方面,我记忆力不好,记录我的代码并尽可能清楚地写出来。

答案 5 :(得分:6)

我只用一个词就可以回答:NO。拥有记忆所有关于编程的美好记忆不是必须的。经验和实践中的繁琐学习是最好的。

我也经历过这个。如果您有足够的经验(或可能是几年)创建应用最佳实践的软件,那么您就是自己的工作或用于创建软件的编程语言的真正掌握者。如果你有不好的回忆,请不要难过,但努力学习和练习可以打败你的记忆力弱点。

答案 6 :(得分:6)

老实说,我发现自己的记忆力很差,甚至是短期记忆力差。糟糕的短期记忆真的迫使你打破分离的担忧。最终结果是非常干净,非常简单,封装好的代码。我实际上有很好的短期记忆,但我已经学会了尝试真的很难在一些编写代码的经历之后不使用它而我分心的时候我不能真正保留很多。我真的很震惊地发现代码实际上比我过去开发的代码要清晰得多。

长期记忆力不佳是一种资产,因为你最终会对如何查找和学习技术,API,算法等进行自我训练。它还倾向于鼓励你找到一小组常见的主题来指导你在你的工作中。

总而言之,优秀程序员的标志不是复杂性(没有良好的记忆就很难实现),而是简单性(本质上不需要太多内存)。

答案 7 :(得分:5)

对我来说,世界上有两种程序员。第一个出生是为了做到这一点,第二个是学到的。在这两个群体中,他们的范围从令人难以置信的贫穷到令人难以置信的伟大。记忆是否表示这些评级?不,绝对不是。虽然良好的记忆力可以帮助你学习,但没有什么比练习和理解更能帮助你。毕竟,能够记住整个百科全书百科全书,如果没有理解就没有任何意义。我的服务器存储是一个典型的例子。

编程是关于逻辑的,包括代码和解决问题的方法。如果你想要清晰,易于理解的代码,那么你很可能会将问题分解成小的可管理的块(即在你的整体中适合你的头脑)并在每一个上工作。然后,每个函数都会缩减为一个命令,以用于下一个复杂阶段。在下一阶段结束时,如果还有另一个阶段,您将再次拥有一组单个命令来构建。逻辑命名,逻辑分区,逻辑汇编......我认为我的逻辑点正确;)

我的记忆令人震惊,我的意思是骇人听闻。我可以介绍给3个人,到时候#3的名字就说我已经忘记了#1是谁。我仍然可以写一些好的代码,而不是每次或每天;当你在这个区域时,它就是别的东西,那时艺术。所以,把你的记忆放在一边,让自己成为一个非常安静的空间或粉红色的噪音发生器并潜入。唯一能使你成为更好的程序员的是练习,练习和练习。唯一要记住的是,编程是一种技能和技能,并且最好在能给予建设性批评和建议的朋友中实践......比如Stack Overflow:)

对这个答案的大部分道歉,但我不记得我已经写过了什么;)

答案 8 :(得分:4)

拥有良好的记忆力非常有用,但肯定不是必需的。我会说,并不是说伟大的程序员有很好的记忆,而是他们花了很多时间调查甚至最小的问题,这些问题可以提高他们的理解并提高回忆率。如果你花了4分钟解决问题(谷歌搜索或询问SO),那么你可能不会记得你在4个月后再次点击时的分辨率。 IT可能是一种进化特征,也可能只是一种糟糕的记忆=)

优秀的程序员也有充分考虑过的原则,这些原则允许他们在不进行二次猜测的情况下进行自动驾驶。一套好的原则也通过强化来实现一致性和可预测性(这是一种记忆质量)。

这也扩展到其他领域。国际象棋大师可以回想起40年前的整场比赛。那是因为他们记住了模式(开局,变化,导致最终游戏的动作的根本原因和影响等)。这有助于将个人移动分组。

在软件中,工具可以像自动完成或具有KB / Wiki和可搜索的登记历史等可以提供帮助。

答案 9 :(得分:4)

没有。但也许它可以使你很棒......

编程艺术(可能 艺术)能够以这样的方式处理问题,即使你有局限性(例如不完美的记忆),你也可以掌握它们的全部内容。这是因为每个人 - 包括我们最聪明的人 - 都有局限性。陷入你的局限并不表示你有局限性,而是你进一步接触的迹象。

这种艺术(就我所知)包括分而治之(使用各种模块,以匹配问题的形状);使用标准技术来传达您的意图(成语,OO 设计模式只是一个);分离出问题的核心(这个问题与代码无关:它是关于问题的);当然还有评论。

我曾经认为好的代码是自我记录的(甚至,代码是真理),但是最近我正在编写解析器,并且在评论中包含CFG是非常有帮助的参考,因为它更简单地表示代码的意图。

编码员必须知道他们的局限性。期望在几个月之后对某些东西有同样的把握是不现实的,就像你在它的厚重之中一样。以上所有都涉及接受该问题,并致力于解决方案。它不仅使您的代码更容易让您在以后掌握,它还使其他人更容易掌握......但最重要的是,我坚信更清晰,更简单的代码从根本上说是超越性的更好的代码< / em>的

有能力的程序员完全了解自己头骨的严格限制;因此,他完全谦虚地接近编程任务,除此之外,他还避免像瘟疫那样聪明的伎俩。 - Dijkstra

答案 10 :(得分:4)

针对Edsger Dijkstra,一位称职的程序员完全了解自己头骨的有限尺寸。你没有掌握的细节越多,就越能解决手头的问题。

非常模块化您的代码,重构代码,将漂亮的算法打包到对象,并使用这些对象,这样,您不必总是“微记住”程序的每个实现细节。 / p>

答案 11 :(得分:3)

没有。从长远来看,忘记你所知道并继续学习的能力至少同样重要。

好的笔记和书签以及网络搜索都有很长的路要走。

记住非常简单的事情是精彩编程所必需的。事情就像“坚持下去”一样简单。

显示器另一侧的有趣视角:Locality of Reference

答案 12 :(得分:2)

我认为拥有良好的记忆力有助于快速学习新事物

这并不意味着要成为一名优秀的程序员。

事实上,它更多的是关于智能而不是内存功能,但是能够识别某些特性并将其与编程技能进行比较是一个复杂的主题。 ,并能够检索任何相关信息。

这是大脑的奥秘。

答案 13 :(得分:2)

我认为拥有良好记忆(谦虚点:我有良好的记忆力)的一个好处是能够在不在电脑前的时候思考。

例如,当建议为您的应用添加一些新功能时,您可能会在会议中 可以吗?它可能需要多长时间?如果您可以在脑海中走过250k的位置,这些问题更容易回答。

那就是说,我在其他人的意见中发现了一些事实,即我自己的代码可能不太清楚,因为我可以更好地记住它。

答案 14 :(得分:2)

奥卡姆的剃刀表明,一个更简单的理论更有可能成为现实。

如果代码是理论,描述输入到输出,那么使用预期习语和库的更短代码更可能是“真实的” - 也就是说,它更有可能捕获解决方案的本质,所以它会推广到你没想到的输入。

更短,更令人惊讶的代码更容易记住。

答案 15 :(得分:2)

我会说这是伟大而快速的必要条件。我对编程细节的记忆是可以的(但我已经谷歌了)。但是,当我坐在我主要编写的应用程序(约30-40 k代码行)前面时,我能够将其结构几乎完全加载到我的内存中。我可以在几秒钟内找到我正在做某事的方式,并回想一下为什么我按照我的方式实现它。这是非常宝贵的。到了上午11点,我能够比其他人整天做更多的工作。现在,这并不能使我成为一名优秀的程序员,但它确实使我成为一名极具生产力的高效程序员。这让我有时间重构,编写额外代码,浏览SO,抓一小时午餐等等。

答案 16 :(得分:2)

我见过的一些编写得最好的代码是以这样一种方式编写的,即每个设计决策都是不可避免的,代码读作自己的解释。这比要求读者(或者更糟糕的是,维护者)的代码更强>更好的恕我直言,以保留大量的任意细节。

代码中我自己的复杂性索引是“我必须记住多少东西才能理解这一行?”

更糟糕的是。

答案 17 :(得分:2)

这一切都取决于你的美好记忆所记得的......

我在同一个项目上工作了10年左右,我不记得每一行,是谁写的,为什么。

但是......我几乎可以记住所有用户请求和用户问题。谁想要什么,什么时候。

我几乎可以记住我们所拥有的所有支持问题。

查找旧代码很简单 - 我们有很好的工具。找到旧问题是一个更抽象的过程:我们有JIRA和Wiki,但有时它们不会削减它,因为它们无法提供语义含义。

因此。注意真正重要的事情并记住这一点。

答案 18 :(得分:2)

与实际计算机相比,记忆力差的程序员就像Universal Turing machines一样:从技术上讲,你可以通过引用你或别人在某处录制的信息来完成同样的事情......这可能需要更长的时间。 ...

答案 19 :(得分:2)

我认为能够记住具有不同能力程度的不同类型的事物是可能的。

例如,我有时会发现我对随机事实和数据以及我已经或将要做的事情都有相当糟糕的记忆 - 后者意味着我发现错误跟踪软件是一个非常宝贵的工具

另一方面,我记得我编写的复杂软件的结构,以及在哪里找到特定的东西。

这可能与逻辑关联有关。精心设计的软件应该(理论上)具有逻辑结构,如果您的大脑以这种方式接线,可以更容易存储在您的记忆中。

然而,随机信息可能没有这些关联,使它们更难记住。

答案 20 :(得分:1)

拥有足够强大的内存来容纳你今天需要使用的东西是重要的部分。如果你一直在寻找同一个问题的答案,你可能会有一个弱记忆。

最重要的是记住你可以在哪里找到答案。我有时会在有些复杂的主题上写博客,所以我有机会在需要时找到它们。但我不会试图永久地抓住它们,因为我可以搜索我自己的博客并在以后找到它们。我对其他人的博客做了同样的事情,我知道哪些博客可以找到某些类型的答案。

当其他所有方法都失败时,谷歌吧!

答案 21 :(得分:1)

只是一个简单的评论“重复是学习的母亲”,如果你有好的/坏的记忆并不重要。您在程序中使用的功能更多,您将记住最好的功能。另外,在我的情况下,我有互联网,当我不记得我刚问的东西,即使这是一个拙劣或简单的问题,很多时候我记得答案后我发布问题然后我很快发布答案。问题是你多长时间投入工作......

:)

答案 22 :(得分:1)

我曾经认为拥有良好的记忆力可以节省时间,因为你记得的次数越多,花在寻找事情上的时间就越少,但是工具和IDE现在已经变得如此之好,我曾经记过很多东西,如语法和只需几次击键即可快速获得各种代码片段。这一点,以及该领域的信息量增长速度超过任何致命的程序员可以跟上的事实,使我认为记忆不再那么重要。更重要的是,能够很好地访问和组织有用的信息。

答案 23 :(得分:1)

我认为这取决于。程序员的记忆非常重要。短期和长期。但是,你使用那些记忆是重要的。作为程序员,如果你用它来记住API的细微差别,那么我会说你在浪费你的记忆。

最终,我试着用我的记忆来记住重要的事情以及我以后不能轻易找到的任何事情。我通常会将API内容放在短期内存中,并使用google和intellisense帮助我了解具体内容。另一方面,设计模式,方法,从经验中汲取的经验教训通常都是我尝试用于长期记忆的,所以我可以在将来有效地使用它,而不必重新学习所有内容。

简而言之,是程序员需要良好的记忆......无论是长期还是短期。但是他们需要明智地使用那种记忆......而且,我认为,这对于一个伟大的程序员来说是不同的。