最近带一个新项目kickoff 会议开完一个刚转岗过来的同事问我咱们的 Day 0 是什么时候我当时愣了一下因为在他的理解里Day 0 就是项目启动会那天。但我心里清楚真正意义上的 Day 0其实是立项之后、铺开代码之前那一段最容易被低估的准备阶段。后来我专门花时间把 Day 0 这件事掰开揉碎讲了一遍发现很多人对它的理解都有偏差而这直接决定了项目后面是顺风顺水还是到处救火。所以这篇就来聊聊 Day 0 是什么、应该怎么过以及我踩过哪些坑。1. Day 0 到底指什么先厘清概念1.1 从运维生命周期理解 Day 0 / Day 1 / Day 2做过云原生、基础设施或 DevOps 的同学应该都听过 Day 0 / Day 1 / Day 2 的分法。这个划分原本来自云计算资源和应用的生命周期管理但现在已经被广泛借用到了项目和工程启动上。简单来说Day 0 是从“决定要做了”到“基本能干事了”的准备期包含注册账号、规划架构、申请资源、配置网络、初始化仓库、打通 CI 这一整串动作。Day 1 是应用正式上线、开始对外提供服务的那一刻。Day 2 则是长期运行阶段做监控告警、扩缩容、备份恢复、版本升级、日志治理这些事。这套框架最大的价值是提醒我们Day 0 的产出不是“开了一次会”而是一个可以直接开工的环境和一套明确的协作规则。很多项目延期问题根本不是开发效率低而是 Day 0 没做好——权限没开、规范没定、环境不一致等大家开始提交代码才发现基础没打好。我自己带团队时会强制要求 Day 0 结束前必须跑通一条最小链路哪怕功能很简陋也要让“代码从提交到上线”这条路径先通起来。1.2 为什么 Day 0 值得单独拿出来讲有人会觉得Day 0 无非是拉个仓库、建个群、写个开发规范有什么好强调的这里我想用一个词来解释不可逆性。Day 0 做的决定会在后续被不断放大。选错了分支模型合并冲突每天折磨你没做环境隔离联调时大家互相踩数据没定日志格式出了问题连排查入口都找不到。一个项目在启动阶段是最容易调整的因为代码量少、约束少、试错成本低可一旦过了这个窗口再想改就要付出好几倍的代价。换句话说Day 0 是在给项目的工程习惯“定调”。它不是流程仪式而是技术债的第一笔投资。很多团队的代码写得很乱根子往往不在某一阶段的技术水平而是在 Day 0 没舍得花时间把基础打正。只要在 Day 0 多花半天把合并策略、环境管理、配置规范这些事定明白后面一个月能省下大量扯皮时间。1.3 我眼中的 Day 0不是启动会是可运行的最小基线如果让我给 Day 0 一个自己的定义我会说它是“可运行、可协作、可追溯”的最小准备。可运行新成员拉下代码后不需要问任何人照着 README 就能在本地把服务跑起来。可协作合并流程和权限模型清晰不会出现“我到底能不能 push”这种灵魂拷问。可追溯所有配置、依赖、环境说明都进了仓库而不是存在某个人电脑的某个目录里。这三条做到了Day 0 才算真正完成。有时候团队把 Day 0 拖成了 Day 3就是因为一直在等某个资源、某个审批、某个人物而不是主动把最小闭环先跑起来。记住Day 0 不是等待一切就绪而是用最小的代价让一切开始流动。2. 拆解 Day 0 前必须想清楚的四件事2.1 目标边界Day 0 结束时你希望看到什么第一个要回答的问题是定义“完成”。如果只是开个启动会那不叫 Day 0。我建议把 Day 0 的目标定义成一张可勾选的清单比如代码仓库存在main 分支受保护PR 合并路径清晰本地开发环境和 CI 都能跑通一个最小接口MySQL、Redis、消息队列等中间件可以通过一条命令一键拉起README 写清楚了环境变量、常用命令、目录结构所有密钥和敏感配置都走了正规的存储方案没有散落在群里。目标定义清楚Day 0 就有退出条件而不是“不知道什么时候算完”。我见过不少项目Day 0 变成了每天都要开会、每天都在讨论方案持续两周都不收敛。本质就是没有把“验收标准”放在台面上。2.2 技术选型宁可保守不要炫技Day 0 最容易出现的错误是选型讨论失控。大家为了新项目兴奋想用最新版本的框架想把 K8s、Service Mesh、微服务、事件驱动全都先铺上可实际业务可能只需要一个单体服务和一张表。我自己的经验是Day 0 选型只问三个问题团队里有多少人熟悉这个技术只有一个人研究过其他人都要现学它就不适合作为默认选项。社区是否活跃踩坑时能不能搜到解决思路决定你不会被困死。它是否兼容未来三个月内的需求不要为了一年后可能需要的能力牺牲现在的交付速度。新技术不是不能用而是要给一个“试点渠道”放到边缘模块或者二期迭代里验证。项目第一天就押上全队的赌注是对团队和业务的不负责。更关键的是选型定下来后要把“为什么选、不选什么、代价是什么”写进 ADR架构决策记录这份记录比任何口头讨论都有价值半年后回头看能少很多“当初是谁非要选这个”的争论。2.3 环境与权限基础设施准备清单环境准备是 Day 0 最琐碎也最容易被拖后腿的部分。我把它拆成五块代码仓库和 CI 的权限矩阵谁能写、谁能合并、谁能改设置测试环境、预生产环境、生产环境的账号体系和命名规范环境变量和密钥的存放方式以及轮换机制依赖下载方式包括 npm、Maven、Go modules、Python 包等是否配置了私有源或镜像缓存基础设施即代码的初始模块比如云资源的 VPC、子网、安全组、数据库实例。这里要特别提醒不要图省事把生产环境的密钥直接贴到团队群里或者写进 .env 再提交到仓库。Day 0 就要规划好密钥管理方案哪怕只有一个密钥也走正规流程。一旦产生了坏的先例后面再想去纠正会比想象中难得多因为那个“临时解决方案”往往会被长期依赖。2.4 失败预案Day 0 也可能失败很多人觉得 Day 0 不会有风险又不上线怕什么但实际操作中Day 0 经常被各种莫名其妙的问题卡住。最常见的包括云资源申请两天还没批下来某个服务商接口限流数据库创建超时某个同事的电脑系统版本跟团队不一致软件装不上公司网络策略导致某些依赖无法访问。这些问题和业务代码没关系却能让 Day 0 从一天变成一周。所以我习惯在 Day 0 开始前准备一个“最坏情况预案”比如如果云端资源没到是否能先本机搭一套作为替代如果某个依赖版本拉不下来是否配置了镜像源如果网络环境受限离线安装包是否已经提前下载如果关键负责人临时有会是否有 backup 能接管。这些细节看起来过度设计但真出事的时候你会庆幸自己多留了一手。Day 0 的目标不是“零风险”而是“风险可控且任何时刻都能继续推进”。3. 一次完整 Day 0 的实操流程记录3.1 入场 30 分钟仓库、分支规范和基础文件先说我的标准动作Day 0 开始的第一个番茄钟不会去写业务代码而是先把“数字地基”整好。具体操作是创建组织级代码仓库不要个人仓库。设置 main 分支为受保护分支要求 PR 至少一个 review合并前必须通过 CI。初始化仓库时放好 .gitignore、README、LICENSE、CONTRIBUTING.md并加一个 PR 描述模板。分支模型上除非团队扩展到 20 人以上我强烈不建议一上来就搞 Git Flow。一个 main 主分支加短暂的 feature 分支已经能覆盖绝大多数小团队需求。为什么因为分支模型越复杂合并成本和理解成本越高。develop 长期分支在 CI/CD 流水线成熟后意义不大反而会增加“到底哪个分支是最新环境”的困惑。第一次初始化仓库时我会把 README 的重点写清楚项目是干什么的、怎么启动、怎么测试、依赖是什么、目录结构大概是什么。很多人觉得 README 可以以后补但 Day 0 是写 README 最好的时间因为此刻所有信息都在你脑子里写起来最准确。等项目跑起来后再补很多人会忘记当初为什么要这么设计。3.2 环境初始化依赖编排和 CI 打通接下来是环境可复现。我的做法是尽量用 Docker Compose 把本地依赖全部声明出来包括数据库、缓存、消息队列、文件存储。这样新成员不需要在自己电脑上装一堆中间件一条命令就能拉起一个一致的开发环境。应用配置要用环境变量覆盖本地默认值放在.env.example实际的值放在.env并且被 .gitignore 排除。CI 里要跑这几件事静态检查比如 lint、格式化单元测试构建产物镜像构建和推送。这里有一个很容易踩的坑CI 里的依赖安装一定要做版本锁定npm 用 package-lock.jsonPython 用 requirements.txt 或 poetry.lockGo 就提交 go.sum。否则今天构建成功明天可能因为一个传递依赖升级而失败而且这种失败特别难排查因为你的声明文件没变变的永远是“下面的东西”。在第 3.2 节里还需要注意CI 的时间和本地保持一致不要出现本地跑测试要 30 秒CI 却要 10 分钟。一个快速的 CI 反馈回路是保证团队愿意“每次提交都跑测试”的先决条件。如果 CI 慢到让人想跳过久而久之大家就不跑了Day 0 打通的链路也就形同虚设。3.3 核心模块的最小闭环让数据真正流起来Day 0 的第三个部分是建立“最小闭环”。不要贪多只做项目里最核心的一条业务链路。比如一个电商项目可以做“用户注册 - 写入读库 - 发送消息 - 消费者异步处理 - 返回成功”一个内容产品可以做“创建文章 - 保存 - 触发搜索索引更新”。这个闭环的价值在于把所有主链路牵涉到的组件真实连接起来而不是各自单独能跑。很多项目在 Day 0 之后看起来一切正常等到联调时才发现“我本地能连数据库但 CI 里连的是另一个”或者“消息队列本地能用但一到预发就找不到 Topic”。Day 0 如果能把这条主链路跑通后续功能的开发就有了可以复制的样板。实际操作中我会先手工跑一遍整个链路用 curl 调接口、查数据库、看日志确认每一步都符合预期然后立刻把它固化成 CI 里的集成测试。这样一来未来任何一次改动破坏了主链路CI 都能立刻报警而不是等上线后用户骂娘。3.4 收尾检查验收清单和 Day 0 基线标签Day 0 结束前我坚决要求团队留出最后 30 到 60 分钟做收尾检查而不是“反正都跑通了散了散了吧”。收尾检查通常分成三步第一步让每个成员按照 README 从零克隆代码在一台干净环境里从零跑一遍记录所有卡顿点。这一步能发现很多“我机器上没问题换个环境就挂了”的隐性依赖。第二步把环境变量、端口、默认账号、不同环境的访问方式全部整理进文档。尤其是测试环境和预生产环境的差异一定要写清楚。第三步在仓库里打一个day0的 Git Tag提交信息写清楚当时的决策背景选了哪些技术、为什么、有哪些已知限制。这个 Tag 是以后回溯项目的绝佳锚点。这一步看似简单但很久以后你排查线上问题时会发现有一个固定基线可以参考比翻几个月前的聊天记录高效得多。4. 常见问题与排查技巧实录4.1 权限与密钥管理不当泄露只是时间问题我做过的项目里有三次 Day 0 之后收到安全扫描告警原因都一样图省事把密钥或者内部 Token 写进了仓库。有的是放在.env里忘了加进 .gitignore有的是写在 README 里方便大家本地联调还有的直接写死在代码里。如果发现密钥已经提交到仓库第一件事不是删除而是轮换。删除文件只是删掉历史密钥依然存在于 Git 历史里任何能访问仓库的人都能翻出来。正确的处理步骤是立即撤销或轮换泄露的密钥让旧密钥失效从仓库中移除该文件并清理 Git 历史如果是敏感数据需要重写历史检查访问日志确认是否有人拉取过包含密钥的提交把这个事故的教训写进 Day 0 后的同步会议里避免重复发生。Day 0 就把密钥管理规范定下来是最省事的方案。哪怕只有一个密钥也用它该在的地方环境变量、密钥管理服务、加密配置。成本很低收益极高。4.2 环境漂移“在我机器上是好的”怎么破“在我机器上是好的”大概是工程师之间流传最广的魔咒。它的根因不是某个人不负责而是环境漂移。本地依赖版本、数据库版本、环境变量和 CI 不一致就会导致同一份代码在不同环境里行为不同。要解决这个问题最好的武器就是“复现一切”。本地能跑通的东西CI 里也必须能跑通。具体操作上我习惯在 CI 的 job 里直接跑一次docker compose up -d启动依赖再跑测试。这样不仅验证了应用代码还验证了依赖编排文件的正确性。如果中间件版本有更新也要统一维护在一个版本定义文件里让所有人使用同一个版本。另外依赖锁文件一定要提交。Node.js 项目必然有 package-lock.jsonPython 项目要有 requirements.txt 或 poetry.lockGo 项目有 go.sum。这样就算某个底层库发了一个带 bug 的新版本只要锁定文件不变项目都不会受影响。4.3 文档和沟通缺失新成员 Day 3 开始问一些低级问题Day 0 赶进度大家都很兴奋写文档容易被忽略。但第三天新成员就会开始问各种基础问题数据库密码是多少Redis 端口是多少本地测试数据在哪看日志在哪里看问的人多了团队时间就被切碎了。我的做法是“文档即代码”README 不是摆设新成员第一天照着 README 能跑起来能定位日志知道怎么提交 MR才是合格的文档。每次踩坑后把问题更新到 FAQ 里。比如“如果你跑不起来先看是不是没复制 .env.example。”这种一行字的提示能帮后面的人省下很多时间。我也建议大家都不要用聊天记录作为文档。聊天记录无法检索、无法维护、无法版本化。哪怕在群里回答过一百遍的问题也要找时间沉淀到仓库里。4.4 常见失败原因与 Day 0 应对速查表我把这几年做过的 Day 0 复盘整理成了一张表格方便你对照检查失败现象典型表现Day 0 应对策略权限缺失新成员无法 push无法访问测试环境提前列出权限申请清单并安排负责人跟进版本不一致本地测试通过CI 却挂提交锁文件统一中间件版本密钥泄露扫描工具告警或发现仓库历史含密钥Day 0 就定义密钥管理方案泄露立即轮换默认分支无人保护有人直接推到 main代码未经 review开启 branch protection强制 PR 合并缺少最小闭环各模块单独能跑整体一联调就崩串通一条主链路并固化为 CI 集成测试文档缺失新成员反复问环境问题和启动方式README 必须包含启动步骤和 FAQCI 过慢一次提交要等十几分钟团队逐渐不跑 CI优化 CI 依赖缓存拆分成并行 job没有回滚基线出了问题不知道哪个版本可用打 day0 tag记录决策背景这张表不是为了列一堆口号而是让你在 Day 0 当天把它当作检查单逐项勾掉。我自己的习惯是每做完一项就在表格后面标一个日期和负责人这样复盘的时候有迹可循。4.5 Day 0 的团队规模控制与节奏最后再分享一个小技巧Day 0 当天不要拉上全团队全员到场。人越多决策越难收敛一块屏幕抢来抢去谁都想贡献一点意见结果一天下来反而什么都没定好。我建议 Day 0 的核心成员控制在 3 到 4 个人技术负责人负责架构和最终决策后端同学负责管服务端链路前端同学确认接口约定再加一个基础架构或运维同学盯环境。其他人可以提前把开发环境装好第二天再入场这样也不会浪费大家时间。Day 0 的节奏也有讲究。上午做决策和仓库初始化下午集中打通主链路傍晚做验收和文档。如果下午遇到卡点比如某个依赖下载慢、某个服务启动报错不要一直死磕超过三十分钟就换人试试或换方案。Day 0 不是攻坚日而是铺路日把路铺通了后面才有得跑。我自己每次做完 Day 0都会私下说一句项目能不能省心看的不是代码有多优秀而是最初这一天有没有把地基打正。这不是鸡汤是这几年踩坑踩出来的真实体会。