我们应该一直关注如何改进我们的代码。
我之前的博客文章在推特上火了。这篇文章指出了一个问题——始终遵守某些规则实际上并不能帮助人们更好地编写代码。
我在博客上看到的最常见的问题(或反对)是“我们如何教新的程序员如何编写好代码?”
在这篇博文中,我试图解答这个问题。
学会合作
我们应该教给新程序员的最重要的技能是如何在共享的代码基础上与他人很好地合作。在我的职业生涯中,我花了很多年的时间才掌握了这一点,但这对我的整体开发效率影响最大。
所以,这就是我对新手的开发人员的建议。在我们所从事的几乎所有项目中,我们的成功往往取决于他人。
下面是一些行之有效的方法:
结对编程——良好的结对编程需要训练,但也有训练风格,比如编码dojos和代码提升。世界上一些最优秀的编程讲师都积极地使用结对编程作为培训的一部分。
代码评审——我在结对编程方面做了很多工作,因此以前我个人认为代码评审的优先级较低。然而,许多团队发现代码评审有很大的价值。
耐心——使用结对编程时,很容易陷入争论。我们程序员这个职业大部分人都不擅长处理人际关系,但这对我们很重要。
试试这个:当你在做结对编程的时候,你会发现你的搭档犯了一个错误,等着看他/她是否在正式提交之前发现了自己的错误。
谦逊——我经常被问到,“我如何说服别人写干净的代码?”当然,这个问题假设你是对的,他们是错的。
我们大多数人都在努力改变自己的想法。当结对编程时,如果你的伙伴想做一些你认为是错误的事情,试着纵容他们。
最糟糕的情况是最后你有机会教他们一些东西。充其量,你自己也能学到一些东西!
除非您自己编写所有代码,否则协作技能是最重要的。
现在,让我们来谈谈真正的编写代码!
如果您是跳过这一节的人之一,请返回并阅读关于协作的内容。认真对待。如果你不能很好地与他人合作,我对代码的任何看法都不会对你有所帮助。
继续,再读一遍。我会在这里等。
很高兴见到你回来!
现在,让我们谈谈如何编写好代码。当然,好的代码对于职业成功至关重要。如果代码库更好,您将花费更少的时间修复bug,更容易地更改代码,您的团队将有更好的时间与您一起工作。
学习写好代码很简单——你必须读代码,你必须写代码,你必须修改代码,你必须删除代码,然后重新开始。
对于以上几点中的第一点,优秀的书籍可以帮助您阅读代码。我强烈推荐的一些书籍有Clean Code, Implementation Patterns, Refactoring, The Art of Agile, Pragmatic Programmer, 和Practices of an Agile Developer.。我非常喜欢读这些书。这些书将告诉您一些注意事项,如低耦合、高内聚性和简单的设计。
它们会教你有用的原则,比如单一责任原则和开放式封闭原则(尽管我发现我几乎从不提及可靠原则(SOLID))。
模式和原则教会您更好的与您的团队讨论新的信息和代码。
对于第二点,测试驱动开发是学习如何编写代码的一种很好的方式。我喜欢自己做编码,经常用它们来教学。但是,编写代码时最有价值的技巧是我在代码静修(code retreats)中学到的(谢谢你,科里·海恩斯!)学习何时删除所编写的代码是非常重要的。我不是说为了代码量更小而重构它。
优秀的代码的特点是很容易的应对变化。你能在代码中导航吗?你能很快发现错误吗?你知道在哪里做特别的改变吗?
你可以通过阅读原则来学习,但是最安全的老师是让你接触到更多的经验。当您编写和更改代码时,它会导致您反思代码的局限性,而您当前的技能集会阻碍您想要进行的更改。
简而言之,多写一些代码,多听一些代码,多听一些你的同行。
你能顺利发布版本
我几乎忘记了优秀代码的首要品质——它必须被发布使用!团队的发布周期可以从每天几次变化到每年几次。
如果你可以随意发布你的代码,你可以了解你的代码和你的用户。当整个团队意识到你将在明天或下星期再次发布时,“现在或以后”的优先级会变得更容易。
当你一年只发布几次,人们就会感到压力,讨论也会变得激烈。
我几乎总是发现团队低估了花时间在构建和部署工具和脚本上的价值。
“不要故意做蠢事”
如果你发现你不满意的代码,要明白它是这样的原因就是,因为它是这样的。人们这样做是有原因的。这些理由都是合理的,无论是因为周围的需求改变了,或是开发人员没有足够的经验,完成任务的压力让他们想回家,而不是在办公室里坐得很晚,或者,他们只是对什么是好的代码有不同的看法。
不是每个人都同意我这个观点,但是“还有那些不在乎的代码质量的人呢”?
在做了20年的程序员之后,我遇到过程序员,他们的偏好与我不同。我遇到过在短期限内交付的程序员。我也遇到过程序员,他们因为明显的进步而牺牲了编写好的代码而受到表扬。而且,我遇到过很多程序员,他们并不像我一样关心代码。
在我们的生活中还有其他的各种兴趣爱好,这也是花费更少时间打磨代码的一个很好的理由。
但是,我从来没有遇到过一个程序员不在乎代码。