程序员工作流
Obsidian 是开发者的理想知识管理工具,可以帮助你管理技术笔记、代码片段、项目文档和学习路径。本文介绍一套完整的程序员工作流。
核心理念
程序员使用的特点
- 技术更新快:需要持续学习和记录
- 代码复用:需要代码片段管理
- 项目管理:多项目并行需要追踪
- 文档需求:API 文档、架构设计等
推荐组织方式
开发者仓库/
├── 00-Inbox/ # 快速捕获
├── 10-技术栈/
│ ├── 前端/
│ │ ├── React/
│ │ ├── Vue/
│ │ └── CSS/
│ ├── 后端/
│ │ ├── Node.js/
│ │ ├── Python/
│ │ └── Go/
│ ├── 数据库/
│ └── DevOps/
├── 20-项目/
│ ├── 项目A/
│ └── 项目B/
├── 30-代码片段/
│ ├── JavaScript/
│ ├── Python/
│ └── Shell/
├── 40-学习路径/
│ ├── 2024/
│ └── 2025/
├── 50-日记/
└── templates/技术笔记系统
技术笔记模板
markdown
---
title: <% tp.system.prompt("技术名称") %> - 学习笔记
created: <% tp.date.now("YYYY-MM-DD HH:mm") %>
tags:
- 技术笔记
- <% tp.system.prompt("技术分类", "前端/后端/数据库/DevOps") %>
level: <% tp.system.suggester(["入门", "进阶", "精通"], ["入门", "进阶", "精通"]) %>
---
# <% tp.file.title %>
## 概述
### 什么是 <% tp.file.title.split(" - ")[0] %>?
<% tp.file.cursor() %>
## 核心概念
### 概念1
解释...
### 概念2
解释...
## 快速开始
### 安装
```bash
# 安装命令Hello World
javascript
// 代码示例
console.log("Hello World");进阶用法
1. 功能一
javascript
// 代码示例2. 功能二
javascript
// 代码示例最佳实践
常见问题
问题1
解决方案:
问题2
解决方案:
相关资源
- 官方文档:
- GitHub:
- 教程:
相关笔记
- [[]]
### 技术栈索引(MOC)
```markdown
# React MOC
## 基础概念
- [[React-组件基础]]
- [[React-Props与State]]
- [[React-生命周期]]
- [[React-Hooks入门]]
## 进阶内容
- [[React-自定义Hooks]]
- [[React-性能优化]]
- [[React-状态管理]]
- [[React-路由管理]]
## 实战项目
- [[React项目-TodoApp]]
- [[React项目-博客系统]]
- [[React项目-后台管理]]
## 常见问题
- [[React常见问题汇总]]
## 学习资源
- 官方文档:https://react.dev
- 最佳实践:[[React最佳实践]]
## 代码片段
```dataview
TABLE
description as "描述",
file.ctime as "创建时间"
FROM "30-代码片段/JavaScript"
WHERE contains(tags, "react")
SORT file.ctime DESC
### 问题解决笔记
记录 Bug 解决方案:
```markdown
---
title: 解决 <% tp.system.prompt("问题简述") %>
date: <% tp.date.now("YYYY-MM-DD HH:mm") %>
tags:
- 问题解决
- <% tp.system.prompt("技术标签") %>
solved: true
---
# <% tp.file.title %>
## 问题描述
### 错误信息<% tp.system.prompt("错误信息") %>
### 复现场景
1.
2.
3.
## 环境信息
| 项目 | 版本 |
|------|------|
| 操作系统 | |
| Node.js | |
| 相关包 | |
## 排查过程
### 尝试1
结果:
### 尝试2
结果:
## 解决方案
```javascript
// 解决代码原因分析
预防措施
相关链接
- 参考:
- 相关 Issue:
## 代码片段管理
### 代码片段模板
```markdown
---
title: <% tp.system.prompt("片段名称") %>
language: <% tp.system.suggester(["JavaScript", "Python", "Go", "Shell", "SQL"], ["JavaScript", "Python", "Go", "Shell", "SQL"]) %>
created: <% tp.date.now("YYYY-MM-DD HH:mm") %>
tags:
- 代码片段
- <% tp.frontmatter.language %>
---
# <% tp.file.title %>
## 描述
<% tp.system.prompt("简要描述此代码片段的用途") %>
## 代码
```<% tp.frontmatter.language.toLowerCase() %>
<% tp.system.prompt("代码内容") %>使用场景
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
示例
javascript
// 使用示例注意事项
### 常用代码片段示例
**防抖函数**:
```javascript
function debounce(fn, delay = 300) {
let timer = null;
return function (...args) {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}深拷贝:
javascript
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof Array) return obj.map(item => deepClone(item));
const clone = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}格式化日期:
javascript
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
const d = new Date(date);
const map = {
YYYY: d.getFullYear(),
MM: String(d.getMonth() + 1).padStart(2, '0'),
DD: String(d.getDate()).padStart(2, '0'),
HH: String(d.getHours()).padStart(2, '0'),
mm: String(d.getMinutes()).padStart(2, '0'),
ss: String(d.getSeconds()).padStart(2, '0'),
};
return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => map[match]);
}代码片段搜索
使用 Dataview 快速查找:
dataview
TABLE
language as "语言",
description as "描述",
file.ctime as "创建时间"
FROM "30-代码片段"
WHERE contains(file.content, "<% tp.system.prompt('搜索关键词') %>")
SORT file.ctime DESC项目管理工作流
项目笔记模板
markdown
---
title: <% tp.system.prompt("项目名称") %>
status: <% tp.system.suggester(["规划中", "开发中", "测试中", "已上线", "维护中"], ["规划中", "开发中", "测试中", "已上线", "维护中"]) %>
tech_stack: [<% tp.system.prompt("技术栈") %>]
created: <% tp.date.now("YYYY-MM-DD") %>
updated: <% tp.date.now("YYYY-MM-DD") %>
priority: <% tp.system.suggester(["P0-紧急", "P1-高", "P2-中", "P3-低"], ["P0", "P1", "P2", "P3"]) %>
---
# <% tp.file.title %>
## 项目概览
| 项目 | 信息 |
|------|------|
| 状态 | <% tp.frontmatter.status %> |
| 优先级 | <% tp.frontmatter.priority %> |
| 技术栈 | <% tp.frontmatter.tech_stack %> |
## 技术架构
```mermaid
graph TD
A[前端] --> B[API 网关]
B --> C[后端服务]
C --> D[数据库]开发任务
进行中
tasks
not done
path includes 20-项目/<% tp.file.title %>
heading includes 进行中待办
- [ ]
已完成
- [x]
API 文档
接口1
| 项目 | 说明 |
|---|---|
| URL | GET /api/xxx |
| 参数 | id: string |
| 返回 | { code: 0, data: {} } |
数据库设计
表1
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INT | 主键 |
| name | VARCHAR(255) | 名称 |
部署记录
| 日期 | 版本 | 说明 |
|---|---|---|
| <% tp.date.now("YYYY-MM-DD") %> | v1.0.0 | 初始版本 |
问题记录
- [[问题-xxx]]
相关文档
- [[]]
### Sprint 计划模板
```markdown
---
title: Sprint <% tp.system.prompt("Sprint编号") %> - <% tp.system.prompt("Sprint名称") %>
start: <% tp.date.now("YYYY-MM-DD") %>
end: <% tp.date.now("YYYY-MM-DD", 13) %>
---
# <% tp.file.title %>
## Sprint 信息
| 项目 | 内容 |
|------|------|
| 开始日期 | <% tp.frontmatter.start %> |
| 结束日期 | <% tp.frontmatter.end %> |
| 工作日 | 10天 |
## Sprint 目标
1.
2.
3.
## 任务看板
### 待办 (To Do)
- [ ]
### 进行中 (In Progress)
- [ ]
### 代码审查 (Code Review)
- [ ]
### 测试中 (Testing)
- [ ]
### 已完成 (Done)
- [x]
## 每日站会记录
### Day 1 - <% tp.date.now("YYYY-MM-DD") %>
**昨日完成**:
**今日计划**:
**阻碍问题**:
## Sprint 评审
### 完成情况
| 任务 | 状态 | 说明 |
|------|------|------|
| | | |
### 演示内容
1.
2.
## Sprint 回顾
### 做得好的
-
-
### 需要改进的
-
-
### 行动项
- [ ]学习路径追踪
技术学习计划
markdown
---
title: 2024年学习计划
year: 2024
---
# 2024年技术学习计划
## 学习目标
### Q1 (1-3月)
- [ ] 深入学习 React 18 新特性
- [ ] 掌握 TypeScript 高级类型
- [ ] 学习 Docker 容器化部署
### Q2 (4-6月)
- [ ] 学习 Node.js 性能优化
- [ ] 掌握 Kubernetes 基础
- [ ] 学习 GraphQL API 设计
### Q3 (7-9月)
- [ ] 学习 Go 语言基础
- [ ] 掌握微服务架构设计
- [ ] 学习分布式系统
### Q4 (10-12月)
- [ ] 深入学习系统设计
- [ ] 掌握云原生技术
- [ ] 完成个人项目
## 学习进度
```dataview
TABLE
status as "状态",
progress as "进度"
FROM "40-学习路径/2024"
WHERE status
SORT file.ctime DESC已完成
dataview
TABLE
completed_date as "完成日期"
FROM "40-学习路径/2024"
WHERE status = "completed"
SORT completed_date DESC学习统计
| 指标 | 数值 |
|---|---|
| 学习笔记数 | 45 |
| 代码片段数 | 120 |
| 完成课程 | 8 |
| 学习时长 | 200h |
### 学习资源笔记
```markdown
---
title: <% tp.system.prompt("资源名称") %>
type: <% tp.system.suggester(["书籍", "视频", "文章", "课程"], ["书籍", "视频", "文章", "课程"]) %>
status: <% tp.system.suggester(["待学习", "学习中", "已完成"], ["待学习", "学习中", "已完成"]) %>
rating: <% tp.system.suggester(["⭐", "⭐⭐", "⭐⭐⭐", "⭐⭐⭐⭐", "⭐⭐⭐⭐⭐"], [1, 2, 3, 4, 5]) %>
link:
---
# <% tp.file.title %>
## 基本信息
| 项目 | 内容 |
|------|------|
| 类型 | <% tp.frontmatter.type %> |
| 状态 | <% tp.frontmatter.status %> |
| 评分 | <% tp.frontmatter.rating %> ⭐ |
| 链接 | [<% tp.frontmatter.type %>]() |
## 内容概述
<% tp.file.cursor() %>
## 核心要点
1.
2.
3.
## 实践笔记
## 推荐理由
## 相关笔记
- [[]]日常开发流程
每日启动流程
yaml
早晨流程:
1. 打开今日日记
2. 查看今日任务
3. 回顾昨日进度
4. 规划今日开发任务
5. 查看代码审查请求开发日记模板:
markdown
---
title: <% tp.date.now("YYYY-MM-DD") %> 开发日记
tags:
- 开发日记
---
# <% tp.date.now("YYYY年MM月DD日 dddd") %>
## 今日任务
| 优先级 | 任务 | 项目 | 状态 |
|--------|------|------|------|
| P0 | | | [ ] |
| P1 | | | [ ] |
## 开发记录
<% tp.file.cursor() %>
## 学到的内容
### 技术点
-
### 最佳实践
-
## 遇到的问题
| 问题 | 解决方案 | 相关笔记 |
|------|----------|----------|
| | | [[]] |
## Code Review
- PR #123:
- PR #124:
## 明日计划
-代码审查清单
markdown
# Code Review 清单
## 功能检查
- [ ] 功能是否符合需求
- [ ] 边界条件处理
- [ ] 错误处理完善
- [ ] 日志记录合理
## 代码质量
- [ ] 命名规范
- [ ] 代码结构清晰
- [ ] 无重复代码
- [ ] 注释充分
## 性能考虑
- [ ] 数据库查询优化
- [ ] 缓存使用合理
- [ ] 内存管理
## 安全检查
- [ ] 输入验证
- [ ] SQL 注入防护
- [ ] XSS 防护
- [ ] 敏感数据处理
## 测试覆盖
- [ ] 单元测试
- [ ] 集成测试
- [ ] 边界测试推荐插件组合
开发效率
| 插件 | 用途 |
|---|---|
| Templater | 自动化模板 |
| Dataview | 数据查询统计 |
| Tasks | 任务管理 |
| QuickAdd | 快速添加 |
代码相关
| 插件 | 用途 |
|---|---|
| Code Styler | 代码样式美化 |
| Execute Code | 运行代码块 |
| Advanced Tables | 表格增强 |
| Editor Syntax | 语法高亮 |
可视化
| 插件 | 用途 |
|---|---|
| Mermaid | 流程图 |
| Excalidraw | 绘图 |
| Mind Map | 思维导图 |
| Kanban | 看板 |
Git 集成
| 插件 | 用途 |
|---|---|
| Obsidian Git | Git 同步 |
| Version History | 版本历史 |
自动化工作流
自动更新修改时间
在 Templater 启动模板中:
javascript
<%*
// 更新当前文件的修改时间
if (tp.file.title) {
let content = tp.file.content;
let newContent = content.replace(
/updated: .*/,
`updated: ${tp.date.now("YYYY-MM-DD")}`
);
if (content !== newContent) {
await tp.file.cursor_append("");
}
}
%>自动生成周报
javascript
<%*
// 获取本周所有日记
let files = app.vault.getMarkdownFiles()
.filter(f => f.path.startsWith("50-日记/"))
.filter(f => {
let fileDate = moment(f.basename);
return fileDate.isBetween(
moment().startOf('week'),
moment().endOf('week')
);
});
// 生成周报内容
tR += `## 本周完成\n\n`;
for (let file of files) {
tR += `- [[${file.basename}]]\n`;
}
%>