观止

从图书馆借的《观止》,基本上算是一口气读完了。当前世界上占有率最高操作系统(NT内核的Windows)的开发过程可以说是惊天地泣鬼神。很难想象如果NT失败了,或者像Vista那样恶评如潮,今天的微软会是什么样子。印象很深的有几处:dogfood文化、push文化和最后的death march。
根据Wikipedia,Eat your own dog food,来源于某电视广告。某明星为某狗食打广告,并宣称自己也用这个牌子的狗食喂自己的狗。而在IT界,最早使用是在1988年的微软,并在接下来的各种系统很好的坚持了这个原则。这是一个很优秀的软件工程实践,如果有条件的话,我强烈推荐开发团队采用它。在APIS的开发中曾经尝试过,效果很不错,立马揪出bug和糟糕的用户体验问题一坨。
因为导师曾经在微软工作过,因此对push文化也有所耳闻。对于微软之前是什么样,《观止》中没有交代,但NT的开发肯定给这个文化加上了浓重的一笔。而在最后的death march中,这种文化达到了极致。
对于本书署名的翻译,我倒是有所微词。对于这本书而言,showstopper指代的是最严重bug的类型;而“观止”这个词是明显带有褒义的,以此做书名似乎不太妥当。观止本身对应showstopper的另外一个意思,“因特别精彩而被掌声打断的表演或表演者”。当然我也没有什么特别的建议,只是觉得译为“观止”似乎丧失了原文的双关性。

通过weather.com.cn获取全国天气数据

获得天气数据:
访问http://m.weather.com.cn/data/101020100.html,其中1010200100是城市的id(上海),返回JSON格式的天气数据,示例如下:
{“weatherinfo”:{“city”:”上海”,”city_en”:”shanghai”,”date_y”:”2009年12月24日”,”date”:”十一月初九”,”week”:”星期四”, “fchh”:”08″,”cityid”:”101020100″,”temp1″:”14℃~6℃”,”temp2″:”9℃~3℃”,”temp3″:”6℃~2℃”, “temp4″:”5℃~1℃”,”temp5″:”7℃~4℃”,”tempF1″:”57.2℉~42.8℉”,”tempF2″:”48.2℉~37.4℉”,”tempF3″:”42.8℉~35.6℉”,”tempF4″:”41℉~33.8℉”,”tempF5″:”44.6℉~39.2℉”,”weather1″:”多云转小雨”,”weather2″:”小雨转多云”,”weather3″:”多云转小雨”,”weather4″:”阴转多云”,”weather5″:”多云”,”img1″:”1″,”img2″:”7″,”img3″:”7″,”img4″:”1″,”img5″:”1″,”img6″:”7″,”img7″:”2″,”img8″:”1″,”img9″:”1″,”img10″:”99″,”img_single”:”1″,”img_title1″:”多云”,”img_title2″:”小雨”,”img_title3″:”小雨”,”img_title4″:”多云”,”img_title5″:”多云”,”img_title6″:”小雨”,”img_title7″:”阴”,”img_title8″:”多云”,”img_title9″:”多云”,”img_title10″:”多云”,”img_title_single”:”多云”,”wind1″:”东北风转北风3-4级”,”wind2″:”北风4-5级”,”wind3″:”北风转东北风4-5级”,”wind4″:”东北风4-5级转北风3-4级”,”wind5″:”西南风3-4级”,”fl1″:”3-4级”,”fl2″:”4-5级”,”fl3″:”4-5级”,”fl4″:”4-5级转3-4级”,”fl5″:”3-4级”,”index”:”舒适”,”index_d”:”建议着薄型套装或牛仔衫裤等春秋过渡装。年老体弱者宜着套装、夹克衫等。”,”index48″:”凉”,”index48_d”:”天气凉,建议着厚外套加毛衣等春秋服装。年老体弱者宜着大衣、呢外套加羊毛衫。”,”index_uv”:”最弱”,”index48_uv”:”最弱”,”index_xc”:”不宜”,”index_tr”:”很适宜”,”index_co”:”较舒适”}}
城市id获取方式(一次性工作):
1. 访问http://m.weather.com.cn/data5/city.xml?level=0,(后面level参数可省略)得到一级列表(省、直辖市、自治区),结果用逗号隔开,id和城市名称使用竖线“|”隔开;结果示例如下:

01|北京,02|上海,03|天津,04|重庆,05|黑龙江,06|吉林,07|辽宁,08|内蒙古,09|河北,10|山西,11|陕西,12|山东,13|新疆,14|西藏,15|青海,16|甘肃,17|宁夏…(以下省略)

2. 访问http://m.weather.com.cn/data5/city02.xml?level=1,(后面level参数可省略)得到二级列表。其中02是一级省市的id,结果格式和上一层相同,示例如下(上海和黑龙江):
0201|上海
0501|哈尔滨,0502|齐齐哈尔,0503|牡丹江,0504|佳木斯,0505|绥化,0506|黑河,0507|大兴安岭,0508|伊春,0509|大庆,0510|七台河,0511|鸡西,0512|鹤岗,0513|双鸭山

3. 访问http://m.weather.com.cn/data5/city0201.xml?level=2,(后面level参数可省略)得到三级列表。0201是地级市的id,示例如下(上海):

020101|上海,020102|闵行,020103|宝山,020104|嘉定,020105|南汇,020106|金山,020107|青浦,020108|松江,020109|奉贤,020110|崇明,020111|徐家汇,020112|浦东

4. 访问http://m.weather.com.cn/data5/city020101.xml?level=3,(后面level参数可省略)得到最后一级的id,020101是区域的id,示例如下(上海市区):
020101|101020100
后面的数字就是获得天气数据需要的城市id,以http://m.weather.com.cn/data/{id}.html格式访问即可得出天气结果。
参考:
chrome天气插件:http://code.google.com/p/chinaweather/,使用Javascript编写

三网融合终破局 广电整合是关键(ZZ)

2010年注定将成为中国信息产业发展史上一个值得纪念的年份,因为,在十年前就曾被广泛呼吁广电和电信网的融合问题,在这一年终于破题:13日,国务院常务会议决定加快推进电信网、广播电视网和互联网三网融合。
一个十年前的命题,十年后终于得解。这个交织了电信和广电两大行业,广电总局和工信部(信产部)两大部门利益斗争的命题,终于在2010年1月13日完成了解方程式。在电信行业改革了十年,下一步不知道再怎么折腾,在广电部门终于建了自己的NGB(下一代广播电视网)后,三网融合终于羞羞答答走上了前台。
一个难解的方程式
不过,这是一个在十年前应该解开的方程式。但因为行业利益之争不得不一拖再拖。本来,三网合一是一项事关国家对于技术利用的取向性问题,技术本身是中立的,但为谁所用却大有讲究。
广电电信之争早在1998年就露端倪,当年广电企业曾试图摸索开展一些电信业务,但这一举动受到了利益受损的电信运营商的强烈反响。此后双方的冲突不断升级,有部分地区发生互相破坏对方的网络传输设备的事件,甚至升级为流血冲突。为此,1999年9月国务院下发了《关于加强广播电视有线网络建设管理的意见》(国办发〔1999〕82号,史称“82号文件”)。82号文件规定,电信和广电之间河水不犯井水:电信部门不得从事广播电视业务,广播电视部门也不得从事通信业务,广电如欲在国内新建干线网必须经信产部批准。
此后几年表面上相安无事。不过,看到电信运营商大把的赚钱,有着传输资源的广电部门怎能坐以等毙。诸侯分割的广电网络广电内部开始却掀起了整合的大幕。
而当初哭喊着自己利益受损的电信运营商,在发展了几年后,发现随着宽带网络的不断发展,视频时代的来临有着巨大的商机。因此,电信运营商开始想方设法进入广电领域。后来,信息产业部提出电信和广电双向开放的倡议,广电总局提出电信业务对广电部门单向开放的回应,理由是WTO要求成员国开放电信市场,并不要求开放有线电视的传输市场。如果广电对电信开放,广电就会随着电信的开放一同开放,这有损国家利益。
双方开始为如何进行三网融合打起了口水仗。
在打口水仗的同时,电信运营商开始采取行动。2005年,电信和网通开始在部分省市推出IPTV,涉水广电业务。这一举动当然遭到广电部门的阻击。因为根据82号文件中的相关规定,播放与发布视频内容的权限掌握在广电手中。在2005年底、2006年初,泉州、浙江等地的广电部门以82号文件为由相继叫停了电信运营商开展的IPTV业务。
但这种阻击并没有阻止电信IPTV的发展,除上海外,各地开始行动,电信IPTV发展的如火如荼。
这让广电系如芒在背。广电总局副局长张海涛曾直言不讳地说出了广电所面临的竞争压力,矛头“遥指”电信的IPTV业务:“互联网媒体、手机媒体、IP电视等发展迅猛,广播电视的传统用户正在流失,广电面临着前所未有的压力。”他认为,广电应对这种压力的“压倒性任务”就是促成新媒体业务的发展。
但广电面对电信的竞争却无可奈何,因为广电没有一张完整的网。曾大张旗鼓进行的网络融合,因为产权的问题,结果不甚理想。无奈之下,广电总局提出了NGB计划:用3年左右的时间建设覆盖全国主要城市的示范网,用10年左右的时间建成下一代广播电视网。
这是2008年年初,在广电系确定自己的网络目标的时候,电信系也得到了一个好消息:这年2月1日, 《国务院办公厅转发发展改革委等部门关于鼓励数字电视产业发展若干政策的通知》(国办发[2008]1号)出台,史称“1号文件”。文件明确“鼓励广播电视机构利用国家公用通信网和广播电视网等信息网络提供数字电视服务和增值电信业务”。也就是说,电信运营商的IPTV有了身份证。
可惜的是,IPTV这次不再是电信运营商唱本了。2008年的5月,六大电信运营商合并为三家,3G牌照确定发放。运营商把所有的精力放在了3G大戏上。
但此时的广电,开始了NGB的建设。正因为有了NGB,广电 不再坚持单向接入。这时个,国家利益已不再是借口。
三网融合政策顺利求解。
新政将引发连锁反应
此次国家对三网融合显然是寄与了厚望。因为“我国已基本具备进一步开展三网融合的技术条件、网络基础和市场空间,加快推进三网融合已进入关键时期。”三网融合政策的出台,将对监管和产业都产生重大影响。
首先是监管方面,将会进行机构调整。从会议决定来看,国家为提出了推进三网融合的阶段性目标。2010年至2012年重点开展广电和电信业务双向进入试点,探索形成保障三网融合规范有序开展的政策体系和体制机制。2013年至2015年,总结推广试点经验,全面实现三网融合发展,普及应用融合业务,基本形成适度竞争的网络产业格局,基本建立适应三网融合的体制机制和职责清晰、协调顺畅、决策科学、管理高效的新型监管体系。但是谁来主导建立“适应三网融合的体制机制和职责清晰、协调顺畅、决策科学、管理高效的新型监管体系”,没有指出。目前无论是工业和信息化部,还是广电总局,从目前的职能上讲都不能涵盖对方。因此,建立新的监管机构势在必行。
其次,三网融合将带动产业的大发展。因为从三网融合的重点工作来看, 网络建设改造、电信宽带网络建设,推进城镇光纤到户、网络安全监管等,涉及到技术产品开发、网络建设、业务应用等多个环节,必将带一个建设的高峰期。这对于设备制造企业和运营商来说,都将是一个大的市场的启动。按照广电系统的预计,仅一个下一代广播电视网示范网运转成功并投入市场产业化后,预计可带动相关设备制造和信息服务产业的极大发展,形成产业链上下游过万亿元的产业规模。而在回报方面,有分析人士指出,广电进入宽带及数据市场可以在近期内为其创收700亿元。而在在数字电视产业方面,08年1号文件就曾提出目标:到2010年,数字电视机及相关产品年销售额达到2500亿元,出口额达到100亿美元;2015年,力争使我国数字电视产业规模和技术水平位居世界前列,成为全球最大的数字电视整机和关键件开发和生产基地,实现由电视生产大国向数字电视产业强国的转变。
不过,无论是广电还是电信运营商,如何应对三网融合带来的挑战也将是一个问题。对于广电运营商来说,进入电信宽带领域,抢食宽带蛋糕,显然有着更大的优势。据了解,下一代广播电视网建成后,骨干网速率将达到1000Gbps,接入网用户端速率则达到60Mbps,比现有的速率提高了近百倍。有专家就称, NGB项目会让三大运营商只剩下移动业务。但对于广电来说,没有电信运营商完备的支撑系统和服务系统,将是它最大的问题。而对于电信运营商来说,拥有“可以从事部分广播电视节目生产制作和传输”,显然对IPTV业务的推动不大。况且,对于电信运营商来说,IPTV或许会是一个过去式。但基于3G的移动多媒体业务,将是一个有待开发的富矿。
广电整合将是关键 不过,三网融合能否成功取决于广电系的进度。因为对于电信运营商来讲,经过电信业重组后,电信运营商在固网和移动网络融合、电信和互联网的融合方面都取得了显著的成果,有专家称,当前三网融合的重点在于广电网。
一是广电体制如何改变。经过近十年的整合,广电内部网络整合进度并不快。国家广电总局局长王太华在2009年8月南京一个内部会议上强调,全国有线电视网络整合要确保在2010年底前各省基本完成整合,为今后全国广播电视有线网络规模化、产业化发展奠定基础。但这一目标在2010年完成不大现实。有专家指出,广电系统整合在技术方面问题不大,最主要的就是一个体制问题。除此之外,还包括各省市各部门之间的本位主义,整合势必会影响到各个部门之间的利益问题,以及诸如人员安置、养老等问题。因此,广电内部体制的调整如何,将是它能否成功的关键。所以说,国家为三网融合划定了5年的时间。广电网络整合的好坏将直接影响5年的期限。
二是广电必须要厘清媒体的角色和职能。多少年以来,因为体制问题,广电掌握了舆论的主导权。无论将来广电系组建什么样的运营公司参与三网融合,广电部门都需要慎用舆论的主导权,否则,一有市场竞争不利自己的时候,舆论的主导将影响市场的公平竞争。特别是在三网融合的初期,市场竞争方面肯定会出现不规范的地方,在适应三网融合的新型监管体系没有建立起来的时候,舆论的引导特别关键。在三网融合政策出台之前,央视近期大力曝光移动运营业务涉黄内容,批判运营商不作为的行为已引起业界质疑。当然,涉黄违法,移动运营商需要批判。

2010

         真的很久很久没有写blog,在2010年的第一天就快过去的时候,还是写几句话,表一表新年的愿景和期望吧。
         n个星座网站都说2010年狮子座or属鼠的运势不好,不论工作还是情感,压力都很大,可能会很tough很难熬。据说1月份还是最难熬的,会有很多case忙。fine啦,星座这东西看看就好咯。
         想一想自己工作也有大半年了,没啥感悟,没啥心得,总之踏踏实实做事是王道,要相信付出一定会有回报,只是有时候ROI不会那么高。
         正式涉足互联网广告圈,慢慢的向技术靠拢,2010年多学点东西,充实自己,为以后的事业打下基础,我不要做女强人,但至少要有份养得起自己的工作撒~ 再次yy一下我遥不可及的理想:Google AdSense~!!
        2010年或许还会发生人生的另一件大事,八字还没一撇呢,到时候再说吧~
        感谢2009年一直在我身边陪伴我的家人和朋友,祝各位2010happy,心想事成~

我的求职路2009

自从面试过腾讯过后,就很少再写博了。今天把所有的事情的settle了以后,写篇博客总结一下我的求职路吧。

在年初,我就曾经给自己列出了有意向前往的几家公司,本来一直放在桌面上的,后来求职后期的某一天觉得没用就删掉了。能回忆起来的包括google、百度、SAP、EMC、IBM、CISCO、埃森哲、腾讯、MorganIT、交行软开、支付宝等等十多家在上海有分号的公司。现在回想起来,列表上面的公司基本都尝试过了一遍,也基本上和自己的预期没有太大的差别。唯一没有投递简历的应该就是SAP吧,这家现在以社招为主,招的太晚,职位也不合适(有些开发的社招职位其实也可以像Soluna那样去试试)。

IBM

因为实习的缘故,IBM很早就有面试,大概在9月初。之后9月底面了二线经理,在10月中旬拿到了一个挺适合我之前经历的职位offer。口头offer是下来了,但offer letter却一直拖到了11月下旬才到,也给后面的求职路埋下了诸多伏笔。

支付宝:出师不利

由于9月底人在上海,因此错过了阿里集团的招聘。很遗憾错过了蔡学庸,如果我去面试的话,他也不会很尴尬,至少我会知道他是《Java夜未眠》的作者(在南大宣讲的时候听说底下居然无人知晓,另外在面试的时候,我也会勇敢的跳出来接受他对Java和架构的挑战,即使被challenge下来了,我就当认识认识牛人)。10月是阿里各个集团各自出来的招聘。前一天晚上的笔试顺利通过了,第二天一早起来等面试消息,接到通知是9:00,吃完早饭之后又推到了下一天的9:00,我只好爬上床继续补眠。面试本来信心满满,但却备受挫折,在一面时就败下阵来。具体的问题在前面的博文里也描述过了,面的过程也是比较不愉快,很明显我没进入状态,支付宝就当练手把,增长一些经验。

泰珩:大摆乌龙

这是所有求职公司当中最有娱乐过程的一家。宣讲直接投递简历,然后笔试。宣讲时公司抛出了一个神奇的机器,怎么听怎么像忽悠。笔试大题做错,于是放弃希望去了一趟上海。当天晚上接到通知要有第二天回宁面试,囧。纠结一晚后,我不知道是脑袋哪根筋搭错了,居然选择回学校,可能是因为当时手头没有offer保底吧。火车上接到ibm的offer,顿时崩溃。回学校以后,发现记错了面试时间,过去的时候已经过去了一个小时,只好作罢。这件事后来被舍友和LP鄙视了很长一段时间。LP,我错了。

创新工场:找出不足

kaifulee宣讲后的第二天就有笔试,本来以为很多人的,没想到考场都没做满。题目有些正好做过,于是很顺利完成了。下午的面试却表现得很糟糕。一道比较简单的数据结构题目,当场没想出来,一出考场就有灵感了。后来得知这是《编程之美》上的题目。于是之后很快把《编程之美》过了一遍,可能没多少长进,但面试上至少不会吃亏。

摩根IT:阴沟翻船

摩根IT在应届生中基本算是和Google百度一个级别的公司吧,吸引了很多牛人。虽然觉得希望不大,在复旦开的宣讲会我还特意冒着大雨过去了。

之前听说大摩的笔试很BT,拿到试卷之后就被厚度吓坏了–49页。笔试的感觉还行,但走出考场那一刻发现完蛋了:做错题目我以为是倒扣分的,没想到其他同学都告诉我做错不扣分。我大概有6题选择题没有填上答案,而这些题目如果瞎猜也有4成的正确率。而如果选择题得分率达不到一个阈值,后面的大题直接不看–我可是invest四分之三的时间在后面的大题上。

果然电面没有我。后来jetty知道了以后问我要不要让他再试试内推,我谢谢他的好意,但没有让他帮忙。也许一开始我还是想从纯IT做起。以后有机会的话,还是有机会去那里的。

腾讯:偶遇偶像

腾讯也是我目标中比较重要的一个公司。在招聘网站上,职位要求、地点这些东西描述得比较模糊,有种只要是人才就要的架势。腾讯笔试名单发放得比较混乱(面试也是),刷了好几次才刷出结果,确认简历没有被鄙视。笔试的题目也记得不太清楚了,考得比较杂,各个方面都有涉及。当天晚上就收到了面试通知。

面试在苏宁环球酒店。腾讯比较财大气粗,包下了2个类似总统套房的大包间(有大客厅、厨房和3-4个小房间)用来给面试者等待。一面的人简单问了问我的情况,知道我只去上海之后,给我调剂去面游戏开发,让我有些措手不及。游戏开发的面试说难也不难,需要一些简单的算法和计算机图形学的知识。比如矩阵翻转、划线算法和透明度渲染。我凭着6年前开发核埃的一点点印象勉强应付着,面试官也比较有意思。

二面在第三天,等了很久才进去。面试官首先自我介绍是南大的,顿时缓解了一些紧张。之后询问我的游戏开发经历,我只好把6年前的小游戏再搬出来。期间我提到6年前开发资料太少,只有一本《Windows游戏开发大师编程》的译著,面试官问是不是绿色的那本,我说是,面试官直接说,”我翻译的”,然后掏出名片,上面赫然写着”沙鹰”。这可是当年的偶像啊。于是很虔诚的膜拜了一番。后来又知道他是荣国平老师的同学,晚上还要一起吃饭,另外他也认识工作室以前的大牛沈翔(现在在腾讯Boston工作室)。这个心理距离顿时拉近了很多。后面的面试内容因为当时有些激动,不太有印象了。最后沙鹰让我画一幅画,描述我最近想的或者遇到的一件事,搞得我这个没有艺术细胞的人比较头大。草草画了很难看的拔牙图然后逃走。

晚上回到宿舍,冷静下来之后,我又重新开始考虑腾讯。事实上做游戏开发并不在我之前的计划之内,我原有的career plan是进入一家业内规模较大的IT外企开发企业级应用。虽然腾讯也是很不错的企业,游戏开发也是钱途光明,但我并没有做好这个准备,也很难放弃以前在Java/Web/企业应用积累的经验。对于我来说,我认为在IBM或者其他类似的地方开始我的职业生涯更适合我以后的发展。

第二天晚上我怀着忐忑的心情和沙鹰说了我自己的想法。沙鹰一开始有些困惑,后来也理解了我的想法。尽管如此,他还是把我的名字提交到HR面的名单中。能够在找工作中得到贵人的认可是很幸运的,我也很感谢沙鹰。这样的选择是对是错很难说,但我还是打算按照之前设想的道路发展。

盛大:盛情难却

在笔试前,盛大就给我一次电话面试,面的都是Web和HTTP的内容,基本上都回答上来了。由此没参加笔试直接进入面试。电面和正式面试之间,我经历了腾讯,认识了沙鹰,也就没有去面盛大的打算。不过盛大的人很热情,包括HR和面试官一共打了我3次电话,我也不好意思再推辞,就去面了面。

面试涉及技术方面的不多,倒是和我聊了很多团队管理和软件工程方面的话题,也问了IBM的大概待遇。之后的电话二面很囧,之前没有通知,我是从澡堂出来,衣服还没穿的时候接到的电话,只好推迟了5分钟。二面的感觉很奇怪,对方的语气总让我觉得他有很大的疑问。后来也就没有消息。

不过后来听说盛大搞了一个创新研究院,如果能到那里去,应该也是很不错的。不过这次没有注意到有到校园招研究院的消息。

百度:漫长的旅程

百度很早就投了,当时不知脑子哪一根筋搭错了,投了测试,估计那时对C++没有信心把。笔试的名单没有我,于是去霸笔。后来等了很久才收到电面通知(上海的比北京慢近一个月),一共面了两次,还做了一次在线笔试,最后终于等到了一次正式的面试。

面试也是围绕测试进行的,在面试的最后,我也明确说了我应该还是不会选择做测试,百度之旅也到此结束。

EMC:终成正果

EMC是我比较期待的公司,既符合我的职业规划,又有不错的待遇。之前9月底的宣讲会由于我人在上海,没有参加,所以一些招聘计划也不清楚。后来听说今年招聘规模达到了50人,便开始摩拳擦掌好好准备。

应届生里说EMC的笔试很BT,果然如此(虽然我觉得还是没有摩根BT,可能因为我被摩根鄙视了吧)。选择题做对得一分,做错扣一分,是我见过最狠的惩罚机制了,不过我喜欢这样。我放空了没有把握的4道题。大题一共3题,最后一题愣是没看懂(也没碰到同学说看懂的),前两题倒是尽力做出来了,也不清楚对不对。英文的Issue也算是我的长项吧,拟定了几个人物就开始动笔。

EMC笔试刷人很厉害。工学7个人去笔试,一开始只有我收到了面试通知。那会儿虽然拿到了IBM的口头offer,但正式的offer拖了一个多月都没下来,而和我同一批拿到口头offer的同学都已经签约一个月了。于是我决定如果能够拿到emc的offer就直接从了。

EMC的面试在金陵饭店,很不错的地方。在大堂等待的过程中,我看到了中华英才网人手中的名单。EMC在南京面试10人,我的笔试成绩是最高的(后来面试中看到了我的试卷,主要得分在后面。选择题30题,对了23个,错了3个,后面做的两个大题和Issue都拿了满分)。还碰到了笔试面试中的老面孔–计算机系的沈世卿和电子系的张齐。EMC的面试3轮一起进行,3个面试官轮流面3个候选者,正好是我们3个第一批上楼。

EMC的面试没有问很多技术问题,以简历为主。整个面试的过程感觉也比较不错,只有第一个面试官面了一些英文。不知道为什么,从前一直很害怕英文面试的我,终于不在吞吞吐吐,基本上想到了就能说出来,也能在说话中注意语气语调了。也可能是因为面试谈的是我熟悉的领域的缘故吧。第一个面试官是做MyDocumentum的,在面试之前我唯一知道的EMC产品;第二个是做存储系统OS的,听上去很酷。

虽然感觉不错,但没想到接下去却是最漫长的等待。面试完EMC的当天中午(11.23),IBM就打电话确认要给我发正式的offer。最后签约的期限是12.8周三。当时以为两个星期应该有结果了,没想到一直到12.2一直都没消息。正好导师有个项目要马上去常州出差到8号,借着这个我把签约时间拖到了周五(11号)。周四中午IBM给我最后通牒让我第二天一定要结束签约,我只好买好了火车票,并给面我的senior manager发信询问情况,做最后的努力。经理给我了一个很positive的feedback,告诉我第二天之前一定会有消息,我于是决定不管EMC是否有进一步的消息,直接放弃IBM的offer。

于是,很幸运的,也可能是我的push,周四晚上(12.10)6点多,我收到了电话。当电话那头自我介绍时,我就知道offer来了。通话结束的那一刻,我竟然一点也不激动,平静的告诉自己,我要去EMC了。通知了LP,她倒是比我激动得多,呵呵。

回过头来,我选择EMC而放弃IBM,在外人看来似乎会有些奇怪。毕竟我比较熟悉IBM,而IBM的产品和工作也与我的专长很对口。在面试IBM的时候,我也提到了EMC,说EMC主要从事存储,和我的特长不是很相符。

事实上,我是对一些中间层和底层一直有浓厚的兴趣,这个兴趣在后来找工作的过程中也不断的发酵。比如看的一些操作系统、网络方面的书籍,比如《程序员的自我修养》和《TCP-IP详解》,另外还看过一些JVM的代码,让我觉得,如果打算在技术上有所成就,需要对底层有扎实的基础,这样在参与应用工作的时候才能游刃有余。对于以后的发展,我希望能够从事与高可用性、高伸缩性、高并发性系统相关的工作。如果之前一直是应用层的经验,在以后的开发可能会有些捉襟见肘。

回到IBM和EMC,我进入IBM以后,应该可以预见是做老本行–Java Web。这方面如果做好也会有很好的发展,但是我希望能巩固一下一些底层的内容。EMC的话,可能一开始也是做一些应用,但有一些机会能够从事中底层的开发,这是IBM不能提供的。另外,IBM的内部文化比较像国企的,个人感觉是有点活力不足。

上面是一些个人的愚见,也许过几年来看,都是一些比较愚蠢的看法,也肯定会引起一些争议。如果有前辈或者网友愿意探讨或者拍砖,也欢迎留言评论。

CISCO:建立信心

CISCO的招聘是IT类公司里启动较晚的,直到10月中下旬才开始宣讲,11月15号才笔试(这个时候应该已经有一些公司发过offer了)。笔试的地点和EMC一样,都在南理工(可能是chinahr考虑了租金、容量等因素),而那天正逢降温,因此笔试的人数只有发放通知的1/3左右。我那天早上从上海赶回南京,在回宁的火车上把TCP/IP详解简单复习了一遍,看了看TCP/UDP,SNMP,TFTP,FTP,DNS这些协议,考试时还正好用上不少。另外比较UNIX部分还考一些很细的Linux知识,比如一些命令的选项,如ls,mount等等。考得不好也不算坏,不过看在这么少的笔试人数,应该还是有面试的机会。

果然两个星期后通知面试,还是我找工作第一次去上海面试(本来以为至少一个月跑1-2次的,没想到到最后也就1回,还是在最后)。思科在漕河泾,我从中山公园出发,换了一次地铁很快就到了,心想如果以后上班能够如此神速也就满足了。面试有4轮,一个HR,其他三个是技术或者项目面试。面试的内容不难,面试有点像闲聊,值得一提的是,有个很有意思的男面试官,像探讨问题一样在进行面试,在你思路中断的时候也给你一些小提示,让人感觉很好。

这次的面试最大的收获应该是其中的英文面试环节。不知道是因为手握offer不紧张,还是之前积累了足够的listening的经验,英文面试中再也不是一字一蹦地开口,基本能够做到思路和语言的同步,思考的时候有点感觉,有时可以绕过中文思考-翻译-英文表达的环节,直接从脑子中映射出英文。虽然语音语调还是比较蹩脚,但至少再也不会害怕开口说英文了。

不过思科还是没能够拿到offer,除了对嵌入式开发和Linux的经验不足,另外就是我向hr透露了已经拿到ibm offer的缘故吧。不过虽然cisco招聘开始得晚,但是最后给offer还是比emc快一些,面试完的下一周就通知了(面试是周末)。

其他

MSTR,INTC,GOOG,SAP

前面两家挂在了简历关。INTC似乎只给上海学生机会,而MSTR在开发的职位上直接把软院的BS了。GOOG今年内部有些大变动,招人也晚,而且估计基本上不招人。SAP很晚才出来招,而且只放出来两个技术支持的职位,如果想进去的话,可以去51job上搜SAP要求较低的社招职位,投投简历试试看,我一个同学因此拿到了SAP的offer,虽然最后她去了NI。

小结

首先最重要的是积累。如果没有积累的话,面试中会觉得和对方能讨论的话题不多,也容易被面试官牵着鼻子走。这个积累包括了项目经验,这也是我主要的积累来源,但也觉得有些不足,特别是很遗憾没能把VeryFTP或者VirtualCampus甚至核埃给做完。研究生期间参与的APIS事实上更多是对我项目和产品管理的锻炼,项目本身并没有什么能拿得出手。参与一个牛B项目的开发能让面试官给你长很多分。积累包括算法,如果有ACM的经验尤佳。对于没有ACM经验的普通大学生,除了认真上好数据结构算法课以外,最好在开始求职前半年到一年的时间就开始准备,时间多的看《算法导论》,时间少一点的可以看《算法概论》,并挑一些上面的题目做做。另外《算法之美》要保证在第一次面试前就看过一遍,虽然有些投机取巧,但至少能保证你不会因为漏过了书里的原题而吃亏。其他的如果还有时间,也可以去做做OJ上的题目,国内应该算北大的POJ比较有名吧,还有就是Project Euler,可以试着一天做一道(前面的题目简单可以多做几道)。积累还包括编程语言、操作系统、网络这些计算机基础知识,可以在求职前的暑假好好复习,可以帮助你通过大部分公司的笔试关。

第二是心态,主要是一个渴望得到这份工作的心态。在面试支付宝时,我基本上是抱着练兵的态度去的,但也没想到会在第一轮就被拒之门外。而盛大的二面,面试官让我比较难接受的语气和没有准备的面试环境,使我一直想结束这尴尬的面试。面Cisco时,已经拿到了ibm的offer,因此也没有表现出渴望的心态。相反,在面试EMC的时候,我的offer已经delay了一个月(之前也听说过delay以后然后告知没有headcount的情况),让我坚定了一定要拿到EMC offer的决心,在面试的时候也明显流露了出来。

第三是规划

准备,准备指求职的规划和针对公司的专门准备。虽然已经有了积累,但大部分人是不可能只通过积累而不专门准备吃定所有公司的。因此在笔试面试前需要对公司的情况做一个大概调查,不打无准备之战,毕竟倒在”我们公司有什么主要的产品”这种问题上是很冤的。而这种准备本身花的时间也不多,对以后的工作也有些用处。另外如果在应届生上或者其他地方有这家公司的笔试面试题也最好能看看,大概知道这家公司是从几个方面考查候选者。

这篇求职总结的博客从月初开始写,拖到了2009年的最后一天才发表,算是给2009年也做一个小结吧。最后祝大家新年快乐!

推荐一个很有意思的Geek装备店

为了保证和技术的lg有共同语言,偶努力提高自身修养,努力做一头技术熊,开始用gmail,开始玩twitter,开始控Android,开始偷看老爸订的Geek杂志……(越写越像思想汇报~囧)
言归正传,昨天在twitter上看到推友的介绍,发现了一个超爱的taobao店(我是购物狂+淘宝控……掩面~),掌柜很有才啊,把twitterwordpress做成马克杯,简称“悲剧”,把twitter做成围巾,简称围脖(微博)~~~ 崇拜一下创意~

无图无真相,来晒一下我在geekcook.taobao.com败的装备:

t1djrpxd4dxxx3igyx_115323_160x160

重播一遍店址:geekcook.taobao.com~ hoho,大家要是打算买东西喊我哦,偶们组团~ ^_^
p.s. 似乎这些图片都没水印,掌柜要小心图片被盗用

百度在线笔试

上上周百度又让我参加了一轮在线笔试。今天忽然在桌面上看到于是就贴出来。
第一部分、算法与程序设计
1.在一棵一般的二叉树中找到指定的元素,如果有重复出现的元素,要求元素为深度最深的任何一个。指定元素找不到时返回EMPTY_NODE,请用C语言实现,相关数据结构与函数声明如下:
struct Node
{
int iValue;
int id;
Node *pLeft;
Node *pRight;
};
const Node EMPTY_NODE = {0, 0, NULL, NULL};
Node findDeepest(Node *pRoot, int iWanted); //pRoot为根节点,wanted为指定元素的iValue
2.一个单词字典库,单词个数约为10万,每个单词长度不超过16,单词都是由小写字母组成,同时给出16个小写字母,请设计一种高效算法来找到用这些给出字母拼出一个字典中最大长度的单词。给出的16个字母每个字母最多使用一次,也可以不使用。存在多解的时候给出任意一个最优答案就行。
例如:给出adeenrstuvxyzuki可以拼出adventures
请详细描述你的算法思路(如需要,可给出代码\伪代码来辅助描述),并分析其时间复杂度。最后请分析下你的算法以及数据结构的优缺点,存在哪些可改进的地方。
第二部分、系统设计题
1.       有200亿条数据,每条数据的大小在1K~1M不等,每条数据有一个唯一的u_int64的id。
请设计一个读取数据系统,能根据id获取数据。要求:
A.        内存有限制,16G
B.        尽可能利用内存资源
C.        尽可能高效的获取数据
D.        可以利用磁盘,磁盘容量不受限制
2.       C2C网站的商品子系统,包括的关系数据有 分类、属性、商品。
一个商品只能属于一个分类,不同的分类有不同的属性(多个),每个属性有多个候选属性值,其中分类、属性、属性值的更新频率较低。
一个商品的属性,是所属分类的属性,属性值是候选属性值中的一个或多个。
例如:
分类:衣服
属性:尺寸、颜色
尺寸的候选属性值:S/M/L/XL/XXL/XXXL
颜色的候选属性值:黑/白/红/黄/蓝
商品:衣服A,尺寸S,颜色黑
另外,商品还有卖家、价格等其它信息
请设计商品子系统的存储结构或数据库结构。要求:
A.        能够正确维护分类、属性、商品之间的关系数据
B.        尽量减少冗余
C.        考虑数据的增、删、改、查操作,效率尽可能高
D.        能够按照卖家查询出其发布的所有商品
==============问题和解答的分割线======================
1111111111111111111111111111111111111111111111111111111111111111111111111111
Node findDeepest(Node *pRoot, int iWanted); //pRoot为根节点,wanted为指定元素的iValue
{
return findDeepestWithDepth(pRoot, iWanted, 1);
}
Node findDeepestWithDepth(Node *pRoot, int iWanted, int depth)
{
static int maxDepth = 1;
static Node deepestNode = EMPTY_NODE;
if(pRoot != null)
{
Node l = findDeepestWithDepth(pRoot->pLeft, iWanted, depth+1);
Node r = findDeepestWithDepth(pRoot->pRight, iWanted, depth+1);
if(isEmpty(l) && isEmpty(r))
{
if(maxDepth < depth)
{
maxDepth = depth;
node = *pRoot;
return *pRoot;
}
else
{
return deepestNode;
}
}
else
{
return deepestNode;
}
}
else
{
return EMPTY_NODE;
}
}
bool isEmpty(Node node)
{
return node.iValue == 0 && node.id == 0 && node.pLeft == NULL && node.pRight == NULL;
}
2222222222222222222222222222222222222222222222222222222222222222222222222
1. 对字典中每一个单词进行遍历,计算出每个单词每个字母的个数和单词的长度
2. 针对每个单词里每个字母(a-z)的个数和单词的长度建立索引,类似数据库的一张表,表一共有28个列(加上一个隐含的rowid),包括单词内容(1列),26个字母每个字母的个数(26列)和单词的长度
3. 搜索时,对给定的字符串进行相同的统计,计算出每个字母的个数。根据统计结果去搜索个数小于给定字符串字母的单词的rowid,最多16次搜索,搜索后对结果进行交集(思想类似: select word from words where a <= 1 and b <= 1 and d <= 2 and …)
4. 对最后的交集根据长度,得出最长的单词的rowid,最终得出单词
时间复杂度: 16次搜索,每次为O(log n),最多15次的交集运算,复杂度为O(logn * logn),最后寻找最大值可以忽略,所以时间复杂度为O(logn*logn)
改进:提高索引效率,如联合索引
33333333333333333333333333333333333333333333333333333333333333333333333333
1. 内存中使用二叉搜索树进行索引,每个节点占用16字节(2个指针+1个id),可放10亿个节点,则底层节点有5亿个。底层节点左右为空,8个字节用来表示记录在磁盘的存储位置
2. 磁盘存储分为5亿块,每个块里有40条记录
3. 块分为块头索引和块内容。块头索引按id顺序排列,包括了该块的id,起始位置和长度。块头大小为40*(8+8+4)=800字节
4. 每次通过id访问数据,首先查找二叉搜索树,经过29次内存比较得到索引块,再载入索引块头,使用二分搜索得到内容的起始位置和长度,最终得到内容。一共35次左右内存访问和2次磁盘访问
44444444444444444444444444444444444444444444444444444444444444444444444444444
商品表 product: id, name, seller, price, category
分类表 category: id, name
属性表 attribute: id, name, category_id, type
属性候选值表 attribute_value: id, attribute_id, value
商品属性表 product_value: product_id, attribute_value_id

OpenJDK6 build小记(Ubuntu 9.10)

之前在twitter上喊喊要研究JVM,今天算是迈出了第一步,从源代码编译openjdk。openjdk现在有6和7两个版本下载,现在7还在milestone 6的阶段,也暂时没什么需要尝试的新特性,另外openjdk6的代码大小只有openjdk7的一半(近50M对114M),于是选择了openjdk6来进行构建。另外,jdk6提供官方下载,这样也方便了和官方版本进行对比。
事实上,根据官方的描述,openjdk6的代码是基于jdk7 b20和jdk6的update的,openjdk7的代码是基于jdk7 b10,很奇怪的代码来源。因为sun是在jdk6开发的晚期才宣布java的开源,于是先开源了java7成为openjdk7,然后再发布了jdk6之后才重新整理代码,从jdk7 b20里剔除了java7特性的代码,发布了openjdk6。现在jdk7的概念等同于openjdk7,但jdk6却和openjdk6不是一个东西。
openjdk的主页的左边栏有众多的链接,主要分为Groups和Projects,似乎是有一些工作组从事不同的项目。不少栏目里都有很多有用的资料,有兴趣的可以看看。其中有一个Build的工作组,负责构建工作,里面有关于构建的官方指南
代码的下载可以用Mecurial来下,也可以下打好的bundle,应该大部分人会选择后者,Mecurial毕竟还是小众的版本配置工具,需要python。
代码构建的过程基本是按照官方指南一步步来的。我的构建环境是虚拟机中的Ubuntu 9.10(BS一下自己,硬盘上就有早就装好的Ubuntu 8.10,只是因为懒得离开Windows)。除了Linux平台,openjdk6还支持在Solaris和Windows上的构建。Linux使用gcc(4.2)编译,Windows使用VS2003(也有2005成功的例子,。而openjdk7的构建文档直接要求VS2008)。GNU make是构建工具,所以Windows下还需要cygwin。
构建的依赖在ubuntu下很简单,用下面的语句搞定。在9.10下需要下载很多东西,最大的是llvm的binary和开发包,不知是用来做编译还是虚拟机的。

sudo aptitude build-dep openjdk-6

另外需要安装openjdk6当作bootstrap jdk,还需要libmotif开发包

sudo aptitude install openjdk-6-jdk libmotif-dev

接着,设置一下环境变量

export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk

然后直接在源代码的目录下运行:

make all

就开始构建openjdk6了。昨天我没好好看文档,自己去设定了motif, binary plugs, freetype的环境。还在错误的目录下运行了make,因为在子目录下make是部分构建,所以一直报错,找不到ALT_JDK_IMPORT_PATH。最后也还是自己折腾好了,但不知道是ubuntu早就下好了依赖,还是自己设置好的。
构建完成后,可以自己运行代码目录下build/linux-i586/bin下的可执行程序,比如java
这个时候版本号成了

./java -version
openjdk version “1.6.0-internal”
OpenJDK Runtime Environment (build 1.6.0-internal-marshall_15_nov_2009_21_53-b00)
OpenJDK Client VM (build 14.0-b16, mixed mode)

对比原有的信息:

java -version
java version “1.6.0_0”
OpenJDK Runtime Environment (IcedTea6 1.6.1) (6b16-1.6.1-3ubuntu1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)

另:在我分配了512M内存的ubuntu上,编译时间大致为1个小时。构建有警告提示内存太少,会影响速度。明天放到非虚拟的ubuntu下跑试试看。

创新工场笔经+面经

昨天李开复来南大做宣传,下午的交流会我去笔试了摩根,没去。后来听说有创新工场的笔试,于是决定过去打打酱油。
本来以为考场会爆满,找找到了蒙民伟楼109,发现居然还没看门。直到考试开始,109也没坐满,还是隔着坐的。
笔试比较简单,三道题60分钟。第一题要求做一个句子的reverse,但保持单词内部的顺序不变。我用了java的split方法,有点作弊了。一般的方法就是全部reverse,然后一个单词一个单词的reverse。第二题类似打印螺旋矩阵,但是是输入x,y,输出值,程序员面试宝典上看过的题目。第三题是生成二叉搜索树,也不难。
下午的面试比较悲剧了。先谈了谈项目,聊了聊技术难点,似乎面试官觉得这个没什么。然后是数据结构题。要求写一个Stack,使得push, pop, minimum三个方法的时间复杂度是O(1)。minimum即返回栈中最小的值。我想了半天没搞定,一出门一拍脑袋就出来了。只要在push的时候,如果碰到比当前min更小的数字,就把当前这个数字链接到之前最小的数字,以便这个值被pop的时候恢复min。
面试肯定是挂了,没有引起对方的兴趣,题目也没做出来。算是继续积累经验吧,至少比支付宝的面试有提高了。
小结:面试时如果要谈项目,最好是能让对方感兴趣的项目。我提了apis,因为我觉得我比较熟悉。事实上应该提VeryFTP,这个有更多技术的东西可以讨论。比如资源的匹配算法。第二,做程序题不要着急,理清思路再下手,当然这个是需要积累大量的面试经验后才能练出来的。