2008年最让人肾上腺素飙升的时刻,不是改完一个棘手的bug,也不是发工资,而是代码部署上线。那时候没有CI/CD,没有自动化部署,没有Docker,没有Kubernetes,部署全靠“手动操作”,每一步都像在渡劫,稍有不慎,就会“翻车”。
部署的流程简单又繁琐:1. 把代码在本地编译通过,确保没有报错;2. 把编译好的文件用FTP上传到服务器;3. 在服务器上备份当前版本(复制一份,改名叫“项目名_backup_日期”);4. 把新文件覆盖到服务器上;5. 重启IIS;6. 刷新网页,祈祷不要报错。
如果报错了,就赶紧回滚——把备份的文件夹改回来,重启IIS,然后开始熬夜debug,主打一个“赌徒式部署”。
我第一次负责部署,是一个周五的晚上。项目是一个在线报名系统,客户是某个行业协会,第二天早上八点有一个线下活动,需要在系统里签到,钱总下了死命令:“今天晚上必须上线,明天早上八点之前,必须确保稳定,出了问题,你这个月工资就别要了。”
我吓得连忙点头:“好嘞好嘞,保证完成任务!”
那天晚上,我一个人留在公司。机房的门开着,空调嗡嗡作响,显示器的光把我的影子投在墙上,孤孤单单的,像一个孤独的守塔人。晚上十点,我开始上传文件——FTP的传输速度只有50KB/s,整个项目有30MB,预计上传十分钟,结果实际传了四十分钟,因为中间断了三次,每次断了,我都要重新连接,找到断点续传的位置,继续上传,急得我手心冒汗。
晚上十一点,文件终于全部上传完毕。我开始备份服务器上的旧版本,复制、粘贴、重命名,每一步都小心翼翼,生怕把文件夹名字搞错了,万一回滚不了,我就真的要喝西北风了。
晚上十一点半,我咬了咬牙,把新文件覆盖上去,重启IIS。然后我打开浏览器,输入网址,按下回车——页面加载了五秒钟,然后,一片黄色的背景,黑色的英文错误信息,赫然出现在屏幕上:“Server Error in ‘/’ Application.”
黄页!程序员的噩梦!我的心脏“咚”地跳了一下,像是有人在我胸腔里敲了一面鼓,冷汗瞬间浸湿了后背。
我仔细看错误信息:“Could not load file or assembly ‘System.Web.Extensions’…” 明白了,服务器上没有安装ASP.NET AJAX,我的项目引用了这个组件,但服务器的GAC里没有。
我翻遍了公司的光盘包,没找到ASP.NET AJAX的安装包;我试着从网上下载,但公司的网络在半夜慢得像拨号上网,下载进度条一个小时只走了15%,我急得直跺脚,恨不得把电脑砸了。
凌晨一点,安装包终于下载完成。我赶紧安装,重启IIS,刷新页面——这次没有黄页了,但页面上的样式全没了,文字是黑色的,背景是白色的,所有的按钮都是灰色的方块,丑得不忍直视。
我检查了一下,发现是CSS文件没有上传成功——FTP传输的时候,有几个文件因为文件名包含中文字符,被跳过了。我重新上传CSS文件,刷新页面,样式终于有了,但图片又没了——图片的路径写的是绝对路径,服务器上的文件夹结构和本地不一样。
我改了web.config里的路径配置,重启IIS,结果——又黄了。这次是数据库连接失败,我检查了连接字符串,发现服务器上的数据库实例名和本地不一样,本地是“localhost”,服务器上是“SERVER\SQLEXPRESS”。我改了连接字符串,刷新页面,又出现了新的错误:“Login failed for user ‘sa’。”
密码不对。我试了“admin”“password”“123456”,都不对。我赶紧打电话给钱总,电话响了十几声才被接起,钱总的声音带着浓浓的睡意,不耐烦地说:“什么事?大半夜的,还让不让人睡觉了?”
我小心翼翼地说:“钱总,服务器数据库sa的密码是多少?我部署的时候,登录不上。”
钱总沉默了半天,说:“等一下,我找找,我记在笔记本上了。”
我等了十五分钟,钱总发来一条短信:“密码是123456,别再打电话了。”
我赶紧输入密码,刷新页面——终于进去了!页面上所有功能都正常,报名表单能提交,数据能写入数据库,列表能正常展示,没有报错,没有异常。
我看了看时间,凌晨三点十七分。我靠在椅子上,盯着屏幕,长长地舒了一口气,感觉浑身的力气都被抽干了。这个系统很丑,功能很简单,代码里到处都是hack和workaround,但它是活的,它在服务器上运行着,接收着来自互联网的请求,处理着数据,返回着响应。
它是我用手写的代码,一行一行敲出来的,没有AI帮忙,没有智能提示,全靠自己的脑子和双手,一步一步熬出来的。
我关上机房的灯,走到公司门口。北京的夏夜,天空是深蓝色的,能看到几颗星星,路边的烧烤摊还没收摊,飘过来一股孜然和烤肉的香味,瞬间勾起了我的食欲。
我走到烧烤摊前,跟老板说:“来十个羊肉串,一瓶北冰洋。”然后坐在马路牙子上,慢慢吃了起来。
老板一边烤串,一边跟我聊天:“这么晚才下班?看你样子,是程序员吧?”
我点点头:“嗯,刚上线一个项目。”
老板笑了:“程序员好啊,挣钱多,体面。我儿子也想学编程,你说学哪个好?Java还是Python?”
我喝了一口北冰洋,笑着说:“都行,关键是要手写,要自己去敲,去思考,不能依赖别人。”
老板愣了一下,挠挠头:“手写?不是在电脑上打吗?”
我笑了笑,没解释太多:“在电脑上打,也叫手写。因为没有AI帮你打,只能自己打,每一行都要自己写。”
老板似懂非懂地点点头,递给我一串烤腰子:“来,补补,熬夜伤身体。”