写这篇文章之前,同桌(嗯,看到这个词说明我还在蹭人办公室用)问我你真的打算写出来?我说是,反正我已经转行多年了,早已不在这个江湖。他说,这种看似有用的人生经验,怎么也应该只发到收费微信群里边啊。我说,我还没有收费群呢,等我出名了,也去弄一个。等等,看似有用是几个意思?
大概是十年前的事了。那时我刚大学毕业,头发还很茂密、体重才九十多斤,脸也还没现在这么大:joy: 。有一天老大把我们几个程序员叫到办公室,告诉我们有一个挺大的项目要交给我们,然后把桌子上5CM厚的需求书递给我。我正准备分给大家,他说你留着就好,那是一份。然后又从桌子下拿出另外几叠。我说,光看这需求都得一周吧。老大说一个月。我说太好了 。是一个月上线,他补充到。
那是一个和第三方合作的网站,有非常大量的表单,以及各种繁杂的流程。于是我们就开始了漫长的加班。周末连轴转,经常写代码写到晚上三四点,出去买瓶咖啡,接着写到五点多,回去睡个觉,早上八九点再过来。有一回我买咖啡回来,看到同事妹子一边哭一边嵌表单,我问她怎么了,她说她感觉这项目怎么做都做不完:sob: 。那是我过得最为漫长的时间。就像一个人在海里游泳,不分白天黑夜的挣扎、却连岸的影子都看不到。
当然项目最后还是做完了。开发了一个月,上线了一个月,修改了一个月,再上线又用了一个月。
项目完工以后我休了一个长假,睡了好几天。醒来以后,我开始翻自己写的那几M的代码,发现其实绝大部分代码都是重复的。不是那种完全一样的重复,而是那种一小段一小段的重复。而我们的时间,都全部耗费在这些不全一样的重复上了。
能不能通过工具自动化的来生成代码呢?我开始反复思考这个问题。公司后来购买了一套代码生成工具,按说明书设置好业务逻辑后,可以同时生成ASP、PHP和JSP代码。但很快就被扔到了一边 —— 它无法处理我们特有的逻辑,使用的也不是我们公司的规范和周边库。这一套名不副实的工具后来成了反面例子,只要有人提到自动化代码生成,就会被拿出来当论据。
但是偷懒的念头一直在我心里缠绕,通过不断的偷懒实践,我发现,要做一套给别人用的代码生成器是非常困难的,但做一套给自己用的代码生成器却非常容易,只要你遵守两个原则。
大部分设计代码生成器的人都想要解决太多问题,所以反而做不好,因为一个通用工具无法面面俱到。而只为你自己设计的时候,事情就变得非常简单,生成器最终只需要生成你每天写的代码而已,你非常清楚元数据是哪儿来的,应该怎样被加工,最终要生成怎样的代码才合格。
当然坏处就是,这个只为你设计的工具,只能你自己开发。
设计代码生成器的另一个大坑就是过于完美主义。我见过不少做着重复劳动的程序员,问他为啥不用代码生成器时,他们总是会说,因为不能完全自动化的生成代码,所以干脆就全部手写好了。
其实不能全自动生成的代码,可以通过交互操作来生成,Web界面就是最常见的一种;而命令行询问输入参数是写起来最方便的一种。
完整的代码不能全部自动化生成的时候,可以只生成部分代码,然后粘贴回编辑器,这样也能提升不少效率。
我之前做过的一个小工具,就是把数据表的各个字段都显示出来,你复选上以后,可以生成增删改查的SQL语句。这个工具至少帮我节省了十多个小时的开发时间,因为用到它的那个项目表很多字段更多,最后做下来光SQL都100多K。
再举一个例子。之前我们的一些资料是编辑给的,他们都用word发过来。当时没有特别好的doc格式解析工具,所以好多同学都放弃了解析数据。我给的解决方案是这样的,直接在word里边选中表格,然后粘贴到一个textarea里边。用PHP分析tab和换行就能把数据抓取出来。多动动脑子,解决办法很多。不完美,也可以很精彩。
想明白了这些,我后来就很少大量加班了,准确的说,相当闲。但是我也没有跑去到处宣扬,毕竟这种东西,只能自己写给自己用,所以自己知道就好啦。因为老板知道以后,又要砍排期了;产品经理知道以后,又要改需求了 :joy:
自动化思维不一定只能用到代码生成上,我之前还写了一个Todo工具来采集团队进度,以便每周五自动生成日报,其实就是TeamToy的前身。
拖了两年(真的,发布它的第一期原型是2014年5月)的 LazyRest4 发布了。它只是一个LazyPHP4 的代码生成器而已。之所以写这篇文章,并不是想推广LR4,而是希望大家能透过表象,看到它背后的思路,从而做出能提升自己开发效率的工具。

LR4做了挺多有意思的探索:
由于采用了Twig引擎来生成代码,你只需要改改模板就可以用来为自己的项目生成代码,定制起来也挺方便。
LR4还提供了颜值颇高的界面。经常有同学看完我的工具后感叹:你自己用的工具做这么好看干什么?我总是回答:就是自己用的工具才必须做的好看和好用啊。程序员就应该对自己好一点。
今夏流行T恤推荐。买买买
懒人和代码生成器