直给式的技术写作思维

本文涉及的产品
票据凭证识别,票据凭证识别 200次/月
车辆物流识别,车辆物流识别 200次/月
自定义KV模板,自定义KV模板 500次/账号
简介: 本文通过一个技术文档写作案例,分享个人在技术写作上的一些思考,如标题所示,主要介绍自己在技术文档写作实践中总结的“直给式”写作思维的运用,希望对有产品文档或API文档写作需求的PD、开发同学有所帮助。

为何“直给”

什么是“直给”?如字面意,就是直接给ta,不藏着掖着。在技术写作方面,我认为“直给”是最有效的思维方式。

为什么?

  • 有效传播
    技术写作是技术传播的一种方式,在评价技术传播的有效性时,我们会考虑到是否可以使受众“尽快获取所需信息”。“直给”正是基于用户需求,帮助用户通过最短路径获取技术信息。事实上,帮助文档的用户要不是遇到了迫切需要解决的问题,一般基本不会闲下来通读技术手册。
  • 使用导向
    在技术写作中,与用户需求形同对立的是功能定位。产品团队提供的写作或产品介绍素材中,往往更多地关注功能本身,因为产品团队花很大精力设计并实现功能,自然对功能的特性有强烈的表达欲望。但用户在使用功能时,往往不关心功能如何实现,只考虑如何使用。
    作为产品设计者和用户之间的桥梁,技术作者“传译”技术信息的过程,必须在功能定位和用户的使用需求间进行权衡。只照搬产品团队提供的技术素材作为输出,肯定是不够的。如果运用“直给式”思维,则可以辨别哪些信息不便于用户理解和使用,再结合一定的方法实践,可以将原始素材优化后直达用户理解的核心。
  • 同理心态
    说实话,“直给”不过是我拍脑门想出来的一个词儿;之所以用它,是因为“直给”确实形象地传达了技术写作过程中公开分享的同理心态。论语中记录了孔子这样一段自白:“二三子以我为隐乎?吾无隐乎尔。吾无行而不与二三子者,是丘也。”试想,技术作者新接触一项技术,通过反复琢磨思索,搞明白其中究竟后,再通过文字向用户转述,自然产生让用户别走弯路、直达根本的初衷。

如何“直给”

“直给”本质上是一种写作思维方式,表示将用户基于特定场景需要了解的信息和操作直接传达出来,无需用户进行任何猜想。实际上,我们在技术写作中关注的多种实践技巧,都与“直给”的目标不谋而合:

  • 技术梳理:指技术作者在技术写作前,全面梳理要描述的技术内容,掌握技术的实现原理、应用场景、使用方式等,在技术通晓的基础上开始写作
    这点容易被忽视,尤其是已有丰富素材的场景下。但是这点很重要,因为只有先清楚认知技术后,才能用自己的语言去描述技术;否则在写作过程中,会下意识地依赖素材,无法公正地去组织信息架构和对素材做出取舍。完成技术梳理后,把原始素材放到一边再开始写作,可以轻易做到按作者思路来组织结构与语言,对素材随取所需
  • 场景化写作:在产品功能描述中,明确目标用户的使用场景,说明在具体场景下,功能帮助用户解决什么问题/需要用户做什么
    所谓场景化,是让有相关需求的用户,能够快速辨别一篇文档或某些内容是否可以满足自己的需求。这里需要技术作者首先站在使用者的立场,模拟功能的实际应用场景,感受要描述的功能在什么情形下能够做什么
    /如何做;然后在明确场景划分的基础上来组织语言,通过文字讲出用户在具体场景下的需求,自然而然地引出对应功能或操作。
  • 用户需求视角:在技术细节描述中,时刻关注用户的需求,使文字描述与用户的操作目标紧密关联。
    使用服务
    /功能过程中,用户更关注做什么如何做,而非是什么,因此在技术写作中,往往更推荐使用动宾词组,引导用户实现操作目标。技术写作中经常遇到要去描述参数配置,以API文档的请求参数为例,如能在参数描述中包含操作语境,会使参数说明更易理解和接受。
  • 文档易用理念:在部分复杂场景下,为保证内容准确性,会引入大段比较绕的逻辑描述,影响技术信息的易理解性。这时需要技术作者跳出固有框架的限制,尝试更有效的表现形式,使复杂信息变得更易于接受。

案例剖析

以下将介绍一个运用“直给式”思维的写作案例,帮助大家通过实践,体验直给式优化的效果。

案例是阿里云增强版实人认证服务下的一篇API文档。先简单介绍一下实人认证服务。实人认证是一款基于SDK客户端集成的活体检测、人脸及身份信息比对服务。它的目标用户是App开发者,开发者将实人认证SDK集成到自己的App程序中,就可以使App具有实人认证的功能,认证App用户的真实身份。

按照认证方式不同,实人认证分为不同的场景。例如,最简单的身份证号+姓名方式,只需要App用户提供对应信息即可(例如,手游App的防沉迷实名认证);复杂场景下,需要App用户做指定的摇头、眨眼等动作,用于验证对象是一个真人活体,再结合身份信息完成实人认证(例如,金融类App的关键操作验证)。

问题分析

案例文档介绍了一个基于银行卡号验证用户身份信息的接口。

以下截图是笔者初见这篇文档时的样子,和当前线上版本有差异。

Before.png

对于没有深入了解实人认证产品的用户,该内容使用起来很困难。原文存在以下描述不清楚的问题:

  • 标题不明确,使用名词词组,读了莫名其妙,不知道可以帮用户解决什么问题。
  • 短描述只是标题的简单重复,没有引导作用,读了根本不知道在什么场景下应该用这个API
  • 使用说明只是从功能定位角度来介绍,功能可以这样、可以那样…,读了有一种“关我啥事”的感觉,因为没有与用户操作情境关联的任何信息,即需要用户做什么、从而实现什么效果。
  • 请求参数描述也只是从功能定位角度介绍,没有与用户操作逻辑的关联解释,即设置参数有什么效果、对其他操作有什么影响等。

通读下来,整体感觉有很大猜想空间,一般用户读不懂根本不会看、有需求用户不得不看,不过得耐心琢磨,体验并不好。

技术梳理

在正式写作前,那我们就先来猜一猜这个功能的原理和场景,进行技术梳理。首先请大家模拟自己是App的终端用户。以手游App为例。我们在手机上安装手游App并登录,首次进入游戏时,一般会收到弹窗提示“需要实名认证”。这时,我们只有填写了正确且相互匹配的身份证号+真实姓名,才能完成认证并继续游戏。假如我们抱着侥幸心理,随便编写一个姓名和身份证号并提交,则会收到认证不通过的提示。

那么问题来了,

Q:手游背后的游戏开发商如何做认证?手游怎么知道我们(即App用户)填写的信息是对的?

A:需要通过公安系统来核验。

Q:手游如何使用公安系统的服务?

A:通过实人认证提供的API接口。只要手游App把收集到的用户信息通过API请求参数提交到实人认证服务端,实人认证就会直接返回认证结果(背后是阿里云实人认证对接公安系统的服务进行核验)。

理解这层逻辑后,我们假想这样一个场景:假设某个手游App限制只有持有银行卡的用户才可以使用。

那么就要App用户提供有效的银行卡号(可以直接输入卡号或者对银行卡拍照并上传图片)和用户真实姓名等信息,然后进行银行卡号与用户信息的匹配认证。手游自己不做认证,来找我们实人认证服务。这个场景不就是以上案例文档要说明的API~

功能描述优化

对象

After

Before

直给式写作思维运用

标题

基于银行卡号的用户身份信息核验

银行卡要素核验

优化后的标题精确地定位了用户需求,即做身份信息核验,银行卡号只是一种途径。类似的,其他API标题也可以使用该句式(基于xx的用户身份信息核验),因为实人认证服务本身的目标是帮助App开发者做App用户身份的核验,使用该句式让读者一目了然

短描述

本接口帮助您通过光学字符识别技术OCROptical Character Recognition识别银行卡号,并可核验银行卡号与指定的用户信息(例如,姓名、身份证号、手机号)是否匹配。如果您的业务需要终端用户提供银行卡信息以完成身份认证,推荐您调用VerifyBankElement接口。

调用VerifyBankElement接口发起银行卡OCR或二三四要素认证请求。

使用“帮助您xx”句式,从解决什么问题角度入手,其次通过“如果您需要xx”句式讲出来用户有什么需求时,可以用这个接口。这样用户读了标题和短描述就立马清楚要不要接着看下去,没有任何疑虑。

优化前过于强调“二三四要素”,这可能是产品功能的亮点,但对用户是否应选择该功能没有帮助,而且这个信息属于功能细节,在有限篇幅内没有解释清楚,只是抛出来概念,会让读者一头雾水,不如使用用户便于理解的“用户信息”更合适。

使用说明

根据您需要的认证强度不同,本方案分为以下场景:

  • 银行卡OCR:只通过OCR识别银行卡照片中的银行卡号,不进行用户身份认证。
  • 二要素认证:核验银行卡号与用户姓名是否匹配
  • 三要素认证:核验银行卡号与用户姓名+身份证号是否匹配
  • 四要素认证:核验银行卡号与用户姓名+身份证号+手机号码是否匹配

在二、三、四要素认证中,您可以使用OCR识别的银行卡号(需通过请求参数传入银行卡照片),也可以使用您设置的银行卡号(需通过请求参数传入银行卡号)

进行银行卡照片OCR、银行卡二要素(银行卡号+姓名)、银行卡三要素(银行卡号+姓名+身份证号)、银行卡四要素(银行卡号+姓名+身份证号+手机号)等认证。

优化前在介绍二三四要素认证时,采用纯功能定位的视角,未解释功能与用户操作目标的关联关系;优化后先明确场景划分依据(用户可以自主选择的强度),使用完整句子(核验xx是否匹配)说明多要素认证的本质是比对身份信息是否匹配,不需用户猜想,并补充了原文遗漏的可直接传银行卡号进行认证的场景描述。

参数描述优化

接下来是参数描述的优化。

通过使用说明,我们得知本接口实际包含7种使用场景(对应流程图中的结束节点)。在每种使用场景下,用户需要传入的API参数有所不同(对应流程图中的绿色过程框)。

使用场景.png

API请求参数按照技术逻辑分为3类:

  1. 选择使用场景:Mode参数。
  2. 选择银行号获取方式:
  • OCR:通过BankCardUrl传入图片的公网访问地址、通过BankCardFileObject传入图片的本地访问地址。两种方式二选一。
  • 手填:通过BankCardNo传入银行卡号。
  1. 选择几要素认证(用户信息型参数):
  • 二要素:只传入IdName
  • 三要素:传入IdName+IdNo
  • 四要素:传入IdName+IdNo+Mobile

以下截图是笔者初见这篇文档时的样子,和当前线上版本有差异。

参数分类.png

如何将这些参数信息准确、有效地传递给读者,是本文面临的挑战。

接下来看下如何在明确场景划分的基础上,运用直给式思维来优化参数描述。终极技巧就是在参数描述中随时关联场景信息及用户操作目标。

直给式的描述优化建议如下:

类型

After

Before

直给式写作思维运用

Mode参数取值

  • OCR _BANK_CARD:传入银行卡照片,通过OCR识别银行卡号。
  • OCR_VERIFY_BANK_CARD:传入银行卡照片,通过OCR识别银行卡号,并与您指定的用户身份信息进行匹配认证。
  • VERIFY_BANK_CARD:传入银行卡号,与您指定的用户身份信息进行匹配认证。
  • OCR _BANK_CARD:银行卡照片识别模式。
  • OCR_VERIFY_BANK_CARD:银行卡照片识别且认证模式。
  • VERIFY_BANK_CARD:认证模式。

优化前是完全的功能视角(选择模式即选择功能,例如识别、认证功能),没有和用户操作的关联信息,需要用户纠结一下选了究竟是啥效果。

优化后则明确说明该模式需要用户做什么、能够实现什么,使用户无需揣度。

银行卡号获取型参数

  • BankCardNo:设置要核验的银行卡号。
    如果不需要通过
    OCR识别银行卡号(Mode取值为VERIFY_BANK_CARD),该参数必选。
  • BankCardUrl:设置要核验的银行卡照片的公网URL。
    如需通过
    OCR识别银行卡号(Mode取值为OCR _BANK_CARDOCR_VERIFY_BANK_CARD),该参数与BankCardFileObject参数必须二选一
  • BankCardFileObject:设置要检测的银行卡照片的本地存储路径。
    说明同上…
  • BankCardNo:银行卡号。
    Mode取值为VERIFY_BANK_CARD时,BankCardNo为必选字段。
  • BankCardUrl:证件地址,公网可访问的HTTPHTTPS链接。
    BankCardUrl
    BankCardFileObject二选一。
  • BankCardFileObject:本地证件文件。
    说明同上……

在请求参数描述中,使用动宾结构语句,引导用户操作(设置xx),并在动宾语句中增加操作目标信息(要核验的xx)与用户边看文档边操作情景下的心理接受预期更吻合,相比于优化前只是直白地解释这个参数是什么,更能激发用户去完成操作。

在参数补充说明中,除了介绍客观依据(Mode取值为xx),也补充关联的场景信息,因为用户在操作过程中对自己的需求及操作目标更清楚,而非参数设置,让用户看到无需回头查看其他参数的描述。

此外,原文在介绍银行卡照片获取方式时,遗漏了场景前提。只要做了清晰的技术梳理,就可轻易发现该问题,并纠正它。

用户信息型参数

  • IdName:设置要核验的用户姓名。
    如需认证用户身份信息(
    Mode取值为OCR_VERIFY_BANK_CARDVERIFY_BANK_CARD),该参数必选,表示认证银行卡号和您设置的用户姓名(IdName)是否匹配。
  • IdNo:设置要核验的用户身份证号。
    已设置
    IdName后,可选传入该参数。如果传入该参数,表示认证银行卡号和您设置的用户姓名(IdName+身份证号(IdNo)是否匹配。
  • Mobile:设置要核验的用户手机号。
    说明类似……
  • IdName:用户的真实姓名。
    Mode取值为OCR_VERIFY_BANK_CARDVERIFY_BANK_CARD时,IdName为必选字段。
  • IdNo:用户的身份证号码。
    Mobile
    :用户的手机号。

该部分参数优化的思路与上一页类似。有一处区别,优化后在参数描述中进一步补充了参数设置的影响,使用户知其所致。

阅读体验优化

未优化前的内容看了不能用于指导操作,但是,即使完全按照以上建议优化了内容,还是存在不好用的问题。因为参数的相互关联逻辑较复杂,用户看起来有种眼花缭乱的感觉。这时,可以尝试“直给式”的内容结构设计。

因为场景特殊,需要跳出传统的思维框架,在合适的位置(例如,请求参数表格中间,见下图示例,或者Mode参数描述中、请求参数表前后等)提供与用户场景直接关联的参数设置建议,便于用户在与场景关联的情况下,直接理解产品设计背后的逻辑。

场景划分是金字塔尖,具体参数是塔底,从尖到底去阐述更清楚、易理解。

结构优化.png

在上图案例中,如果能够结合交互式文档设计方法(例如,配置下图所示的场景页签,分场景介绍用户需要传入的可选参数),将能够为用户提供更佳的阅读体验。

可视化效果.png

以上,就是本次技术写作案例分享的全部内容,希望对你有所帮助,也希望可以听到你的宝贵建议~

目录
相关文章
|
1月前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
1月前
|
监控 安全 Java
Java多线程编程的艺术与实践
【10月更文挑战第22天】 在现代软件开发中,多线程编程是一项不可或缺的技能。本文将深入探讨Java多线程编程的核心概念、常见问题以及最佳实践,帮助开发者掌握这一强大的工具。我们将从基础概念入手,逐步深入到高级主题,包括线程的创建与管理、同步机制、线程池的使用等。通过实际案例分析,本文旨在提供一种系统化的学习方法,使读者能够在实际项目中灵活运用多线程技术。
|
2月前
|
算法 开发者
探索代码之美:一段编程旅程的反思与启示
【10月更文挑战第3天】在数字世界的编织中,代码不仅是命令的集合,更是思考的结晶。从大学毕业时的迷茫到勇敢尝试新领域,再到不断学习和提升,我找到了人生的方向。本文将分享我的技术感悟,探讨如何通过编程实践深化理解,提高问题解决能力,并最终实现个人成长。
|
3月前
|
机器学习/深度学习 人工智能 算法
编程之路上的启示与反思
【9月更文挑战第16天】在编程的海洋中,我们每个人都是一艘航行的船。有时顺风顺水,有时逆流而上。本文将分享一段个人的技术成长之旅,从初心到迷茫,再到自我发现,最终找到属于自己的航道。通过这段旅程的反思,我们将探讨如何在技术的洪流中保持初心,不断进步,并对未来做出明智的选择。
|
6月前
技术成长中的反思与启发
在技术领域工作多年,我深刻体会到技术成长不仅仅是知识和经验的积累,更是一种心态和态度的转变。本文将从技术成长的角度出发,探讨个人成长中的反思和启发,以及在技术领域中的应对策略。
59 2
|
7月前
|
算法 UED
探索编程思维:不仅是代码,更是解决问题的艺术
【5月更文挑战第24天】 在数字世界的舞台上,编程不单是一系列指令的排列组合,它更是一种独特的思维方式。本文将深入探讨编程思维的本质及其在问题解决过程中的应用。我们将剖析编程思维如何影响逻辑构建、创新思考和系统分析,并通过实例说明如何将编程原则应用于日常生活和非技术领域。
技术人修炼之道阅读笔记(八)归纳法思维
技术人修炼之道阅读笔记(八)归纳法思维
|
设计模式 算法 程序员
培养编程思维的关键——从最基础开始
在当今信息时代,编程已经成为一项不可或缺的技能。而要成为一名优秀的程序员,除了掌握具体的编程语言和工具,更重要的是培养良好的编程思维。本文将从最最基础的层面入手,探讨如何培养编程思维。
284 0
|
存储 负载均衡 算法
《技术创作能力对我职场进阶的帮助》| 学习笔记(一)
快速学习《技术创作能力对我职场进阶的帮助》
110 0
《技术创作能力对我职场进阶的帮助》| 学习笔记(一)
|
敏捷开发 负载均衡 算法
《技术创作能力对我职场进阶的帮助》| 学习笔记(二)
快速学习《技术创作能力对我职场进阶的帮助》