Blog of Ditsing

三日不读书,便觉言语无味,面目可憎

FB第一周

| Comments

又是一篇跟技术毫无关系的博客,技术控们可以直接绕过了。

八月二十五日十点我坐飞机从郑州出发,八月二十五日十一点到达旧金山,飞了足足十六个小时。海关什么的没有传说中的那么吓人,问了一句话就放行了。出关的时候遇到一位学油画的姐姐,都已经工作了,又突然想来旧金山接着深造。当时觉得这个姐姐很面熟,后来才想起来,真的好像好像陈蓓学姐啊(嘘……..)。

下一步是坐地铁,花了一个小时换开零钱,买了票走进车站。火车马上就要开了,身后一位黑人大姐冲过来问我说要去哪儿,我说“Millbrea”,她拉着我就上了火车,然后指着地图跟我说,如果你想去那儿,你得这样,到这儿下车,然后换反方向坐回来,坐两站,两站就够了。生怕我听不懂重复了好多好多遍。下飞机就见识到了米国人民的热情,我的心情突然好了起来。然后是转车,再加上四十分钟的步行,我找到了公寓,收拾一下倒头就睡。晚上睡醒了我发现最近的超市在4公里外。饿啊,还是步行去采购了点看上去能吃的东西。

二十六号我度过了无聊的一天,手头是各种文件、各种表,各种邮件。晚上还经历了大概是六年来最长的一次失眠。忘了说了,住的地方条件还不错,两室一厅加厨房卫生间,地毯大床,可惜的就是卧室见不到阳光,所以我总是待在客厅里。

二十七号是正式上班的日子啦,坐公司的shuttle到了总部。在大堂等了半个小时,HR姐姐终于来领人了。然后是早饭和长达一个上午的演讲,我得坦白说我没听懂什么。下午是发装备和Setup,手机和电脑到手。当时还是很开心的,不过装备都是旧的。一天下来我困的都要死了,晚上回到宿舍却继续失眠。躺在床上,我无奈的翻出了三毛的书,看了足足一个晚上。三毛是个会用全身每个毛孔品味感情的人,她的文章纯粹而深切。真好。

二十八号早上我成功的爬了起来,上午继续开会,下午大家被召集起来学写代码。布置了第一个作业叫做first_assignment。所以你们知道FB的人有多无聊了吧。接下来的三天我这个assignment绊住了,所以你们知道我有多无聊了吧。

期间我跟我的mentor见了面,讨论了我们要做的工作。这周余下的时间基本在无聊和无聊之间度过,看代码,看wiki,尝试写点PHP。纠结的是跟人沟通特别不通畅,别人稍微说难一点的词汇我就听不懂,自己想说什么基本就是说不出来。好在我天生脸皮厚,连比划带猜,终于把上班时间混过去了。

回到家里的时间也很难熬。室友是康奈儿(Cornell)大学毕业的高材生,已经在美国住了10年了。据传该大学是米国最难毕业的大学之一。我很想跟他聊聊,可是无奈我们俩等级差太多,我基本没法跟他沟通,连跟他请教个洗衣机怎么用都要比划半天。两个人相对无言,自己玩儿电脑。二十九号白天就在纠结作业中过去了,漫长的周三啊。这天晚上又饿又睡不着,我尝试了做俯卧撑,看电影,看书等等方法,最后实在没辙了,拿出爱疯听广播,米国怪叔叔讲故事。好吧,终于睡着了。

结果呢?一觉睡到大天亮,早上十点才醒过来。所有shuttle都走了,但是十一点还要开会的啊混蛋!我只好自己坐公交去上班。从家里到公司不远,但是要倒车,先#35再DB。我首先成功的看着一辆#35从我眼前开过,没有赶上——米国的公交都是一个小时一班的好不好!我决定走到DB那里去。走了半个小时之后第二辆#35从我身边超了过去——我###。等我花了四十分钟走到DB站点的时候,发现自己没有带够零钱,而且下一趟DB又要四十分钟之后才过来。为了度过这四十分钟,我就近找了一家人讨了一美元,这才得以上车。可是这可恶的DB居然没有报站,当我决定要下车的时候司机告诉我,“No more stops here.”。于是我被迫跟着DB一起跨过了旧金山湾才得以下车。旧金山湾啊亲!!然后呢,我花了一个小时等下一趟DB,再坐回来。好在两趟车是同一个司机,没有多收我钱。我到公司的时候已经两点了,嗯,直接去开下午的会好了。

周五一天无言,配置服务器、bash、git、vim、python、screen,都是这些东西。下午的时候我发现,周六早上有一场TC,好开心啊。我趁着早上两点多睡不着觉的空档配置了Vim、Topcoder Arena和插件,花了一个多小时,然后终于睡着了。周六的TC跌了20点Rating,不过还是很开心。开心得决定下午去买一辆自行车。到了店里我直接告诉店员,我有350美元预算,给我推荐一辆吧。于是我拿到了和室友一样的车——山地车里最便宜的那种了。有了车生活就美好一点了,买东西吃、东逛逛西看看。

周日我买了米,在家里学煮粥,跟室友一人半碗。以后想吃好吃的、口味清淡的就只好自力更生了。

周一,我去了旧金山。对呀,周一是Labor Day,放假!本来拟去找中国大使馆的,坐了一个小时火车、又骑了一个小时山地自行车——感觉旧金山就是在山上的——到门口才意识到,啊,他们也放假,SXXT!我只好简单逛了逛旧金山,惆怅的回家了。回来我也没闲着,尝试用电磁炉蒸一锅米饭。从五点忙活到六点,一部纪录片都看完了,米饭里的水终于基本上蒸干了。一尝,熟的!

周二呢?写了一天python脚本,数据库什么的,然后在这里写流水账。流水账写完了,下面的生活就该步入正轨了。豁免拿不到就拿不到吧,回国也挺好,还可以在爸妈身边。Fighting!

最后祝愿今后我大HIT的毕业生都能找到自己的归宿,学校给不了我们什么,全靠自己了。

Google面试

| Comments

两个星期之前的一个周五下午,我正在家里寂寞的学着JS,一封突然到来的邮件打破了我宁静的生活——”Greeting from Google!“。眼看明年的工作还没着落,我欣然接受了邮件里的面试邀请。跟一个Google中国的HR用英文发邮件是件很奇怪的事儿,不过HR很给力,我的面试日期很快就定下来了。

Google面试的风格跟我面的其他公司很不一样,每次都会要求自我介绍——就是介绍自己的项目。各位有志于Google的童鞋最好先准备一下。顺便提一句,我每次说的项目都不一样哦。

一面是这样的,首先是自我介绍——blablabla说了点。然后是一道很无趣的遍历二叉树的题,面试官规定了我需要实现的函数的原型,让我先说说想法然后写代码。我说了一个做法,然后实现了另外一个(囧)。最后面试官给了一道题目:

求一个数字集合里最长的连续数字串的长度。例如{ 1 2 9 10 11 3 12 7}中的{ 9 10 11 12}

我的第一反应当然是排序了。面试官问有没有更好的解法,经过他的提示我想到了Hash。但是在估计复杂度的时候,面试官坚决不同意我“可以认为Hash中的冲突很少”的看法。所以我得到了O(N^2)的复杂度。事后我一想,不能认为Hash冲突很少我还用个毛Hash 啊!面试完的那个晚上我没有睡着,脑子里全是这个问题,但是没有找到更好的方法。请问各路大神,这题有没有更优的解法?

二面同样给我留下了深刻的印象。自我介绍,blablabla。面试官出的第一题是从一个数字串中找到最长的递增子串。很显然是O(N)的对吧,面试官问我有没有更优的。我嗯啊呀哈了五分钟之后,面试官说,如果要求递增的差为1,有没有更优的方法?我….扯了一个没有用的方法给他。第二题是二合一,首先面试官要求我求出一个线段集合里相交的线段。我先搞了一个naive的线段合并,可以判断出某线段是否和别的线段相交。之后面试官增加了要求:

输出线段集合中的相交线段的子集,如果线段A, B, C, D中,A, B, D两两相交,BC相交,AC不相交,输出集合{A B D}{B C}

我首先给出了离散化并查集的O(N^2)方法。有没有更优的?我当场怀疑这样的集合会有O(N)个,每个会有O(N)个元素。但是当时没有找到这样的例子,于是扯了一个Splay延迟标记维护的方法并号称是O(NlogN)的。事实证明,还是存在能让输出复杂度达到O(N^2)的例子的。我又花了一个晚上才想到的这个例子。

不管怎么样,我拿到了Onsite的资格(八成是考虑到竞争对手的Offer吧)。Onsite就靠谱多了,至少题目都是可以答的。

一面第一步照例是自我介绍,blablabla。第二步是个不太难的题目,跟线段相关的。题目不重要,重要的是面试官首先要求我详细的叙述我的想法,之后在纸上写伪代码,最后要求我翻译成代码,并且要用设计合理的函数完成这个程序。第三步是个加强版的题目,因为时间不多了我草草写了几笔。

中午跟面试官一起吃了饭,畅谈了一下人生理想。面试官建议我不要急着工作,先去旅旅游见见世面,还跟我分享了他当年单独去越南旅游的经历。我本来还想明年先来实习呢,但是现在觉得,玩儿命工作还是享受人生,这是个问题。顺便说一句,Google上海的自助餐厅大概只能容纳100人,借此可以估计一下Google上海的规模。另外,盛传Google中国没有什么技术类的活,其实不是的,他们还是负担着非常多的开发任务的。

二面的面试官是一个比较威严的工程师。他的题目也很有意思,都是比较偏向于数学的,每次除了描述想法之外,还要求有非形式化的证明。他在我证明的过程中要求我澄清几乎每个概念,力求严谨。猴神可能会比较喜欢这样的题目。两道这样的题目之后,面试官出了一道Design的题目,要求我设计一个关于指针的工具类,并独立做出各种决策。在考虑了N多问题之后,我卡在了拷贝的实现策略中,超时了。面试官安慰我说这样的题目是没有一个固定的答案的,讨论的过程更重要。

这样我的四次面试就结束了。虽然我自我感觉良好,但是我的表现实在不很完美。也许我应该等结果出来再来写这篇得瑟的博客。但是现在,我还是抓紧享受一下生活吧。

松一口气

| Comments

相比@bearzx和@luyi0619,我对自己的博客可以说是非常疏于管理了。转眼间又一个月过去了,我还是什么都没写。考完GRE我就彻底的放松了,一边心里想着“这说不定是我大学时代最后的几门课了”,一边堂而皇之的逃掉。唯一一门放在心上的课是软开三。疯了一样的做了两周,成果还是有点不尽如人意。还好我还有很多时间,课程结束了也可以接着做。虎头蛇尾什么的最讨厌了,我一定要把XFS这个项目做完!

7月1日这个神圣的日子之后,我就又忙碌了起来。忙什么呢?准备申请签证要的各种材料。材料总的来说有三类,分别是米国方面的表,学校的成绩单和注册证明,家里需要开的财产证明(其实根本没有人看)。这又少不了一通邮件电话,以及往学校的教务处跑。在这里我不得不吐嘈一下学校了,我在学校开了一份英文注册证明,一份英文成绩单,还有一份六级的成绩证明,办的是加急业务,学校收了我140块钱。其中竟然包括30块钱的成绩单的翻译费,理由是要把成绩单上所有课程名字翻译成英文——难道学校会单独翻译每个人的成绩单上的每一个课程名吗?这就是立志要建世界一流大学的工大的做派。

跑题的话不多讲。材料齐备之后,我填了申请表格,预约了7月9日在沈阳领事馆的面签。结果7月7号我在网上闲逛,突然发现申请表格里最后两个证明人写错了!要求是中国人,结果我写了俩米国方面的联系人。当时我就傻了,因为重新填表已经来不及了。还好有经验丰富的同学指导,告诉我无所谓,让我到使馆了再想办法解决。

又要往沈阳跑一趟了,还好我上次考GRE的时候已经来过一趟,对北站附近比较熟悉。稍微做了点调查之后就出发了。几经波折终于熬到了第二天的面签。过程不多说了,签证官非常信任我,一听说是去Facebook实习的几乎没问我什么实质性的问题。他甚至问我“你是在Facebook中国工作吗?”临走的时候他还让我“Bring Facebook to China”。这样整个签证过程就结束了,我要做的就是等着收快递了。

本来想的是这个博客只谈技术不说生活的,可是最近这半年里实在没有什么技术可以谈。我还谋划过要写一篇关于XFS架构的文章,一篇关于基地网络的文章,一篇到沈阳考GRE和签证的攻略。各位也看到了,一个都没有写出来。在此立文为证,这三篇一定要写出来。尤其是关于基地网络的,暑假开始了我就离开学校了,在这里集训的学弟们肯定会碰到不少网络的问题,我得把我知道的都告诉他们。

最近有人问过我关于学校的看法,我毫不犹豫的表达了我非常负面的感情。想起当年面企鹅的时候,面试官也问过我类似的问题。我当时的回答是,如果说学校对我有帮助的话,更多的是硬件上的帮助:给我提供了宿舍食堂和全天可用的ACM机房;我的同学们给我的帮助和影响更大,没有ACM俱乐部这些人,我肯定混不到现在这样。至于学校呢,给我印象最深的几件事依次是:作业纯抄袭,考试往年题;实验抄数据,项目不出力;团委活动多,自愿必须去;瞎评奖学金,不服书记急。当然工大也有像lord和sunner这样有远见的老师的,也有像唐奶奶和李建中老师这样神一样的存在的。在工大读书,是一件挺悲哀的事儿;在工大遇到好老师,是阴霾的天空里单薄的一缕阳光。殷切希望工大能少耽误几个学弟学妹。

本学期再没有什么能让我上心的事儿了,休息,休息。准备好接受下一个挑战吧!

临时小记

| Comments

晚上回完邮件放松的时候,突然听到@icek童鞋说要写博客。爬上来一看我已经有足足两个月没有写一个字了,都对不起我买域名那五十块钱。

那最近两个月都干什么了呢?记得做了很多事,具体有什么忘了,大概是写简历啊面试啊参加比赛啊….还有,回邮件啊什么什么的。还好我养成了写note的习惯,可以翻翻自己的note找找过去的足迹。还有G+上的post可以作为佐证。

4月份面完微软之后,我生活的中心有三件事(4月29日的note):

  1. compiler,也就是编译原理的课程和实验;
  2. jwc,就是那个破项目,那时候基本已经完成;xfs,就是那个破项目,你懂的;
  3. GRE,在@luyi0619和@bearzx同学的带领下,我也来搞一搞G;

所以这一段呢,生活无非就是按时上课,有空写写代码,没事儿背背单词——虽然效果很差。当然这时候Facebook的事情已经基本有了定论,心里就不是那么在意了。GRE和XFS在我心里是非常非常重要的事儿,都是关于前途的。当时确实挺蛋疼,每天在G+上贴自己读XFS代码时的“新”发现,却没想起来去讨论区里写个总结。五月四日确定收到offer之后小小的高兴了一个星期,收到了无数的祝贺。兴奋很快过去,心里清楚需要完成的事情还是太多,焦虑卷土重来。

总的来说这一段状态还不错,期间还做了TCO和GCJ,跟大家欢乐的刷题的日子将是我一辈子最珍贵的回忆。

随之而来的是5月8号百度的面试,想去刷一刷,结果错过了投简历的时间,内推又莫名其妙的没消息,只好作罢。忙里偷闲修了几个jwc的bug,检查了检查自己的简历,发现自己之前居然连电话和邮箱都没留,怪不得没人理我。这一段的状态非常不好,累,没有什么成就。

5月14号Facebook那边传来了一个非常不好的消息:我只能以交流访问学者(J-1 visa)的身份过去实习。这跟H1B工作签证有本质区别啊!为了这个问题我纠结了好久,不过显然实习机会不能放弃,就算实习完之后不能再去米国,在国内G啊M啊甚至B啊T啊A啊找个工作也可以接受。

5月20号是ACM俱乐部的春季校赛。坦白说我没给这次校赛做什么实质性贡献,出了两道最水的题,帮助维护了一下现场秩序。在@icek童鞋的领导下,校赛很成功,奖品发的也让大家很高兴,作为一个半截入土的老ACMer,真的很欣慰。

话题回到实习上来。接受J-1的无理要求之后,HR扔给我房子和机票的链接,于是我开始了漫长的定房子与订机票的过程。眼看办签证也已经迫在眉睫,我连个护照都没有。但是,办护照要回家啊回家啊回家啊!付出逃课一星期的代价,我回家一趟搞定了护照,还请老爸帮忙办了一张信用卡。在家的时候还下河走了走,都忘了自然是什么样子了。

回顾一下你会发现,我完全无视了最初认为很重要的编译原理。我现在仍觉得它很重要而且非常后悔这么课里自己什么也没有学到。分数上的差别不是问题,问题是学习的时机稍纵即逝,以后我可能再也没有机会回到这一课题上来了,淡淡的忧伤啊。

还是忍不住要说说实习,5月份我跟HR、租房子的公司、卖机票的公司、律师事务所、交流项目赞助商来来往往发了无数封邮件,超过我之前二十年发过的邮件数的总和。Thank you说了无数次,ask for help了无数次。作为一个英语只能用于应付考试,一篇140个字的作文被挑出10几处毛病的naive user,我在这中间的遇到的困难是你们无法想象的。还好这几位都非常nice,这些事情基本都顺利的搞定了。

仿佛瞬间就到了6月。完成任务并不能为我的生活减轻一点压力。6月16日的GRE考试已经近在眼前了。为了不浪费上千块钱的报名费,我决定放弃两个星期的课专心复习。打印了36套阅读,下载了模拟考试的软件,每天背着红宝书跑来跑去。我甚至有点享受这样的生活了——没有deadline的压力,没有纷繁复杂的日常琐事,只有简简单单的一个目标。提前一星期买好了火车票,做完了前期的功课,6月15、16日的沈阳之行异常顺利。在沈师找到了一个紧邻着学校围墙的小旅馆安睡,早上跟大家一起跳墙到机房去考试。考完觉得分数基本在预料之内,安心返程。

时间已经是6月下旬,大三最后的四分之一个学期。唯一剩下的任务就是XFS。我已经近一个月没有好好写代码了,重回开发状态确实很不容易——保留、恢复现场的能力实在是略差。写代码对我来说应该是非常幸福的事情,好好享受这最后一段平静吧。

微软霸王面归来:怒!

| Comments

今天早上六点我从睡意朦胧中醒来,开始了今天的MS霸王面之旅。

洗漱吃完饭加上各种杂事,我们一行四人到达香格里拉酒店的时候已经是七点半了。卢大神有面试通知,直接去面试了。icek大神,canoe大神和我尝试与HR姐姐沟通争取面试机会。第一被秒的是icek,他被秒的非常欢乐,具体细节不说了。HR姐姐留下了canoe学长和我的简历并承诺替我们找机会,因为面试官都很忙。十点卢大神面完了出来我们才被告知12点之前不会有时间了。于是我们三个就回到了学校。卢大神的情况貌似还不错,我们也都挺高兴的去上了半节编译原理。

中午十二点,我们基本放弃了希望,中午还没有通知肯定就是没戏了。但是我们吃午饭的时候,canoe学长突然接到HR的电话,要我们下午一点到酒店笔试。我们俩二话不说打车直奔香格里拉。拿到面试题之后HR给我俩就近找了桌子坐下写。题目估计是面试官中午的时候抽空出的。看起来不是很难的样子^PS1

  1. 合并两个链表(原文:Merge two linked lists.);
  2. 求一个链表的倒数第五个元素;
  3. 求一个数的二进制表示中1的个数。

按顺序看题吧。第一题,合并两个链表?怎么合并?题意不明确先跳过。第二题一下子也没有好想法。第三题!这不是位运算经典题吗?略加思考写了一个十六位的版本,觉得意思意思就好了。然后是第二题,这题意肯定不是让写回溯的啊,于是就YY了一个naive的方法。最后是第一题,我继承了第二题的思路,觉得肯定不会是naive的把一个链表接到另外一个后面,否则就应该用concatenate这个单词了。于是尝试向HR询问,失败。题意问题困扰了我好久。最后,我费了点时间,费了点精力写了个两个链表交错merge的程序。最终代码也很简单,但是不太好懂。

虽然说了很多,但是其实我们俩只花了20分钟就交卷了。HR姐姐告诉我们接着等。我们两个苦逼就在酒店大堂里干坐了2个小时,又困又累又热。中间交流了一下想法,我还发现了我第二题的做法有点漏洞,不过也无所谓吧。下午三点钟我们的答卷终于被送到面试官手里了。我和canoe学长就在HR的房间淡定的坐等结果。12分钟之后,HR姐姐拿回了结果,她先告诉canoe学长答的很好获得了面试机会。之后她对我说:很遗憾你的答案“错的太多”blablabla。

听完这句话,愤怒的情绪直接把我淹没了。什么叫“错的太多”?这样的三道题也能让我错的太多?怕是你的面试官没看懂我的程序吧。我立刻没有了跟她继续交流的兴趣,尽管之后她还说了几句安慰我的话。跟canoe学长告别之后我气冲冲的回到了学校,决心晚上写一篇博客吐嘈一下MS坑爹的面试。

你以为这就完了吗?错了。晚上做完实验回到基地,遇到了面试归来的canoe学长。他传达给我了一个更加狗血的消息:HR姐姐理解错了面试官的意思,面试官不是说我“错的太多”,而是说我“第一题写得太乱了”。所以我本来是有面试机会的。

难道这样就高潮了吗?不是!面试官还据此怀疑我第三题是背的!背的!!背你妹!!!我的肚子就这样被小人之心度了。我从早上六点折腾到下午三点,最后还被人说是“背的”!虽然我不太喜欢微软的作为,但我还曾认为MS是一个伟大的公司。现在呢?我只想说:MS,玩儿蛋去吧!

吐嘈归吐嘈,淡定了之后还是希望卢大神和猴神能和MS一块儿玩儿蛋去。祝两位神拿到offer,祝各位MS实习愉快!

PS0:非死不可的HR告诉我,不要“assuming the interviewer is smarter”。MS,领教了。

PS1:如果在文章中公布微软面试题有任何不妥,请联系我。我没有签署任何保密协议。

ACM俱乐部主席日常工作总结

| Comments

看了这个题目,大家一定想说,你是主席吗你就敢写总结?鄙人不才,正是HIT ACM俱乐部现任主席。

HIT ACM俱乐部是计算机学院最有前途的俱乐部,没有之一。ACM俱乐部的主席却一点也不忙。虽然挂着主席的名,但是俱乐部日常的工作我是插不上手的。有我们的富二代金牌帝管理员icek大神在,俱乐部工作自然井井有条。那主席天天干什么呢?主席的职责有两条:

  1. 给ACM基地修网。网络出问题的时候就是我出现的时候。
  2. 跟计算机学院的行政部门打交道。

第一条自不必说,任何一个网管拉过来都能干的活。

第二条嘛,计算机学院虽然办正事的效率一向不高,折腾起人来可非常有一套。单周例会,双周交工作简报,两周发一篇新闻。时不时的替各个俱乐部举办活动,替各个俱乐部招新,期末还要根据平时表现给大家评分,真是用心良苦。例会什么的也就算了,我友情出现一下。工作简报嘛,俱乐部每周都办一样的周赛+讲座,交差不多的也行。新闻?不好意思,不陪你玩儿了,today.hit对ACMer一点意义也没有。

说到办活动,每年HIT ACM可谓不遗余力。秋季校赛规模宏大,要提前一个月准备题目、网站、机房、报名、条幅、气球。基本能把整个俱乐部折腾的人仰马翻,尤其是管理员(感谢历届管理员FF,oneplus和icek学长的辛苦工作)。还好每年校赛完了lord都请吃饭,也算不白忙一场。这儿斜刺里杀出来一个社联,突然要替ACM招新。嗯,我们这边新成员都开始训练了,不好意思。

所以呢,每次社联开会我少不了要说,“ACM俱乐部不参加招新“,”不参加xx文化节“,”不参加xxx”。主席只有这点儿事儿可干了。

啊,差点忘了,还有些别的事儿。例如校十佳社团评选,主席要准备材料上台演讲;有时候学院会向我要奖项统计;有时候申请经费要让俱乐部自己填表——我从来没见过计算机学院的经费长啥样;还会有其他不定期的填表任务。

总结完了,最后发广告,ACM俱乐部招聘下一任主席啦~除了干活,主席还是有福利的:

  1. 评奖学金的时候可以加5分哦,5分哦~~关键时刻秒杀其他人的加分哦!
  2. 可以对别人说,我是主席。
  3. 可以偷偷在基地享受不限速带宽。

愿意兼职的同学可以联系我,或者留言。先到先得!

PS:俱乐部真的应该加强一下这些日常的统计,多少队伍多少金牌多少银牌。希望未来HOJ能有这样的功能。

Jwc2ical小记

| Comments

谋划了一个学期的jwc2ical项目终于结束了,结果还算不错,有可用的产品,并且成功进行了推广。

jwc2ical是我的第一个有意义的“项目”。做完了收获还是很多的,在这里做个总结。

  • 面对未知的时候,不要想“计划好了再行动”,尽快开始才是王道。例如moodle-local_jwci2cal里需要用到PHP,但是我从来没用过。寒假里找资料、教程找了很久,也比不上3月份fork一个本地插件一边写一边问雄哥。
  • 输出调试信息要输出key。所谓key,就是能帮助我们第一时间确定出错的位置、错误的种类以及引起错误的参数的信息。 例如,当从数据库里读出来的数据引起问题时,除了输出引起问题的域,最好再加上Primary Key部分。
  • 永远都不要依赖于全局变量。用函数返回值、持久化存储、常量等方法代替。全局变量在一个地方写、在另外一个地方读,这总能让我想起CPU设计实验里控制时钟周期以免发生读写冲突的例子。这是很讨厌的一件事情。
  • 在需要长时间运行的程序里,尽一切可能避免程序崩溃。
    • 在一切有可能出问题的地方——函数调用,数据库操作,来自用户的输入——判断数据合法性。
    • 把单个工作的崩溃log下来,继续其他的工作。留下的信息要足够恢复。
  • 要么做到永远不崩溃,要么崩溃了以最快的速度恢复。为什么要有后半段?因为前半段并不总是可能的。
  • 考虑在崩溃的情况下整个程序能在多大程度上继续运行。哪些功能即使程序已经崩溃了也是可以依赖的?最好每个功能都是。
  • 做每一个假设的时候都要想,如果这个假设不成立怎么办?
    1. 假设不成立就要换一种方法来处理了。是不是抽象有问题?
    2. 假设不成立就会麻烦很多。提前做好面对麻烦的准备吧。
  • Quick and dirty的方法有时候很有效。适当引入能事半功倍。这是个权衡的问题。
  • 尽量把做事的函数和说话的函数分开。能分多开分多开。

先写这么多吧。

moodle-loca_jwc2ical项目历时18天,大小bug不断。中途根据实际情况做了很多调整,最后的代码无比混乱,当然我是说PHP部分。Sunner老师给了我很多指导和帮助,没有他我写完这个项目一定会死的。项目前期缺乏有效的测试数据,这是麻烦的根源,甚至部署之后还出现了一次崩溃。还好Sunner老师不厌其烦的一遍一遍的部署测试,最终项目才能成功上线。感谢Sunner老师~我还得继续维护这个项目,没有人会愿意接手的。

最令我骄傲的是项目的Perl部分,也就是分析网页的脚本。除了两个已经预料到的错误假设之外,我没有对这个脚本做任何改动。它完美的实现了与JWC的交互,处理了大部分的错误和特殊情况,提供了一个很好的封装。这得益于范神@ronaflx,卢大神@luyi0619和雄哥@bearzx在前期给力的测试,感谢三位勇敢地成为脚本的第一批用户。

无论如何,这一个项目已经接近尾声了。下一步就要把精力集中到GRE和xfsd上去。开学已经一个月了这两项还没有多大进展,很惭愧。就这样吧。

本来想写一个文艺的结尾的,可是我真的不文艺。

PS:Facebook你敢不敢回个消息过来!要不要投过去简历就石沉大海啊!!!!!

周日大事记

| Comments

本来第三篇文章想写有关PHP和Perl的,但是上周日下午12个小时之内发生的事儿让我很有写篇文章的冲动。有三件事要写,就按时间顺序来吧。

第一件是关于学习和未来的。周日下午,软件设计与实践课开题了,我们这个两人小组的题目是我选的。选了一个我很早很早之前的想法:把XFS移植到Windows下。题目很大,很激动人心,对我来说是个梦想式的题目。选这个题目我是有私心的,一方面希望自己能得到这方面(filesystem)的锻炼,另外一方面也希望能给我的简历能多个亮点。辛苦我的队友了。

第二件事是关于博客的。周日晚上10点,我的博客终于有域名了!您现在在浏览器地址栏里看到的就是了:ditsing.com。感谢卢大神的友情代付,感谢小莹莹的账户支持。

第三件事是关于比赛的。周日晚上十一点是CodeForces VK Cup比赛的第一轮筛选。大家在基地里熬夜做比赛。Coding阶段的状况不可谓不壮烈,我最后15分钟还写完了一道题交了上去。判题的时候大家各种欢呼诅咒刷Board,闹到三点多最终结果出来了才安静下来,真是叉叉青年欢乐多啊。俺克服了千难万险终于成功晋级。基地里几家欢乐几家愁,祝愿没晋级的同学Wild Card顺利。

最后,欢迎大家跟我交换友情链接,@luyi0619@icek@cloudaice@cloudfly@bearzx,说你们呢。也欢迎大家订阅我的博客,我会尽量给大家提供高质量的博文,而不是像今天这样的流水帐。

Blog开张啦

| Comments

今天我的Blog正式开张啦,欢迎大家常来参观!

Blog暂时放在Github上。请大家先不要收藏网址,因为我还没买域名^ _ ^。欢迎大家推荐主机~~

感谢cloudaice同学介绍给我Octopress。