# PY4E 是入门课，FDE 却不该跳过后半部分

> 第 12 至 17 课讲正则、Web 服务和数据库，正对应客户交来的杂乱导出文件和无文档接口，而且全部免费。

原文: https://fdetimes.net/zh/books-courses/python-for-everybody-severance-fde-review/

Charles Severance 的课程是 Coursera 上选课人数最多的课程之一。其中的 Python for Everybody 在课程页面上写得很直白：它面向从未编过程的人。

有几年经验的工程师，很容易因此跳过它。但仔细看一遍目录就会发现，Python for Everybody 的后半部分，和前线部署工程师（FDE）在客户现场接手的第一批数据工作非常相似。

Severance 是密歇根大学信息学院的临床副教授（Clinical Associate Professor）。所有讲座、教材和练习都以知识共享署名 4.0（Creative Commons Attribution 4.0）许可证免费发布在 py4e.com 上，网站和 Python 3 版教材的源代码也公开在 GitHub：github.com/csev/py4e。

需要证书的人可以在 Coursera 上学习“Python for Everybody Specialization”，这是一个由五门入门课组成的系列。第一门课明确写着不需要任何基础。

对 FDE 来说，这门课的价值在于：客户的数据很少是干净的。更常见的是一份导出文件、一个没有文档的接口，或者一个遗留数据库。

Coursera 系列的课程名称也体现了这个方向：数据结构之后是网络数据，然后是数据库，最后一门是综合项目课，内容是用 Python 获取、处理和可视化数据。

## 从零基础一路讲到真实数据的课程大纲

py4e.com 的课程页面列出了 17 课。前几课面向还不会编程的人；第 12 到 17 课依次是正则表达式、网络编程、使用 Web 服务、面向对象编程、数据库和数据可视化。

配套教材名为《Python for Everybody: Exploring Data in Python 3》。教材的章节编号与网站上的 17 课相互独立。据 Severance 介绍，第 2 到 10 章相当忠实地改编自开源书籍 Think Python。

所以前半部分是熟悉的编程基础。后半部分以探索数据为主线，在职工程师应该把大部分时间花在这里。

## 谁该学，按什么顺序学？

如果你正从技术支持、运维或业务分析转向 FDE 岗位，就按顺序学完整的 Coursera 版。第一门课专为零基础的人设计，不需要额外准备。

如果你写过几年 Java、JavaScript 或 Go，更高效的做法是快速浏览教材第 2 到 10 章，只为熟悉语法。从 py4e.com 的第 12 课（正则）开始放慢速度，每道练习都做，因为这部分马上就用得上。

如果你已经在后端写 Python，可以把第 12 到 17 课当作一两个周末的复习练习，不必学完整门课。

## 哪三个思路值得带到客户现场？

最值得记住的思路，是把 dict 当计数器用。假设客户发来一份几千行的支持日志，每条错误行里都有类似 `ERR-1042` 的内容，客户问哪个错误出现得最多。

只需把第 12 课的正则、文件读取和 dict 的基本用法结合起来。下面的代码是示意，文件名和错误码格式均为假设：

```python
import re

counts = dict()
with open('support.log') as fh:
    for line in fh:
        m = re.search(r'ERR-(\d+)', line)
        if m:
            code = m.group(1)
            counts[code] = counts.get(code, 0) + 1

top = sorted(counts.items(), key=lambda kv: kv[1], reverse=True)
for code, n in top[:5]:
    print(code, n)
```

不到 15 行，就能在会上当场给出出现最多的五个错误码，而不是承诺下周再答复。这个模式几乎适用于所有“哪个最多”的问题：哪个客户来电最多，哪个接口最慢，哪个时段负载最高。

第二个思路是不要把网络当成黑盒。PY4E 用两课讲网络编程和 Web 服务。学的时候，问问自己请求发到了哪里、响应长什么样。等到凌晨两点客户的 API 返回一个奇怪的错误时，懂底层的人通常更快找到原因。

最后一个思路，是知道什么时候该从文件转向数据库。一次性脚本只能回答一个问题。数据进了表，就可以反复查询，别人也能直接用，不必重新跑脚本。

**要点:** 一次性脚本只回答一个问题；数据进了表，就成了客户能用的工具。

## 把计数器用在真实日志上的两个陷阱

第一个陷阱是多行日志。上面的代码逐行处理，如果一个错误附带很长的堆栈信息，错误码和真正的原因可能落在不同的行上。计数之前，先打开文件看几条完整记录，确定一条“记录”从哪里开始，不要默认一行就是一个事件。

第二个陷阱是正则太宽或太严。模式 `ERR-(\d+)` 也会匹配到引号里的句子或 URL 中的 `ERR-1042`；如果客户的系统用小写，它又会漏掉 `err-1042`。把没有匹配上的行也统计出来，再读几条：这个数字说明了你的答案有多可信。

## 把练习变成简历上的证据

参照 Coursera 综合项目课的思路，把正则、Web 服务、数据库和数据可视化这四课合成一个小项目：从公开 API 拉取数据，用正则清洗，存进数据库，再画一张图回答一个具体问题。

README 要写得像给客户的报告：客户问了什么，数据脏在哪里，结果是什么。

在简历上，按你实际做过的工作顺序（获取、清洗、存储、汇报）描述这个项目，而不是只写课程名。

## 打开课程之前先做一道练习

把上面的错误计数代码改成按一天中的小时计数，而不是按错误码计数。只需修改正则，从每行的时间戳里提取小时。

再往前走一步：不用 `print`，把结果写进一张两列的表（小时、错误数）。如果这一步卡住了，说明你应该从 PY4E 的数据库那一课开始学。

Severance 是为初学者写的这门课，但它讲得最用心的内容，也就是把真实数据从输入一路处理到答案，恰恰是很多有经验的工程师仍然薄弱的地方。

**本周动手试试:**

- 打开 py4e.com/lessons，从第 12 课（正则）开始，标出自己没把握的课程，每晚只学一课
- 找一份手头真实的日志或 CSV 文件，用自己的正则重跑本文的 dict 计数器，检查是否漏掉了多行日志记录
- 勾勒结课项目：一个公开 API、一张数据库表、一张图，再加一份写得像客户报告的 README

## 信源

- [PY4E - Python for Everybody](https://www.py4e.com/lessons)

- [PY4E - Python for Everybody](https://www.py4e.com/)

- [Python for Everybody: Exploring Data in Python 3](https://www.py4e.com/book)

- [Python for Everybody Specialization – Coursera](https://www.coursera.org/specializations/python)

- [Programming for Everybody (Getting Started with Python) – Coursera](https://www.coursera.org/learn/python)

- [Charles Severance (computer scientist) – Wikipedia](https://en.wikipedia.org/wiki/Charles_Severance_(computer_scientist))

- [csev/py4e – GitHub](https://github.com/csev/py4e)

- [Python for Everybody – Goodreads](https://www.goodreads.com/book/show/54444612-python-for-everybody)
