最近几个月利用业余时间完成了一个项目。这个项目其实是2008年我在前公司做的一个web项目。后来客户想要对项目做升级,牵扯到一些功能的变动及界面的修改。由于当时整个项目的架构和主要编码都是我做的,所以前公司老总喊我来接这个项目,使用业余时间完成。我考虑了一下答应了。为了挣点钱养家就拼点呗。
几个月前在接这个活前,我曾写过一篇文章 如果让我完善几年前的一个项目,我会做哪些改进? 。主要从工程实践的角度讲述了我将进行那些改进。
经过几个月的辛苦开发,终于完成了这次的功能升级,拿到了报酬。针对这种遗留系统,我来谈谈我具体都进行了那些改动。
不用动的地方尽量不动。由于代码是08年我作为实习生写的,那代码自然惨不忍睹,有些地方写的非常累赘。经过几年打磨的我对代码质量要求已经上升了很多个层次,看到这些烂代码不禁忍不住要重构。但是我忍住了,因为这是个遗留系统,当时就没有写单元测试,所以重构过程肯定风险较大。另外工期只能用业余时间,要以新需求为主,只改开发新需求时需要碰的那些代码。
使用github作为代码托管服务。即使是一个人开发,也需要使用源代码管理工具,这样做起来自己心里才有底。而github自己用了好几年了,非常好用,而且自己买了github的会员。所以这次把代码以私有仓库的方式放在上面。随时写,随时提交,比自己搭建源代码服务器方便的多。
引入bootstrap框架作为前端框架。这次升级一个重要任务是对前端进行优化,使其能兼容多个浏览器。08年的时候大家都在用IE6,IE7,IE8都很少有人用。过了这么多年网站早都不能兼容现代浏览器了,而且屏幕分辨率适配也很差劲。作为一个前端菜鸟,我只花了一点时间学习了bootstrap,就快速把它引入到了我的项目中。我基本上把以前的css、js代码都删除了,使用bootstrap轻轻松松的就把这个老站改成了一个兼容多个浏览器,多种屏幕尺寸的网站。
升级.net中使用的各种组件。这个网站使用的是WebForm框架,版本为2.0。我发现在现代浏览器下WebForm组件生成的前端HTML,CSS及JavaScript存在大量不兼容的问题。网站页面变得很不稳定。当升级到4.0平台后,问题得到大大改善。另外我还使用了AjaxControllToolKit组件,发现在某些浏览器下(比如360浏览器)页面局部刷新不了。所以我也一并升级到了最新的15.3版本。虽然把各种组件都升级了,还存在一些JavaScript问题,比如日历选择框无法正常显示与选择。我采用的方法就是抛弃掉旧的JS代码,寻求成熟的JS框架来替代。比如使用bootstrap-datepicker组件来实现日历框的选取。
采用最新的Visual studio编辑器。微软终于想通了,与其让我们天朝成天用盗版的Visual Studio,不如直接开放一个社区版出来。我下载了Visual Studio 2013社区版,并给其装上了ReSharper组件。由于ReSharper是收费的,但是有差不多1个月的试用期。之前一直使用Intellij开发工具做开发,能在Visual Studio 2013中使用它也是觉得很爽。
引入了package管理工具,使用Nuget来安装、管理各种项目依赖。使用过程中我发现Nuget没有Java平台下的Maven或Gradle强大。很多依赖都不是最新版本,管理理念也不太一样。不过聊胜于无吧。像bootstrap等前端组件以及ajaxcontrolToolkit等后端组件我都是通过Nuget来管理的。
使用事务机制处理系统中的核心逻辑。这个系统是一个编码管理系统,主要处理炸药、雷管编码的整个流通。系统有的时候会出现重复编码的情况,比如一发雷管的编码同时存在于库存中和消耗库中。这是由于雷管从在库状态转换为消耗状态时出了问题,并没有在库存中删除该编码。这次升级我把类似的逻辑都用事务来处理,一旦发生异常就会整体回滚,不会造成脏数据的情况。
其实我还想引入的几个点由于种种原因都没有完成。
没有添加单元测试。本来想给Vistual Studio 2013添加单元测试框架,奈何花了几个小时都没整好。另外工程目录方面也需要进行一定的调整来引入测试项目,整了一次没搞定后也不了了之。由于这次升级80%功能是前端页面的改进,涉及后端代码修改的不多,所以没有单元测试的情况下修改已有代码还是比较有信心的。
没有引入持续集成。还是时间成本的原因。毕竟这个活都是使用业余时间完成的,搭建C#栈的CI估计要花上好几天,所以最后并未实现。
自动化部署。之前对.NET下的网站的部署都是手动的,将编译生成后的文件复制到服务器上,暂停IIS,重载文件,重新启动IIS。其实这些都是可以自动化完成的,自己没花时间研究,所以也未实现。
使用成熟的log框架给系统关键逻辑打上log。这个纯粹是自己懒,不想做。因为加log方便自己以后排查错误,对客户来说没有任何影响,自己就懒得弄了。
没有引入自动化测试。还是时间成本的原因,编写web的自动化测试太花时间了,所以只能舍弃。