先简单介绍一下我自己,我是一所普通大学的本科生,大学录取时的专业是非计算机系的,在大一下学期意识到自己喜欢敲代码以后,就提交了转专业申请。大二起开始在计算机系学习。大三时(年4月)拿到了腾讯暑期实习的offer,暑期实习的过程中获得留用offer,大四没跑秋招,几乎就在学校浪荡了一年。
我不是大牛,不是来传播鸡汤或成功学的,只是最近有感于学弟学妹们在学习以及规划方面严重不足,觉得这是一个共性问题,遂捉起纸笔,写点东西。
确定方向
1.1选择比努力更重要越早确定选择的方向越好,生活中我们会面临无数个选择,一个和黑客相关的美剧中有句台词说的很好——“lifeisbinary”。
生活就是二进制,一个个组成的。每一次抉择,选了就是1,不选就是0。另外也有一句话说:“人一生要面临很多选择,但是真正能决定你命运的只有几个”。
本文是面向确定了毕业要工作的学生的,就业方面来讲,文章标题是码农,但实际是指所有计算机相关的技术工种。包括开发、测试、运维等。
很多选择本身并没有对错或优劣,只有适合不适合。
不要滥用勤能补拙,勤能补拙这个词语一度被很多人当成自己的人生准则,但同时这也成了枷锁。我相信这个词,但是要考虑现状,要考虑投资回报率。你在自己并不擅长或不感兴趣的领域深耕了四年, 不一定能获得多少成绩。当然如果你能在毕业后继续深耕几年或许是可以的,但是我希望每一位大学生在毕业的时候都能有一份好的工作,并且如果你并不喜欢某一领域的话,那么我相信你一定不会坚持下去。所以我们一定要找到适合自己的方向!
那么如何发现自己对什么感兴趣呢?我也不知道很好的办法,我只知道一个朴素的方法——尝试。趁着年轻,就要多尝试。千万不要快毕业了都还不知道自己兴趣在哪,想做什么,适合什么。所以在一开始的时候就努力去碰钉子吧。
1.算法还是开发数据结构和算法很重要,无论是面试还是工作,无论你从事哪方面的技术。不过算法虽然重要,但并不适合每个人都花费大学全部的精力去钻研。
相信很多学校都有ACM竞赛相关的社团或组织。很不幸,我们学校没有,我大一的时候也花了很多精力刷题,但是硬件条件不太允许,氛围太缺乏。如果你觉得自己能够在ACM比赛中游刃有余,那么恭喜你,你可以一心一意搞算法。如果你觉得自己在这个过程中十分吃力,挫败感频生,那么也不要气馁,或许有另一条路是属于你的。选择开发,有算法功底深厚是很棒的事,但是仅仅只有算法同样是不够的,计算机海洋还有很多未知等着你探索。
算法岗包括数据挖掘、机器学习之类的(怎么样,高大上吧,反正我不懂)。要说明的是想做算法的同学 选择读研继续深造,因为大企业在算法岗的招聘上对本科生是很不友好的。还是要申明一句,你做开发也不能忽视算法和数据结构,起码面试还是经常考的!记住一句——“算法功底好的人,运气都不会差”。
对于本科生而言做开发还是相对容易的一条道路,不过开发的技术路线也是不胜枚举:前端、后台(PHP后台、Java后台等等)、移动端(安卓和iOS)、游戏开发、数据库(比如做DBA)等等……这里我肯定不会去推荐你去学哪一种,我没有能力也不适合。只有你自己才能发现自己的兴趣以及好奇心之所在。
1.3认识技术关于技术,很多学生都存在诸多误区。初学者总喜欢追随牛逼的技术,实在过于盲目,找准自己的定位最重要。
误区1:图形化的东西比非图形化东西更牛逼×
多见于初学者,尤其是计算机专业新生(我大一的时候就是)。当时学校教了点C语言,一直都是控制台程序,面对黑窗口,我就各种百度看看怎么弄出图形化的东西,那时候才知道GUI这个缩写是啥意思(当初知道这个缩写的全称还小激动了一下下,果然我还是太年轻了),然后知道了WIN3、MFC这些名词。确实只能说是知道名词。当时对着视频教程做了计算器,就是用VC++拖拖控件,视频里的人敲一句代码,我就敲一句。后面虽然弄出来了,但是感觉自己什么都不懂,只是依样画葫芦。这时我才意识到,还有很多基础没有打劳。
八卦一下,现在桌面客户端的开发工作并不多,所以大家谨慎选择这一技术方向。桌面端GUI技术一度火爆(MFC、Qt、WinForm、WPF、Swing……),但如今早已是互联网及移动互联网时代。所以大家真的要慎重选择。不过还是可以学习一下的,至少能加深你对编程语言以及设计模式的理解。
误区:非图形化的东西比图形化的东西更牛逼×
具体而言就比如说:后台技术比前端技术、客户端(Android、ios)更牛逼。多见于有Linux背景的人(没错,说的就是我=_=
)。
我也一度这样认为,其实不然。这里和上一个误区一起澄清一下:技术本身没有高低优劣之分,但程序员对其有好恶之别。
另外要说明一下,不能说前端就简单,后台就更难,同样反过来说也不对。我只能说这完全是不同层面的东西,不能量化的去比较。前后端都自有其难点以及G点。你不能说你能处理后端复杂的并发、同步、高可用,那么你就能轻松地完成美观的网页及 、处理麻烦的浏览器兼容、极尽所能地降低页面的加载速度。就好比同样是一双按在键盘上的手,那么钢琴家演奏优美的乐曲和程序员开发高性能的软件,哪个更困难?(比喻不一定贴切,但希望大家能明白这个意思)
误区3:XXX是最美的语言/框架/平台/……×
多见于php程序员。哈哈,开个玩笑。这里不是在谈论谁是 的语言,而是告诉大学生朋友们不要迷信论断。
我大一的时候去图书馆看书,看到有JavaWeb的书,前言写的很清楚,痛斥了PHP和ASP.NET的缺点,阐述Java是多么 ,OK。你可能也和我一样,在入门的时候经历过类似的事。我要告诉你的事,多翻几本书,你会看到ASP.net和PHP书籍的前言写的同样精彩,你绝不会在ASP.Net的书里看到夸耀Java的句子。不同的技术自有其优劣,千万不要成为前言驱动的学习者。
继续八卦一下,虽然说不通技术自有其优劣,但是就目前国内形势来看,学习Java 是不错的投资,Java后台几乎占据了中国互联网企业后台的半壁江山。而.NET技术确实日薄西山。不过PHP现在依然有很顽强的生命力。
另外还有一些经典论断:
LAMP架构只适合中小企业;
MySQL只能用于中小企业,大企业都用Oracle......等等。
这些论断从技术角度出发,确实无可非议,但却并不客观。我也见过一些朋友,对MySQL充满鄙夷,觉得mysql很容易出现瓶颈之类的。其实我想说,阿里、腾讯都大量使用了MySQL。别问我为啥MySQL被这么大体量的公司采用(无外乎开源的好处和历史原因啦),我觉得,只要技术够屌,什么瓶颈都能克服。。
学习那点事
.1关于自学很多学生总是走极端,说到自学就一点课都不上了,看不起学校的课程安排。自己在寝室学个把月就能轻轻松松地做出网站或者APP。但是我想告诉你,你能做到的,别人同样能做到。有一句话说的很好:“你的工资不是和你的工作时间成正比,而是和你的不可替代性成正比”。
所以说学校教的基础课是很重要的,最直接的好处就是笔试,笔试考的就是基础。然后这对你长期的职业发展也是很有帮助的。你工作几年之后(可能就是一两年),发展肯定会遇到瓶颈。
.关于读书多读书,读好书!这是一句老掉牙的话了,但是事实就是如此,阅读经典书籍,你的投资回报率其实远高于阅读低质量的书籍。那么什么是低质量的书籍呢?比如《1天精通XXX》之类的。但是不管读什么书,都不能盲目跟风、囫囵吞枣。在网上,生活中经常看到各种索要书单的网友,借鉴别人的书单是可以得,但是直接照搬照抄则是不明智的。因为每个人已有的知识储备是不一样的,别人阅读的书籍不一定适合你。所以阅读合适的书籍也是一种重要的命题。
那什么是不合适的书籍呢?我认为有如下几类:
与自己的技术栈毫不相干的。这相关与否是建立在你已经做了清晰的职业规划的基础上,并且通过搜集信息能够自己辨识哪些是和自己的技术栈相关的,哪些是不相关的。当然,我并不是鼓吹大家技能点越单一越好,技术人员当然需要不停扩充知识面,但是对于学生而言,这要建立在你在主要的技术栈上的积累已经足够多的时候(足以应付面试),不然东一榔头,西一棒槌, 只能样样稀松。
超出自己能力范围的。虽然我前面说要读好书,要读经典书籍,但是一定要量力而行。很多经典书籍的阅读需要一定的基础,如果你只看到了别人对这本书推崇备至就开始强行阅读, 通常也不多是走马观花,像读小说一样读完了而已, 什么都没学到,还浪费了时间。老子说“企者不立,跨者不行”就是这么个道理。
知识点与自身已具备知识过度重合的。面对一本经典书籍,可能你已经具备了那本书中所阐述的绝大部分知识,那么还有没有必要读呢?我的建议是阅读,因为这样可以查漏补缺,但不要通读。很多经典书籍,单拿出一本来说都是值得阅读的,但是放到一起就不一定了。因为两本书籍可能70%甚至80%的内容类似,这时你读完一本,再通读另一本就没有必要了,比如我读了《C++Primer》就没再去读《C++PrimerPlus》了。当然你可以阅读不重合的部分,这需要你有较强的辨识能力。
《C++PrimerPlus》虽然从名字上看起来像是《C++Primer》的加强版,但其实并不是。它们是不同的作者,并且从风评来看《C++PrimerPlus》貌似比《C++Primer》还要基础一些。
.3打造自己的技术栈技术栈,或者叫技术体系、知识体系。首技术栈起于编程语言却又不止于编程语言。你可以多尝试,然后找到自己喜爱的技术方向开发深挖。然而很多学生通常会在起步的时候就陷入迷茫。在网上看到过一个人,想学web开发,各种调研,然后向别人征求意见该学哪门语言比较好,哪个框架更有优势。后面大概过了半年,他还在纠结该选哪一个。
我只想说:先跑起来。语言很重要但并没有那么重要。无论语言还是框架这些都是工具,在这些工具的使用过程中提炼出的思想、方法、认知才是你的能力。有了能力,即使你换了语言,换了框架照样能快速上手。我觉得大公司一般不会计较你对某一框架的API熟悉不熟悉,他更看重的是你对框架背后的设计哲学和原理是否了解。
技术栈就像一棵大树,树根可能是操作系统、网络、算法、数据库。再靠上一点是编程语言。接着树干就是你的职业方向,可以是安卓、IOS、前端、后台等等。别忘了还有树枝和树叶。技术没有孤岛。把自己封闭在闭塞的圈子内十分危险。你应该是具备了深度的同时再拥有广度,请注意拥有深度是前提。
没有什么东西 该学或者 不该学的,切忌盲从,照搬照抄别人的学习经历,强迫自己看别人的书单。谁说你是后台的就不能看前端的东西?在你后台技术成熟之后是可以的,这样也能加深你对整体架构的理解。
另外这些树枝和树叶上悬挂着的也可能NoSQL、Git或者Docker等,你不需要在每个方面都是专家,但你应该对新技术抱有好奇心。
.4深度思考和提炼不管是前端还是后台,框架都是层出不穷的。每个都学,谁都会疲于学习。但实际上你并没有必要这么做,对于一个框架,记忆它的API永远是 的技能,你要从中提炼出一些共性的知识点。比如后台框架,你学了之后你要记住的应该是URL路由、模板、权限控制、MVC的设计等等。那么你换一个框架,即使有不同,你也能快速上手,思维上只是换一套API,接着补一下个别差异,新特征而以。对于编程语言的学习也是如此。
C++的STL里面有各种算法,很多时候参数的参数都包含一个函数对象(实际为重载运算符()),这就是函数式编程啊。学了JavaScript,你会感觉到很多时候其实也都是在进行函数式编程,并且比C++更甚,尤其是jQuery这个库的用法。提炼出不同语言之中的相似处及不同点,不仅能帮助你学习新语言,并且能帮助你巩固旧语言,加深你对旧语言的理解。
另外,计算机学科的很多课程其实并不是完全孤立的(虽然可能看起来如此)。你比如说操作系统课,讲链接和装载,这肯定和c语言编译的可执行文件有莫大关联啦。讲内存管理,分段是啥?你不知道C语言里面数据段、代码段、等等吗?内存的分配策略和分配算法,其实C语言里面malloc就在使用这些策略啊。大家一定要学会在不同课程之间建立联系,这是一件很有趣事。
求职准备
3.1早做规划关于求职,一定要早做规划。
举个例子:
我意识到自己直接参加秋招可能有很多不足,但是如果我找一个暑期实习应该相对秋招要来的容易,并且实习留用的概率也比直接秋招通过的概率高。退一步讲,即便我实习不能留用,我已经有了实习经历,勇气真的很重要,那么我再去参加其他公司的秋招胜算也会大很多。并且,多问一问相关的老师以及明确自己想要求职的工作类型。
自己的短板一定要早点发现,然后及时找到弥补方案。比如你项目经验匮乏,那么你就应该在其他地方找到填补,例如:把基础打牢(从上层应用到底层原理),深入了解数据结构和算法,阅读开源项目源码等等。
俗话说“知己知彼,百战不殆”,你应该找个时间(不需要太早)去看一看你所石家庄治疗白癜风的医院白斑医院