好的程序员的代码是什么样的?[关闭]


90

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

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

  • 他们对给定语言的所有对象/类/方法有更好的理解?
  • 他们的程序效率更高?
  • 他们的程序设计在更好的文档,对函数名称的选择等方面要好得多?

换句话说,如果我看一个专业程序员的代码,关于他们相对于我的代码的第一件事是什么?例如,我读过Wrox press的“ Professional ASP.NET”之类的书。那本书中的代码示例是“世界一流的”吗?那是顶峰吗?任何顶尖的程序员都会看那个代码并认为它​​是好代码吗?

Answers:


131

下面的列表并不全面,但这是我在考虑您的问题时想到的事情。

  • 好的代码井井有条。类中的数据和操作可以放在一起。类之间没有多余的依赖关系。它看起来不像“意大利面”。

  • 好的代码注释说明了为什么不做事情而不是做什么。代码本身说明了完成的操作。评论的需求应该最少。

  • 好的代码对所有对象(除了最短暂的对象)都使用有意义的命名约定。事物的名称可提供有关何时以及如何使用该对象的信息。

  • 好的代码已经过测试。测试是代码的可执行规范及其使用示例。

  • 好的代码不是“聪明的”。它以简单明了的方式处理事情。

  • 好的代码以小的,易于阅读的计算单元开发。这些单元在整个代码中都可以重用。

我还没有读过,但是我打算读的这本书是Robert C. Martin的Clean Code


9
非常好点。我特别喜欢“好的代码不聪明”的说法。编写其他人可读和可维护的代码非常困难。编写没人能理解的“狗的早餐”代码(一段时间后包括您自己)是世界上最简单的事情。
斯坦·奥斯姆(SteinÅsmul),2009年

3
好的代码不是“聪明的”。它以简单明了的方式处理事情。最好的部分
nawfal

2
马丁的清洁法典是一本好书。从根本上说,好的编程就是好的写作。这听起来可能很疯狂,但是我建议您阅读Orwell的“政治与英语”。它很短,但是您会发现奥威尔的观察与马丁等人的著作有很多重叠之处。难怪像马丁这样的人既是伟大的作家又是伟大的程序员。
0x1mason 2012年

@tvanfosson您现在看过这本书吗?:-)
Natan Streppel 2013年

我从那本书中学到了很多东西,读起来也不乏味。
reggie 2014年

94

您会注意到的第一件事是他们的代码遵循一致的编码风格。他们总是将自己的结构块写成相同的块,虔诚地缩进并在适当的地方发表评论。

您会注意到的第二件事是,它们的代码被细分为一些小的方法/函数,最多不超过几十行。他们还使用自我描述的方法名称,并且通常它们的代码可读性强。

在弄乱了一些代码之后,您会注意到的第三件事是该逻辑易于遵循,易于修改-因此易于维护。

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

关于书籍,我还没有看到很多可以将代码视为“世界一流”的书籍。他们在书中主要尝试提供简单的示例,这些示例可能与解决非常简单的问题有关,但并不能反映更复杂的情况。


1
+1可以非常有效地进行汇总。可以添加的另一件事是避免过多的嵌套分支。可能很难接受之后,可能会接受两个级别。
纳文

你是对的。我考虑过添加它,但是认为它可能太具体了
Eran Galperin

真的很好的总结。关于几行代码,我认为对于初学者来说,这是干净代码的结果,而不是获取干净代码的一种方式,这是很好的-不要强迫自己编写小函数,您会做的无论如何,如果您的设计遵循例如KISS原则。
克莱姆

无论是目标还是结果,我都不会过分强调“小功能”。太多的小功能跟不透明的代码页一样难于遵循。
staticsan

1
尽管有时是不可避免的,但通常来说,当我看长方法时,我认为“此方法是否要做很多事情?如何用有意义的命名方法替换某些逻辑块?” 我相信遵循由这种方法组成的逻辑比尝试一次消化所有逻辑要容易得多
Eran Galperin

71

引用福勒,总结可读性:

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

没说。


Whoa +1,因为又短又甜蜜
-devsaw

5
好吧,这里有用Perl编写的所有代码。
我将

无论我写什么我的实验室老师都无法理解:p
Prakash Bala

32

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

美丽胜于丑陋。
显式胜于隐式。
简单胜于复杂。
复杂胜于复杂。
扁平比嵌套更好。
稀疏胜于密集。
可读性很重要。
特殊情况不足以违反规则。
尽管实用性胜过纯度。
错误绝不能默默传递。
除非明确地保持沉默。
面对模棱两可,拒绝猜测的诱惑。
应该有一种-最好只有一种-显而易见的方法。
尽管除非您是荷兰人,否则一开始这种方式可能并不明显。
现在总比没有好。
虽然从来没有比这更好正确的现在。
如果实现难以解释,那是个坏主意。
如果实现易于解释,则可能是个好主意。
命名空间是一个很棒的主意-让我们做更多这些吧!


2
唯一的问题是“应该有一种-最好只有一种-显而易见的方法。” 显而易见的方法在很大程度上取决于您对问题的思考方式。这势在必行。
grom

“扁平比嵌套更好”是非常可疑的。
伊尔默

16

代码是诗歌。

从逻辑的这一点开始,您可以得出许多理想的代码质量。最重要的是,观察代码的读取远比编写的要多,因此为读者编写代码。为阅读器重写,重命名,编辑和重构。

推论:

在代码创建日期的第n个时间,您就是您了。为阅读器编写代码的收益是n的单调递增函数。n == infinity表示第一次查看您的代码的读者。

换句话说,从编写代码到重新访问代码之间的时间间隔越大,您为自己的写作而付出的努力就会越多。同样,将您的代码交出的任何人都将从与读者一起编写的代码中获得最大利益,这是首要考虑。

第二个推论:

如果没有为读者考虑而编写的代码可能会变得不必要地难以理解或使用。当对阅读器的考虑降到某个阈值以下时,阅读器从代码中获得的值要比重写代码所获得的值少。发生这种情况时,先前的代码将被丢弃,并且可悲的是,在重写过程中重复了很多工作。

第三推论:

众所周知,推论二会在文档记录不严密的恶意循环中多次重复自己,然后进行强制重写。


除了代码之外,确切的含义应该很明显。不过+1
Rik

曾经看到Richard Gabriel向程序员谈论他的写作诗。花了我一段时间建立连接。
托尔比约恩Ravn的安德森

15

我已经编程28年了,我发现这个问题很难回答。对我来说,好的代码是一个完整的程序包。该代码编写清晰,带有有意义的变量和方法名称。它的注释位置很好,可以注释代码的意图,而不仅仅是重新定义您已经可以阅读的代码。该代码以高效的方式完成了预期的工作,而不会浪费资源。还必须着眼于可维护性来编写它。

最重要的是,对于不同的人来说,这意味着不同的事情。我可能将其标记为别人可能会讨厌的好代码。好的代码将具有我在上面已经确定的一些共同特征。

您能做的最好的事情就是让自己接触代码。看别人的代码。开源项目是一个很好的来源。您会发现好的代码和坏的代码。您看得越多,就越能识别您认为好的代码和不好的代码。

最终,您将成为自己的法官。当您发现喜欢采用的样式和技术时,随着时间的流逝,您会想到自己的样式,并且随着时间的推移会发生变化。这里没有人可以挥动魔杖说出什么是好事,还有其他什么不好的事。



8

我本人已经进行了将近10年的编程工作,并且与其他人一起工作,我可以毫无偏见地说,好的程序员和普通的程序员代码没有区别

所有合格的程序员:

  • 正确评论
  • 高效结构
  • 干净地记录文件

我曾经听过一个同事说:“ 我一直都很理性和理性。我认为这就是为什么我喜欢发展

我认为,这是普通程序员的想法。一个从规则和逻辑的角度看待世界并最终在设计和编写程序时遵循这些规则的人。

专业的程序员不仅了解规则,而且了解其上下文。这最终导致他们提出新的想法和实现方式,这是专家程序员的标志。编程最终是一种艺术形式。


与其说是艺术,不如说是工艺品。
托尔比约恩Ravn的安德森

老实说,我最喜欢这个定义。我知道许多相信超硬和快速规则的开发人员,却看不到为什么制定这些规则并且在某些情况下有可能被打破的更大前景
Lance Bryant

6

简而言之,可以阅读和理解好的程序员代码。

我认为,好的程序员代码与语言无关;无论使用哪种编程语言,都可以在短时间内以最少的时间阅读和理解编写良好的代码。不管代码是Java,Python,C ++还是Haskell,编写良好代码的人都可以理解,甚至不使用该特定语言进行编程的人也可以理解。

易于阅读的代码的一些特征是:名称明确的方法,没有“技巧”和复杂的“优化”,类的设计合理,仅举几例。正如其他人提到的那样,编码风格是一致,简洁和直接的

例如,前几天,我正在看TinyMCE的代码,以回答有关Stack Overflow的问题之一。它是用JavaScript编写的,这是我很少使用的语言。但是,由于包含了编码风格和注释,以及代码本身的结构,因此它是可以理解的,并且我能够在几分钟内浏览代码。

就阅读优秀的程序员代码而言,一本对我大开眼界的书是Beautiful Code。它有许多由各种编程项目的作者以各种编程语言编写的文章。但是,当我阅读它时,尽管我什至从未使用过这种特定语言进行编程,但我仍能理解作者在用他的代码编写的内容。

也许我们应该牢记的是,编程不仅与计算机有关,而且还与人有关。因此,好的程序员的代码几乎就像一本写得很好的书,它可以向读者传达它想要传达的思想。 。


我认为,好的程序员代码是与语言无关的+1
nawfal 2011年

6
  • 易于阅读
  • 容易写
  • 易于维护

其他一切都是花丝


程序员A的“易于阅读”和程序员B的“易于维护”是两个相互矛盾的目标,它们都是无法实现的。任何编码都会根据业务优先级在这2个之间进行折衷。编写对其他任何人都易于阅读的代码,对于编写该代码的人而言,其维护性较差。
羊驼

@alpav:您说的话对于不合格的程序员绝对是正确的,对于中级和专业程序员而言却不是,因为他们知道一年内他们将不得不维护自己的代码而没有内存,因此他们希望它完全易于阅读且易于理解。保持。他们可以实现,而我已经重复了30年,您完全错了。
大吼

1
alpav:能否举一个例子说明两者之间是如何冲突的?它们似乎与我完全吻合:如果看不懂,如何维护?
肯(Ken)

5

好的代码应该容易理解。
应该对此进行评论。
困难的部分应该被更好地评论。


我不确定您是否可以说“好的代码应该容易理解”-有些代码执行的功能非常复杂,这些功能本身并不容易理解,因此无法立即理解您无法理解的代码就是不好的代码-可能很棒复杂概念的代码。

复杂的好代码会被视为聪明的代码吗?
kevindaub,

4

好的代码是可读的。您可以很容易地理解,由一名专业的程序员编写的代码在第一次读取时代码的作用。


不幸的是,“可读”是一个主观的东西。
Gewthen

3

与其重复其他人的出色建议,不如建议您阅读史蒂夫·麦康奈尔的《代码完成》

从本质上讲,这是一本书,其中包含有关功能和样式的编程最佳实践。


2

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

(如前所述,非常主观的答案。对不起,我的英语。)


2

我赞同鲍勃·马丁(Bob Martin)的“清洁代码”的建议。

几年前,《美丽的密码》广受好评。

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

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


2

只是想在代码中加上我的2美分...注释,并且您的代码本身(通常)应该说出代码的作用,现在说出它是如何做的。一旦有了“客户端”代码的概念,即调用其他代码的代码(最简单的示例是调用方法的代码),您应该总是最担心从“客户端”的角度使代码易于理解。随着代码的增长,您会发现这是...嗯,很好。

关于优质代码的其他很多内容都与您将要进行的思维飞跃有关(肯定的,如果您注意的话)...其中99%与现在要做的事多一些,以节省大量时间工作以后,可重复使用。正确执行操作:我几乎总是想以其他方式运行而不是使用正则表达式,但是每次我进入它们时,我都会明白为什么每个人都以我使用的每种语言使用它们(他们很深刻,但是工作,可能再好不过了)。

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

从程序员的角度和用户的角度出发,编写好的代码时都要考虑到未来。


1

这在福勒的书《重构》中得到了很好的回答,这是因为他在整本书中都没有描述所有的“气味”。


1

我还没有看到'Professional ASP.NET',但是如果它比OK更好,我会感到惊讶。有关一些具有良好代码的书,请参见此问题。(当然会有所不同,但是很难被接受。)


1

这似乎是(应该是)常见问题解答。最近有一篇关于美丽代码的ACM文章。似乎有很多重点放在易于阅读/理解上。我会用“易于阅读/理解领域专家”来限定。真正好的程序员倾向于针对任何给定的问题使用最好的算法(而不是幼稚的易于理解的O(n ^ 2)算法),即使您对算法不熟悉,也很难遵循。程序员提供了对该算法的参考。

没有一个完美的人,包括优秀的程序员,但他们的代码倾向于争取

  1. 经过验证的算法的正确性和效率(而不是天真的和即席的黑客攻击)
  2. 清晰度(针对非平凡算法的意图注释)
  3. 涵盖基础知识的完整性(编码约定,版本控制,文档,单元测试等)
  4. 简洁(DRY)
  5. 鲁棒性(可抵抗任意输入和变更请求的破坏)


1

杰夫·阿特伍德(Jeff Atwood)写了一篇很好的文章,介绍了编码员是打字员的第一次参考:http : //www.codinghorror.com/blog/archives/001188.html

当您是一名打字员时,您始终需要在工作中保持优雅,结构和适当的“语法”至关重要。现在将其转换为“编程”键入将获得相同的结果。

结构体

注释

地区

我是一名软件工程师,这意味着我在学习期间会遇到许多不同的语言,但是我的编程总是“感觉”相同,就像我在fekberg.wordpress.com上所做的那样,我有一种“特殊”的打字方式。

现在用不同的语言(例如Java,C#,Assembler,C ++,C)对不同的应用程序进行编程,我已经达到了我喜欢的“编写标准”。

我将所有内容视为“框”或区域,每个区域都在解释评论。一个区域可能是“ Person类”,并且在该区域内部,我有两种属性方法,我可以将其称为“访问方法”或类似方法,每个属性和区域都有自己的解释注释。

这非常重要,在创建API结构时,我总是将自己的代码视为“成为api的一部分”,而优雅非常重要。

考虑一下。还请阅读我的论文,Communication issues when adapting outsourcing其中粗略地解释了不良代码如何发生冲突,请按需输入Enterpret:http : //fekberg.wordpress.com/2008/12/14/communication-issues-when-adapting-outsourcing/


0

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


0

对我而言,出色的代码很容易掌握,但又很复杂。让你走的事情,“哇,当然,我为什么不这样想呢?”。真正好的代码并不难理解,它只是以直接的方式(或递归的方式,甚至更简单)解决了手头的问题。


0

好的代码是您从名称中知道方法的作用的地方。错误的代码是您必须弄清楚代码的作用以理解名称的地方。

良好的代码是您阅读它的地方,与阅读它相比,它可以用不多的时间就能了解它的作用。错误的代码是您最终试图尝试找到它的地方。

好的代码具有以不必要的琐碎注释的方式命名的东西。

好的代码往往很短。

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

好的代码通常是一组用于完成简单工作的简单工具(以组织良好的方式组合在一起以执行更复杂的工作)。错误的代码往往是庞大的多功能工具,易于破坏和使用。


0

代码反映了程序员的技能和思维方式。优秀的程序员始终关注未来-在需求或情况与现在不完全相同时,代码将如何运行。它有多标度?如果我不是维护此代码的人,它将有多方便?代码的可重用性,以便其他从事类似工作的人可以重用代码,而不必再次编写。当其他人试图理解我编写的代码时该怎么办。

当程序员具有这种思维方式时,所有其他内容都会很好地体现出来。

注意:随着时间的推移,许多程序员都在使用代码库,通常没有给程序员指定特定的代码库。因此,良好的代码反映了公司所有标准和员工素质。


0

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

我相信,一个好的程序员哲学的核心是,他一直在思考:“将来我会为自己编写代码,那时我会忘记所有关于此任务的信息,为什么从事此工作,会有什么风险以及甚至如何做到这一点。代码应该可以正常工作。”

因此,他的代码必须:

  1. 工作(代码获得错误答案的速度无关紧要。在现实世界中没有部分功劳)。
  2. 解释他如何知道此代码有效。这是文档(javadoc是我选择的工具),异常处理和测试代码的组合。实际上,如果没有其他原因,我认为逐行测试代码比功能代码更有价值,因为它解释道“此代码有效,这是应该使用的方式,这就是为什么我应该得到付费。”
  3. 保持。无效代码是一场噩梦。遗留代码维护是一项繁琐的工作,但必须完成(请记住,这是离开您的办公桌后的“遗留”)。

另一方面,我认为优秀的程序员永远不要做这些事情:

  1. 痴迷于格式。有很多IDE,编辑器和漂亮打印机,可以将代码格式化为您认为合适的标准或个人偏好。我使用Netbeans,我一次设置了格式选项,然后不时按下alt-shift-F。确定代码的外观,设置环境并让该工具完成繁重的工作。
  2. 痴迷于命名约定,却以人类交流为代价。如果命名约定使您无法为类命名“ IElephantProviderSupportAbstractManagerSupport”而不是“ Zookeeper”,请先更改标准,然后再增加下一个人的难度。
  3. 忘记他和实际的人一起工作。
  4. 忘记编码错误的主要来源现在就在他的键盘上。如果有错误或错误,他应该首先考虑一下自己。
  5. 忘记周围发生的事情。他现在所做的使他的代码更易于将来读者使用的任何工作几乎肯定会直接使他受益(因为谁将成为第一个被要求查看他的代码的人?他是)。

@Ken,ho ho,先生,你的机智使我看不见了。马上戴上护目镜:8便士
鲍勃·克罗斯


0
  • 最好的代码具有一定的风度,您一看到它就会意识到。
  • 它看起来精心制作,并注重细节。它显然是由有技能的人生产的,并且具有相关的艺术-您可以说它看起来是经过雕刻和抛光的,而不是粗糙而现成的。
  • 它是一致的并且易于阅读。
  • 它分为一些小的,高度紧密的功能,每个功能都可以做一件事情,并且做得很好。
  • 它是最小耦合的,这意味着依赖关系很少且受到严格控制,通常由...
  • 函数和类依赖于抽象而不是实现。

0

具有讽刺意味的更好的程序员少不可或缺的他/她成为因为生成的代码是任何人都好维护(如伊兰加尔佩林表示经普遍同意)。

根据我的经验,事实恰恰相反。在糟糕的程序员更加难以维持他/她的代码,所以更是不可或缺,他/她成为,因为没有其他的灵魂能理解所产生的谜语。


0

我有一个很好的例子:

阅读GWT(google web takeit)源代码,您将看到每个傻瓜都理解它(某些英语书籍比该代码更难读)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.