Skip to content

程序员工作流 ​

Obsidian 是开发者的理想知识管理工具,可以帮助你管理技术笔记、代码片段、项目文档和学习路径。本文介绍一套完整的程序员工作流。

核心理念 ​

程序员使用的特点 ​

  • 技术更新快:需要持续学习和记录
  • 代码复用:需要代码片段管理
  • 项目管理:多项目并行需要追踪
  • 文档需求:API 文档、架构设计等

推荐组织方式 ​

text
开发者仓库/
├── 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
# 安装命令
```text

### Hello World

```javascript
// 代码示例
console.log("Hello World");
```text

## 进阶用法

### 1. 功能一

```javascript
// 代码示例
```text

### 2. 功能二

```javascript
// 代码示例
```text

## 最佳实践

1.
2.
3.

## 常见问题

### 问题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
```text

问题解决笔记 ​

记录 Bug 解决方案:

markdown
---
title: 解决 <% tp.system.prompt("问题简述") %>
date: <% tp.date.now("YYYY-MM-DD HH:mm") %>
tags:
  - 问题解决
  - <% tp.system.prompt("技术标签") %>
solved: true
---

# <% tp.file.title %>

## 问题描述

### 错误信息

```markdown
<% tp.system.prompt("错误信息") %>
```text

### 复现场景

1.
2.
3.

## 环境信息

| 项目 | 版本 |
|------|------|
| 操作系统 | |
| Node.js | |
| 相关包 | |

## 排查过程

### 尝试1

结果:

### 尝试2

结果:

## 解决方案

```javascript
// 解决代码
```text

## 原因分析

## 预防措施

## 相关链接

- 参考:
- 相关 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("代码内容") %>
```text

## 使用场景

-

## 参数说明

| 参数 | 类型 | 说明 |
|------|------|------|

## 示例

```javascript
// 使用示例
```text

## 注意事项

-
```markdown

### 常用代码片段示例

**防抖函数**:

```javascript
function debounce(fn, delay = 300) {
  let timer = null;
  return function (...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}
```text

**深拷贝**:

```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;
}
```text

**格式化日期**:

```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]);
}
```markdown

### 代码片段搜索

使用 Dataview 快速查找:

```dataview
TABLE
  language as "语言",
  description as "描述",
  file.ctime as "创建时间"
FROM "30-代码片段"
WHERE contains(file.content, "<% tp.system.prompt('搜索关键词') %>")
SORT file.ctime DESC
```markdown

## 项目管理工作流

### 项目笔记模板

````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[数据库]
```text

## 开发任务

### 进行中

```tasks
not done
path includes 20-项目/<% tp.file.title %>
heading includes 进行中
```text

### 待办

- [ ]

### 已完成

- [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
```text

## 已完成

```dataview
TABLE
  completed_date as "完成日期"
FROM "40-学习路径/2024"
WHERE status = "completed"
SORT completed_date DESC
```text

## 学习统计

| 指标 | 数值 |
|------|------|
| 学习笔记数 | 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 GitGit 同步
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`;
}
%>

相关内容 ​