似乎又到了春招的时候了,看到了各种经验贴,回想了我这两年艰难的转码自学之路(因为走了很多弯路),觉得也有必要写出来,或许可以帮助到很多决心务码的同学。
首先我要介绍一下我的情况,博主是中部地区985机械专业的本科生,入学谈不上对专业的热爱,但还是不排斥的,大一时才接触C语言编程,那时候可能是由于教学方式不适应导致我并不喜欢编程,然后我就在机械建模、机械设计、单片机中度过了近乎前两年。然鹅让我选择走码只是一个偶然,那就是我对stm32(一种单片机)的恐惧,芯片代码量巨大,我看起来很困难,于是我被迫重新仔细学习编程,于是就一发不可收拾,让我有了走编程的念头。
初步学习我还是建议广大同仁们从C语言和C++入手,毕竟相比于其他语言,他更古老一些,功能也能强大一些(这里不探讨那种语言更好,不然又会吵起来),说起学习C++,很多人都会推荐C++ primer plus入门,没错,这是一本极好的学习资料,但是在我这个几乎编程小白入门的过程中,我反而觉得这算是一本介于入门与进阶之间的书,并不适合刚接触编程的人,而且我发现有些面试宝典里对一些知识点讲的更加透彻,于是我推荐的学习路线是:
谭浩强的C语言程序设计(最基础的入门书)强烈建议将课后习题打一遍,因为刚入门的同学的逻辑水平和数学技能要远强于代码水平,很容易出现眼高手低的情况,练得少就会一下手就出bug C++ primer plus中文版,这就是C++最畅销的书籍了,建议认真阅读,以了解C++各部分与库的用法为主,有时间有毅力的可以把感兴趣的部分手敲一遍(全敲就强人所难了) 程序员面试笔记C/C++、算法、数据结构 这是本红皮书,我觉得这本书在C++11新特性上边解释的比较清楚,比C++ primer plus要生动一些,里边会解释很多经典算法与面试题,可以参考一下,最重要的是要理解概念我也可以讲述一下我的错误经验,我是C语言才会了一点就去看C++ primer plus硬啃,花了很多时间,函数部分、模板类、智能指针好几部分知识还是迷迷糊糊,最后不得已放弃,当我又学完数据结构、刷了很多OJ题目之后再回来看的时候,才看懂了,所以建议大家初步学习以概念为主,真正的学习过程是理论与实践的反复迭代。
进阶学习这里主要写算法的学习,我花了最多的时间在这上边,一个原因是我喜欢追求最好的解决方式吧。我是最开始在课程里了解到了一点点数据结构(仅限于知道名字),于是我就找了本最经典的 数据结构C语言实现 这本书开始看,但是由于我缺少对数据结构的系统认识,很快就被劝退......我以为是我数学功底不够,于是去学习了离散数学,mooc课程+课本,搞了几个星期,最后卡在了图论上,我又以为是对拓扑学认识不足,又买了本拓扑学(黄皮那本)硬啃...最后灰心丧气,好在是我想到了刚入学用的校acm队开发的答题系统,于是考虑了通过刷题提高自己,于是我就在POJ、杭电OJ上写些最容易的题目,后来有好友给我推荐了leetcode,于是在刷leetcode的过程中,我才慢慢找到了学习节奏。所以这里给大家推荐的学习过程是:
数据结构了解概念与功能,有一定代码功底的可以选择把所有数据结构复现一遍,刚入门的同学也不要怕,刷题的过程中会了解的更加深刻。 去一些OJ网站,比如计蒜客、牛客网等等,这些可以在线提交,要好于很多学校的OJ,里边可以选择难度,从基础的开始,也可以去一些为高中生竞赛准备的网站例如:洛谷,我也不嫌丢人和一群高中生一起讨论,毕竟技不如人,就得虚心请教。当你可以应付基础题目后就可以看第三条了,因为很多网站都是为ACM和NOIP准备的,毕竟我们学习不是为了竞赛,而是为了进公司做项目。 在leetcode上边刷题,建议选择easy难度,从第一题就开始刷,刷50道左右的题目来适应,leetcode的特点不是难AC,而是每一道题都有最优的解决方法,就我目前来说,见过的easy题目绝大多数都可以在线性时间下完成的。接下来就可以分类型刷题了,算法的主要几块一定要熟练,比如暴力、分治、DFS、BFS、动态规划、贪心,还有很数据结构相关的题目:链表、栈、堆、各种树还有图,leetcode的图论题目可能出的相对简单一些,如果觉得自己图论还薄弱的可以去acm的网站上再刷些题目。 当你在leetcode上边达到了中等题目可以思考一会或者调试一下能够解出来的话,那是就可以考虑笔试了。我是在大二下和大三上开始刷题的,那个时候可以专业课和课设最多的时候,于是我花了接近两个学期来写题目,leetcode上边写了400道左右,周练解出3道问题不大了,偶尔可以全解出来,如果坚持每天都刷,最多三个月应该就可以了,然后我就满怀信心去面试了,投了CVTE,拼多多的内退提前批,结果面试一塌糊涂,我仔细反思之后才发现是概念不扎实,这也是我为什么我把程序员面试笔记C/C++、算法、数据结构放到前边,概念和基础一定要打牢!
面试准备 首先要有一份简历,然后去投公司,然后等着被pass
硬件准备我就不说了,很多博客说的很清楚了,我先说一下我的准备经历,我一直觉得算法岗位是一个很有逼格的岗位,于是开始积极准备机器学习方面的知识,这大概在我大三上的时候开始准备,没错,就是马上要投简历的时候才开始的,我一直以为算法就是数据结构,但是我错了,当我意识到的时候,时间已经不多了,我去网上找了门课程,是小象学院的机器学习算法精讲(我不是做广告的),然后将典型的算法比如:LR,SVM,决策树、随机森林、adaboosting手推了一遍,那段时间我真是连课都不上了,天天学算法,最后我投了华为的算法岗,果然功夫不负有心人,我被录取了,做的是机器学习的工作,而且得到了主管和导师的赞扬,只是我最后选择继续深造,没有留在公司。时隔一年,正好今年华为的软件精英挑战赛用的华为云,我当时做的项目也是关于华为云的,虽然我知道我写的代码绝对不可能被使用,但还是有那么一种自豪感。我现在还在做算法和软件的工作,而且我现在还是热爱它的,还是很庆幸当年毅然决然的转码。
给大家的建议是:
我面试了好几家公司:cvte、拼多多、京东、华为等等,我发现公司对学生的期待还是可培养性,即使做的不是代码工作,只要经历丰富都会加分的 注意:经历不要乱编,问了答不出来就等死吧 计算机原理、网络技术、数据库这几部分大家还是需要准备的,只是这些与语言和算法无关,我没有列举在上边 笔试一定要好好写,尽全力,因为笔试好,面试也会加分的,面试官看的到成绩最后,建议大家将每天刷题变成习惯,可以让自己始终保持手热,做更难的题目也可以不断提高自己的逻辑水平