【前端/后端/产品/项目/运维】+【互联网项目协作】:从【核心职责拆解】到【完整协作流程】,彻底搞懂各岗位分工与落地实操,避开接口约定不清、职责边界模糊高频坑!
📑 文章目录
- 一、先打个比方:盖一栋楼
- [二、产品经理(Product Manager):决定"做什么"](#二、产品经理(Product Manager):决定“做什么”)
- [2.1 核心职责](#2.1 核心职责)
- [2.2 他们产出什么?](#2.2 他们产出什么?)
- [2.3 一个简单的 PRD 示例(节选)](#2.3 一个简单的 PRD 示例(节选))
- [三、项目经理(Project Manager):决定"什么时候做"](#三、项目经理(Project Manager):决定“什么时候做”)
- [3.1 核心职责](#3.1 核心职责)
- [3.2 和产品经理的区别](#3.2 和产品经理的区别)
- [3.3 他们产出什么?](#3.3 他们产出什么?)
- [3.4 一个简单的任务拆解示例](#3.4 一个简单的任务拆解示例)
- 四、前端(Front-end):用户看得见、点得到的一切
- [4.1 核心职责](#4.1 核心职责)
- [4.2 他们产出什么?](#4.2 他们产出什么?)
- [4.3 一个简单的前端示例(Vue 3)](#4.3 一个简单的前端示例(Vue 3))
- 五、后端(Back-end):看不见的"大脑"和"引擎"
- [5.1 核心职责](#5.1 核心职责)
- [5.2 他们产出什么?](#5.2 他们产出什么?)
- [5.3 一个简单的后端接口示例(Node.js + Express)](#5.3 一个简单的后端接口示例(Node.js + Express))
- [六、运维(DevOps / 运维工程师):保证系统稳定可用](#六、运维(DevOps / 运维工程师):保证系统稳定可用)
- [6.1 核心职责](#6.1 核心职责)
- [6.2 他们产出什么?](#6.2 他们产出什么?)
- [6.3 一个简单的部署配置示例(Docker)](#6.3 一个简单的部署配置示例(Docker))
- [七、他们是怎么一起干活的?------ 一次完整的协作流程](#七、他们是怎么一起干活的?—— 一次完整的协作流程)
- 八、总结:一张图看懂分工
- 九、给刚入行同学的建议
同学们好,我是 Eugene(尤金),一名多年中后台前端开发工程师。
(Eugene 发音 /juːˈdʒiːn/,大家怎么顺口怎么叫就好)
你是否也有过这种困惑:
代码写得越来越熟练,却总感觉自己像个 "工具人"?
听到 IaaS、PaaS、SaaS 这些词时一头雾水,只能默默点头?
被问起前台、后台、中后台的区别时,支支吾吾说不清楚?
这些 "代码之外" 的概念,不直接影响你写一个函数或组件,却决定了你对整个行业的认知高度。
它们是你从 "只会写代码的开发者",走向 "能看懂架构、理解业务的工程师" 的必经之路。
所以,我开设了这个专栏 ------《程序员理论通识:代码之外的硬核思维》。
在这里,我会用和写代码一样的 "大白话" 和 "实战视角",帮你拆解那些听起来高大上,但又至关重要的行业通识。
我们的目标很简单:不仅要会写代码,更要懂为什么这么写,以及我们的代码在整个世界里扮演着什么角色。
一、先打个比方:盖一栋楼
把开发一个网站/App 想成盖一栋楼:
| 角色 | 盖楼的比喻 | 一句话概括 |
|---|---|---|
| 产品经理 | 建筑设计师 | 决定盖什么样的楼、有几层、每层干嘛用 |
| 项目经理 | 工地总管 | 安排谁先干、谁后干、什么时候完工 |
| 前端 | 室内装修 | 用户能看到、能点的部分 |
| 后端 | 水电管线、承重结构 | 看不见,但支撑整个系统运转 |
| 运维 | 物业 + 安保 | 让楼能正常用、不出事、出问题能修 |
接下来逐一说清楚每个角色具体在做什么。
二、产品经理(Product Manager):决定"做什么"
2.1 核心职责
产品经理负责:想清楚用户要什么、业务要什么,并把这些想法写成可执行的需求。
- 做需求调研、用户访谈
- 画原型、写 PRD(产品需求文档)
- 和设计、开发、测试开会,讲清楚需求
- 验收功能是否符合预期
[⬆ 返回目录](#⬆ 返回目录)
2.2 他们产出什么?
- PRD:产品需求文档
- 原型图:线框图、交互说明
- 需求评审:通过会议把需求讲给研发和设计
[⬆ 返回目录](#⬆ 返回目录)
2.3 一个简单的 PRD 示例(节选)
需求:用户登录功能
功能描述
用户输入手机号+验证码,可登录系统。
交互流程
- 用户点击「登录」
- 弹出输入框,输入手机号
- 点击「获取验证码」,60秒内不可重复发送
- 输入验证码后点击「确定」
- 登录成功跳转到首页
异常情况
- 验证码错误:提示「验证码错误,请重试」
- 验证码过期(5分钟):提示「验证码已过期,请重新获取」
- 网络异常:提示「网络错误,请检查网络后重试」
验收标准
- 登录成功后能正确跳转
- 登录态能保持(刷新不丢失)
产品经理会把需求写得很细,前端、后端、测试都围绕这份文档工作。
[⬆ 返回目录](#⬆ 返回目录)
三、项目经理(Project Manager):决定"什么时候做"
3.1 核心职责
项目经理负责:排期、协调资源、把控进度、处理风险。
- 把需求拆成可执行的任务
- 安排谁来做、什么时候完成
- 开会同步进度、协调资源
- 处理延期、需求变更、人员变动
[⬆ 返回目录](#⬆ 返回目录)
3.2 和产品经理的区别
| 产品经理 | 项目经理 |
|---|---|
| 决定 做什么 | 决定 什么时候做 、谁来做 |
| 关心功能价值 | 关心交付时间、资源、风险 |
一句话:产品负责"方向",项目负责"落地"。
[⬆ 返回目录](#⬆ 返回目录)
3.3 他们产出什么?
- 项目计划 / 甘特图
- 任务拆解(如 Jira、Trello 上的任务)
- 周报、项目报告
[⬆ 返回目录](#⬆ 返回目录)
3.4 一个简单的任务拆解示例
Plain
项目:用户登录功能
预计工期:5 个工作日
任务拆解:
├── 产品:PRD 评审通过 [产品经理] Day 1
├── 设计:登录页 UI 稿 [UI 设计师] Day 1-2
├── 后端:登录接口开发 [后端开发] Day 2-3
├── 前端:登录页开发 [前端开发] Day 3-4
├── 联调:前后端联调 [前端+后端] Day 4
└── 测试:功能测试+回归 [测试] Day 5
前端拿到的是"登录页开发"这个任务,以及对应设计稿和 PRD。
[⬆ 返回目录](#⬆ 返回目录)
四、前端(Front-end):用户看得见、点得到的一切
4.1 核心职责
前端负责:页面展示和用户交互。
- 把设计稿还原成网页/App 页面
- 处理点击、输入、滚动等交互
- 调用后端接口获取、提交数据
- 保证在不同设备、浏览器上正常显示
[⬆ 返回目录](#⬆ 返回目录)
4.2 他们产出什么?
-
HTML / CSS / JavaScript
-
Vue / React / 小程序 等前端项目
-
打包后的静态资源
[⬆ 返回目录](#⬆ 返回目录)
4.3 一个简单的前端示例(Vue 3)
下面是一个登录页的核心代码,对应前面 PRD 的流程。
html
<template>
<div class="login-page">
<h2>用户登录</h2>
<form @submit.prevent="handleLogin">
<!-- 手机号输入 -->
<div class="form-item">
<label>手机号</label>
<input
v-model="phone"
type="tel"
placeholder="请输入手机号"
maxlength="11"
/>
</div>
<!-- 验证码输入 -->
<div class="form-item">
<label>验证码</label>
<div class="code-wrapper">
<input
v-model="code"
type="text"
placeholder="请输入验证码"
maxlength="6"
/>
<!-- 获取验证码按钮,60秒倒计时 -->
<button
type="button"
:disabled="countdown > 0"
@click="getVerifyCode"
>
{{ countdown > 0 ? `${countdown}秒后重试` : '获取验证码' }}
</button>
</div>
</div>
<button type="submit" class="submit-btn">登录</button>
</form>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
const router = useRouter()
const phone = ref('')
const code = ref('')
const countdown = ref(0)
// 获取验证码(这里需要调用后端接口,由后端发短信)
const getVerifyCode = async () => {
if (!phone.value || phone.value.length !== 11) {
alert('请输入正确的手机号')
return
}
// TODO: 调用后端接口 POST /api/sms/send
countdown.value = 60
const timer = setInterval(() => {
countdown.value--
if (countdown.value <= 0) clearInterval(timer)
}, 1000)
}
// 登录(调用后端接口验证)
const handleLogin = async () => {
if (!phone.value || !code.value) {
alert('请输入手机号和验证码')
return
}
try {
// 这里调用后端登录接口
// const res = await fetch('/api/user/login', {
// method: 'POST',
// body: JSON.stringify({ phone: phone.value, code: code.value })
// })
// 模拟登录成功
router.push('/home')
} catch (err) {
alert('登录失败:' + err.message)
}
}
</script>
<style scoped>
.login-page { padding: 20px; max-width: 400px; margin: 0 auto; }
.form-item { margin-bottom: 16px; }
.form-item label { display: block; margin-bottom: 8px; }
.code-wrapper { display: flex; gap: 8px; }
.code-wrapper input { flex: 1; }
.submit-btn { width: 100%; padding: 12px; margin-top: 16px; }
</style>
代码说明:
v-model:把输入框和phone、code双向绑定getVerifyCode:获取验证码,前端只负责倒计时和调用接口,发短信在后端handleLogin:提交手机号+验证码,真正校验在后端router.push('/home'):登录成功后跳转首页
前端不存储密码、不做复杂校验,只负责交互和调用后端接口。
[⬆ 返回目录](#⬆ 返回目录)
五、后端(Back-end):看不见的"大脑"和"引擎"
5.1 核心职责
后端负责:业务逻辑、数据处理、接口开发。
- 提供接口给前端调用
- 处理登录、注册、权限等逻辑
- 读写数据库
- 保证数据正确、安全、高效
[⬆ 返回目录](#⬆ 返回目录)
5.2 他们产出什么?
- API 接口(如 RESTful API)
- 数据库表结构、数据模型
- 业务逻辑代码(Java、Go、Node 等)
[⬆ 返回目录](#⬆ 返回目录)
5.3 一个简单的后端接口示例(Node.js + Express)
js
/**
* 用户登录接口
* 产品需求:验证手机号+验证码,正确则返回 token
*/
const express = require('express')
const app = express()
app.use(express.json())
// 模拟数据库中的验证码(实际应从 Redis 等缓存读取)
const verifyCodeStore = new Map()
// POST /api/user/login
app.post('/api/user/login', (req, res) => {
const { phone, code } = req.body
// 1. 参数校验
if (!phone || !code) {
return res.status(400).json({
success: false,
message: '手机号和验证码不能为空'
})
}
if (phone.length !== 11) {
return res.status(400).json({
success: false,
message: '手机号格式不正确'
})
}
// 2. 从缓存/数据库取出该手机号对应的验证码
const savedCode = verifyCodeStore.get(phone)
if (!savedCode) {
return res.status(400).json({
success: false,
message: '验证码已过期,请重新获取'
})
}
if (savedCode !== code) {
return res.status(400).json({
success: false,
message: '验证码错误,请重试'
})
}
// 3. 验证通过,生成 token,写入用户表(此处简化)
const token = 'mock_token_' + Date.now()
// 实际:查/建用户,存 session,写 token 等
// 4. 删除已使用的验证码,防止重复使用
verifyCodeStore.delete(phone)
res.json({
success: true,
data: { token, userId: '12345' }
})
})
app.listen(3000, () => console.log('后端服务运行在 http://localhost:3000'))
代码说明:
- 参数校验:防止空值、非法格式
- 验证码校验:从存储中取验证码对比,过期、错误都要明确返回
- Token 生成:登录成功后返回 token,前端之后请求都带上
- 删除验证码:用过的验证码不能再用
前端只负责调用这个接口并处理返回结果,不负责验证逻辑。
[⬆ 返回目录](#⬆ 返回目录)
六、运维(DevOps / 运维工程师):保证系统稳定可用
6.1 核心职责
运维负责:部署、监控、稳定性、安全。
- 把前后端代码部署到服务器
- 配置域名、证书、负载均衡
- 监控 CPU、内存、接口错误率
- 处理服务器宕机、网络故障
[⬆ 返回目录](#⬆ 返回目录)
6.2 他们产出什么?
-
部署脚本、CI/CD 流水线
-
服务器、容器(Docker)、K8s 配置
-
监控大盘、告警规则
[⬆ 返回目录](#⬆ 返回目录)
6.3 一个简单的部署配置示例(Docker)
yaml
# docker-compose.yml
# 运维用这个文件一键启动前端、后端、数据库
version: '3'
services:
# 前端:用 Nginx 托管打包后的静态文件
frontend:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html # 前端打包后的 dist 目录
depends_on:
- backend
# 后端:Node 服务
backend:
build: ./backend
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=mysql
depends_on:
- mysql
# 数据库
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: myapp
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
说明:
- 前端:打包后的
dist交给 Nginx 托管 - 后端:在容器里跑 Node 服务
- 数据库:MySQL 容器,数据持久化到卷
- 运维负责维护这些配置、监控和线上故障处理
[⬆ 返回目录](#⬆ 返回目录)
七、他们是怎么一起干活的?------ 一次完整的协作流程
用一个"用户登录"需求,串起整个流程:
plain
第1步:产品经理
└─ 写 PRD、画原型 → 评审通过
第2步:项目经理
└─ 拆任务、排期 → 前端/后端/设计各拿各自任务
第3步:UI 设计师
└─ 按 PRD 出登录页设计稿
第4步:后端
└─ 开发登录接口、验证码接口 → 提供接口文档给前端
第5步:前端
└─ 按设计稿开发页面 → 调用后端接口联调
第6步:测试
└─ 按 PRD 验收功能
第7步:运维
└─ 部署到测试/生产环境
第8步:产品经理
└─ 最终验收,确认功能符合预期
容易踩坑的地方:
-
前后端接口约定不清:字段名、格式、错误码要提前对齐,建议用接口文档(如 Swagger)
-
环境和数据不一致:本地、测试、生产的接口地址、数据库要区分清楚
-
职责边界不清:校验、权限、敏感逻辑必须在后端做,前端只做基础校验和展示
八、总结:一张图看懂分工
Plain
用户
│
▼
┌─────────────────────────────────────┐
│ 前端(你看到的、能点的)
│ Vue / React / 页面 / 交互 / 调接口
└─────────────────────────────────────┘
│
│ HTTP 请求(如登录、查数据)
▼
┌─────────────────────────────────────┐
│ 后端(业务逻辑 + 数据)
│ 接口 / 数据库 / 权限 / 发短信 等
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 运维(部署 + 监控)
│ 服务器 / Docker / 监控 / 告警
└─────────────────────────────────────┘
产品经理:决定做什么(PRD、原型)
项目经理:决定谁做、何时做(排期、协调)
九、给刚入行同学的建议
-
前端:先搞清楚自己调用的接口是谁写的、字段含义是什么,和产品、后端对齐
-
分不清产品/项目时:看这个人主要谈"功能"还是"排期、风险"
-
想成长:多参与评审、多看看 PRD 和接口文档,理解业务和协作流程
技术的世界,从来不止于编辑器里的那几行代码。
那些看似 "理论" 的知识,恰恰是让你从 "码农" 走向 "工程师" 的关键一步。
后续我会继续在这个专栏里,用大白话、讲实战的方式,拆解更多 "代码之外" 的硬核思维。
帮你建立更完整的技术认知,在面试和工作中更从容。
如果你觉得这篇内容对你有帮助,不妨点赞 + 收藏 + 关注,让我们一起在代码之外,探索更广阔的技术世界。
我是 Eugene,你的电子学友,我们下一篇见~