在 Swiss PG Day 2026 的一场 Birds of a Feather(BoF)活动中,大约 20 位参与者围绕“要不要成为一名演讲者”展开交流。BoF 不是单向授课,而是由共同兴趣驱动的讨论:主持人负责抛出问题、维持节奏,参与者则带着经验和困惑共同完成内容。对于准备第一次向 PostgreSQL 社区会议投稿的人来说,这种小规模对话恰好是一块低风险的试讲场。
BoF 为什么适合孵化第一次演讲
正式演讲通常要求讲者提前组织完整叙事,而 BoF 允许观点在互动中逐渐成形。二十人左右的规模既能提供不同背景,又不至于让发言变成少数人的独白。
如果你想验证一个选题,可以在 BoF 或内部技术交流中提出三个问题:
- 谁在实际工作中遇到过这个问题?
- 大家现在如何解决,代价是什么?
- 哪个细节最值得用 30 分钟讲清楚?
参与者反复追问的部分,往往比讲者最初准备的“大而全”主题更适合作为会议演讲。比如,“PostgreSQL 性能优化”过于宽泛,而“我们如何定位一次由错误统计信息引发的执行计划退化”就有明确的问题、过程和结果。
BoF 主持人与会议讲者所需的能力也高度重合:设定边界、提出具体问题、控制时间、总结分歧,并让不同经验层次的人都能跟上。因此,主持一次小型讨论本身就可以成为走上讲台前的训练。
把工作经历压缩成可投稿的提案
好的投稿不是“我知道什么”的清单,而是对听众作出的明确承诺。撰写摘要前,可以先回答四个问题:
- 听众是谁:DBA、应用开发者、平台工程师,还是 PostgreSQL 新用户?
- 他们正被什么问题困扰:慢查询、升级风险、复制延迟,还是可观测性不足?
- 你能提供什么证据:执行计划、指标变化、失败尝试、基准测试或事故时间线?
- 听众离场后能做什么:运行一条诊断命令、修改一项配置,还是避开一种架构陷阱?
一个实用的摘要结构是:问题场景、常见误区、分析过程、解决方案和三项可带走的结论。不要用产品介绍填满摘要,也不要承诺覆盖整个 PostgreSQL 领域。范围越具体,评审越容易判断内容是否可信。
真实事故很有说服力,但需要处理边界:删除客户名称、主机名、业务数据和内部拓扑;无法公开的数字可以使用比例或经过说明的合成数据;涉及雇主或客户的信息,应先取得授权。
可以直接改造的投稿工作区
下面是一套可以采用的个人工作流,并非特定会议的官方格式。运行命令后,将 TODO 替换为自己的内容:
mkdir -p postgres-talk/{demo,slides,notes}
cd postgres-talk
cat > proposal.yaml <<'YAML'
title: TODO - 用一句话描述具体问题和结果
format: 30-minute talk
audience: TODO - 例如 PostgreSQL 应用开发者
difficulty: intermediate
problem: TODO - 听众在什么场景下会遇到什么问题
promise: TODO - 听完后能够完成什么任务
outline:
- 5 min: 场景、约束与故障表现
- 8 min: 错误假设和失败尝试
- 10 min: 诊断过程与关键证据
- 5 min: 修复方案及其取舍
- 2 min: 总结与行动清单
takeaways:
- TODO - 一项可立即执行的诊断方法
- TODO - 一个需要避开的陷阱
- TODO - 一条用于评估方案的原则
evidence:
- TODO - EXPLAIN 输出、指标、日志或基准测试
demo_fallback: TODO - 现场演示失败时使用截图、录屏或静态输出
YAML
grep -n 'TODO' proposal.yaml
这个文件迫使提案回答“讲给谁听”和“听完能做什么”。如果 promise 无法写成一句话,通常说明主题仍然过大。如果 evidence 为空,演讲可能只有观点,没有足以让听众复用的判断依据。
排练时还可以使用一个简单计时器。以下脚本只依赖 Python 标准库;参数是演讲分钟数:
cat > rehearse.py <<'PY'
import sys
import time
minutes = int(sys.argv[1]) if len(sys.argv) > 1 else 20
end = time.monotonic() + minutes * 60
last = None
print(f'Starting a {minutes}-minute rehearsal. Press Ctrl+C to stop.')
try:
while True:
remaining = max(0, int(end - time.monotonic()))
current = remaining // 60
if current != last:
print(f'{current:02d}:{remaining % 60:02d} remaining')
last = current
if remaining == 0:
print('Time is up.')
break
time.sleep(1)
except KeyboardInterrupt:
print('\nRehearsal stopped.')
PY
python3 rehearse.py 20
第一次排练不要急着润色措辞,先记录每个章节实际花费的时间。若背景介绍占了总时长的一半,通常应该删减背景,而不是加快语速。现场演示还应准备静态输出或录屏,避免网络、权限或版本差异让整段内容失效。
从参与讨论开始,而不是等待“足够资深”
成为社区演讲者不要求你掌握 PostgreSQL 的全部知识。一个边界清晰、证据充分的真实问题,通常比覆盖面宽却缺少细节的主题更有价值。你也可以先从提问、闪电演讲、内部分享或主持 BoF 开始,逐步观察听众在哪些地方困惑、兴奋或提出反例。
投稿前可以做一次最终检查:
- 标题是否说明了具体问题,而不只是技术名称?
- 摘要是否明确了目标听众和前置知识?
- 内容是否包含失败路径,而不只是成功结果?
- 示例是否能够脱离公司内部环境复现?
- 是否准备了演示失败时的替代材料?
- 是否为问答和不同意见保留了时间?
演讲并不是把自己包装成权威,而是把一次值得复用的学习过程整理出来。BoF 的价值正在于此:先进入对话,再从对话中找到值得提交到下一次 Call for Papers 的问题。