# 软件开发中类型的边界
> 本文章带有强烈的个人主观意识, 借机聊聊自己的编程观
## 动态语言与静态语言之争
一直就流传着一个说法:*动态语言一时爽,代码重构火葬场*,一句话概括了两种语言的特点。入行的时候前后端分享还刚刚开头,所以也写过一段时间的 `JS`,总体感觉就是比较自由,限制很少。倒是基本没写过 `PHP` 也是算一个遗憾?后来接手了 `PHP` 的项目,总算感受到了前面那句话的后半句。
我差不多算是有6年的编程经验了,一直看着 `Java` 被各种花式喷但是就是一直不淘汰,反而见证了 `php` 的“没落”。当时对 `Java` 倒是很有信心,但是也做过一次误判,就是我预判安卓开发会没落,会被 `HTML5` 这种更灵活的方案代替, N年过去了,显然没说中,至少那个时候没说中。
转回来继续讲讲 `web` 这块领域,当年 `php` 能够红遍大江南北,显然是有两把刷子的,基础全开源,`LAMP`/`LNMP` 架构没有一个是收费的;开发工具也简单,破电脑也能开发,资源占用小很多,对 `IDE` 的要求也低很多,甚至没有 `IDE` 是不是? `sublime text` 、`vim` 都可以开发;再就是非常简洁高效,很少代码就能实现从数据库查询数据到组装出页面展示给用户。在对开发速度要求很高的地方都是无人能挡的局面,比如博客、网站,就差企业开发这块了(曾经 `ROR` 也火爆过一段时间)。
和博客、网站甚至互联网网应用不一样的地方是,企业应用最重要的是“逻辑”,功能与功能之间有很大的关联关系,耦合性很高,而且,这逻辑也经常随需求变化,所以也就对编程语言提出了要求:需要能够清晰得描述出里面的关联关系还要能根据需求进行调整;前半句 `php` 也能做到,后半句 `php` 就很难了,因为 `php` 这种弱类型的很难重构。
先说观点: **导致 `php` 没落的是 `前后端分离` 概念的实施以及静态语言的发展这两个组合拳**。
### 前后端分离
如果拿网站开发比作跳远我觉得很恰当,原来的规则就是跳三下(查询、处理、展示)比谁最远。对于 `php` 来说,一个连贯的“三级跳”就甩开其它对手很远,在很长一段时间内都是独孤求败的存在。其它语言想要达到这种“三级跳”很难,尤其是像 `Java` 里面的`类型`反而是一种束缚,新加一个类或改方法就得重启或 `hot reload`。直到后面 `前后端分离` 概念出现,`php` 不能三级跳了,只能跳两级,第三级交给前端。同样的情况,对于 `Java` 这种语言来说反而是一种解脱,再也不用关注页面怎么写了,只需要提供数据就可以了,接口内部就可以借自己的强大的类型去进行描述。真是有人欢喜有人忧啊。
### 静态语言的发展
不同于 `php` 的代码和 `HTML` 可以混写,`Java` 刚开始的时候不是这样的,`JSP` 那是后来的事,是先出现 `servlet` 再出现 `JSP`, `JSP`出现之前要写页面,你得在 `servlet` 里面自己拼字符串,那画面……不敢多想,假如 `前后端分离` 概念早点提出,可能就直接没有 `JSP`, `FreeMarker` 了吧?
时代在发展,技术一直在变革,编译器领域的这块能力一直在加强,能够更快速的处理一些更风骚的语法,这直接就导致了静态语言的快速发展,语法可以写得像脚本语言一样,我们就统称为“静态语言脚本化”,在我看来这算是一种降维打击,本来自己就有强大的类型,现在语法也越来越先进,比如 `C#`,`Java` 都加入了 `lambda` 等,在没影响自己之前长处的前提下又提高了自己的生产力(`PHP`: 为什么你们都这么熟练?)。
当然,`php` 并不是坐等超越,它自己也在进化,进化出了“类型” `class`。。emmm,怎么说,就是,“老师,这不合适,你怎么堕落了呢”。
> 语法这一块,想起鲁迅之前的一篇文章,讲人们干什么事都喜欢折衷:“中国人的性情总是喜欢调和、折中的,譬如你说,这屋子太暗,说在这里开一个天窗,大家一定是不允许的。但如果你主张拆掉屋顶,他们就会来调和,愿意开天窗了”。在编程领域这块,C# 就是那个掀房顶的人,人们直呼学不动了,还是 Java 好。你看,全靠同行衬托。
## 动态与静态的分界
上面也说到了,`Java` 这块在前后端一块写的时候是很痛苦的,因为UI嘛,状态很多,功能非常灵活,导致写这块功能很痛苦。直接到后来,前后端分离了,“写痛苦的UI竟然抽出来成了一个职位”, 哈哈哈哈,我们只需要提供数据就可以了?可是我们提供的数据是什么格式的?emmm...`JSON`。
`JSON` 本身也是一个弱类型的数据,对大整数的支持不好,会有溢出导致的精度问题。在表达能力方面,`JSON`能够表达 `数组`,`对象`,`基本类型`这三个,从 `Java` 序列化成 `JSON` 是一个很简单的操作就是往回整就比较麻烦了,前者是从有类型到无类型(熵增),后者是从无类型到有类型(熵减)。关注过IT新闻相关的话你就知道 `fastjson` 的 `BUG` 可是一堆一堆的出,从事安全的相关人员总结光一个 `fastjson` 就养活了很多的搞安全的人(PHP也没好到哪里去)。
从我个人的感受来看,越是能够确定下来的,越是能够进行自动化。比如说,数据库标准和 SQL 标准导致了 `SQL` 语言的出现,表达能力也不差,所以就能够写一个引擎来将数据操作自动化,也就出现了 `SQL`语言。反观这 `JSON` 接口,是不是也需要这么一个“确定”呢?当前的 `RESTFul` 甚至 `GraphicQL` 都属于半残的能力。
## 所谓天下之事,分久必合,合久必分
前后端分离到极致,是不是会再重新统一呢?
我们想一想其中的可能:
之前说到了 `MVVM` 理念, 一头是灵活,另一头是数据……
现在的浏览器里面正在支持 `assembly`,到底是 `JS` 借 `assembly` 继续扩大它的版图还是其它语言借机跑到 `JS` 的地盘 “浏览器” 里面呢?
假如 `Java` 借 `assebmly` 到了浏览器那边,那 `HTTP` 协议两头都是确定的类型的 `Java` 了,那 `JSON` 是不是就可以被其它东西替换掉了?比如纯字节码的 `kyro`。(开发调试有点麻烦哈,可能得在浏览器里面调试了)
当然,我们也需要考虑另一面,比如现在流程的 `MongoDB` 应该是代表了另一类 “弱类型” 在统治上的又一次尝试?
到底谁会赢?
欢迎讨论