面试体验:Google 篇

 尝试在自己的博客上搜索点东西,结果发现 4 年多以前还在博客上写过一系列的 recruiting events,把大四时候参加过的各种笔试面试都记录下来了。我从去年准备离开百度开始,到现在总过面试过 4 家公司:Google、Microsoft、Yahoo、Facebook,原本去年也想把面试经验写一写的,结果一拖就拖到现在。我不想写面试经验,因为我个人不喜欢漏题和背题的做法。我自己作为面试官,知道要设计出来一道好用的题目有多难,所以我希望面试者都是如实表现自己解题能力的。我更喜欢写面试体验,就是在整个面试过程中一家公司给人的印象是怎样的,HR 和面试官是否专业,能否让人信服这是一家值得长期工作的公司。 我想写的第一家公司是 Google,因为它是我在想要离开百度时第一家联系到我的公司。2010 年 12 月底的某一天早上,我突然感觉到我应该离开百度,因为如果这个时候已经没有勇气离开这家公司了,很可能就不会再想要离开了。当天中午在百度大厦西餐厅吃午饭,接到一个 Google 上海 HR 的电话,问我有没有兴趣去面试,我想既然你打电话来的时机那么好,我就答应你去面试吧。(在那一天之前,我对猎头的标准回复是「有美国或者香港的职位吗?」)她问我将来希望在北京还是上海工作,当时我对北京的厌恶程度还没有现在那么高,同时觉得搬家到上海又比较麻烦,于是就说在北京,接着我就变成跟北京 HR 沟通了。 Google 的 HR 会负责做两件简单得不需要面试官做的事情,这能够很好的提高招聘流程的效率。第一件是确认你能够适应工作环境中的英语,为此 HR 要我用英语跟她对话两三分钟,主要就是让我说说工作经验和其中的亮点。习惯在私企工作的人不要以为外企对英语的要求很高,其实大多数长期在中国工作的人说话或者发邮件都会很 Chinglish 啦,所以关键是要敢于用英语进行沟通。 然后 HR 发了一个 Codility 的地址给我,让我有空抽时间去做题。一个小时 3 道难度相当于 OI 基础题的题目,平均 20 分钟一道。最简单的题目一看就知道是 O(n) 能解决的,最复杂的题目看上去是 O(n^2) 但想一下就能优化为 O(n log n)。对于有算法训练背景的人来说,这样的题目会让人感觉到很有把握。对于没有经受过算法训练的人来说,掉进陷阱里是很容易的。很可能没有把 O(n^2) 优化为 O(n log n),结果超时;可能没仔细看题目说明的数值取值范围,某些变量选错了数值类型,结果溢出。考虑到 Google 重视算法的程度,再加上 Google 中国面试的额外难度,算法训练还是很必要的。 在我通过 Codility 测试后,HR 问我了对题目难度的反馈,然后约了一轮电话面试,并且告知面试主要围绕算法、数据结构、系统设计、编码来进行。Google 面试的格式都很固定,45 分钟内期望你能做出 3 道题来。这 3 道题最起码要能把人人都能想出来的「笨办法」用代码写出来,否则会让面试官感到不满意。如果有些题目能够比较快地做出来,面试官就会让你优化。就算你第一次给出的答案已经是业界已知最优解,面试官都还是会让你优化,因为谁也不知道有没有人能在面试过程中突然爆发,想出一些过去没人想到过的解法。如果面试官心中已有优化的方案,在你想不出优化方案时他可能会给你提供一些提示。 一轮电话面试后,HR 就开始约到 Google 办公室的面试了。第一次约了下午 3 轮面试,还是那个很固定的格式:每轮面试 45 分钟,两轮间隔 15 分钟。整个面试流程让人感觉到很人性化:在 Google 签到后,HR 会先带你去 kitchen 拿点吃的喝的,然后把你带到面试所用的会议室。多轮面试的话,HR 中间还会来问一下你要不要去洗手间,或者多拿两瓶水。面试完毕后 HR 会来问你感觉如何,同时也会让你知道面试官的初步反馈是否跟你的感觉一致。我在 3 轮面试中有一轮感觉不太好,因为面试官只给了 2 道题,并且我最终都没办法解出来,HR 也确认了就是这一轮的反馈不好。 此外,Google 的招聘流程还让人感觉到很有效率。作为面试官,我也知道自己写面试反馈有多喜欢拖延,而且公司填写面试反馈的系统越不人性化我就越想要拖延,然而公司内部系统做得人性化的又实在罕见。Google 的面试基本上隔天就有结果,然后 HR 就会约下一轮的面试。因为我在百度的时候每周哪个时间没有会议是很确定的,所以我总是选择下周同一个时间段来面试。在经过总共 4 轮面试后,HR 说因为前面有一轮的面试官反馈不好,所以希望再加一轮面试。因为前面反馈不好的面试官比较 senior,所以这次找了一位同样 senior 的面试官来面试,于是我又去了一次 Google 办公室。 完成 5 轮面试后,HR 把材料提交给 Google 的北京招聘委员会,结果没有通过。HR 说,因为 Google 都是按照后端工程师的标准来招聘,看重算法和数据结构,前端工程师要通过不容易。因为 Google 没有专门的前端工程师,只有一个软件工程师职位,所以所有人还是必须按照一个标准来衡量。她问我如果找到专门需要前端工程师的团队,并且需要额外再面试的话,我是否感兴趣。当时 Google 是我的第一选择,我当然说感兴趣啦。 后来 HR 跟我说,她帮忙问过 Google Maps,可惜对方说不要专才只要通才。又过了几个星期,HR 发现 IME 需要专门做前端的人,于是帮我再约了一轮面试。这轮面试是在 Google 办公室做的,但实际上是视频会议,因为面试官在美国。(不确定面试官是在美国出差,还是美籍华人。)面试过程跟电话面试类似,用 Google Docs 写代码,比电话面试要好的是说话时能够见到人。 这一轮面试结束后,我的材料再次进入 Google 的北京招聘委员会。HR 说这次专门找了对前端有经验的人来审阅我的材料,结果顺利通过了。接着 HR 问我要了一大堆的补充材料,包括高考成绩和 GPA(连同成绩单),还包括当前薪酬和竞争对手的 offer(我当时有 Yahoo 的 offer),甚至包括过去的获奖和晋升经历。所有这些材料都会发往 Google 美国总部审阅,具体流程 HR 没有细说,但看 Don Dodge 的文章可以了解一些。最后我被 Google 美国总部给拒绝了,然后 HR 还是一如既往地及时沟通,并且安慰了我几句。 ...

2012-08-11 · 1 min · bystander

北外英语专业超全面翻译笔记PDF下载

 今天在网上看到的。就自己制作了一下pdf版本。方便大家。现在比较纠结的是没有一个好网盘。115竟然需要登录才能下载了。。刚才试了下。。更可怕的是,,只有绑定了手机才能分享。霖枫叔疯了么。。 那还是将就着用华为的吧。其实我也不喜欢华为的。。 下载地址:北外英语专业超全面翻译笔记

2012-08-05 · 1 min · bystander

SQLServer超时时间已到解决和一套控件库

 在最近的一个程序中,因为频繁的操作数据库,莫名的出现了如下的错误: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 按理说这应该是没有关闭数据库连接或者dataset,可是查了一下。发现都关了啊。遂可以表述为原因不明,但是通过在数据库连接字符串中添加max pool size=512 这个数字可以自己设。就可以了 这篇文章短是短了点。。好吧。那顺带分享一套非常精美的C#控件。 RadControls-For-WinForms 控件2012 RadControls-for-WPF控件2012

2012-07-13 · 1 min · bystander

SQLServer启用xp_cmdshell

忘了当时是执行哪条命令的时候需要启动xp_cmdshell了。。反正是必须用的。。 默认情况下,sql server安装完后,xp_cmdshell是禁用的(可能是安全考虑),如果要使用它,可按以下步骤 -- 允许配置高级选项 EXEC sp_configure 'show advanced options', 1 GO -- 重新配置 RECONFIGURE GO -- 启用xp_cmdshell EXEC sp_configure 'xp_cmdshell', 1 GO --重新配置 RECONFIGURE GO --执行想要的xp_cmdshell语句 Exec xp_cmdshell 'query user' GO --用完后,要记得将xp_cmdshell禁用(出于安全考虑) -- 允许配置高级选项 EXEC sp_configure 'show advanced options', 1 GO -- 重新配置 RECONFIGURE GO -- 禁用xp_cmdshell EXEC sp_configure 'xp_cmdshell', 0 GO --重新配置 RECONFIGURE GO

2012-07-11 · 1 min · bystander

C# 线程优秀文章汇总

最近在看线程的东西,整理一些文档以便学习。分享。 刚刚 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线程的自动管理(定时器) C#多线程学习(六) 互斥对象 C# 实现多线程的同步方法详解 JimmyZheng C# 温故而知新: 线程篇(一) Thread C# 温故而知新: 线程篇(二) 线程池和异步线程 zhoufoxcn C#多线程编程(1):线程的启动 多线程编程(2):线程的同步 多线程编程(3):线程池ThreadPool 多线程编程(4):多线程与UI操作 一个简单的C#多线程间同步的例子 老赵 浅谈线程池(上):线程池的作用及CLR线程池 浅谈线程池(中):独立线程池的作用及IO线程池 浅谈线程池(下):相关试验及注意事项 bloodish C# Tip – 如何优雅的控制线程状态 Autumoon 白话多线程

2012-07-11 · 1 min · bystander

降级论

 相当精彩的一篇文章『降级论』,收藏分享。精彩的部分突出显示了。 几乎一年没有写博客了,说没时间那是借口,唯一的原因是,年纪越大越发觉自己肤浅。有些想法还没提笔,就发现很幼稚,就不敢发出来贻笑大方了。这次先给大家说个小故事: 从前有三个屌丝,聚在一起做网络,提供免费的网络服务,砸锅卖铁,通宵达旦,除了卖肾啥都做了。3年后终于做到了五百万用户,对于年轻人来说,能把五百万人玩弄于鼓掌之间,已经是很牛逼轰轰的事了,不过用户越多,成本越高,每年服务器、带宽租金、房租水电、广告运营等成本,已经达到了十七八万,屌丝们不得不面对一个终极问题:如何盈利? 屌丝们定了三盘沙县水饺,围着一箱子的冰啤酒开始计算:按照最近一月的登陆情况来看,四百万个账号已经不活跃了,真正有商业价值的只有一百万人,如 果开通xx功能,收点高级会员费,让其中1%的人升级为高级会员,每年付30块钱年费,那么每年收入就是100万x1%x30元=30万元!不错嘛, 扣除十七八万的运营成本,还剩毛利润12万,每个屌丝年底能分到4万大洋,如果按照打工者的算法,这三个人每人月薪3333元,木有奖金,木有津贴、木有任何福利,上班还得带自家的电脑。 尽管如此,屌丝们还是激动得热泪盈眶:老子有钱啦!老子有钱啦!!!那一夜,人们看到三个发疯的屌丝在屋顶翩翩起舞。 韩寒说,中国人民是最有忍耐力的族群,一点好处就感激涕零。他一定不知道,IT创业界里的屌丝,才是这群傻逼中的战斗机。他们可以平静地忍受每年都持续亏钱,而且还能信心十足的对所有人说公司的状态非常好,如果有一天居然收支平衡了,他们会激动的趁夜难眠,比北朝鲜倒掉还开心。 本文开头的三个屌丝,其实是非常幸运的,至少能做到月薪3333元。大部分的屌丝在第一年做到几万用户的时候就会挂掉,原因众多,最主要要的是意志太弱,受不了最初的寂寞;意志稍微坚强点的会在第二年第三年慢慢挂掉,原因主要是资金断裂、团队分裂;能成功熬到第四年还没饿死、还没被口水淹死、还没被肠胃病颈椎病腰肌劳损折磨死的,甚至员工不减反增的,基本上属于神仙级别了。 我为什么要说三个屌丝的故事呢。首先是因为这是身边每天都在发生的故事,其次是因为感到可惜, IT界在我眼里一直是一个无比高级的职业,聚集着全球最聪明、最富有的人类精英。以IT创业界的青年们的智商,他们可以做成任何一件事情,包括改造银行到制造汽车到发射航天飞机 。结果这帮人却整天在蓬头垢面得为3k的月薪而挣扎,太悲催了。 为什么用悲催这个词? 如果一个人生下来就在山沟沟里,一辈子都没机会去见什么好东西,这不叫悲催,这只叫苦难; 而如果一个人生出来有一个奇怪的特异功能:皮肤出来的汗水会凝结成昂贵的水晶,本来只靠出汗就能赚钱,结果这傻逼居然觉得出汗这个行为太低级,做手术把自己的汗腺全给切了,而且丝毫没有意识到他做了什么傻事,这才叫真的悲催。 我们IT界中的很多人,生下来就是有这个出汗成水晶的特异功能的,正是因为这种与众不同,这群人能混入牛逼的大学,整天打网游还能写出像样的毕业论文, 拿到学位,进外企,考CPA,做咨询、做证券分析,研究高分子材料,做电子商务,做云计算。。。一级一级的上升,直到有一天,发现身边的人里,已经没有一个不是CPA,不是咨询师,不是高级研究员了,身边的人全是业界精英,个个都超级强悍。在这个所谓的高级圈子里,自己并没有任何过人之处,只不过是just another analyst而已。在高级圈子里拼的头破血流,最后也只能混到给台湾人整理数据而已。莫然回首,发现当年的血气方刚、年少时的无限梦想,进化成了一身肥胖的赘肉。这个时候,有个旁观者说:“升级到头了,该降级了” 当一个社会疯狂鼓吹快节奏的时候,一定需要有人来宣扬慢生活;当全社会跟打了鸡血似的吹捧升级的时候,一定需要有人来说说降级论。 IT青年们喜欢打游戏,喜欢升级。他们的人生也和游戏一样,沉醉于不停的升级中,不仅喜欢升级自己手上的技术,把MySql改成MongoDB,把Apache升级为Nginx,在Mac上装Ubuntu,Ubuntu里再装个虚拟机去跑Mac OS。。。IT青年们也喜欢升级自己的人生,从程序员升级到项目经理,再升级到技术总监或产品总监,再升级到合伙人。。。 在不断追求升级的过程中,所面临的一个很大事实是:当一个人从A刚升级到A+级的时候,其实这个人的能力层级依然只是A的层级,还未胜任A+的层级,他必须要到A+的后期,才可以胜任A+。就好像一个高中生,高考完之后,虽然理论上已经属于大学生了,但是他的实际能力依然只是高三毕业的水平,除非他全部pass了大一的期末考试。同样的道理, 这个世界上有很多人的身份和称谓,都是在描述“未来的自己”,而不是现在的自己。 当你从销售员升级为销售经理的时候,你自我感觉很好:“我现在是销售经理了”,但是这个时候 ,你并未通过公司对你作为销售经理这一年的工作成果的考核,你只是一个“未来可能是合格的销售经理”的前身。如果年终考核你失败了,那么这一年最准确的描述是:一个销售员,占了整整一年销售经理的位子,最后失败了。而且这一年一定会过的很累,因为通过考核的其他销售经理,才是真正胜任这个层级的人,跟一帮真正属于这个圈子的人厮杀,就好像拳击馆里当陪练的小角色,去和泰森比了一年的武,怎么可能不累呢? 当我07年进入互联网行业的时候,就是那个拳击馆里陪练的小角色,我被迫去跟全国各地的泰森比拼,结果累的半死。后来我开始反思最初的目标,为什么要在自己身上挂一个“拳击高手”的招牌,被那么多泰森追着打? 我把这块招牌卸了,找个完全没练武的人去比拼,不是更容易赢么?于是果断照做,去找了一个没人懂拳击的小乡村,做了纯英文的Tucia.com(需翻墙),只做国外的业务。在那个地方,作为一个知名武馆的拳击小陪练,我成了村子里拳击技术最高超的人,受人仰慕,还开武馆教人拳击,活的非常滋润,而且在教人拳击的过程中,自己的拳术也比以前提高了很多,发展出一套属于自己的拳法,我虽然进不了泰森们的大圈子,但他们也进不了我的小圈子。 关于圈子,有一个很赤裸裸的现实:不会是你进入圈子,只能是圈子进入你。很多人会四处找关系,“帮我介绍给xxx吧,我想进入你们的圈子”,这样的人是永远进不去这个圈子的,因为圈子的天性是,永远追求更高一个层级的人。而我们的大部分人,其实都在以低一级的属性,占着更高一级的位子,徘徊在更高一级的圈子边缘,与更高一级的人竞争,幻想着自己可以升级到那个圈子里去。也许永远进不去,悲催的努力一辈子;也许运气好,某一天真的进入这个圈子了,但那个时候又会有下一个目标,希望进入更高级的圈子,这是一场没有终点的战斗。永远的追求升级,永远的累。 有没有想过降级呢? 如果一个来自微软的高级工程师,辞职去一个养猪场做开放平台经理,那么他的到来不仅会让养猪圈感到无比荣幸,更是意味着,利用他在IT界训练出来的高效工作方式和逻辑思维能力,他可以掀起一场养猪行业的革命,使得20年后才会出现的人性、高效、开放、协作、健康的养殖方式提前到达。在这场革命中,他会活的非常有价值。这种价值,在原先的圈子里,是完全体验不到的,因为他此前的所有工作,只是在满身疮痍的windows系统上不停的打补丁,无论打多少都逃不开产品衰落、被人鄙视的命运。 很多人的命运,都像是上面那个微软工程师。只需要降级,就能创造更大的价值,也能获得更大的满足。那为什么不呢?为什么要死死抱着那个所谓的“高级职业”不放呢? 去年我曾犯贱去趟了移动互联网的浑水,做了个手机app,刚开始的时候感觉很高级,但很快,铺天盖地的竞争对手就出现了,我又发现自己陷入了07年一样的场景:作为一个小小陪练,我他妈的又被一帮泰森们给围住了。当泰森中的战斗机—微信,变得无比牛逼之后,我就知道,战胜这群泰森是绝对不可能的事情了。于是我再次投靠了“降级论”,把自己从牛逼哄哄的移动互联网行业,降级到了一个被人不齿的低级项目:Tucia Baby。 这个项目虽然是传统行业,但是我们基本上是按照互联网产品的思路去做的,除了拍摄需要来店里以外,其他一切,包括营销、预约、客服、后期、选片、取片、客户关系等,所有环节都放在网络上,尤其是微博(@tuciababy官网)。当然,最重要的是,作为一个脑残的果粉,我按照iPhone的做工和品质去要求每一张作品,必须达到我们能力可以做到的最好水准,不计成本的最好水准,才允许送给客户。正式接客不到两个月时间,虽然还远未达到成功,但目前已做到每天都有客户订单,财务上已实现盈利,未来相信一定会比大部分app开发者更光明。(ps:我们没有请工商、税务、城管去吃饭喝酒泡桑拿,也没有塞钱给任何政府机关。 当你的产品真的用心做到很好的时候,其实你不需要讨好任何人的。 ) 这个项目让我沉思了很久:07年我曾把一个纯纯的web2.0网站做到了alexa中国区前1000名(如有质疑,请查询2010年附近的tucia.com排名),结果一路亏损,到最后只剩下一个员工;11年我把那个纯纯的app做到苹果官方推荐区免费榜的第一位(点此看截图),那段时间每天四五千iPhone安装量,结果一路烧钱,到最后濒临关闭;而如今,我只需把自己从纯纯的互联网降级下来,做一些看起来有些“低级”的项目,居然就能立即实现收支平衡。 除此以外,我还发现一个现象, 中国消费者在与奸商们的长期斗争中,已经培养出了一种非常苦B的品质:只要不被坑,他就谢天谢地。如果商家严格做到了承诺的每一件事情,客户就会感动的泪如泉涌。 如果商家不仅做到了所有承诺的事情,还很贴心的提供了一些额外的服务(比如我们给每位客户赠送非常好吃的樱桃和昂贵的进口巧克力作为甜点),那么客户就会激动的哭天喊地、奔走相告,推荐给他认识的每一个人。 其实这片肮脏的国土,就是上天赐予IT青年们的最好机会。 在一个不会练武的村子里,只要你会打两拳,你就是拳术最厉害的人;在一个没有服务意识、忽视产品质量的土地上,只要你用心做服务,用最高的标准去要求自己,你就会成为这块土地上最出色的商家;在一个没有现代管理意识,不懂网络、不懂微博、不懂用户体验、不懂口碑传播的粗犷社会里,你只需要把之前花在IT产品上的心思的10%拿过来用,就可以秒杀一切天朝对手。 所以, IT青年们,当你在为网站的转化率苦苦思索的时候,当你在为app的活跃度辗转反侧的时候,当你在为融资计划苦苦哀求各界大佬引荐的时候,也许犯了一个错误,也许你们的脑子最值得闪光的地方,不是去悲催的IT界当炮灰,而应该是去按摩界、餐饮界、烧烤界、早餐界、理发界、家政界、按摩界、送花界、纺织界、成人用品界、现代化养殖界、有机蔬果界、个人护理界、汽车修理界。。。。与IT界相比,这些行业的确无比低级,他们的老板连qq都会发音成“抠抠”,他们的员工一辈子都没用过Email;跟他们解释什么是SEO,什么是用户体验,什么是数据挖掘,他们会在听你说完之前就开枪自杀掉。正是因为如此,这些行业才是如此的不堪一击。正是因为如此,当智商高达147的IT青年还在为3k薪水拼命、而智商不到50的烧烤店老板正坐在porsche里玩着前面那位青年开发的app的时候,我就忍不住仰望星空。 这些原始而纯粹的行业,正在等待IT精英们的降级,如同蒲公英一般的伞兵,在黑夜里从天而降,长驱直入,用最智慧的产品、最优质的服务拯救这些早就该死的行业,屌丝的生命将会绽放出银色的羽翼,无比丰满,无比性感。 最后注意,请珍惜生命,远离我的微博:@meditic

2012-07-07 · 1 min · bystander

移动设备电池白皮书

资源来自:金山网络 我比较认真的读完了这本小册子,确实收获还是蛮大的。前几天有个朋友问我电池的事情,我以前看过电池的一些保养的。当时就知道锂电池是首次使用是不需要进行12小时充电的。。看到这本小册子的时候,证实了我没乱讲哈。。 然后里面还说道一个就是很多人不相信软件能够保养电池。其实真的是可以的。。理由不赘述。你可以自己读一读。。我自己感觉对普通用户很有用的是30页的那一节。讲到的问题有; 电池管理类软件对电池寿命没用? 充电习惯对电池寿命没有用? 一块电池都只够安卓撑一天? 提示电池充满就可以马上拔掉电源 ? 不管怎么用待机时间都一样? 手机还有一半电量的时候不必担心? 新电池前3次需充满12小时? 涓流充电有用吗? 手机电池充一夜也没什么危害? 边充电边使用对电池无伤害? 突然断电再立刻充上会伤害电池吗? 充电不饱和会伤害电池吗? iPhone和iPad的充电器可以混用吗? 经常把电用光再充对电池好不好? 书籍下载:[移动设备电池使用白皮书](http://115.com/file/ancame68# 移动设备电池白皮书.pdf)

2012-07-07 · 1 min · bystander

《Effective C#》Item 9:区别和认识四个判等函数

 .Net有四个判等函数?不少人看到这个标题,会对此感到怀疑。事实上确是如此,.Net提供了ReferenceEquals、静态Equals,具体类型的Equals以及==操作符这四个判等函数。但是这四个函数之间有细微的关系,改变其中一个函数的实现会影响到其他函数的操作结果。 首先要说的是Object.ReferenceEquals和Object.Equals这两个静态函数,对于它们俩来说,是不需要进行重写的,因为它们已经完成它们所要得做的操作。 对于Object.ReferenceEquals这个静态函数,函数形式如下: public static bool ReferenceEquals( object left, object right ); 这个函数就是判断两个引用类型对象是否指向同一个地址。有此说明后,就确定了它的使用范围,即只能对于引用类型操作。那么对于任何值类型数据操作,即使是与自身的判别,都会返回false。这主要因为在调用此函数的时候,值类型数据要进行装箱操作,也就是对于如下的形式来说。 int n = 10; Object.ReferenceEquals( n, n ); 这是因为对于n这个数据装箱两次,而每次装箱后的地址有不同,而造成Object.ReferenceEquals( n, n )的结果永远为false。 对于第一个判等函数来说,没有什么好扩展的,因为本身已经很好地完成了它所要做的。 对于第二个Object.Equals这个静态函数,其形式如下: public static bool Equals( object left, object right ); 按照书中对它的分析,其大致函数代码如下: public static void Equals( object left, object right ) { // Check object identity if( left == right ) return true; // both null references handled above if( ( left == null ) || ( right == null ) ) return false; return left.Equals( right ); } 可以说,Object.Equals这个函数完成判等操作,需要经过三个步骤, 第一步是需要根据对象所属类型的==操作符的执行结果; 第二步是判别是否为null,也是和第一步一样,需要根据类型的==操作符的执行结果; 最后一步要使用到类型的Equals函数的执行结果。 也就是说这个静态函数的返回结果,要取决于后面要提到的两个判等函数。类型是否提供相应的判等函数,成为这个函数返回结果的重要因素。 那么对于Object.Equals这个静态方法来说,虽说接受参数的类型也属于引用类型,但是不同于Object.ReferenceEquals函数,对于如下的代码,能得出正确的结果。 int n = 10; Debug.WriteLine( string.Format( "{0}", Object.Equals( n, n ) ) ); Debug.WriteLine( string.Format( "{0}", Object.Equals( n, 10 ) ) ); 这是因为在此函数中要用到具体类型的两个判等函数,不过就函数本身而言,该做的判断都做了,因此不需要去重载添加复杂的操作。 为了更好的述说剩下两个函数,先解释一下等价的意义。对于等价的意义,就是自反、对称以及传递。 所谓自反,即a == a; 而对称,是a == b,则b == a; 传递是 a == b,b == c,则 a == c; 理解等价的意义后,那么在实现类型的判等函数也要满足这个等价规则。 对于可以重载的两个判等函数,首先来介绍的是类型的Equals函数,其大致形式如下: public override bool Equals( object right ); 那么对于一个类型的Equals要做些什么操作呢,一般来说大致如下: public class KeyData { private int nData; public int Data { get{ return nData;} set{ nData = value; } } public override bool Equals( object right ) { //Check null if( right == null ) return false; //check reference equality if( object.ReferenceEquals( this, right ) ) return true; //check type if( this.GetType() != right.GetType() ) return false; //convert to current type KeyData rightASKeyData = right as KeyData; //check members value return this.Data == rightASKeyData.Data; } } ...

2012-07-05 · 2 min · bystander

对不起,我等不了你了

 这不是我写的,这篇文章也不是讲爱情的,来自XuTuo的方式,大学生活。人生理想。不错的文章。收藏分享之。 很多事很多人你觉得对你很重要,会在你的一生中留下不可磨灭的印记,却总在你的渐行渐远中云淡风轻。 大一的时候不写高考,因为年少轻狂中带有那么点不可一世的自尊心。大三的时候写不出高考,因为想再提起时已经变成愈加模糊与苍白,甚至还有点可笑。那时候的你已经开始忙着考研或者找工作,忙着褪去象牙塔里那张不老的脸,忙着一个人或者两个人的未来。 后来觉得有必要在这个稚嫩的末尾画上一个走向成熟的句号,在夏天还没到来的时候。 两年前你迷茫着要走上那条路,两年后你迷茫着这条路会走向哪里。 学生生涯是一个很美好的时刻,当然这种美好往往得等失去了才知道珍惜。就像记忆中的高中班主任总是苦口婆心地告诉我们,拼一拼,过了这一个月,你们就解放了。年幼的人有种向往年长人的生活的冲动,这种原始的冲动就像小时候注册QQ的时候总喜欢把年龄放大到十八岁,好像花季雨季里总会有那么些纯纯的爱恋等着我们。而直到了那个季节才发现原来小说里都是骗人的,这里除了长个不停的青春痘还有做不完的作业与考不完的试,爱情是战乱里的奢侈品,珍贵且易碎。 一群刚考完试的高考生们疯狂地撕掉课本,然后撒向天空大吼说:“我终于解放了!”接下去的几天里他们不停地聚会,不停地唱K,不停地喝酒,不停地网路短信暧昧,然后接下来是高中“革命一辈”的“生离死别”。 说着一生一世的誓言走上两条反方向的路,我喜欢那个时候忽明忽暗的爱恋,喜欢就是喜欢,不喜欢就是不喜欢,表白的那个男生可能以后会考上一所名牌大学,毕业后能当上国家公务员,家里供有着一套以及一套以上的房子让他结婚。但不喜欢就是不喜欢,因为他胖,他油性皮肤,他的校服一个礼拜都没洗,还有,他的字不好看。 接着他们如愿以偿地上了老师口中的“由你玩四年”。这是一个很不负责任的谎言,并且被我们尊重的老师屡用不止,就好像你在吃一根玉米,你啃到第三排的时候已经吃不下了,然后一个人告诉你说越往后越好吃,逼你不得不继续往下吃,然而你却逐渐感到反胃,旁边的人说一开始不习惯,慢慢地就会好了,你相信了,硬着头皮往下吃,直到吃完最后一颗时你才发现这根玉米原来压根就烂了,你吐了三天拉了三天后却忘记了自己当初吃玉米的缘由,只剩下一堆无尽的怨言。 银行卡里的生活费准时的打来,人民币上毛爷爷微笑的脸使你渐渐淡忘了家中父母的样貌,你终于有了支配财富的能力以满足你的愿望,这像是一种迟来的报复般让你有种快感,然而当这种权利到手时你却感到一种迷茫与不真实。小时候的你一直暗下决心说等长大了有钱了就要买一大堆零食,结果现在如愿了,但面对超市柜台前满满的零食,你却如何也抬不起兴趣。 生活像是一场黑色幽默的电影,越往后越是笑得想哭出来。 周围的同学渐渐都恋爱了,有几对是新结连理,有几对则是异地的革命伉俪。你开始也心动了,心猿意马地看着校道上那一双双白花花的大腿,你的下半身逐渐代替了上半身的思考能力,你只是不想一个人过了,这样的生活让你感到孤单,无趣,甚至还有那么一点的自卑。高中时你曾经喜欢过一个女生,每当她走过你们班级的窗前你的心跳都会加速得快要蹦出来,那种奇妙的感觉让你喜欢着又害怕着,她就像你心目中的女神一样。那天晚上你终于下了好大的决心发了条短信给她,“在干吗?”“没啊,你呢?”你们有一搭没一搭地聊到了深夜却都心照不宣地不捅破内心的青春情怀。暧昧总是美好的,你以前老是不懂什么叫“人生若只如初见。”现在你渐渐懂了,以后你会更懂。 大学的爱情却让你逐渐感到些许恶心与廉价,前些天你看上一个不错的女生,找了人打听到了她的电话号码,头一句便问她:“你有男朋友吗?”她说,有。之后你便不再回复了。你开始忙了起来,因为你必须马不停蹄地找到下一个猎物。什么时候你失去了等待和耐心爱一个人的能力,你说不上来,在行色匆匆中搪塞着,晚了就找不到对象了。 大学的第一个新年里几个同学在老师家聚会,大家寒暄着暖场,讲着那个陌生地域的生活,有人说得眉飞色舞,有人说得黯然神伤,但却没有人知道明天会怎样。 父母们不再会催你赶紧读书了,你终于有了足够的时间玩游戏,看电视。无论你做什么他们都会一脸慈爱地看着你,有时甚至你自己都过意不去,你觉得是不是他们还会像以前帮你报个补习班或者训练营,结果没有。他们只是老了,累了,你终于考上了他们曾经仰望着的大学,他们感到很欣慰,惟愿你一切安好。 大学却依然在继续着,高考后的第二个夏天来临时你开始有些许羡慕地看着那群刚刚高考完的准大学生们,你听他们喊着你喊过的口号,过着你过过的生活,经历着你的曾经。你喜欢他们那种充满希望的眼神里闪烁着的光,只是你的眼角边不知什么时候多了条皱纹。 你开始得打算自己要往哪个方向发展了,这一年里你旷了将近四分之一的课,每天睡了有十个小时的觉,你交了两个女友,却还不到三个月的时间,到了大一结束的时候你才勉强能念出自己专业的全名,却仍不知道这个专业到底教的是什么。父母们常在你耳边旁敲侧击地说着一些称之为“现实”事情,比如谁谁家的女儿嫁了个好人家,谁谁家的孩子考上公务员后待遇很好。你烦了,爹妈不高兴了,他们会说你已经二十岁了,你则说你的事自己会处理好,但事实上你却依旧迷茫:未来在哪里? 跨入大二前你曾暗下决心要好好学习,就如打仗前的誓师般悲壮。然而在坚持了两个礼拜后却又开始了之前的生活循环,在新的一年里的慢慢发现了身边的人慢慢变了,有的人依旧每天叫上你一起去喝酒玩乐,有的人则一早上就出去,直到晚上才回来,他抱着书,你抱着酒瓶。你们的生活从这里开始分离开来,多年之后你会后悔,但却忘了当初是谁拿起那把剪子分道扬镳。 大二的那个圣诞节里你度过了大学的第三次失恋,你听了一天的《圣诞结》并骂着甩你的女生现实,势力。然而你的舍友却在同一天表白成功了,他和你一样,没有背景,没有一个可以拼的爹,你们曾经在同一条起跑线上,然后现在却互相看不到彼此的身影。你在网上刷了一天的微博看到了那么一句话:“永远不要低估一个女生和你同甘共苦的决心。”你冷冷一笑,关了电脑,却没看到下本句写的:“一个女生最怕的,是在你身上看不到希望。” 大二上学期的春节来临时父母还为你的回来准备着大鱼大肉,貌似什么都没变,但貌似什么都变了一点,就像你的压岁钱不知怎么就少了,几个小外甥甚至还嚷着:“舅舅,给我红包!” 过了这个年你戏谑着自己走在奔三的路上,在回学校的时候父母到车站送你,你突然发现他们的脚步什么时候变慢了,你已经走了好远他们怎么都跟不上,那一刻你突然感到一种前所未有的孤独,就好像曾经可以依靠的肩膀都不在了。 这个春天你觉得怎么过得那么快,你说你已经不打游戏了,不打牌了,也不常和朋友出去玩了,你说你制定了一个计划,但为什么日子还是过得那么快,白天转眼就是黑夜。 就像又到了一年的高考时。 我等不了你了,少年。

2012-06-27 · 1 min · bystander

c#温故而知新: 线程篇

上次的C#温故而知新:Stream篇 已经完结了,这次,JimmyZheng 开始更新线程了,转发收藏,持续更新,当然你也可以直接去看JimmyZheng的文章,欢迎学习交流 c#温故而知新: 线程篇(一):Thread c#温故而知新: 线程篇(二):线程池和异步线程

2012-06-24 · 1 min · bystander