程序员编码的常规流程是通过大脑把将要实现的功能切分成一个个逻辑单元,使用编程语言将这些逻辑单元实现并组织在一起,积少成多, 形成电脑软件
缺乏经验的程序员可能并不是以这总方式实现功能,对于一个功能,在逻辑实现的逻辑组织上, 他们也许不会提前组织和规划。 想到哪写到哪,想写什么写什么。其实这样做也没什么大问题, 只是效率低了点、代码质量差了点、 BUG多了点、维护难了点,我以前就是这么干的
但是不管用什么方式编码,总会得到正面的反馈,大脑中的想法通过双手敲击键盘编写代码的方式展现了出来,多么了不起的一件事情, 这正是程序员、技术狂们不断在自己的领域学习、耕耘的动力所在。
我也一直如此
但这两天我却以另一种方式编写着代码,一种没有丝毫创造性,犹如走在漆黑悬崖边上,每移动一厘米都需要小心翼翼,而且枯燥乏味到令人崩溃的方式
我发誓, 在我写代码的生涯当中,这绝对是体验最差的一次。中途, 我差点坚持不下去,所幸, 最终我挺了过来。
事情是这样的
我们这边有一个WebService项目, 旧系统应付不了业务的变化,一些重要的功能迁移到了新的架构上。然而, 其中某一个重要的功能却无法迁移,因为这部分代码混乱到没人看的懂。
好吧, 迁不了就在老地方呆着, 别闹事就成了。
还好,这个功能一直以来比较安分, 稳稳当当的运行着, 做自己该做的事情。
可是,不知道是不是因为这几天天气太热的缘故, 这个功能最近老是出现罢工现象, 经常不出数据或吐一些错误的数据。接着就是用户骂娘,老板发火,程序员焦头烂额。
妈蛋, 看来随着数据量的变大、请求数的增多,加上偶尔抽风的网络环境, 这部分功能已经支撑不了现有业务的运行了,一只脚已经踏进棺材了。
于是我决定赋予他新的生命, 把它迁移至新的架构之中。
人啊, 都是被逼出来的,这件事情其实半年前就应该做了,但那时候还没有陷入绝境,所以面对困难的问题,能拖就拖着。 现在老虎追到屁股后面,退无可退了,就只能硬着头皮上了。
然而, 这真他妈不是人干的事。
我要做的事情就是把上千行只知道很重要,不知道干什么的,没有文档,没有可读性, 有几百万人在用的,输出的内容连一个字符都不能有误的php代码改成golang代码
这不仅艰难, 而且乏味
我先要使这些代码在开发环境中运行起来,但这还真不是一件容易的事情。 申请运行代码的服务器的权限、构造程序运行需要的数据、收集调用程序的参数、测试看看程序能不能跑,还没进入正题,光搞这些前戏就花了大半天时间。
接着便是改写代码。既然不知道旧代码干了些什么, 那只能把自己当作人肉编译器了,通过自己对php和golang掌握, 人肉将php代码转换成golang代码,程序的逻辑丝毫不变,变的只是语法元素。 这是一个很痛苦的过程, 期间有一个念头在我的脑海里想起许多次:要是有一个工具能把php代码转换成golang代码, 我一定不惜一切去获得。
php中数组、map是同一个东西,golang中要分别使用slice、map实现
php中string、int、double可以放在同一个变量里, golang不行
php中"1"+"2"可以等于3,golang中只能1+2=3
等等其它各种问题就不一一举例了,反正实现的过程中才深刻的体会到,不同的语言做同一件事情, 做的过程和方法真的差了十万八千里
别以为把这些代码改写完成就万事OK了,这可是有大量用户在使用的线上代码,不可以出丝毫差错的,不然铁定吃不了兜着走。
所以吧, 我哼哧哼哧写完上面这些代码, 还要写测试代码, 对比新旧两个功能返回的数据是否一致,需要精确到连一个字符都不能有差别。
完成测试脚本后踩住马达一运行, 新旧两个实现返回的结果完全不一样, 数据项上的差别起码有上千项。
于是我又是检查测试脚本, 又是琢磨旧代码, 又是修改新代码的, 使不一致的数据项减少到了五百项
还是不行
于是我又是检查测试脚本, 又是琢磨旧代码, 又是修改新代码的, 使不一致的数据项减少到了三百项
还是不行
于是我又是检查测试脚本, 又是琢磨旧代码, 又是修改新代码的, 使不一致的数据项减少到了一百项
还是不行
反正一直不停的循环
最后, 不一致的数据项目终于为零了, 我整个人瘫倒在椅子上面, 连下班的力气都没有了。 我再再再再再…一次体会到,屎一样的代码害死人、猪队友害死人(已离职)
放几张旧代码截图大家感受下
这只是冰山一角