Up in the air

“工作狂往往不得要领。他们花大把大把的时间去解决问题,他们以为能靠蛮力来弥补思维上的惰性,其结果就是折腾出一堆粗糙无用的解决方案。”

– Rework

“条件受限是好事,因为条件受限可以让你小材大用,让你没有办法再用蛮力来完成工作,让你必需去思考使用知识密集型的解决方案来更聪明的解决问题。”

– Rework

“设计系统的组织,最终产生的设计等同于组织之内、之间的沟通结构。”

– 康威定律(Conway’s Law)

“向那些疯狂的家伙致敬。他们我行我素,桀骜不驯,惹是生非,就像方孔中的圆桩。他们用不同的角度来看待事物,他们既不墨守成规,也不安于现状,你尽可以赞美他们,否定他们,引用他们,质疑他们 颂扬抑或是诋毁他们,但是唯独不能漠视他们。因为他们改变了事物,他们让人类向前跨越了一大步,他们是别人眼里的疯子,却是我们眼中的天才。因为,只有疯狂到认为自己能够改变世界的人,才能真正的改变世界。”

– Think Different

宽容不是道德,而是认识。唯有深刻地认识事物,才能对人和世界的复杂性有了解和体谅,才有不轻易责难和赞美的思维习惯。

《看见》,柴静

你们要争独立,不要争自由。

胡适,一九四六,他解释:你们说要争自由,自由是针对束缚而言的,独立是你们自己的事,给你自由而不独立,仍是奴隶。独立要不盲从,不受欺骗,不依赖门户,不依赖别人,这就是独立的精神。

async.js with cluster

一直很喜欢async.js的简洁明了,不像其他promise库那样虽然有个很漂亮的api,但是代码稍显臃肿,调试起来也不直观。

async.js很适合用来处理一些IO密集的操作,比如并行下载,爬虫等等。但是有时候还需要用来处理一些CPU密集的操作,比如高负荷的计算队列,这时候async.js里各种方法只能在单核运行的弊端就显得很明显,单进程一个队列里任何一个任务堵住了,其他任务也就无法同时进行。有了cluster,我们可以比较简单地fork当前进程,管理子进程,利用系统的进程调度来多核并行计算。

之前写暗网爬虫组合搜索条件的时候,遇到这样一个问题:

> 存在a,b,c三个条件,对某个请求进行搜索,得出/q?p=a, /q?p=b, /q?p=c,如果其中一个结果集大于1000,那么拆分继续查询,q?p=a&p2=d,以此类推,不断挖掘新的结果。

这样看,热门的参数往下拆的可能性很大,如果按照原来简单的对一级条件进行拆分进程,处理热门条件的进程消耗的时间则远远大于非热门的条件进程,如上例子,/q?p=c如果小于1000,那么一次就跑完了,不需要重新拆分,而如果/q?p=a&p2=d拆下来还大于1000,那么这个进程还得继续挂着,其他进程可能早已退出,那么空闲下来的CPU也就没办法利用到。

仔细想想,将async.js稍微改造一下,跟cluster组合起来,有一个集中于master进程的的队列(这里使用async.queue),看哪个worker有空就请求,请求回来之后需要拆分的拆分,把条件交回给master进程,让master进程去决定交给谁来请求内容。这就需要用到进程间通信,cluster提供的process.send有点不够用,索性直接用dnode

  1. dnode在所有进程启动host,主进程连接所有进程的host,子进程连接主进程的host
  2. async.queue(fn, parallel)返回的对象放到dnode里:dnode(async.queue(fn, parallel)).listen(port)
  3. 在主进程push任务,依次检查子进程的闲忙状态,闲了就交给他。
  4. 主进程的async.queue里,第一次push并发数一致的任务(简单一点就根据进程数取模,如果需要动态添加工作进程,可以采用hashring)。
  5. 子进程启动后,发送请求,执行完任务,将需要递归请求的数据push回主进程,继续第3步。

“千里迢迢来到这里,我不仅仅是为了登山拍照,留下一些片子,更重要的是克服因顺从社会的重力,而失去走进荒野的勇气,祈求向上攀登的力量,便是挣脱那无形的束缚,我在这个过程中重新获得新的体验和自我完善的信念。因此,向着山顶所前进的每一步都是向着自我的回归。”

– 于云天,《我思故我行》

2012年总结

2012的余晖

2012大部分时间其实过得很乱,来到广州纯粹是因为感情的原因,很多朋友都说,在淘宝混得好好的,干嘛要走。现在想来,不过只是 follow the fucking heart 导致的。

工作上,其实从自己的身体状况可以很明显看出变化。老妈在11月初来广州一次,说我瘦了很多;元旦回去的时候,却改口表扬了这两个月吃得不错。但很多一年不见的亲戚朋友都说这一年我明显瘦了。其实在广州一年来身体方面,尤其上半年,是不断下滑的。在腾讯,初换工作,以及平时开发的压力很明显;在家工作之后,可以有更多的时间自由活动,做好吃的,出去参加活动,跑步,爬山,行摄,保持稳定的生活节奏,自然过得舒舒坦坦。

具体到开发任务,在广研做了八个月的 iOS 开发,期间参与了邮箱和中转站两个 App,到头来只为了证明自己真的不喜欢做客户端的工作,研究的工作多少有一些,但是也都是浅尝辄止。新公司自己参与的主要是暗网爬取和二度排序的工作,平均每天4-5个小时,目前团队压力最大的不是技术,而是产品和市场。

生活上,

一月去了江西武功山

取暖

六月回了趟杭州;

七月开始骑行,两个月时间就把珠三角的大部分城市走了一遍,深圳,惠州,顺德,南海,中山,珠海,三水。

八月初脑袋一热去了泰国,在大城的宁静和清迈的文艺里游荡;

曼谷火车站

八月底公司Outing,自己组织去了一次长坪沟,陶醉在星空下:

日隆的星空

十月参加凯乐石的四姑娘登山节登顶二峰(alt. 5276),算是入门了一下雪山:

俯视大峰的日照金山

十一月参加了惠州200KM骑行(耗时:11小时);

十二月初跑了深圳山野马拉松(耗时:6小时12分);

十二月底走了趟韶关南岭登广东第一峰,看雾凇:

雾凇

十一月中开始帮养朋友的边牧,结果一个礼拜不到,就生下来七个小妞,十二月份很大部分时间都得关注这七个娃儿的成长,慢慢看着长大,感触颇深,或许可以慢慢解决我的 responsibility issue 。十二月又来了只小猫,元旦从家里回来,小猫小狗已经打成一片。

千年修得同船渡

2013希望能保持年底这个工作状态,多花点心思在路上,多拍点好片,其他再无追求。

回访南岭

环球金门

繁忙的华景路上,有家不起眼的潮州炒粉店,叫环球金门。自己用大米磨的粉,早上做做肠粉,中午就炒米粉和河粉。打来到广州,进广研上班的那天起,几乎每个工作日,都在这里吃午饭。6块钱的炒粉,5块钱的肉丸汤,吃了整整8个月。

刚到广研的那段日子,很不如意。独自承担房子的租金,只为了守候一片早已不复存在的感情。每天10点钟起床,冲个凉就去上班,走在不算吵闹的街上,一边想着今天该做点什么;晚上9点钟下班,却总是很疲惫,一只脚都还没迈出南方通信大厦,烟早已点起,匆匆过天桥,匆匆地走在回去的路上,似乎想逃离什么。

慢慢地,跟上了大家的节奏,习惯了大厂常见的扯淡,很多事情不再纠结,每天依旧朝10晚9,却不再有规律,哪天心情好了,走多15分钟路,去星巴克买杯咖啡;哪天不想上班,抱着电脑跑到大厅,继续看电视看到睡着,回笼觉睡完管他下午几点,再跑去公司,晚上就一直清醒地乖乖地弄到12点再走。

公司内部IM和公司邮箱,两个月不开,似乎都没什么大碍。平时相关的东西都是QQMail存一下档,具体到任务的时候,总会有一个列表出来,随便抓个人确认一下,把事情做完就完了。真到着急的时候,会有电话的。

习惯了不开闹钟每天睡到自然醒的日子,每天闲一点就看看书,每次不多,却也陆陆续续翻了好几本;也经常看电视剧,几乎把这届Amy的几部提名片都看了。中午吃饭的时候,都是谈资。几个人轻轻松松地聊天,海阔天空,无所不谈。奇怪的事是,同样的粉,同样的肉,吃了这么久居然不腻。

只知道,一起扯淡的同时,一直在问自己,这是我想要的日子么?日子简简单单,压力也算不上大,平平淡淡。

我喜欢淡然,简单,但是却不是这种平淡。我想要的,就像环球金门里的粉和汤,精心一点一点磨出来的粉,一勺一勺做成的肉丸汤,美味,却不会腻。因为每一口,都是不同的品味。

所以我还是决定离开,尝试着找想过的日子去过,尝试着靠自己双手,一砖一瓦去搭建。

有趣的是,中午我们几个,还是在环球金门吃的饭,照样瞎扯,吃完饭各自AA,回公司的路上还是停不下来,“这飞人的衣服也太牛逼了点儿…”