烂代码是怎样炼成的

这两天接手一个离职员工的项目,改bug,个中不爽,难以启齿,有些代码写得实在是让人哭笑不得,不一一列举,摘一段集烂代码之大成的典型案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public int getMaxFreq() {
int totalFreq = getTotalCountFreq();
for (int i = 0; i < ListProvider.getInstance().getG122PlusFreqList().size(); i++) {
int totalFreqs = ListProvider.getInstance().getG122PlusFreqList().get(i) * totalFreq;
boolean beforeCondition;
if (totalFreq == 1) {
beforeCondition = totalFreqs > (commandService.getModel() == StimulatorConst.MODEL_G122 ? 2000 : 10000);
} else {
beforeCondition = totalFreqs > 2000;
}
boolean midCondition;
if (totalFreqs > 2000) {
midCondition = ((1000000.0 / (pwList.get(getMaxProgramPW()) * 2 + 40)) < totalFreqs) || isShell() || (model && getMaxProgramAmp() > 300) || (!model && getMaxProgramAmp() > 150);
} else {
//midCondition = (1000000.0 / (pwList.get(getMaxProgramPW()) * 10)) <= totalFreqs;
midCondition = ((1000000.0 / (pwList.get(getMaxProgramPW()) * 2 + 40)) < totalFreqs);
}
boolean isAccord = !G122ParamParser.isAccord(mAmplitudeAfter, mPulseWidthAfter, totalFreqs, model) || !G122ParamParser.isAccordOtherProgram(mProgramGroupInfo, programId, totalFreqs, model);
if (beforeCondition || midCondition || isAccord) {
if (i - 1 < 0) {
maxFreq = 0;
} else {
maxFreq = i - 1;
}
return freList.get(maxFreq);
}
}
maxFreq = freList.size() - 1;
return freList.get(freList.size() - 1);
}

阅读全文

从老蒋越级指挥说起

蒋介石喜欢越级指挥是出了名的,常常在战斗中绕过各战区司令,直接打电话到前线,给前线的师长、团长下命令,常常搞得前线指挥官一脸蒙蔽,屡战屡败,后来他被赶出了大陆。

有人说蒋介石越级指挥是他玩谋弄权的体现:各个司令都是我老蒋重金养起来的,你要听我的,你手下的兵也都是我的,我让你当司令你才当司令的,你不能拥兵自重。有人说蒋介石越级指挥是因为他过于自负,总认为自己是当世张良,能定胜负于千里之外,他认为前线将领能力太差,于是忍不住上线微操一把,过个当指挥官的瘾。当然要我说嘛,蒋介石也许就是为了防止各个统兵大员尾大不掉,毕竟就算他再怎么瞎指挥、再怎么失败,他至少牢牢把握着党国的中央大权呀,还是有本事的。

不说老蒋了,就说我们自己的事,我们一线程序员,分明就是老蒋手下的兵,那些市场、销售、客服部老蒋们天天把电话往我们前线打,小兵们眼花缭乱,不知所措。如果不做好需求管理,项目能一两个版本保持健康就不错了,往后就直奔着失控去了。

阅读全文

用RxJava优雅的执行并发网络请求

Android或者ios原生开发,并发网络请求是个难排解的痛。现在来看,这个问题已经不是问题了,写个文章记录一下,毕竟当年曾经为了这个问题操碎了心。说这个事首先要明白下面这个问题:

痛在哪?——主线程之殇

Android的消息机制恨死人,众所周知,android UI操作只能在主线程进行,而且主线程里不推荐执行作UI操作以外的一切操作,当年Android早期在主线程里请求网络是不会报错的,顶多把界面卡黑屏。现在这么搞会乍样大家都知道的,编译时会有警告,运行时会crash。如何优雅地请求网络数据,然后切换到主线程去更新UI,无数志士仁人为了解决这个问题操碎了心,早期官方推荐用AsnycTask,后来出现了经典的httpAsync,后来又有volley,现在又有Retrofit。现在的小程序员们不用在乎这些问题,只要拿来用用就行,大公司也都有自己成熟的网络库。而且现在hybird、react native很流行,不会涉及到主线程的问题。但是如果把14年以前的项目源码翻出来,运气好还能看到handler满天飞的情况,真是恶心死人。

阅读全文

好久不写博客了

真的是好久好久不写博客了,主要是懒。。之前一直使用wordpress,可是国内好难找到好用的wordpress空间。之前一度以为daocloud.io是我的福音,我曾好长一段时间把博客放在daocloud上,可好用了,我也是那时候体会到了docker的强大。后来daocloud果然被监管了,我的博客被停了,于是这一年多来我的域名就被打入冷宫了。。当时数据都没来得及备份,真是遗憾。

阅读全文

Java字节序列化框架

工作中需要在Android平台与嵌入式设备通信,互联网环境中数据交互一般采用json格式,解析比较容易。嵌入式设备间通信常常采用字节流传输,通信过程中需要逐个字节、甚至逐个位去读取,非常麻烦。
Java语言与字节编码互相转换的框架实际上是有的,比如说Javolution,可以把C语言的结构体转换为Java类,但是国内用户很少,文档稀少,转换某些结构有bug,难以解决,于是打算自己写一个字节序列化框架。

阅读全文

自掘坟墓的苹果

最近被appstore搞的焦头烂额,虽然早有心里准备,但还是让我捉襟见肘,苦不堪言。

我是最近刚刚接手ios开发的,从实验室小伙伴那儿“过继”过来的项目。这之前一直做android开发,ios接触得少,iphone毕竟还是价格相对高一些嘛,印象很好。可是经过这么几个月的深刻接触,我对苹果产品的好感就荡然无存了。苹果产品也许还能继续保持高价一段时间,但苹果的研发体系实在是混乱。

阅读全文

如何精准沟通

很多程序员不善于沟通,尤其当他全身心投入工作后,这会带来很多问题,因为除了自己给自己做软件,很少有项目是一个人能完成的,软件研发不仅仅是程序员的事,需求、设计、进度、风险,还有用户,各方面都需要沟通。

软件研发过程中的沟通和我们日常的语言交流有所区别,日常交流可以通过表情、手势、动作来辅助沟,传达特殊含义,表达语言所难以描述的信息。软件研发过程中,程序员常常是面对着屏幕,一边看着代码一边与别人沟通,这时候的沟通尤其需要精准,所以很多程序员之间互相沟通时喜欢直接讲代码,否则脱离了代码,就说不清楚他在干嘛,也难听懂别人要他干嘛,行外人觉得这就是程序员的特点,这是个悲剧,程序员不应该这样的。

阅读全文

技术局限性,任重而道远

前两天一个同事悄悄跟我说,他说证券公司的人告诉他,7月份行情会很不错,可以炒一炒,他很疑惑:股票可以预测吗?券商说得这么一本正经,他们凭什么这么说,会不会骗人的?

我一听乐了,这个问题对于常年炒股的人来说其实算不上问题。我没炒股前我也会怀疑,有炒股经历后,我可以很坚定的说,确实能预测,关键是——预测准不准的问题。。。

阅读全文

心怀畏惧

今天头疼,请假在家休息。额,是身体上的头疼,不是精神上的头疼。。可能是因为前段时间加班多了点吧

印象中以前也有一次像这样,特别头疼的,那是很久很久以前,long long ago,2012年,那时候似乎是年底,项目工期紧张,连续加班两个月。我记得那时候有个新闻,说搜狐有个程序员,连续加班一个月,猝死在工位上,当时报导说那个程序员连日加班,工位上有好多红牛的瓶罐,空罐子都堆成了小山。。我记得当时和小伙伴们都很不以为然,他才一个月算什么呀,我们这都两个月了呢!结果没过几天,我的头忽然就疼起来了,好吓人。

阅读全文

论现代企业中考勤制度的必要性

其实没什么可讨论的,我是这个问题的坚决抵制者。

故事是这样开始的,那是一个阳光明媚的中午,因为前几天连续加班,状态不佳,早上没起得来,一觉睡到中午。不知道什么时候开始,我每个月都有那么几天,闹钟也叫不醒,可能是年轻时候加班落下的职业病吧,这确实是我的问题。于是我晃晃悠悠快12点了才到了公司,刚坐下没多久,人力“噌”出现在我面前:“你怎么跟那个XX似的,上班迟到呢?不能迟到啊。。”,叽叽喳喳说了好久,说得我晕头转向,我也没听仔细,反正主题就是:你这小屁孩儿不准迟到!

阅读全文