先不急,听 笔者 娓娓道来嘛!相信这是一个对你coding有启示、提升的小文章;
最近,刚入职了一家 非互联网的公司(是从互联网公司来的,算是大 -> 小),不过这里很nice ,不卷,上下班也不打卡,自由度也比较高(虽然工作量也不小),以完事为主。
但是入职不久,我就发现了一个问题(坑)。一: 就是 代码的读(查询),写(CUD)是2套系统来做的,比较割裂,这个只是其一,不是本文的重点,但是 肯定有这方面的原因在里面;
重点, 第二个坑来了,可能是因为项目时间比较紧,导致 大家都是 以完成功能为主,导致代码写的都是很糙:命名,格式,性能; 害 我就不该提性能的,你听我一 一解释嘛。 格式,命名这2个 怎么说也是一个开发者,基本的职业素养了。
题外话:【 一: 先讲讲我自己 对命名 ,格式 这2点为什么这么敏感, 其一 是命名, 我们都清楚这是一个“道德”约束, 知名见义 的命名就不用说了,堪比 注释 ,甚至比注释还要重要, 因为之前 看过 《阿里巴巴开发规范》 和 《代码整洁之道》 这2本书 ,所以对于命名我还是比较敏感的,对于命名这块,一句话: 好的命名 甚至 可以不用注释 (不代表不注释逻辑哈!);
二: 接下来就是格式了,格式 是什么,可能对于开发者 来说 不就是 编辑器的 一键格式化么 ,其实不然,这个格式 代表着 逻辑, 好比 你的一个方法,里面 执行的步骤有1、2、3, 但是写代码的时候,每个步骤的代码行数并不只一行,所以 对于不同的步骤要 空行 间隔处理,区分逻辑,甚至 不同的步骤 代码行数太多,需要做方法拆分调用,确保 方法体中的 代码量爆炸(保证100行之内),这些 规范我就不用絮叨了(阿里开发规范,一些书里都有讲到);】
前要:继续回到本文:性能! 从我掌握的知识来看,我认为性能就是 时间复杂度,和 对 内存的把控(空间复杂度),这2个概念,我相信 刷过力扣的人都清楚,或者是 我们没刷过算法的程序员 也应该知道。
背景: 从我最近接触的代码来看,我对这个 越来越“敏感”了,不是我过了头,是这代码过了头啊。 先讲下我是怎么发现的,基本我们 熟悉 一个业务,都是先操作别人的功能来了解的,我再熟悉功能的过程中 是在开发、测试环境上操作的,并没有发现什么问题,可是当我本地调试的时候,卧槽, 这接口怎么要10s+(图1),是我电脑太垃圾了么 ,还是服务器上的性能太好了,不! 是这接口 调用的method 写的是什么神奇代码,本来是 一个单表查询,列表 嵌套着 n个表的循环查询(里面又套了一层,你可以理解套娃),最后copy 到 同一个DTO 上,返回到前端,我的个天呐。 最后在我分析业务后,理清楚 要返回那些字段,得从那些表中去获取那些字段后,重写了方法后,只用几百毫秒就返回了(图2);总结 ,对比前后 同一个功能实现的方法, 我就不详细算 这个时间复杂度了,对比 时间查询(10:0.6) 就能一眼看出来; 那么 为什么 线上没人发现呢,因为 线上服务器的cpu 性能肯定比我 本地电脑 要好,且现在没人用。
图1 图二
总结:为什么互联网项目上对方法的性能,要求比较高呢? 一: 则用户比较多,所以对这个方法调用的很频繁,你想一个method 能够提升(10:0.6),我换个说法 本来0.6(复杂度) 能做的事情, 现在需要20才行,那么CPU 得多跑多少轮才行,且中间可能多次交互DB,对数据库的影响也颇大, 加上用户量的叠加(如果是 字节,阿里,腾讯等等大公司,这是什么体量的用户量),这个性能得影响不是简单得乘积堆积得,是指数型的影响。 或许你的一个方法影响着数以万计的人,他们都因为糙代码的糟糕处理方式,而花额外的时间。
我本来想和另外一个同学沟通这个问题,我说这得多费多少电啊,他的回答 很有意思:“ CPU都跑冒烟了,兄弟 ”; 看似 是一个很“小”的事情,其中涉及到的,就不再是简单的方法的优化(时间复杂度)了,更深则是 资源的浪费(电量,时间【用户的等待】,硬件资源(CPU),环保(大部分的电都是火力发电)...)。可能又有人说我卷了,但是 说个实际的情况,您看到这种代码不想吐了么 。。。
当然我写这个不是为了吐槽同事的水平差,毕竟人家title 都比我高,水平可能比我更好(我只是一个小菜鸟),我更加相信的是,给咱们开发同学时间不够,催促着写出这样的“糙”代码。当然 也有可能是很多开发 只是为了 实现功能,其实更深处 压根没有这种意识。。
拓展: 补充一下哈,CSDN 这种有些逻辑放在前端的(客户端电脑)是不是有些也写的很复杂度,我吃饭回来继续编辑的时候,我电脑在这个草稿也蹦了,重启电脑后才好,所以客户端的代码也一样,你想想你写的客户端代码跑在万千电脑上, 费的是用户的CPU,逻辑一样,只是对服务端没造成什么影响!
思考:所以,作为一名程序员,写方法时候,一定要考虑良多才行,可以先让功能实现,最后再做优化,或者一开始coding的时候就要考虑运行的路径。 别看咱们写的小小代码,其实牵动着一切(资源,时间,环保...),我们既是小小的程序员,也是这个世界上很多规则(程序)运行的编写者,很多人会因为我们受影响、受益,慎重对待我们的代码、职业。 更应该利用开发、学到的技能,提升 我们的 method 的执行效率( 用更少的复杂度,内存,可以适当优化 查询逻辑 ,业务处理方式, 亦或是 用更高的手段【如索引, 缓存,多线程,消息队列等等掌握的技能】), 是见证我们coding水平提高的最有效的方式之一。
补充:这里并不是说我搁着装X,我只是一个普通的开发者,刚好我意识到这些,所以记下来,提醒我自己,也顺便能够给其他的人带来一些启示;同时 我用下面 图 去 描述 方法的执行 效率(路径); 我说的上面那种循环遍历的业务处理方式就是L5 的情况,虽然我们很难说标准的做到L1 的执行,但是我们只要保证能够再圈之内给的L1-L3 之内的执行路径,毕竟多绕一道,CPU 就得按照你的指挥 多跑一道,俗话说 条条大路 通罗马,CPU 的运行权可是在我们手里呢!
我之前看到 雷军 的一篇文章,里面有一段我截取下来
(原文 雷军做程序员时写的博客,很强大!):
所以说 :