没什么技术含量的Remove Before Flight
航空业有很多值得我们借鉴和学习的工作方式,将来有时间我会给大家引荐更多实例。

仔细观察每架停泊着的飞机,会发现机身很多地方都挂着细长的红布条,上面写着“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的更多相关文章
- 谈“技术含量”的问题
最近又从离职同事那里听到这样的抱怨(原因),说做的事没有技术含量.想一想,从事车载软件开发这个行业快8年了,这个话题似乎从来没有停过.我自己曾经也为自己做的事是否有技术含量而苦恼过,今天就专门花点时间 ...
- CURD系统怎么做出技术含量惊艳面试官
在<CURD系统怎么做出技术含量--怎样引导面试>有朋友开玩笑说都用上了领域驱动了,就不叫CURD系统了吧.这里我解释一下,怕大家对DDD领域驱动设计有什么误解. DDD是为解决软件复杂性 ...
- CURD系统怎么做出技术含量--怎样引导面试
引子 很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信.但是很多公司面试的时候是可以接受面试者之前岗位的并发量.交易量低一些的.比如我们要招聘和我们交易量同等级或者以上的出来 ...
- angular.js ng-class-even ng-class-odd ng-cloak(没啥技术含量)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- php 二维数组(没啥技术含量)
<?php $cars = array( array('benchi',20,18), array('baoma',30,21), array('aodi',23,9) ); echo $car ...
- 不要迷恋那些没技术含量的Linux发行版
昨天悲剧了,重装系统,一个手贱点了替换原系统,分区全给删了,将近三天的工作成果没有了.
- Bugku-CTF之网站被黑(这个题没技术含量但是实战中经常遇到)
Day11 网站被黑 http://123.206.87.240:8002/webshell/
- 如何做好Code Review
Code Review(代码审查)很多团队都会做,效果如何不好说.如果你能轻易地从一堆出自正经团队之手的代码里找出几个低级错误,往往意味着团队管理者长期忽视了Code Review的重要性. 根据经验 ...
- 基于ajax与msmq技术的消息推送功能实现
周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...
随机推荐
- HashSet和CopyOnWriteArraySet
前言 这篇文章的目的如下: HashSet是如何保证元素的不重复和无序 HashSet的增删(改查?)原理 CopyOnWriteArraySet支持并发的原理 CopyOnWriteArraySet ...
- CentOS7 修改网卡名称为eth0
前言 无论是RHEL 7.还是CentOS 7都使用了NetworkManager.service来进行网络管理,当然network服务还是可以继续使用的,但也将会是过渡期的残留品了. 除此之外7版本 ...
- centos 6.8 下安装redmine(缺陷跟踪系统)
一.实验环境 centos6.8 64位 所需安装包: ruby-2.3.4.tar.gz.rubygems-1.8.25.tgz.redmine-2.3.2.tar.gz 二.安装步骤 1.安装必要 ...
- [POJ 3581]Sequence
[POJ 3581]Sequence 标签: 后缀数组 题目链接 题意 给你一串序列\(A_i\),保证对于$ \forall i \in [2,n],都有A_1 >A_i$. 现在需要把这个序 ...
- DB2物化视图——MQT 物化查询表的正确使用(materialized query tables)
我们今天主要向大家讲述的是DB2物化视图——MQT 物化查询表使用,以下就是对DB2物化视图之MQT物化查询表的正确使用的主要内容的详细描述,望大家在浏览之后会对其有更深的了解. MQT 的定义基于查 ...
- 基于Java SE集合的充值管理系统
1.功能分析 ①管理员管理 注册.登录.退出 ②注册一卡通:记录相应信息. ③充值管理:对一卡通账户进行充值,查询,修改. 2.技术要求 ①Java 基础知识 + 集合类(模拟数据库). ②数据用对象 ...
- asp.net core 使用 swagger 生成接口文档
参考地址:http://www.cnblogs.com/daxnet/p/6181366.html http://www.jianshu.com/p/fa5a9b76f3ed 微软参考文档:https ...
- Sqlserver将数据从一张表插入到另一张表
1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colum ...
- Servlet3.0+springmvc5+log4j2正确的开启姿势(WebLookUp)
前言 java社区占据市场份额比较大的日志组件由log4j 1.×,到logback,再到整合后的升级版 log4j 2.×,有网友测试后据说log4j2的性能最NB.于是开始往自己的springmv ...
- JAVA浮点数计算精度损失底层原理与解决方案
浮点数会有精度损失这个在上大学的时候就已经被告知,但是至今完全没有想明白其中的原由,老师讲的时候也是一笔带过的,自己也没有好好琢磨.终于在工作的时候碰到了,于是google了一番. 问题: 对两个do ...