这是一个关于 2000 年 Java 程序员“阿强”的故事
那时候,Java 刚刚 5 岁,还没有 Spring,没有 MyBatis,更没有现在的微波炉式开发。
下面,是阿强为一个名为“时空贸易”的公司开发“订单查询系统”的一周。
周一:在 XML 的深渊里挣扎
清晨,阿强打开了那台大脑袋的 CRT 显示器,屏幕闪烁着微弱的绿光。他接到的任务很简单:在网页上增加一个“订单详情”查询功能。
第一步,不是写代码,而是配置。
阿强打开了噩梦般的 web.xml。因为那是 Servlet 2.2 时代,每一个 URL 路径都必须手动映射。
<servlet>
<servlet-name>OrderDetailServlet</servlet-name>
<servlet-class>com.trade.OrderDetailServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OrderDetailServlet</servlet-name>
<url-pattern>/orderDetail</url-pattern>
</servlet-mapping>
阿强小心翼翼地敲着字符。因为没有现代 IDE 的自动补全,万一 OrderDetailServlet 拼错了一个字母,待会儿启动服务器就会抛出不知所云的 ClassNotFoundException。
周二:与 JDBC 的“样板代码”肉搏
配置好路由,阿强开始写数据库逻辑。没有 MyBatis,他必须使用最原始的 JDBC。
他在代码里写下了长达 50 行的“仪式感”代码:
加载驱动:Class.forName(“oracle.jdbc.driver.OracleDriver”)。
管理连接:由于没有成熟的数据库连接池插件(或者得自己手写),阿强得祈祷数据库连接不要被耗尽。
手动搬运数据:
ResultSet rs = stmt.executeQuery("SELECT * FROM orders WHERE id = " + orderId);
if(rs.next()){
Order order = new Order();
order.setId(rs.getInt("ID"));
order.setAmount(rs.getDouble("AMOUNT"));
// 如果数据库有50个字段,阿强就要手动写50行 rs.get...
}
最绝望的是 finally 块。为了防止连接泄露导致服务器宕机,阿强必须像套娃一样关闭资源:关闭 ResultSet,再关闭 Statement,最后关闭 Connection。如果漏掉一个,这台内存只有 128MB 的服务器撑不过今晚。
周三:手写线程池的“玄学”时刻
系统上线测试,由于那时候是 BIO(阻塞 IO),每个查询请求都要占死一个线程。如果数据库查询慢了,后续的请求就会排队,直到 Web 服务器卡死。
阿强看着 Tomcat 3.x 频繁假死,决定展示他的绝活:手写线程池。
因为 JDK 1.3 还没有 java.util.concurrent,他定义了一个 Vector 来存放空闲线程,然后自己写逻辑去分发请求。
“这个 synchronized 应该加在方法上,还是代码块上?”
阿强盯着屏幕,额头冒汗。只要一个逻辑闭环没写好,系统就会陷入死锁。这在那时是衡量一个 Java 程序员是否是“大神”的唯一标准。
周四:Applet 的“华丽”幻觉
老板过来看进度,指着网页说:“能不能搞个酷炫的动态效果?比如订单成功时有个跳动的金币?”
阿强叹了口气,打开了 Applet 绘图。他写了一个继承自 java.applet.Applet 的类,利用 Graphics 类画出一个像素级的金币,并让它按照正弦曲线运动。
为了让这个金币动起来,他还要在 HTML 里写下:
<applet code="GoldCoin.class" width="100" height="100"></applet>
老板很满意,但阿强知道,用户打开这个网页时,得先看着浏览器卡住 10 秒钟去加载那个沉重的 JVM 虚拟机。
周五:构建与部署的“体力活”
功能做完了,最后一步是构建项目。
没有 Maven,阿强得手动管理依赖。
他去各种官网下载了 log4j.jar、ojdbc14.jar。
手动创建了一个 lib 文件夹把它们扔进去。
手动编写 Ant 构建脚本(或者更原始地在命令行写 javac -classpath …)。
部署时,阿强必须手动把编译好的 .class 文件打包成 .war,然后用 FTP 工具传到服务器,重启服务器。如果漏传了一个包,整个周末他都得留在办公室排查为什么系统报错。
周周末:反思与期待
周日深夜,阿强揉着酸痛的脖子,看着屏幕上那个简陋的、基于 Servlet 和 JDBC 的查询页面。他在想:
“难道我们这辈子都要在 XML 里写配置、在 JDBC 里写搬运逻辑吗?有没有一种框架,能让我只关注业务,而不是这些该死的线程和连接管理?”
他不知道,在地球的另一端:
Doug Lea 正在琢磨如何把 NIO 引入 Java。
Rod Johnson 正在写那本《J2EE 设计开发指南》,准备砸掉 EJB 的饭碗。
Clinton Begin 正在构思 iBATIS,想让程序员从 JDBC 的泥潭里解脱。
2000 年的痛苦,正是为了孕育 2002 年那个 Java 奇迹之年的到来。 阿强关掉显示器,那是黎明前最后的黑暗。
更多推荐

所有评论(0)