苍穹外卖:当所有齿轮第一次咬合的那一刻
如果你是一名 Java 开发者,或者正在学 Java 的路上,那么“苍穹外卖”这四个字,大概不会太陌生。
我相信,很多人的第一个 Java 项目,或多或少都和它有点关系。它出自黑马程序员,也许正因为如此,它很早就成了很多 Java 初学者绕不开的一个名字。B 站上那套三十多个小时的课程,播放量已经到了一个相当夸张的数字。有人跟着它第一次认识 Spring Boot,有人第一次接触 MyBatis、Redis,也有人像我一样,第一次真正试着把前端、后端和数据库放进同一个项目里,让它们一起跑起来。
现在回头看,我觉得自己当时真正需要的,其实并不是再多学几个知识点。
而是需要一个东西,让我终于看明白——代码到底是怎么活起来的。
那天晚上,已经过十二点了。我在本地把前台点单、后台处理、商家接单这一整条链路跑通,盯着控制台里那一行没有报错的输出,愣了几秒才反应过来:真的跑通了。
那一刻并没有想象中那么轰轰烈烈。
没有什么“终于成为一个合格程序员”的激动,也没有做完一个大功能后的如释重负,只是突然觉得,之前那些散落在脑子里的东西,好像终于找到了各自的位置。
Java、SQL、Vue、Spring Boot……以前它们更像是摆在不同抽屉里的零件,我知道每一个零件叫什么,也跟着教程用过很多次,却从来没有真正见过它们装进一台机器以后是什么样子。
直到那天晚上,我第一次看着一个请求从用户点下按钮的那一刻出发,穿过前端、Controller、Service、Mapper,一路落进数据库,再带着结果回来。
原来,项目不是一堆代码。
它是真的会跑的。
之前,我其实只是在“临摹”
刚开始做苍穹外卖的时候,我其实对自己的水平还挺有信心。毕竟 Controller 会写,Service 会写,SQL 也能照着写出来,跟着课程往下敲的时候几乎没有什么压力。老师讲到 Controller,我就写 Controller;讲到 Service,我就跟着补 Service;讲到数据库,就把 SQL 敲进去。整个过程顺得不得了,顺到让我一度以为:我应该已经会了吧?
真正让我意识到不是这么回事的,是某一天我把教程关掉,准备自己重新走一遍的时候。
一个最普通的请求,我竟然不知道该从哪里讲起。
请求进来以后先到哪?为什么要经过这一层?前端传过来的参数到底怎么接?处理完以后又是怎么落到数据库里的?
这些问题,如果跟着教程看,答案永远就在下一行代码里,所以当时并没有觉得有什么困难。可当教程突然消失以后,我才发现自己记住的只是“下一行应该写什么”,而不是“为什么下一行要这么写”。
现在想起来,那时候的我其实更像是在临摹。
字写得越来越像,代码也敲得越来越熟,可我还不知道自己写下的每一笔究竟是什么意思。
真正开始自己折腾以后,问题一个接一个冒出来
脱离教程以后,最先让我难受的反而不是那些听起来很高级的技术,而是一堆特别琐碎的问题。
接口就是其中一个。
第一次真正自己调前后端的时候,我经常盯着浏览器里的请求发呆:后端明明写好了,前端也确实发请求了,怎么就是对不上?有时候是字段名字没对应上,有时候是参数传递方式不对,还有的时候后端明明返回了数据,前端拿到以后却不知道应该怎么处理。
以前看课程,一个接口写完,前端马上就能拿到数据,一切顺理成章。轮到自己写的时候,我才发现,中间其实藏着这么多细节。
那段时间没少改接口、看请求、翻代码。有时候折腾半天,最后发现只是一个字段名字写错了。
现在想起来有点好笑,但当时可一点都笑不出来。
订单相关的数据查询也是一样。
订单本身就不是一个简单的数据。订单有自己的信息,订单下面还有订单明细,订单明细又需要对应具体的商品。一个看起来很普通的订单页面,背后已经牵扯到了好几张表。
以前看到多表查询,我更多是在记 SQL 应该怎么写;到了这里,我开始不得不认真想:这些数据为什么要拆开?拆开以后又应该怎么把它们重新找回来?表与表之间到底应该是什么关系?
这一次,代码摆在面前,却没有人告诉我下一行应该写什么。
我只能自己想。
也是从这里开始,我第一次真正感觉到,做项目和跟着教程写代码,是完全不同的两件事情。
有些东西,只有自己撞上去才会懂
现在回头看,接口和多表查询其实都只是表面上的问题。
真正让我卡住的,是我第一次需要自己把一个完整的请求想明白。
以前学习的时候,Controller 是 Controller,Service 是 Service,Mapper 是 Mapper,数据库又是数据库。每一部分单独拿出来看,好像都没什么难的,可真正把它们放到一起以后,我才发现,原来每一层都在等着下一层接住自己。
用户点了一下按钮,事情才刚刚开始。
前端把请求发出去,Controller 接住;Controller 再把事情交给 Service;Service 处理业务;Mapper 去找数据库;数据库把结果交回来,然后再一层一层返回到前端。
以前这些东西是一个个知识点,到了这里,它们第一次变成了一条完整的路。
我也慢慢明白了,为什么项目要分层,为什么接口需要统一,为什么数据库表不能随便设计。
不是因为教程里要求这么写。
而是因为当项目真的开始复杂起来以后,如果什么东西都堆在一起,最先乱掉的可能不是程序,而是写程序的人。
这种理解很奇妙。
它不是“又记住了一个知识点”的感觉,更像是原本一直摸黑走的一条路,突然亮了一盏灯。
路其实一直在那里,只是以前我没有看见。
咬合的那一瞬间
所以后来真正把下单流程完整跑通的时候,我才会记得那么清楚。
一个看似简单的“点击下单”,背后其实已经有一整条链路在运转:
用户点击下单
↓
Vue
↓
Controller
↓
Service
↓
Mapper
↓
MySQL
↓
订单生成
↓
商家端收到订单
前台点下订单,请求发出去,后台开始处理,数据库里的数据发生变化,商家端收到订单。
整个过程自己转了一圈。
我坐在电脑前,看着它一环扣一环地跑完,之前那些让我反复折腾的小问题,好像一下子都有了自己的位置。
接口为什么要约定统一的格式?因为前后端总得有一套彼此都听得懂的话。
为什么要分 Controller、Service、Mapper?因为不同的事情应该交给不同的地方去做,总不能所有逻辑都塞进一个方法里。
为什么订单要拆成多张表?因为真实的业务本来就不是一张表能够装下的。
这些道理,其实以前都听老师讲过。
但那天晚上,它们第一次不再是老师嘴里的概念,而是我亲手跑起来的一套东西。
那种“原来如此”的感觉,比单独学会某一个技术点都要扎实。
不是突然学会了什么特别厉害的东西,只是那些原本散落在脑子里的知识,第一次连了起来。
像一排原本静止的齿轮。
直到那一刻,终于开始转了。
后来留下来的,反而不是代码
苍穹外卖做完以后,我并没有马上觉得自己已经“会做项目”了。
事实上,后面的项目依然会遇到不会的东西,依然会报错,依然会有一些代码盯着看半天也不知道是什么意思。
但有一点确实不一样了。
再遇到一个新的项目,我不会急着一头扎进某个具体功能里,而是会先看看这个项目到底是怎么跑起来的:请求从哪里进来,数据往哪里走,前后端怎么联系,数据库又是怎么把这些东西接住的。
先把这条路找出来,再去看路上的每一块石头。
现在回头看,苍穹外卖真正留给我的,好像不是 Spring Boot、MyBatis、Redis 这些技术点,也不是某一个做完的功能。
它让我第一次知道,一个项目到底是怎么“活”起来的。
以前我是在学一个个零件。
从那以后,我学会了开始慢慢学着去看一台完整的机器......