编程的核心环节
编程,是用代码表达处理信息和执行操作的规则,让计算机按照这些规则完成任务。任务可以是统计一组成绩、批量处理图片,也可以是制作一个能够与人交互的程序。本节所说的传统编程,是以人直接组织和编写代码为主的工作方式:程序员分析问题,设计处理方法和代码结构,借助工具实现,再根据运行结果检查和修改。
这个过程可以概括为五个环节:明确问题、搜集信息、设计处理方法与程序结构、逐步编写并运行程序,以及验证结果、定位错误并改进。它们会反复衔接:运行时可能发现材料不足,检查时可能发现规则含糊,修改时也可能需要重新调整代码结构。
完成这些工作,需要逐步掌握一些编程技术。例如,运行环境和依赖管理帮助程序具备运行条件,函数与模块帮助组织代码,Git 帮助保存和比较版本,测试与日志帮助检查行为、寻找问题。具体采用哪些技术,要结合任务判断:修改已有项目时可以先查阅现有测试,程序出现性能问题时再进行相应测量和分析。
下表按照核心环节整理这些技术,后文分别作简洁介绍。阅读时可以先理解每项技术解决什么问题,以及它在编程过程中起什么作用。
| 核心环节 | 重要技术 |
|---|---|
| 明确问题 | |
| 搜集信息 | 查阅现有测试;运行环境与语言版本;包管理器;依赖清单与锁文件;虚拟环境;配置文件。 |
| 设计处理方法与程序结构 | 条件与循环;函数、参数与返回值;模块划分与程序接口;数据清洗;代码注释与函数文档。 |
| 逐步编写并运行程序 | 代码编辑器与 IDE;Git 版本管理。 |
| 验证结果定位错误并改进 | 回归测试;调试输出与日志;重构;性能分析。 |
重要技术简介
1 查阅现有测试
阅读项目已经编写的检查程序,了解它检查什么、输入什么、期待什么结果;运行这些检查,可以了解当前程序是否满足已有要求。现有测试也可能存在遗漏。
2 运行环境与语言版本
程序需要合适的软件环境和语言版本才能运行。确认这些条件,可以减少因版本差异或缺少必要组件导致的运行问题。
3 包管理器
帮助安装、更新和移除代码库的工具。它也会处理库之间的依赖,减少手动寻找和安装相关组件的工作。
4 依赖清单与锁文件
依赖清单声明项目需要哪些库及允许的版本范围,锁文件记录工具解析得到的具体依赖版本。两者配合,帮助在不同时间或设备上重建所需的依赖环境。
5 虚拟环境
为项目隔离所使用的依赖,使不同项目可以使用不同版本的库,减少一个项目的安装或更新影响另一个项目。
6 配置文件
集中保存程序设置的文件,例如文件位置、处理选项和运行模式。程序读取这些设置后工作,使用者可以通过调整配置改变相应行为。
7 条件与循环
条件让程序根据情况选择操作,例如判断成绩是否及格;循环让程序重复处理,例如逐个检查一组成绩。
8 函数 参数与返回值
函数将一项工作组织成可以调用的代码。参数是调用时传入的信息,返回值是函数交回的结果,有助于拆分任务和复用实现。
9 模块划分与程序接口
模块把相关代码组织在一起,接口约定各部分怎样调用、接收什么和产生什么。职责与连接方式清楚后,程序更容易理解和修改。
10 数据清洗
检查并处理缺失、重复、格式不一致和无效数据,使后续处理能够使用符合要求的数据。具体采用修正、补充、标记还是排除,需要依据任务规则决定。
11 代码注释与函数文档
在代码附近说明用途、必要原因和使用方法。函数文档还可以解释参数、返回结果及使用限制,帮助自己和他人理解代码。
12 代码编辑器与 IDE
代码编辑器用于编写和修改代码;IDE 是集成开发环境,通常还整合运行、代码导航和项目管理等功能,便于在同一工具中完成多种编程操作。
13 Git 版本管理
查看文件状态和修改差异,选择一批改动提交为版本,并留下说明。通过历史版本、修改内容和提交说明,可以理解代码怎样形成,寻找问题由哪次修改引入;也可以比较版本、撤销修改或恢复已经保存的内容,为继续修改保留退路。
14 回归测试
修改程序后,重新检查原有功能和已经修复的问题,确认它们没有因本次修改而失效。重要的检查可以保留下来,在后续修改时重复运行。
15 调试输出与日志
记录程序执行到哪里、处理了什么和产生了什么中间结果,帮助观察运行过程并定位问题。临时输出适合即时观察,日志便于持续记录、筛选和事后查阅。
16 重构
在保持预期行为的前提下调整代码结构,例如拆分过长的函数或减少重复实现。重构后仍需检查程序,确认整理结构没有破坏原有功能。
17 性能分析
测量程序的运行时间、内存等资源消耗,找出实际瓶颈,再决定怎样优化。是否需要优化及优化目标,应由任务的性能要求决定。