软件开发人员维护代码指南


当你第一次想到成为一名软件开发人员时,你很可能有创造令人兴奋的新特性,玩转新技术,编写一些真正酷炫有趣的代码的梦想。

你可能不会想到的是,在一个10年前离开公司的家伙编写的一个顽固的应用程序上工作,修复他留下的bug。

事实是,在软件开发生涯中,您将花费更多的时间来维护代码,而不是编写新代码。生活就是这样。只是其中一件事。

但是,这并不意味着您只需要维护几十年前编写的旧VB6应用程序。事实上,您将要维护的大量代码可能是您自己的。

所以,如果你学习两件事,这可能是个好主意。

首先,您需要知道如何正确地维护代码,以便它不会随着时间的推移变得越来越糟,直到最终崩溃。其次,您需要学习如何编写易于维护的好代码,这样开发人员以后不得不维护您的代码时就不会跟踪您,来到您的家里,在您睡梦中杀死您。

在本文中,我们将讨论为什么学习如何维护代码和编写可维护的代码如此重要,我将就如何做到这两件事给您一些实用的建议。

听起来不错吧?

您职业生涯的大部分时间将花在维护代码上

Image title

我已经提到了这一点,但值得再次提及,因为这是真的:在某种形式下,您将维护代码。

新的软件总是被创建的,但是每一个新的软件应用程序都应该有某种寿命,希望比创建它所花费的时间更长。

这意味着旧软件总是比新软件多--除非我们有一个高得离谱的新软件涌入,而一堆旧软件同时消亡,但这是非常不可能发生的。

现有的旧软件将不断地需要改进和维护。客户会发现需要修复的bug。需要添加新功能或修改现有功能。生产软件就像一个活着的,会呼吸的有机体,总是在生长变化或者慢慢死去。

我为什么要告诉你这些?难道我只是想让你的希望破灭吗?不,我希望你对你作为一名软件开发人员的职业生涯有一个现实的期望。

通常情况下,热心的,善意的招聘经理会给你描绘一幅美好的工作图景,告诉你你将使用最新的技术从头开始设计和编写一个全新的系统。

虽然您的一些工作可能在做这件事,但大多数工作--不管听起来有多好--都将涉及维护现有系统。再说一遍,这就是生活的方式。

这是否意味着你永远不能得到一份完全可以从头开始编写新系统的工作?不。肯定会发生的,但不要一直期待。即使您这样做了,也要预料到在某个时间点,您或其他人将不得不维护该代码。仅此而已。

优秀的开发人员编写可维护的代码

Image title

既然你已经正确地设定了你的期望,我将试着激励你写出“最好的可维护性代码”,因为天哪,这是一件很棒的事情。

在我作为一名软件开发人员以及与软件开发人员一起工作的多年中,我发现的一个无可争议的事实是,伟大的开发人员编写的代码具有高度的可维护性。事实上,我要说我评判一个程序员的唯一标准是他们的代码的可维护性。

这可能看起来很傻。你可能认为我编造这些只是为了在这一章中阐明我的观点--但我告诉你,这是真的。原因如下。

伟大的开发人员知道,他们编写的任何代码的大部分生命周期都将花在维护阶段。伟大的开发人员知道,他们编写的最有价值的代码是code that lasts a long time而且不必被废弃和重写。优秀的开发人员并不是尽可能地聪明,快速或高效,而是为了可维护性而进行优化。

它们编写的代码很好,干净,易于理解,修改和维护。它们创建了松散耦合的灵活设计,因此,如果系统中有一件事情发生变化,它不会影响系统的其他每个组件。他们会格外小心,以确保他们所做的事情都有很好的文档记录,并且尽可能地自圆其说。他们已经花了足够的时间查看别人的代码--或者自己的代码--并试图维护它,从而知道他们能写出的最好的代码就是最易维护的代码。

童子军规则

维护代码的秘诀之一是童子军规则。

这条规则源自美国的童子军,他们强调露营的一个简单规则:“让露营地比你发现的更干净。”

这是一条适用于生活中多个领域的很好的规则,但它在软件开发中尤其有用。让代码比你发现的更好。真的那么简单。当您在处理某些代码时,可能是修复bug或添加新特性,尝试让该代码处于比发现它时稍好的状态。

这可能意味着编写一个额外的单元测试,使代码对下一个开发人员来说更加健壮,因为下一个开发人员需要对代码中的某些内容进行更改。这可能意味着在代码中重命名一些变量以使其含义更加清晰。这可能意味着将一些功能分组到一个方法或过程中,以减少代码中的一些冗余或使其更易于理解。它甚至可能涉及重构一大块代码,以实现更干净,更简单的设计。

只要你在遵循这个规则,代码就会随着时间的推移逐渐变得更好--或者至少熵的速率会严重下降。这个基本规则是维护现有代码库最简单的秘诀。

可读性是最重要的

Image title

One of the most important factors influencing the maintainability of code is its readability代码的可读性越强,维护代码就越容易。代码越隐秘,越难懂,维护就越困难。

就是这么简单。

太多的开发人员试图编写简洁巧妙的代码。虽然简洁是有价值的,但简洁和聪明绝对是灾难的秘诀。为什么?因为代码是read more than it is written

每当程序员试图理解通过您的代码传递的一些工作流,从而可以添加新特性,修改现有特性或排除错误时,他们都需要理解您的代码在做什么。

他们越容易理解,就越容易对系统进行正确的更改,所需的时间也就越少。如果代码晦涩难懂,那么每当其他开发人员--甚至您自己--不得不检查并试图理解该代码时,就会花费额外的时间。

也很可能有人会误解代码,然后在更改代码或使用该代码的系统的其他部分时出错,从而进一步降低系统的性能。

事实上,可读的代码更容易维护。因此,在编写旨在维护的代码时,首先要努力实现可读性。

重构代码以使其更好

我们已经讨论了童子军规则,但是让我们更深入地探讨一下“让代码更好”意味着什么。你怎样才能让代码更好呢?

关于重构的主题可以写一整本书-and several have been--但在这一节中,我将向你们介绍基本知识,你们可以自己练习和学习。

重构本质上是改进现有代码的设计。对我来说,重构意味着在不改变现有代码功能的情况下使其更具可读性。

“不更改其功能”部分非常重要,因为如果您同时更改了功能,您就不能让代码变得更好。您可能会引入bug并使代码变得更糟(并不是说当您改进代码时就不能更改功能,但这并不是重构的重点)。

重构的重点是采用一些现有的代码,并使其变得更好。更好的可能--实际上,总是应该--意味着更好的可读性和可维护性。

但是,这也可能意味着您通过消除一些重复或以不同的方式组织代码,减少了代码的总行数。这可能意味着您已经改进了整个体系结构,使其更加灵活和健壮,以抵御进一步的更改。

重构代码的方法很多,但重构中的大规则是不改变功能,而是让代码变得更好。重构和单元测试是并行不悖的,因为如果无法测试代码,就很难知道您是否更改了代码的功能。

在进行重构之前进行一些单元测试是一个好主意,特别是如果它是一个非微不足道的更改。还有一些现代的重构工具可以帮助您,并且可以保证重构不会改变代码的功能。

大多数现代IDE都加入了一些这样的工具。把它看作是在不改变其意义的情况下重新排列一个数学方程。您可以始终确保4x=8与2x=4或x=2相同。你不用证明。

自动化是必不可少的

Image title

维护软件真的很困难,您必须在其上手动构建和手动运行测试以确保没有任何损坏。

更改和测试更改的速度越快,安全网就越好,它将保护您避免向现有代码库添加新的bug和错误。

这就是为什么自动化对于提高软件项目的可维护性是必不可少的。

有了自动化的构建,持续集成系统和自动化测试,对代码进行更改和快速发现您是否破坏了任何东西都变得非常简单。

这种快速的反馈循环让开发人员对他们的更改更有信心,也让他们可以重构代码,使之更好而不用担心。

如果你写评论,就写好评论

I’m not a huge fan of writing comments in code是的,我知道这是异端邪说,但我宁愿写清楚,有表现力的代码,而且是不言自明的,而不是写只有在通读注释时才能理解的神秘代码--顺便说一下,希望注释与代码一起得到维护。

我宁愿看到您编写干净,可读的代码,而不是在代码中添加一大堆注释,这些注释通常会过时,但是,如果您确实编写了注释,请确保它们确实是好的。确保注释清楚地解释了一些非显而易见的,需要解释的东西。

隐秘注释有时和隐秘代码一样糟糕,或者比它更糟糕,因为你至少可以弄清楚隐秘代码是做什么的。你无法真正理解一个神秘的评论可能意味着什么。

连同代码中的注释,使提交消息尽可能清晰和有用。清晰的消息还有助于代码库的可维护性,因为提交消息不仅为我们提供了代码随时间推移发生了什么的历史记录,而且还提供了原因。

当试图理解一些不明显的代码或更改时,特别是当它涉及到修复一个棘手的bug时,这个原因是至关重要的。

学习编写可维护代码的资源

维护代码是很棘手的。它涉及到相当多的技能,从编写干净的代码到重构,再到设计,甚至是基础设施的关注点,比如DevOps和自动化。

我决定列出一些有价值的资源,这些资源可以帮助您更好地编写可维护的代码和维护未编写的现有代码。

  • Clean Code by Robert Martin我提到过这本书几次,但它是关于编写干净,可读代码的最好的书之一,它还包含了关于设计和重构以实现可维护性的重要信息。

  • Code Complete by Steve McConnell我已经多次提到这本书,但这是关于编写好的,可维护的代码的又一本很棒的书。您会发现本书介绍了编写好的,可读的代码的一些低级的,结构化的细节。读一读。

注:合并起来,清除代码代码完成将给你一个坚实的基础和理解什么是好的,干净的,可读的代码,以及如何编写和结构你的代码,所以我强烈推荐阅读这两本书。

  • Working Effectively With Legacy Code by Michael Feathers这是一本关于维护现有代码的经典书籍。它深入到遗留系统的本质,以及如何处理其他人编写的代码。每个软件开发人员都应该阅读这本书,因为每个软件开发人员都可能花费大部分时间处理遗留代码。

  • Refactoring by Martin Fowler。另一本所有软件开发人员都应该阅读的经典书籍。这本书介绍了所有主要的重构方法,你可以在不改变代码功能的情况下重构代码。

这就是它的要旨。

只要记住童子军的规则,你就会做得很好。哦,还有,别担心:在软件开发生涯中,您将得到大量维护代码的实践。

祝你好运。

这篇文章是我的书《完整的软件开发人员职业指南》中的一章。我每周都在这个网站上写这本书。If you enter your favorite email address here,我会把之前的章节发给你,让你赶上来--然后把每一个新的章节都发过来!

Image title