写软件比从头开始阅读和理解它容易吗?[关闭]


12

我和我的一个朋友昨天讨论了编写大型C ++软件与将其视为新兵之间的区别。

是否有可能因为一种软件一次只能完成一行,并且此过程类似于我们(人类)如何学习事物并在另一种之上构建事物,所以编写大型软件实际上比阅读并理解其功能容易。 (逐步执行代码会有所帮助,但您需要一起记住多个类/源文件,甚至都不知道它们是为什么编写的,多线程代码会增加恶意点)?

一开始听起来很奇怪,但经过一番思考,这似乎是合理的


1
闭包的简要说明:尽管这是一个很好的问题,但这也是一个无法回答的问题,只能(广泛地)讨论。有太多因素要考虑,代码质量和样式,读者的学习技能以及对项目和语言的熟悉程度,项目的规模等等。如果您有兴趣进一步讨论闭包,在我们的Meta网站上已经有关于它的问题
yannis 2013年

《学徒模式》一书讲述了从新手到手工艺大师的旅程。它回答了新手,学徒,熟练工级程序员在职业发展中的许多问题。使用许多模式需要一些时间,但这是整个过程的一部分。其中一种模式是编写“残破的玩具”或“原型”,以帮助人们弄清楚并与生产系统进行比较。还有许多有用的模式。
GuruM 2014年

Answers:


41

根据我的经验,我将按照最简单到最困难的顺序对以下活动进行排名。

  1. 阅读好的代码
  2. 编写错误的代码
  3. 编写好的代码
  4. 读取错误代码

以上排名得出2条结论

  1. 虽然编写代码比读取不良代码要容易,但是读取优质代码比编写自己的代码要容易
  2. 编写不良代码比编写良好代码要容易,但是编写不良代码会使您准备读取不良代码,这是最困难的事情。特别是由于错误代码的读取量大于写入的错误代码。

当然,好的代码和坏的代码是广义的概括。我建议使用“代码完整干净的代码”,以获取有关良好代码的更多详细信息。


许多其他情况可能导致“错误代码”-缺乏内部一致性,统一的愿景或计划。通常缺乏计划或适当的代码模块化。我见过好的代码毫无意义,因为它没有使用同样可以正常工作的内置语言功能。
Ben DeMott 2013年

另外,如何编写良好的代码:cdn.thenextweb.com/files/2011/01/65987_700b.jpg
CurtisHx 2013年

2
在我看来,阅读不良代码比编写良好代码容易。最糟糕的是,您可以针对尝试读取的错误代码启动调试器,或者使用重构工具对其进行编辑。
mouviciel 2013年

2
编写糟糕的代码只是很容易,直到必须集成和工作,或针对不断变化的需求进行更改。如果您“将自己编程到一个角落”,那么这将不再容易。
卡兹(Kaz)2013年

@mouviciel读取非常聪明的程序员编写的不良代码,这些程序员不应该编写不良代码,这可能很难。读取天真的程序员编写的错误代码很容易。只需戴上您的“天真帽子”,就可以很清楚地看到代码在尝试完成时失败了。:)
卡兹(Kaz)2013年

13

这个问题引起了错误的共识。http://en.wikipedia.org/wiki/False-consensus_effect

不同的人学习和吸收信息的方式不同。它类似于听觉学习者,视觉学习者和动觉学习者。对于某些人来说,阅读代码更容易,对于其他人来说,创建代码更容易。对我来说,是后者。对于我团队中的其他人,它是前者。我不认为找到某种共识或多数意见是有用的。最好了解一下您的大脑如何吸收和学习信息,并利用这些知识使自己变得更好,并学会接受不同的人。


1
当然,提出问题和讨价还价的观点远比简单地认为这个(或任何其他)假设是自动正确的要好得多。认识到各种人如何解决同一问题通常可以对团队的表现以及改善社交互动产生积极影响。
Robbie Dee 2013年

7
你是绝对正确的。问是开始。并且,了解存在虚假共识有利于理解。这就是为什么我“回答”这个问题而不是简单地忽略它的原因。
mawcsco 2013年

7

编写大型C ++软件与将其理解为新兵之间的区别

这与读写软件之间的区别不是一回事。当您刚接触项目时(尤其是刚接触公司时),您不仅需要了解代码的功能,而且还有很多要学习的东西。要了解代码为什么要执行其工作,通常需要了解业务的运作方式以及项目与组织其余部分的关系。简而言之,在没有充分的背景知识的情况下,阅读代码比阅读代码要慢,困难得多。

还有就是在编写全新的代码之间的差异新建项目和读取和修改现有的代码,但我不会说一个必然更容易比其他的,只是不同。当您创建新的东西时,您不必担心如何使代码与已经存在的东西一起工作,但是您确实需要担心使您的项目具有足够的可扩展性和适应性,以至于在将来仍然有用。 。在处理现有项目时,通常可以使用已有的内容作为指导,但是必须首先了解已有的内容。

作为“新兵”,通常最好在现有项目上工作,因为它可以帮助您学习所有未知的知识:业务如何运作,各个项目如何协同工作,编码标准和实践,甚至(尤其是)可以改进的地方。


通过经验了解系统和基础API的“上下文”广度/深度。系统的逻辑组成部分是什么?这些组件之间如何相互作用?他们使用什么机制构建基础构建块?底层构建块在不同路径中的表现如何?系统的约束/目标是什么?为什么选择某些途径而不是其他候选人?如果需要添加新组件,可以重复使用什么,又需要重新添加什么?您可以从“系统内部”看到吗?一本看实用思维和学习的超级书。
GuruM 2014年

建立一个“原型”或一个“残破的玩具”(已知缺陷并且仅探索替代品)将有助于“强迫”自己思考上述问题。添加组件和添加功能,然后进行重构,将有助于人们“解决”当前的问题和候选解决方案(可能通过论坛搜索)。
GuruM 2014年

4

这是一个有趣的问题,但是我倾向于倾向于它的一面,即比创建它更容易阅读和理解。

如果您是一位经验丰富的资深程序员,那么您很可能会通读代码,然后说“是的,很好的选择,检查,哦,我可能会用X代替Y”,等等。您可以进行修改或调整,但这会从头开始可以节省大量时间(除非有理由这样做)。

如果您是新来的程序员,那么“您不知道自己不知道的东西”,因此您将不得不发明/学习所有的小事情,并且很可能会在效率上有些低下码。但是,您可能会对该语言有更深入的了解。

但是在这两种情况下,从头开始阅读和阅读代码要比完全从头开始编写更加容易。


2

与其他人编写的代码相比,大多数程序员发现更容易理解他们自己编写的代码。这是由于您提到的逐行学习,以及个人风格和才能的问题。这就是为什么要进行大量车轮改造的原因。

但是,那是树木的景色。森林的观点是,与从头开始编写代码相比,读取代码要容易得多。例如,是否更容易从头开始编写新的文字处理器,或者足够好地学习现有代码库以进行改进?

当您开始阅读代码时,可以想到无数种使代码更易于阅读的方法。您花了第一时间只是在四处寻找代码,试图弄清楚这片土地的状况,有时在架构中完全想出自己想怎么做。但是,即使在非常庞大的代码库中,与创建该应用程序已经投入的数十万工时相比,您可能仍需要花费40-80个小时来旋转轮子。


你会写代码而不理解吗?复制也许。
JeffO 2013年

@JeffO一直都在-大声笑...
Robbie Dee

1

编写软件的人几乎总是对程序有最好的了解,这仅仅是因为在编写程序时就知道其逻辑和他/她的思考过程。

我不认为就易于理解而言,编写代码与阅读代码完全没有可比性。一方面,由于了解与每个代码部分,所使用的库等相关的上下文,仅编写软件就可以更好地理解该特定软件。但是,阅读其他人编写的代码可能很难理解。真正的软件,但是从理解语言的角度来看,它可以提供您可能未考虑使用的新的工作方式或使用库的见解,从而使编写代码变得更加轻松。

就构建知识而言,我认为阅读代码和编写代码是紧密联系的,并且在许多方面是相互依赖的。编写代码的经验使您易于理解其他代码,而阅读代码使您可以更轻松地编写代码(通过新的逻辑概念,使用库等)。


1

我个人认为这是不言而喻的,但是我从来没有完全确定它是否适合整个编程人群。例如,我认识一些非常有才华的编码人员,他们比阅读文档更能高兴地挑选别人的代码并理解它们,就像是他们自己的一样。

这就引出了一个问题:这重要吗?

如果您正在阅读代码,则很可能是在进行更改而不是重写。即使您正在重写它,也可能会以新的语言/版本来编写它,因此您不一定必须以相同的方式编写代码。我要说的是,并非总是需要始终了解所有代码。

所有这些都是正确的,较新的开发方法(例如BDD)确实认识到,从代码中清楚业务逻辑很重要,而不是简单地将代码作为驱动机器的一种手段。当然,这并不是什么新鲜事物-自从Donald Knuth的开创性工作:Literate Programming以来,这个概念就一直存在。


1

我很喜欢StMotorSpark的答案,只是补充说:
它取决于很多因素,例如,不能是是或否的问题:

  • 现有的代码是否被很好地记录和编写,或者看起来像意大利面条,没有任何意义或注释?
  • 它是一个很小的应用程序,它在极少数情况下会花费大量时间来寻找解决方案,还是一个更大却简单的应用程序?
  • 等等

1
很好的一点;但是,我认为这更多地取决于人。例如,即使有一些几乎没有文档的代码,它仍然可以以“那很奇怪,我想知道那是什么”的形式提供洞察力。如果某人真的想学习,无论程序或文档的大小如何,他们都会发现有帮助的内容。考虑到这一点,优秀的文档和代码在规模上并没有多大帮助。
StMotorSpark

1
完全同意,这也很大程度上取决于人。请注意,由于工作需求,我们中的一些人从头开始进行大量开发,而其他人则进行大量维护。这将不可避免地完善两种不同的专业知识,无论他们是否都以相同的组织良好的思维方式,相同的逻辑水平和对语言的特定理解
作为起点
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.