常用软件工程作图工具汇总
Intro
背景
作为程序员, 除了日常敲代码外, 我们通常也要花很多时间在作图上.
- 汇报或者设计文档中, 一图胜千言.
- 但不想花过多时间在框框的对齐, 颜色的挑选, 样式的调整, 作图工具的选择上.
因此本文系统总结下自己用的工具与最佳实践.希望可以make our hard life a little easier. 
场景
- 对内/非正式:- 详细/概要设计文档
- 代码逻辑/架构梳理
- 个人数据分析
 
- 对内/外, 半正式:- 技术文章/Doc/博客
 
- 对外/正式:- 向上总结汇报
- 项目KO/汇报
 
原则
- 优先: code化(diagrams-as-code), mermaid- 方便git版本管理
 
- 其次: draw.io > yuque 导出图片类型- png > svg > jpeg
 
- 最终: 美学上要有追求, 如色调风格统一- 如Dubbo使用蓝紫过渡色调
 

工具比较
| 名称 | Diagrams As Code | 是否收费(by 20230314) | 优势 | 缺点 | 推荐优先级 | 
|---|---|---|---|---|---|
| mermaid | Y | N | DAS, 项目活跃, 审美在线 | 支持图类型少(有潜力) | 高: 设计文档优先 | 
| draw.io | N | N | 图类型全 | 非DAS, 注意保留源文件 | 高: 设计文档优先 | 
| 语雀画板 | N | N | 图类型全, 审美在线 | 非DAS; 模板样例较少 | 高: 设计文档优先 | 
| PPT/WPS | N | Y | 高: 汇报文档优先 | ||
| xmind | N | Y | 方便易用, 审美在线 | 适用范围窄: 只适合画思维导图 | 中 | 
| ggplot2 | N | N | 适用范围窄: 只适合数学统计类 | 统计类高优推荐 | |
| Rapid Tables Line Graph Maker | N | N | 坐标轴图可以用数字精确表示 | 适用范围窄: 只适用坐标轴图 | 数字坐标轴类高优 | 
| Aliyun ROS Visual Editor | Y | N | DAS | 适用范围窄: 只适用云上部署图 | 云上部署类高优 | 
| N | Y | ||||
| N | Y | ||||
| N | Y | 
架构图(architecture)
- 特点: 宏观的, 上层的
- 使用场景: 汇报PPT
- 面向对象: 老板, 外部
Landscape(Eco)
- 场景: 为了说明某个系统的关联生态
- 工具: draw.io
- Tips: 尽量使用Logo + 不规则形状 + 大箭头
- 样例:![sentinel-opensource-eco-landscape-en]() 
业务架构图(豆腐块)
- 场景: 为了说明某个系统业务架构
- 工具: draw.io > 语雀画板
- Tips: 同色, 分层
- 样例:

技术架构图
云上部署图(Cloud Infra)
- 场景: 为了说明某个系统的部署架构
- 工具: draw.io> rosdesigner
- Tips: rosdesigner 可以直接可视化编辑, 也可以基于已有实例生成拓扑. 缺点是不太美观.
- 样例:

逻辑示意图(重要)
- 场景: 为了说明某个工具/流程work的机制, 可用于汇报, 也可用于技术文章. 属于最灵活的一类.
- 工具: 语雀画板 > draw.io >> mermaid(可用但不灵活, 不美观)
- 样例:

坐标轴图(axis)
- 场景: PPT汇报里, 属于”逻辑示意图”的子类.
- 工具: Line graph maker >> draw.io > 语雀画板. 暂时没有数字描述的坐标图工具.
- 样例:


时间轴图(timeline)
- 场景: PPT汇报里, 展示项目整体milestone
- 工具: 语雀画板(实际使用脑图实现) > xmind > mermaid(版本需要升级, 且不太美观)
- sample:

timeline
    title History of Social Media Platform
    2002 : LinkedIn
    2004 : Facebook
         : Google
    2005 : Youtube
    2006 : Twitter
UML
- 特点: 微观的, 底层的
- 使用场景: 软件设计文档
- 面向对象: 开发人员, 内部人员
状态图(State Diagram)
- 场景: 描述某个状态机. 例如Java线程, NC状态, VM状态等. 不适合汇报
- 工具: mermaid(不太美观) > 语雀画板 > draw.io
- Sample:
stateDiagram-v2
      [*] --> Init
      Init --> Processing: process
      Processing --> Success
      Processing --> Failed
            Failed --> Init: reinit
            Success --> Init: reinit
            Processing --> Init: reinit
      Success --> [*]
      Failed --> [*]
时序图(Sequence Diagram)
- 场景: 多个角色/系统间接口交互. 与泳道图相比, 更细粒度. 适合代码分析, 不适合汇报
- 工具: mermaid
- Sample:
sequenceDiagram
      participant Alice
      participant John
      participant Tom
      Alice->>+John: Hello John, how are you?
      John->>+Tom: Hello Tom
      Tom-->>-John: Yes
      John-->>-Alice: Great!
泳道图(BPM)
- 场景: 多个角色/系统间交互, 更多地面向功能. 与时序图相比, 更粗粒度. 适合汇报
- 工具: draw.io
- Tips: 增加横向容器, 填充颜色, 线段交叉用arch
- Sample:

甘特图(Gantt Chart)
- 场景: 方便管理项目规划, 跟踪进展
- 工具: mermaid >> 语雀画板 > draw.io
- Tips: 横向section
- Sample:
gantt
    title 灰度计划
    dateFormat  YYYYMMDD
    section 测试环境验证
    Alpha策略验证        :a1, 20230302, 20230310
        Beta联调验证 		:20230303, 20230312
    section 海外地域灰度
    澳洲      :a2, 20230310  , 14d
    德国      :a3, 20230313 ,10d
        section 国内地域灰度
        杭州			:a4, 20230316, 15d
        深圳			:a5, 20230316, 15d
        北京			:a6, 20230320, 15d
        上海			:a7, 20230320, 15d
        青岛			:a7, 20230320, 15d
        香港			:a8, 20230322, 15d
        张北			:a9, 20230322, 15d
        美西			:a10, 20230322, 15d
ER图
- 场景: 技术设计文档中使用, 不适合汇报
- 工具: mermaid
- Sample:
erDiagram
    user_profile_define ||--o{ user_profile : defines
        user_profile_define {
            string profile_type
            string profile_attr
        }
        user_profile {
            long user_profile_id
            long uid
            string location_type
        }
    schedule_strategy ||--|{ schedule_strategy_binding : bind
    schedule_strategy_binding }|..|{ user_profile : bind
        schedule_strategy {
            long strategy_id
            string strict_expression
        }
        schedule_strategy_binding {
            string strategy_name
            string user_profile_expression
        }
部署图(Deployment Diagram)
- 场景: 方便
- 工具:
- Sample:
统计图
- 特点: 面向数学统计类
- 使用场景: 个人分析, 汇报PPT
- 面向对象: 内部, 外部均可
- 工具: 推荐使用ggplot
饼图(Pie Chart)
- 工具: mermaid, ggplot2
- 使用场景: 研究报告, 汇报PPT
- 面向对象: 外部
pie title Pets adopted by volunteers
    "Dogs" : 386
    "Cats" : 85
    "Rats" : 15
散点图(带拟合)
- 工具: ggplot2
- 使用场景: 研究报告, 汇报PPT
- 面向对象: 内/外部

趋势图
- 工具: ggplot2
- 使用场景: 研究报告, 汇报PPT
- Tips: 拟合
- 面向对象: 内/外部
双向柱形图

统计类其他图
当想不到该用哪种图来DataViz时, 可以从AntV里按照分类进行选取
- 双轴图
- 热力图
- 雷达图: 使用 Radar Chart | Chart.js 来在线制作![]() 
其他图
脑图
- 场景: 业务规划,
- 工具: yuque > xmind > mermaid(太丑, 且需要高版本)
- Sample:![yuque_diagram-xmind2]() 
ASCII图
- 场景: CLI/DocFile里无法显示图片, 可以用ASCII图
- 工具: asciiflow (缺点是: 增加文本, 移动等操作不太灵活)
- Sample:
     +-------error---------+
     |                     |
+----v----+         +------+---+-+         +----------+
|         |         |          | |         |          |
|  init   +---------> processing +-success-> finished |
|         |         |          | |         |          |
+----^----+         +----------+-+         +-----+----+
     |                                           |
     |                                           |
     |                                           |
     |                                           |
     +-------------------retry-------------------+最佳实践
三级内容优化
- 分辨率优化: PNG缩放400%, 提升分辨率
- 工具熟练: 善用对齐

豆腐块配色优化
- 配色从 colorbrewer2ColorGG 颜色搭配中选择
- 大区域与小区域同色系, 不同深度

配色&字体-Ubuntu风格(cont’d)
- 配色: 不能用白底, 黑底(0x333333) + 绿字(0x33FF33) + 亮海蓝(0x2023A6) + 靛蓝(0x115354) + (0x481036)
- 字体: Comic Sans MS

配色&字体-SegmentFault风格
- 配色: 白烟色(0xF0F0F0) + 铬绿(0x188D5D) + 薄荷绿(0x199562) + 暗岩蓝(0xA680B8)
- 字体: Verdana字体![]() 



