代码人生:从外包Java狗到甲方Python初体验,我用Django搭了第一个网站
去年十月的一个深夜,深圳南山科技园的写字楼还亮着零星几盏灯。我揉了揉酸胀的眼睛,盯着屏幕上那堆永远修不完的Spring Boot接口文档,心里一阵烦躁。窗外是深南大道上川流不息的车灯,而我,一个干了三年外包的Java开发,月薪15k,房租3500,住在白石洲握手楼里,每天加班到十点,却连个正式工牌都没有。
“兄弟,你这项目做完就撤了吧,甲方那边又要砍预算。”项目经理老张拍了拍我的肩膀,语气里带着点无奈。那一刻,我真的有点想放弃——不是放弃coding,而是放弃这种看不到尽头的外包生涯。
但转机来得比想象中快。就在上个月,我终于拿到了一家本地电商公司的offer,正式岗,月薪22k,五险一金齐全,最关键的是——不用再穿外包马甲进园区了。入职那天,我站在公司楼下仰头看了好久那栋玻璃幕墙大楼,心里默念:“老子终于上岸了。”
甲方的日子没那么轻松,但有了“学习”的奢侈
进了甲方才发现,日子也没那么好过。虽然不用再被客户当孙子使唤,但内部系统多如牛毛,技术栈也五花八门。上周五晚上,产品经理小林突然在钉钉群里@我:“老李,咱们后台有个简单的数据展示页面,下周上线,你能不能搞一下?”
我点开需求文档一看,心里咯噔一下:要展示用户行为日志、支持按时间筛选、还要导出Excel……典型的CRUD操作。如果是以前在外包,我肯定直接上Spring Boot + MyBatis + Thymeleaf一套组合拳。但这次,同事阿哲轻描淡写地说了一句:“这个用Django做最快,半小时搞定。”
Django?我愣住了。作为正统Java出身,我连Python都没怎么碰过。大学时学过一点,后来全扔给JVM了。但看着其他同事熟练地敲着python manage.py runserver,我心里有点发虚——难道在甲方,我还得从零开始?
那天晚上回到家,老婆看我愁眉苦脸,问我怎么了。我说:“可能要学Python了。”她笑着把一盘西瓜推过来:“怕啥,你当年不是说‘代码人生,就是不断打怪升级’吗?”
对啊,代码人生,不就是一次次从舒适区跳出来,再重新站稳脚跟吗?
从“Hello World”到Django,我踩过的坑
周六一早,我就窝在出租屋里,打开了VS Code(是的,甲方居然允许用VS Code,而不是强制IDEA!)。先装Python 3.10,再pip install django==4.2,一切看起来都很顺利。
但问题很快来了。
第一个坑:虚拟环境不会建
我直接全局装了Django,结果第二天跑项目的时候各种依赖冲突。阿哲看到后笑着说:“兄弟,Python讲究‘隔离’,就像我们程序员也要学会和外包心态隔离一样。”他教我用python -m venv myenv创建虚拟环境,那一刻我恍然大悟——原来不只是代码需要干净的环境,人也需要。
第二个坑:MVC?不,是MTV!
习惯了Spring的Controller-Service-DAO三层架构,看到Django的Model-Template-View结构时我一度混乱。“Template不是前端模板吗?怎么和View混在一起?”我嘀咕着。后来才明白,Django的View其实是逻辑层,Template才是纯HTML。这种设计反而更贴近Web本质——毕竟,我们做的是网站,不是微服务。
第三个坑:ORM的魔法让我又爱又恨
写Model时,我习惯性地想手写SQL。但Django的ORM太香了:
# models.py
class UserLog(models.Model):
user_id = models.IntegerField()
action = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
然后一行UserLog.objects.filter(created_at__gte=last_week)就搞定查询。不用写DAO,不用配MyBatis映射,甚至迁移数据库只要两行命令:
python manage.py makemigrations
python manage.py migrate
那一刻我差点哭出来——原来Python真的能“少写代码,多睡觉”。
搭建第一个网站:从焦虑到成就感爆棚
周日晚上,我终于把那个数据展示页面跑起来了。
过程其实很简单:
- 创建项目:
django-admin startproject logsite - 创建App:
python manage.py startapp logs - 定义Model(如上)
- 写View:
# views.py
from django.shortcuts import render
from .models import UserLog
from datetime import datetime, timedelta
def log_list(request):
last_week = datetime.now() - timedelta(days=7)
logs = UserLog.objects.filter(created_at__gte=last_week).order_by('-created_at')
return render(request, 'logs/list.html', {'logs': logs})
- 配置URL路由
- 写个简单的HTML模板(用Bootstrap快速搭了个表格)
当我点击“运行”,浏览器弹出那个整洁的表格页面时,心跳都快了一拍。没有复杂的Maven依赖,没有冗长的XML配置,没有Tomcat启动慢如蜗牛……只用了不到200行代码,一个带数据库、带前后端、带时间筛选的网站就跑起来了。
我截图发到家庭群,老婆回了个“👍”,老丈人居然问:“这是你做的?比淘宝后台还清爽!”——虽然我知道他在吹牛,但那一刻,所有的焦虑都值了。
为什么一个Java程序员要学Django?
很多人问我:“你不是Java干得好好的,为啥折腾Python?”
我的回答是:在代码人生里,语言只是工具,解决问题的能力才是核心。
在外包那三年,我只会死磕Java生态,觉得“非Spring不嫁”。但进了甲方才发现,真实世界的需求千奇百怪——有时候你需要高并发微服务(Java强项),有时候你只需要一个快速原型(Python更合适)。
Django最打动我的,不是它多强大,而是它的开发哲学:Don’t Repeat Yourself(DRY),Convention over Configuration(约定优于配置)。它逼你写出干净、可维护的代码,而不是堆砌样板。
更重要的是,它让我重新找回了写代码的乐趣。
还记得大学时第一次用PHP做出一个留言本的兴奋吗?工作后,这种感觉越来越少了。但用Django搭第一个网站时,那种“我创造了点什么”的喜悦,又回来了。
给同行的一点真心话
如果你和我一样,是个困在某种技术栈里的程序员,不妨试试“跨界”。
- 别怕新语言:Python语法简单到像写英语,三天就能上手基础。
- 从小项目开始:别一上来就想做抖音,先做个TODO List,再做个博客。
- 接受“不完美”:我的第一个Django网站没有单元测试、没有权限控制,但它解决了实际问题,这就够了。
- 记住:工具为人服务:Java也好,Python也罢,都是为了更快更好地交付价值。
我现在还是主力写Java,但团队里有脚本任务、有数据分析需求时,我会主动说:“让我用Python试试。”老板居然很支持,说“技术多元化的团队才有活力”。
结语:代码人生,不止一种活法
从白石洲的握手楼到南山的写字楼,从外包工牌到甲方邮箱,这一路走得不容易。但最大的收获不是工资涨了多少,而是心态变了——我不再把自己定义为“Java程序员”,而是一个“能用合适工具解决问题的工程师”。
上周团建,我和阿哲喝啤酒聊天。他说:“你知道吗?我最早也是做.NET的,后来转Python,现在连Rust都在学。”我笑着举杯:“所以啊,代码人生,从来不是单行道,而是一片旷野。”
如果你也在焦虑、迷茫,觉得技术更新太快跟不上——别慌。今晚就打开终端,输入:
pip install django
django-admin startproject myfirstsite
然后,runserver。
你会发现,世界比你想象的温柔。而你的代码人生,才刚刚开始。
(完)
后记:这篇文章写于2024年5月一个周日晚上,窗外下着深圳的暴雨。我刚提交完本周最后一个PR,泡了杯枸杞茶,突然想把这段经历记下来。希望某个深夜刷到这里的你,也能从中找到一点勇气。共勉。

评论 0