优秀程序员的代码是什么样的?

时间:2008-12-14 14:31:36

标签: coding-style

我是一个业余爱好者程序员(开始使用VBA使excel更快)并且一直在使用VB.NET / C#.NET并且我正在尝试学习ADO.NET。

一直让我感到沮丧的编程方面是“好”的样子?我不是专业人士所以没有什么可比的。是什么让一个更好的程序员? 是吗:

  • 他们对此有了更好的理解 所有对象/类/方法 用给定的语言?
  • 他们的节目效率更高?
  • 他们的节目设计很多 在更好的方面更好 文档,良好的名称选择 用于功能等?

换句话说,如果我要查看专业程序员的代码,我会注意到他们的代码相对于我的第一件事是什么?例如,我读过Wrox出版社的“Professional ASP.NET”等书。该书中的代码示例是“世界级”吗?那是巅峰吗?任何一流的程序员都会查看该代码并认为它​​是好代码吗?

31 个答案:

答案 0 :(得分:125)

以下列表并不全面,但这些是我在考虑您的问题时所考虑的事项。

  • 好的代码组织得很好。类中的数据和操作适合在一起。类之间没有无关的依赖关系。它看起来不像“意大利面条”。

  • 良好的代码注释解释了为什么事情没有完成。代码本身解释了做了什么。评论的需求应该是最小的。

  • 优秀的代码对除了最瞬态的对象之外的所有对象使用有意义的命名约定。某事物的名称是关于何时以及如何使用该物体的信息。

  • 良好的代码经过充分测试。测试用作代码的可执行规范及其使用示例。

  • 好的代码不是“聪明”。它以直截了当的方式做事。

  • 良好的代码是在易于阅读的小型计算单元中开发的。这些单位在整个代码中重复使用。

我还没看过,但是我打算在这个主题上读到的这本书是罗伯特·C·马丁的Clean Code

答案 1 :(得分:93)

您首先注意到的是,他们的代码遵循一致的coding-style。他们总是写相同的结构块,虔诚地缩进并在适当的地方进行评论。

你要注意的第二件事是他们的代码被分割成小方法/函数,最多不超过几十行。它们还使用自描述方法名称,通常它们的代码非常易读。

你注意到的第三件事是,在你稍微讨论代码之后,逻辑很容易理解,易于修改 - 因此易于维护。

之后,您将需要一些软件设计技术方面的知识和经验,以了解他们构建代码体系结构所需的具体选择。

关于书籍,我没有看过许多书籍,其代码可被视为“世界级”。在书中,他们主要尝试提供简单的例子,这些例子可能与解决非常简单的问题有关,但不能反映更复杂的情况。

答案 2 :(得分:69)

引用福勒,总结可读性:

  

任何傻瓜都可以编写计算机可以理解的代码   优秀的程序员编写人类可以理解的代码。

'nough说。

答案 3 :(得分:30)

就个人而言,我必须引用Tim Peters的“禅宗之谜”。它告诉Python程序员他们的代码应该是什么样子,但我发现它基本上适用于所有代码。

  

美丽胜过丑陋。
明确胜过   隐含的。
简单比复杂更好。
复杂更好   比复杂。
扁平比嵌套好。
稀疏是   比密集更好。
可读性很重要。
特殊情况   不足以打破规则。
虽然实用性   打败纯度。
错误不应该默默无闻。
除非   明确地沉默。
面对模糊,拒绝   诱惑猜测。
应该有一个 - 最好只有一个   一种 - 显而易见的方式。
虽然这种方式可能并不明显   起初,除非你是荷兰人。
现在总比没有好。
  虽然现在永远不会比正确更好。
如果   实施很难解释,这是一个坏主意。
如果   实施很容易解释,这可能是个好主意   命名空间是一个很好的主意 - 让我们做更多的事情!

答案 4 :(得分:16)

代码就是诗歌。

从这一逻辑点开始,您可以获得许多令人满意的代码质量。最重要的是,观察代码的读取远远超过它的编写,因此为读者编写代码。为读者重写,重命名,编辑和重构。

关注推论:

读者将在代码创建日期的时间n。为读者编写代码的收益是n的单调递增函数。第一次查看代码的读者用n ==无穷大表示。

换句话说,从编写代码到重新访问代码的时间间隔越大,您就越会感激您为读者写作的努力。此外,您将代码移交给的任何人都将从以读者编写的代码作为最重要的考虑因素中获益匪浅。

第二个推论:

在不考虑读者的情况下编写的代码可能不必要地难以理解或使用。当读者的考虑因素降到某个阈值以下时,读者从代码中获得的值比通过重写代码获得的值少。当发生这种情况时,先前的代码被丢弃,不幸的是,在重写期间会重复很多工作。

第三个推论:

众所周知,必然会有两个问题在一个恶意循环中重复多次,这个循环是由于文档记录不完整,然后是强制重写。

答案 5 :(得分:15)

我已经编程了28年,我觉得这个问题很难回答。对我来说,良好的代码是一个完整的包。代码干净利落,具有有意义的变量和方法名称。它有很好的评论意见,评论代码的意图,而不只是反驳你已经读过的代码。代码以有效的方式完成它应该做的事情,而不浪费资源。它还必须着眼于可维护性。

但最重要的是,它对不同的人意味着不同的东西。我可能将其标记为其他人可能讨厌的优秀代码。好的代码将有一些共同的特征,我认为我已在上面确定。

您可以做的最好的事情就是让自己接触代码。看看其他人的代码。开源项目是一个很好的来源。你会发现好的代码和糟糕的代码。你看的越多,你就越能认识到你认为好的代码和糟糕的代码。

最终你将成为自己的判断者。当你找到喜欢采用它们的风格和技术时,随着时间的推移,你会想出自己的风格,随着时间的推移会发生变化。这里没有人可以挥动魔杖,说出什么是好的,其他任何东西都是坏的。

答案 6 :(得分:11)

阅读“代码完成”一书。这解释了很多关于如何构造代码的想法以及这样做的原因。阅读它应该缩短你的时间,以获得必要的经验,从而告诉他们好坏。

http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1229267173&sr=8-1

答案 7 :(得分:8)

我自己已经编程了将近10年,并与其他人一起工作,我可以毫无偏见地说,优秀程序员与普通程序员代码之间没有区别

所有能胜任的程序员:

  • 正确评论
  • 高效结构
  • 清洁文件

我曾经无意中听到一位同事说“我一直都非常合乎逻辑和理性。我认为这就是我喜欢开发的原因

在我看来,这是普通程序员的想法。在规则和逻辑方面看世界并在设计和编写程序时最终遵守这些规则的人。

专家程序员,理解规则,但也理解他们的背景。这最终导致他们提出新的想法和实现,这是专家程序员的标志。 编程最终是一种艺术形式。

答案 8 :(得分:6)

  • 易于阅读
  • 易于撰写
  • 易于维护

其他一切都是花丝

答案 9 :(得分:6)

简洁地说,可以阅读和理解优秀程序员的代码。

在我看来,优秀的程序员代码与语言无关;无论使用何种编程语言,都可以在很短的时间内以最少的思维阅读和理解编写良好的代码。无论代码是Java,Python,C ++还是Haskell,编写良好的代码都可以被那些甚至没有使用该特定语言编程的人理解。

易于阅读的代码的一些特征是,命名良好的方法,没有“技巧”和错综复杂的“优化”,类是精心设计的,仅举几例。正如其他人所提到的,编码风格是一致的,简洁明了的

例如,前几天,我正在查看TinyMCE的代码,以回答Stack Overflow上的一个问题。它是用JavaScript编写的,这种语言我几乎没用过。然而,由于编码风格和包含的注释,以及代码本身的结构,它是相当容易理解的,并且我能够在几分钟内浏览代码。

在阅读优秀程序员代码方面,对我来说,这本书非常令人大开眼界 Beautiful Code。它有许多由各种编程语言的各种编程项目的作者编写的文章。然而,当我阅读它时,我能理解作者在他的代码中所写的内容,尽管事实上我甚至从未编写过那种特定的语言。

也许我们应该记住的是,编程也是关于通信,不仅是计算机而是人们,所以优秀的程序员代码几乎就像一本写得很好的书,可以沟通向读者介绍它想传达的想法。

答案 10 :(得分:5)

应该很容易理解好的代码 应该评论得很好 困难的部分应该更好地评论。

答案 11 :(得分:4)

好的代码是可读的。在第一次阅读由优秀专业程序员编写的代码时,您可以毫不费力地理解代码的作用。

答案 12 :(得分:3)

而不是重复其他人的好建议,我建议您阅读Steve McConnell撰写的书Code Complete

本质上,它是一本充满了功能和风格的编程最佳实践的书。

答案 13 :(得分:3)

只是想在你的代码中添加我的2美分...评论 - 而且你的代码本身 - 通常 - 应该说出你的代码做了什么,现在它是如何做到的。一旦你有了'客户'代码的概念,这是调用其他代码的代码(最简单的例子是调用方法的代码),你应该总是最担心从“客户端”的角度来理解你的代码。随着代码的增长,你会发现这是......呃,很好。

很多关于优秀代码的其他内容都是关于你将要做出的精神飞跃(当然,如果你注意的话)......其中99%与现在做更多的工作有关,以免你以后的大量工作和可重用性。并且做得对:我几乎总是想要运行其他方式而不是使用正则表达式,但每次进入它们时,我都明白为什么每个人在我工作的每种语言中使用它们(他们是深奥的,但工作,可能不会更好)。

关于是否看书,根据我的经验,我会说绝对不是。查看API和框架以及代码约定和其他人的代码,并使用自己的直觉,并尝试理解为什么它是这样的东西以及事物的含义是什么。书籍中的代码几乎从未做过的事情是计划外的计划,这就是错误检查的全部内容。只有当有人给你发电子邮件并说“我收到错误321”而不是“嘿,应用程序坏了,哟。”时,这才会得到回报。

从程序员的角度和用户的角度来看,良好的代码都是以未来为基础的。

答案 14 :(得分:2)

[纯粹主观回答]
对我来说,好的代码是一种艺术形式,就像一幅画。我可能会更进一步说它实际上是一个包含字符,颜色,代码的“形式”或“结构”的图形,并且所有这些都是如此可读/高效。可读性,结构(即列,缩进,甚至相同长度的变量名称!),颜色(类名,变量名,注释等)的组合都使我喜欢看到的“美丽”图片可以让我非常自豪或非常厌恶我自己的代码。

(如前所述,非常主观的答案。抱歉我的英语。)

答案 15 :(得分:2)

我是Bob Martin的“清洁代码”的推荐。

几年前,“美丽代码”备受好评。

任何麦康奈尔的书都值得一读。

也许“务实的程序员”也会有所帮助。

答案 16 :(得分:1)

我推荐叔叔鲍勃的“干净代码”。但你可能希望看看http://www.amazon.com/Implementation-Patterns-Addison-Wesley-Signature-Kent/dp/0321413091,因为我认为这会更好地处理你的具体问题。好的代码应该跳出页面并告诉你它的功能/工作原理。

答案 17 :(得分:1)

杰夫阿特伍德写了一篇很好的文章,关于程序员是打字员的第一个参考: http://www.codinghorror.com/blog/archives/001188.html

作为打字员时,你总是需要在工作中保持优雅,具有结构和正确的“语法”非常重要。现在将其转换为“编程”类型将会得到相同的结果。

<强>结构

<强>评论

<强>地区

我是一个软件工具,这意味着在我的教育期间我遇到了许多不同的语言,但我的编程总是“感觉”一样,就像我在fekberg.wordpress.com上的写作一样,我有一种“特殊”的方式打字。

现在编写不同的应用程序和不同的语言,如Java,C#,汇编程序,C ++,C我已经达到了我喜欢的“标准”写作。

我将所有内容都视为“框”或区域,每个区域都在解释评论。一个区域可能是“类人”,在这个区域内我有几种属性方法,我可以称之为“访问方法”等,每个属性和区域都有自己的解释注释。

这非常重要,在创建API结构时,我始终会看到我的代码“作为api的一部分”,优雅非常重要。

想一想。另请阅读我在Communication issues when adapting outsourcing上的论文,其中粗略地解释了代码可能发生冲突的错误,Enterpret如你所愿:http://fekberg.wordpress.com/2008/12/14/communication-issues-when-adapting-outsourcing/

答案 18 :(得分:1)

这在福勒的书“重构”中得到了很好的回答,这是他在整本书中描述的所有“气味”的缺失。

答案 19 :(得分:1)

我还没有看到'专业ASP.NET',但如果它比OK好,我会感到惊讶。有些代码非常好,请参阅this question。 (当然,它有所不同,但是接受的答案很难被击败。)

答案 20 :(得分:1)

这似乎(应该是)常见问题解答。最近有关于漂亮代码的an ACM article。似乎有很多强调易于阅读/理解。我认为这是“领域专家易于阅读/理解”的资格。对于任何给定的问题,真正优秀的程序员倾向于使用最好的算法(而不是天真的易于理解的O(n ^ 2)算法),如果你不熟悉算法,即使是好的,也很难理解程序员给出了算法的参考。

没有人是完美的,包括优秀的程序员,但他们的代码倾向于努力

  1. 使用经过验证的算法(而不是天真和特殊的黑客攻击)的正确性和效率
  2. Clarity(参考非平凡算法的意图评论)
  3. 完整性以涵盖基础知识(编码惯例,版本控制,文档,单元测试等)。
  4. 简洁(DRY)
  5. 健壮性(对任意输入和变更请求的中断具有弹性)

答案 21 :(得分:0)

好的代码易于理解,易于维护,易于添加。理想情况下,在不牺牲其他指标的情况下,它也尽可能高效。

答案 22 :(得分:0)

对我而言,伟大的代码是易于掌握而又复杂的东西。让你走的东西,“哇,当然,为什么我不这么想?”。真正好的代码并不难理解,它只是简单地以一种直接的方式解决手头的问题(或者是递归方式,如果这更简单的话)。

答案 23 :(得分:0)

好的代码是你知道方法从名称中做什么的地方。糟糕的代码是你必须弄清楚代码的作用,以理解名称。

好的代码就是如果你阅读它,你可以在比读它更多的时间内理解它所做的事情。糟糕的代码是你最终看着它试图解决它的问题。

好的代码的命名方式使得无需进行简单的注释。

好的代码往往很短。

优秀的代码可以重复使用来完成它在其他任何地方所做的事情,因为它不依赖于与其目的无关的东西。

良好的代码通常是一组简单的工具来完成简单的工作(以组织良好的方式组合起来完成更复杂的工作)。糟糕的代码往往是巨大的多用途工具,易于破解且难以使用。

答案 24 :(得分:0)

代码反映了程序员的技能和思维方式。优秀的程序员总是关注未来 - 当需求或环境与他们今天不完全相同时,代码将如何运作。它将如何scalabale?当我不是维护这段代码的人时,会有多方便?代码的可重用性如何,以便其他人做类似的事情可以重用代码而不是再次编写代码。当其他人试图理解我写的代码时会怎样。

当一个程序员有这种心态时,所有其他的东西都很好地落实到位。

注意:许多程序员随着时间的推移处理代码库,并且通常没有针对程序员的特定代码库。因此,良好的代码反映了公司的所有标准和员工素质。

答案 25 :(得分:0)

(我在下面使用“他”,因为这是我渴望的人,有时会成功)。

我相信一个优秀的程序员哲学的核心是他总是在思考“我将来会为自己编写代码,因为我将忘记所有关于这个任务,我为什么要努力,有什么风险和甚至这个代码应该如何工作。“

因此,他的代码必须:

  1. 工作(代码得到错误答案的速度并不重要。在现实世界中没有任何部分功劳。)
  2. 解释他是如何知道此代码有效的。这是文档(javadoc是我选择的工具),异常处理和测试代码的组合。从一个非常真实的意义上讲,我认为,对于行,测试代码比功能代码更有价值,如果没有其他原因,它解释“这个代码工作,这是应该如何使用,这就是为什么我应该得到支付“。
  3. 得到维护。死代码是一场噩梦。遗留代码维护是一件苦差事,但必须完成(并记住,它离开你的桌子时它是“遗留的”)。
  4. 另一方面,我相信优秀的程序员不应该做这些事情:

    1. 对格式化有所顾忌。有许多IDE,编辑器和漂亮的打印机可以将代码格式化为您认为合适的标准或个人偏好。我使用Netbeans,我设置了一次格式选项,然后偶尔点击alt-shift-F。确定您希望代码的外观,设置环境并让工具执行繁琐的工作。
    2. 以牺牲人类交流为代价,着眼于命名惯例。如果命名约定引导您将命名类“IElephantProviderSupportAbstractManagerSupport”而非“Zookeeper”命名,请在为下一个人创建之前更改标准。
    3. 忘记他是与一群真实的人一起工作的。
    4. 忘记现在编码错误的主要来源是他的键盘。如果出现错误或错误,他应该首先考虑自己。
    5. 忘记周围的事情。他现在所做的任何工作都是为了让未来的读者更容易理解他的代码,这几乎肯定会让他直接受益(因为谁会成为第一个被要求查看他的代码的人?他是)。

答案 26 :(得分:0)

  • 最好的代码有一定的优雅,一旦你看到就会认出来。
  • 外观精致,注重细节。它显然是由有技巧的人制作的,并且有一个关于它的艺术 - 你可以说它看起来像雕刻和抛光,而不是粗糙和准备。
  • 一致且易读。
  • 它分为小型,高度凝聚力的功能,每个功能都做一件事并做得很好。
  • 它是最小耦合的,意味着依赖性很少且严格控制, 通常是......
  • 函数和类依赖于抽象而不是实现。

答案 27 :(得分:0)

我有一个很好的例子:

阅读GWT(google web tookit)源代码,你会看到每个傻瓜都理解它(有些英文书比这段代码更难阅读。)

答案 28 :(得分:0)

如果您编写C ++代码,那么我们在uni上提到了一本非常好的书,其中包含了优秀的编码标准:“ C ++编码标准:101规则,指南和最佳实践”作者:Herb Sutter,Andrei Alexandrescu和Bjarne Stroustrup。

答案 29 :(得分:0)

具有讽刺意味的是,更好的程序员 不那么必不可少他/她因为生成的代码可以被任何人更好地维护(如Eran Galperin的一般同意所述)。 / p>

我的经验告诉相反的情况也是如此。 更糟糕的程序员 更难以维护他/她的代码是,因此更不可或缺他/她变成了,因为没有其他灵魂可以理解谜语产生了。

答案 30 :(得分:0)

  1. 工作
  2. 它具有证明其有效的单元测试
  3. 剩下的就是结冰......