最近用多看看了好久的《码农》,把其中个人感兴趣的内容记一些,有的还进行了小研究。
海量用户积分排名算法探讨
问题:某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2亿;积分为非负整数,且小于100万。
代码漏洞
static int binary_search( int target, int array[], int size ){
int l = 0, r = size -1;
int h = 0;
if( size <= 0 ) return -1;
while( l <= r ) {
h = ( l + r ) / 2;
if ( target > array[ h ] )
l = h + 1;
else if( target < array[ h ] )
r = h - 1;
else
return target;
}
return -1;
}
这段代码看起来非常严谨,但是却有着非常严重的问题,你看出来了吗?最关键的是:
h = ( l + r ) / 2;
因为h是int类型,在32位或64位的机器上,它最大能表示的数是2147483647,如果l与r的和大于这个数会出现什么问题呢?加法溢出,会得到一个负数。如果用一个负数作为数组的下标会出现啥情况?有人说:访问越界,系统崩溃。
糟糕程序员的征兆
“推土机式代码”(bulldozer code),表面上看是把代码块打散成若干子程序的重构动作,但是这些打散后的若干子程序却完全不可能在另一种环境中复用(因为它们之间有很高的耦合,不能分开使用)。
Rest API 格式
我们一般用URI
来定义希望对外暴露的服务。结构基本类似schema://yourCompanyDomain/rest/{version}/{application}/{someService}
。schema
可以是http
,也可以是https
,version
指的是你这个API的版本,application
一般会指向底层的某个子系统,someService
就是这个子系统对外提供的服务。当然,如果按照业务为边界划分,也可将业务维度相同但隶属于底层不同的系统的服务定义为一个application
。
神奇的质数
关于蝉的质数生命周期,迄今为止的最佳推测指出,森林中可能存在着一种蝉类的天敌,周期性地出现,而且其生命周期刚好对应蝉的出土时间,于是,它们便可饕餮不断涌现的美食了。接下来,物种的自然选择便开始发挥作用,保持质数生命周期的蝉类遭遇天敌的机会要远远小于非质数生命周期的蝉类。