航空业有很多值得我们借鉴和学习的工作方式,将来有时间我会给大家引荐更多实例。

仔细观察每架停泊着的飞机,会发现机身很多地方都挂着细长的红布条,上面写着“REMOVE BEFORE FLIGHT”,中文翻译成“飞行前拆除”。这种布条没什么技术含量,但是非常重要!

比如,为了避免杂物或者昆虫进入皮托管,一般会给皮托管戴上套子,但是起飞前必须取下套子,否则飞行员就无法获得空速数据,从而导致事故。还有起落架安全插销,预防飞机在地面时起落架意外收起,但是忘记拔掉的话,起飞后就会因为无法收起起落架而被迫返航,虽然不至于坠毁,但是燃油损耗(包括可能需要进行空中放油)、折旧(比如轮胎、刹车的磨损)等,成本咂舌。

在这些不起眼但又不能跟随飞机上天的部件上挂一根红布条,便是为了机务人员做航前检查时避免疏漏。

触类旁通,这根小小的布条,对于程序员朋友们也很有实用价值。挂在冲锋衣上?挂在双肩包上?Stop,说正事儿!

我们在调试代码的时候,常常会写死一些变量的值,比如GPS坐标、数据库查询条件、轮询时间间隔、版本号等等,这些定值方便了调试工作,但是就像皮托管套和起落架销子一样,是绝对不能随着软件更新发布出去的——严格地讲,甚至都禁止合并到主干代码。

不幸的是,人是不可靠的。很多时候我们都会因为忘了将这些定值移除结果导致程序无法正常工作。其实都是些低级错误。

分享一下我的做法,没啥技术含量,希望能给你带来些许启发。当然,也欢迎更好的建议!

假设有一个定时刷新数据的功能,实际业务要求每2小时检查一次,时间间隔定义如下:

private static final long INTEVAL_DATA_RELOAD = 2 * 3600 * 1000;

调试的时候,为了缩短等待时间,我们可以设为5秒一次。

private static final long INTEVAL_DATA_RELOAD = 5_000;

于是这里就存在一个隐患,2小时被缩短为5秒钟,代码本身没有问题,所以别人在审核这段代码的时候,除非对业务需求很了解,否则不大可能注意到5秒只是调试代码,不能提交到服务器更不能打包发布。

我的惯用做法就是,同时保留两段代码:

private static final long INTEVAL_DATA_RELOAD = 5_000;	// TODO: Remove before flight!
// private static final long INTEVAL_DATA_RELOAD = 2 * 3600 * 1000;

我会告诉我的同事,code review的时候,任何带有“Remove before flight!”标记的代码,除非是注释掉的,否则都不能提交。并且我也鼓励他们使用同样的标记来标注代码。

上面代码有个好处,使用快捷键,删一行、取消注释一行,两步操作迅速恢复原貌。

所以我在提交代码前,会全文搜索“Remove before flight!”,然后逐一删除或注释掉。当然也可以从TODO框里直接定位,不过如果项目里还有很多其它TODO标记,那还是全文搜索比较保险。

为了方便添加这个标记,我会使用代码模板功能,以Android Studio为例,在Live Templates里添加模板:

这样就只需在要添加这个标记的位置输入“rbf”,然后一Tab就出来了。

还有一种情况也会产生大量冗余代码。当我们在调试一个调用关系很深,尤其是存在大量回调的bug时,常常不得不靠输出很多日志来观察代码的实际运行情况。一方面,这些Log的输出可能是实际开发不需要的;另一方面,因为项目本身也存在很多日志,比较容易混在在一起。如下是我的习惯:

public static final String TAG_BUG_9321 = "BUG9321";   // TODO: Remove before flight!

private void validate(String content) {
Log.d(TAG_BUG_9321, String.format("Validate content: %s", content)); doValidate(content, new ValidateCallback() {
@Override
public void onValidated(String result) {
Log.d(TAG_BUG_9321, String.format("Validated result: %s", result));
}
});
}

因为TAG是公开级别,所以在其它类、包里面,只要是这个bug牵扯到的地方,都可以使用同一个TAG,然后在Logcat里设置filter为“BUG9321”,就可以非常清楚地了解代码的实际执行情况,提高修复问题的效率。搞定了bug之后,删除标有RBF标识的代码,所有临时的日志输出调用立马显形,逐一删除,确保代码能够成功编译,就可以着手提交了。

没什么技术含量的Remove Before Flight的更多相关文章

  1. 谈“技术含量”的问题

    最近又从离职同事那里听到这样的抱怨(原因),说做的事没有技术含量.想一想,从事车载软件开发这个行业快8年了,这个话题似乎从来没有停过.我自己曾经也为自己做的事是否有技术含量而苦恼过,今天就专门花点时间 ...

  2. CURD系统怎么做出技术含量惊艳面试官

    在<CURD系统怎么做出技术含量--怎样引导面试>有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧.这里我解释一下,怕大家对DDD领域驱动设计有什么误解. DDD是为解决软件复杂性 ...

  3. CURD系统怎么做出技术含量--怎样引导面试

    引子 很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信.但是很多公司面试的时候是可以接受面试者之前岗位的并发量.交易量低一些的.比如我们要招聘和我们交易量同等级或者以上的出来 ...

  4. angular.js ng-class-even ng-class-odd ng-cloak(没啥技术含量)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. php 二维数组(没啥技术含量)

    <?php $cars = array( array('benchi',20,18), array('baoma',30,21), array('aodi',23,9) ); echo $car ...

  6. 不要迷恋那些没技术含量的Linux发行版

    昨天悲剧了,重装系统,一个手贱点了替换原系统,分区全给删了,将近三天的工作成果没有了.

  7. Bugku-CTF之网站被黑(这个题没技术含量但是实战中经常遇到)

    Day11   网站被黑   http://123.206.87.240:8002/webshell/    

  8. 如何做好Code Review

    Code Review(代码审查)很多团队都会做,效果如何不好说.如果你能轻易地从一堆出自正经团队之手的代码里找出几个低级错误,往往意味着团队管理者长期忽视了Code Review的重要性. 根据经验 ...

  9. 基于ajax与msmq技术的消息推送功能实现

    周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...

随机推荐

  1. CSS学习(一)---使用CSS的四种方式

      1. 行内样式 例: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. Redis进阶实践之十一 Redis的Cluster集群搭建

    一.引言      本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的详细概念做深入的探讨.本文只是提供了有关如何设置集群.测试和操作集群的说明,而不涉及Redis集群规范中涵 ...

  3. typedef介绍

    1.typedef是什么? typedef是C中的类似于extern/static的一个关键字,用于为一种类型引入一个新的名字.并不会分配内存. 2.typedef常见用法? 1) typedef i ...

  4. uboot之ldr指令

    刚开始接触uboot的时候,就一直对ldr指令很迷惑,因为这个指令有两层用法,一个是加载,一个是伪指令.今天闲着没事就来说一下这两个之间的区别. LDR伪指令的形式是"LDR Rn,=exp ...

  5. Jenkins配置备份恢复插件ThinBackup

    一.系统管理-管理插件-找到ThinBackup并安装 二.系统管理-找到ThinBackup-点击Setting进行设置 第一个参数备份目录是必选,其它可选,点保存. 三.保存后返回到ThinBac ...

  6. zabbix-agent 启动不起来

    遇到一个问题  zabbix-agent 一直启动不起来 查看Zabbix Agent日志文件才究其原因. tail /var/log/zabbix/zabbix_agentd.logzabbix_a ...

  7. 【ASP.NET Core】解决“The required antiforgery cookie "xxx" is not present”的错误

    当你在页面上用 form post 内容时,可能会遇到以下异常: The required antiforgery cookie "????????" is not present ...

  8. linux 命令:tr 的简单使用

    工作的需要,用到了tr命令,因为用到的次数不是很多,怕以后忘记了百度,就自己总结下.例子什么的,copy linux shell 脚本攻略这本书. tr:常用选项 -c 用字符串1中字符集的补集替换此 ...

  9. 基于netty框架的Socket传输

    一.Netty框架介绍 什么是netty?先看下百度百科的解释:         Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  10. vim使用教程

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...