偶然想到的这个话题,工程师做工程是一方面,而作为单纯的程序员,总是充满对于纯粹的追求。
最近又负责了一个使用 Angular 的项目,我们知道最近 Angular 很火,其中一个重要原因就是它给前端开发带来的变革,第一次发现可以让以前如此恼人的变量绑定消失掉。以往变量绑定的语句放在附属于页面的一个 js 片段(文件)里面,颇有些无奈的意思,如果把它视为展现层面的东西,显得很不直观(声明式编程才是最直观的方式),而且让这一层变得啰嗦;而如果把它视为下面一层的东西,这又让逻辑代码变得不纯粹——凭什么要让逻辑代码去了解哪个 dom 叫什么 id?于是 Angular 来了,引入了 $Scope 这代表上下文的东西,变量绑定替解决了(之前介绍过 Angular 的变量绑定和依赖注入),这个问题迎刃而解了,在复杂性不很高的情况下,性能问题不成为主要矛盾。它带来的收益明显更大。
还有一个很常见的例子是常挂在程序员嘴边的单一职责原则,我觉得这大概是软件设计最重要的一条原则,就做一件事,把一件事做好。延展开去说,解耦和抽象是设计的核心艺术,但是所谓的解耦,目标也不正是把 “不纯粹” 的东西隔离开么?再延展开去,关于软件系统的分层,一样是围绕着 “纯粹性” 展开的,某一层都有自己需要了解的客户,也都有自己不应该关心的内容,例如业务层就不要了解数据源的知识,而数据层要通用到不具备业务逻辑。
到了更宽泛的工程领域,纯粹依然作为目标在指引对于质量的建设,甚至让程序员被象征着纯粹的数字统治。比如,某项目规定代码必须全部被单元测试覆盖,遂使用工具保证测试的分支覆盖率达到 100%,于是大量二了吧唧的测试用例去覆盖那些毫无营养的数据容器(大部分都是贫血 model)。
编程语言上面,对于函数式风格走火入魔的就属 Haskell 了,当然,一门语言自然有自己的哲学,你不能说任何东西都是为了工程服务的。Haskell 正是因为其中纯粹的不变性,这让编译器能对函数式风格的代码做最大程度的优化,比如,其中的 Lasy Evaluation。在用 Scala 写 Spark 程序的时候,也享受到了不变性带来的好处。性能有时候因为对象的过度创建是个问题,但是有时候却因为创建新的对象可以省去对于状态的维护,这在开发和维护中可以大幅度减少程序出错的概率。
算法的纯粹性让其进一步地获得抽闲,脱离实际问题,靠近原始数学;数据的纯粹性让其意义和形式分离,数据本身和数据元信息分离;数据和代码分离,但是到了更高层次,数据和代码又可以统一起来,你我不分,互相转化,这就是动态语言数据即代码的体现。我们每天都在把复杂的混合的东西分解和提炼成纯粹的易于抽象处理的模型。
当然,对于纯粹追求过度了就是悲惨的事情,这里面会产生宗教,然后,就如同任何一个领域一样,喷子冒出来了。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》