开发者的时间都去哪了
做过几年开发的人心里清楚,真正写核心业务逻辑的时间可能只占每天工作的 30% 左右。剩下的时间呢?
改 bug、写文档、review 别人的代码、处理日志告警、写测试用例、搞 CI/CD 配置……这些事情每一件都不难,但加在一起就是巨大的时间黑洞。
这些工作有个共同特点:重复性高、模式固定、对创造力要求低。换句话说,正适合让 AI 来干。
Hermes Agent 在这类任务上表现得相当靠谱。它天然支持工具调用和多步推理,这意味着你可以让它读文件、执行命令、分析结果,然后给出行动建议,整个流程自动完成。关于 Hermes Agent 的完整能力介绍,可以参考 Hermes Agent 完全指南。
场景一:自动化代码审查
Code Review 可能是最消耗高级开发者时间的任务之一。你需要读懂每一行改动的意图,检查潜在的 bug,确认是否符合编码规范。一个稍大的 PR 可能就要花半小时到一小时。
用 Hermes 做代码审查,不是要替代人工 review,而是帮你预筛一遍,把明显的问题先挑出来,你只需要关注 AI 无法判断的架构和业务逻辑问题。
基础版:Git Diff 审查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import subprocess import requests
def review_git_diff(branch="main"): diff = subprocess.run( ["git", "diff", branch, "--", "*.py"], capture_output=True, text=True ).stdout
if not diff.strip(): print("没有需要审查的改动") return
prompt = f"""你是一个资深的 Python 开发者,正在做代码审查。
请审查以下 git diff,关注以下方面:
1. **Bug 风险**:可能导致运行时错误的代码 2. **安全隐患**:SQL 注入、XSS、硬编码密钥等 3. **性能问题**:不必要的循环、内存泄漏风险 4. **代码规范**:变量命名、函数长度、注释质量 5. **逻辑漏洞**:边界条件处理、异常处理是否完善
对于每个问题,请: - 标明具体的文件名和行号 - 说明问题是什么 - 给出修改建议 - 标注严重等级(高/中/低)
如果代码没有问题,直接说没有问题即可,不要硬凑问题。
```diff {diff} ```"""
resp = requests.post( "http://localhost:11434/api/chat", json={ "model": "hermes3:8b", "messages": [ {"role": "user", "content": prompt} ], "stream": False, "options": {"temperature": 0.2} } )
print(resp.json()["message"]["content"])
|
注意温度设为 0.2——代码审查需要严谨,不需要创意。
进阶版:集成到 CI/CD
把审查脚本集成到 GitHub Actions 或者 GitLab CI 里,每次提交 PR 自动触发:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| name: AI Code Review
on: pull_request: types: [opened, synchronize]
jobs: review: runs-on: self-hosted steps: - uses: actions/checkout@v4 with: fetch-depth: 0
- name: Get diff run: | git diff origin/main...HEAD -- '*.py' > /tmp/diff.txt
- name: AI Review run: | python scripts/ai_review.py /tmp/diff.txt > review.md
- name: Post review comment uses: actions/github-script@v7 with: script: | const fs = require('fs'); const review = fs.readFileSync('review.md', 'utf8'); github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: review });
|
这样每次有人提 PR,AI 会自动审查一遍,把发现的问题以评论的形式贴到 PR 里。开发者看到 AI 的预审结果,然后人工确认哪些是真问题。
场景二:日志分析和告警处理
线上出了问题,第一件事就是翻日志。但日志这东西,动辄几百 MB,手工翻简直是大海捞针。
Hermes 可以帮你快速定位问题,前提是你把日志的关键部分提取出来喂给它。
错误日志分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| def analyze_error_logs(log_file, last_n_lines=500): with open(log_file) as f: lines = f.readlines()[-last_n_lines:]
error_lines = [ line for line in lines if any(kw in line.upper() for kw in ["ERROR", "EXCEPTION", "FATAL", "TRACEBACK"]) ]
if not error_lines: print("最近没有发现错误日志") return
errors_text = "".join(error_lines)
prompt = f"""你是一个运维专家,正在分析线上错误日志。
请分析以下错误日志,给出:
1. **错误分类**:把相同原因的错误归类到一起 2. **根因分析**:每类错误最可能的原因是什么 3. **影响评估**:这些错误对用户/系统的影响程度 4. **修复建议**:具体的排查步骤和修复方案 5. **优先级排序**:哪些错误应该先处理
日志内容:
|
{errors_text}
1 2 3 4 5 6 7 8 9 10 11 12
| resp = requests.post( "http://localhost:11434/api/chat", json={ "model": "hermes3:8b", "messages": [{"role": "user", "content": prompt}], "stream": False, "options": {"temperature": 0.2} } )
return resp.json()["message"]["content"]
|
实时告警处理
配合监控系统(Prometheus + Alertmanager),当告警触发时自动调用 Hermes 分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| from flask import Flask, request import json
app = Flask(__name__)
@app.route("/webhook/alert", methods=["POST"]) def handle_alert(): alert_data = request.json
alert_name = alert_data["alerts"][0]["labels"]["alertname"] description = alert_data["alerts"][0]["annotations"].get( "description", "" ) value = alert_data["alerts"][0]["annotations"].get("value", "")
prompt = f"""线上触发了一个告警,请帮我快速分析。
告警名称:{alert_name} 告警描述:{description} 当前值:{value}
请给出: 1. 这个告警通常意味着什么 2. 最可能的原因(列出 top 3) 3. 立即需要执行的排查命令 4. 临时缓解措施
尽量简洁,运维人员需要快速行动。"""
analysis = call_hermes(prompt)
send_to_notification(alert_name, analysis)
return json.dumps({"status": "processed"})
|
场景三:自动生成技术文档
写文档可能是开发者最不情愿做的事情。但好的文档又极其重要——你写的代码三个月后你自己都看不懂,别人就更不用说了。
让 Hermes 帮你基于代码自动生成文档,至少能解决「从零到一」的问题。
函数文档生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import ast import os
def extract_functions(file_path): """从 Python 文件中提取所有函数定义""" with open(file_path) as f: tree = ast.parse(f.read())
functions = [] for node in ast.walk(tree): if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)): source_lines = open(file_path).readlines() func_source = "".join( source_lines[node.lineno - 1 : node.end_lineno] ) functions.append({ "name": node.name, "source": func_source, "lineno": node.lineno }) return functions
def generate_docs(file_path): functions = extract_functions(file_path)
for func in functions: prompt = f"""为以下 Python 函数生成文档注释(docstring)。
函数代码: ```python {func['source']}
|
要求:
- 使用 Google 风格的 docstring
- 描述函数的用途(一句话)
- 列出所有参数及其类型和含义
- 说明返回值的类型和含义
- 如果有可能抛出的异常,也列出来
- 给一个简短的使用示例
只输出 docstring 内容,不要输出其他内容。”””
doc = call_hermes(prompt)
print(f"\n{'='*50}")
print(f"函数: {func['name']} (第 {func['lineno']} 行)")
print(doc)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ### API 文档自动生成
如果你用 Flask 或 FastAPI 写后端,可以从路由定义自动生成 API 文档:
```python def generate_api_doc(route_file): with open(route_file) as f: code = f.read()
prompt = f"""基于以下 Python Web 框架代码,生成 API 文档。
代码: ```python {code}
|
文档格式要求:
- 每个接口包含:路径、方法、功能说明、请求参数、响应格式
- 用 Markdown 表格列出参数
- 给出 curl 调用示例
- 列出可能的错误码和含义
输出完整的 Markdown 格式 API 文档。”””
return call_hermes(prompt)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ## 场景四:测试用例自动编写
写单元测试是保证代码质量的基础,但很多团队的测试覆盖率长期在 20% 以下。不是不想写,是真的太费时间。
Hermes 可以帮你快速生成测试用例的初始版本,你只需要检查和补充即可。
### 基于函数生成测试
```python def generate_tests(source_code, framework="pytest"): prompt = f"""为以下代码生成完整的单元测试。
源代码: ```python {source_code}
|
要求:
- 使用 {framework} 框架
- 覆盖正常情况和边界情况
- 包含异常测试(传入非法参数等)
- 每个测试函数有清晰的命名,体现测试意图
- 需要 mock 外部依赖的地方用 unittest.mock
- 加上必要的注释说明每个测试在验证什么
输出可以直接运行的完整测试文件。”””
return call_hermes(prompt, temperature=0.3)
1 2 3 4 5 6 7 8 9 10 11 12 13
| ### 测试用例增强
已有的测试不够全面?让 Hermes 分析代码找出缺失的测试场景:
```python def suggest_missing_tests(source_code, existing_tests): prompt = f"""我有一段代码和对应的测试用例。 请分析是否有遗漏的测试场景。
源代码: ```python {source_code}
|
已有测试:
请列出:
- 哪些代码路径还没有被测试覆盖
- 哪些边界条件还没有被考虑到
- 是否有需要测试的并发/竞态场景
- 对于每个缺失的场景,给出具体的测试代码
只列出确实缺失的测试,不要重复已有的测试逻辑。”””
return call_hermes(prompt, temperature=0.2)
1 2 3 4 5 6 7 8 9 10 11
| ## 场景五:Commit Message 和 Changelog 生成
写 commit message 看似小事,但项目做大了之后,清晰的提交历史能帮你快速回溯问题。
```python def generate_commit_message(staged_diff): prompt = f"""基于以下 git diff,生成规范的 commit message。
```diff {staged_diff}
|
格式要求(Conventional Commits):
类型:feat/fix/docs/refactor/test/chore
描述用中文,50 字以内
详细说明解释为什么做这个改动
给出最合适的一个 commit message,不要给多个选项。”””
return call_hermes(prompt, temperature=0.1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| ### 自动生成 Changelog
发版本的时候需要 Changelog?从提交历史自动生成:
```python def generate_changelog(from_tag, to_tag="HEAD"): # 获取两个版本之间的提交记录 log = subprocess.run( ["git", "log", f"{from_tag}..{to_tag}", "--pretty=format:%s (%an, %as)"], capture_output=True, text=True ).stdout
prompt = f"""基于以下 git 提交记录, 生成用户友好的 Changelog。
提交记录: {log}
格式要求: - 分类:新功能 / Bug 修复 / 性能优化 / 其他 - 每条记录用一句话描述,面向用户而不是开发者 - 去掉内部重构、代码清理等用户不关心的改动 - 重要的改动加粗标注 - 如果有破坏性变更,单独列出并标注 ⚠️"""
return call_hermes(prompt, temperature=0.3)
|
把这些串起来:日常工作流
以上每个场景单独用都有价值,但真正的效率提升来自于把它们串到日常工作流里。
一个典型的开发日可能是这样的:
早上上班:运行日志分析脚本,看看昨晚有没有异常。如果有告警,Hermes 已经帮你做了初步分析,你直接看结论就行。
写代码:专注写核心业务逻辑。写完之后跑一遍 AI 审查,看看有没有低级错误。
提交前:让 Hermes 帮你生成 commit message 和函数文档。
下午 review 别人的代码:先让 AI 预审一遍,你只需要关注 AI 标记的高风险项和业务逻辑。
发版前:自动生成 Changelog,跑一遍测试用例生成补全覆盖率。
注意事项和踩坑经验
不要盲目信任 AI 的代码审查结果。它能找出语法错误和常见的反模式,但对于业务逻辑的理解有限。AI 说没问题不代表真没问题,AI 说有问题也可能是误报。把它当助手,不要当裁判。
日志分析要做好预处理。别把几百 MB 的日志全部丢给模型,先做过滤和去重。8B 模型的上下文窗口有限,塞太多无关内容反而影响分析质量。
生成的测试用例一定要跑一遍。AI 生成的测试代码经常有小问题——import 路径不对、mock 不完整、断言条件不准确。生成之后必须人工检查并运行通过。
温度参数很关键。代码相关的任务(审查、测试、文档),温度一律调低,0.1 到 0.3。创造性任务(changelog 措辞、commit message)可以稍高,0.3 到 0.5。
模型大小直接影响代码理解能力。8B 模型处理简单的函数级审查没问题,但涉及到跨文件的架构级分析,建议上 70B。这方面的技术细节可以看 Hermes 3 技术报告解读。
如果你对把 Hermes 部署到低成本服务器上感兴趣,推荐看看 五美元 VPS 跑 AI Agent 这篇文章。也欢迎到 cocoloop 社区 来分享你的自动化方案和使用心得。