从开始到微信/支付宝/Airbnb/抖音Offer——我的大学客户端开发学习之路(一)开始——步入大学生活
写在前面
首先原谅我用这样的标题来博得关注和点击,因为思前想后也只有我所拿到的Offer才最能在一定程度上代表能力,为我下面将要分享的内容作背书。
在最开始准备写这篇文章的时候只是想像往常那样放在我的博客上作为自己的回忆和总结,不太想去获得别人的关注;但另一个声音告诉我这些东西和之前的技术文章不太一样,这些经验和教训可能可以帮助到很多刚刚踏入校门的新人们,或多或少地产生一些价值。
既然决定了写这篇文章是为了创造价值,那么只有分享出来,让更多感兴趣的人看到才能创造更多的价值,这就是此时此刻你能看到这篇文章的原因。
由于文章的篇幅已经远超最初的预想,所以会拆成几篇分别在微信公众号VirMe发出(确实是公众号最适合创作与分享,还烦请关注),所有文章共用开头部分,特此说明。
个人介绍
笔者2016年高考考入华中科技大学计算机科学与技术专业,同年10月份加入学生技术团队联创团队Android组,后任组长。
2017年底(大二寒假)拿到今日头条(字节跳动)深圳研发中心Android开发实习生Offer,在深圳研发中心实习至2018年3月。
2018年4月加入新成立的今日头条武汉研发中心实习,2019年5月离职。
2019年春招拿到腾讯(微信)、蚂蚁金服(支付宝)、Airbnb的暑期实习Offer,2019年7月加入微信实习。
2019年秋招拿到字节跳动SSP(抖音)、微信***(转正)、猿辅导SP(斑马英语)校招Offer,最终选择留在微信,目前仍实习在职。
在我的大学四年中,有四年的Android开发经历,两年半的实习经历,有两款Google Play上架的应用,个人原创技术博客也收获了25w+的访问量,当然,最重要的是最后拿到了自己满意的Offer,也算是给大学生活画上一个比较完整的句号了。
文章目的
上面介绍的经历并不是为了显示我的经历有多牛逼,事实上在我认识的范围内我的经历还远远谈不上出彩。当我刚刚考入大学,进入我心仪的计算机专业时,觉得提升自己的技术、加入BAT这样的大厂就是我的目标,这也由此指引了我大学生活的方向。相信很多无论是不是刚入学的新生、也无论是不是计算机专业,都有着像我那时的想法。很幸运的是我在非典型的大学四年中找对了方向,也找到了方法,收获了很多的经验与教训,最终达到甚至稍稍超出了自己当初的立下那个目标。
现在回想起来,这很大程度上要归功于给我提出建议、给我指引的前辈们,没有前人的经验我们很难找到正确的方向与方法,以至于陷入无谓的迷茫与焦虑之中。当然在这过程中,也从自己的经历中认识到很多“假如我早点知道该多好”的问题。我所在的华中科技大学联创团队(学生技术团队)有着近20年的历史积累,通过前辈的方法与经验的传承,近年就业的队员几乎是人手几家大厂SP Offer,我想这些方法与经验应该是行之有效的,也是值得与大家分享的。
我写这篇文章的目的也正是在此,一是为了总结自己的大学四年;二是给有着和我一样的目标的同学们一些参考和建议(包括对应届生比较实用的面经),希望可以给读到这篇文章你们一些帮助,希望你们也可以达到自己的目标或是在追求更高的目标的路上更进一步,也算是作出一些微小的贡献;三也是为了帮助大家更好地认识客户端开发这个现在普遍认识不足却有着极大缺口的方向,也是给我所在的联创团队、微信团队打打广告。
虽然文章标题写的是客户端开发之路,但是文中80%以上的内容都是对于技术学习方向比较通用的内容;同时,本文主要面向毕业直接工作的同学,所以不会涉及到读研、出国相关的内容。
最后,本文表达的内容都是一些自己的看法,也仅代表个人的观点,受文笔和经验所限,表达不当之处敬请包涵,也恳请经验更加丰富的前辈多多指正。
正文
大学四年的经历很长,总归不是三言两语就能表达清楚的,每个人所处的阶段不同可能感兴趣的内容也不同,为了保证阅读体验,会主要分为三篇文章(非通用内容和一些书籍推荐等会后面另行发出):
对刚进入大学、想要在未来从事开发工作的大一大二新生的一些建议:
如何在大学阶段学习计算机并获得快速的技术成长
关于实习;如何准备面试、在面试中展现自己以及最终的选择
本文是其中的第一篇,其他文章敬请关注公众号VirMe。
(一)开始——步入大学生活
为什么选择计算机专业?
这是我经常问刚进入计算机系,或是面试联创团队(下称团队)的学弟学妹们的一个问题。我听到的答案其实大概有如下几种:
- 父母让我选择计算机专业
- 我觉得当下学计算机就业轻松,并且收入不错
- 我喜欢玩电脑、打游戏,对计算机感兴趣
- 我有过编程经验,我喜欢编程
这四个答案可以分为两类,一类是有强烈的外在驱动:当下风口、就业前景、收入水平;另一类则是自己的自驱力:我想要学。
确实,当下的计算机行业,在一阵阵的热潮之中,一直处于人才供不应求的阶段,由此也带来了相对较高的收益,在这样的背景下,计算机专业的录取分数线也水涨船高,在很多省份的录取分数已经超过了华科最王牌的机械、光电专业。我高考时619分就能进的计算机,三年后学弟的录取分数却高达650。不得不说这是一些家长和同学的功利心理导致的。但现实是残酷的,在被我问过这个问题的同学中,往往答案是后两种的同学最终进了团队,在技术上早早地取得优势,在能力上也远远超出了其他同学。
背后的原因其实很明显,大学的专业本来就是为了满足不同人发挥不同的兴趣特长而设立的,而在逐利的背景下,大批怀揣着高薪梦想,觉得录取到计算机专业就高枕无忧的同学涌入,殊不知就算是华科的计算机系,每年都会有不少的同学因为不能完成基本的课业而被退学,到了大四面临着无法按时毕业,在招聘季为了一份工作焦头烂额,更是有80%以上的同学本科毕业时甚至写不出一个没Bug的快速排序。
行业决定下限,这句话不假,只要你在大学四年中认真完成所有学校设立的课程,完成学业后可以比较轻松地找到一份“还算不错”的工作(华为每年都会在华科统一价批发走一大批学生),薪资也可以轻松超过绝大多数其他专业的同届同学。但是这并不代表不用付出相应的努力,计算机是一门知识非常系统的学科,也是一门学习曲线一开始较为陡峭的学科,这意味着从一开始就需要付出很大努力并且短期内很难看到直接的收益,从基础的数据结构、算法、C语言学起,对于一个刚接触计算机科学的新人来说无不是抽象且晦涩的,在我刚开始学习它们的很长一段时间里我都会问自己这些东西有什么用,为什么我写的程序只能在终端里面输出一些字符,怎么才能写出那种有界面能用的软件呢?事实上这些知识的作用在一段时间后才会体现出来,例如当需要自己使用C语言实现操作系统的一部分、需要理解操作系统线程调度算法、需要设计编译原理的抽象语法树时,没有前置的技术积累将会使得后续知识的学习变得寸步难行。
有很大一部分同学在真正开始学习计算机时并没有意识到这一点,在刚进入大学失去外在的束缚并且时间较为宽裕的情况下,没有付出足够的时间在这些基础的较为枯燥的课程上,导致在后面的课程中处处碰壁,使得没有完全掌握的内容越来越多,最终自暴自弃,失去了在宝贵的大学四年中更加深入地学习这些通用课程的机会。
而能支撑我们从一开始学习看似枯燥的知识到后面持续不断的付出与深入的,很多时候只有自己的自驱力,因为我喜欢计算机,才会心甘情愿付出比别人多几倍的时间;才会在别人翘课、游戏、参加各种活动的时候静下心来对着屏幕上的字符;才会在遇到一个又一个Bug的时候花上几个小时的时间去调试。这样的自驱力对于计算机的学习至关重要。
对我而言,在小学的时候因为数学好,被选去参加NOIP(信息学技术竞赛),那时候还是写的BASIC语言,虽然初中后因为县城的条件,没有再继续下去,但这段经历让我意识到什么是我真正热爱的、愿意付出自己所有的热情去做的事情。所以在高考成绩出来以后,不用十分钟我就确认了自己的志愿:华科的计算机、信安与软件。回想起来,就算一开始遇到了很多困难(大一的时候光是装Linux就装了两个礼拜……),也从来没有想过放弃,靠着兴趣确实做成了很多事情。
事实上,有着计算机兴趣并成功考入计算机专业的人是幸运的少数,对于自身没有多大兴趣又想毕业时拿到头部企业的高薪Offer的同学,我觉得对于功利的追求不会让一个人走得太远,但是兴趣是可以培养的,任何一门学科学到深入都是充满魅力的,尤其是计算机这种非常容易取得满足与成就感的学科(当然这点也不尽然是好事,后续文章会谈)。我相信任何一个有志于从事这个行业的同学都可以在不断深入的过程中找到自己的乐趣。
科班与非科班
在接触到的很多想加入团队或是想应聘头条或是腾讯的同学中,有不少不是计算机专业的,也就是所谓的非科班,他们常问的一个问题是,非科班的身份会不会对找工作有很大的影响?其实这个问题和另一个热门问题很相似:如何看待培训班培养出来的程序员。
在我看来,科班或者非科班就像985、211一样,都是一个人身上的tag,它们常被人用作评判一个人的标准之一,在没有其他任何可以参考的信息时,这些tag就成了衡量个人水平的唯一标准。但计算机的情况并非如此,在评判一个人能否胜任工作岗位时,这些tag的影响力远不如实实在在的实习经验和项目经验,这些项目往往能体现一个人的真实能力,而技术面试可以很容易判断作假的经历与项目。但在技术面试中,还有更重要的一部分,也是科班与非科班最容易体现出的区别。
前面说过,基础知识的积累决定了后续知识的学习能力,而科班则提供了从底层开始向上扩展的课程体系(虽然不尽完善与及时),但培训班和一些非科班同学则将重点放在了最上层和浅显的知识学习,也就是工作中直接接触,可以直接创造价值的那部分。因为在有限的时间内,对于这些知识的快速学习是最有助于看到成效和容易被接受的。把这部分知识学好了,能不能干活呢?或许可以,但是很少有没有系统的计算机知识的人可以深入到问题的背后探究其本质,这也是我们常自嘲“面向StackOverFlow/Github编程”和“Copy&Paste工程师”真正所指的那批人。急功近利的后果是程序运作基本原理知识的缺失、是分析与解决根源问题的能力的缺失、是分析与设计复杂系统的潜力的缺失等等,最重要的是失去了底层能力的积累也就失去了进一步深入学习的基本能力,导致在技术道路上的停滞不前。
任何有过比较深入的编程经验的程序员都深知基础知识对于从业者的重要性,它在一定程度上代表了一个程序员的潜力与未来,这是为什么各个大厂的招聘要求与面试中都有着对基础知识的考察,非科班同学比较容易缺失的这点就成了就业中的劣势,也造成了一部分公司与面试官的成见。那么非科班的同学是不是就一定没机会与科班同学竞争了呢?绝对不是,但往往需要付出更多。除了需要自学与科班同学相同的基础知识之外,为了顺利毕业也要同时保证本学科的课程可以顺利过关,同时没有合理的安排、教师的指导与考试的束缚,非科班的同学需要更强的自驱力来克服上述的这些困难。
不过,我所认识的非科班的同学(也大都是团队的)最后体现出的能力与结果却都远远强于科班的大部分同学。微信同组有高我一届的船海学院学长大三暑假去了腾讯IEG的游戏引擎组实习,秋招又通过四轮面试加入了微信团队;和我大二一起拿到深圳头条实习Offer的同学是电信学院的;团队同组的机械学院同学大三加入了武汉头条,还从Android开发转到了iOS开发……这样的例子数不胜数,甚至我这届的团队队长也是所谓非科班的。我想,正如上一节所说的那样,也正是非科班的身份和强大的兴趣支持他们不断地付出更多的努力,最终走上了自己想要的路。
路线选择(工作/读研/出国)
本科的同学都会面临这样的问题,在四年本科结束以后,该做什么?这个问题对于计算机专业的同学,可能更加困难。相对于其他专业,计算机同学工作和出国的比例会更高一些,以华科为例,每年计院+软院选择工作、读研和出国的毕业生比例大概为5:3:2。在这里不过多分析各个方向的优劣,每个人的情况不同,也没有任何一个方向会比其他两个有明显的优势,每个人的选择都需要结合自身的情况做出选择,也需要为自己的选择负责,因为每个选择都意味着得与失,每个人想要的生活不同,参考别人的选择并无多大意义,更加值得参考的是选择背后的逻辑。
例如,对于对移动客户端、前端Web这些偏工程类的方向感兴趣的同学,毕业直接工作两年带来的经验和薪资收益通常会优于读研所带来的收益;对图形学、人工智能等科研性质浓厚的方向感兴趣或是想毕业后从教的同学读研几乎是必须的选择。
在这里想说的重点不是如何选择,而是要尽早作出选择。不同的选择努力的方向在很大程度上并不相通,读研的同学需要保证到课率、高质量完成作业和刷题备考以保证绩点可以排在年级前列;出国的同学需要提升语言能力以及科研经历;工作的同学则需要深入学习一个方向的技术、丰富自己的项目与实习经历。
因为时间是有限的,极少的人可以做到同时兼顾课内成绩在年级前列的同时深入学习一个方向的知识并有着丰富的项目/比赛经验,更不用说长时间的在外实习(当然我也认识几位传说级的学长做到了这些)。假设花费同样的精力可以在两个方向上做到90分+90分或是60分+120分,但当真正毕业走向一条道路时,120分所带来的收益会远超于90分。
非常现实的例子是,如果选择读研,花费大量时间完成的项目不会比提升成绩排名更有利于申请学校;反之,如果毕业时选择的是工作,那么加权平均成绩是90分或是60分不会有任何区别,但达到90分花费的精力会是60分的数倍(这里决不是说课内成绩无关紧要,后续文章再谈),把时间用在实习或是做项目上会更有利于找到一份好的工作。
尽早地做出选择,意味着往后的大部分时间分配将会更有目的性,也避免了无谓的迷茫与焦虑,总的来说,就是专注地做一件事情,并把这件事情做到极致。
以我为例,因为比较厌倦应试,也没有出国的经济条件,所以几乎是在刚进入大学时就决定了毕业就工作这条路,所以大学的绝大多数时间都花在了基础知识和Android开发上,也正是由于非常专注与大量的时间投入,才能在大二找到一份难得的实习工作,慢慢走向正轨。当然,也付出了相应的代价,我的很多学校课程都是低分飘过(专业课例外,几乎都是85以上),所幸没有挂过科(这很重要),但这还是意味着我已经没有了任何退路:无法保研、考研,只有工作这唯一的路。
但也不是每个人都能很快地作出自己的选择的,这个时候的建议是在保证自己加权成绩的同时多去了解各个方向,大一的成绩对于最终能否保研至关重要,在作出决定之前要保证自己仍有选择的余地。最不利的情况就是前期没有想好自己想做什么,在课业上没有重视甚至挂科,导致早早失去保研的机会,也没有在技术上下功夫准备工作,到了大三才发现考研和就业都是难度极大,最终的出路也不会太好。
最后,再次强调没有任意一条路会来得更加轻松,就和前面为什么选择计算机的问题一样,只从功利的角度出发,通常走不太远,只有遵循自己的内心,付出相应的努力,才会有达到更高目标的可能。(再次再次说明,之后的内容只针对就业的同学)
技术方向选择
在选择工作这个方向之后,马上要面临的一个问题是——我该学些什么呢?
前文已经多次提到基础知识对于计算机从业者的重要性,如何学习基础知识这点会在后续文章单独讲,在这里想讲的是除开通用知识之外,在就业时通常需要选择一个特定的岗位,也就是需要我们对一个特定领域的知识有深入的了解。
为什么需要对一个方向深入了解呢?你可能听过一个高大上的词叫全栈工程师,指的是掌握多个领域技术,可以独立承担完整链路的开发工作的工程师,为什么不以成为全栈作为自己的技术方向呢?
事实上,在短短的大学四年中,从零开始到完全掌握一个技术方向都不太可能,更不用说掌握多个技术方向了。我在大学里几乎从一开始就在学习Android开发的内容,三年的经验到了公司里还是会被一年工作经验的同事吊打,大量实际的开发经验和校园中能接触到的项目经验不可同日而语。计算机科学与技术是一门知识体系庞大,分支众多的学科,对于零基础的新人,学习基础知识已经需要花费大量的时间,大部分的毕业生也只能做到深入了解一个方向的知识。基于这一点,国内公司大都会设置不同方向的开发岗位,培养某一方向上的专家工程师。
那么应该怎样选择技术方向呢?首先记住一点:各个技术方向没有优劣之分,只是各有特点。
算法与工程
但在选择方向这一问题上,有着很多因为不了解、功利心或是从众心理造成的现象。在我刚进入大学的2016年,如果抓住一个计算机的新生问“你对哪个方向比较感兴趣?”,听到的回答十有八九会是“算法”,因为在很多刚接触计算机的新人眼里,“算法”听上去是充满难度与挑战、十分重要且核心的计算机领域,加上算法工程师的薪资通常也会高出其他岗位,它自然就成了很多人的理想出路;但他们没有看到的是,对很多人来说,算法的学习过程是十分枯燥无趣的,也需要有一定的数学基础和抽象思维能力,不是每个人都适合这样的学习路线,很多人兴致勃勃买了《算法导论》,但到毕业时却不曾读完一遍,这就是不了解和功利心带来的困境。
到了近两年,随着人工智能的火热,新生的回答更多的变成了“想学人工智能”,同样的原因,只不过来得更加猛烈。但对于人工智能的学习,只要稍作了解,就会知道人工智能技术远没有想象的那样高大上,更不用说继续深造几乎是这一路线的唯一选择。
抛开上述问题,即使你在了解之后真的对算法和人工智能感兴趣,并且也能接受它们的学习路线,你还是会面临一个极大的问题——工程岗和算法岗供需关系的极度不平衡。
下面是2019秋招时一名资深HR的朋友圈比较直接地说明了这一问题,在这里分享给大家(已经找不到来源,如有侵权,请联系删除):
图中提到了几个问题:
工程岗(客户端、前端、后台、游戏等)目前供不应求,尤其是客户端与前端,头条在19年更是为客户端专门设立了几万元的签字费、并放宽招聘要求到不要求有客户端开发经验以吸引学生投递,即使如此19年还是剩下了大量的工程岗hc没有招满,其他公司的情况也大致如此。这样的情况到了20年还是没有得到缓解,甚至愈演愈烈。
另一边,算法岗的情况却是严重的供过于求,有如千军万马过独木桥,比较靠前公司的算法岗更是神仙打架。
这样的结果其实在大家的认知与观念扭转过来之前是必然的。
算法岗的需求量相对于工程岗本来就相对较少,在加之近几年的移动互联网崛起,算法岗的需求没有增加多少,但工程岗尤其是客户端的需求却是猛增了好几倍。但大学中的大部分学生还是处于“把算法学好就肯定能找到好工作”的认知中,加之还有一部分学生因为没有一门深入的方向,就业时只能硬着头皮投递算法岗。
确实,算法能力的确是一名合格的程序员必不可少的基础能力,也是各大公司各大岗位面试时必定考察的内容,甚至Google、微软这样的外企只考察候选人的算法能力。但是,Google招聘的目标就是所有学生中的顶尖水平,在所有的通用能力中只有算法是适合在面试中进行考察并且很容易有区分度(Google的算法题较难)。通常,能在算法的学习上达到顶尖水平的学生在其他方向的潜力也是极大的。但对于工程岗日常开发,并不会涉及到非常复杂的算法,面试中考察的算法难度也相对较低,主要目的是考察基本的编码能力和编码风格、候选人准备的充分程度、逻辑思维能力以及思考的全面性,这些能力一部分是之前的积累,另一部分通过一段时间的练习完全可以达标(如何准备工程岗算法面试在后续文章再谈)。
在薪酬方面,确实在以往头部的算法岗会比工程岗高上一些,但可以在算法岗的激烈竞争中拿下头部Offer的人相对于工程岗来说是凤毛麟角,而在当今供需关系不平衡的背景下,算法岗薪资的优势已经近乎不复存在,很多公司已经开始不区分这两个岗位的薪资。在相对小很多的竞争中,工程岗通过努力拿到SP/SSP Offer从而在薪资上领先普通算法岗Offer的机会大很多,而各大公司对于工程岗头部人才的争抢程度远超想象。
所谓“天花板”
盲目选择的另一原因是听从了各种例如“前端工作太低级,后端开发才有深度”、“客户端开发就是天天画界面,不如做后端还能成为架构师”、“XXX没前途,几年就到天花板了,没竞争力”的言论,甚至很多工作几年的所谓前辈也会劝在校学生去做他们认为“有前途、天花板高”的方向,我大二在头条实习的时候同事就曾对我说过:“你条件这么好,做客户端可惜了,趁早转个后端吧”。
觉得偏应用、偏前台的岗位技术难度不大、没有发展空间,进而在不深入了解的情况下盲目选择后端方向,这是工程岗中客户端、前端尤其稀缺的原因。这样的认知对于刚进入大学的新人来说是非常不利的。
前面说过,在大学四年内不太可能从零开始到完全掌握一个技术方向,所谓的“天花板”也只是一部分人在技术能力上停滞不前时的借口。更何况在大学中学习一个技术方向很多情况下只是系统地学习计算机基础知识的切入点。
以我比较熟悉的Android开发为例:
在学习Android开发的初期,确实需要掌握绘制界面这样看起来简单的技能,这是一个应用最上层的、展示给用户使用的部分,在学习界面绘制后,我们很快将会需要处理用户的输入事件、做出响应,在这个过程中,将会接触到很多系统提供的接口,由此,我们开始对用户(相对于系统而言)代码和系统间的交互方式有了一个基本的了解。
虽然一开始可能只是照着书本或者网上写一些自己也不懂什么作用的代码,但是一旦学会查阅文档,了解每个接口的作用与行为后,我们将会对系统的行为有进一步的了解。
当跨越熟悉接口这一阶段、有了对系统行为的初步认知后,我们已经可以独立完成简单的应用了,但当应用的逻辑进一步复杂化时,难免会遇到问题,在查阅资料,解决问题的过程中,为了完全理解系统的行为,我们将会跨出非常重要的一步:阅读系统源码(Android的系统源码是开源的)。由此开始,我们对于Android的学习不再仅限于开发应用、绘制界面本身,而是开始深入地探究一个系统背后的运行原理与设计理念。
而Android作为一个非常成熟的操作系统,有着庞大而又清晰的分层设计:
纵向来看,Android自上而下地贯穿了应用层面到系统内核层面;横向来看,Android的各个子系统、子模块间相互独立,又有着交互与通信;Android同时也是一个基于Linux的操作系统,借由Android我们也可以一窥Linux的种种概念,例如几乎所有的Linux进程间通信方式在Android的源码中都有所体现,同时Android又根据自身的需求设计了大名鼎鼎的进程间通信框架Binder,从对Binder通信机制的学习中,我们可以看到一个驱动级别的组件,是如何通过系统和框架的层层封装,转变为我们日常开发中所能见到的Java层的AIDL工具。我也曾为了弄清楚“触摸事件道到底是哪里来的?”这一问题,顺着源码从Android SDK一路看到了触摸驱动。而这样的例子数不胜数,每次深入探究的过程,都是充满趣味和最终的成就感的。
系统地阅读Android源码的过程,既是对软件架构与设计的理解和学习,又可以深入到系统底层实现中,理解操作系统的方方面面。可以说,这样的过程将我们零散的、琐碎的计算机知识有效地组织了起来,打通了我们从应用直至系统的整个知识体系,同时又可以驱使我们去不断补充相关知识,从各个方面提升自己的能力。
看到这里,你还会认为对Android开发的学习只是画画界面这么简单吗?事实上,这样“以技术方向为切入点,深入学习计算机的方方面面”的学习方式已经成了团队成员进行技术学习的宗旨之一(具体见后续文章),带来的结果是每个人在拥有对技术方向的深入了解的同时,在计算机的基础知识和全面认识方面的综合能力也远超他人,这也就解释了为什么很多队员在毕业后可以很轻松地转向另一个方向,团队Android组往届学长有去阿里做前端的、去美团做后端的,我在微信的岗位实际上也是游戏方向,并且在很短的时间内上手了iOS开发。
所以,个人的技术水平永远不是选择的方向所能决定的,了解一下各个方向的大牛们在做什么就能轻易地明白这一点。在大学这个阶段,选择一个技术方向时,更不应该考虑这些因素,是否能全身心地投入其中,保持不断的深入学习才是更重要的。
那么,应该如何学习呢?这个问题是下篇文章的重点,在这里就先吊个胃口了。
可以试错
既然真正学习的是计算机基础知识,那么选择的方向其实在一开始并不是那么重要,如果发现自己一开始对这个方向的了解出现了偏差,在毕业后并不想从事这个方向的工作,完全可以选择换一个方向,学到的基础知识永远不会作废。大学中一个极大的优势就是可以近乎无成本地试错。在毕业真正走向工作岗位后,主动对自己的岗位做出调整的机会就小很多,也要付出相应的代价。
所以,大胆地选择一个方向吧,没有什么可以担心的,Follow Your Heart!
技术团队
在本文的最后一部分,谈谈我在前文多次提到的联创团队及这样一个团队(或是类似的组织、实验室、甚至是学习小组等)能给我们带来什么。
首先介绍下我所加入的联创团队,联创团队是华科的一个学生技术团队,至今已经有20年的历史。很多人第一反应会是:这是个社团吗?其实团队和社团完全不同,我们没有真正意义上的指导老师,是一个纯学生组织,完全由学生自己负责团队的一切事务;但是我们却隶属于华中科技大学的启明学院,在学院的大楼中有自己独立的办公场地,是学院提供支持的创新团队,图为启明学院大楼、团队场地。
团队因兴趣而起,由一批志同道合的学生创立,联创二字就意为“联众人之志,创非凡之事”。团队成员曾在微软创新杯中多次取得名次;在2016世界大学生超算大赛获得全球第一名;举办了国内第一个面向大学生的Unique Hack-Day(编程马拉松)并延续六届。
目前团队内部按照兴趣分为了Android/iOS/Web/Game/AI/Design/PM/Lab八个组,在每年进行两次主要的招新和一次夏令营招新,招新会设置一轮笔试、一轮组内面试、一轮熬夜测试和最后的群体面试,比较有特色的是熬夜测试,新人会被要求在一个晚上的时间内(21点-次日7点)完成各组的编程题目,可以查阅任何资料,目的是考查热情和短时间内的学习能力。经过层层面试筛选出来的新人还需要经历一个学期的实习期,需要完成布置的项目任务。
这样的经历是非常难忘,我至今还记得那晚是我第一次为了一个目标如此投入,为了完成那六道题目忘记了时间的流逝和身体的困倦,大概也是从那时候开始明白全身心的投入可以完成怎样之前不曾想象的事情。
这一套严格的招新标准已经在团队实行了多年,本着宁缺毋滥的原则,目的是为了筛选出真正对计算机有学习热情,并且有不错的学习能力的同学。事实上每年能加入团队的新人每组都在个位数,甚至经常会出现一个不招的情况。
事实证明这样的招新标准带来的是团队内部较好的氛围和真正志同道合、可以共同进步的队友们,也就是满足文章前几节所说的:有自驱力、热情、并且明白自己想要什么的人。
那么,加入团队以后需要做什么呢?其实,除了唯一的时间要求和实习期的任务,没有其他任何的限制,也没有所谓的课程或是培训,前面说过团队的宗旨是把志同道合的同学聚在一起,而要做的事情则完全看大家的想法,我们会因为兴趣去做一些项目、一起打一个比赛、甚至是举办一个比赛。当然,绝大部分的时间都是在自学中度过的。
先来谈谈时间要求,团队会要求实习期的同学每周在团队办公场地待满40小时的时间(正式队员要求略低),为什么要设立这样一个(也是唯一的一个)制度呢?首先,这基于一个认识:只有付出了相应时间的投入,才有可能取得对应的收获,之后将要说的所有的学习的方式方法,都必须基于一点——投入足够的时间,这也是团队传承这么多年来留下的金规玉律;其次,为什么限制一定要在团队?一是为了形成一种约束,不是每个人都有着极强的自制力来保证每天的学习时间,所谓寝室是大学生的坟墓,专门的场地可以把时间集中起来,提高学习的效率;二是为了形成一种氛围,每个人的认知都有局限性,即使学习的是一个方向的知识,很多时候也做不到面面俱到,把大家都放到同一个屋子里,相互交流,取长补短,才能共同进步;三是为了做项目、打比赛方便,团队的前辈们也曾为了微软创新杯在学校外面租了个房子待了三个月,就像微信诞生的小黑屋那样,和志同道合的人在一起为一个目标奋斗的感觉是非常棒的。
团队会为每个新人分配一名学长作为mentor(导师),对新人的任务进度、代码质量、学习路线进行指导,这也是经验传承的一部分,很多东西(比如代码从一开始就注重code style、尽可能使用Google等等下篇文章的主要内容)都是这样一代代总结和传承下来的。有了这样的引路人做一对一不遗余力的指导,才能保证每个人的方向不至于走偏。
在每周的固定时间,各组内会进行meet up(周会),每个人需要详细介绍自己一周学习的内容,并一般会进行某个方面的分享,分享内容通常是自己最近深入学习或是觉得有意思的某个主题。在了解别人学习内容的过程中,可以知道同级的同学的学习进度,也会知道学长们在做的事情(也就是自己未来将会接触的内容),这样就能比较容易地知道自己还有哪些地方不足,以及未来需要掌握的内容。我也是从学长们的一次次分享中了解了原来Android的源码中有着这么多值得学习的点,明白了基础知识的重要性,知道了外面的企业需要我们拥有什么能力。而这些东西,没有团队的交流,我想不可能这么早就能意识到。也就是在不知不觉中,在团队中学到的东西已经远远超过了课内所学习的,所以很多学长毕业时会留下这样一句话:
我的大学叫联创
这句话到了我这里依然成立。
一个人的力量终究是有限的,当这条路上有人陪伴的时候才能走得更远,所以,如果你的学校有类似的组织,非常推荐你尝试加入。如果没有,我相信总会有和你志同道合的人等待着你,也同样会有已经走上这条路的学长愿意去与你分享这些经验,我也是其中的一员。
这是全文的第一部分,介绍了在刚进入大学时需要思考的一些问题。在下一篇文章中,将主要会介绍一些在大学中学习计算机的一些方法与经验。
如果以上的内容对你有所帮助,欢迎你把它分享给更多人,谢谢!
如果有任何想法、疑问、意见或是建议,欢迎关注公众号VirMe留言交流。