“写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。”——约翰·伍德(John Woods)
生产代码(production code)是用户使用的产品中的代码。将软件部署到生产环境(production)后,就意味着用户可以公开访问了。本文将介绍13个最佳的编程原则,有助于大家编写可部署于生产环境的代码。这些原则来源于《Python编程无师自通》,读完这本书后我的代码质量大幅提升。
01 13个最佳编程技巧
写代码是最后的手段
作为一名软件工程师,你在工作时应尽量少写代码。碰到问题时,你首先想到的不应该是“我怎么解决这个问题”,而是“其他人是不是已经解决了这个问题,我能使用他们的方案吗?”如果你自己去解决一个常见的问题,很有可能别人已经有了解决方案。先在网上检索解决办法,只有在确定没人解决过该问题之后,才开始自己动手解决。
DRY
DRY是不要重复自己(Dont’t Repeat Yourself)的简称,指的是不要在程序中编写重复的或是基本相同的代码。正确的做法是将代码封装至函数中,后续可重复使用。
正交性
正交性(Orthogonality)是《The Pragmatic Programmer》中提倡并普及的另一个重要编程原则。亨特和托马斯认为,“该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。”实践中请牢记,“A不应该影响B”。假设我们有两个模块module_a
和module_b
,module_a
不应对module_b
中的内容进行修改,反之亦然。如果设计的系统中A会影响到B,而B又影响C,很快就会失去控制,系统将变得无法管理。
每个数据都只应保存在一处
假设手上有一个数据,我们只需要将其存储在一个地方。例如,我们正在开发用来处理手机号码的软件,其中有两个函数要使用地区编号的列表,这里要确保程序中只有一个地区编号列表,而不是为每个函数重复创建。正确的做法是创建一个保存地区编号的全局变量。更好的解决方案则是将信息保存在文件或数据库中。
函数只做一件事
我们写的每个函数应该只做一件事。如果发现函数太长,请检查其是否在完成多个任务。将函数限制为只完成一个任务有很多好处。首先,代码可读性增强,因为函数名称可以直接说明其功能。如果代码出错,调试也将更加方便,因为每个函数只负责一个特定的任务,我们可以快速隔离并调试问题函数。用许多知名程序员的话来说:“软件的复杂性大多源自试图两件事当一件事做。”
若耗费时间过长,你的做法很可能就是错的
如果你不是在处理非常复杂的问题,比如处理大数据,但是程序却要花很长时间才能加载,这时可以认为你的做法很有可能错了。
第一次就要用最佳的方法完成
在编程时你可能会这样想:“我知道有一个更好的做法,但是我已经开始编码了,不想回头重写。”那我建议你停止编码,改用更好的方法来完成。
遵循惯例
学习新编程语言的惯例,能够提升阅读用该语言编写的代码的速度。PEP8 是一系列编写Python代码的指南,强烈建议阅读,可前往https://www.python.org/dev/peps/ pep-0008/查看。
使用强大的IDE
到目前为止,我们一直使用的是Python自带的IDE——IDLE来编码。但是IDLE只是众多可选IDE中的一个,而且我也不推荐长期使用它,因为其功能有限。例如,如果使用更强大的IDE打开Python项目,每个Python文件都会有不同的选项卡。在IDLE中则是每个文件新开一个窗口,操作烦琐且文件之间来回切换困难。
笔者使用JetBrains公司开发的一款名为PyCharm的IDE。他们提供了免费版和专业版两个版本,这款IDE有如下特性能够帮助我们节省时间。
1.如果想查看某个变量、函数或对象的定义,PyCharm提供了一个快捷方式,可以跳转到定义变量、函数或对象的地方(即使是另外一个文件)。PyCharm还提供了跳回开始页面的快捷方式。
2.PyCharm有保存本地历史的特性,可以极大提升工作效率。PyCharm会在每次项目出现变动时保存一份,因此可以不推送到代码库,就能将PyCharm当做一个本地版的版本管理系统。用户不需要做任何操作,IDE将自动保存。在我了解该特性之前,我经常会在解决问题后,想要换一种方案,但是不久后又希望回滚到原方案。如果我不把原方案推送到Github,很可能早就遗失了,不得不重新编写。但是有了这个特性,我们就能回滚到10分钟前,然后重新载入当时的项目状态。如果又改变主意,也可以随意地在不同方案之前来回切换。
3.在日常工作过程中,很可能要经常复制粘贴代码。在PyCharm中,不需要复制粘贴,在当前界面上直接移动代码即可。
4.PyCharm支持Git和SVN等版本控制系统。无须使用命令行,即可直接在PyCharm中使用Git。在IDE和命令行之间切换次数越少,工作效率越高。
5.PyCharm提供了内置的命令行和Python Shell。
6.PyCharm内置了调试器(debugger)。调试器是支持中断代码执行,逐行查看代码效果的程序。通过调试器,我们可以查看不同代码中变量的值。
记录日志
记录日志(logging)指的是在软件运行时记录数据的做法。我们可通过日志来协助程序调试,更好地了解程序运行时的状态。Python自带了一个logging日志模块,支持在控制台或文件中记录日志。
程序出错时,我们不希望没有感知——我们应该记录下相关信息,方便以后核查。记录日志也有助于收集和分析信息。例如,可以搭建一个Web服务器来记录数据,包括每次收到请求的日期和时间。我们可以将所有的日志记录在数据库中,编写程序分析其中的数据,并生成图表展示访问网站的人次。
博客作者亨瑞克·沃纳(Henrik Warne)在博客中写过这样一段话:“伟大程序员与平庸程序员的区别之一,就是伟大的程序员会做日志记录,使得出错时的调试变得更简单。”
测试
程序测试指的是检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,并且实现了相关利益方所期待的效果。”为了进行程序测试,程序员要额外编写程序。
在生产环境中,测试是必须完成的。对于计划部署在生产环境的程序,我们应当认为在没有编写测试之前都是不完整的。但是,如果是一个不会再使用的临时程序,测试可能有些浪费时间。如果编写的是其他人也将使用的程序,则应该编写测试。很多知名程序员都曾说过:“未经测试的代码就是漏洞百出的代码。”
代码审查
在代码审查(code review)时,同事会阅读你的代码并提供反馈。建议尽可能多地进行代码审查,尤其对于自学成才的程序员来说。即使你遵守了本章中所列的所有最佳实践,也有可能存在错误的做法。你需要有经验的程序员对你的代码进行检查,指出所犯的错误,这样才有可能解决。
Code Review是一个专注于代码审查的程序员社区。任何人都可以登入该网站,提交代码。社区的其他成员会审查代码,并反馈做得好的地方以及可以改进的地方。
安全
对于自学的程序员来说,安全是一个很容易忽视的问题。在面试时也很少会被问到安全问题,在学习编程时我们也不会去考虑安全问题。但是,在实际工作中,我们需要对自己代码的安全性负直接责任。本节将给出几个提高代码安全性的建议。
我们在本书中已经学习了使用sudo
命令以根用户的身份执行命令。非必要情况下,务必不要在命令行使用sudo
执行命令,因为如果有黑客侵入程序的话,将会获得根访问权限。如果你是服务器管理员,还应该禁止根用户登录。每个黑客都会盯着根账号,在攻击系统时是首要选择的目标。
另外,总是假设用户的输入是恶意的。部分恶意攻击的发生,就是利用了可接受用户输入的程序漏洞,因此我们要假设所有的用户输入都是恶意的,并以此为依据进行编码。
另一个提高代码安全性的策略,是最小化你的攻击面积(attack surface),即黑客可从程序中提取数据或攻击系统的相关区域。通过最小化攻击面积,可以减少程序出现漏洞的可能性。最小化攻击面积的几种常见做法包括:避免保存敏感信息,赋予用户最低的访问权限,尽可能少用第三方库(代码量越小、漏洞越少),剔除不再使用的功能代码(代码量越小、漏洞越少)等。
避免以根用户身份登录系统,不要信任用户输入,以及最小化攻击面积,是确保程序安全性的几个重要手段。但这还只是提升安全性的一小部分。我们应该试着从黑客的角度进行思考。他们会如何利用你的代码?这样可以帮助我们找到之前可能忽略的漏洞。有关安全的话题非常大,不是本书所能涵盖的,因此建议大家时刻思考并学习如何提升安全性。布鲁斯·舒奈尔(Bruce Schneier)对此的总结十分精辟:“安全是一种思维状态。”
术语表
生产代码:某个产品中被用户使用的代码。
生产:将软件投入生产,指的是对外正式发布。
DRY:一个编程原则,“不要重复自己”的英文简称。
正交性:该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。
调试器:调试器是支持中断代码执行,可逐行查看代码效果的程序。通过调试器,我们可以查看不同代码中变量的值。
日志记录:指的是在软件运行时记录数据的做法。
测试:检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,且实现了相关利益方所期待的效果。”
代码审查:他人阅读你的代码并给予反馈的过程。
攻击面积:黑客可从程序中提取数据或攻击系统的相关区域。
02《Python编程无师自通》
在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》
《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。
这本书可以满足几乎所有想要学习编程的初学者。本书适合高中、大学阶段想要自学编程的学生,以及其他行业想入门编程的人,同时也适合作为编程入门的培训教材。
《Python编程无师自通——专业程序员的养成》 每章结尾处都有术语表和挑战练习,让你更好地学习Python 3。
目录一览
第1章 概述
第2章 起步
第3章 编程概论
第4章 函数
第5章 容器
第6章 字符串操作
第7章 循环
第8章 模块
第9章 文件
第10章 综合练习
第11章 练习
第二部分 面对对象编程简介
第12章 编程范式
第13章 面向对象编程的四大支柱
第14章 深入面向对象编程
第15章 综合练习
第三部分 编程工具简介
第16章 Bash
第17章 正则表达式
第18章 包管理器
第19章 版本控制
第20章 融会贯通
第四部分 计算机科学简介
第21章 数据结构
第22章 算法
第五部分 找到工作
第23章 最佳编程实践
第24章 第一份编程工作
第25章 团队协作
第26章 更多学习资料
第27章 下一步
书单推荐
作者:【美】Al Sweigart(斯维加特)
作者:[美] 泽德 A. 肖(Zed A. Shaw)
作者:【美】Kenneth A. Lambert(兰伯特)
作者:【美】Wesley Chun(卫斯理 春)
作者:叶维忠
- END -