说真的,我没想到自己会在2024年还认真打开Visual Studio 2003,不是截图怀旧,也不是为了写“考古文”,而是帮一个朋友处理他厂里的一套老设备点检系统,系统不大,WinForms界面,SQL Server 2000数据库,客户端跑在Windows XP上,源码一打开,项目文件那股“年代感”扑面而来,那一刻我脑子里只有一句话:行吧,老伙计,又见面了。
先交代一下背景,朋友厂里的这套系统是十几年前外包做的,功能不复杂:录入设备点检结果、查历史记录、导出报表、给主管看异常统计,但问题是,它现在还在稳定干活,车间里几台老电脑每天开机就用,操作员闭着眼睛都能点,朋友说得很实在:“不是不想换,是怕换出问题,停一天线,比软件本身贵多了。”于是我们第一步不是重写,而是先把它跑起来、把一个小bug修掉,源码要求的环境就是Visual Studio 2003和.NET Framework 1.1,听起来像考古,实际是维护现实。
我在VMware里装了个Windows Server 2003虚拟机,翻出老ISO,又找VS2003的安装盘镜像,安装过程很“古典”:下一步、下一步、选择组件、等进度条,装完之后第一次启动,那个灰蓝色界面一出来,我居然有点恍惚,没有现在VS2022那种清爽的深色主题,没有一堆扩展推荐,也没有NuGet,第三方库怎么办?手动把DLL复制到lib文件夹,然后在项目里“添加引用”,路径还得写清楚,少一个依赖,编译就给你脸色看,调试的时候,断点、局部变量、调用堆栈都还在,调试器依然能打,只是智能提示、重构、代码分析这些现代人习以为常的东西,基本别想太多,写代码像回到手动挡时代:离合、换挡、给油,每一步都得自己来。
具体修bug的过程也挺有生活气息,老代码里控件命名非常直白:textBox1、button2、dataGrid1,业务逻辑塞在按钮事件里,数据库连接字符串硬编码在配置文件中,一个“导出Excel”按钮偶尔报错,查到最后是某台机器上没装Office,老代码直接调COM组件,你说这代码放到今天,肯定会被代码评审喷,但当年它就是能跑,而且跑了十几年,最后我没动大结构,只加了异常提示和文件存在性判断,改完编译通过,朋友在虚拟机里点了一遍,说“哎,好了”,就这三个字,比什么架构图都实在。
这件事之后,我对Visual Studio 2003的感觉挺复杂,它不是“神作”,更不值得被浪漫化,它的局限很明显:语言特性老,C#没有LINQ、没有async/await,C++标准也旧;插件生态和现代IDE没法比;在新Windows上安装还可能遇到兼容性问题;团队协作、包管理、自动化构建这些现代工程实践,用起来很费劲,要是今天有新人问我“要不要学VS2003”,我肯定先说:除非你要维护遗产项目,否则没必要专门学,工具是拿来解决问题的,不是拿来供着的。
但我的个人观点也很明确:别因为工具老,就轻视维护老系统的人,很多自媒体喜欢把“老技术”讲成笑话,好像用VS2003的人都不会写代码,可现实工程不是技术选秀,一个系统能稳定运行十几年,背后有业务连续性、有成本、有人员习惯、有迁移风险,维护老系统的人,往往要在资料缺失、环境难搭、依赖混乱的情况下把问题定位出来,这种能力一点都不低级,相反,我见过一些“新工具派”,满口微服务、云原生,真让他把一个老WinForms系统平稳迁移,他连数据库字段含义都搞不清,工具优越感不等于工程能力。
我也不支持“能跑就别动”的无限拖延,我的态度是:老系统可以尊重,但不能放任,像这次的点检系统,我会建议朋友做三件事:第一,把虚拟机、安装镜像、依赖DLL、数据库备份和部署文档整理好,别让环境只存在某台老电脑里;第二,先做小步重构和监控,把高风险模块隔离出来;第三,评估迁移,不一定要一步重写,可以先把报表、查询这些低风险功能搬到新系统,慢慢替换,技术债不可怕,可怕的是没人知道债在哪。
Visual Studio 2003对我来说,更像一个时间胶囊,它让我想起大学机房里的拖控件作业,也让我看到一家工厂里真实运转的软件长什么样,它不现代,不优雅,甚至有点倔,但它在很多角落里还在干活,我们可以用VS2022、VS Code、Rider,也可以用CI/CD和NuGet,但偶尔回头看看这个老IDE,会提醒我一件事:软件的价值不只在它用了多新的技术,还在它有没有把人的问题解决掉,老伙计不酷,但它当年真顶用。
