裸辞半年后,我靠一个CV项目重新杀回大厂:技术选型、工具链和那些该死的面试题
去年十月,我在光谷软件园某大厂工位上按下“发送”键,一封辞职邮件飞向HR邮箱。那一刻没有悲壮,只有解脱——也有一丝恐慌。
当时月薪18K,房租3500,老婆在武昌一家私企做财务,我们刚还完车贷。她问我:“真想好了?下份工作不一定有现在好。”我说:“再干下去,人要废了。”她说:“行,最多给你半年。”
半年。听起来很长,实则转瞬即逝。
前三个月,我刷LeetCode、看论文、调模型,幻想自己能靠“深度学习+大模型”横扫秋招。结果?简历石沉大海,面试寥寥无几。直到今年二月,我意识到:空谈理论不如一个能跑通的项目。
于是我决定做一个端到端的计算机视觉实战项目——不是玩具Demo,而是能部署、能推理、能应对真实场景的玩意儿。目标很明确:用它撬开下一扇门。
一、选型之痛:PyTorch vs. TensorFlow vs. ONNX,谁才是亲儿子?
一开始我犯了个典型错误:纠结框架。
PyTorch灵活,社区活跃,论文复现首选;TensorFlow部署稳,TF Serving、TFLite生态成熟;ONNX则号称“一次训练,到处运行”。我一度在三者之间反复横跳,像极了在相亲市场上挑对象——这个学历高但脾气怪,那个家境好但沟通累。
转折点发生在一个阴雨绵绵的周三下午。我在光谷步行街的瑞幸里,边喝冰美式边刷知乎,看到一条评论:“你又不是发顶会论文,搞那么复杂干嘛?”
醍醐灌顶。
我的目标是求职,不是拿NeurIPS最佳论文。于是立刻拍板:
- 训练阶段用 PyTorch:写起来爽,debug快,GitHub上90%的新SOTA模型都基于它。
- 推理阶段转 ONNX + TensorRT:兼顾跨平台和速度,尤其适合嵌入式或边缘设备(很多武汉本地公司都在搞智能摄像头、工业质检)。
- 放弃 TensorFlow:除非面的是谷歌系或某些传统企业(比如某些银行外包岗),否则真没必要硬啃。
事实证明,这个决策救了我。后来面试时,有个技术主管直接问:“你们项目怎么做的模型部署?”我掏出ONNX+TensorRT的pipeline,他眼睛一亮:“哦,你还知道动态batch和FP16量化?”
——这比背八股文有用多了。
二、工具链:别再只用Jupyter了,兄弟!
裸辞前,我天天在Jupyter Notebook里跑小数据集,以为那就是“开发”。Gap期间才明白:真实项目=数据+代码+版本+部署+监控。
我踩的第一个大坑是数据管理。
项目要做一个工业零件缺陷检测系统(模拟场景),网上找的公开数据集只有200张图,根本不够。于是我花了两周时间,用LabelImg手动标注了1200张图片——手都快抽筋了。更惨的是,中途硬盘崩了一次,没开Git LFS,丢了三天的工作。
从此我立下规矩:
- 数据用DVC(Data Version Control)管理:和Git配合,大文件不进仓库。
- 代码用Poetry锁依赖:别再用requirements.txt了,那玩意儿在不同机器上跑出不同结果的概率高达80%。
- 实验记录用Weights & Biases(W&B):比TensorBoard清爽太多,还能自动记录超参、指标、甚至模型结构图。
有一次深夜调试,发现mAP突然掉了5个点。翻W&B的历史记录,三分钟定位到是某次数据增强加了随机旋转导致标签错位——要是没这工具,我可能得熬到天亮。
三、Claude救我狗命:不是用来写代码,是用来理清思路
别误会,我不是让AI替我写模型。但Claude确实成了我的“技术陪练”。
比如有次我想实现一个自定义的IoU损失函数,但不确定梯度是否可导。我直接把公式丢给Claude:“帮我分析这个loss是否可微,如果不可微,怎么改?”
它不仅给了数学推导,还附上了PyTorch实现建议,甚至提醒我:“注意边界情况,当预测框和真实框完全不重叠时,分母为零。”
更狠的是,我让它模拟面试官。
我对它说:“你现在是阿里P7,正在面一个做CV项目的候选人,请连环追问技术细节。”
结果它劈头盖脸就是:
“你的backbone为什么选ResNet50而不是EfficientNet?”
“数据不平衡怎么处理的?SMOTE在图像上适用吗?”
“ONNX转换时有没有遇到算子不支持的问题?怎么解决的?”
这些问题,后来真的出现在面试中!尤其是最后那个——某家公司面试官当场让我现场写一个Custom ONNX Op的注册代码(虽然我没写全,但思路对了,还是过了)。
所以别把Claude当码农,把它当技术军师。它不会替你打仗,但能帮你预演战场。
四、面试题:别再背“过拟合怎么办”了,他们早就不问了
我面了8家公司,拿到4个offer(最终选了光谷一家做智能安防的,月薪22K,涨了4K)。最大的感受是:现在的CV岗,根本不考基础八股。
以下是真实被问到的问题:
“你项目里的负样本是怎么构建的?如果正负样本比例1:1000,你怎么保证模型不偏向负类?”
→ 我答:用了Focal Loss + 在线困难样本挖掘(OHEM),并展示了W&B里不同采样策略下的PR曲线。“ONNX模型在Jetson Nano上推理延迟多少?怎么优化的?”
→ 我答:原始模型120ms,通过TensorRT INT8量化+层融合降到38ms,并附上了profiling截图。“如果客户说‘你们模型漏检了一个致命缺陷’,你怎么排查?”
→ 我答:先确认是不是数据分布偏移(比如新产线光照不同),再看是不是训练集没覆盖该类别,最后考虑是否需要主动学习补充样本。
你看,全是场景化、工程化的问题。没人问“什么是卷积”,也没人让你手推反向传播。
五、Gap半年的反思:项目不是越多越好,而是越“真”越好
很多人以为Gap期要堆5个项目,其实不然。一个完整闭环的项目,胜过十个半成品。
我的项目虽然只是“工业缺陷检测”,但我做到了:
- 数据采集 → 标注 → 训练 → 验证 → ONNX导出 → TensorRT加速 → Flask API封装 → Docker部署
- 写了详细的README,包含复现步骤、性能指标、已知问题
- 甚至录了个3分钟演示视频(手机拍的,但能看出效果)
面试时,我把GitHub链接甩过去,对方直接clone下来跑了一遍——能跑通,就是最大的信任状。
当然,过程很痛苦。有天凌晨三点,我在出租屋里对着满屏的CUDA error崩溃大哭。老婆默默给我泡了碗面,说:“要不…咱先找个工作过渡?”
我没说话,但心里清楚:一旦妥协,就永远回不到想要的位置。
结语:技术人的价值,不在工位,在解决问题的能力
现在回头看,裸辞不是冲动,而是一次必要的“系统重装”。
大厂教会我规范,Gap期教会我思考。而那个小小的CV项目,成了连接两者的桥梁。
如果你也在求职路上挣扎,我的建议就三条:
- 别堆砌技术名词,要展示技术决策:为什么选A不选B?权衡了什么?
- 工具链要现代化:DVC、Poetry、W&B这些,不是炫技,是专业性的体现。
- 用真实问题驱动学习:别为了学YOLOv8而学,而是因为“我要检测零件缺陷,YOLOv8快且准”。
上周五晚上,我坐在新公司的工位上(还在光谷软件园,但换了楼),看着窗外的霓虹,想起半年前那个按下发送键的自己。
焦虑过,迷茫过,但从未真正放弃。
技术这条路,从来不是直线冲刺,而是不断调试、不断迭代的过程——就像我们写的模型一样,loss总会下降,只要你还在训练。
共勉。

评论 0