​【摘要】程序员常会说:我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档。

有一个很老的梗: 我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档。

有这种想法的程序员应该算是一个老鸟了,对于大多数程序员来说,对于他们来说: 文档是什么。

对于大规模,超大规模的项目,并且历时很长,需要大量人员协同开发的项目,没有文档简直不可想象。但是由于时间紧,任务重,大多数的项目中的开发者都没时间写文档,而且,文档也不计入考核指标,导致开发者也没有动机写文档。这就造成了很多项目都缺少规范化文档,项目的交接和接口的对齐都是靠口口相传,接口定义准确度低,并且项目的整体开发效率低下。

作为一个文档爱好者的笔者来说,平常很重要的一件事儿就是将自己的工作归纳总结并整理成文档。即便如此,笔者也面临着很多问题:

  • 需求很快就变了,光是改代码就已经耗尽了我的精力了,哪有时间同步文档。
  • 要么先改代码,要么先改文档,总之文档和代码之间存在一个不一致错位期。

除此之外,由于我们主要从事AI相关能力的研发,所以在开发过程中还存在以下特殊的问题:

  • 开发者不得不写大量重复的网络编程相关的业务代码,这些代码的质量通常不高,并且在后期的反复修改中变得越来越臃肿,从而难以维护。
  • 因为重复的业务代码开发工作占比过大,严重压缩智能化研发人员在AI方面的精力投入,这就导致了企业投入大量人力却无法得到好的效果。

经过不断的摸索和实践,AIMS项目组采取了一套文档驱动的开发模式,可以有效地解决上述在项目中广泛存在的问题。

1、AI接口开发的特点

不同于传统API的CRUD接口的开发,AI的开发模式通常包含了以下步骤:

  • 数据清洗;
  • 模型训练;
  • 参数调优;
  • API上线。

前三项都是我们组的强项,也是我们的工作重点。但是在实际工作中,却是API上线消耗了我们的大部分精力。AIMS项目组大都从事的是AI方向相关的工作,对于API的相关库flask、tornado也不是很熟悉,这就导致开发人员需要花大量时间去了解网络编程相关内容,开发出来的程序质量可能也不是很高。而且,在接口开发后,还需要准备一份Swagger UI给前端的开发人员,这又是一项繁重的工作。为了解决如上所述的痛点问题,AI接口开发就需要满足以下两个特点和需求:

  • API的核心函数是现成的;
  • 需要将API开发工作量降到最低。

2、文档驱动的开发模式

我们发现API的接口文档中已经包含了实现API接口的所有信息。也就是说,API接口文档的信息熵和API接口代码的信息熵是一样的。因此,我们只需要完成代码或者文档中的一项即可,另外一项可以交给框架自动生成,这就避免了把同样一件事情重复做两遍的问题。考虑到文档不论从可读性、易写性还是可维护性都胜过代码,我们决定写文档,然后根据文档生成对应的代码。

我们参考了OpenAPI Specification3.0.1标准,以及JSON Schema定义了一套API描述语言,开发者基于这个API描述语言撰写API文档。当完成文档时,API的开发工作也随之完成,大大节省了API接口的开发工作量。经过初步估计,使用文档驱动模式开发一个API接口,通常可以减少40%–70%的工作量。

3、AIMS框架介绍

为了实现文档驱动的开发模式,AIMS基于tornado实现了一套Web后端框架,如下图所示。

(1)ApplicationRouter组件

每一个API都会有一个路径,即一个正则表达式[1]。一个微服务中的多个API的所有路径会组成一个API路径列表。

当Application Router接收到请求时,会根据请求中的URI在路由表中查找。如果匹配到某一个Request Handler,路由模块会将请求转发给响应的Request Handler。如果所有的路径都不匹配,则返回404结果[2]。

(2)RequestHandler组件

Request Handler处理来自Application Router的响应,是AIMS架构的核心,而Document则是Request Handler的核心。在AIMS架构中,Document是指函数的文档,即__doc__。Request Handler是在服务的启动阶段动态生成的。

事实上,在AIMS架构图中,只有Document是开发者必须写的[3]。其它的组件都是由AIMS提供的,或者是由Document自动生成的,所以AIMS开发模式也被称为文档驱动型开发模式。开发者只需要维护Document即可,从而实现减少开发者工作量的目的。

(3)Watchman组件

Watchman组件可以通过设置来订阅某些接口的异常,当被订阅接口出现任何异常时,Exception Handler便会触发Watchman组件。

因为Recorder组件记录了Arguments,Watchman甚至可以自动产生一个可以复现该问题的测试用例,方便开发人员定位问题。

(4)Recorder组件

Recorder是一个采集器,可以采集每一次请求的所有细节信息,包括请求ID、请求参数、远程IP、被调用的接口、响应时间、工作目录和进程号等各种信息。这些数据具有以下两个作用:

  • 系统的维护者可以利用Recorder中的数据快速定位,复现现网问题,可以看做是一个更强大的日志系统。
  • 通过请求ID,训练数据收集系统可以将请求参数、响应数据与用户反馈数据关联起来,这就相当于是一条有标记的数据。

(5)Logger组件

Logger是AIMS封装的日志模块,用法和python自带的logging.Logger使用方式一致,最大限度地降低开发者的学习成本。

补充说明

我们注意到,在AIMS架构图中,Argument Parser、Schema Checker、Swagger UI和OpenAPISpecification是同源的,即都是来自Document。这就不会出现文档(Swagger UI、OpenAPI Specification)与函数实现(Argument Parser、Schema Checker)不一致的情况。开发者也不需要同时维护Argument Parser、Schema Checker、Swagger UI和OpenAPI Specification相关代码。

以上就是文档驱动开发在AIMS框架中的优势,既降低了开发者的工作量,又解决了一致性的问题。事实证明,自动产生的组件质量也是优于开发者自行开发的代码,并且不易出错,从而提升整体服务的质量以及稳定性。

[1] 在AIMS开发中,这个字段是写在__doc__中的api_path字段中。
[2] 事实上,路由模块会将请求转发给NotFoundRequestHandler,然后由NotFoundRequestHandler进行响应。
[3] 在AI相关微服务开发过程中,Function,也就是核心功能函数,是已经准备好的。

本文分享自华为云社区《文档驱动开发模式在 AIMS 中的应用与实践》,原文作者:zqmillet 。

点击关注,第一时间了解华为云新鲜技术~

开发接口文档_更优更稳更好,看文档驱动开发模式在AIMS中的优势相关推荐

  1. python如何读取公共盘的文档_如何使用 Sphinx 给 Python 代码写文档 | Linux 中国

    最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka Python 代码可以在源码中包含文档.这种方式默认依靠 docstring ...

  2. swagger api文档_带有Swagger的Spring Rest API –创建文档

    swagger api文档 使REST API易于使用的真正关键是好的文档. 但是,即使您的文档做得很好,您也需要设置公司流程的权利以正确,及时地发布它. 确保利益相关者按时收到是一回事,但是您也要负 ...

  3. 软件项目文档_什么是软件项目的好的文档?

    软件项目文档 开放地理空间(OSGeo)基金会最近参加了Google的第一个文档季节 ,其中Google赞助了高级技术作家为开源项目做出贡献. OSGeo是大约50个地理空间开源项目的总括组织. 多年 ...

  4. flowable 中文文档_滴滴实习收获 | 产品经理就是写文档和开会沟通的吗?

    本篇文章希望和大家分享我今年的2个思考:一是为什么需要产品经理,二是产品经理的工作核心逻辑是什么.内容会结合<俞军产品方法论>和我自己在滴滴国际化做产品实习的经历. 一.为什么需要产品经理 ...

  5. 苹果手机怎么编辑word文档_多人协同编辑一份Word文档用修订功能就对了

    在职场中我们难免会遇到需要与同事协同编辑一份文档的情况 那么如何清晰不混乱地协同编辑呢? 如下图所示,相信不少人在协同编辑文档时都是这样做的,用各种颜色字和括号,写明自己想编辑的内容及要修改的点.一旦 ...

  6. java开发高端说法_扣丁学堂教你如何成为JavaEE高端开发人才

    俗话说干一行爱一行,行行出状元.这句话在如今飞速发展的互联网时代依然实用,如今不少参加学习技术的小伙伴都希望自己可以成为专业的高端开发人才,本篇文章扣丁学堂教你如何成为高端开发人才. 互联网时代,对人 ...

  7. swagger api文档_带有Swagger的Spring Rest API –公开文档

    swagger api文档 创建API文档后,将其提供给涉众很重要. 在理想情况下,此发布的文档将足够灵活以解决任何最后的更改,并且易于分发(就成本以及完成此操作所需的时间而言). 为了使之成为可能, ...

  8. 人人开源项目文档_为什么图对于您的开源项目文档至关重要

    人人开源项目文档 如果您曾经在GitHub上访问过一个项目(例如),目的是了解它如何适合更大的系统,那么您会发现找到一两个图(或从中轻松找到)时会感到宽慰. )的初始目标网页. 这是一篇有关架构重要性 ...

  9. 苹果手机怎么编辑word文档_原创首发:编辑和修改PDF文档,将PDF转换为WORD技巧...

    在之前的文章中介绍了如何将图片合成为PDF文档,今天将为大家介绍下如何编辑和修改PDF文档,以及将PDF转换为WORD的技巧. 使用到工具Adobe Acrobat 编辑和修改PDF 文档 方法1.使 ...

最新文章

  1. 10.5 考试 (感觉比较难)
  2. VTK:几何对象之Circle
  3. android 底部导航,Android 底部导航之BottomNavigationBar
  4. MacBook Air 是什么意思
  5. [Python] L1-025. 正整数A+B-PAT团体程序设计天梯赛GPLT
  6. 《Microsoft Sql server 2008 Internals》读书笔记--第五章Table(6)
  7. 我成功通过PMP考试的经验与体会
  8. 批处理脚本Bat打开URL
  9. jsp中java代码、jsp代码、js代码执行的顺序
  10. android 照片 文件夹在哪里,Android手机照片文件夹在哪里?删除的手机照片怎么恢复...
  11. 7-1 电话聊天狂人
  12. 逻辑函数的描述工具介绍
  13. android 打开屏幕,android打开关闭屏幕
  14. 初识C语言----完结篇
  15. 虚拟私助理要来了,五个行业将受影响人 | 分析
  16. UVA11134 传说中的车 Fabled Rooks
  17. onecore\com\combase\dcomrem\channelb.cxx(6563)\combase.dll!76A59D9F: (caller: 75A95B54) ReturnHr(1)
  18. 【原创】股市快讯自动更新器
  19. 香蕉派 BPI-M5折腾记录(1)—— 开发板系统烧写
  20. 数据分析--可视化matplotlib

热门文章

  1. kudu参数优化设置,让集群飞起来~
  2. Getting Started with Google Guava--思维导图笔记
  3. java 实现中文排序,Java自定义比较器实现中文排序
  4. 创建一个动物类 java_使用java面向对象创建动物类并输出动物信息
  5. promise的状态值_什么是Promise,Promise的三种状态
  6. STM32一种基于NTC的控温电路及软件实现
  7. leetcode No.123 买卖股票的最佳时机 III
  8. c语言编写两个矩阵的乘积,如何用c语言编写两个模糊矩阵相乘的程序?
  9. mongdb2008puls4.0.3安装_Mathematica 10.3安装教程
  10. java按时间范围过滤_在Java中,如何仅选择或过滤在特定时间段内创建的文件