从外包到甲方:一个老广Java仔的开发环境配置血泪史
大家好,我是阿强,一个在广州老城区土生土长的程序员。去年十月,我终于从干了三年外包的“乙方狗”跳进了甲方怀抱——现在在一家本地电商公司做后端开发,月薪从15k涨到了22k(税前哈,别羡慕,广州房租3500,老婆还在看学区房)。今天不聊跳槽技巧,也不吹技术架构,就想和大家唠唠一个看似基础、却让我栽过无数跟头的话题:开发环境配置。
别笑!我知道很多人觉得:“这有啥好写的?装个JDK、配个Maven、IDEA点几下不就完事了?”
但相信我,作为一个从“运营提需求比我妈催婚还急”的外包公司杀出来的Java仔,我太懂环境配置这四个字背后藏着多少血与泪了。
那个被前端同事追着骂的下午
时间回到今年3月的一个周五下午,阳光正好,珠江边的木棉花开得正艳。我刚泡好一壶普洱(老广的倔强),准备优雅地摸鱼到下班。突然,钉钉“叮”一声炸响:
前端小林:阿强!你本地跑起来了吗?我这边接口调不通啊!
我:等下,我刚拉了新分支,正在配环境……
小林(秒回):不是吧?上周五不是说好了今天联调吗?运营那边催得要死,说今晚8点必须上线!
我手一抖,茶差点洒键盘上。
事情是这样的:我们有个促销活动页面,后端是我负责,前端是小林。代码其实早就写完了,但每次联调都出问题——不是我本地数据库连不上,就是Redis版本不对,要么就是Nginx配置漏了跨域。最离谱的一次,我本地跑的是Java 11,测试服是Java 8,结果一个Optional用法直接崩了。
那天下午,我一边手忙脚乱地改application-dev.yml,一边听着小林在工位那头叹气:“又来了……你们后端能不能把环境搞稳一点?”
那一刻,我真的想钻进服务器机柜里躲起来。
外包三年,我配了三年“祖传环境”
其实这种尴尬,在我做外包时更是家常便饭。
还记得2021年夏天,我在天河某写字楼给一家金融客户做外包。项目交接那天,前任开发只留了一句话:“环境配置文档在Confluence,自己看。”
结果点进去一看——最后更新时间:2019年6月。
我照着文档一步步来:
- JDK 8?装了。
- Maven 3.6.3?OK。
- MySQL 5.7?没问题。
- 启动!Boom!报错:
ClassNotFoundException: com.mysql.cj.jdbc.Driver
我懵了。翻遍Stack Overflow,最后发现:人家用的是MySQL 8.0,驱动类名变了!但文档没写。更坑的是,他们的测试库密码是Admin@123!,但生产库密码规则是“大小写+数字+特殊字符+生日”,而前任离职前根本没交接密码……
那周我每天加班到凌晨,不是在配环境,就是在配环境的路上。老婆打电话问我:“今晚回来吃饭吗?”
我说:“不了,还在和MySQL搏斗。”
她叹了口气:“你跟电脑过算了。”
外包的本质是什么?是“人肉运维+临时工编码”。 客户不管你怎么配环境,只要功能能跑就行。久而久之,我也养成了“能跑就行”的坏习惯——本地改个端口、临时加个host、手动建个表……反正下周可能就换项目了,谁管你环境干不干净?
进了甲方,我才明白:环境即契约
跳槽到现在的公司后,第一周我就被震撼了。
入职第一天,导师老陈(一个戴黑框眼镜的潮汕大哥)递给我一个U盘:“这是我们的标准化开发镜像,VirtualBox导入就行。里面有预装好的JDK、Maven、Docker、MySQL、Redis、Nginx,连IDEA主题都配好了。”
我半信半疑地导入,启动虚拟机——docker-compose up 一键拉起所有依赖服务;./start.sh 直接跑起Spring Boot应用;
连前端的Mock Server都集成好了!
我惊呆了:“这……这也太爽了吧?”
老陈笑了笑:“在甲方,开发环境不是你一个人的事,是整个团队的契约。前端要能随时调你的接口,测试要能复现bug,运营要看数据——如果每个人本地环境都不一样,协作效率直接归零。”
那一刻,我突然明白了为什么之前联调总是翻车。不是代码有问题,是“环境”这个看不见的层,早就烂掉了。
我开始认真对待每一行配置
从那以后,我彻底改变了对开发环境的态度。我把自己的MacBook重新格式化,从零开始搭建“洁癖级”环境:
- JDK用SDKMAN!管理,不同项目自动切换版本;
- Maven settings.xml统一托管到GitLab私有仓库,团队共享;
- 数据库用Docker容器化,每次启动都是干净实例;
- Hosts文件用SwitchHosts!管理,不同环境一键切换;
- 前端Mock用YApi + Rap2,接口定义先行,避免“我以为你那里有这个字段”。
最关键是——所有配置都写进README.md,提交到代码库根目录。格式如下:
## 本地开发环境配置
### 前置依赖
- JDK 17 (通过 SDKMAN! 安装)
- Maven 3.8.6
- Docker & Docker Compose
### 启动步骤
1. `git clone xxx`
2. `docker-compose -f docker/dev-services.yml up -d` # 启动MySQL/Redis
3. `mvn clean install -DskipTests`
4. `./scripts/run-local.sh`
### 联调说明
- 前端访问地址:http://localhost:8080/api
- Mock数据开关:application-dev.yml 中 mock.enabled=true
- 运营后台账号:admin / 123456(仅本地有效)
上周五,又是和小林联调。
我发他一个链接:“你直接调这个,我本地已经跑起来了。”
他试了一下,秒回:“通了!牛啊强哥!”
我喝了一口茶,心里美滋滋——原来被前端夸,比被HR涨薪还爽。
技术分享:环境配置不是“脏活”,而是“基建”
现在,我甚至主动在公司内部搞了一场技术分享,主题就叫《让开发环境不再成为协作瓶颈》。PPT第一页我就写了:
“你以为你在配环境,其实你在建立信任。”
我分享了三个核心原则:
1. 可复现性 > 便利性
宁可多花10分钟写脚本,也不要手动点十次鼠标。因为三个月后,你会忘记自己做过什么。
2. 文档即代码
环境配置文档必须和代码一起版本控制。Confluence可以写概述,但具体命令、配置文件必须在Git里。
3. 为前端和运营考虑
前端需要知道接口地址、Mock方式;运营需要知道本地如何查看报表。开发环境不是后端的自留地,而是全链路的起点。
分享结束后,运营小姐姐跑过来问我:“强哥,以后我们提需求,是不是不用再等你们‘先配好环境’了?”
我笑着说:“放心,下次你们的需求评审会,我的环境已经在跑demo了。”
写在最后:环境稳了,心才定
从外包到甲方,我最大的感悟不是技术栈升级,而是思维方式的转变。
以前我觉得:“环境配不好?重启一下,或者换个人配。”
现在我知道:“环境配不好?说明流程有漏洞,协作有断层。”
开发环境配置,表面看是技术活,底层其实是协作哲学。它决定了你是“单打独斗的码农”,还是“可信赖的团队成员”。
如果你也在经历联调地狱、环境玄学、文档失踪……不妨停下来,花一天时间,把自己的开发环境“工业化”一次。你会发现,省下的不仅是时间,更是团队的信任成本。
对了,昨天老婆又问我:“最近加班少了很多?”
我说:“嗯,因为我不用再和环境打架了。”
她点点头:“那周末带我去喝早茶?”
“好啊,”我笑着说,“不过得先配好‘家庭环境’——记得叫妈一起来。”
后记:本文纯文字无图(按要求),但建议大家真的去画一张“本地服务拓扑图”贴在显示器旁边——当你看到MySQL、Redis、Nginx、前端Mock Server整整齐齐连成一片,那种秩序感,比喝十杯冰镇酸梅汤还解暑。
共勉。
—— 一个终于把环境配明白的老广Java仔

评论 0