在我15年多的发展生涯中,我学到了很多东西,这些东西大大提高了我的效率。在这篇文章中,我将与你分享这些经验。
结构:
- 通用建议-技术咨询的重要背景和动机
- 技术建议-主菜
- 推荐阅读资料-链接到高质量的书籍和博客,这对入门很有帮助
这篇博客文章提到并链接了一些有价值的概念,您可以根据需要进一步探索这些概念。
青少年通用建议
1.代码不是重点
作为开发人员,我们喜欢编写代码。我们大多数人都想得到一个明确的任务。一个有趣的技术难题,不用关注世界其他地方就可以解决。
尽合理的努力确保你解决了正确的问题。引用彼得·德鲁克的话:没有什么比高效地做那些根本不应该做的事更无用的了。尽早并经常收集反馈,通常通过持续向真实用户提供反馈。Be公司 敏捷的.
软件开发成本高昂,现实世界项目的绝大多数工作通常都要进行维护。将此与用户/业务成果这一目标结合起来,最好的代码往往是没有代码引用比尔·盖茨的话:“用代码行衡量编程进度就像用重量衡量飞机建造进度。”
另请参见:雅格尼,亲吻,最后一个负责任的时刻.
2.软件设计事项
在我开发生涯的前5年里,我认为软件设计是为软件架构师或其他具有特殊角色的人设计的。我专注于“完成任务”,并认为软件设计和诸如编写测试之类的实践充其量只是分散注意力。我的代码有效了,我完成了很多事情。或者我是这么想的。
然后我读清除代码,由罗伯特·C·马丁这本书激发了人们对软件设计的关注,并包含了示例和许多技术启发。这本书的核心内容是:“跑得快的唯一方法就是跑得好“换句话说,如果你把事情搞得一团糟,它会拖慢你的速度。另请参见:可交易质量假说,设计耐力假设
学习如何编写设计良好的干净代码当然需要时间和精力。当你开始的时候,你会放慢速度,犯错误。简单并不容易.
3.使用最佳实践
写作测试往往是有益的。有一些例外,但大多数情况下,编写自动化测试很有意义。写作测试是最佳实践的一个例子。
如果你是写测试的新手,只需遵循最佳实践,为所有内容编写测试即可。开始时,盲目遵循最佳实践比遵循自己不成熟的判断要好。随着时间的推移,你将学会如何有效地编写测试,并能够分辨出你的错误和编写测试不值得的情况之间的区别。你也将开始理解测试带来的价值,经历了调试会话的减少和测试带来的无忧重构。发展判断能力后,你将能够超越最佳实践.
这条建议适用于任何初级领域的最佳实践。自动化测试只是一个例子。
一个大问题是,要区分明智的最佳实践和荒谬甚至适得其反的做法是不容易的。由于大多数现有代码一团糟,以及大多数开发人员(包括“经验丰富”和“资深”的开发人员)不知道软件设计基础知识,这使得情况变得更加复杂。这使得有一个好的导师非常有价值。除此之外,根据我自己的经验,有一条建议是要警惕特定于您的语言或框架社区的最佳实践。寻找已经存在数十年的常青建议。
青少年技术建议
我们的重点将放在技术主题上。其他许多领域也很重要,例如健康、幸福、职业和软技能。如果你睡眠不足,并且为一个给你薪水低的有毒老板解决了错误的问题,那么知道如何避免技术陷阱对你没有帮助。
4.写测试
编写自动化测试。可能在编写代码之前编写测试,例如通过测试驱动开发(TDD)。这使得以可重复的方式验证代码是否正确变得容易,从而避免了大量手动重试和调试会话。
你觉得第一次考试很难吗?尝试调试之后。
也许更重要的是,测试为您提供了重构代码的安全网。为了保持代码干净,需要不断重构。如果没有可靠的测试套件,您的代码就更有可能烂掉。
如果代码的设计很差,比如在使用继承进行代码重用或使用静态函数时,编写测试是很困难的。另一方面,如果你有固体没有全局依赖性的类,那么编写好的测试就不那么困难了。
测试设计很重要,因为写得不好的测试会让您慢下来。避免将测试绑定到被测试代码的实现细节或系统结构。避免过度使用Mocks和写得更好的双打测试.
5.不要将继承用于代码重用
这是让人想起“使用最佳实践”部分的最佳实践之一。我的建议是:在开始时,不要将继承用于代码重用。这很少是正确的选择,可能会造成很大的伤害。偏爱组合胜于继承.
6.编写面向对象的代码
写入固体不是的代码愚蠢的。理解这些原则和反模式非常有价值。
实际创建对象。只有静态方法的类不是OO。尽量避免完全使用静态代码。
另请参见:我对SOLID的辩护.
7.编写功能代码
(功能性编程不要与之混淆命令 结构规划)
这一点并不是关于如何切换到函数式语言。您可以从OO语言中使用函数样式中获益。最小化状态,尤其是可变状态,以及在你的函数中做一件事。另请参见:功能核心,命令式外壳.
8.使用知情复制
将大块代码复制到多个位置几乎总是不明智的。任何自负的开发人员很快就会了解到这一点,并开始遵循某种形式的不要重复自己(干燥)。不幸的是,有意追求DRY往往会导致过度设计和意外复杂性。这就是DRY的对应词:Write Everything Twice(WET)。WET背后的理念是只在第三次出现重复时进行重复数据消除。
要更深入地了解重复数据消除的成本和好处,请参阅DRY的谬误.
9.类型、名称和注释
尝试编写自文档化代码并避免注释。
每次你写评论的时候,你都应该做鬼脸,感觉自己表达能力的不足罗伯特·C·马丁
评论是危险的,因为它们可以撒谎。代码可以在不更新注释的情况下更改。可以在注释下方添加新代码。该评论可能一开始就错了或不准确。当这种情况发生时,评论不仅变得无用,而且具有误导性。
编写自我记录代码:
- 在你的功能中做一件事
- 通过在函数中执行一件事,可以给它一个清晰的名称
- 感觉有必要通过添加注释来解释函数的不同部分做什么?相反,将每个部分提取到其自己命名良好的函数中。
- “抽到你掉下来“:如果你能有意义地提取一个函数,那么你可能应该这样做。不要害怕小函数。
- 命令查询分离
- 类似于单一责任原则类(固体中的S)
- 最小化状态
- 使用类型结合执行代码的测试套件,您可以依赖类型来说明真相。
- 避免混合类型。避免使用可以是整数、布尔值或字符串的参数或返回值。如果编写只做一件事的聚焦函数,则自然会发生这种情况。
- 编写测试。一个编写良好且全面的测试套件将向您展示如何使用生产代码以及它的行为。
清除代码作者Robert C.Martin在命名和评论方面有一些很好的经验法则。
青少年推荐阅读
书
博客
另请参见:开发人员推荐阅读作者:Jeff Atwood
奖励链接
帖子对初级开发人员的建议首次出现于熵获胜.
]]>