跳至内容
我与神奇软件 Asciio 以及他的创始人的一段缘分

我与神奇软件 Asciio 以及他的创始人的一段缘分

September 21, 2026

我与神奇软件 Asciio 以及他的创始人的一段缘分

这篇文章的定位

这篇文章不讲 Asciio 软件的使用和安装教程,也不讲它的完整特性,主要讲下我和它的创始人 Nadim 的缘分。

寻找合适的软件

首先介绍下我自己,我是一个中国的软件开发人员,一个中国四川省人。一直在成都一家公司开发一些底层的测试工具和脚本,主要是测试公司的硬件产品在发货前是否有故障。会涉及一些硬件底层驱动和工具的开发,以及 Linux 下的一些 Bash 脚本的开发。脚本的主要目的是调用这些工具或者驱动提供的接口,然后用来测试硬件链路是否正常,硬件的性能是否达标,指示灯是否能正常点亮等等。

在开发的过程中,有时候工具或者驱动的架构设计需要绘制简单的流程图。这个时候如果使用 Visio 或者 Draw.io 这种软件,我感觉太笨重了,因为我要绘制的东西本身就不是那么复杂,我想如果可以直接使用 ASCII 字符,或者 Unicode 的制表符直接在代码的文档中,或者在代码的注释中绘制,那么维护成本和便利性都会极大的提升。

于是我开始满世界的寻找类似的文本绘图软件。以下是我的寻找历程。那大概是2023年的下半年,离当年过年已经不久了。

  • monodraw: 这款软件似乎能满足我的要求,但是它只能支持苹果电脑系统,所以被我淘汰。
  • asciiflow: 说句实在话,这个在线的文本图编辑器真的太难用了,被我淘汰。
  • monosketch: 一个日本小伙开发的在线文本图绘制工具,但是风格和操作便利度还是无法满足我的要求。后来我邀请他开发 AsciioWEB 版本,他委婉的拒绝了。

除了上面三个工具外,我还寻找了另外的工具,都无法满足我的需求,我本身是一个 Gvim 使用者。虽然我不使用终端的 Vim,但是我还是希望工具能贴合文本的特性。这个时候我找到了 Asciio

刚发现它的时候,它只有 Gtk2 端口版本,不过对我来说已经够用了。因为我的操作系统是 Windows,所以不太方便直接使用 Gtk2 的软件。我在网上找到了 camelbox。一个完整的可以直接在 windows 上使用的包含 Gtk2 的软件包。最最关键的是,它居然内置了 asciio 软件!

对 asciio 的第一印象

当我安装好 camelbox 然后进入软件开始绘图的时候。我就感觉到震撼了!因为这个文本绘图软件居然支持线条的自动路由,这在别的文本绘图软件中我都是没有见过的。其它的软件最多就是可以用鼠标或者键盘绘制出线条或者方框,但是绘制出来后是不能调整大小和路径的!你要修改只能删除重新绘制。

但是 asciio 不同,你可以像 Draw.io 一样的方式绘制,画布上的方框和线条你都可以重新调整,重新路由!

我的第一次开发

虽然这个软件很好用,但是我发现了一些让我不太爽的地方,它的默认画布太小了!要实现大画布,只能通过缩放的方式。于是我产生了给它加一个滚动条的想法,并且我希望能把默认的画布设置大一些。

然后我发邮件给原作者 Nadim。没想到得到了他的邮件回复,按照他的说法,增加这个功能非常简单,代码可能不会超过20行。我以前从来没有接触过 Perl 代码,不知道 20行 Perl 代码意味著什么。不过我粗略的看了下源码,发现这是一种十分灵活并且极度精炼的语言!

过了几天我看 Nadim 没有动静,于是我决定自己动手来尝试下修改源码!

不怕你笑话,那个时候我们公司主要的协作开发工具还是集中式的 SVN,并没有全面普及使用 Git。所以我在开发初期闹了不少笑话。

然后我提交的支持滚动条功能的补丁,逻辑基本是对的,但是代码质量很差,重复的函数放到了很多源文件中。后来 Nadim 说,他接受我的想法,但是不接受我的代码,因为它们太糟糕了!哈哈,我完全理解他,后来我按照他的意见修改了代码,然后请他帮我合入了。

GTK3 端口移植

由于当前的 asciio 是在 Gtk2 端口的,如果要让这个吃灰了15年到20年的软件重新焕发生命力,那么移植到 Gtk3 端口可能是一个好注意,还因为 Nadim 他自己那边的构建环境也不支持 Gtk2 端口。所以他决定把软件移植到 Gtk3 端口上面来。

这对于我来说当然是好消息。我太高兴了。我等着 Nadim 出一个可用的版本,然后我就可以开始测试。

后来 Nadim 告诉我,要不是我感兴趣,那么这个软件可能不会再升级,因为他那个时候在捣鼓他的超级终端文件管理器: ftl。这又是另外一款神器,我虽然没有用过。但是 Nadim 的所有工作都基本是在终端中完成,这个软件就是他在终端中管理文件的利器。

我非常感谢 Nadim 帮我开发 AsciioGtk3 版本,然后我那时候一直在等待。

由于 Asciio 的代码架构非常优美,恰到好处的抽象,但是又没有过渡设计,该函数式编程的地方就是函数式编程,该面向对象的时候就是面向对象编程,还有策略模式,模板模式等等。所以因为 Nadim 的良好代码设计,我理解 Asciio 的代码也变得容易,这和我以前看过的糟糕的面条代码非常不同!

然后在等待 Nadim 移植 Gtk3 端口的期间,我也模仿这代码中的模板,开发了几个元素,包含: 菱形

这里我想特别说下这个 。我找到了关于实现像素级圆的论文,然后把论文中的算法翻译成了 Perl 代码,然后成为了 Asciio 的圆元素。我觉得这太酷了!Asciio 是一个验证算法和想法的非常好的平台!而且非常直观和高效。

TUI 支持

Gtk3 的端口完成后,Nadim 做了他一直想做的事情,给 Asciio 增加了一个 TUI 客户端,可以直接在终端中绘图,这真的太酷了。但是我并不是用的终端工作流,所以对于 TUI 客户端,我并没有使用过。

unicode 支持

移植 Gtk3 端口的期间,Nadim 的开发效率是相当高的,几乎每天都有上千行代码的提交!他的生产力让我感觉到震撼。没过多少时间 Gtk3 端口就移植完成了。

但是我面临着一个问题。我用的是 windows 系统,所以要用 Perl 开发的 Gtk3 应用相当困难。要么用 WSL 要么用 Cygwin。不过这些问题后来都被我们一起解决了,在完整的解决方案中,不仅仅是 Linux Cygwin Msys2,我们后来甚至搞定了容器版本!所以现在软件的使用和分发非常容易。

在等待 Nadim 移植到 Gtk3 端口的那段日子里,正好是中国的农历新年,我在我老婆家。由于我不喜欢打麻将和一些农村的娱乐活动,所以我有了一些独立的时间。于是我也试着给 Asciio 增加一些元素,甚至加入了一些 Unicode 元素。

Perl 开启了 use utf8; 后是可以对 Unicode 进行支持的,这样软件支持的东西就开始变得丰富起来。

超级大补丁集成

我做过的最让 Nadim 崩溃的事情就是给他提交过三次超级大补丁,每次的代码量都超过了3000行!当然这样做是不对的。我以后再也不会干这种事情。大补丁的集成非常痛苦。我痛苦,他更加痛苦。

代码提交前最好是有完整的文档说明和讨论,在双方都充分认可与理解方案的基础上一个特性一个特性的提交,有条不紊的完成。千万别搞大补丁集成!

CJK集成

因为我本身是中国人,然后我希望以后有机会把这个工具介绍给中国的程序员使用。很多中国的程序员喜欢在他们的注释中加入中文,虽然这种行为显得不够国际化,但是在中国的环境下,中文注释对于沟通的效率是最高的。

为了满足我自己和这部分开发人员,我最终在 Asciio 中实现了中日韩语言的支持。后来我们甚至想支持阿拉伯语言和泰语等等,但是这又是另外一个故事,因为阿拉伯语言的支持是地狱级难度的,至今还没有一个完美的解决方案!

交叉模式和特殊字体

我为 Asciio 带来的最大的原创的东西可能就属这个了,我几乎把这个玩到了走火入魔的程度,我甚至为了交叉模式定制了我自己的字体: vimiomono

这个字体中实现了8向交叉!直接在 UnicodePUA 区域中扩展了制表符,让可以可以制作媲美 svg 的纯文本图表。并且我定制了三个主题,普通版本、带实心圆点的版本、带空心圆点的版本。

font_1

font_2

font_3

这种特殊字体的交叉模式目前还没有在 Asciio 上实现,目前在 Asciio 中实现的交叉模式是基于当前已有的大部分等宽字体的普通制表符交叉模式。但是在我自己开发的基于 Vim 的简化版本的绘图插件 vimio 上已经完美实现了。至于是否要完整的搬到 Asciio 上来。以后和 Nadim 讨论后再决定吧。

这种字体的灵感并不是我原创的,我借用了一个意大利的字体设计师的创意,他的字体是付费的,是:pragmatapro。这款字体可不便宜,差不多要20欧元!在 github 上有它的字体预览。

https://github.com/fabrizioschiavi/pragmatapro

这是使用我的自定义字体的效果图:

vimio_mono_demo

上面这个图的文本版本在我的博客的主页上也可以看到。

关于这个我自己独创的交叉算法,我曾经想过是否应该去国际期刊上写一篇论文,以便于这个算法可以造福于以后的 TUI 工具的渲染。我甚至想过联合 Nadim 还有 pragmatapro 的作者去 Unicode 委员会提交议题,把这些8向交叉字符增加到基本的 Unicode 字符区域去!我知道这件事情的难道会相当的大,所以我目前还没有行动。

工作方式

Nadim 的工作基本上是在终端下完成,他的效率相当高。我曾经也想试试。但是由于我已经调教好了我的 Gvim,所以我不想轻易的把我已经熟悉的东西推翻。所以当前我还是保持我的 Gvim 的工作流。目前来说效率还行,我还不打算更换。至于将来我是否会切换到终端工作流模式,将来再说吧。

性能优化

本来一开始 Asciio 是作为一个绘制文本图的小工具而开发的,没考过大巨大的文本图的情况。我给 Nadim 提出过建议是否考虑优化下性能。

一开始 Nadim 觉得没有必要,认为我强制性的去逼近软件的极限,大部分实际的场景下是不存在的。但是由于我的固执,Nadim妥协了,他开始了性能优化。主要是采取绘图缓存的方式。后面我验证,的确性能提升了很大一截。

可能这个世界上就我一个人逼近了这个软件的使用极限。

后来我自己也为这个软件做了一些性能优化。比如只绘制视窗区域,不是视窗区域的内容直接过滤裁剪掉之类的方法。大部分的提案 Nadim 是接受的。但是他有一个原则,就是性能优化绝对不能和架构的整洁冲突,如果冲突,那么性能优化要考虑别的途径。大致的意思是说,性能的优化是一个长期的过程,并且有很多钟途径,我们不能因为性能优化而牺牲掉软件的架构整洁和可维护性,这是得不偿失的!我非常认可他的这个理念。

PPT工程师和职场焦虑

我接触 Asciio 软件和 Nadim 一起完善它的这段期间,我面临着职场最大的危机。我为这个公司工作了10多年,但是公司决定不再给我续签,我也不知道我做错了什么。这和年龄也相关,大部的公司除了保留大龄的管理人员和顶级的架构师以后,其它的研发人员一般都会被清理掉,而我也是被清理掉的一个,因为我38岁了!

可能我唯一的错误就是一直在埋头干着我的工作和写着我的代码,我的PPT写得不好。我不善于给领导汇报我的成就。无法和那种一行代码都写不出来,但是PPT做得相当漂亮的工程师比!Nadim 说这种人全世界都很多,他们能力低下,他们无法独立完成任何工作,只能靠吹牛和写汇报文档来掩盖自己的无知和恐慌!

后来我放弃了抗争,既然无法改变结果,那么我就接受。准备迎接下一个工作。我是绝对不会去做一个纯粹的PPT工程师的!但是和人沟通或者待人处事上我的确有改进的空间,在下一个公司保留我的优点,弥补我的不足吧!

文档化

由于后期 Asciio 的功能相当丰富,我和 Nadim 合作为它增加了很多功能,各种键盘的快捷键,多到连我们自己都无法完全记住。期待一个用户通过看绑定代码来理解软件的用法是不现实的。

所以我们后期花费了非常多的时间来完善它的用户文档,为各种各样的操作增加使用范例视频。

驾照和人生的其它重要事情

由于我的职场危机,在半年前我停止了和 Nadim 的开发,他看我停止了,他也停了,因为这个项目没有截至日期,说不定哪天我们又启动了,这都说不准。

主要是我还需要处理我后面的生计问题。前段时间我花了几个月的时间终于把我的驾照拿到手了,我非常开心,因为这是我一直以来想做的事情。我有一辆车,但是一直是我的妻子在开,车主也是她。现在我终于有驾驶它的资格了。

这篇博客我计划很久了,一直没有动手,因为想写的东西太多了,每次准备写,脑袋中就涌入了很多内容,然后不知道先写什么。这次也写得很凌乱,大部分都是写碎碎念的吐槽。

我应该会再写一篇文章,讲下 Asciio 的神级特性和一些使用场景,如果有人愿意看,我就会动手。

瑞典和中国

目前 Nadim 在瑞典,我在成都。如果有一天我去瑞典,我一定会去会会我的老朋友。我也给他讲如果来成都,记得找我,我带他去爬山旅游吃吃川菜。

关于AI

我和 Nadim 也使用 AI 来工作,但是大部分的情况下只是把它当作一个普通的工具来对待,不像现在的科技圈那么浮躁。

特别是我现在所在的老公司,AI已经走火入魔了。所以的工作老板都要求必须用AI来完成,不用AI就是政治错误!真的是离谱!写几行简单的代码领导们也希望你是用AI写的!

不管是什么项目,他们都尽量往AI的方向去靠拢。这个世界疯狂了。

我承认AI的确是很好用,比如翻译的场景,现在AI翻译整篇的PDF文档都很准确。但是也没有必要到处都是它。特别是某些需要人类来严谨决策的地方,我觉得还是人来决策比较好,毕竟AI不会对结果负责!

Asciio 的 WEB 化

这是我们的美好愿景,但是工作量还是太大了,目前项目没有启动。曾经我想拉一个精通 web开发 的日本小伙进来,但是他拒绝了。

亦师亦友

在开发的过程中,Nadim 对我来说既是朋友也是老师,他对高质量代码的要求是我以前从来没有遇到过的。因为在我的公司,代码很多时候就是写出来就没人管了,只要能运行,测试能通过,大部分情况下,人们并不关心它的架构是否合理,未来是否好扩展!

在开发 Asciio 的过程中,我写过很多糟糕的代码,但是 Nadim 花费了很大的精力纠正我的错误,让我养成好的开发习惯,甚至教会了我一些 Git 的操作。我非常感谢他。他说过,好的代码是设计出来的,是先有文档,再有代码。必须要对将要开发的东西想清楚,讨论清楚架构,然后再动手写代码,代码只是良好设计后的副产物,并不是什么了不起的东西。

还有就是新开发的功能,尽量独立成新的文件和新的模块,不要对过去的老代码进行破坏性的补丁式的升级。因为那样会导致原来的文件越来越臃肿,越来越难以维护!并且原作者可能都看不懂自己以前写的东西了。

我们还有一个共同点,我们都有一个女儿,他的女儿都工作了很久了,但是我的女儿才9岁,所以我还得向这个世界妥协,用自己的技能赚取一点碎银子把女儿养大。

Nadim 说他的爱好除了代码以外是航海和机械,这真的太酷了,我一直有一个海洋梦想,可惜了四川是中国的一个内陆省份。我平时最大的爱好可能就是爬山和吃美食了。我给 Nadim 讲过我的老婆虽然脾气不好,但是她的四川菜味道相当好。

尾声

其实还有很多想说的,以后想到了再补充吧。比如 Asciio 的用户友好配置、定制化模板等等!

在项目的 Issues 中还有很多宏伟的计划。甚至有和别的代码调试器联动,然后让调试器中的指针图或者对象图直接渲染到 AsciioASCII 画布上的功能!这些宏伟的计划有一天说不定能实现呢?

不过抛开它们不谈,Asciio 本身就非常完整和功能齐全。后面我可能会再写一篇博客来专门介绍它的功能和特性。

所以这篇博客主要就是我的啰嗦的唠叨和碎碎念。


✍️ 本文作者:秦大炮 (Qindapao)

欢迎技术交流与转载。转载请注明出处,并保留以下硬核联系方式。


最后更新于