软件开发中类型的边界

软件开发中类型的边界

本文章带有强烈的个人主观意识, 借机聊聊自己的编程观

动态语言与静态语言之争

一直就流传着一个说法:动态语言一时爽,代码重构火葬场,一句话概括了两种语言的特点。入行的时候前后端分享还刚刚开头,所以也写过一段时间的 JS,总体感觉就是比较自由,限制很少。倒是基本没写过 PHP 也是算一个遗憾?后来接手了 PHP 的项目,总算感受到了前面那句话的后半句。
我差不多算是有6年的编程经验了,一直看着 Java 被各种花式喷但是就是一直不淘汰,反而见证了 php 的“没落”。当时对 Java 倒是很有信心,但是也做过一次误判,就是我预判安卓开发会没落,会被 HTML5 这种更灵活的方案代替, N年过去了,显然没说中,至少那个时候没说中。
转回来继续讲讲 web 这块领域,当年 php 能够红遍大江南北,显然是有两把刷子的,基础全开源,LAMP/LNMP 架构没有一个是收费的;开发工具也简单,破电脑也能开发,资源占用小很多,对 IDE 的要求也低很多,甚至没有 IDE 是不是? sublime textvim 都可以开发;再就是非常简洁高效,很少代码就能实现从数据库查询数据到组装出页面展示给用户。在对开发速度要求很高的地方都是无人能挡的局面,比如博客、网站,就差企业开发这块了(曾经 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新闻相关的话你就知道 fastjsonBUG 可是一堆一堆的出,从事安全的相关人员总结光一个 fastjson 就养活了很多的搞安全的人(PHP也没好到哪里去)。
从我个人的感受来看,越是能够确定下来的,越是能够进行自动化。比如说,数据库标准和 SQL 标准导致了 SQL 语言的出现,表达能力也不差,所以就能够写一个引擎来将数据操作自动化,也就出现了 SQL语言。反观这 JSON 接口,是不是也需要这么一个“确定”呢?当前的 RESTFul 甚至 GraphicQL 都属于半残的能力。

所谓天下之事,分久必合,合久必分

前后端分离到极致,是不是会再重新统一呢?
我们想一想其中的可能:
之前说到了 MVVM 理念, 一头是灵活,另一头是数据……
现在的浏览器里面正在支持 assembly,到底是 JSassembly 继续扩大它的版图还是其它语言借机跑到 JS 的地盘 “浏览器” 里面呢?
假如 Javaassebmly 到了浏览器那边,那 HTTP 协议两头都是确定的类型的 Java 了,那 JSON 是不是就可以被其它东西替换掉了?比如纯字节码的 kyro。(开发调试有点麻烦哈,可能得在浏览器里面调试了)
当然,我们也需要考虑另一面,比如现在流程的 MongoDB 应该是代表了另一类 “弱类型” 在统治上的又一次尝试?
到底谁会赢?

欢迎讨论

posted @ 2020-09-01 10:58  之奇一昂  阅读(386)  评论(0编辑  收藏  举报