1. 先想清楚:日常实习和暑期实习到底差在哪
很多人一提到大厂实习,脑子里第一反应就是"暑期实习""转正答辩""提前批",但真正走进办公室之后才发现,日常实习才是绝大多数人接触到大厂真实工作节奏的入口。所谓日常实习,本质上就是团队在项目排期里真的缺人手,需要有人来分担一部分实际工作,而不是公司为了做人才储备专门开的一条流水线。这个定位上的差异,直接决定了你在里面的体验完全不一样。
我自己是在大三下学期开始留意这类机会的。当时课程压力不算大,每周能稳定抽出三天以上到岗,这个时间条件其实是日常实习最硬的门槛。团队招人的逻辑很朴素:活要有人干,但又不值得为这件事专门走一轮校招流程,所以希望找一个能持续投入、上手快、不添乱的人。你要是只能一周来一天,或者隔三差五请假,基本第一轮就会被筛掉,这跟能力关系不大,纯粹是投入产出比的算法问题。
从内容上看,日常实习做的事情通常更"接地气"。暑期实习往往会被安排一个相对完整、可以独立讲清楚的课题,方便最后做转正汇报;而日常实习更像是一块砖,哪里需要往哪里搬——今天补一个数据看板的字段,明天改一个后台配置页的交互,后天跟着排查一个线上告警。听起来不够"高大上",但恰恰是这些碎片化的任务,能让你最快看清一个业务是怎么跑起来的。
我把这个认知差总结成三条,方便你判断自己适不适合走这条路:
- 时间投入是硬约束:至少保证每周三天、连续三个月以上,否则团队带你的成本收不回来。
- 任务颗粒度更碎:别指望一上来就负责核心模块,做好从边角需求起步的准备。
- 反馈周期更短:没有统一的带教大纲,你的成长速度高度依赖自己主动问、主动要活。
明白了这三点,后面的准备才有方向。我当时投递之前先在纸上写了一句话:"我能在三个月里稳定交付什么?"这个问题的答案,后来几乎贯穿了我整个实习期。
1.1 为什么"日常"这两个字反而更值钱
很多人会下意识觉得日常实习"档次低",其实恰恰相反。因为你是被当作真实产能来用的,所以你能接触到的东西反而更接近业务原貌。我在实习期间参与的一个需求,从需求评审到上线只用了五天,中间经历了方案讨论、接口联调、灰度放量、线上观察,全流程走了一遍。这种密度,在课堂项目或者自己写的小工具里是完全模拟不出来的。
另外一个容易被忽略的点是:日常实习的试错成本更低。团队对你的预期是"能干活的新人",而不是"必须惊艳的候选人"。你方案写得糙一点、代码注释少一点,只要态度在线、响应及时,大家是愿意教的。这种相对宽松的环境,反而给了你大量提问和犯错的空间,而能力就是在这些空间里长出来的。
1.2 投递前需要准备的硬性条件
不要急着海投,先把基础条件盘一遍。我当时列了一张检查表,逐项确认之后才动手:
| 检查项 | 具体要求 | 为什么重要 |
|---|---|---|
| 到岗时间 | 每周至少 3 天,能持续 3 个月 | 低于这个阈值,团队带人成本收不回 |
| 基础技能 | 至少一门语言能独立写业务代码 | 面试会直接考代码,不是靠嘴说 |
| 项目经历 | 有一个能讲清"我做了什么、解决了什么"的项目 | 面试官最怕听"我们团队做了…" |
| 工具链 | Git 基本操作、调试工具、抓包工具 | 入职第一天就要用,没人从零教你 |
| 沟通意愿 | 敢于提问、敢于说"我不懂" | 闷头卡三天的代价远大于问一句 |
这张表里最容易被低估的是最后一条。我见过不少同学技术底子不错,但卡在一个配置问题上硬扛两天,最后发现只是一行环境变量的路径写错了。提问不是能力弱的证明,是成本意识的体现。
1.3 别把"日常"当成"随便"
有一个心态上的坑必须提前说清楚:日常实习因为门槛看起来没那么高,很多人进去之后就自动切换成"打杂模式",让做什么做什么,从不主动往前一步。这种状态持续三个月,你的收获会非常有限,因为你只是完成了一堆任务,而没有形成自己的方法论。
我的做法是给自己定了一个节奏:每接一个需求,都强迫自己回答三个问题——这个需求上线之后谁在用?如果我不做,团队会怎么绕过它?这个改动有没有可能影响到别的链路?这三个问题问下来,你对业务的理解会从"执行者"变成"参与者",而这正是拉开差距的地方。
2. 入职第一周:别急着写代码,先把地图画出来
第一周是整个实习期性价比最高的一段时间。这时候你理直气壮地说"我不懂"是正常的,所有人都默认你在学习;一旦过了这个窗口,再问基础问题就会显得不太专业。所以第一周的目标不是产出代码,而是建立信息地图:知道代码在哪里、文档在哪里、环境怎么跑、遇到问题找谁。
我入职第一天拿到的东西很朴素:一台工作电脑、一个内部账号、一个代码仓库地址、一个沟通工具的群组。然后就没有然后了。没有人给你一份《新人上手指南》,因为团队默认这些是可以自己摸索出来的。这时候最重要的能力就是"主动找信息"——去翻仓库的 README,去看历史提交记录,去翻聊天记录里的关键词,去读团队沉淀的文档。
2.1 环境搭建:先跑起来,再谈优化
环境搭建看起来是体力活,但它其实是理解项目架构的第一课。因为当你需要把项目跑起来的时候,你会被迫搞清楚:这个服务依赖哪些中间件、配置从哪里读、数据流向哪里、本地和测试环境的差异在哪。这些信息平时藏在文档里没人细看,只有亲手跑一遍才会真正记住。
我当时的项目是一个后台服务,跑起来需要本地起数据库、缓存和消息队列三样东西。团队提供了一个容器化的编排文件,理论上一条命令就能拉起来。但实际操作中还是踩了几个坑,下面是我整理的最小可行流程(基于常见实践补充,具体命令以团队文档为准):
# 1. 拉取代码,注意用团队约定的分支命名规范 git clone <repo-url> cd <project-dir> # 2. 复制一份本地配置模板,不要直接改模板文件 cp config/application.example.yaml config/application.local.yaml # 3. 启动依赖的中间件(容器编排方式) docker compose -f deploy/local/docker-compose.yaml up -d # 4. 检查依赖服务是否就绪,端口一定要对照文档确认 docker compose -f deploy/local/docker-compose.yaml ps # 5. 安装依赖并启动应用 make install make dev这五步看起来简单,但每一步都有坑。比如第二步,很多人直接改了example文件,结果提交的时候把本地数据库密码带上去了,代码评审时被打回。再比如第三步,容器的端口在本地可能被别的进程占用,ps命令显示"已启动"但实际上根本没起来,这时候要看日志而不是看状态。
注意:本地配置文件中经常包含密钥、连接串这类敏感信息,务必确认这些文件已经被
.gitignore覆盖。提交前用git status扫一眼,看到陌生的配置文件先停下来想想。
2.2 读懂代码库:从入口开始,顺着主链路走一遍
环境跑起来之后,下一步是读代码。面对一个几十万行的仓库,硬啃是啃不动的,必须找入口。我的方法是从接口定义或者路由注册开始,顺着一次完整的请求走一遍:请求进来之后经过了哪些层、每层做了什么、数据在哪一层被转换、最后写到哪里。
这个过程不用追求全部看懂,第一遍的目标只是"能画出主链路的流程图"。我当时的做法是拿纸笔手画,画到哪一步卡住了,就把那一块标记出来,然后针对性地去看那部分的代码。画完之后你会发现,所谓的复杂系统,其实就是十几个环节串起来的流水线,只是每个环节的细节很厚。
读代码时还有几个实用技巧,我踩过坑之后总结的:
- 先看测试用例:测试用例是代码的说明书,尤其是集成测试,能直接告诉你这个模块的输入输出是什么。
- 看最近的提交记录:
git log按时间倒序看,能知道这个模块最近在改什么,哪块是热点。 - 看注释掉的历史代码:虽然不优雅,但往往藏着"为什么不能用这种写法"的原因,非常值钱。
- 别急着改:第一周只读不改,避免在还没理解上下文的时候引入问题。
2.3 快速融入:三个动作比加班有用
融入团队这件事,跟技术水平关系不大,跟信息触达效率关系很大。我总结了三个动作,做完之后明显感觉自己"在团队里"了:
第一,主动找导师对齐一次。别等着别人来安排,直接约一个十五分钟的沟通,问清楚三件事:团队当前最重要的项目是什么、我这个阶段主要负责哪块、遇到问题优先找谁。这三个问题问完,你后面所有的工作都有了参照系。
第二,在群里做一次自我介绍。不要小看这个动作,团队里几十号人,你不出声大家就不知道你来了。介绍里说清楚你的名字、负责方向、到岗时间,既礼貌又实用。
第三,建立自己的问题笔记本。每天遇到的不懂的东西记下来,能自己查的先查,查不到的攒在一起批量问。这样既不会频繁打断别人,也不会让问题烂在肚子里。
3. 一个需求从接到上线:完整流程拆解
前面讲的都是准备动作,从这里开始进入正题——日常实习里你真正要交付的东西。我把一个需求的完整生命周期拆成五个阶段:需求接收、方案设计、编码自测、联调提测、上线观察。每个阶段都有它的关键动作和被忽略的细节。
3.1 需求接收:先问清楚,再动手
很多新人拿到需求就开始写代码,写到一半发现理解错了,返工的成本比一开始多问几句高得多。我的习惯是拿到需求之后,先把需求文档通读一遍,然后在脑子里过一遍实现路径,把所有的疑问列出来,一次性找需求方确认。
这里有个判断标准很有用:你能不能用自己的话把需求复述一遍,并且让对方点头。如果你复述的时候含糊其辞,说明你还没搞懂。我在实习初期就吃过这个亏,需求里写"优化列表加载体验",我以为是要做分页,结果人家其实是想加骨架屏。方向错了,写多少代码都是白搭。
确认需求的时候,我一般会重点问这几类问题:
- 边界条件:数据为空怎么显示?字段超长怎么处理?并发操作怎么保证一致?
- 优先级:这个需求里哪部分是必须上线的,哪部分可以下期做?
- 验收标准:上线之后怎么判断这个需求做成功了?有没有可观测的指标?
- 影响范围:这个改动会影响哪些上下游,需不需要通知其他团队?
3.2 方案设计:写清楚"为什么这么选"
方案设计是新人最容易敷衍的环节,很多人觉得"需求都清楚了,直接写就行"。但一旦涉及多个模块或者需要改动公共代码,方案的价值就体现出来了。一个合格的方案不需要写得很长,但必须回答两个问题:打算怎么做,以及为什么不选另一种做法。
我举一个自己经历过的例子。当时需要一个功能:把用户的操作记录异步上报到数据平台。可选方案有两种,一种是在业务代码里直接调用上报接口,另一种是发一条消息到队列,由消费方统一处理。两种都能实现,但取舍点很清楚:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 同步调用 | 实现简单,链路短 | 拉长主流程耗时,上报失败影响业务 | 上报量小、可容忍延迟 |
| 消息队列 | 与主流程解耦,可削峰 | 需要维护消费方,存在延迟 | 上报量大、允许异步 |
最后我们选了队列方案,理由很简单:这个上报是统计用途,晚几秒没关系,但绝对不能拖慢用户的正常操作。把这个判断写进方案里,评审的时候几乎没人有异议,因为决策依据是透明的。方案的价值不在于写得多漂亮,而在于让别人能顺着你的逻辑验证你的结论。
提示:方案里最好附上埋点设计和回滚方案。上线出问题时,能第一时间回滚的人,永远比事后分析原因的人更受欢迎。
3.3 编码与自测:把"能跑"和"跑对"分开
编码阶段有两件事必须分开看:代码能不能跑起来,和代码是不是跑对了。前者靠调试器,后者靠自测用例。新人最常见的问题就是"本地跑通了就提测",结果提测之后被测试同学打回一堆问题,既浪费时间也消耗信任。
我在编码阶段的习惯是:
- 先写测试再写实现(如果团队有测试要求)。这会强迫你把接口的输入输出想清楚。
- 覆盖异常分支。正常路径谁都会测,异常路径才是 bug 的聚集地。
- 本地跑一遍 lint 和格式化。别让格式问题占用代码评审的注意力。
- 自己造数据验证边界。空值、超大值、特殊字符,能用脚本批量构造就别手工点。
下面是一段我常用的自测脚本思路,用来批量验证接口在不同输入下的行为:
import json import requests BASE = "http://localhost:8080/api/v1" cases = [ {"name": "正常查询", "params": {"id": 1001}}, {"name": "不存在的ID", "params": {"id": 99999999}}, {"name": "空参数", "params": {}}, {"name": "非法参数", "params": {"id": "abc"}}, {"name": "超长参数", "params": {"id": "9" * 500}}, ] for case in cases: resp = requests.get(f"{BASE}/detail", params=case["params"], timeout=3) print(case["name"], resp.status_code, resp.text[:120])这个脚本没什么技术含量,但它能帮你在提测之前把明显的边界问题扫一遍。花十分钟写脚本,省下的是提测后被反复打回的时间,这笔账怎么算都划算。
3.4 联调与提测:信息同步比技术本身更重要
联调阶段的核心矛盾是"跨团队协作",技术问题只占一部分,更多的是信息同步问题。接口字段对不上、环境地址不一致、时间窗口没约好,这些都会导致联调卡住。我总结的经验是:联调之前先对齐接口文档,联调之中保留现场记录,联调之后立刻同步结论。
具体来说,联调前我会做三件事:
- 把接口的请求和响应示例各写一份,用真实的字段值,不要写
xxx。 - 确认双方的测试环境地址、账号、数据是否就绪。
- 约定一个固定的联调时间窗口,避免"我这边随时可以"这种模糊表述。
联调过程中遇到问题,直接把请求和响应贴到沟通工具里,附上时间点和 trace id。这比"我这边报错了,你看下"高效十倍。因为对方能直接顺着 trace id 去看日志,而不是先来问你复现步骤。
3.5 上线与观察:发完不等于做完
上线是很多人心理上的终点,但实际上是另一个起点。代码发布之后,必须盯着几个东西:错误日志有没有突增、核心指标有没有异常波动、用户反馈有没有集中出现。团队一般会有监控看板,你要学会看,而不是发完就去吃饭。
灰度发布是最常见的方式,通常按流量比例逐步放量。这个过程里,最关键的是准备好回滚开关。如果配置项支持动态调整,出问题时能一键降级,那就等于给自己买了一份保险。我实习期间就遇到过一个小概率问题:某个字段在特定数据下会返回空,灰度到 10% 流量的时候被监控发现,因为开关齐全,五分钟就降级回去了,没有造成更大影响。
4. 代码评审:新人最容易丢分的地方
代码评审在日常实习里的权重,比很多人想象的要高。它是团队观察你的主要窗口——你的代码风格、边界意识、注释习惯、对评审意见的态度,全都在这里暴露。技术上暂时弱一点没关系,但如果评审环节反复出问题,团队对你的评价会迅速下降。
4.1 提交前自己先过一遍清单
我在提评审之前,会固定走一遍下面这张清单。这张表是我被反复打回之后总结出来的,每一条都对应一次真实的教训:
| 检查点 | 常见问题 | 自查方法 |
|---|---|---|
| 变更范围 | 混入了不相关的格式化改动 | 用git diff逐文件看,无关改动拆到另一个提交 |
| 命名 | 变量名含义模糊,缩写随意 | 把变量名读出来,读不通就改 |
| 边界处理 | 空值、超长、并发没考虑 | 对照自测用例逐条确认 |
| 日志 | 关键分支没有日志,或日志含敏感信息 | 检查打印的字段是否包含用户隐私 |
| 异常捕获 | 捕获后吞掉异常,没有上报 | 确认每个 catch 都有处理动作 |
| 注释 | 复杂逻辑没有说明 | 三个月后的自己能看懂吗 |
| 依赖 | 引入了不必要的库 | 问自己这个库能不能用现成的替代 |
这张表看起来琐碎,但真正执行下来,能把大部分低质量反馈挡在提交之前。尤其是变更范围这一条,新人特别容易犯。比如本来只改一个函数,结果编辑器自动格式化了整个文件,导致 diff 里出现几百行无关改动,评审的人根本没法看。这种问题不是技术问题,是习惯问题,但严重影响第一印象。
4.2 评审意见怎么回应才算专业
收到评审意见之后,态度和方式都很重要。我的原则是:能改就改,不能改就说清理由,不确定就问。三种情况分开处理,不要混在一起。
第一种,明显是问题的,直接改,改完回复一句"已修改,见 commit xxx"。不要长篇解释,因为解释不解决问题。
第二种,你觉得自己的写法没问题,对方的意见是风格偏好。这时候不要硬顶,也不要默默不改。可以这样回复:"这里我用的是 A 方式,因为 B 方式在这个场景下会多一次查询,不知道是不是我理解有偏差?"把判断依据摆出来,让对方来评判。大多数情况下,讨论一轮就能达成共识。
第三种,你真的没看懂对方的意思。直接问,别装懂。可以说:"这段我没太理解,是指要把这段逻辑抽到公共方法里吗?"问清楚再动手,比猜着改然后返工强。
注意:评审意见不要只回复"好的"然后不改。这种操作在团队里非常减分,因为评审人无法确认你是否真的处理了。
4.3 日志、监控与埋点:看不见的工程质量
代码评审里有一类意见特别容易被新人忽略,就是关于可观测性的。具体包括:关键路径有没有打日志、异常有没有上报、重要行为有没有埋点、指标有没有接入监控。这些东西在功能正常的时候完全看不出来,一旦出问题,就是救命的。
我的做法是在写业务逻辑的时候,同步想清楚三个问题:这条链路出错了,我怎么知道?知道之后,我能不能定位到具体是哪一步?定位到之后,我能不能快速判断影响范围?回答完这三个问题,日志和埋点该加在哪里就清楚了。
举个具体的例子。一个批量处理任务,如果不打任何日志,出问题的时候你只能看到"任务失败了",完全不知道失败在第几条、什么原因。加上分批次的进度日志和失败原因统计之后,排查效率完全不一样:
for idx, item in enumerate(items): try: process(item) except Exception as e: # 记录失败项和原因,但不要把整个 item 打印出来,避免日志过大 logger.warning("process_failed idx=%s item_id=%s err=%s", idx, item.id, e) failed.append(item.id) finally: if idx % 100 == 0: logger.info("progress idx=%s total=%s", idx, len(items)) logger.info("batch_done total=%s failed=%s", len(items), len(failed))这段代码的价值不在于逻辑多巧妙,而在于它让事后排查从"猜"变成了"查"。评审的时候,这类细节往往比业务逻辑本身更能体现一个人的工程素养。
5. 沟通协作:把事推下去的能力
实习期间我最大的感受是:技术能力决定你能做什么,沟通能力决定你能做成什么。因为在真实的团队里,几乎没有一件事是你一个人能独立完成的。你需要别人给你权限、给你数据、给你接口、给你评审、给你排期。这些环节里任何一个卡住,你的进度就停在那里。
5.1 日报和周报:别写成流水账
很多团队要求实习生写日报或者周报。我刚开始也很抗拒,觉得是形式主义。但写得多了之后发现,这东西其实是在帮你做两件事:一是让团队知道你在做什么,二是逼你自己复盘。
一份好的日报不长,三五行就够,但必须包含三要素:做了什么、遇到什么、下一步计划。反面例子是"今天学习了项目代码,了解了业务流程",这种写法等于什么都没说。正面例子是"完成了订单列表的接口适配,联调时发现分页字段和历史接口不一致,已和对方确认按新字段走,明天补充异常分支的测试用例"。
对比一下就知道差别在哪:前者是状态描述,后者是可验证的信息。团队看你的日报,是想知道进度有没有风险,而不是想读你的心情感悟。
5.2 跨团队沟通:措辞和节奏都很关键
跨团队沟通最容易出问题的地方,不是技术分歧,而是表达方式。同样一件事,说法不同,对方的配合意愿完全不一样。我总结了几条自己摸索出来的原则:
- 先说背景,再说诉求。不要上来就说"你帮我改一下接口",而是先说清楚这是在做什么事、为什么要改、影响多大。
- 给出具体选项,而不是让对方思考。"这两个方案你看哪个合适"比"你觉得怎么办"更容易得到回复。
- 明确时间预期。"这周五之前能给个初步结论吗"比"有空看下"有效得多。
- 不要越级。有问题先找直接对接人,别一上来就拉着对方的负责人。
还有一点特别重要:别在群里公开质疑别人。如果发现对方给的数据有问题,先私聊确认,确认之后再决定要不要在群里同步。公开指责除了让关系变差,解决不了任何问题。
5.3 和导师的关系:主动而不是被动
导师是你在团队里最重要的资源,但他通常也有自己的本职工作,不可能全天候盯着你。所以关系维护的关键是主动管理预期,而不是被动等安排。
我的做法是每周固定花十分钟和导师同步一次,内容包括:这周做了什么、下周计划做什么、有没有需要他帮忙推动的事情。这个同步不需要很长,但一定要有。因为导师最怕的不是你做得慢,而是你悄悄卡住了不说,等到 deadline 才暴露问题。
另外一个小技巧:每次请教问题之前,先自己给出两个可能的答案,然后问"我倾向于 A,因为…,你觉得呢?"这种提问方式传递的信号是"我思考过了",而不是"你来替我解决"。同样的一个问题,这两种问法得到的回答质量完全不同。
6. 常见问题与排查实录:那些没人写在文档里的坑
这部分是我最想分享的内容,因为前面那些流程类的东西,稍微正规一点的团队都有文档;真正难的是那些文档里不会写、只能靠踩坑积累的经验。我把实习期间遇到的问题整理成了速查表,分成环境、联调、流程三类,方便你按图索骥。
6.1 环境类问题速查
环境问题的特点是"看起来很简单,找起来很要命"。因为大部分报错信息都很模糊,只能靠经验缩小范围。下面这张表是我实际用过的排查路径:
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 服务启动失败但无报错 | 端口被占用或配置未加载 | 查端口占用,确认配置文件的生效路径 |
| 接口返回 404 | 路由未注册或网关配置缺失 | 先直连服务,绕过网关确认服务本身是否正常 |
| 数据库连接超时 | 网络策略或白名单未加 | 确认本机 IP 是否在允许列表内 |
| 依赖安装失败 | 源地址不可用或版本冲突 | 换源重试,检查锁文件的版本约束 |
| 本地正常线上异常 | 环境变量或配置差异 | 逐项对比两边配置,重点看开关项 |
这张表里最值得说的是最后一行。本地正常、线上异常,几乎是所有新人都遇到过的问题,而根源绝大多数情况下就是配置差异。所以养成一个习惯:每次上线前,把本地改动过的配置项列一遍,确认线上是否需要同步调整。这个动作花不了一分钟,但能避免很多事故。
6.2 联调问题:九成出在字段和时序上
联调的问题看起来五花八门,但真正的原因高度集中。我统计了一下自己遇到的情况,大概可以归成三类:
第一类是字段对不上。比如时间格式,一边传时间戳,一边传字符串;再比如空值表示,一边用null,一边用空字符串。这类问题的解决方式是联调前就把字段的类型、格式、是否可空全部列在文档里,逐条对齐。
第二类是时序问题。比如 A 服务发消息、B 服务消费,但 B 还没启动完成,消息就丢了。这类问题要靠重试机制和幂等设计来解决,不能指望"顺序永远正确"。
第三类是数据不一致。两边读的是不同的库,或者一边有缓存一边没有。排查这类问题最快的办法是对比同一时刻两边看到的数据,而不是先去看代码。
提示:联调时养成记录 trace id 的习惯。有了它,排查问题基本就是从"大海捞针"变成"顺着线索走"。
6.3 流程类问题:不好意思问但必须问
还有一类问题,新人往往因为不好意思而拖着不问,最后拖出更大的麻烦。比如:
- 不清楚某个权限该找谁开。直接问导师,别自己在群里乱问,容易打扰到不相关的人。
- 不知道发布窗口是什么时候。一定问清楚,不同团队的发布节奏差异很大。
- 不确定自己的改动会不会影响别人。宁可多问一句,也不要上线之后才发现问题。
- 不清楚测试同学的验收标准。提前对齐,比自己猜着做省事得多。
这些问题共同的特点是:问一句成本极低,不问的代价极高。我在实习初期也犯过"怕麻烦别人"的毛病,结果因为不知道发布窗口,硬生生等了一周。后来想明白了,在团队里,信息不对称才是最贵的成本,你主动问,别人反而觉得你靠谱。
7. 实习期间的时间管理和自我复盘
技术之外,能决定实习体验好坏的还有两件事:时间怎么分配,以及你有没有在做复盘。这两件事没人会教你,但影响很大。
7.1 时间分配:把"深度工作"和"沟通"分开
实习期间每天的时间其实很碎:写代码、开会、答疑、联调、看文档,全都混在一起。如果不做区分,很容易出现"忙了一天但什么都没推进"的情况。我的做法是把一天切成几块:上午用来做需要专注的事,比如写代码、看复杂的逻辑;下午留给沟通类的事,比如联调、开会、答疑;临近下班留半小时做收尾,处理零碎问题和写日报。
这个划分的依据是注意力成本。写代码需要连续的注意力,被打断一次要很久才能回到状态;而沟通类的事情本身就适合碎片化处理。把两类事情混在一起做,结果是两边都做不好。自从我把它们分开之后,同样的工作量,完成质量明显提升。
7.2 每周复盘:三个问题就够
复盘不用搞得很复杂,我每周固定问自己三个问题:
- **这周交付了什么可以验证的结果?**注意是"可验证的",不是"参与了什么"。
- **卡住我时间最久的是什么?下次怎么避免?**这个问题往往能挖出真正需要改进的地方。
- **我学到了什么文档里没有的东西?**如果不写下来,下次真的会忘。
这三个问题写下来也就十分钟,但积累几周之后回看,你会发现自己成长最快的地方,往往就是第二个问题暴露出来的那些。
7.3 那些我踩过之后印象最深的坑
最后分享几个具体到细节的教训,都是我自己经历过、印象特别深的:
坑一:以为"提交了"就是"做完了"。有一次我提了代码就去做别的事,结果评审意见三天后才看到,导致需求延期。后来我改了习惯,提评审之后主动在群里 @ 一下评审人,并且每天固定看一次评审状态。
坑二:日志打得太随意。有一次排查问题,发现日志里全是"进入方法""执行成功"这种没信息量的内容,真正关键的参数一个没打。后来我把日志标准改成"能还原现场",也就是不看代码只看日志,也能知道发生了什么。
坑三:测试只看正常路径。这个前面提过,但值得再强调一次。真正让我吃大亏的都是边界情况,尤其是并发和空值。
坑四:不敢问问题。一个配置问题卡了我整整两天,最后问了一句,对方十秒钟就给了答案。事后想想,这两天完全可以用来做更有价值的事。从那以后我就给自己定了个规矩:卡住超过一小时,就主动求助。
坑五:只顾着做需求,没看业务全貌。有一段时间我完成任务的速度很快,但被问到"这个功能对业务意味着什么"时答不上来。后来我开始主动看一些业务数据,理解每个功能背后的意图,工作和沟通都顺畅了不少。
如果让我给准备去实习的人一句建议,那就是:把实习当成一次低成本的职业探索,而不是一场考试。考试有标准答案,工作没有。你在里面遇到的每一个卡点、每一次返工、每一句被指出的问题,都是真实的信息,它们比任何一份面经都更能告诉你——你适合做什么,以及你还需要补什么。至于结果,尽力做到每一件事都有交代、每一个问题都有下文,剩下的交给时间就好。