Run fast,Run first

最近两个月经过高强度的使用 Python 、Node 后,我发现自己好像爱上了用动态语言,不管是 Python 还是 Node,总感觉它比 Java 的构建速度更快。

尤其是在使用过 FastAPI + Pydantic,Node + Fastify 之后。只要让 Agent 在编码时保持类型约束,然后搭配好 Linter、Formatter、Tester,最终出来的结果基本都可以直接使用。做 Code Review 时,静态代码走读也很流畅(因为带了类型描述)

难道 Java 不能做到流畅吗?

每次写完代码我都需要重启进程。然后,代码为了保持严格的逻辑分层(DDD或MVC)不得不写很多没什么用的"贫血"模型。

这种抱怨从我入行开始起,就一直有人提这事儿。

除此之外,在从零搭建时,本身的业务代码尚不多时,仍然需要依赖一大堆的Spring全家桶包。真正的业务代码可能1M都没有,Spring相关的代码都有好几十甚至上百M。

除了占硬盘之外,在内存上的消耗也不少。启动时的元空间,以及大量Spring自身的Bean,这些至少占到上百M内存。

我曾经做过一个项目,里面就登陆、查询用户信息这两个API。启动时把Xmx和Xms设置为128M,半分钟内勉强能启动,运行起来也正常。可是再小,我就发现,启动得花1分钟往上走了。

由此可见,Spring启动过程中初始化的类太多了。但这根本不是现阶段我所需要的。

可是,转念一想。这些并不是真正慢的原因。

**128M或者更小的内存环境下,启动速度慢这个问题,或者说根本不是问题。**因为,现在电脑内存哪还有这么小,服务器不说是 4c8g,即使是2c4g,那也足够启动了。

在这种硬件环境下,启动速度基本上就是10s左右,不是什么问题。

同样,Spring在加载时对内存的消耗,在这个级别的硬件环境下,也几乎可以忽略。

那严格遵守所谓的开发约束(DDD、MVC等)这个问题呢?

在大型软件系统中,Domain、Infra、Core、Facade 或者 Model、View、Controller,这些强制的逻辑分层确实是很好的。因为,这种系统中重要的不止是业务功能的实现,代码的可读性、扩展性、可维护性也同等重要。

人可以流通,可是软件是资产,它始终是要迭代。

(在 SaaS 的商业逻辑里,软件即资产。)

换句话说,在这种系统中,代码不止是写给自己看的。更多的是写给同事、老板以及未来接你班的人来看的。

那如果不遵守呢?

如果,直接在 API 入口处编写业务逻辑代码,然后按需进行适当的分层。那似乎这样子的Java和现有的动态语言也没有区别。

只是我会讨厌这样的代码,会触发我的强迫症。写到这里我发现,其实是内心的执念,让我觉得 Java 慢。

长期以来 Java 代码里面好的代码都是有适当的抽象层级,大家都以此为荣。甚至有时候会适当的为未来做一些扩展性设置。

而现在,这些优点值得大家重新审视。

这些观点为什么在 Python 或 Node 中,没有呢?

提到 python,我第一反应是那句"人生苦短,我用 python"。官方的态度也很明显,Keep It Simple,强调的是极简的设计。

Node 这门语言和 python 有异曲同工之妙,强调的都是数据处理优先,而不是强调绝对的结构、安全、性能。

在编写JS前端或者Node后端时,我更希望快速完成数据转换然后快速渲染。我不会愿意为它们做额外的抽象,保持绝对的逻辑层级。

Agent 发展初期大家喊的最凶的口号------"软件已死",现在冷静下来看,似乎是在讲,在Agent生成速度远高于人类的情况下,提前抽象、扩展的设计,这些之前的资产,已经不再稀缺。

当你的软件被更多的人使用,需要更高的性能时。完全可以让 Agent 用更安全、性能更高、更适合软件特征的编程语言来重写。

这似乎回到了那个本质问题。用户不会为软件设计而买单,与其面向未来三年设计一个复杂的系统。不如,先专注于找到用户愿意为之买单的方向。