翻了翻公司那个仓库的提交,算在我名下的,最早一条是 2024 年 1 月 22 号晚上 9 点 35 分,说明只有一个词,init。那天一共五条,除了 init,其余四条的说明里都带着 line,最后一条是修线的 bug,比前一条优化线的只晚了不到两分钟。

那是一个流程设计器的前端,往画布上放节点,再用线连起来。init 里节点已经有了,可接下来的四条全在改线。我猜是线最藏不住,节点歪一点还能当是设计,线歪了一眼就看得出来。

线

那时候连线我试了两种办法:一种很土,量出两个元素的位置,拼一条贝塞尔曲线,塞进一个 SVG;另一种是直接用页面里引的 jsPlumb。两种在 init 里就并排放着,八分钟后有一条提交,标题叫 second method draw lines,把手拼的那种先注释掉了。

画线的代码一开始挤在主组件里,当晚 11 点 17 分,我把二百多行拆出去,单独成了一个文件,两种办法在里面又都有。

2 月 18 号晚上,项目里多了 antv 的 x6(一个画图的库),新的画布用它来画线。2 月 28 号晚上 11 点 32 分,一条重构的提交把旧的主组件和那个画线的文件一起删了,两个加起来六百多行。从第一天数起,三十七天。

换了图库,节点之间隔多远,还是得我自己去告诉它,下面 2 月 29 号那条就是。

树

2 月 22 号晚上 10 点 54 分,有一条提交归在修复里,修的是交上去的数据还是一棵树。画布上用的确实是树,每个节点挂着自己的子节点,排版靠一个树形的布局库。可存下来的得是一份平的列表,每个节点自己记着前面是谁、后面是谁。这条提交把嵌套的节点摊平,加了 20 行,删了 9 行,只改一个文件。

我觉得这跟先画线是一回事。树里谁连着谁靠嵌套,拍平以后就只能靠 id 去认。

十三分之一

删掉旧画布七个半小时之后,2 月 29 号早上 7 点 06 分,一条提交说这是让流程图自动居中的数学模型。代码里是:节点之间的水平间距,按窗口宽度套一个一次函数,斜率正好是十三分之一;另外 1920 这个宽度,再加 1600 和 1445 前后各 50 像素的两段,各写死一个值。

读着更像一条直线加三个特例。这个提交加了 65 行,真算模型的只有十行上下,剩下大半是文件被重新排了一遍,引号换成双引号,补上分号。

半秒

3 月 11 号早上 8 点,一条提交的意思是,流程图数据转换超过半秒,就弹提示框,不让操作。打开一个存过的流程,要先请求数据,再把平的列表还原成树,才上得了画布。代码里起了一个半秒的定时器,到点了还没回来,才盖上那层提示;回来得快,就一次也不弹,大概是怕一闪而过。

459

整个仓库一千多条提交,算在我名下的有 459 条,四成多。里面 63 条是合并,63 条是 Update 加文件名,后面这种里有 38 条是同一个文件,components.d.ts,一个工具自动生成的声明文件。这 38 条里有 26 条,前后五分钟就有一次合并,我猜是合并时总在这个文件上冲突,解完就是一条。扣掉合并和这些 Update,剩 333 条,说我写了 459 条其实不准。

这 333 条里,开头是"修复"或 fix 的有 167 条,一半出头;"完善"16 条,"新增"15 条。写着"反显"的有 19 条,就是把存下来的数据原样读回画布。大概是修得比写得多。

别人的提交说明基本是一句话,没有前缀。我先写了四天英文的 feat、chore,再换成中文前缀,用到 2 月 7 号,之后也成了一句话,只有 2 月底到 3 月初那一轮重构,又用回了 ref: 这个前缀。返工也有:2 月 28 号下午 5 点 54 分回退了一个删除弹窗,39 分钟后又加了一个删除时的提示;2 月 19 号修过画布初始缩放太大,4 月 10 号干脆把缩放删了。

我在这个仓库的最后一条提交是 4 月 27 号晚上 9 点 27 分,加了一个回到顶部的按钮。