数字一是一个不一般的数,它首先是自然数序列的开始,它是道家『道生一,一生二,二生三,三生万物』中『道』,它是『一心一意』的专注,也是很多人『一生一世』的追求。
在技术控严重,很多情况下,数字一的印象最为深刻:如果能把事情一次性做好,那就是非常高效愉悦的事情。
有一个『美女下属要求加薪,老板竟然这样让他哑口无言』故事。“一家客户准备到公司来考察产品状况,你联系一下他们,问问何时过来。”老板对要求加薪的美女下属说。一刻钟后,她回到老板办公室。“联系到了吗?”老板问。“联系到了,他们说可能下周过来。” “具体是下周几?”老板问。“这个我没细问。”“他们一行多少人。”“啊!您没问我这个啊!”“那他们是坐火车还是飞机?”“这个您也没叫我问呀!”。
而另一个秘书的回答是:“他们是乘下周五下午3点的飞机,大约晚上6点钟到,他们一行5人,由采购部王经理带队,我跟他们说了,我公司会派人到机场迎接。另外,他们计划考察两天时间,具体行程到了以后双方再商榷。为了方便工作,我建议把他们安置在附近的国际酒店,如果您同意,房间明天我就提前预订。还有,下周天气预报有雨,我会随时和他们保持联系,一旦情况有变,我将随时向您汇报。”
这个故事我们不从别的角度去诠释,单从『一次性把事情做好』的角度上来看,***位要求加薪的秘书的没有一次性把事情做好,所以效率低下,所以老板不满意,所以加薪难。
对于IT技术而言,能不能只需要一次请求就能完成业务呢?能不能只需要一次数据库操作就能完成业务数据更新呢?能不能只需要一次API调用就能拿到所需全部数据呢?能不能只要一次就把代码写对呢?
下面,我们就从几个案例来看看『1』是多么的高效率。
一、高效的页面显示顺序调整过程
这个页面的业务要求是,可以用鼠标拖动来调整显示页的顺序。我们的小伙伴又是怎么实现的呢?大概瞅了一眼代码,每一页都有一个顺序号,拖动后,后台将所有的相关记录全部更新一次调整后的显示顺序号。这个实现方案初看能搞定,但是要从前端传输所有页的调整后新顺序号,要更新数据库里面多条记录。
能不能简单点呢,只调整被拖动页的顺序号,只更新被拖动页的一条数据库记录呢?开动脑筋很容易就想到,我们只要不拘泥于自然数字的编号就行了。比如原始顺序是1 2 3 4 5 6,我们拖动第5页到1与2之间,只要把第5页的顺序号调整为1.5即可,也就是调整后的顺序是1 1.5 2 3 4 6。
一下子,我们从页面传递数据简单了,只需要传递一条数据即可。数据库操作也简单了,只需要更新一条记录即可。
二、高效的充值卡销售过程
这个充值卡销售的业务大概实现流程是,从数据库充值卡表中,查询出100元面值的可用状态的记录,尝试锁定,然后在付款完成后,修改其状态为已销售。问题在哪里呢?从业务上来说,月初月末,会有大量并发购买充值卡的业务;从技术上来说,从充值卡表中进行查询的检索条件是面值100元和状态可用,这两个检索条件对于上万条记录的充值卡表数据来说没有很好的分散性,又不容易走主键或者索引,因此查询效率非常地下。即使在查询效率还能忍受的情况下,大量并发又容易导致选卡冲突,需要重新随机查询选卡,所以处理逻辑就在『随机查询可用状态的充值卡记录』(一条好复杂的SQL一般人还真看不懂)->『尝试锁定』->『修改状态为已销售』的流程中耗费大量的时间和精力,数据库也经常在并发量大的时候被折腾的『够呛』。
如果换一种思路,能不能一次搞定这种充值卡销售呢,不需要查询,不需要尝试锁定,直接挑出一张可售状态的充值卡,直接一步到位『修改其状态为已销售』呢?(注意,前方高能)。其实,细细想来,还是有办法的,我们为充值卡表建一个自然顺序的唯一索引,然后销售的时候,直接取下一个增1的索引号,然后直接去用这个索引号取拿卡,搞定。销售流程实现简单了,SQL也好写了(唯一索引更新),数据库也嗨皮了。更多关于取了卡最终未付款等的细节问题,留待读者自己思索,或者来与我交流。
三、HTTP优化的未来:一个文件
前端性能黄金法则中的第1条就是『减少HTTP请求』,就是说尽量把外链脚本和样式表进行合并会减少HTTP请求,以节省客户端和服务器之间的通讯次数来加快页面打开速度。对于这种减少HTTP请求数量的***追求,就是一个全量的HTML文件,就真的只要一次请求就搞定,所有的CSS/JS/IMAGE全部放在一个文件中来。
四、干净代码中的『只做一件事』
我们在『代码整洁之道』中,反复强调『只做一件事情』,函数只做一件事情,类也只做一件事情。做的事越多,代码就会越冗长,越难以理解,越被人被将来的自己骂X。整洁的代码只做好一件事,不要重复代码。
这个『一件事』在SOLID设计原则中,又称为『单一职责原则』。但是何为『一件事』呢,简单说来,就是你能不能一句话说清楚,这个函数/类是干什么的,没有『并且』,没有『或者』。如果还是觉得抽象的话,建议去看看『代码整洁之道』这本书。
上面的几个例子,都充分体现了,一次性把事情做好,是多么高效多么愉快。日常生活中,希望跑一次医院就把病看好,只要在一个柜台就能把事情办完,只要一张卡就可以刷遍公交地铁出租等。在我们技术控眼里,追求***追求高效的时候,也是需要经常想想,是不是可以一次性把事情做好。或许这也是牛B与专业的区别,牛B能把事情做出来,虽然要多弄几次,但是专业却是可以把事情一次性就做好。
作者简介:
黄进兵,亚信科技架构师,从事10余年移动通讯计费软件和电信运营商电子商务系统架构。擅长互联网业务和技术架构,云端架构等相关技术架构方案。