日报标题:科学家也编程,跟程序员有什么不一样吗?
编程序,只不过是人类与计算机这种生产力工具对话的一种方式。
没有计算机的时候,铁匠靠手工技能加工金属,后来靠操纵电动工具加工金属;文官靠书信、纸质报表进行治理;会计靠筹算、珠算、计算器来算账;科学家通过手工艺做实验,通过书信发表文章,通过笔算/心算/筹算/计算器来进行数据分析。
现在有了计算机,编程让数控机床加工金属;字处理工具、宏(广义编程)、报表系统等来进行行政管理和财务管理;科学家可以用计算机仿真等手段进行一部分实验工作,通过 Latex 等排版工具编写文章,通过 Fortran、R、Matlab、Python、ROOT 等等语言进行数据分析。
计算机是很多行业中,面向人类开放的机器接口,而码农(程序员)则是相应的行业中,面向机器开放的人类接口:直接从事生产的劳动者嘛。只不过,狭义的码农(很多行业都有人自嘲为码农,但其实不是真正的码农)其实就是除了编程,啥也不会的一个工种。这和其他专业领域首先具备专业技能,其次利用计算机加快生产的工种不同。
所以,其实,拿今天(利用计算机开展工作的)科学家和今天各行各业的码农进行对比,就好像古典时期的科学家和铁匠/文官/会计对比一样,恐怕共同点仅仅是都有手艺/会写字/会计算。但要求是不同的。
比如,为了科学计算而编写程序时,软件生命周期、配置项的成熟度等等软件工程方面考虑的东西,科学家往往不关心。但是对于参数的选取、对必要的近似的说明等等,则又是特别小心、必须明确的。因为要拿出去跟其他的结果对比。
比如,我前几天为了画下面这种图:
模拟近地小天体的轨道、尺寸、反照率的分布。如果只是为了画图的话,大概其差不多就行了。但是因为后面要对望远镜进行仿真,所以必须定好小天体的数密度随尺寸的 broken power-law 的尺寸指数,并且用已经观测到的近 1000 颗公里级小天体的样本数量来归一,等等。重要的参数,一定要注释清楚,是从哪篇文章里看来的。量纲一定要一致。
但至于说到我用来画图的程序本身,注释是否清楚,是否可以从 python 2 移植到 python 3,我不关心。图中太阳、水星、金星、地球、火星和木星的尺寸我却又不关心了,因为与估算望远镜本身的性能无关,仅仅起到“示意”作用而已,尺寸随便取取就好了。另外,几颗大行星的轨道位置都对吗?不对。为啥不对?方便画箭头啊!
上面是一个“糙快猛”的例子。但也不是一直这样的。比如,前段时间,我需要解决一个球面上不具有旋转对称性的 Kernel 的卷积以及解卷积问题。目前现成的方法要么需要假设 kernel 轴对称,要么需要对球面做平面近似。但因为我要分析的是巡天数据,球面已经不可能近似成平面了,所以就想了别的办法,找到一组正交的轴对称基,把 kernel 分解,然后就可以快速计算了,还顺便找到一个快速的矩阵 - 矩阵乘法算法。
所以,回到问题,如果说科学计算和通常所说的码农的编程有多大区别,那么区别还挺大的。因为科学计算一般不受软件工程的约束,一个研究课题的周期也比较短,少量科学计算软件工具有可能变成某个领域、某个行业的通用工具,但大部分软件都是随开题生,随结题亡。几年前,我试图想把我过去写的程序再整理整理,挖掘一些可共用的库出来,弄个工具包,但这个工作到现在也没完成,更可怕的是,需要整理的代码增加快,而整理的速度很慢——考虑框架等较为顶层的设计,根本就不经济。