我现在处理数据的方法是:

  1. 将数据以一条 log 的形式保存在一个文本文件中
  2. 根据不同的需要,用 python 脚本对采集到的数据进行一些格式上的处理
  3. gnuplot 对数据进行可视化

以上三个步骤中,1 和 3 是不需要变化的。收集数据的代码是嵌在程序代码中的,而 gnuplot 脚本无非就那么几个模板,一旦定制好以后就不需要再更改。

唯一的变动点出现在第 2 步,比如我有两种需求:

  1. 控制 a 变量不变,观察 b、c 的变化
  2. 控制 b 变量不变,观察 a、c 的变化

我就要写两个 py 脚本,运行两遍来产生不同的数据格式。如果影响因子数量高达上百个的时候,我就要写几百个 py 脚本。通过元编程的方法可以解决这个问题,但在这样的情景中算不上优雅。

于是今天走在路上的时候我想到了数据库。第 2 步中存在变化点的原因在于 log 记录是非结构化的,所以需要用某种方法进行结构化,来满足用户观察数据的需求。如果数据以 row 的形式储存在 MySQL 中,那么就可以把查询的工作交给 MySQL 的解释器。

于是当我想要“控制 a 变量不变,观察 b、c 的变化”时,只要写下这句 SQL 语句即可:

SELECT b c FROM table_name GROUP BY a 

既然如此,为什么不写一个工具将所有的中间过程隐藏起来呢?用户只需要在程序中增加一些 hook,然后用一个 XML 文件对一条记录的格式的进行简单的配置就行了。这样一来,用户每次在写一个新的程序时就不需要重复那些枯燥的工作了,比如“怎样打日志”和“如何进行数据展示”,而只需要专注于最重要的问题“如何观察数据”,SQL 丰富的语法保证了用户可以以任何角度来观察数据。用户甚至不需要会 SQL 语句,他只要在控制台输入:“我要控制 a 变量,观察 b、c 的变化”这样的自然语言,程序就会在后台产生相应的曲线。