上周有个读者私信我,说了句让我特别有感触的话:
"哥,我学Python两年了,语法都熟,但每次写东西还是打开一个.py文件从头写到尾,跟写Word文档似的。看别人的代码分了好多个文件、一堆类和函数,我根本不知道为什么要那么拆。"
我太懂这种感觉了。
因为我也是这么过来的——写了两年Python,能爬数据、能做图表、能写自动化脚本,但总觉得哪里不对。直到有一天,我接手了同事的一个项目,打开一看,500行代码全塞在一个函数里,没有注释,没有异常处理,变量名叫a、b、c。
那个人,就是多年前的我自己啊。
脚本思维 vs 工程思维,差在哪?
先别急着往下看,我问你几个问题:
- • 你有没有遇到过"改一个bug,冒出三个新bug"的情况?
如果中了两个以上,不是你Python学得不好,是你还在用脚本思维写代码。
脚本思维是:我要搞定一件事 → 打开文件 → 从头写到尾 → 跑通了 → 完事。
工程思维是:我要搞定一件事 → 这件事分几步 → 每步是一个模块 → 模块之间怎么配合 → 出错了怎么办 → 别人能不能看懂 → 以后好不好改。
区别不在于你用了多少高级语法,而在于你写代码之前有没有想结构。
三个习惯,从脚本作者变成工程师
习惯一:先画图,再写码
我以前写代码的方式是:想到哪写到哪。爬虫?先requests,再解析,再存数据库,一把梭。
后来被领导按着头改了三次代码后,我学会了一个笨办法——写代码之前先在纸上画流程。
不用画UML,不用画时序图,就画方块和箭头:
[获取数据] → [清洗数据] → [分析数据] → [输出报告] ↓ ↓ ↓ ↓ fetch() clean() analyze() report()
画完之后,每个方块就是一个函数,箭头就是调用关系。代码结构自然就出来了。
举个具体的例子。之前我写爬虫是这样的:
# 一把梭版本,350行import requestsfrom bs4 import BeautifulSoupimport csvurl = "https://example.com/data"response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# ... 后面300行全是混在一起的解析、清洗、存储逻辑
后来改成了这样:
# 工程化版本,主文件只有30行from fetcher import fetch_pagefrom parser import parse_datafrom cleaner import clean_datafrom storage import save_to_csvdefmain(): html = fetch_page("https://example.com/data") raw_data = parse_data(html) clean = clean_data(raw_data) save_to_csv(clean, "output.csv")if __name__ == "__main__": main()
每个模块各司其职,出了问题一眼就知道是哪个环节。别人接手你的代码,也不用从头读到尾。
习惯二:配置和代码分开
这是脚本思维最典型的坑:把所有东西写死在代码里。
数据库地址、API密钥、文件路径、分页大小……全硬编码。换个环境就全得改代码。
工程思维的做法很简单——用配置文件:
# config.pyclassConfig: DB_HOST = "localhost" DB_PORT = 3306 API_KEY = "your-api-key" PAGE_SIZE = 20 OUTPUT_DIR = "./output"
# main.pyfrom config import Config# 用的时候引用配置,不写死page_size = Config.PAGE_SIZE
就这一个习惯,能让你的代码可维护性提升一个档次。环境一换,改配置文件就行,代码一行不用动。
习惯三:永远假设代码会出错
脚本思维觉得"跑通了就行"。工程思维觉得"跑通了只是开始,它迟早会出问题"。
举个例子,爬虫脚本:
# 脚本思维response = requests.get(url)data = response.json()
网络一抖,requests直接抛异常,脚本崩了,之前爬的数据全没了。
# 工程思维import loggingimport timelogger = logging.getLogger(__name__)defsafe_fetch(url, max_retries=3):for attempt inrange(max_retries):try: response = requests.get(url, timeout=10) response.raise_for_status()return response.json()except requests.RequestException as e: logger.warning(f"第{attempt+1}次请求失败: {e}")if attempt < max_retries - 1: time.sleep(2 ** attempt) # 指数退避else: logger.error(f"请求{url}彻底失败: {e}")returnNone
重试、超时、日志、降级——这不是过度设计,这是最基本的工程素养。
你可能会说:"我就写个小脚本,至于吗?"
至于。因为小脚本会长大。今天50行,下个月200行,半年后变成谁都碰不得的"屎山代码"。而你,就是那个铲屎的人。
说到底,思维转变就一句话
脚本思维关心"怎么把事做完",工程思维关心"怎么把事做好且能持续做好"。
这个转变不需要你学什么新框架、新语法。你今天就可以开始:
就这三步,一个月后回头看,你的代码会完全不一样。
我见过太多Python学了三四年的朋友,技术能力其实不差,但一直停在"能写脚本"的阶段,升不上去,跳不出去。
差的不是Python,是工程思维。
如果你也有类似经历,评论区扣1,让我知道不是一个人 👇