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

仔细观察每架停泊着的飞机,会发现机身很多地方都挂着细长的红布条,上面写着“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. 织梦搜索页使用arclist标签

    织梦默认不能在搜索页使用arclist标签,我们对代码做一些小改动即可 打开include/arc.searchview.class.php 一.查找代码: require_once(DEDEINC. ...

  2. 微信小程序AES加密解密

    微信小程序  其实在调用一些第三方 js的时候 其实没有大家想的那么复杂,无非就是把原生js调用方式   改为微信小程序 js调用方式 废话不多说直接贴代码 其实就是将原生function 或者 对象 ...

  3. eslint规则

    碰到eslint报错, 把错误的提示拷贝在这里Ctrl + F找到复制到eslint.js里面就行了. "off"或者0,不启用这个规则 "warn"或者1,出 ...

  4. ASP.NET Core的身份认证框架IdentityServer4--(2)API跟WEB端配置

    API配置 可以使用ASP.NET Core Web API模板.同样,我们建议您控制端口并使用与之前一样的方法来配置Kestrel和启动配置文件.端口配置为http://localhost:5001 ...

  5. Nginx拦截算法

    Nginx流量拦截算法 nginx 夏日小草 2015年10月22日发布 |   1 收藏  |  40 4.2k 次浏览 0x00.About 电商平台营销时候,经常会碰到的大流量问题,除了做流量分 ...

  6. Mysql的sql_mode

    (一) 基本介绍 set sql_mode="",即强制不设定MySql模式(如不作输入检测.错误提示.语法模式检查等)应该能提高性能,但有如下问题: 如果插入了不合适数据(错误类 ...

  7. LeetCode第七天

    ==数组 Medium== 40.(162)Find Peak Element JAVA //斜率思想,二分法 class Solution { public int findPeakElement( ...

  8. python中__name__=='__main__'的作用

      学习python语法的过程中碰到了__name__=='__main__',这里做个笔记. 作用   这段代码的作用就是让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. 测试 先 ...

  9. java网络编程(1)

    太久没有用java做一些东西了,搞太多的协议框架,基本的东西好像快忘记了~每天抽出一点时间出来,来好好温习下基础,顺便记录下来,以后还忘记可以回来看看==.首先从网络编程开始吧==.这玩意太久没有用了 ...

  10. HDP2.0测试

    1.测试Hbase (1)hive导入hbase