软件开发中类型的边界
软件开发中类型的边界
本文章带有强烈的个人主观意识, 借机聊聊自己的编程观
动态语言与静态语言之争
一直就流传着一个说法:动态语言一时爽,代码重构火葬场,一句话概括了两种语言的特点。入行的时候前后端分享还刚刚开头,所以也写过一段时间的 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
应该是代表了另一类 “弱类型” 在统治上的又一次尝试?
到底谁会赢?
欢迎讨论