文档:架构师的“编程语言”
摘要:文章探讨了开发者在职业分叉路口如何选择架构师路径,指出架构师的核心能力在于"将想法部署到由人构成的系统",而非仅关注代码。作者提出文档写作是架构师的关键工具,强调用项目符号和清晰标题提升文档可读性,并建议按时间而非主题组织文档以方便检索。文章还列举了架构概览、开发设计等高价值文档类型,帮助开发者掌握高效传递技术想法的能力,从而在技术深度与影响力之间找到平衡。
高级开发工程师懂得将代码部署到由代码构成的系统中,而架构师则懂得将想法部署到由人构成的系统里。 |
---|
从初级开发到资深/首席开发,职业路径通常很清晰:代码写得越好,能辅助高效编码的技术、非技术能力越强,晋升速度就越快。但一旦到了资深级别,职业道路就会出现一个关键分叉。
很多开发者会选择管理岗。这条路径能大幅提升影响力,帮你在职业阶梯上继续攀升,但缺点也很明显------你写代码的时间会越来越少,不少技术经理甚至完全没时间碰代码。如果你跟我一样,这一点可能根本无法接受:以前你埋头苦干,把复杂流程转化成优雅抽象的时间,会被会议、为团队扫清障碍、调解分歧、应付 HR 流程考核这些事占满。这些工作虽有挑战且重要,但和写代码完全是两回事。
另一个常见选择是架构师路径。这条路上,你能始终深耕代码,同时扩大自己的影响力,让多年积累的经验发挥更大价值。在很多公司,架构师路径的薪资水平和职级晋升空间,与管理岗不相上下,而且两条路径最终都能通向高管岗位(比如 CTO)。
但相比管理岗,架构师路径的定义似乎模糊得多。转管理岗后,你的日常工作会彻底改变:日程表、团队架构全变了,连工作成果的衡量标准都完全不同。可架构师的日常看起来和资深开发差别不大------在 IDE 里写代码、审核 PR(代码合并请求)、讨论部署流水线和数据结构这些话题。那架构师到底特殊在哪?换句话说,要是你想证明自己能胜任架构师岗位,该怎么做?
架构师到底是什么?
架构师不只是"懂技术"或"脑子聪明"------这些特质只是帮你走到资深级别的基础。也不只是"能设计并交付高可用、结构优良的系统"(虽然这也很重要)。
在我看来,核心差别就一个:
高级开发工程师懂得将代码部署到由代码构成的系统中,而架构师则懂得将想法部署到由人构成的系统里。
这话听起来可能像空洞的比喻,但我保证不是。
先说明白:我不是说架构师"擅长沟通"或"人缘好"(虽然这两点确实有用),也不是用华丽辞藻强调"软技能很重要"(虽然软技能确实关键)。我想表达的是,架构师除了懂"部署机器和应用的流程",更掌握一套高效、可复用的流程来组织和传递想法。他们清楚,单靠推送代码能解决的问题有限;真正关键的问题,需要不同岗位、不同视角的人提供输入、协作推进,最终达成共识才能解决。
换句话说,在大多数公司里,想启动一个持续数月的项目、重构某个 Web 服务,或是为新产品选定编程语言,都得获得其他开发者和负责人的认可。软件生命周期里最大的瓶颈,从来都不是代码本身------而是人的问题:沟通不畅、难以说服他人、决策卡壳。
所以,架构师要想产生影响力,就得一迭代接一迭代、一季度接一季度地推进这些事。怎么才能稳定地让"对的人在对的时间聚到一起,讨论对的话题"?有没有能对"人"生效的"传输协议"或"基础设施即代码"工具?
还真有。
而且不止一种:Confluence、飞书、语雀、Notion、…诸如此类。只要你会列点说明、能加文档间的链接,就能"部署"自己的想法。在大多数公司里,想做成一件事,最高效的方式就是:写一份文档,分享给关心这件事的人,然后倾听他们的反馈。
但很多程序员对自己的写作能力没信心。要从自己熟稔的领域(编程,好坏自有代码说话)切换到陌生的领域(写作,好坏全看读者判断),确实不容易。所以下面我会给个"速成指南":不用太多知识,就能帮你自信地写出不错(甚至优秀)的文档,无论你之前会不会写。你不需要有英语学位,不用认识"idempotent(幂等)"这种词,甚至不用用母语写------只要学几个小技巧就行。
好文档的核心原则
这是我对文档写作的"信条":
作为一个"文档控",我更看重: 先把想法记下来,别纠结结构 倡导文档文化,而非走流程式记录 聚焦核心信息,而非套用模板 记录特定时间点的信息,而非频繁更新 |
---|
我特意让它和敏捷宣言的句式相近------右边的做法有价值,但左边的更关键。
后面我会详细展开其中几点,包括不同类型文档该怎么搭结构,但请记住第一点和第三点:与其卡在"找完美格式"上,不如先把你知道的写下来;而且不同文档的格式也不用统一,重点是"当下呈现这些信息,哪种方式最有效",而不是"以前这么做过"。
怎么写文档?
哪怕你没怎么写过技术文档,也能写出高质量的内容。有个简单却超好用的技巧,几乎能让你写的任何文档都变好用:用项目符号(bullet points)。
项目符号简直是神器:它能让你专注于信息的完整性和逻辑性,不用纠结句子通顺与否、文采好不好。读技术文档的人,都想快速找到信息------其实衡量文档好坏的最佳标准之一,就是读者能多快找到所需信息并停止阅读。如果 10 秒内找到答案就关掉,那这文档就是成功的。而项目符号信息密度高、易浏览,刚好适配这个需求。
比如我刚才那两段话,用项目符号写是这样的:
- 项目符号超适合技术写作
- 帮你聚焦信息完整性和逻辑性
- 不用太多写作技巧
- 让文档更易浏览
信息几乎没丢,但篇幅只占原来的 25%,写起来也更轻松。这就是为什么项目符号是架构师的"最佳搭档"。
第二个超有用的技巧是加标题(headers)。如果你的信息没法用寥寥几个项目符号说清,那就值得拆成几个带明确标题的小节。
比如我写的大部分文档,开头都会有个"背景" section。作用是提供话题相关的历史、业务领域或既定约束,顺便加些链接。这些信息你天天接触,可能烂熟于心,但其他读者会需要"帮他们回忆";就算是一年后你自己回头看,也会感激当初写的背景。
当然,对话题很熟悉的人,完全可以快速扫过甚至跳过"背景"部分------这就是标题的好处:能让读者更快找到自己要的信息,忽略无关内容。(如果标题太多,想优化体验,加个带链接的"目录"也很好用。)
要是一开始不知道该加什么标题,先随便按顺序列项目符号就行。之后把这些点按逻辑分组,再给每组贴个标签------这和写代码其实很像:你可能先写个 200 行的方法,跑通之后,通常会重构:拆成多个步骤,把重复逻辑抽成函数。
最要避免的是"大段密密麻麻的文字"。你文档需要争取注意力的人,往往都是时间最紧张的人。要是发过去一篇四页纸的"小作文",他们很可能根本没时间读。但如果是结构清晰的项目符号列表,他们就能快速滚动浏览,提取所需信息,有空再回复。
文档写完后该做什么?
信息都写好后,建议做个"合理性检查":发给你常合作的同事,让他们指出不对劲或看不懂的地方。然后根据反馈修改、调整结构或重述内容。
要记住:大多数文档更像"一次性的 Bash 脚本",而不是"需要持续维护的 SaaS 应用"。一旦文档完成了它的使命,你可能再也不会更新它。作为架构师,一年写一百份文档都很正常,根本没时间全维护一遍。
这一点带来两个启示:第一,要确保每份文档"足够好用",哪怕以后逐渐过时,回头看也能用上------现在多花点功夫,之后就能彻底忘了它,直到需要时再找。第二,要让人能轻松看出文档的"撰写时间",以及"同一时期还有哪些相关文档"。只有明确知道"这文档有多旧","特定时间点的记录"才有价值。
我组织文档的方式可能有点反直觉。大多数人会按"话题"分类:这个功能一个文件夹,那个功能一个文件夹。但这样会导致一堆"看似平等、实则价值不一"的文件夹:有的装满最新、最相关的文档,有的五年没更新过,还有的新旧文档混在一起,甚至互相矛盾,还看不出先后顺序。
所以我几乎所有文档都按"时间"排序:先按年份,再按迭代周期(sprint)。这样能清晰看到"时间线"。比如在 Confluence 里,我会给每个团队或产品建一个"空间"(其他工具可能叫"工作区"“维基"或"文档集”------高层次的分类还是需要的),但每个空间里的文件夹结构是这样的:
- 📄 概览
- 📄 架构
- 📁 2025
- 📁 1 月第一迭代
- 📄 提案:SSO 登录功能
- 📄 APP-132 用户会话研究
- 📁 1 月第三迭代
- 📄 APP-135 支持为指定客户配置 SSO 登录
- 📁 2 月第一迭代
- 📄 SSO 登录与用户角色的冲突问题
- 📄 开发预判:角色权限复杂度将上升
当然,少数"高层次文档"确实需要持续维护。比如有人想了解产品概况,那有个最新的"首页"和架构图会很有用。但大多数文档都有"有效期":时间越久,相关性越低。
你可能会问:"这不反常识吗?我通常找的是’某个项目/功能的文档’,不是’2020 年 3 月的文档’啊。“我的回答是:“不是有搜索框吗?“按话题分类就像"给软糖分类”------没人能达成共识。这意味着你写文档时,要花时间想"该放哪个文件夹”;找文档时,又要在错的文件夹里翻半天才能找到对的。这就像"按逻辑而非字母顺序整理 CSS 属性”:把 left 和 top 放一起可能感觉舒服,但没实际用处。CSS 按字母排序更快、更简单,还完全够用;文档按时间排序,道理也一样。
而且说到底,“搜索"通常才是正确选择。浏览适合用来"了解有哪些文档”,但如果找特定信息,很容易漏掉那些标题看似无关、实则包含所需信息的文档。而搜索又快,还能把所有匹配结果都列出来。按时间组织文档,其实是"逼着"大家用搜索(本来就该这么做);而且点进搜索结果时,能立刻知道文档的撰写时间,以及当时还在推进哪些事------上下文一下子就全了。
文档经过同行评审并发布后,最后一步是"复制链接分享出去":如果这篇文档替代或补充了其他文档,就去那篇文档里加个链接;如果和工单系统的任务相关,也贴过去;最后,把链接发给需要反馈、审批或共识的人。
附录:高价值文档类型
下面是几种对技术团队特别有用的文档类型,供你参考。
1. 架构概览文档
- 用途:帮他人快速了解系统的结构和设计。
- 受众:系统相关方,包括管理者、开发、运维、产品负责人等。
- 何时写:搭建新系统或重构现有系统前;如果某个现有系统很难理解,也可以补一份。
- 内容:描述系统的核心组件(数据库、应用、云服务、负载均衡等)及组件间的交互方式;也可提及内部组件(如数据模型、类),但别写太细。
- 结构:可以是"带符号(圆柱代表数据库、方框代表应用、箭头代表交互)的 diagrams",也可以是"分章节的多页文档",甚至就是"嵌套的项目符号列表"。常见格式有 arc42 和 C4。
- 如何传递想法:哪怕是有点过时的架构概览,也能帮参与者建立"系统的心智模型",方便他们在此基础上开发、排障和分析;同时也能让负责人和运维理解"怎么交付这个系统"“成本多少”“和现有系统怎么交互”------这些都是系统能获批的关键。
- 小贴士:记住"先记下来,别纠结结构"。不用非要按严格格式写,也不用纠结符号对不对(除非你想)。“存在但不完美的架构文档”,远胜"完美但没写出来的文档"。
2. 开发设计文档
- 用途:针对"你想写的代码"收集反馈;提前发现潜在问题和复杂点,避免写一堆半成品代码最后还要删掉。
- 受众:团队里的其他开发者;未来想了解"系统演进过程"的开发者。
- 何时写:开始任何"非 trivial(简单)"的编码任务前;如果某个本以为简单的任务,越做越复杂,也可以补写。
- 内容:细节程度自己定。不用写 obvious( obvious)的琐事,但要包含"其他开发者能指出你假设错误""提醒你可用的现有逻辑/模式"的信息。
- 结构:列"要执行的步骤"即可。比如:给 A 类加一个实现 X 功能的方法、新建 B 类存储 Y 相关数据、写一个数据库迁移脚本实现 Z 操作,等等。也可以加"待解决问题"部分(记录开始前要明确的事),或"备选方案"部分(让同事帮你权衡不同实现方式)。
- 如何传递想法:帮团队分享知识,同时保留系统的核心模式和抽象;还能留下"系统为何变成现在这样"的永久记录。如果团队不做结对编程/群体编程,开发设计文档能带来类似的协作价值,还能帮未来的参与者快速熟悉系统。
- 小贴士:这话听起来有点反常识,但确实是真的------写的文档越多,要写的代码越少。文档能帮你避免"误解、错误假设、设计缺陷"这些导致"PR 反复修改"“代码重构"的问题;还能帮你省下"在探索性编码上浪费的时间”(那些最后走不通的尝试)。
3. 项目提案文档
- 用途:说明项目的价值和成本,方便公司划拨时间和资金。
- 受众:负责人、产品负责人。
- 何时写:规划会议快开始时;或者你发现"能显著改进公司产品/系统"的机会时。
- 内容:总结"负责人评估项目优先级时需要知道的所有信息":为什么重要?会影响谁?要做多久?等等。
- 结构:分几个清晰的小节,比如"背景"“待解决问题”“建议方案”“用户影响”“预估开发工作量”。
- 如何传递想法:大型、有影响力、持续数月的项目,都是从项目提案开始的------它能为整个团队设定路线图。
- 小贴士:让提案更容易获得通过的关键,是"技术和非技术相关方都能看懂"。记住:别人不会像你一样天天想这件事,所以"背景信息要比你以为的多"。提前做些调研:比如通过数据统计判断会影响多少用户、问问大家"这个问题有多让人头疼"、看看其他团队/公司是怎么解决类似问题的。
4. 开发预判文档
- 用途:指出"可能出现不如预期的结果"(尤其是只有你凭借经验能预判到的风险),并提出应对建议。
- 受众:业务决策的相关方。
- 何时写:当某个决策让你(作为工程师)觉得"有风险"或"可能会让人失望"时。
- 内容:先总结"这个决策为什么会被做出"“决策者想达成什么目标”;再说明"你觉得可能出问题的原因"“具体会有哪些负面结果”;最后提出"缓解方案",哪怕最终决策没法改。
- 结构:结构清晰的文档,分"决策内容"“决策动机”“潜在问题”“可能结果”"应对方案"等小节。
- 如何传递想法:帮你分享"专业预判能力",让大家提前关注计划的漏洞;还能让公司"在出问题时快速、灵活地应对",而不是"反复掩盖问题"。如果计划真的出了问题,你的预判文档会变成"指路明灯",清晰展示"预期和实际结果的差距"。
- 小贴士:保持中立语气,别像个"唱衰的人"。多考虑几种可能性,不用想着"扭转整个决策"------只要指出风险,提出应对方法就行。
5. 技术选型文档
- 用途:缩短"新建应用时的决策时间"。
- 受众:开发团队或整个技术部门。
- 何时写:规划项目时,团队对技术选型有分歧。
- 内容:针对某类技术(编程语言、运行时、框架、平台等),聚焦"你和同事更倾向的几个选项",对比它们的优势:公司对这个技术的熟悉度(不只是会用,还要包括部署和维护)?招懂这个技术且愿意来的开发者容易吗?开源生态活跃吗?文档全吗?普通开发者从零基础到做出可用应用要多久?它是否能促进"跨代码库通用的标准、结构和模式"?需要高性能时表现怎么样?把技术和非技术层面的优缺点说清楚后,给出"不同场景下的选型建议":比如 Web 服务默认用 A,无服务器函数用 B,原型和内部应用用 C。
- 结构:先放"对比表格",再分"不同场景的明确建议"。
- 如何传递想法:帮团队就"技术实现方式"达成共识,让开发者能快速搭建有用的技术方案,不用陷在"选 A 还是选 B"的争论里;还能挑战"只靠传统保留下来、而非因为适合或流行"的公司默认选型。
- 小贴士:别偏袒自己偏好的技术。如果你写这份文档,多找"用过不同技术的开发者"要反馈,把他们的意见和你的放在同等重要的位置。让团队达成共识,比"选绝对最好的技术"更重要。
6. 问题说明文档
- 用途:快速就"问题的解决方案或规避方法"达成共识。
- 受众:项目相关方。
- 何时写:遇到"没有明显解决方案"的问题,需要公司明确决策时。
- 内容:用简单的话说明问题是什么;如果问题对业务有影响,描述(或预估)影响范围和严重程度。大多数问题都涉及"两个及以上无法同时满足的约束条件"------如果是这样,要明确写出"这些约束是什么"“为什么互相冲突”。然后给出"几个可能的推进方向",总结每个方向的优缺点。
- 结构:分"背景"“问题描述”“影响”“约束条件”"可能方案"等小节。
- 如何传递想法:一份好的问题说明文档,能让"无论什么岗位的人"都看懂"问题是什么、为什么重要",并对自己倾向的方案发表意见;还能留下"讨论记录",方便后续参考------问题越大,越可能以后再被拿出来讨论或复发。
- 小贴士:哪怕你想到的方案都不完美,也别跳过"可能方案"部分。任何工程师都能发现问题,但架构师的工作是找解决方案。就算只能想到几个差方案,也能为别人提出好方案铺路。
7. 事后复盘文档
- 用途:避免严重问题再次发生。
- 受众:关心"近期故障、失败或高优先级 bug"的人。
- 何时写:技术问题造成较大影响时。大多数 bug 不用写复盘,但如果问题"严重影响业务正常运转"(比如值班开发收到告警、用户打电话投诉),就该写了。
- 内容:从"不追究责任"的角度,描述"问题是什么"“怎么发现的”;附上相关的沟通记录、PR 和工单号链接;说明"影响了谁"“解决花了多久”“期间做了哪些临时缓解措施”;最后解释"问题的根本原因",并提出"避免再次发生的建议"。
- 结构:分"背景"“问题描述”“影响”“时间线”“根本原因”"建议的流程改进措施"等小节。
- 如何传递想法:帮公司从"'这事绝不能再发生’的恐惧焦虑",转变为"'我们有办法预防’的自信安心";用得好的话,还能推动文化从"追究个人责任",转向"提升团队能力和建立自动防护机制"。
- 小贴士:复盘是"为错误承担责任"的机会,但不是"自我指责"的仪式。每个人都有状态不好、犯错误的时候。公司存在的意义,就是建立"超越个人能力的抗风险能力"。承认自己在其中的角色,但重点要放在"公司整体能改进什么"上。
更多推荐
所有评论(0)