name: onboarding-helper description: 为新加入团队的开发者生成全面的入职文档和指南
入职助手技能
为新加入团队的开发者生成全面的入职文档和指南。
说明
您是入职和开发者体验专家。当被调用时:
-
评估入职需求:
- 项目复杂性和技术栈
- 团队规模和结构
- 开发工作流和流程
- 领域知识要求
- 常见入职挑战
-
创建入职材料:
- 欢迎文档
- 开发环境设置指南
- 代码库架构概览
- 首个任务教程
- 团队流程和约定
-
组织学习路径:
- 第1天、第1周、第1月目标
- 渐进式复杂度
- 动手练习
- 检查点里程碑
- 资源和参考资料
-
记录团队文化:
- 沟通渠道
- 会议安排
- 代码审查实践
- 决策流程
- 团队价值观和规范
-
启用自助服务:
- 常见问题解答部分
- 故障排除指南
- 资源链接
- 询问对象
- 常见陷阱
入职文档结构
完整入职指南模板
# 欢迎加入 [项目名称]! 👋
欢迎!我们很高兴您加入团队。本指南将帮助您快速顺利地上手。
## 目录
1. [概述](#概述)
2. [第1天:入门](#第1天入门)
3. [第1周:核心概念](#第1周核心概念)
4. [第1月:产生影响](#第1月产生影响)
5. [团队与流程](#团队与流程)
6. [资源](#资源)
7. [常见问题解答](#常见问题解答)
---
## 概述
### 我们正在构建什么
我们正在构建一个现代电子商务平台,帮助小企业在线销售。我们的平台处理:
- 产品目录管理
- 购物车和结账
- 支付处理(Stripe集成)
- 订单履行和跟踪
- 客户关系管理
**我们的使命**:让电子商务对所有规模的企业都触手可及。
**我们的用户**:拥有10-1000个产品的小到中型企业主。
### 技术栈
**前端**:
- React 18 与 TypeScript
- Redux Toolkit 用于状态管理
- Material-UI 组件库
- React Query 用于 API 调用
- Vite 用于构建工具
**后端**:
- Node.js 与 Express
- PostgreSQL 数据库
- Redis 用于缓存
- Stripe 用于支付
- AWS S3 用于文件存储
**基础设施**:
- Docker 用于本地开发
- Kubernetes 用于生产
- GitHub Actions 用于 CI/CD
- AWS (EC2, RDS, S3, CloudFront)
- DataDog 用于监控
### 项目统计
- **开始时间**:2023年1月
- **团队规模**:12名工程师(4名前端,5名后端,3名全栈)
- **代码库**:约15万行代码
- **活跃用户**:5000多家企业
- **月交易额**:200万美元以上
---
## 第1天:入门
### 您的第一天清单
- [ ] 完成人力资源入职
- [ ] 添加到沟通渠道
- [ ] 设置开发环境
- [ ] 克隆仓库
- [ ] 本地运行应用
- [ ] 部署到个人开发环境
- [ ] 向团队介绍自己
- [ ] 安排与经理和伙伴的1对1会议
### 访问与账户
**所需账户**:
1. **GitHub** - 源代码 ([github.com/company/project](https://github.com))
- 向 @engineering-manager 请求访问
2. **Slack** - 团队沟通
- 频道:#engineering, #frontend, #backend, #general
3. **Jira** - 项目管理 ([company.atlassian.net](https://company.atlassian.net))
4. **Figma** - 设计文件
5. **AWS Console** - 生产访问(最初只读)
6. **DataDog** - 监控和日志
**开发工具**:
- Docker Desktop
- Node.js 18+(使用 nvm)
- PostgreSQL 客户端(psql 或 pgAdmin)
- Postman 或 Insomnia(API测试)
- VS Code(推荐,见下文扩展)
### 环境设置
#### 1. 安装先决条件
**macOS**:
```bash
# 安装 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 通过 nvm 安装 Node.js
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install 18
nvm use 18
# 安装 Docker Desktop
brew install --cask docker
# 安装 PostgreSQL 客户端
brew install postgresql@14
Windows:
# 使用 Chocolatey 安装
choco install nodejs-lts docker-desktop postgresql14
2. 克隆仓库
# 克隆仓库
git clone git@github.com:company/ecommerce-platform.git
cd ecommerce-platform
# 安装依赖
npm install
# 复制环境变量
cp .env.example .env.local
3. 配置环境变量
编辑 .env.local:
# 数据库(本地 Docker)
DATABASE_URL=postgresql://postgres:password@localhost:5432/ecommerce_dev
# Redis
REDIS_URL=redis://localhost:6379
# Stripe(使用测试密钥)
STRIPE_SECRET_KEY=sk_test_... # 从 @backend-lead 获取
STRIPE_PUBLISHABLE_KEY=pk_test_...
# AWS S3(开发桶)
AWS_ACCESS_KEY_ID=... # 从 @devops 获取
AWS_SECRET_ACCESS_KEY=...
AWS_S3_BUCKET=ecommerce-dev-uploads
# 会话
SESSION_SECRET=您的随机密钥
获取凭证的地方:
- Stripe 测试密钥:1Password 保险库“开发机密”
- AWS 凭证:在 #engineering 中向 @devops 请求
- 会话密钥:用
openssl rand -base64 32生成
4. 启动开发环境
# 启动 Docker 服务(PostgreSQL, Redis)
docker-compose up -d
# 运行数据库迁移
npm run db:migrate
# 用样本数据种子数据库
npm run db:seed
# 启动开发服务器
npm run dev
预期输出:
✔ 数据库迁移成功
✔ 种子化100个产品,50个用户
✔ 服务器运行在 http://localhost:3000
✔ API 可用在 http://localhost:3000/api
5. 验证安装
打开浏览器到 http://localhost:3000
您应该看到应用主页,显示样本产品。
测试凭证:
- 邮箱:
test@example.com - 密码:
password123
故障排除:
- 端口3000被占用:用
lsof -ti:3000 | xargs kill -9终止进程 - 数据库连接失败:用
docker ps检查 Docker 是否运行 - 模块未找到:删除
node_modules并重新运行npm install
更多帮助见故障排除指南。
VS Code 设置
推荐扩展:
{
"recommendations": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"bradlc.vscode-tailwindcss",
"ms-azuretools.vscode-docker",
"eamodio.gitlens",
"orta.vscode-jest",
"prisma.prisma"
]
}
设置(.vscode/settings.json):
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"typescript.tsdk": "node_modules/typescript/lib"
}
您的第一次提交
让我们做一个简单更改以验证您的设置:
-
创建分支:
git checkout -b test/您的姓名-设置 -
将您的姓名添加到团队页面: 编辑
src/pages/About.tsx:const teamMembers = [ // ... 现有成员 { name: '您的姓名', role: '软件工程师', joinedDate: '2024-01-15' } ]; -
测试您的更改:
npm run test npm run lint -
提交和推送:
git add . git commit -m "docs: 添加 [您的姓名] 到团队页面" git push origin test/您的姓名-设置 -
创建 PR:
- 转到 GitHub
- 点击“比较与拉取请求”
- 填写 PR 模板
- 向您的伙伴请求审查
恭喜您完成第一次贡献!🎉
第1天结束
您现在应该拥有:
- ✅ 本地运行开发环境
- ✅ 在浏览器中访问应用
- ✅ 创建了第一个 PR
- ✅ 访问所有团队工具和频道
有问题? 在 #engineering 中询问或 DM 您的伙伴!
第1周:核心概念
项目架构
高级架构
┌─────────────┐
│ 浏览器 │
│ (React) │
└──────┬──────┘
│ HTTPS
▼
┌─────────────┐ ┌──────────────┐
│ API 网关 │────▶│ 认证服务 │
│ (Express) │ │ (JWT) │
└──────┬──────┘ └──────────────┘
│
├────▶ 产品服务
│
├────▶ 订单服务
│
├────▶ 支付服务 ────▶ Stripe API
│
└────▶ 用户服务
│
▼
┌──────────┐
│PostgreSQL│
└──────────┘
目录结构
ecommerce-platform/
├── client/ # 前端 React 应用
│ ├── src/
│ │ ├── components/ # 可重用 UI 组件
│ │ ├── pages/ # 页面组件
│ │ ├── hooks/ # 自定义 React 钩子
│ │ ├── store/ # Redux 存储和切片
│ │ ├── api/ # API 客户端函数
│ │ ├── utils/ # 工具函数
│ │ └── types/ # TypeScript 类型定义
│ └── tests/ # 前端测试
│
├── server/ # 后端 Node.js 应用
│ ├── src/
│ │ ├── routes/ # Express 路由处理器
│ │ ├── controllers/ # 业务逻辑
│ │ ├── services/ # 外部集成
│ │ ├── models/ # 数据库模型(Prisma)
│ │ ├── middleware/ # Express 中间件
│ │ ├── utils/ # 工具函数
│ │ └── types/ # TypeScript 类型
│ └── tests/ # 后端测试
│
├── docs/ # 文档
├── scripts/ # 构建和部署脚本
├── .github/ # GitHub Actions 工作流
└── docker-compose.yml # 本地开发服务
关键概念
1. 认证流程
// 用户登录
POST /api/auth/login
{ email, password }
↓
// 服务器验证凭证
// 生成 JWT 令牌
↓
// 客户端存储令牌
localStorage.setItem('token', token)
↓
// 客户端在请求中包含令牌
Authorization: Bearer <token>
↓
// 服务器验证令牌
// 将用户附加到请求
req.user = decodedToken
代码位置:server/src/middleware/auth.ts
2. 状态管理(Redux)
我们使用 Redux Toolkit 进行客户端状态管理:
// 存储结构
{
auth: {
user: User | null,
isAuthenticated: boolean,
loading: boolean
},
cart: {
items: CartItem[],
total: number
},
products: {
list: Product[],
filters: FilterState,
loading: boolean
}
}
从存储读取:
import { useAppSelector } from '@/hooks/redux';
const user = useAppSelector(state => state.auth.user);
const cartItems = useAppSelector(state => state.cart.items);
分派操作:
import { useAppDispatch } from '@/hooks/redux';
import { addToCart } from '@/store/slices/cartSlice';
const dispatch = useAppDispatch();
dispatch(addToCart({ productId, quantity: 1 }));
代码位置:client/src/store/
3. API 通信
我们使用 React Query 进行服务器状态管理:
import { useQuery, useMutation } from '@tanstack/react-query';
import { api } from '@/api/client';
// 获取数据
const { data, isLoading, error } = useQuery({
queryKey: ['products'],
queryFn: () => api.products.getAll()
});
// 修改数据
const mutation = useMutation({
mutationFn: (product) => api.products.create(product),
onSuccess: () => {
queryClient.invalidateQueries(['products']);
}
});
代码位置:client/src/api/
4. 数据库访问(Prisma)
我们使用 Prisma ORM 进行数据库操作:
import { prisma } from '@/lib/prisma';
// 查找一个
const user = await prisma.user.findUnique({
where: { id: userId }
});
// 查找多个并过滤
const products = await prisma.product.findMany({
where: {
category: 'electronics',
price: { lt: 1000 }
},
include: {
images: true,
reviews: true
}
});
// 创建
const order = await prisma.order.create({
data: {
userId,
total: 100,
items: {
create: [
{ productId: 1, quantity: 2, price: 50 }
]
}
}
});
代码位置:server/src/models/
模式:prisma/schema.prisma
您的第一个真实任务
目标:为产品页面添加“最近查看”功能。
要求:
- 跟踪用户查看的产品
- 显示最近5个查看的产品
- 跨会话持久化(使用 localStorage)
- 在产品详情页显示
步骤:
-
创建特性分支:
git checkout -b feature/recently-viewed-products -
前端:添加钩子(
client/src/hooks/useRecentlyViewed.ts):export function useRecentlyViewed() { const addToRecentlyViewed = (product: Product) => { // 获取现有 const recent = JSON.parse(localStorage.getItem('recentlyViewed') || '[]'); // 添加新项(避免重复) const updated = [ product, ...recent.filter((p: Product) => p.id !== product.id) ].slice(0, 5); // 保存 localStorage.setItem('recentlyViewed', JSON.stringify(updated)); }; const getRecentlyViewed = (): Product[] => { return JSON.parse(localStorage.getItem('recentlyViewed') || '[]'); }; return { addToRecentlyViewed, getRecentlyViewed }; } -
前端:在产品页面中使用(
client/src/pages/ProductDetail.tsx):const { addToRecentlyViewed, getRecentlyViewed } = useRecentlyViewed(); useEffect(() => { if (product) { addToRecentlyViewed(product); } }, [product]); const recentProducts = getRecentlyViewed(); -
前端:显示组件(
client/src/components/RecentlyViewed.tsx):export function RecentlyViewed({ currentProductId }: Props) { const { getRecentlyViewed } = useRecentlyViewed(); const products = getRecentlyViewed() .filter(p => p.id !== currentProductId); if (products.length === 0) return null; return ( <section> <h2>最近查看</h2> <ProductGrid products={products} /> </section> ); } -
添加测试:
describe('useRecentlyViewed', () => { it('应该将产品添加到最近查看', () => { const { addToRecentlyViewed, getRecentlyViewed } = useRecentlyViewed(); addToRecentlyViewed(mockProduct); expect(getRecentlyViewed()).toContainEqual(mockProduct); }); it('应该限制为5个产品', () => { // 添加6个产品,检查只保留5个 }); it('应该将重复项移到前面', () => { // 添加相同产品两次,检查它只出现一次在前面 }); }); -
手动测试:
- 查看几个产品
- 在 DevTools 中检查 localStorage
- 验证列表出现在产品页面
- 测试边界情况(空状态,单一项)
-
创建 PR:
- 使用 PR 模板
- 添加截图
- 向 @frontend-team 请求审查
资源:
第1周学习资源
必读:
可选深潜:
- [ ] Redux Toolkit 文档
- [ ] React Query 文档
- [ ] Prisma 文档
- [ ] 我们的风格指南
第1周结束
您现在应该:
- ✅ 理解整体架构
- ✅ 了解关键技术和工具
- ✅ 完成您的第一个特性
- ✅ 理解我们的开发工作流
- ✅ 感觉舒适提问
检查点会议:与您的经理安排30分钟以审查进展。
第1月:产生影响
第1月目标
- 发布特性:独立完成3-5个特性
- 代码审查:为10个以上PR提供有意义的反馈
- 修复漏洞:处理2-3个漏洞修复
- 改进某物:找到并修复一个小痛点
- 学习领域:理解电子商务业务基础
建议特性想法
初学者友好:
- 添加产品排序(价格、评分、最新)
- 实现愿望单功能
- 创建订单历史页面
- 添加电子邮件通知
中级:
- 实现产品评论和评分
- 添加搜索自动完成
- 创建订单管理仪表板
- 优化图像加载性能
高级:
- 实现购物车放弃恢复
- 添加实时库存跟踪
- 创建推荐引擎
- 设置A/B测试框架
寻找任务:在 Jira 看板上查找标记为 good-first-issue 的问题。
代码审查最佳实践
作为作者:
- 保持PR小(< 400行更改)
- 写清晰的描述
- 为UI更改添加截图
- 及时响应反馈
- 在请求审查前彻底测试
作为审查者:
- 在24小时内审查
- 友善并具有建设性
- 提问而不是要求更改
- 突出良好实践
- 准备就绪时批准(不要挑剔)
审查清单:
- [ ] 代码遵循风格指南
- [ ] 包含测试且通过
- [ ] 生产代码中没有 console.logs
- [ ] 实现错误处理
- [ ] 考虑性能
- [ ] 遵循安全最佳实践
资源:代码审查指南
测试指南
测试内容:
- 业务逻辑(总是)
- 用户交互(重要流程)
- 边界情况和错误状态
- API集成(使用模拟)
测试金字塔:
/\
/ \ E2E 测试(少)
/────\
/ \ 集成测试(一些)
/────────\
/ \ 单元测试(多)
/────────────\
运行测试:
# 所有测试
npm test
# 监视模式
npm test -- --watch
# 覆盖率
npm test -- --coverage
# 特定文件
npm test UserService.test.ts
编写测试:
describe('CartService', () => {
describe('addToCart', () => {
it('应该将项目添加到空购物车', () => {
// 安排
const cart = new Cart();
const item = { productId: 1, quantity: 2 };
// 行动
cart.addItem(item);
// 断言
expect(cart.items).toHaveLength(1);
expect(cart.items[0]).toEqual(item);
});
it('如果项目存在应增加数量', () => {
// 测试实现
});
it('如果数量为负应抛出错误', () => {
// 测试实现
});
});
});
资源:测试指南
部署流程
环境:
- 开发:您的本地机器
- 暂存:https://staging.ecommerce.example.com
- 生产:https://ecommerce.example.com
部署流程:
主分支
│
▼
CI 运行(测试、检查、构建)
│
▼
自动部署到暂存
│
▼
手动QA测试
│
▼
创建发布标签
│
▼
部署到生产(逐步推出)
您可以部署:暂存(合并到主分支时自动) 您不能部署:生产(需要批准)
监控:
- 日志:DataDog 仪表板
- 错误:Sentry 警报
- 指标:自定义仪表板
团队与流程
团队结构
工程团队:
- 工程经理:@alice(1对1会议,职业成长)
- 技术负责人:@bob(架构决策,技术方向)
- 前端团队(4名工程师):@carol, @dave, @eve, @frank
- 后端团队(5名工程师):@grace, @henry, @ivy, @jack, @kate
- 全栈(3名工程师):@liam, @maya, @noah
相关团队:
- 产品:@olivia(产品经理)
- 设计:@peter, @quinn(UI/UX设计师)
- QA:@rachel, @sam(测试工程师)
- DevOps:@taylor(基础设施)
沟通渠道
Slack 频道:
#engineering- 一般工程讨论#frontend- 前端特定主题#backend- 后端特定主题#deploys- 部署通知#incidents- 生产问题#random- 非工作聊天
何时使用什么:
- Slack:快速问题、讨论、FYI
- Jira:任务跟踪、漏洞报告
- GitHub:代码讨论、PR审查
- 电子邮件:外部沟通、正式通知
- Zoom:会议、结对编程、深入讨论
会议
每周:
- 团队站会(周一/周三/周五,上午10点,15分钟)
- 您做了什么
- 您在做什么
- 任何阻碍
- 冲刺计划(周一,下午1点,1小时)
- 计划下一个冲刺
- 估算故事
- 回顾(周五,下午2点,45分钟)
- 什么进展顺利
- 什么可以改进
- 行动项
双周:
- 与经理的1对1(30分钟)
- 职业成长
- 反馈
- 问题
每月:
- 全体会议(第一个周五,下午3点,1小时)
- 公司更新
- 团队展示
会议规范:
- 可能时开启摄像头
- 不讲话时静音
- 准时
- 做好准备
- 做笔记
开发工作流
Git 工作流:
主分支(受保护)
├─ feature/添加愿望单
├─ fix/购物车漏洞
└─ refactor/支付服务
分支命名:
feature/描述- 新特性fix/描述- 漏洞修复refactor/描述- 代码重构docs/描述- 文档test/描述- 仅测试
提交消息:
type(scope): 描述
feat(cart): 添加愿望单功能
fix(auth): 解决令牌过期问题
docs(readme): 更新设置说明
test(orders): 添加集成测试
refactor(database): 优化查询
PR 流程:
- 创建特性分支
- 做更改
- 编写测试
- 创建 PR(使用模板)
- 请求审查(至少1个批准)
- 处理反馈
- 合并(压缩并合并)
值班轮换
您在头3个月内不会值班。
当您加入轮换时:
- 每月1周值班
- 响应 PagerDuty 警报
- 修复生产问题
- 如果需要,升级
资源:值班操作手册
资源
文档
学习资源
JavaScript/TypeScript:
React:
Node.js:
数据库:
系统设计:
内部工具
- 1Password:共享凭证
- Notion:团队维基和文档
- Figma:设计文件
- DataDog:监控和日志
- Sentry:错误跟踪
- GitHub:代码仓库
- Jira:项目管理
您的伙伴
您的入职伙伴是 @buddy-name。
您的伙伴将:
- 回答日常问题
- 审查您的头几个 PR
- 向您介绍团队
- 帮助您导航流程
- 与您每周会面(第一个月)
不要犹豫问他们任何事情!
常见问题解答
开发
问:如何重置本地数据库?
npm run db:reset # 删除所有数据并重新运行迁移
npm run db:seed # 添加样本数据
问:测试在本地失败但在 CI 通过。为什么?
- 检查 Node 版本匹配(使用
nvm use) - 清除
node_modules并重新安装 - 检查环境特定测试
问:如何调试后端?
添加 debugger; 语句并运行:
node --inspect-brk server/src/index.ts
然后打开 Chrome DevTools。
问:在哪里找到开发 API 凭证? 检查 1Password 保险库“开发机密”或在 #engineering 中询问。
代码与实践
问:何时应创建新组件 vs. 修改现有?
- 创建新:可重用、自包含功能
- 修改现有:扩展当前组件能力
- 不确定时,在 PR 审查中询问
问:期望多少测试覆盖率?
- 总体目标 80%
- 业务关键逻辑(支付、认证)100%
- 关注有价值的测试,而不仅仅是覆盖率数字
问:我可以重构我工作的代码吗? 可以,但:
- 将重构放在单独的提交中
- 不要将特性工作与大重构混合
- 对于大重构,创建单独的 PR
问:如果我不同意 PR 反馈怎么办?
- 在 PR 评论中有礼貌地讨论
- 解释您的理由
- 如果需要,升级到技术负责人
- 记住:我们都在学习
流程
问:如何报告生产漏洞?
- 在 #incidents 中发布详细信息
- 创建 Jira 票证(类型:漏洞,优先级:基于严重性)
- 如果紧急,@值班工程师
问:我可以处理不在 Jira 中的内容吗?
- 小改进:可以,之后创建票证
- 大型项目:首先与经理检查
- 技术债务:在冲刺计划中讨论
问:如何请求休假?
- 添加到团队日历
- 在 Slack 上给经理发消息
- 如果您有活跃工作,更新 Jira 看板
问:我在一个问题卡住几小时。应该怎么办?
- 尝试调试和谷歌搜索(30分钟)
- 在 #engineering 中询问(不要独自挣扎)
- 安排与队友的结对会话
- 如果仍卡住,升级到技术负责人
经验法则:卡住30分钟后寻求帮助。
职业与成长
问:如何评估绩效?
- 每季度与经理审查
- 基于:代码质量、速度、协作、成长
- 提供透明标准
问:如何了解更多关于 [特定主题]?
- 在 #engineering 中请求推荐
- 检查内部维基获取资源
- 向经理请求 Udemy/书籍预算
问:我可以切换团队/项目吗?
- 6个月后与经理讨论
- 鼓励内部流动性
欢迎加入!
记住:
- 提问:没有问题是太小的
- 休息:入职是累人的
- 耐心:需要3个多月才能感觉有生产力
- 玩得开心:我们一起构建很酷的东西!
需要帮助? 您的伙伴 (@buddy-name) 和经理 (@manager-name) 在这里为您服务。
欢迎加入团队! 🚀
## 使用示例
@onboarding-helper @onboarding-helper --type full-guide @onboarding-helper --type quick-start @onboarding-helper --type architecture-overview @onboarding-helper --focus frontend @onboarding-helper --include-exercises
## 最佳实践
### 使其个性化
- 按姓名称呼新团队成员
- 分配伙伴/导师
- 包括团队照片和简介
- 分享团队文化和价值观
### 渐进式披露
- 第1天:只是启动运行
- 第1周:理解基础
- 第1月:发布特性
- 第3月:完全生产力
### 使其互动
- 包括动手练习
- 提供起始任务
- 鼓励结对编程
- 设置定期检查
### 保持更新
- 每季度审查
- 从新员工获取反馈
- 为技术栈更改更新
- 基于常见问题改进
### 使其可发现
- 中央位置(维基,README)
- 易于导航
- 可搜索
- 版本控制
## 注释
- 入职是一个持续过程,不是一次性事件
- 优秀入职显著减少达到生产力的时间
- 文档应可发现且最新
- 为个人指导分配导师/伙伴
- 包括技术和文化入职
- 庆祝早期成功以建立信心
- 在头3个月内定期检查
- 鼓励问题并创建安全学习环境
- 提供带有里程碑的清晰学习路径
- 使资源易于访问
- 基于新员工反馈更新文档