这个月初,土鳖们终于盼到了第一次出国旅游的机会(也是第一次出国),目的地——日本。
准备工作大概在春节后就开始了,之前曾经有过通过途牛成行香港自助游的经历,这次也打算在网上完成。鉴于上次错过了携程上建行信用卡每单立减800的薅羊毛机会,这次就直奔携程而去了。
果不其然,携程的日本自助游也有同样的优惠,这次更给力是JCB信用卡每人最高减950。虽然手上没有JCB卡不过马上可以办一个。携程还有两个优势:酒店选择范围比较大;保证金只需要国内关系人出具担保证明而不需要交出真金白银(让人感觉很不好)。日本自由行的签证政策是需要通过旅行社办理,并且要出具酒店和机票的预定证明,好像并不受理个人(中国公民)的办理。
最后我们选择了一个五日四晚的套餐,日航早去晚回,住新宿经济型酒店。从事后来看这些选择基本都做对了。时间上是周一出发周五回来,虽然看上去是工作日,可是由于变态的清明假期安排,实际上只花了两天的假期,回来以后还可以休整两天。
日本的签证要求的材料(或者说是携程要求的)说多不多,主要就是收入证明材料和担保材料。收入证明要求年收入10万RMB以上,由公司出具或者银行盖章的流水单。如果收入够的话建议后者,我的是招行卡排个队瞬间搞定,而公司证明需要公章加上财务章,如果是大公司的话想敲这两个可能会有些麻烦。担保证明就是在国内找个人,肯赌10万担保你不非法滞留或者不去靖国神社喷红油漆的。材料交上去以后大概2-3个星期出结果,可以在网上查到。然后你可以打电话让携程把材料快递回来给你。
手续就这么多,剩下就是兑换一下日元了。出行前缴纳的费用,包括机票、4晚住宿和300块的签证费总共是3788一个人(扣去了950的优惠额),应该是赶上了赴日旅游的低谷期了。
p.s. 日本的电源插座基本都是两个口平脚的,兼容国内大部分两脚插头。另外酒店如果有网络的话记得带一个迷你无线路由,不然一身的WIFI设备对着RJ45网口也只能干瞪眼。
Author: Marshall
补发一些香港之行的飞机照片
构建失败
Joel著名的12条测试里有两条与构建相关:
- Can you make a build in one step?
- Do you make daily builds?
这两条相信大部分有些规模的公司都能够做到。不过,有每日构建,就必然伴随着构建失败,特别是在多人协作的环境,由于代码依赖、开发人员失误(比如只签入了一部分代码)、代码合并等等原因,连续好几天构建都失败的情况也偶会发生。
失败的代码构建让人万分沮丧,首先打击了士气。没有人打算让伟大的项目在第一步就失败,就像70圈的F1在热身圈就冲出赛道退出比赛一样。另外还造成了大量的浪费,由于构建失败,同一天签入的代码就没法在第一时间得到测试,加大了项目后期测试的压力。而当你下载了最新代码,却发现连编译链接都无法通过,那估计你也没兴趣写代码了。
正如bug不可避免一样,构建失败也是不可避免的(特别是对于像C/C++这种有大量预编译的语言),即使构建成功与否是非常容易验证的,非黑即白。所以构建失败往往也被认为是最愚蠢的错误。不过再愚蠢的错误,也必须正面对待,而不是对犯错的哥们嘲笑或者怒吼了事。
对付一件坏事,基本上两种办法:要么预防发生,要么减小影响。
预防:
1. 降低构建的复杂度:太大的构建模块和构建链/工具链、太长的构建时间、过多的代码依赖、紧缺的构建服务器资源都会让开发人员倾向于减少构建的次数。我也不止一次看到,由于最后只改动了几个字符,开发人员懒得重新构建造成的构建失败。每个人都会偷懒(不是有句话说“偷懒就是美德”?),但如果降低偷懒的动机,偷懒自然会减少。合理的模块划分、分布式版本系统的使用(大大加快checkout时间)、更强的构建机器(CPU、内存,特别是SSD)、高效的构建方法(怎么着也得并行构建)。如果一次构建只需要15分钟而不是3个小时,没有人愿意冒风险悍然签入代码。经常是还有2个小时就下班但构建需要3个小时的情况下。
2. 惩罚:虽然嘲笑或者怒吼解决不了问题,不过一些善意的小惩罚还是可以接受的。微软90年代初的标准是5美元一次,按照收入比换算的话在国内大概20RMB应该还是合理的范围。不过国人似乎不喜欢现金,那么改成请大家吃零食也是个不错的主意。另外一个方法就是把某个恶搞标志放到TA桌子上,直到下一个人破坏了构建才能送出去。
减小影响:
3. 提高构建频率:把每日一次构建改成每日两次构建可以提早一半的时间发现问题。如果把构建频率提高到每天4-6次,并禁止在测试发布版构建和其上一次构建之间的签入任何代码(除非是修复破坏构建的代码),这样就保证至少有4-6小时的时间修复失败构建。(这个时间应该足够修复所有构建相关问题)。当然如果需要构建的版本特别多(特别是多平台发布和多分支维护的情况下),在可利用的资源条件下无法做到这个标准,可以采取差异化方案。主要工作版本和发布平台(即签入最频繁的构建)增加构建频率,几天才有一次代码签入的分支可以只做每日构建。这样就可以确保最值得关注的地方得到最多的资源。
4. 签入队列:签入的代码不马上进入开发的主分支,而是进入一个签入队列。每天签入队列里的改动要通过构建后才能进入主分支,如果当中有破坏构建的签入,则当天的所有签入都会被hold住直到问题解决。这样的代价是复杂性增加了,另外每日测试和最新的代码会有一天的延迟,不利于问题的及早发现(不过问题仍然可以追溯到某天签入代码的范围里)。
5. 专人负责:代码能否构建是软件的第一要素,这么重要的东西当然值得指派专人(或者是一个委员会)来负责。国际化团队需要在每个点(或者相近的时区)配备负责人,确保破坏构建的签入能够早几个小时被定位,甚至代替责任者修复一些愚蠢的问题。每当构建失败发生,委员会成员都会收到通知邮件,这时候他(们)应该停止手上的所有工作来解决这个问题,并在第一时间找到责任人通知其修复。如果暂时没法找到,也可以通知其peer或者在找到一两个相关reviewer的情况下自行修复。(建议与第6、8条配合使用就不会找不到责任者)
6. 自动构建:如果每次代码的签入都能够伴随一次完整的自动化构建,构建期间锁住代码库,并在确认构建结果后才允许正式签入,这样我们基本就不会碰到构建失败。这种方法其实是提高构建频度的极致。当然对于大型开发团队来说这并不现实,也可以做一些妥协,比如自动构建期间放弃代码库的锁定。毕竟由于多人同时签入代码导致的失败构建,所有人都可以理解的,而这种情况也相对较少。
7. 停止生产线:这条是丰田的做法。出现构建失败后停止所有的代码签入(当然修复构建的除外),直到下一次成功构建。期间构建负责人介入并定位问题(或者责任人自己认领)。这样有利于隔离问题,避免连续的构建失败。而夜间测试至少也有一个新的版本可以利用。
8. 签入时间限制:这条是从《微软的秘密》中看到的,所有人在下午2点之后不能签入代码。每天2点开始每日构建,一旦出现什么问题可以有人当场fix而不是将问题拖到第二天而浪费一整晚测试的宝贵时间。但对于国际化开发的团队显然不合适,实际一点的做法是要求所有人必须在下班前3小时之前做好当天的代码签入。另外,国际化开发的团队也总是有每日构建及测试的固定时间,一般会是在岸团队的夜里(想不到onshore的翻译了),可以规定在每日测试使用的版本构建前3小时内不允许的签入,而在这个构建前安排一个小的构建进行验证。总的原则是保证构建能够成功。
9. 签入前的公示:也是从《微软的秘密》里偷来的,特别是对于大规模的签入。公示可以是发邮件,也可以是在某个系统里登记一下。而每个人在签入之前也检查一下邮件或者系统。
小结一下减小影响的办法:及早发现、及早修复、隔离错误、拉长签入流水线。
最后是书托时间。关于软件开发的优秀实践,《微软的秘密》有很多很好的例子,虽然里面的有些相对现在流行的“敏捷开发”有些老土(书里写的基本上是92-95年的微软),但由于这么多年来软件开发的效率没什么本质上的提高,所以这些实践到现在仍然适用。
Smart and Get Things Done
上周在刘未鹏的博文里看到了Joel Spolsky关于招聘和管理的博客文集《Smart and Get Things Done》这本书,在网上辗转找到电子版并这几天在iPad上看完了(羞愧一下没买正版)。Joel的风格还是那么简单直白,切中要点,英文也非常好理解(移民的缘故?)。虽然书是从招聘者和公司老板的角度来谈的,不过里面很多内容还是值得广大IT从业人员一读的(特别是软件开发者)。对于短期内不会有机会参与雇佣的人来讲,也可以通过书中的一些例子来对雇佣的公司进行反向选择(如果你拥有多重选择的话)。
书里给我印象最深有两点:
1. 判断一个人是否聪明,看他能不能很快理解我(面试官)说的意思,而不是我再三解释;
2. 如果你对雇佣一个人犹豫不决,那就说“不”。
另外,他对“Hard-Core”的态度,也让我相信我当初选择从底层做起的决定是正确的。
p.s. 书名“Smart and Get Things Done”是Joel招人的最基本原则,来自于微软。
Blog主机迁移完毕
早上花了点时间把主机从gegehost转移到了homezz。前面一个主机我已经用了2年,是我用的第一个虚拟主机(reseller)。两年期间没碰到什么问题,加上有ssh访问,所以什么问题也自己搞定。新主机价格一样,流量一样,空间少了100M,没有ssh帐号(这点其实对我挺不方便的,不能拿来用sshd和wget了,过两天还得买一个sshd或者vpn的帐号);好处在于速度快了很多,本来是320+ms的ping现在只有180+ms,另外可以架设自用那个啥的API,还送免费的图床(不过我用picasa)。
另外以前的邻居xyxn,如果你们还能看到这篇blog的话,你们以前的内容我也备份下来了,有兴趣可以找我要备份数据包。
最后,放几个邀请码,如果有兴趣购买homezz的又没没邀请码的可以顺便帮帮忙。
K6HB5FJ3
SR7GOM49
31NERVLH
这两周的运转
简单记录一下流水帐,也没拍照片。
上周二(清明节假期最后一天),从家里出发。第一部车是刚刚延伸过江的874,在伊敏河路上车。在从密云路大转入赤峰路后就和515走同一路线,从延吉路西段一直到最东端。军工路上开得很快,出了隧道就是浦东金桥路,然后就到底站枣庄路张杨路。
之后在云台山路站上了6号线。6号线很长一段是沿着张杨路走的,似乎导致金桥附近张杨路上的公交车不多(当年开通地铁后砍掉了几条线路)。6号线车站是明挖式的,阳光可以直接从上面透下来到达站台,当然悲剧是太短太窄。上车时没注意,坐上了小交路,结果到高青路还要下车等下班车。上南路站下车,这个站倒是很宽敞。要是再过几个星期再坐6号线的话就可以在济阳路站(现在更名东方体育中心站)换8号线了。
上南路华夏路站等576回程,虽然人不多但是一直到南浦大桥附近才有位置坐。576虽然雄风不在,但南浦大桥上还是找到当年飚车的感觉。在南浦大桥上的时候倒想起来在18摸实习期间的生活,天天坐班车从中山公园到张江。
====
今天呢就到宝山去转转。另外还打算去宝山区图书馆看看。家门口116,到江湾就满满一车人,然后在高境庙上的高架。在高架上我觉得开了挺远的才下来,感叹宝山还真是远啊。不过下桥拐入淞宝地区就是一番新的景象——至少不是沿路的工厂郊区样子(逸仙路从场中路向北沿路上都觉得很荒凉,除了地铁站附近还有点人气)。淞宝算是真正的宝山吧,给我的感觉像是南京的大厂地区或者是厦门的海沧同安,不过面积肯定大多了。后来地图上一量,大概有10多平方公里的城区吧,规模相当于地级市市区。还见到了很久没看到的沪C出租车,以前只在张江见过南汇的,现在这个是宝山的。
到了图书馆却发现在修楼闭馆,于是只好继续运转。在永清路上了51路到水产路同济路,然后换宝山1路。水产路出了淞宝就很荒凉,一直到杨行才有点人气。路过顾村外围不过没进去,最后在刘行附近下车(这名字我一开始看上去很眼熟就是想不起来,后来看到一辆教练车就想起来了)。
回程是528,不过我没想到528路线有这么长,分别在沪太路上和汶水路上开了很久,在顾村公园还上了很多回程的游客。有意思的是528有两个共和新路汶水东路站,而且是180度相对的。不知道为什么528不在汶水路地铁站地下直接大转(看到了左转车道和车辆),非要到永和路口调头。下了车屁股都坐疼了,20公里开了一个多小时。
每周技术分享 -1 screen
总觉得应该找到一个方式把一些技术方面的东西记录下来,想不到什么特别的方式,就暂且放blog里把。
这是开篇,虽然加了每周这个限定,但也不一定每周都能更新,算是一个期望吧。内容可长可短。
上班一年来,我现在每天离不开,以前却不知道的工具非screen莫属了。对于不在本地编写编译代码的人而言,肯定是会需要很多终端窗口的,一个写代码,一个查代码,一个编译代码是跑不掉的。另外,代码还有很多branch,还有需要dump调试窗口等等,一个占用一个windows窗口,不仅太占空间,就是一个个打开也很麻烦。一开始打算用putty manager,但用了用觉得不太顺手。后来同事推荐了大名鼎鼎的screen实现上面的功能。
screen也算是一个老牌程序了,大部分linux服务器上应该默认都有的。screen等于在服务器端管理了终端窗口,这带来另外一个好处是即使putty断线了(比如关机、断网),服务器的session也不会终端,只需要重新attach上去就可以了,省去了很多麻烦。而各个终端也支持自己命名,切换也有各种快速切换方式。另外外观也可以通过自定义.screenrc文件来配置。本来一个服务器我最多开3-4个终端,现在上了screen,我经常在服务器上上15+的终端,而遇到需要重启关机的时候,直接把putty关闭,看都不看,因为我知道服务器端保留了所有的终端信息。除非碰到服务器重启等特殊情况,这些终端我基本都一直放着,这样一到公司就可以很快进入工作。
另外screen还提供了服务器终端共享的功能,具体使用可以看screen的manual。这应该算是终端界的桌面共享吧?这个功能我倒是没有用过,有次我mentor在给美国的同事解释代码的时候,一边就着电话,一边就着screen共享session,挺实用的。
我的2010
简单记录下我的2010吧,毕竟是鄙人走上工作岗位上的第一年。2010的主要就三件事,按时间顺序来就是毕业、上班和领证结婚。
毕业没什么特别的,论文去年年底就写好了,导师也通过了。放假回来就是准备答辩。手里做了3年的APIS系统也移交给Jason了,现在不知道APIS已经变成什么样了,原有的域名也失效了,不知道是不是换了个域名还是忘了续费:)
搬家倒是没想象中那么麻烦。找韵达的快递师傅寄了4大箱行李,花了近200块钱。上海这头用一个下午找到了一个比较满意的住所,虽然比当初预算多了一些,但觉得还是值得起这个钱的。
===============我是工作的分割线===============
4月12日入职,开启我的职业生涯。
入职前几天,公司里的学姐Cleo问我是否愿意去搞C++和文件系统,我二话不说立马答应。能够从事的底层系统开发工作,基本符合我的职业规划。而能够参与核心产品基础架构的开发,就算是锦上添花了。而可以与现在这些同事共事,则是我更大的运气。团队里每个人各有特点,却又身怀绝技。在这9个月里,我从他们身上学到了很多东西。
团队的气氛很自由,但也要求高度的自觉和主动摸索。原本以为会有2个月左右的培训,没想到一上来就修BUG,用扔海里学游泳的方式培训。的确可以让人很快上手,不过也留下了一些问题,在以后一段时间内也慢慢浮现出来。
5月份正式加入团队,接手几个简单的bug。之后6月有了正式的开发任务(虽然是比较小的独立模块),算是通过试用期了。7月底接手了正式的中等模块开发任务,算是站稳脚跟第一步吧。8月,除了手头的正式任务,也尝试参与一些其他小模块的工作。9月底由于没能完成任务(自己计划也没做好),差点没拿到一部分奖金。10月的主要工作不太记得了,似乎是修一些bug。11月团队大规模扩张,增长率达到了110%,于是乎花了些时间在电话面试上,电面了10多个家伙。
12月是折腾的日子。和我一组的同事儿子临产,老美圣诞休假,新工作内容到来。差点没压得我喘不过气来。虽然不算完美的挺过来,但毕竟算通过了一道考验吧。所负责的工作内容和职责也比前几个月扩展了大概有50%。
总体来说,走上工作岗位的第一年基本还算满意吧。同时也让我明白了在哪些领域我还有很大的不足。接下来的一年,没有人会把我当新人看,要求和期望也同样拔高了。
==================我是结婚的分割线===================
压轴的就是结婚吧。日子特意挑在2010年11月11日,和LP5年多的恋爱终于走进了婚姻的殿堂。其他话也不在这里多言,只想说,”执子之手,与子偕老”。
================我是2011的分割线====================
2011的计划很丰富:结婚各种事宜、蜜月、购房,其中任何一件都是人生大事(虽然不甘心认为后一件真的是大事,但当今的房价让人无奈)。
80后的首要任务整理版
1、事实证明在这个世界上,感情经得起风雨,却经不起平淡;友情经得起平淡,却经不起风雨
2、人生没有彩排,每天都是直播;不仅收视率低,而且工资不高
3、唯女人与英雄难过也,唯老婆与工作难找也
4、不要整天抱怨生活,生活根本就不会知道你是谁,更别说它会听你的抱怨
5、是金子总要发光的,但是当满地都是金子的时候,我自己也不知道自己是哪颗了
6、只知道刚的人,难免会被折断;只有柔的人,到头来终是懦夫
7、爱情就像两个拉着橡皮筋的人,受伤的总是不愿意放手的那个
8、信念这玩意不是说出来的的,是做出来的。光荣在于平淡,艰巨在于漫长。
9、谎言与誓言的区别在于:一个是听的人当真了,一个是说的人当真了
10、单身并不难,难的是应付那些千方百计想让你结束单身的人
1、“幸福”就是猫吃鱼,狗吃肉,奥特曼打小怪兽
2、“代沟”就是我问老爸觉得“菊花台”怎么样,他说没喝过
3、“自恋”就是下辈子我一定要投胎做女人,然后嫁个象我这样的男人
4、“无语”就是法官问:你为什么印假钞? 罪犯说:真钞我不会印。
5、“绝望”就是饭馆吃饭点了两菜,吃第一个:“世上还有比这更难吃的吗?!”吃第二个“靠!还真有!”
6、“不婚”就是对婚姻控发起的非暴力不合作运动…
转:百合上看到的131正转
注:要是159被取消的话,从高新区去火车站真的折腾了
131路历史正传 第一阶段:小荷才露尖尖角 上世纪90年代,南京市政府开始逐步加大开发江北地区的步伐.南京高新技术产业开发区就 设立在了长江北岸.随着开发区入驻企业逐渐增多,迫切需要一条能够沟通市区与开发区的 公交线路.就是这个时机,216路专线车开通了.这条216路专线车线路,就是当今131路和132 路最早的前身.专线216路由汉中门发车,经过城西干道一路向北,从大桥南路上长江大桥过 江,然后途经泰山新村开往高新开发区. 由于走向合理,换乘方便,216路自开线起客流相当的好.所以在不久之后的专线车"转正"中 ,216路被命名为"汉高线",从线路名称上就可以直接看出,这是汉中门开往高新开发区的线 路. 第二阶段:邻家有女初长成 之后不久,由于城市建设需要,城西干道(虎踞路等)开始建设高架桥.原来汉中门汉高线使用 的场地没了.同时也为了减少对施工的影响,汉高线作出了调整.放弃了汉中门的终点站.而 是在清凉山折向东,顺着广州路,珠江路来到了莲花桥附近,在北门桥的马路边调头.线路走 向调整的同时,汉高线也改了名称,新名称是"高新线",取两向终点站"高新区"和"新街口"之 意.调整了线路走向之后,高新线比原来的汉高线更加接近主城的中心地带.莲花桥是个很好 的地方,离新街口不远,离鼓楼也不远.周遍公交线网密度更大.所以经过这一调整,"高新线 "客流的上升很迅猛. 第三阶段:江北风雨含霹雳 进入21世纪之后,城市的发展更为迅速,江北地区的发展甚至比城区还要快.于是一轮大规模 的新开过江公交线路风暴展开了.这批风暴里,原本在江北泰山新村掉头的泰浦(泰山新村- -浦口公园),泰工(泰山新村--工地)两条规模比较大的线路延伸到了长江南岸,在大桥南路 安了家,即今"盐浦""盐工".两条老牌线路鼓扬线和盐十线加强了运力,盐十线还延伸去了更 远的葛塘,即今"盐葛".同时新开了"鼓珍""盐轮""高东"线路.随着江北公交线路增多,江北 人民需求无人售票刷卡线路的呼声日益高涨,"高新"和"高东"被选为试点线路,尝试过江线 路的数字化命名,并为以后的无人售票刷卡线路开通做好准备工作.于是高新线被改名149路 ,高东线则成了159路.这可笑的数字命名实在是自欺欺人,车辆还是原来的车辆,线路还是原 来的线路,因为里程太长没有办法变成无人售票刷卡线路,所以车上仍然有售票员.仍然采取 上车按里程买票的方式运营. 第四阶段:千年媳妇熬成婆 在广大人民群众的强烈要求下,南京市公交总公司江北客运部在2004年3月开通了三条真正 意义上的过江无人售票刷卡线路.即今131,132和136路.按照公交公司的原意,计划是149路 暂停后由131和132路代运,159路暂停后由131路和136路代运.131路由高新开发区开往大桥 南路,132路由长途客运北站开往莲花桥.136路由长途客运北站至长途东站往返行驶.开线前 夕,经过慎重考虑,由于136路走向与159路区间稍有区别,另外若高新区仅由131路支撑尚有 不妥,况且江北至火车站客流较大,故159路最终被幸运的保存了下来,这也就是159为何数字 化命名而又有人售票的原因.就这样,131路和159路形成了现今的运营格局.