我是一只IT小小鸟-连载3
0赞二、刘 帅 在失望中寻找希望
曾经多少次跌倒在路上
曾经多少次折断过翅膀
如今我已不再感到彷徨
我想超越这平凡的生活
--汪峰《怒放的生命》
引子:失望中有希望么
我是为数不多的本科毕业工作三年后再读研究生的人。上本科以来的十年,却大部分是在茫然中度过的。我迷迷糊糊,跌跌撞撞。痛苦中有奋斗,挣扎中有快乐。
高中的理想如此简单:上清华,考北大
我的高中绝对是在盲目自负中浓墨重彩地走过的,因为自己的勤奋和对数理化的热爱,班级第一名的头衔时刻挂在自己身上,结果除了清华北大之外,对任何学校都不怎么关心,再加上学校对于学生除了考出好成绩之外什么都不关心的教学方式,使得自己对于大学、专业、前途等一切的一切都处于超级茫然状态,仿佛自己的一生只是为了去清华北大读书,仅此而已。多么可笑的理想与人生目标,但也正是这样的目标促使自己在高中阶段不断努力、永不放弃。然而,我一个初中同学的成绩一直排在我前面,我没有任何办法超越他,因此,高考估完分数后,知道清华已经没有希望,于是就不知道自己的下一个目标是哪里了。
那时,对其他学校认知的匮乏让自己无助起来,最后的抉择,是希望选择一个好的专业,于是比较热门的计算机科学与技术和通信工程专业成了自己的首选。计算机这种奇妙的东西,相信没有哪个学理工科的男孩子不热爱吧,于是我就选择了计算机作为自己的专业。根据专业来选择学校,按道理说也算是一种策略吧,但我了解的学校资源实在太少,再加上自己当时是个不愿意与任何人交流的人,于是最终,听从了亲戚的安排,去了西安电子科技大学,一所电子类的相当专而小的学校。
我的母校--西安电子科技大学,被国外教授礼节性地夸赞为"中国的MIT",但显然,我们都清楚,这种赞誉实在是过了。现在想想,本科时候的自己是多么的不合群,多么的2。当时自己的价值观念是读书为要,一切让道,完全套用自己的高中思维来应对大学生活,最终到处碰壁。
清晰记得几个经典段子
军训时,宿舍其他同学闲暇时听的歌曲以流行、摇滚为主,当时,著名的爱华(后来被SONY收购)和SONY的超薄Walkman还是一种奢侈品。罗大佑、唐朝乐队等的音乐在宿舍里面回荡,而我当时出校一次,带回了一盘《歌唱祖国》的磁带,回来后遭到了几乎所有人的唏嘘,此时自己才发现,原来我和别人的差异是如此的大。但当初哪里会认为是自己的问题啊,一如既往地认为所有人都很2,坚持着自己的风格,一如既往地跟大家不太合。
还清晰地记得,当时军训结束,几乎所有人都脱掉军装穿上带有自己个性的衣服去开学院的一次全体会议,唯有我一个人穿着军装进去,结果被所有人视为异类--而且我不仅穿着军装进去,还挂着肩上的领花横杠,一切的一切都印证着一个农村来的孩子,接受着最最红色的正统教育,他的入校阶段的生活会是多么的尴尬!
本科四年定调:迷迷糊糊、庸庸碌碌地拿着奖学金
我是科班--却没学懂计算机
我是传统意义上的计算机科班出身,学过数据结构、编译原理、操作系统、汇编语言、计算机原理、计算机系统结构、离散数学、概率论、计算机网络、数据库、单片机、算法设计、数理统计、高级语言程序设计、面向对象程序设计,从DOS的Tubro Pascal时代学起,一直学到VC6。然而,我却并没有学懂计算机。
本科时,自己的考试成绩一直排在前面,但几乎所有的时间和精力都花在了犯迷糊、做作业和游戏上。本科阶段是我们精力最最充沛、时间最最富裕、最最容易跟其他人拉开距离的阶段,如何处理这段生活,将会造成最后的千差万别,遗憾的是,当时却没有人告诉我这一点。我像高中阶段一样,只学习那一点点可怜的上课讲的知识,几乎不看教材、不怎么看课外资料,课后的作业基本是独立完成,却从来不是主动地思考、从各个可能的角度出发寻找到解决问题的方法,而是沿着老师讲过的固定的模式,或者寻找类似的解答方法,然后稍微变换,从而完成解答。我总是认真听老师讲课,每次上课从来不预习,从来不会计划这学期我要干什么、这堂课我要干什么,我机械地听着每一节课,机械地在迷糊中重复着作业、考试,我几乎每一个学期都会拿到奖学金,可那又怎么样呢?
拿数据结构这门课程为例,严蔚敏老师的经典教材相信几乎学过计算机的人都是耳熟能详的,这本书上的算法和数据结构短小精悍。我们的授课老师,却只讲最简单的概念和不深的理论描述,给我的感觉就是,"数据结构"几乎是门和"离散数学"差不多的数学课--他用最肤浅的知识,"成功地"告诉了我们"数据结构"是门几乎不用动手写程序的课程,只用上课听听就好了。于是乎,一门需要动手实践、将会极大地提高我们编程素养和思维能力的课程,就被我们这样迷迷糊糊上完了。
震撼:在清华听朱仲涛老师的"数据结构"课
2005年准备研究生考试的时候,我旁听了朱仲涛老师的"数据结构"课,当时的感觉只能用两个字来形容:震撼。在他的课上,我对数据结构有了全新的认识,对计算机也有了一点与以往不同的了解。
他的讲课风格非常独特,他只用1/5的时间简述一下要讲的内容,剩下的时间都是当场写程序。著名的约瑟夫环、Dijkstra算法、Prime算法、快速排序、堆排序、锦标赛排序、Tarjin强连通分量、Convex Hull等深的浅的,教材上有的没有的,全部在课堂上从0开始实现:每遇到一个算法,一边写程序,一边讲解,不懂就将程序的运行结构拿出来分析,并不时地穿插离散数学、概率论、内存管理、C语言、汇编语言等知识,几乎将我们学到的东西非常恰到好处地拿出来,让我们从心里面觉得原来所有的知识是连贯的,我们之前的积累都是有用的,并且富有成就感。
我清晰地记得他在工业工程系课堂上讲"栈"的时候,用计算几何中的Convex Hull(计算几何中求凸包的算法,由美国ACM大牛Graham发明,该算法通过nlogn复杂度求出平面中一堆点的最外层包围矩形边界)来显示栈的使用。这个算法在A4纸上写说明最少也要两页,加上里面具体的技术,个人觉得可以给3个小时的时间来考查一个训练有素的程序员是否合格。而朱老师在1.5小时的时间里,一边讲,一边写,用最优雅的方式,完整地实现了这个算法,写完程序,一个编译错误也没有,成功运行,随机的点,优雅的边界,当时全班鼓掌两分钟。他说:"我很自信,即使是最顶级的程序员,也不能将我的代码优化多少了。"
他的课让我明白:"数据结构",以及一切计算的课程里面,凡是自己不理解的东西,自己说不清道不明的东西,其实有很多人是理解的。我的老师没有给我必要的关键性指导,但,不可否认有一些同学,他们总是先知先觉,他们总是会问"为什么这门课程要这么上",他们总是会思考自己是不是走在正确的路上,于是他们大量丰富自己的实践,从而也优雅地完成了本科学业。但遗憾的是,我和大部分我的同学们,就这样,因为缺乏必要的指导,迷迷糊糊、庸庸碌碌地过完了本科。
现在回想过去,才发现自己当时多么无知、多么机械。其实,不懂的时候,不管任何时候,你都可以去问老师、同学,从而节省大量的时间和精力。我们必须在年轻的时候有意地培养自己独立思考的能力,经常想一想,我要的是什么、为什么要做这件事、做这件事有什么好方法、这样做有什么好处和坏处、如何改进等,也要与人交流、沟通,讲出自己的想法,请别人指正。我们需要培养的是自己的思考方式,而不是简单地获取知识。
计算机专业需要大量时间,需要付出大量精力,也需要极大的耐心。但大部分像我一样的80后都做不到。而做到的,现在几乎没有例外地都找到了很好的工作。
公司不重视技术--与我的兴趣冲突
本科毕业后我就参加了工作,一干就是三年。
我工作的地方是个典型的国有企业转制后的股份制公司,计算机公司,以系统集成和网络为主,软件是副业。我的项目经理和部门经理对我很好,现在我依然感谢他们。只是,我实在无法接受这样的工作状况:待遇一般,沟通匮乏,无视积累,没有传承,频繁的软件部门高层更换预示着软件的步履维艰。也许,我们把软件业务全部外包会更好,但是那么多为公司辛勤工作的员工将何去何从呢?
工作阶段,我的角色还真不少,有点需求分析,有点系统设计,大量的软件开发,大量的系统实施,一点点知识探索,一点点售前支持。既是典型的多面手,又是行行肤浅的门外汉。很少有人能从技术上指导我,不是因为我很牛,只是因为我们实在不是个以技术见长的公司,而我自己,却十分喜欢技术,喜欢和计算机打交道,喜欢盯着计算机的输出而后体会其无穷的美感。这是我喜欢做的事,但工作却不允许我这么做。
考研·读研定调:开始改变思维习惯,化机械记忆为主动思考
若只有机械思维--上了清华又如何
工作的第三年,我准备考研了。我的如意算盘是,当2006年8月我的工作合同到期的时候,能自然而顺利地过渡到研究生阶段。
当时我设想了4种结果:
上清华计算机系的研究生,将来去Microsoft或IBM工作;
调剂到清华软件学院,依然可以去好的外企工作;
调剂到其他院校;
考研失败,就当什么都没发生过,继续工作,或者从头再来。
以上的每一个结局,我都能承受,不算破釜沉舟,但绝对全力以赴。在每一个下班的晚上,在每一个周末的分分秒秒,我蹬着自行车冲到清华,吃饭、看书,回来睡觉,利用工作的间隙继续看书。就这样,没有任何杂念,没有任何包袱,风风雨雨地跑着,简简单单地过着。带着对未来的期盼,和对现有生活的改变,坚持着。也曾经偶尔想过放弃,但更多的是受理想的驱使。
考研的结果,我进了清华大学软件学院。但仔细回想考研的过程,我却依然没有摆脱思维的局限--以机械记忆为主的学习方式。也许是我觉得时间太宝贵,也许是真的连思考的时间都没有了,我每看到一个题目,总是会先看答案,让答案来指引我的思路,而不是用自己的脑子想问题。
这种学习方式在短期内的确会取得很大的成果,但却贻害无穷。长此以往,会使人丧失判断力、理解力和交流能力,只留下可怜的记忆力--这样的人难有大成。这样的学习方式会使我们的思考方式沦为简单地重复和机械地回忆,胆子变小,创新力几乎丧失--对于计算机这种快速变化和要求很高的学科来说,显然没有什么价值。
读研之后我终于正视了自己思维的机械与缺乏活力的问题。我有意识地努力尝试去改变。看书的时候,我每看一会儿就想想作者在说什么,以训练自己的概括能力;看看作者表述得是否合理,以训练自己的怀疑能力;勤于反思,以训练自己提出问题的能力。但习惯是长久养成的,显然改变也是需要一段时间的。
实习之门定调:快想,快说,快干
IBM实习:和以前的工作不一样呢
IBMCRL的环境不错,普通员工的办公场所也算宽敞:电脑两台,都是高配置。空调很凉快,体制宽松,但人们的工作非常紧凑、忙碌,压力大,追求高效。
作为一个曾有过工作经验的实习生,在这里体会到了完全不一样的感觉。
工作效率高、速度快。CRL的整体工作节奏不太像IBM这种巨人的风格。Mentor是个急性子的女博士,脑子非常聪明,解决问题的能力很强。同样的新问题,她能够很大胆地想出新办法。CRL要求员工讲话简短,注重效率,跟人沟通开门见山,且从来不喜欢重复。我在这里体会到,很多时候,如果不能在头三句话里就把一个问题说清楚,后面就可能永远没有开口的机会了。
对新问题的反应快。这里的正式员工论智商,确实赶上了清华排名10%~30%的人才了。没办法,只能以勤补拙了。
工作量大。这里一天的工作量,相当于在以前单位工作一个星期。像战争一样的生活,让我每次下班后见墙就想靠,见床就想睡。不过感觉也非常充实。
没有心计,人比较单纯。有什么说什么,不用耍心眼,不用藏着掖着。可以把辛苦的差事,努力做得简单而快乐。
配套设施不错。运动场所还行,咖啡好喝。
求职之路定调:再次痛感基本功的重要
"完美时空"面试的不完美经历
--崩溃之余也反思
有了本科时找工作的教训,现在,我一心就想找个重视技术、团队氛围很好、周围人水平都比较高的地方,于是投简历基本上都以外企和好的技术公司为主。找工作到现在,我一共面试了17个公司,拒掉5家,被拒11家,最终签下Amazon。挂掉的原因无非是这几个:英语,思维习惯,扎实的算法,兴趣点。其中挂掉的比较典型的公司之一是"完美时空"--我认真地准备了差不多两个星期,可以算是全力以赴,却一无所获,下面讲的就是我面试"完美时空"的不完美经历。
工作场所在一个角落里,问了半天才找到地方,上去一看,傻眼了,完全不像想象的那样:大大的工作场所,有休息的地方,装饰豪华,反而像一个稍微大点的机房,大家紧张地工作着,梦想、实现、进度等在这个局促的环境下显得尤为珍贵。可以肯定地讲,以前同学说的招人不怎么做事的想法是多么的幼稚,哪个创业阶段的公司会用1万多的月薪供着一个不干活的主儿?经过3层楼的寻找,终于在7楼找到一间没有被占用的会议室,HR让我等下,自己去叫程序部的两位Manager下来,我当时以为技术面试应该会限于我做过的几个题目,而那几个题目我已经翻来覆去地想过了。但很遗憾,针对题目问的问题很少,而且我基本上不知所措。
一个Manager先问我当时为什么把题目全部做了,然后让我挑一个,说说做得怎么样?我就把自己实际考虑的、怎么样做会更完美等一系列想法都讲出来,接着他问,题目是这么要求的吗?你从题目能看出来要求什么?我就说要将客户端和服务器端放在一起,要用多线程,界面不能死,要处理异常等,最好启用log记录。然后他问,哪些是题目要求的?你认为最重要的是什么,等等?我就又讲了用TCP和发送接收文本信息等。貌似他还是不满意,他一直强调我将一个简单的问题考虑复杂了,貌似我一直没有抓住重点,很郁闷。
之后问const的问题,问我是不是想过,Java是不是精通,我说是,又被问到,Java如何实现const,Java的const和C++一样吗?怎么实现的?这个问题又让我崩溃了。
再然后,开始随便问了,打击更大。先问,是否玩过游戏,都玩过哪些,自然答玩过。谈到网游,突然问有没有想过升级算法怎么设计,我思考的时候,直接被打断,"考虑过没有",答"考虑过"。"怎么实现?",我沿用暴雪的魔兽的算法基本上讲了一下,也不知道答得咋样。此后因为我星际玩得最多,问如何保证种族的平衡性,这个我又傻了,居然说了根据实际运作的过程来反馈,以及提了一点攻击属性和兵种等。这个问题又答得很差,其实还是平时没有怎么去想,脑子之前没有转过,现场去转总会犯傻的。下来想想,应该是保证各个种族的兵种基本上都既有对应兵种,又有相克兵种,每一个兵种攻击都设计它的强项和弱项,每一种战术都有相克的战术,如果考虑到这些,应该就能保证基本的平衡了。不知道这样回答对不对,至少比当场回答得好。
又问,如果让你设计口袋西游,你怎么设计?这个问题估计我又扯淡了,没答到点子上,全凭自己的想象来。再后面就是项目经验的回顾了,这次比以往每次都来得深入。同样被问到,lucence的文件索引怎么实现的?唉,知其然不知其所以然,这是我一贯的问题,NB的公司总是问到我的软肋。答曰,没看过。又问,如果不用lucence,你怎么办?有没有替代方案,你觉得整个项目你最引人瞩目的地方是什么,你最愿意展示的是什么?我曾经讲过无数遍这个项目,不同的公司关注点很不一样,像这样被抓住问的还是第一次。之后谈到在IBM做的项目,谈到了一点测试,直接被问到,你觉得自动化测试框架怎么设计?如果这样设计性能不好怎么办?怎么优化?我对测试本来就不怎么懂,这样面下来又崩溃了。然后问平时我的项目大概有多少,怎么做的测试,答曰较少。用到了Junit,被问到Junit哪些地方不好等,所有关于测试的这些东西基本全挂。
终于不问问题了,估计也不需要再问了,我有多少水分他们应该知道了,他们理想的人应该不是我。他们希望招聘到精通游戏设计,精通并且思考过很多游戏及相关系统底层,并且对测试比较熟悉的人,很遗憾我不是。本以为我会面数据安全部,结果程序部C++部门的两个人下来把我面傻了……游戏设计,游戏中的设计,以及一些底层的问题、测试框架和相关东西,基本上每一个问题都答不好,HR问,你自己给自己打几分,我说80,他忽悠了我一下,我又说70~80,然后边上的Manager诡异地一笑,我意识到不对,看来真的是很惨,可能不及格……曾经寄予了太多的希望,曾经抱着无数的幻想,现在看来,我不属于完美。这次挂掉,对我来说意义很大。其实这是必然的。
好的外企或好的技术公司希望招聘到的学生是做事超级投入,特别乐意思考,充满活力,并且具备一定的行业知识的。因此,在面试准备的时候,应该充分了解自己应聘的公司,多思考,多关注架构等背后的东西,才能应付比较深层次的技术面试。
另外,谦虚、和善、愿意向别人学习、擅长理性思维,是技术类工作面试中的加分项。
结语:总能看见希望的亮光
跌跌撞撞地前行中,还是能悟出一些道理,与大家分享。
1.珍惜每一个生命阶段。每一个人的生活都是精彩的,没有必要厚此薄彼,也没有必要给自己太多的打击。每个人独立地拥有时间,也许我很笨,也许我很穷,所以我需要花费比别人更多的宝贵时间,仅此而已,我要的是--享受过程。
2.做自己的主人。不要辜负上帝给我们的聪慧的大脑,用它来独立地想问题,用自己的眼睛来看世界,用自己的心灵来感受,用自己的金口来提问。不要害怕,不要退缩。
3.加强实践与执行力。不要欠生活,不要欠工作。出来混,总是要还的,你不会的知识,你懒于想通的东西,总是会在一个必要的时候提醒你、惩罚你。将没有搞懂的、希望做到的东西,写在纸上、贴在面前,认真实践,当你做到的越来越多的时候,你就会越来越自信,你的层次会提高的。相信我,人与人之间的差距很大,原因在于自我控制力有差距