温哥华的珍宝蟹与芳村客运站的饭盒
2007年夏天,我结束了在加拿大卡尔加里两个月的出差,准备回国。
那次出差的任务,是把一个技术模块从卡尔加里研发中心完整地交接回广州。两个月下来,任务顺利完成。
回程要在温哥华转机,我特意留了一天。一个在当地的同学带我去了 UBC,逛了校园,也去了那里著名的天体沙滩。晚上,我们吃了一顿温哥华的珍宝蟹,算是给这趟北美之行收了个尾。
第二天,我回到了广州。
从白云机场出来,我搭乘空港快线,在芳村客运站下车。刚好是中午,我拖着行李往外走,突然听到有人叫我的名字。回头一看,竟然是几年前实习时的老板和几个老同事。
他们手里拿着饭盒,正准备去饭堂打饭。
而我们的故事,要从2003年的那个暑假说起。
J2EE:2003年的明星技术
时间回到2003年。
那年非典期间,我刚刚在上下九做完人生第一个真正意义上的商业项目。没想到到了暑假,我又在同一片街区找到了一份 Java 开发实习。
招聘信息是在广州视窗 BBS 上看到的:招 Java 实习生。
2003年的 Java,是不折不扣的明星语言。那时候做企业软件,还有一个很流行的词叫 J2EE。大概有点像今天的“大模型”和“AI Agent”:一个学生未必完全知道背后究竟是什么,但大家都知道,这是热门技术,也是高薪的代名词。
对于一个大三学生来说,这种吸引力相当直接。
唯一的问题是,我没学过 Java。
这件事似乎有点熟悉。几个月前接下上下九那个项目时,用到的技术我同样没有接触过。大概二十岁出头的人都有一种莫名其妙的自信:不会没关系,可以学。
于是我又跑去图书馆借了一本 Java 的书,花了一个星期快速学了一遍,然后就去面试了。
500 块的 Java 实习
面试居然通过了。

其实那时候,我已经在网易兼职了一段时间。最开始忙过一阵之后,工作逐渐上了轨道,而且不需要坐班,平时有事情就在网上沟通,需要的时候再去一趟好世界广场。
所以到了大三暑假,我觉得自己还有时间和精力,可以再找一份实习。
这家公司是广药集团孵化的一家科技公司,主要做医药行业的信息化系统。对当时的我来说,这份实习本来就是奔着学企业级开发去的,没想到每个月居然还能拿 500 块钱。
第一次见识企业级开发
那时候我们用 JBuilder 写 Java,Web 框架是 Struts,数据处理里用了 Castor。页面如果我的记忆没有出错,用的应该是 Velocity。
今天再看到 JBuilder、Struts、Castor 这些名字,大概已经像技术博物馆里的展品。但在2003年前后,它们就是 Java 企业开发很典型的一套标准装备。
更让我感兴趣的是,公司并不准备让程序员一个页面、一个表单地从头写起,而是在开发一套自己的开发平台。其中一个重要思路就是 CodeGen,也就是代码生成:先定义好模型和规则,再自动生成大量 CRUD 之类的基础代码,程序员主要处理真正有差异的业务部分。
所以我进去之后,并没有马上跟着项目组做业务系统,而是先参与这套开发平台,负责其中一些小功能。
能接触到这样的平台化思路,对当时的我是个不小的启发。
CRUD 解决不了的事情
CodeGen 可以解决大量重复的 CRUD,但企业软件显然不只有增删改查。一旦业务里出现审批、流转、状态变化这些东西,事情就开始复杂起来了。
于是,我们开始做工作流。
当时带我的是一个叫小孙的同事,算是我在这家公司的导师。他负责整体的框架设计,具体的代码实现则主要交给了我。
我们采用的工作流标准叫 XPDL,还有一个叫 JaWE 的开源工具,可以通过图形界面设计工作流,再把流程保存成标准格式。我要做的,就是让我们的开发平台能够理解这些流程,并按照流程驱动业务运行。
对于今天已经习惯各种工作流和低代码平台的人来说,这件事情可能没什么特别。但对当时一个大三学生来说,要把一套工作流引擎真正写出来,还是有点超出我原本对“实习生”的理解。
我一直有一点这样的心气:没做过的事情,反而更想试试。
工作流引擎后来真的写出来了。我还专门给团队做了一次演示,大家的反馈都不错,多少有些超出了他们对一个实习生的预期。
唯一让他们不太满意的是:我的 Demo 是在命令行里跑的。
他们不知道的是,当时的我虽然已经能写出工作流引擎,却还不太会从零搭一个 Web 环境把它像模像样地展示出来。
黄金围的日与夜
我们开发的那套平台有一个名字,叫 Helix。
Helix 逐渐成形之后,很快就有了真正上场的机会。当时广药在黄金围有一个物流系统项目,公司决定用 Helix 来开发。这个项目其实有三方参与:广药是甲方,还有一家新加坡的咨询公司负责方案,我们公司则是开发方,负责把这些构想做成系统。到这个时候,我的实习工资已经涨到了 2000 块左右。
项目时间很紧,整个项目组搬到了黄金围驻场开发。我们平时就住在项目现场,周末才能回家。每天吃完晚饭,一般还会继续工作到晚上9点左右,偶尔公司也会组织一点活动,比如饭后一起去打保龄球。
黄金围附近当时有不少农贸市场,也有很多今天已经很少见的所谓“野味”。有一次大家出去吃饭,我印象特别深,桌上有鳄鱼肉,还有水蟑螂之类的东西。不过没有果子狸——毕竟那是2003年,非典刚刚过去。
我当时独立负责其中一个叫 MHE 的模块。它是一个桌面软件,主要和仓库里的输送线硬件打交道。在我的印象中,货物经过输送线上的不同节点时,扫码设备会自动读取条形码(Barcode),系统根据这些信息实时跟踪货物在输送线上的流转。
4000 块的 Offer
到了驻场后期,我负责的 MHE 模块也迎来了验收。系统对吞吐量有一些指标要求,实际测试的结果远远超过了要求,验收很顺利。
随着各个模块陆续完成,黄金围的项目也逐渐进入收尾阶段,时间差不多到了年底。我也该回学校了,接下来就是大四的寒假。
老板却希望我干脆留下来,直接正式工作,给我的 Offer 是一个月 4000 块。
4000 块在当时已经是一个毕业生相当不错的起薪水平。几个月前,我还是一个拿着 500 块工资、Java 只突击了一个星期的实习生;现在,公司已经愿意按照正式员工的标准把我留下来。
但我最后还是婉拒了。
那几个月里,我写下了大量代码,第一次让自己写的程序真正跑在实际业务系统里。对我来说,这次实习已经足够圆满,而且我已经拿到了另一个 Offer,前面还有一个更大的挑战在等着我。
我以为,我和这家公司的故事大概也就到这里了。
没想到几年以后,会在芳村客运站再次碰见他们。
四个人的公司
这一碰面,我才知道,离开之后的几年,他们过得并不容易。
他们的公司就在客运站附近,我便跟着过去坐了一会儿。说是公司,其实更像一个工作室,一共只有四个人。
聊起来我才知道,黄金围的项目虽然顺利上线,但原来的公司后来没有继续拿到足够的新业务,基本上也就解散了。当年的几个伙伴自己出来,重新成立了这家公司。
他们还说起年初的一件事:当时公司账上只剩 3000 块,几个人想把钱取出来办个年会。偏偏银行规定每次取现不能超过余额的三分之一,这 3000 块居然还得分好几次才能取完。
我听完以后,心情有些复杂。
那几年,我在北电的职业发展一直比较顺利。至少从当时来看,我知道自己几年前的选择没有错;但看着几个曾经一起做项目的朋友为了自己的公司一路撑到现在,也能深刻感受到他们这几年走得有多不容易。
但他们看起来并不沮丧。聊起接下来要做的事情,依然兴致勃勃,对未来有很多想法。
那大概也是那个年代最动人的一种心气:无论身处怎样的境地,大家心里始终揣着对未来的笃信,处处都看得到希望。
十年之后
2016年,我受邀参加了他们公司的十周年庆典。
当年那个只有四个人的小公司,不但活了下来,团队和业务也逐渐走上了正轨。那天他们还宣布,公司正在筹备挂牌新三板。
庆典上,几个创始人回顾了这十年一路走来的经历,也邀请了一些当年在原公司一起做过项目的老同事。虽然大家后来走上了不同的路,但作为亲历过最早那段历史的人,大家都是这家公司十年历程的见证者。
我也在其中。
介绍到我的时候,朋友用了一个让我有点不好意思的词:
“编程神童”。
这个称号其实是有典故的。
2003年那批项目里,除了我之外还有其他实习生。十年过去,当年大家写下的代码也经历了漫长的生产环境考验。有些代码后来陆续暴露出了不少问题,埋下的坑也被后面的人一个个踩了出来。
相比之下,我当年负责的几个模块却一直稳定运行。按照他们的说法,跑了差不多十年,基本没出过什么 Bug。
“编程神童”当然只是老朋友之间的调侃。但如果真要解释为什么当年那些代码能够稳定运行这么多年,答案并不是我有什么过人的天分,我会想到一本对我影响很大的书:
《敏捷软件开发:原则、模式与实践》。
我当时买的是英文影印版,封面上那个很显眼的 Jolt 大奖标志,直到现在还有深刻的印象。

“编程神童”的修炼手册
如果今天让我列一份自己最推荐的程序员书单,《敏捷软件开发:原则、模式与实践》大概可以排进前三。
世上并没有天生的神童。它之所以成为我的“修炼手册”,是因为它早早就把软件工程最核心的真谛摆在了我的面前:一套从具体的测试实践,到深刻的面向对象哲学的完整内功。
二十多年过去,很多当年红极一时的技术早已退出舞台,但这本书里讲的底层原则与工程思想,我到今天依然认为值得学习。
而且很有意思的是,我对这本书的理解,大概经历了两个不同的阶段。
第一个阶段,是 TDD(测试驱动开发)。
这本书第一部分就专门讲到了测试驱动开发。对当时的我来说,这是一套非常具体、甚至可以马上照着做的方法论:先写测试,再写实现。 用测试去反复验证正常情况、异常情况和各种极端边界条件,而不是程序刚跑起来,觉得“应该没问题”,就算完成。
这个近乎严苛的工程习惯,后来一直保留了下来。
而随着写过的代码越来越多,主导的架构越来越复杂,我才逐渐理解这本书里的另一部分核心:
设计原则(SOLID)。
它第一次把我对程序设计的理解带到了“工程哲学”的高度,也为我后来成长为一名软件架构师打下了最重要的基础。
Java的故事还没结束
十年过去,拥有百年历史的北电已经成为历史,而当年那家只有四个人的小公司,却迎来了自己的十周年。
大公司未必永远强大,小团队也未必注定出局。身处时代洪流之中,我们其实很难提前看清,十年以后谁还会留在牌桌上。
而我和 Java 的故事,也同样没有画上句号。
2003年我第一次接触 Java 时,它还是那个让无数程序员趋之若鹜的“明星语言”。而在此后的十多年里,Java 又一步步成为企业软件、互联网等众多领域最重要的主流语言之一。
后来第二次创业做互联网电商时,我又重新用上了 Java。十几年过去,技术生态早已翻天覆地,它俨然成了我“最熟悉的陌生人”。
不过,那又是另外一个故事了。
