Python 1000 期特辑——我用 Python 做 AI 工程这3年的最大10个教训
Python 1000 期特辑——我用 Python 做 AI 工程这3年的最大10个教训
适读人群:所有关注「老张聊AI转型」的读者 | 阅读时长:约25分钟 | 核心价值:三年 AI 工程实战的真实历程与血泪教训,写给每一个在这条路上的人
写在第1000期之前
今天是个特殊的日子。
三年前,我在一个深夜坐在出租屋里,打开了一个新建的 Markdown 文件,写下了第一篇公众号文章的第一个字。当时我不知道这会成为什么,只知道我有很多东西想说——关于 Python,关于 AI,关于从传统 Java 后端工程师转型 AI 工程师这条路上,我一个人摸爬滚打踩过的那些坑。
今天,写完这篇,就是整整1000期。
我没想到会坚持这么久。老实说,中间有几次我几乎放弃了——连续发三个月没什么流量,某个周末我看着后台的阅读数,心里默默想:算了,没人看的。但最终让我继续的,是每隔一段时间就会有读者在评论区留言:"这篇文章帮了我大忙"、"按你的方法试了,确实解决了"、"终于搞明白了这个问题"。
这些留言,比任何数据都更让我觉得有意义。
这1000期,我写的不是教科书,是我真实工作过的痕迹。每一篇背后,都有一个真实发生过的故事,一个真实踩过的坑,一段真实经历的挣扎。
今天的第1000期,我不想再写技术干货,我想写一写这三年最真实的10个教训——关于 Python,关于 AI 工程,关于职业,关于我自己。
我是怎么走上这条路的
时间回到2021年初,那时候我在一家传统软件公司做了五年 Java 后端,做的是一个工厂管理系统,业务稳定,薪资一般,技术没什么成长。
那年我34岁,有一个隐约的焦虑:如果我再做五年同样的工作,然后公司裁员,我还能找到好工作吗?
就在那段时间,GPT-3 出来了。我看到一篇文章,说 AI 能写代码了,我第一反应是不信——这东西怎么可能替代程序员?但我还是好奇,用了一下,然后沉默了很久。
我意识到:不是 AI 要替代我,而是懂 AI 的工程师会替代不懂 AI 的工程师。
那天下班,我花了三个小时把 Python 装上,跑通了第一个 PyTorch 示例。从那天起,我开始系统自学 Python 和 AI,每天下班后学两个小时,周末学五六个小时,坚持了将近一年。
公众号就是在那时候开始写的——写给同样在这条路上的人,也写给那个每天在出租屋里学习、不确定方向对不对的自己。
教训一:Python 学习方法错了,浪费了三个月
我最初学 Python 的方式,是把一本厚厚的 Python 书从头到尾刷了一遍。600多页,读了三个月,刷完感觉学了很多,然后开始写项目,发现基本什么都不会。
后来我才弄清楚:学编程语言要靠手,不靠眼。看懂了不等于会写,写了一遍不等于真的掌握。
真正有效的方法是:找一个小项目驱动学习。我第二次学 Python,直接从"写一个自动备份文件的脚本"开始,遇到什么不会的查什么。第一周就写了200行真正能用的代码,比前三个月读书学到的还多。
现在我给想学 Python 的朋友的建议永远是:先找一个你真实需要的小任务,然后去搜怎么用 Python 做到它。 课程和书是辅助,任务才是驱动力。
教训二:高估了 AI 能力,低估了数据工程的重要性
2022年我加入了第一家 AI 公司做工程师,负责一个 NLP 分类项目。我当时满脑子都是模型——用什么架构、调什么参数。
项目做了三个月,模型准确率一直不理想。我换了好几个模型,从 TextCNN 换到 BERT,再换到 GPT-2,还是不行。
最后来了一个做了十年数据工程的前辈,他花了三天时间,什么模型都没换,只是重新清洗了数据——把那些标注错误的样本清理掉,把数据分布重新均衡,把文本预处理规范化——准确率从68%跳到了83%。
这件事让我彻底改变了认知:AI 项目里,70% 的价值在数据,20% 在工程,10% 在模型。 你花在调参上的时间,大多数情况下不如花在数据质量上。
这个教训我花了三个月和很多挫败感才学会,但它是我职业生涯里最重要的认知升级之一。
教训三:过度工程化浪费了大量时间
有一段时间我迷上了"优雅的代码",喜欢搞设计模式、写各种抽象层、用最新的框架。有个项目,我用了三周时间搭建了一个"完美的"微服务架构,有服务发现、有消息队列、有分布式追踪……但实际上那个项目只有我一个人开发,日活不到100人。
那个架构后来成了噩梦——每次改一个小功能,要在五个服务里改代码;调试一个 bug,要看三个系统的日志。最后项目黄掉了,原因不是业务问题,是我自己被自己写的代码搞崩溃了。
教训是:Don't engineer for problems you don't have yet. 做最简单的能工作的东西,等遇到真实的规模问题再优化。一个跑在单机上的 SQLite + FastAPI,在大多数场景里比分布式微服务更适合。
教训四:不写测试,迟早会哭
我有一段时间是典型的"不写测试"派,觉得测试是浪费时间,能运行就行。
有次我在给一个运行中的 AI 推理服务做性能优化,改了数据预处理的逻辑,上线后发现推理结果完全不对,但因为没有任何测试,当时完全不知道是哪里改出了问题。我花了将近六个小时做 diff,才找到是归一化公式改错了一个符号。
如果当初有单元测试,5秒钟就能发现。
从那以后,我养成了至少写关键路径单元测试的习惯。不要求100%覆盖率,但核心计算逻辑、数据处理管道、API 合约——这三类必须有测试。
教训五:忽视了 Java 经验的价值,反而做了弯路
转型初期我有一种奇怪的想法:我要"从头学起",不能用 Java 的思维方式来学 Python,要彻底 Python 化。
于是我刻意压制了自己的 Java 工程经验,很多在 Java 里本能知道要做的事情(连接池、事务、异常处理、并发安全),在 Python 里反而没去考虑,写了很多不鲁棒的代码。
后来我发现:工程能力是通用的,不同语言只是语法不同,好的代码结构、错误处理习惯、系统设计思维,这些东西是跨语言的。 我的 Java 背景反而是优势,因为我天然理解线程安全、事务、API 设计这些东西。
给 Java 转 Python 的同学:不用抛弃你的工程积累,Java 的工程规范在 Python 里大多数是适用的,只是写法不同。
教训六:只会用工具,不理解原理,总是被动
有一段时间我用 LangChain 做了不少东西——RAG 系统、Agent、工具调用,都能跑起来。但当出了问题,我完全不知道为什么,只会重启或者换版本。
有次 RAG 系统召回质量突然下降,我折腾了两天,换了三个 LangChain 版本,最后发现是 Embedding 模型的输入 token 超了限制,导致截断后向量失真。
如果我当时真正理解了 Embedding 的原理,这个问题五分钟就能排查出来。
只会用框架不理解原理,遇到问题就抓瞎。 这条路上我在 Transformer 架构、Embedding 原理、向量数据库的工作方式上花了额外的时间补课,这些时间花得很值。
教训七:沟通能力比技术能力重要,但我学得太慢
我在第一家 AI 公司的时候,技术能力在团队里算中上,但升职反而比技术比我差的同事慢。
后来一个前辈告诉我原因:你写代码很好,但你不会"让别人知道你写了什么"。做完了一件事情,默默放着,也不汇报,也不总结,也不复盘——管理层怎么知道你做了多少东西?
这是我那几年最大的短板:只做不说,只写代码不写文档,只解决问题不总结经验。
后来我开始写内部技术周报,每周一篇,200字,讲我这周做了什么、遇到什么问题、怎么解决的。三个月后,Leader 开始在团队里主动分享我的周报,六个月后我晋升了。
写这个公众号,除了分享技术,其实也是在锻炼这种"表达自己工作价值"的能力。
教训八:身体垮了,什么都是零
2022年下半年,我陷入了一段很疯狂的加班期——主导了一个重要项目,连续两个月几乎没有周末,平均每天工作12个小时以上。
项目上线了,成功了,得到了表扬,也拿了奖金。
但接下来两个星期,我躺平了——不是假期,是真的身体不行了,头疼、腰疼、注意力涣散,到医院检查,血压高了,睡眠质量极差。
那是我第一次真实感受到:身体不是一台机器,不能无限透支。 之后我强迫自己每天十一点之前睡觉,每周至少运动两次,哪怕加班最厉害的时候也不破这个底线。
对技术人来说,身体是最底层的基础设施,它挂了,代码、职业、一切都是零。
教训九:选择比努力重要,但不是不努力
这句话说烂了,但我是真实体会过的。
2021年初到2022年底,我选择进了一家传统软件公司的"AI部门"——其实只是给老业务加了点机器学习的包装,没有真正的 AI 产品,没有 GPU 资源,没有 AI 技术氛围。
同样的努力,在那里的一年,和后来在真正 AI 公司的一年,成长量差了三倍不止。
选平台、选方向、选赛道,这些"选择"的杠杆效应,远超个人努力。 这不是说努力不重要,而是说努力要用在正确的方向上。
给还在选择的同学:宁可降薪去一个有真实 AI 氛围的团队,也不要在一个"AI 化妆"的传统公司里虚度时间。
教训十:坚持比聪明更稀缺
说到这一条,我想说回这个公众号本身。
1000期,不是一个特别大的数字,但它代表了1000次"我今天不想写,但还是写了"。
我见过比我聪明的人,技术比我好很多,写了几篇文章,然后停了,因为"没什么人看"。我也见过很多人热血开始,三个月后就消失了。
技术能力是可以提升的,聪明程度多少是天赋,但坚持是一种可以刻意练习的选择。每周做一件有价值的事情,持续三年,就是三年后的你和三年前的你之间的差距。
如果非要说这三年最大的收获,不是技术,不是钱,是"我知道我能坚持做一件事"这个认知。
写给下一个1000期
这1000期,我写了 Python 的几乎每一个核心模块,写了 AI 工程的方方面面,写了我自己这几年的真实经历。
接下来的1000期,我想写得更深——不只是 Python,更多是 AI 系统设计、AI 工程最佳实践,以及更多真实工程故事。
如果你是最近才关注我的,欢迎翻一翻历史文章,很多干货在里面,特别是 983 到 999 这一批,是近期最系统的一批 Python 工程实践。
如果你是一直陪我走到今天的老读者——谢谢你。真的。每一个阅读,每一条留言,每一次"在看",都是我继续写下去的理由。
我们在下一个1000期见。
# 最后,送上这段代码——它不是技术,是态度
from datetime import date
start_date = date(2021, 1, 1)
today = date.today()
days = (today - start_date).days
articles = 1000
words_per_article = 3500
total_words = articles * words_per_article
print(f"开始写作: {start_date}")
print(f"今天: {today},已过 {days} 天")
print(f"写了 {articles} 篇文章")
print(f"约 {total_words:,} 字")
print(f"平均每天: {total_words / days:.0f} 字")
print()
print("感谢每一位读者。")
print("继续写,继续学,继续进步。")
print("—— 老张")