🧩 第3章 捋清楚:从任务到技能五步走
📄 一句话概括

选工具的顺序是反的:先看手头有什么,再找现成的,最后才从零写。 工具给的是能力,技能给的是经验。这两样混起来说,就会写出「把代码抄进说明书」的技能。 这一篇在一台真机器上盘了一遍现成工具,同一个活用三种写法各跑一次。

📝 本章和前面几章的关系

前两篇定了「做不做」和「谁来做」,这一篇定「用什么做」。 它看起来是最琐碎的一篇,实际上决定了技能的可移植性——依赖越多,别人越装不上。 第 6 章讲设计时会用到这里的结论:可扩展的前提是依赖少。

一、先看手头有什么

写技能之前,先花两分钟盘一下这台机器上已经有什么。 Python 的标准库能覆盖大半日常:csv、json、re、sqlite3、statistics、datetime。 已经装好的命令行工具:git、node、python 自带的那一堆。 这些东西不用装、不用配、不会因为版本升级突然消失。 盘它的意义在于:很多人在装第三方库之前,压根没查过标准库有没有。 结果装了 pandas 只为算一个平均值,装了 requests 只为下一次 GET。 技能是要发给别人的。你多装一个库,别人就多一道门槛。

二、别从零写,现成的库多的是

要写的东西,九成已经有人写过。这不是偷懒,是常识。 但「现成」有三个层次,先进哪个有讲究。 第一层,标准库。零成本、零依赖、随 Python 走。 第二层,命令行工具。git 能做的事,别用 Python 再写一遍。 第三层,第三方库。功能强、接口好,但要装。「要装」本身就是成本。 顺序反了会怎样?先装库,再发现标准库早就能做——白背一个依赖,还要跟别人的环境对齐。 一个技能装三个库,就等于要求用它的人先配好这三个库。这个门槛会劝退大部分人。

三、引入第三方库的四个判断

也不是一律不装。四条判断,从上往下走。 标准库能做 → 别装。少一个依赖,少一个将来坏掉的地方。 标准库能做但很别扭 → 看情况。别扭到每次都要查文档,就装。 标准库做不了 → 装。画图、解析复杂格式、跑机器学习,这些确实做不了。 只有一个函数要用 → 别装。把那一个函数抄进来,比装一个库划算,而且不会因为那个库改版而坏。 第三条最容易被滥用。「标准库做不了」是真的做不了,不是「做起来麻烦」。 麻烦和做不了是两件事。麻烦可以忍,做不了才该装。

四、工具给能力,技能给经验

这一节是全篇的核心:工具和技能到底分什么。 工具回答「能做什么」:能不能读文件、能不能发请求、能不能画图。 技能回答「该怎么做」:先读什么、什么情况下换个做法、什么不许做。 「用 pandas 算环比」——pandas 是工具,「环比要跟上月比、跌了要单独标出来」是技能。 换一个工具,能力变了;换一个技能,还是同一批工具,只是路径变了。 所以技能正文里最该写的不是「用什么库」,是「什么顺序、什么条件下换一种做法」。 写「用 pandas 读 CSV」,等于把工具绑死在技能里——换个环境没有 pandas,技能就废了。 写「读 CSV 得到月份与金额两列,读不出来就报错停下」,这才是技能该写的东西。

五、动手 Demo:选手头的工具之前,先看看手头有什么

这一段先盘这台机器上现成的东西,再拿同一个活(按品类求和)用三种写法各跑一次。 三种写法都真跑,比的是行数、输出、以及「下一步要不要换工具」。

# 同一个活,三种写法
# 1. 纯 split:零依赖
# 2. csv 模块:标准库,省掉切分与去空行
# 3. sqlite3:标准库,适合筛选排序连接

for name, code in V:
    put(root, fn, code); run(root, [PY, fn])   # 三个都真跑

实跑输出:

--------------------------------------------------------------------
选手头的工具之前,先看看手头有什么
--------------------------------------------------------------------


  ① 这台机器上现成的东西
  --------------------------------------------------------------------
| 工具 | 在不在 | 版本 |
|---|---|---|
| git | 有 | git version 2.55.0.windows.3 |
| node | 有 | v22.22.2 |
| python | 有 | Python 3.13.14 |
| sqlite3(模块) | 有 | 3.53.1 |

  「先看手头有什么」的意思是:这些已经装好的,别再去找第三方库。

  ② 同一个活,三种写法都真跑一遍
  --------------------------------------------------------------------
| 写法 | 行数 | 跑通 | 输出 |
|---:|---|:---:|---|
| 纯 split | 7 | ok  | {'手机': 218000, '配件': 58000} |
| csv 模块 | 5 | ok  | {'手机': 218000, '配件': 58000} |
| sqlite3 当计算器 | 8 | ok  | 手机 218000 配件 58000 |

  三种写法跑出来的数字完全一致,只是格式不同。
  行数差不了几行,真正的差别在「下一步要干什么」。
  只是分组求和,csv 模块那份最短,因为它省掉了切分和去空行。
  要筛选、排序、多表连接,sqlite3 省一大截——那时候手写就是自找麻烦。
  ! 选工具的标准不是「先进」,是「下一步要做什么」。

  ③ 什么时候值得引入第三方库
  --------------------------------------------------------------------
| 情况 | 结论 | 理由 |
|---|---|---|
| 标准库能做 | 别装 | 少一个依赖,少一个将来坏掉的地方 |
| 标准库能做但很别扭 | 看情况 | 别扭到每次都要查文档,就装 |
| 标准库做不了 | 装 | 例如画图、解析复杂格式 |
| 只有一个函数要用 | 别装 | 把那一个函数抄进来,比装一个库划算 |

  技能是要发给别人的。依赖越多,别人装起来的门槛越高。
  ! 一个技能装三个库,就等于要求用的人先配好这三个库。

  ④ 工具和技能的分界
  --------------------------------------------------------------------
| 东西 | 回答什么 | 形态 | 换了会怎样 |
|---|---|---|---|
| 工具 | 能做什么 | 函数、命令、库 | 换一个就换了一种能力 |
| 技能 | 该怎么做 | 文本、步骤、边界 | 换一个还是同一批工具 |

  「用 pandas 算环比」——pandas 是工具,「环比要跟上月比、跌了要单独标出来」是技能。
  技能的价值在于把一堆工具的用法固定成一条路径。
  ! 所以技能里最该写的不是「用什么库」,是「什么顺序、什么条件下换一种做法」。

  ⑤ 别从零写:现成的在哪
  --------------------------------------------------------------------
  先翻标准库。csv、json、re、sqlite3、statistics、datetime,这六个能覆盖大半日常。
  再翻已经装在机器上的命令行工具。git、node、python 自带的那一堆。
  最后才去装第三方库,而且优先选「只依赖标准库」的那种。

  顺序反了会怎样?先装库,再发现标准库早就能做,白背一个依赖。
  技能里写死一个第三方库,将来那个库改名或停更,你的技能就跟着坏。

第一段盘了四样:git、node、python、sqlite3 模块,全都在,版本也记了。 这一段的重点不是「有什么」,是「这些已经装好的,别再去找第三方库」。 第二段三种写法都真跑:纯 split 7 行、csv 5 行、sqlite3 8 行,数字完全一致。 行数差不了几行,真正的差别在「下一步要干什么」:只是分组求和,csv 那份最短; 要筛选排序多表连接,sqlite3 省一大截。 第三段是引入第三方库的四条判断,核心是分清「做不了」和「做起来麻烦」。 第四段是工具与技能的分界:工具答「能做什么」,技能答「该怎么做」。 第五段给顺序:先翻标准库,再翻已有的命令行工具,最后才装。

30 秒实验

  1. 把你技能里用到的库列一遍,逐个查标准库能不能替。能替的换掉,依赖就少一个。
  2. 找一个「为了一个函数装了一个库」的地方,把那个函数抄进技能自己的脚本里。
  3. 把你技能正文里所有「用什么库」的句子划掉,改成「要得到什么结果」。划完读一遍,更清楚了。

常见误区

  1. 为了一个函数装一个大库。 装的时候方便,别人用的时候就是一道门槛,而且那个库一改版,你的技能就跟着坏。
  2. 把工具名写进技能正文。「用 pandas 读」,换个环境没有 pandas 就废了。 写「读 CSV 得到两列」,才是技能该说的话。
  3. 先装库再想办法。 顺序反了就会出现「为了用这个库硬设计一个流程」,而不是「为了这个流程找一个合适的工具」。
自测三问(点开对答案) 1. 选工具的正确顺序是什么? —— 先看手头有什么,再找现成的(标准库、命令行),最后才装第三方库。 2. 「标准库做不了」和「标准库做起来麻烦」有什么区别? —— 麻烦可以忍,做不了才该装。把「麻烦」当成「做不了」,是依赖膨胀的主因。 3. 工具和技能各回答什么问题? —— 工具答「能做什么」(能力),技能答「该怎么做」(经验与路径)。

下一篇讲这一章最不能省的一节:安全。三道闸、四个习惯、一张红线清单。

相关笔记