林修远站在写字楼十七层的落地窗前,望着窗外灰蒙蒙的天空。他手里攥着刚打印出来的辞职信,指节因用力而发白。三年了,从当初那个只会写"Hello World"的培训班学员,到现在能够独立负责整个后端架构的高级开发,他从未想过自己会面临这样的抉择。
手机震动起来,是猎头王莉发来的消息:“林先生,那家C#独角兽企业又提高了薪资待遇,年薪比您现在高出40%,您真的不再考虑一下吗?”
林修远没有立即回复。他转身望向办公桌上那本翻旧的《Java编程思想》,书脊已经开裂,书页边缘泛黄卷曲。三年前,正是这本书陪伴他度过了无数个不眠之夜。
第一章:意外的转折
三年前的夏天,林修远从一家不知名的IT培训班结业,简历上唯一的亮点是"C#开发"四个字。培训班为期六个月,从基础语法讲到ASP.NET MVC,最后两周草草介绍了Entity Framework。结业那天,班主任拍着他的肩膀说:“修远啊,你学得不错,C#现在市场需求挺大的,好好找,肯定能有公司要你。”
然而现实给了他一记响亮的耳光。投出去的三十多份简历,只有五家给了面试机会,其中三家在技术面就把他刷了下来。另外两家,一家给的薪资低得可怜,另一家则要求他立刻上手一个正在开发中的WPF项目。
"我…我只在培训时做过控制台程序和简单的MVC网站,"林修远在面试时结结巴巴地说,“WPF我没怎么接触过…”
面试官失望的眼神像刀子一样剜在他心上。走出那栋写字楼时,七月的烈日烤得他头晕目眩。他在路边长椅上坐下,打开手机银行查看余额——3216.47元,这是他全部的家当。如果下个月再找不到工作,他就得灰溜溜地回老家了。
就在他几乎绝望的时候,一个意外的电话打了进来。
“是林修远先生吗?我是云创科技的HR李婷,看到您的简历,我们对您很感兴趣,方便明天来公司面谈吗?”
林修远几乎不敢相信自己的耳朵。云创科技是本地小有名气的互联网公司,主要做企业级SaaS服务,他根本没敢往这种公司投简历。
"您…您确定没打错电话吗?"他小心翼翼地问。
电话那头传来轻笑声:“没错啊,您是上个月从新起点IT培训结业的吧?C#方向?”
“是的,但是…”
“明天上午十点,带着您的身份证和学历证明来面试吧,地址我短信发您。”
挂断电话,林修远既兴奋又困惑。直到第二天踏入云创科技的会议室,他才明白是怎么回事。
"我们看了您的培训项目代码,结构很清晰,注释也很规范,"技术总监赵志强翻着他的简历,“虽然经验不足,但基础不错。我们最近接了个政府项目,急需人手,愿意从零开始培养新人。”
林修远紧张地搓着手:“谢谢赵总给我这个机会,我一定努力…”
"不过有个问题,"赵志强推了推眼镜,“这个项目用的是Java技术栈,Spring Boot+MyBatis,您能接受转语言吗?”
林修远愣住了。Java?他只在培训班的第一周学过一点基础语法,之后就一直专注于C#。两个语言虽然相似,但生态圈、框架和开发理念完全不同。
见他犹豫,赵志强补充道:“公司会安排资深工程师带你,前三个月工资打八折,转正后视表现调薪。如果实在适应不了,也可以协商离职。”
会议室里的空调呼呼地吹着,林修远的后背却渗出了汗水。他想起出租屋里那台二手电脑,想起银行卡里仅剩的三千多块钱,想起父母每次打电话时小心翼翼的询问。
"我接受,"他听见自己说,“我会尽快掌握Java的。”
第二章:痛苦的转型
入职第一天,林修远就领教了现实的残酷。公司分配给他的导师张明是个三十出头的资深Java工程师,说话直来直去,毫不留情。
"培训班出来的?C#转Java?"张明上下打量着他,像在看一个不合格的产品,“行吧,先把环境搭起来。JDK1.8,IntelliJ IDEA,Maven,Git,今天下班前我要看到你的第一个demo跑起来。”
林修远手忙脚乱地开始安装软件。JDK配置环境变量就花了他一个小时,Maven仓库总是下载失败,Git提交时又遇到各种冲突。办公室里键盘敲击声此起彼伏,同事们都在专注工作,没人注意到角落里那个额头冒汗的新人。
下午四点,张明走过来检查进度。林修远的IDE里只有一个孤零零的"Hello World",而且还没有成功运行。
"就这?"张明的眉头皱成了"川"字,“你知道我们项目组其他人一天能写多少代码吗?”
林修远的耳朵烧了起来:“对不起,Maven依赖一直下载失败,我…”
"别找借口,"张明打断他,“公司网络没问题,是你没配置镜像仓库。看好了,我只演示一遍。”
接下来的半小时里,张明的手指在键盘上飞舞,命令行里不断跳出令人眼花缭乱的指令。林修远努力记住每一个步骤,但信息量太大,他的大脑已经超负荷运转。
"今天先这样,"张明最后说,“回去把《Java核心技术卷一》看完前六章,明天我要考你。”
那晚,林修远在出租屋熬到凌晨两点。他一边啃着冷掉的盒饭,一边对着电脑屏幕上的Java文档苦思冥想。C#里的属性在Java里要用getter和setter方法实现;C#的LINQ在Java里变成了Stream API;连最简单的字符串比较,两种语言都有不同的方式。
"为什么Java什么都这么麻烦?"他烦躁地抓乱了自己的头发。在C#里,一个简单的数据绑定几行代码就能搞定,而Java却要写一大堆样板代码。微软的Visual Studio把所有工具都集成好了,而Java世界却要自己拼凑各种框架和库。
第二天早晨,林修远顶着一对黑眼圈来到公司。张明果然没有放过他,一连串技术问题问得他支支吾吾。
"看来你还没入门,"张明摇摇头,“这样吧,先不让你碰项目代码,跟着我做几个练习。”
接下来的两周是林修远职业生涯中最痛苦的时期。每天他都要面对张明布置的大量练习,从基础的集合操作到Spring的依赖注入,从MyBatis的XML映射到JUnit单元测试。稍有错误,就会迎来毫不留情的批评。
“这个循环为什么用for而不用forEach?”
“Service层为什么要加接口?直接写实现类不行吗?”
“你知道为什么Java要把Checked Exception和Unchecked Exception分开吗?”
每个问题都像一记闷棍,敲得林修远头晕目眩。他开始怀疑自己的选择,甚至萌生了辞职的念头。直到第三周的一个深夜,办公室里只剩下他和张明两人。
"修远,过来看看,"张明罕见地叫了他的名字,“这是你上周写的用户模块代码,我重构了一下。”
林修远忐忑地走过去。屏幕上是他熟悉的代码,但结构完全变了——冗长的业务逻辑被拆分成多个小方法,重复代码被提取成公共工具类,杂乱的if-else变成了清晰的状态模式。
"Java不是C#,"张明指着屏幕说,“微软喜欢把一切都封装好,让你按他们的方式写代码。但Java世界讲究的是选择和组合,你需要理解每个设计背后的哲学。”
那一刻,林修远仿佛看到了一束光。他忽然明白为什么自己一直觉得Java别扭——因为他试图用C#的思维方式写Java代码。
"再给你一次机会,"张明说,“忘掉C#那套,从零开始学Java思想。”
第三章:渐入佳境
接下来的三个月,林修远像海绵一样吸收着Java世界的知识。他不再抱怨Java的繁琐,而是开始欣赏它的严谨和灵活。Spring的IoC容器让他理解了松耦合的魅力,Hibernate的ORM让他看到了对象关系映射的另一种可能,而Java社区丰富的开源项目则为他打开了一扇新的大门。
项目组每周五下午的技术分享会上,林修远从不敢发言到主动提问,再到后来能够分享自己学到的新知识。有一次,他介绍了一个基于Java Stream API的数据处理技巧,连一向严肃的张明都点头表示认可。
"不错,"分享会结束后,张明罕见地表扬了他,“你现在有点Java程序员的样子了。”
林修远心里涌起一阵暖流。他开始明白,张明之前的严厉不是针对他个人,而是对技术的敬畏。在Java世界里,没有捷径可走,每一个优秀的程序员都必须经历这种痛苦的磨砺。
半年后,林修远已经能够独立负责项目中的一个重要模块。政府项目的deadline临近,整个团队都在加班加点。某个深夜,当其他同事都去休息时,林修远还在调试一个复杂的权限控制逻辑。
"还没走?"张明端着咖啡走过来。
"这个RBAC模型有点问题,"林修远指着屏幕,“当用户同时属于多个角色时,权限判断会出现冲突。”
张明拉过椅子坐下:“在C#里你会怎么处理?”
林修远愣了一下,随即反应过来:"用ASP.NET的AuthorizeAttribute可以很方便地…等等,"他突然意识到了什么,“你是想让我从Java的角度思考?”
张明露出难得的笑容:“你开始懂了。Java没有微软那样的’一家之言’,但正因如此,我们有更多选择。试试Shiro或者Spring Security,看它们的实现方式。”
那晚的讨论持续到凌晨三点。林修远第一次感受到技术讨论的乐趣——不是简单地使用工具,而是理解设计背后的思想。当他最终采用责任链模式解决了权限问题时,一种前所未有的成就感油然而生。
"恭喜,"张明拍拍他的肩膀,“你现在是个真正的Java程序员了。”
第四章:理念的冲突
项目成功上线后,公司给林修远转了正,薪资比入职时提高了50%。他开始在GitHub上贡献开源项目,在技术论坛回答问题,甚至参加了本地Java用户组的线下活动。曾经那个畏手畏脚的培训班学员,如今已经能够自信地讨论技术选型和架构设计。
然而,命运的转折总是来得突然。一个周末,林修远接到了培训班同学陈浩的电话。
"修远!听说你现在Java玩得很溜啊,"陈浩的声音透着兴奋,“不过有个更好的机会你要不要考虑?远景科技在招C#高级开发,年薪比你现在的多十万!我跟技术总监熟,可以内推。”
林修远的手指无意识地敲打着桌面。十万的差距不是小数目,以他现在的Java水平,至少要再熬两年才能达到这个薪资。
“我…我考虑一下。”
挂断电话,林修远打开远景科技的招聘页面。职位要求清一色的C#技术栈——.NET Core、Entity Framework、Azure…这些都是他培训班学过的内容。如果当初第一份工作是C#方向,现在他应该已经是个熟练工了。
他试着在IDE里新建了一个C#项目,手指自动敲出了熟悉的语法。但写着写着,他发现自己不自觉地开始思考:“这个功能在Java里会怎么实现?”、“为什么C#要把这个封装成黑箱?”、“如果需求变更,这种写法会不会难以扩展?”
一行行代码在屏幕上延伸,但林修远的思绪却越来越乱。他停下来,盯着屏幕发呆。一年前,他能够毫不犹豫地选择C#,因为那是他唯一熟悉的工具。但现在,他已经习惯了Java世界的思维方式——更开放,更灵活,也更需要程序员自己的判断。
第二天,林修远约张明吃了顿饭。当他说出远景科技的offer时,张明的筷子停在了半空。
"薪资确实不错,"张明放下筷子,“但你想清楚了吗?回去用C#意味着放弃这一年来积累的Java经验。”
"我知道,"林修远搅动着碗里的汤,“但C#现在的发展也不错,.NET Core跨平台了,性能也提升很多…”
"技术不是只看性能和功能,"张明打断他,“关键是理念。你喜欢被微软牵着鼻子走,还是愿意自己掌控方向?”
这句话像一把钥匙,打开了林修远心中的锁。一年来,他痛苦地转型,刻苦地学习,不就是为了摆脱那种"被封装好的思维"吗?C#或许更"方便",但Java给了他更多选择和思考的空间。
"我想我明白了,"林修远抬起头,“谢谢师父。”
张明笑了:“别叫我师父,太老气。不过你确实成长了,现在能自己做决定了。”
第五章:优雅的选择
回到现在,林修远将辞职信放回抽屉,拿起手机回复王莉:“感谢您的推荐,但我决定继续走Java技术路线。薪资不是唯一考量,我更看重技术理念的契合。”
发完消息,他长舒一口气,仿佛卸下了重担。窗外,乌云散去,阳光透过玻璃洒在他的键盘上。那本《Java编程思想》在阳光下显得格外醒目,书页间夹满了便签和笔记,记录着他这三年的成长轨迹。
林修远翻开书的扉页,那里有张明一年前写给他的一句话:“代码不仅是工具,更是思想的表达。选择一种语言,就是选择一种思考方式。”
他微笑着打开IDE,开始编写新的功能模块。手指在键盘上跳跃,代码如行云流水般倾泻而出——清晰的结构,恰当的抽象,严谨的边界检查。这不是培训班时期那种机械的编码,而是一个真正理解面向对象思想的程序员的创作。
下午的部门会议上,技术总监宣布由林修远负责公司新产品的架构设计。会后,几个新人围着他请教经验。
"林哥,你是怎么成长这么快的?"一个刚毕业的大学生崇拜地问。
林修远想了想:“找到适合你的技术理念,然后坚持下去。不是哪个语言好哪个不好,而是哪种思维方式让你感到舒适和优雅。”
"优雅?"新人困惑地眨着眼。
"对,优雅。"林修远望向窗外,“当你不再纠结于语法和工具,而是专注于解决问题本身时,代码自然就优雅了。”
那一刻,他忽然明白,自己爱的不是Java这门语言,而是它所代表的那种开放、灵活和严谨的工程思想。从C#到Java,不仅是技术栈的转换,更是一次思维方式的蜕变。
下班路上,林修远收到了张明的消息:“听说你拒绝了高薪offer?不愧是我的徒弟。”
他笑着回复:“不是我爱上了Java,而是自从使用Java后,人变得更优雅了。”
手机很快又亮起来:“臭小子,明天请我吃饭!”
夕阳将林修远的影子拉得很长,但步伐却比任何时候都轻快。前方的路还很长,但方向已经清晰——他不是任何语言的奴隶,而是一个掌握了编程思想的自由创作者。