人们如何管理和维护极其复杂且难以阅读的代码?[关闭]


27

读取SQLite源代码是IMO不可能完成的任务。但是,它是一个非常有用的非常复杂的软件(毕竟它是一个完善的嵌入式数据库),可以从其他代码中下载,编译和使用,并且它会不断更新。

人们如何管理和维护这种极其复杂且难以阅读的代码?


1
我认为,他们没有:-D
Pawka

2
@Pawka:“他们”不包括SQLite人员。
Frank Shearar

11
即使代码很复杂且难以阅读,但考虑到所解决问题的复杂性,它仍然可能是相对不错的代码。无论您遵循“最佳实践”有多紧密,编写解决难题的简单代码通常都是不可能的。然后,使代码尽可能简单明了就显得尤为重要。
乔纳斯·普拉卡

1
有没有人看过一个易于阅读的庞大项目?
杰夫·戴维斯

2
雇用实习生,博士后等,然后让他们做……
DarenW 2010年

Answers:


19

复杂和复杂之间有很大的区别。以下链接对此进行了总结。:)

http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/complex-vs-complicated.aspx

从更个人的角度来说,我使用的代码库超过一百万行。我从第1行一直到它的当前状态。您越熟悉(在代码中阅读越久),就越容易。我无法告诉您每一行的功能,但是可以告诉您开始寻找给定的任务或错误。它是自然而然的。

这个故事的寓意是,就像编程世界中的任何事物一样,它也需要时间。如果您希望了解SQLite并只是了解和理解它,那么您就在自欺欺人。需要花时间弄清楚一切如何协同工作。好的代码和坏的代码之间的区别是该过程需要花费多长时间。

最后,一些开发人员没有能力跳入代码库并开始弄清楚它。许多人会因代码库的庞大规模或体系结构而感到不知所措。其他人只要跳进去就不会有问题。这完全取决于开发人员的优势。


31

对于SQLite的特定情况,他们选择在开发和维护中使用的主要工具是自动化测试。他们以测试套件中100%的覆盖率(分支覆盖率,而不是语句覆盖率)为荣。根据他们的说法,它是世界上测试最好的软件产品之一。因此,他们可以立即知道自己添加或更改的内容何时导致回归,并因此而无所畏惧地发展。

http://sqlite.org/testing.html

令人震惊的数字- 测试行数是生产代码的约640

编辑:看来这个问题已经死了!一年多以后,同一页报告他们的测试代码行是生产的1177倍!


2
除了我以外,没有其他人认为这是一个问题而不是自豪感吗?
斯蒂芬,2010年

1
我真的不认为。首先,数据库必须可靠。
ts01 2010年

5
@Stephen,为什么会有很多测试用例出现问题

1
有时间吗?太多的测试和很少的测试一样糟糕(IMHO)
Dainius

9
如果测试涵盖了代码可能失败的可能情况,那么如何浪费时间呢?
Ramhound

7
  • 功能会随着时间而发展。
    • 新功能由新客户需求驱动。
    • 旧代码的编写方式允许在不破坏旧代码的情况下添加将来尚未实现的功能。
  • 领域专家(在这种情况下,数据库是计算机科学中的知名领域。)
  • 社区反馈
    • 虫子
  • 良好的学习和坚持不懈对于陡峭的学习曲线而言不是问题。可能需要6个月,1年甚至更长的时间才能变得舒适,而这正是某些人能够忍受的。
  • 商业动机。没有金钱的支持,很少有人可以将时间和精力投入到陡峭的学习曲线中。

4

您无需对整个项目有深入的了解即可维护它。通常,使用大型,复杂的软件,人们将拥有自己要照顾的特定“区域”,并且对系统的其余部分只有“通过”的知识。

SQLite的实际上是对“大型软件项目”的规模相对较小,但如果你看看像在Windows操作系统中,你会看到人们谁刚刚工作的内核,人谁只是在外壳上工作,人谁只是工作在Internet Explorer上,那些在Window Manager上工作的人等等。在“ shell”中工作的人将无法一口气修复内核中的错误。

这些项目随着时间的推移而发展还有一个好处:它们并不总是从复杂的项目开始。这意味着新开发者通常可以由更有经验的开发者进行“培训”。

当您加入一个庞大的开发人员团队时,将为您提供要处理的项目的特定方面(可能是错误或新功能),并且在前几个迭代中您将有另一个开发人员成为您的“伙伴”。您的好友将对您正在工作的区域有很好的了解,并可以帮助您找到自己的出路。

对于像SQLite这样的开源项目,实际上要困难一些,因为现有开发人员没有动力去“培训”新开发人员。因此,您会发现自己更多了。但是您仍然可以在开发者论坛或邮件列表上找到帮助(例如,仅发布诸如“我想实现这样的功能”或“我发现了XYZ错误,该从哪里开始寻找?”之类的问题,那么您很可能会得到帮助。某种形式的帮助。


更改细节,这听起来很像我目前的工作!这个答案的最好部分是专业化和随着时间的推移发展的需要。还要对整个事情添加一点幽默感。
2010年

4

难以阅读和复杂的项目之间有区别。如果某人对项目编写语言或项目领域不甚了解,则并不意味着代码编写不正确。

我的建议:

  • 确保您了解项目的语言。对语言的了解还不够。
  • 在动手编写代码之前,请先了解有关该域的所有详细信息。

对我而言,SQLite远远不复杂,也没有什么复杂的。该项目的领域要求对广泛的概念有深入的了解。


3

其他答案中未提及的一件事是“它们自然而然地出现”。大多数人都想编写好的代码,但是他们习惯于编写坏的代码。我遇到的一些程序员自然是LINEAR思想家+有时非常有意识地他们提出了复杂的解决方案。在工作需要的时候,大多数这样的人不会花时间阅读或学习他们所学的书。


1
大声笑,我曾与soemone一起工作过,如果有多种方法可以做某事(并且一直存在),他总是会选择最复杂,最复杂的解决方案。我认为他甚至没有意识到这一点。
HLGEM 2010年

3

人们如何管理和维护这种极其复杂且难以阅读的代码?

如果他们是原始编码人员,并且继续维护它,则不会将其视为“复杂且难以阅读”。由于他们自己编写了代码,因此他们可能认为它“简单易读”。

任何代码都需要时间来理解。只是有些花费比其他时间更长的时间:)


2

如果您有毅力,耐心和有条不紊的方法,那么可以将头放在任何代码库周围,但主要是毅力:-)


1

如果事情总是以相同的方式进行,则管理变得容易得多。我不知道SQLite代码,但是我正在有多个项目的环境中工作。除了了解业务案例(等价逻辑)外,由于基本上所有地方(在数据库访问等)都以相同的方式进行操作,因此开始进行另一个项目相对容易。简短的长篇文章:编码准则(以适当的方式)使工作和此类代码变得更加容易。这可能是SQLite编码器的帮助者之一。


1
  • 如果您是该软件的原始作者,并且已经使用该软件超过10年,并且您是个天才,则可能可以理解整个内容。实际上,大型复杂软件(例如SQLite或Linux内核)通常只有一名原始作者,即使其他人做出了贡献,也对它有完整而深刻的理解。
  • 如果软件体系结构是理智的(高内聚性,低耦合性),则了解整个事物并不是对其进行有用的添加和修改的先决条件。
  • 了解RDBMS或OS有点特殊情况,需要深入了解基础CS原理。对于“普通”软件应用程序则不是这样。

1

他们尝试以简单的方式而不是简单的方式来编写它。

尽可能简单,即使可能需要一些时间,也可以使事情更快地理解/阅读。


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.