最近写代码的热情又不如前了, 折腾来折腾去心神不定
想到一些东西, 没有多少心思整理, 临时想到写篇文章梳理一下
最近看的东西不算少, 主要是视频, 而且冬天了, 看视频比敲键盘轻松一些
具体的不翔实或者甚至错误的部分, 我先不管了, 先整理一些思路出来
Cumulo 的代码热替换
之前还有信息改进 Cumulo 方案的时候, 当时费了不少心思去研究服务端代码热替换
当时觉得 Webpack 真是神器, 能对服务端代码进行打包, 以及各种配置
我把热替换配好以后, 真的就做到了在不重启 WebSocket 的情况下更新了代码
本来我以为会是很大的效率提升的, 可是奇怪那之后反而没有什么劲头了
我记得那时我也把 actions-recorder 方案移植到服务端完成了 Demo, 很有意思
基本验证了 actions-recorder 也能在服务端运行, 跟前端一样
Cumulo 的初衷也就是前端因为有了 React, 开发应用很方便了
为了能简单地开发多人应用, 我把 Store 放在了服务端, 仅此而已
前端参考 Redux 和 Webpack 实现了高效开发, 那么照搬到后端也能行对吧
Cumulo 是用 JSON Diff 来更新前端数据的, 从前端看来每个操作都有延时
这个想法是一年前的, 当时就注意到了问题, 数据做 Diff, 性能不高
而且意味着数据都是 In Memory 的, 相比 MongoDB 来说就太儿戏了
总之就是个很棒的想法, 完成了预期的 Demo, 对于实践来说远远不够
Falcor 的方案, Relay 的方案, 切实可行多了.. 只是都要学一遍
然而就算不管性能, 用 Cumulo 开发应用也不见得就开心了, 虽然方案是简单
存在的两个问题是: 1) 动态类型很容易出错, 2) 需要开始设计界面
类型后边说, 单单界面, 单单一组按钮可能就一下午的, 整个应用非常没头绪
我反而没有了从前那种想做东西的冲动, 因为做起来太浪费时间了
ClojureScript
服务端热替换之后, 我投入时间在 ClojureScript 的 figwheel 环境配置上
前面说了, 这东西几乎就实现了 Webpack 很牛逼的编译和热替换功能
我顺带开始看了 ClojureScript 当中最简单的 React 封装: Reagent
我还把文档翻译了一遍, 绝对敢说这封装得比 React 漂亮太多
http://react-china.github.io/reagent
语言本身就是 Persistent Data Structure, 几乎是梦寐以求的实现
然后我也用试着写了个简单的单页面, 非常纯正的 React 的气味
http://reader.react-china.org/
但出于我个人水平的原因, 我用 ClojureScript 写的东西非常局限
仅仅是一些文本处理还有简单页面, 这些而已, 实际上没有用到什么复杂的功能
中间尝试了下 core.async , 似乎是我没有场景来练手探索它的能力
我甚至有些怀疑, 不是不我写 JavaScript 太久了, 思维方式固化了
其实编程不是这样的, 算法, 数据结构, 硬件, 那样才对, 不是写写网页
然而我实在是想不出自己在此之外学了什么可以称得上计算机科学的东西
另一方面, 用 Clojure 写东西, 整个数据不可变, 是有一些陌生
还有一个缩进括号的问题, 我的 Clojure 都是用 Sepal.clj 项目生成的
https://github.com/Cirru/sepal.clj/
Sepal.clj 不能生成 Macro 和 Reader 之类特殊语法, 但常用的函数没问题
没吸引的什么关注量, 不过至少 Twitter 上有人注意到了, 只能尽量安慰
不管怎么说, 总算开了头, 开始用另一门语言作为主要语言, 必须坚持下去
Ubuntu
因为上周冒险失败, Macbook 无法开机, 花了两天心思才把环境恢复好
中间我刻过 Ubuntu LiveUSB 尝试找回数据, 然而 Ubuntu 并不能直接识别 Mac 硬盘格式
但是装 Ubuntu 把, 我到现在两年多没有用 Ubuntu 了, 之前用了不到三年
VPS 上的命令还在跑, 我说的是桌面, GNOME3 和 Unity 看上去一点没变
我还能回想起来一些 GNOME Shell 刚发布时的激动劲, JavaScript 配置桌面啊
然而最终我只是用 CSS 改过桌面样式, 写脚本几乎就没成功过, gtk 门槛不低
我用 GNOME3 结果还遇到一些 Bug, 这感觉多少有点不开心
我手头现在有 2013 年的 Macbook, 有 Surface 3, 桌面环境都挺不错
虽然在学校那三年 Linux 社区变化天翻地覆, 觉得 Windows 死气沉沉
然而 Windows 说实在我觉得才是冲锋在前的, 当然, 某些地方迟钝得无语
仅仅从扁平化的桌面设计来说, 2006 年开始布局, 影响到了 Google 和苹果的改变
反观 Linux 社区, 从设计能力, 到图形界面可靠性, 始终没有走在前沿
还有当年强大的 Wayland, 两年过去除了几个牛逼的视频, 并没有怎么样
头两年自己定制独一无二的桌面的热情, 几年来消磨已经不剩, Macbook 算了吧
倒是刻录 LiveUSB, 这些步骤还是挺顺手的, 成功率也依然低
我多准备了几个 U 盘, 然而初次之外真觉得是和当年一样毫无长进
遇到问题至今 Google 报错, 然后编译可能性不明就里, 这种菜鸟作风
编译器
要说收获, 这些年最重要的大概是对编译器的理解上边, 或者说代码抽象上边
从汇编, 到 C, 到 Go, 到 Python, 到 Clojure, 各种层级的抽象
我最初对于编程语言的理解就是 CSS, 需要什么特性, 声明一下就好了
更复杂一些就用 JavaScript 生成一下 CSS, 总之就是像捏橡皮泥一样
然而接触越多我发现其中细节越复杂, 而且我很难现在就绕过去
就好比你去爬山, 发现山上没路, 你还得跟人一起先把路踩出来, 然后才能继续爬
编译完成的程序包似乎是一串的二进制指令, 直接能转义到 CPU 指令去
C 是重要的一个环节, 因为 C 实际上是看似高级语言, 却做了近似汇编的编译
就是说 C 并没有什么抽象. 后面是比如 JavaScript 这样的动态类型语言
动态类型真的是头脑发热搞出来的惊喜, 超出常理却比较实用
动态类型也导致各种分析工具失效, 衍生出大量难以控制质量的代码
上边还有一些抽象, 比如 Lisp 当中早就有的高阶函数抽象
以及更加学术化的代数类型系统的抽象, 把类型系统给理论化了
要是看过别人用汇编怎么一层层实现上边的语言, 就会有一些感触
https://speakerdeck.com/nineties/creating-a-language-using-only-assembly-language
从机器思维到人类思维, 中间存在很复杂的抽象, 学起来估计非常难
当你看到最上层的代码想要去理解, 很可能就会发现底下的实现如何如何
这对于单单写 JavaScript 的人来说很难注意到, 究竟发生了什么
我也弄不清楚细节, 但受到这影响, 我对程序的看法大有改观
以及对于图形界面的理解也有着类似的过程, 一层层的抽象
也许一般人理解图形界面是 HTML 加上 CSS, 以为这样就能描述界面的样子了
然而当我写单页面应用, 我需要思考 MVC 整套的方案, 远远超出了 CSS
甚至顶尖的单页面开发者从前端到服务器到分布式整体进行思考, 更加复杂
Quamolit 前端框架
说到图形界面, 还有个事, 因为公司提到年会, 我想起去年年会我就在想这个东西
当时觉得 React 处理动画有问题, 能不能用 Canvas 自己山寨一套
被实际问题卡住了, 到现在发现快一年了, 还是一筹莫展
其实也类似自己写一套简单的 React 的样子吧, 只是我没写出来
但这一年当中, 即便社区对这个问题也没有给出好的方案, 声明式动画
似乎最棒的是 react-animation 这个类库, 复杂度有些高
顺着这些界面的思考, 我用来对比 React 设计上存在的一些问题
说实在的, 从简聊的时间当中看, React 当中问题多了去了
这样大的应用, 数据结构怎样设计, 如何最大程度实现抽象, React 都没说清楚
甚至连 ClojureScript 社区搞出一些想法, 都能把 React 的发展方向改变掉
即便我会说 React 取得了辉煌的成绩, 但还是会有巨大的改变将来会发生
一想到这个事情远远还没有结束, 我觉累, 我都学了那么多了, 还是没完没了的感觉
类型系统
关于类型多扯几句, 为什么类型系统对于编程语言来说越来越重要?
按网上的说法, 就是类型能提示分析工具做类型检查, 提前发现错误
如果用真实的数据, 就是测试了, 而且测试的数量永远无法覆盖可能性的数量
而类型作为抽象的概念, 使得程序在某种程度上在类型检查时就类似在做运算
这样, 分析工具只要检查一次, 就能判断实际上大量的情况是成立的
实际上类型是约束, 这些约束相互作用, 最终约束了运算的正确性
然而对于实际开发来说, 类型未免太过抽象, 特别是在 Haskell 中是多么复杂
LightTable 提供的 instarepl 给出 inline result 更加有用
而且从程序的可靠性, 还是存在类型系统无法验证的逻辑, 比如说数据内容的问题
我一方面对类型感兴趣但却更向往 live coding 方向上带来的方便
类型是对数据的抽象, 很直观体现在语法中, 然而有更具体的值岂不是更有意思
想想这世界上还是发生着很多我看了很难领会的事情, 将来再看消息吧
其他感想
少年时候吧, 或者是被学校误导, 或者是自己的无知, 对世界抱很多的幻想
那时觉得写软件如何如何, 觉得物理学如何如何, 开始为之着迷
等到一年年追踪和熟悉下来, 才能认识到整个的格局和自己想的多么不一样
在软件方面, 就是大大低估了开发的成本的复杂度, 盲目的激情
实际的情况可能反而是操心的日子久了, 不再能带着热情去推动了, 渐渐冷却
不过, 对于后辈来说, 他们的路会短很多, 也许不必等到热却的那一天
反面的一个例子吧也有, 我小时候很少接触经济学, 对新闻当中经济数据很不敏感
然而今年被一些自媒体反复引导, 比如鸿观, 对一些数字变得敏感起来
周末看了吴晓波那本薄薄的"历代经济变革得失", 更是加深了认识
就属于学校大学前几乎碰不到, 然而在最近几个世纪至关重要的一门学问
等到别人把事情解释得很明白, 自己才能发现自身的无知, 很不轻松