2018年下半年书单


我终于又更新了。
最近太忙了,先总结下18年下半年的书单吧。

技术类

《计算广告学》 刘鹏
这半年有点忙的昏了头,需要静下心来读的技术类的书籍一本都没读完,只是因工作需要又重新过了一遍这本《计算广告学》。有了相关的项目经验之后第二遍读,确实能注意到之前忽略的一些点,也能够感受到理论和实践的差距。哎,广告系统确实复杂,链路一长,数据一多,本来许多不是问题的问题都成了大问题。反过来说,也确实带来了很多挑战,能够获得足够深入的成长。

非技术类

《反脆弱》 塔勒布
塔勒布的另一本书《黑天鹅》可能更有名一些。很多做投资、金融的大V会推荐这两本书,但是我读完后觉得至少《反脆弱》这本书,对人生的指导意义要远远不止于投资方面。不过在2018年全球资本市场寒冬的情况下,读一读这本书,反思下自己有哪些地方做的不够“反脆弱”,也是大有裨益的。

寒冬来了 闲聊几句


冬天来了

最近“互联网寒冬论”甚嚣尘上,各种裁员的流言雪片般飞来,好像一夜之间,所有人都裹起被子准备过冬了。消费降到冰点,原来高利润的生意变成了微利,原来微利的变成了亏损,原来亏损的干脆就撑不下去了。看看最近上市的几家公司,腾讯音乐上市一天后就已经破发,360金融被媒体称为流血地板价上市,蘑菇街上市又被爆出稀释老员工期权……大家的日子都不好过呀。

关于dynamic_cast


有时候,项目需求紧,时间少,写代码往往就抓起什么用什么,比较少考虑设计的合理性。dynamic_cast就是一例。

dynamic_cast一般用于down cast,即将父类的指针(或引用)转换成子类的指针(或引用),并提供了运行时的类型检查(RTTI功能),转换失败时,会返回一个nullptr(引用则抛出bad cast异常)。

慎用unsigned int减法


最近在做一个缓存的清理策略时,遇到了一个诡异的bug。

缓存每次命中,都会更新一个时间戳;然后定期清理的时候,用当前时间now减去缓存的时间戳,如果差值大于7天,则清理掉这个缓存项。

1
2
3
4
5
uint32_t now = time();
... // Some other code
if (now - hash_elem.timestamp > expire_interval) {
erase(hash_elem);
}

面试造核弹,工作拧螺丝?


最近在工作中遇到这么一个问题。

一个使用机器学习算法的框架,在特征处理模块,往往需要对原始特征进行特征交叉。对于简单的单值特征来说,只需要将需要交叉的特征组合起来即可;但是对于多值特征之间的交叉,则需要穷举多值特征每一个值的组合。例如,如果一个包含2个值的特征和一个包含3个值的特征组合,那么将会产生出6个组合。

一般的,我们可以把这些多值特征描述为

1
vector<vector<Feature>>

那么给定这样的一个数据结构,如何输出所有的特征组合呢?

crontab为何自动中断


在最近开发的一个系统中,有一个定时任务,每天需要将一份数据(大约200w条),发送至一个线上key-value存储系统中。

说到定时任务,最常见的,就是使用crontab。原来这一套系统已经开发完成,部署在深圳IDC,工作良好。最近,需要在天津IDC也部署一套。但是在天津部署之后,我却发现,天津的这套系统每天只能定时发送48999条数据(准确数字),然后就自动停止了。

ProtoBuf中的反射


同时写Python和C++的程序员,往往会觉得C++写起来很累。(所谓“累守恒定律”: 程序执行时的累 + 程序员写代码时的累 = 恒定的累^_^)

在处理ProtoBuf Message数据时,经常会有这样的需求,根据一个输入的字符串,找到Message中对应属性的取值;或者根据输入的字符串和一个值,设置Message中对应属性的取值。

这种需求放在Python中,往往直接通过getattr/setattr就能一步搞定。但是在C++中,我们不得不借助于ProtoBuf的反射机制。

这里,需要介绍如下几个概念:

《反脆弱》读后


《反脆弱》这本书可能大家不知道,但是说起其作者塔勒布的另一本畅销书《黑天鹅》,可能知道的人就会更多一些。虽然这本书更多的是出现在一些“理财投资必读书单”之类的地方,但是我读过之后觉得,很难把这本书单独的归入经济、心理学或投资学任何一个单独的门类中。

这是一本讲价值观的书。

说到价值观,大家可能会觉得比较务虚;但是,其实我们在生活中的每一次选择、每一个行动,都是内在价值观的外在体现:选择哪一份工作,哪一种生活方式甚至周末选择哪一部电影,都能一窥不同人的价值观之不同。

那么,这本书的价值观是怎样的呢?

线程数与多核CPU的关系


多线程程序大家都在写,那多核CPU的服务器上,线程数开多少个比较合适,你知道吗?

这里,首先要厘清CPU数、核数、processor数这么几个概念。

比如,使用top查看负载时,按1,看到的CPU0~CPUn,这里的数量其实是processor数。