编程是介于科学和艺术的一门实践学科。
在我们对一件事情的本质理解还不够透彻的时候, 编程更像一种探索运动, 我们动一下这个函数改一下那个变量, 通过不断的实验来加深对事物的理解, 这时候我们更像一个艺术家一样, 这个改动会对全局结果产生什么影响并不重要, 因为重要的是体验和过程, 重要的是在过程中随意修改的体验给自己思想上带来的认知改变, 重要的是思绪流淌在二进制海洋中感受每一比特跳动差别的美妙, 当我们体验的足够多细节时, 终有一天, 我们可以说, 我理解这个事物的运行原理了, 特别是我们找到某个开源项目的核心原理那一行代码时, 那种理解事物运行机理的美妙反馈会让自己兴奋几天, 因为我们感受到自己的认知提升了: 哦, 原来是这样…
在我们彻底对某件事情的原理理解后, 当我们想基于这个原理创造某个项目时, 这时候更像科学和工程, 或者说更像构建实体大厦, 这时候探索原理不再重要, 因为我们已经理解大厦的材料、 结构和力学关系, 就像我们已经理解程序运行所需的工具函数、 数据结构和架构设计关系一样, 这时候更重要的是追求秩序, 那种复杂的事物, 分毫不差的按照设计者的想法从零构建起来的自我激励更为重要。 我有时候无聊的时候, 会逛自己创造的复杂开源项目的源代码, 虽然每一行代码我都知道什么意思, 但是看着数据和逻辑在代码迷宫中穿梭运行时那种感觉, 是一种平静的幸福, 一种对复杂事物背后秩序的敬畏。
当我们想探索某样东西的时候, 人的思维更像一个科学家思维, 希望编程语言对我们束缚越少越好, 当我们 Hacking 一样东西时, 最重要的是我们追逐线索的时候思绪不能断, 有点类似破案一样, 连续流畅的思维是最重要的, 因为只有流畅的思维才能在有限的精力和复杂的代码迷宫中找到真正重要的原理。
回到编程语言, 当你在进行一项技术探索的时候, 像 Elisp 或者 Python 这种束缚性最少的编程语言最舒服, 整个过程, 思维的流畅性就和你有灵感时写作一样, 手指只是神经信号的肌肉条件反射, 你只用思考就可以了, 思绪有多流畅, 心流体验就越好, 当内心进入完全自由的感觉, 心里越放松越容易让大脑进入高速运作模式, 那时候你学习什么原理的速度都是最快的。
但是像 Haskell 和 Rust 这样的语言, 你写代码的时候, Haskell 时刻都在提醒你, 这部分代码是有副作用的那部分代码是没有副作用的, 你要时刻关心代码的副作用边界、 晦涩的自创数学符号和 Monad。 Rust 时刻提醒你代码的生命周期, 越是复杂的数据结构和代码交互逻辑, 生命周期打扰越频繁。 在这种持续的打扰下, 流畅的思绪和心流的体验很难建立起来, 就像你在闹市看书一样, 时刻有人突然挡在你眼前, 让你强制关注那些不重要的细节时, 你很难内心平静的去思考框架和核心原理。
大多数编程时刻, 我们都应该选择那些思维负担小的编程语言, 因为我们不管职业和能力水平如何, 大多数时候我们都在进行探索性编程, 人的成本和时间要远远比机器更重要, 即使今天我们用了最严格的语言编写了自己认为最严谨的代码, 但是明天我们的代码和对世界的认知也会发生变化的。
而严格型的编程语言, 更适合性能或内存要求很高, 或者一个企业需要构建非常稳定可靠的服务时才需要, 这种时候更多是一种从顶到下的工程实现过程, 更强调最终结果的秩序、 严谨, 就像盖房子一样, 所有东西都是设计好的, 通过集体按部就班的实现即可。
这个世界本身是混乱的, 做为个体而言, 有时候自由自在的探索更快乐…