时间如白驹过隙,转眼之间又到了毕业季。回首以望,四年前那些渴望知识的大一新生已经成熟稳重,变成了他人眼中的学哥学姐,也要展翅高飞。昨晚想想一位同学(就以szh代替吧)初上课时认真学习的样子还犹如就在身边,可转眼已经要毕业工作了。就让他简单写了写自己学习、就业的过程,没想到今天直接给我写了7000字的文档。做为我也有些意外,征求他的同意就挂在博客上,也希望对后来的学弟学妹们有个示范作用(以后他要挂网上的话我就给出他的链接)。祝所有的同学们能够学有所长,选择了目标就尽自己所能取得点成就。
作者:2018级计算机科学与技术2班-szh
时间:2022年5月6日
1 前言
首先我感到非常荣幸,能够在这里与学弟学妹们分享关于我大学四年期间的学习经历、Java编程以及工作就业相关的一些经验,那么这篇文档主要涉及到的内容就是这三个方面了。对于大学四年期间的学习了话,我就挑选理工科(计算机类专业)中一些重要的课程来说;对于Java编程,我就对自己的Java学习路线以及目前我了解的企业中比较热门的框架、中间件技术、分布式/微服务做个总结;对于工作就业这块,我就把自己在这期间参与的笔试、面试以及复试的经历分享给大家。
2 三方其一:理工科课程的学习经历
大学四年期间,我们计科专业还是会开设很多重要的课程的,比如:高等数学、线性代数、概率论与数理统计、C语言、数据结构与算法、数据库、操作系统、计算机组成原理、编译原理、Java、计算机网络、Python、数电、模电、单片机、大数据等等。实话实说,我计算机硬件这块学的确实不太行,远比上我在软件方面的一些课程的掌握程度,所以对于课程的学习经历,我就挑选高等数学、C语言、数据结构与算法、数据库、操作系统、Java、计算机网络这几门课程来说。
2.1 高等数学
高数了话,贯穿我们大一整个学年,分为上下册。如果说对于一个刚走上IT软件开发岗位的人来说,高数似乎没有什么太大的作用,但是我觉得我们的眼光应该稍微放的长远一些,3年之后跳槽?5年之后晋升高级Java工程师?到那个时候,我们在企业中肯定会涉及到越来越复杂的业务逻辑、项目架构等场景,估计就会和高数、线代有着千丝万缕的联系了,所以这里我认为高数还是有必要学好的。
我记得高数大概学的就是各种函数(二次函数、反函数、隐函数、三角函数、幂函数、指数函数等)求极限、各种积分(定积分、不定积分、二重积分、三重积分、曲线积分等)、中值定理、微分方程、无穷级数、向量与数量积、空间曲线与方程等等,对于这些内容,首先要搞懂的就是基础概念,然后了解那些常用的公式,进而去做一些由浅入深的练习题,对于公式和概念我觉得不需要死记硬背,毕竟这不是毛概、马原、思修,理工科其实更多的还是动手练习实践是最重要的,无论是课上还是课下,都会有很多时间去练习,充分利用好这些时间去把高数的基础打扎实,后续可以腾出一些业余时间来对高数进行深入拓展(比如:考研、竞赛相关)。
有些人总是认为自己不是学数学的那块料,在我看来,实则不然,只是因为你没有把足够的时间用在数学上面。表面上看学好高数、线代这些课就是为了不挂科、考研高分,但是仔细想来,我觉得更重要的还在于培养自己的理性思维能力(写代码也需要这个啊)、对待某些事物的一些看法以及处理问题的动脑能力。
2.2 C语言
这门课可以说是所有高校对于计算机类专业开设的编程起始课了吧,C语言掌握的好,对于后续学其他编程语言(Java、Python)是有很大帮助的。如果未来是打算从事C语言开发的同学,你可能要更深入去学这门编程语言,如果是打算从事Java/Python开发的同学呢,其实不需要学的那么深,重点要掌握的就是C语言中的数据类型、if/else、switch/case、for/while循环、break/continue、字符串、函数、数组、结构体这些知识,理论虽重、贵在实践,更多的只能靠自己在高校的OJ平台上刷题,推荐给大家的一些刷题网站(ZZULIOJ、HDU、POJ、ZOJ、洛谷、牛客、力扣),还是要由浅入深,从简单的题到中等再到困难,刷题写代码的过程中,要能够熟练掌握上面说到的那些关键字、结构的使用,同时一定要学会debug,对程序代码进行打断点,深入理解代码的运行步骤流程。
当然了,在课堂之上、课余时间可以多请教专业课老师有关C语言编程(不仅限于此)相关的问题,老师所知道、所掌握的一定比我们多得多,所以结合老师们的讲解以及自己的动手实操是可以更快速的掌握这些内容的。
2.3 数据结构与算法
这门课在各大高校中应该是基于C语言之上开设的,也是计算机类专业、Java软件工程师的必修必备之课,我们在写任何基于编程语言的代码时,无论简单还是复杂的代码,必然离不开数据结构相关变量的声明与使用,所以可以说数据结构是一切程序的灵魂,计算机类专业考研的课程中基本上也少不了数据结构。
我们需要掌握的数据结构主要有:一维数组、二维数组、单向链表、双向链表、环形链表、栈、队列、二叉树、二叉排序树、霍夫曼树、无向图、有向图这些,具体的操作像遍历、元素的增删等。
那么对于算法来说,目前我所掌握的不多、也比较浅,简单来说主要有:冒泡排序、快速排序、二分查找、递归、分治、回溯、DFS、BFS、最短路、八皇后、背包问题等等。算法总体来说还是比较难学的,更重要的是去理解这个算法的核心思想、实现步骤(比如冒泡排序是如何进行元素的比较交换、二分查找的时间复杂度最少需要查找多少次才可以得到想要的元素),学懂了这些可以去一些OJ平台上找一些特定算法的题目进行规划训练,再进一步就可以尝试一些算法提高扩展的问题了。
2.4 数据库
这门课在各大高校中应该是计算机类专业、Java软件工程师的必修必备之课,数据库的重要性大家可想而知,我们在登录学校官网进行选课、查成绩的过程中,至于为什么能够登录成功、为什么可以查询到自己的成绩,原因其实就是因为后台系统的数据库中存储了我们每个人的登录信息、考试成绩,当你点击登录、查询按钮之后,这些web请求就会替我们到与系统相关联的数据库中去查找是否有对应的用户记录,如果有则可以成功登录,反之不然,成绩查询也是同样的道理。这里其实也牵涉到数据持久化的问题:把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多通过各种关系数据库来完成。
想必大家读完上面这段话,就更能感受到数据库的重要性了。那么这门课我们需要掌握的内容有哪些呢?例:实体、属性、表、主外键、数据类型、常用字符串/日期时间函数、事务的特性/隔离级别引发的问题及解决方案、锁、日志与备份、索引调优,当然更重要的一个东西还得是SQL语句,我们更多的是要通过SQL语句去将上边说的那些理论知识应用到实操当中,比如:DQL中的SELECT;DML中的INSERT、UPDATE、DELETE;DDL中的ALTER、DROP、CREATE;DCL中的GRANT、REVOKE、COMMIT、ROLLBACK;当然还包括其他的像排序分页ORDER BY/LIMIT、分组筛选GROUP BY/HAVING、条件筛选WHERE/IN/BETWEEN AND等等。这块的学习可以自己通过一些可视化工具(Navicat、SQLyog)去创建一些表,然后添加部分数据,对这些数据来模拟一些查询、添加、分组的相关练习,不断强化自己对SQL语句编写的熟练度,基本的SQL熟练了才可以走向MySQL高级中的索引、事务这些内容,因为未来在企业中做开发这些都是少不了的。
2.5 操作系统
这门课在各大高校中应该是计算机类专业、Java软件工程师的必修必备之课,对于大家来说,可能最熟悉的莫过于Windows操作系统以及Linux了,可能在Windows操作系统下,我们更多的就是点点鼠标啥的就行、非常方便,而在Linux下基本上全都是依靠ll、cd、mkdir、rm、cp、mv等等这些命令去完成对文件目录的一些操作,但是无论哪个,我们在这门课中都需要掌握什么是信号量?什么是进程?什么是线程?这二者之间的关系区别,并行与并发的区别,以及一些常见的死锁问题、银行家算法、内存/缓存/硬盘、设备管理、文件系统、生产者消费者问题这些,这块的理论知识非常重要,具体来说可能像哪些情况下系统会发生死锁、银行家算法的实现原理、有硬盘来存储数据为什么还要选择缓存,这些理论还是建议大家要多花一些时间去理解、做练习题以及总结。
2.6 Java
这门课在各大高校中应该是计算机类专业、Java软件工程师的必修必备之课,详细内容我会在第三章中与大家分享。
2.7 计算机网络
这门课在各大高校中应该是计算机类专业、Java软件工程师的必修必备之课,说到网络,大家肯定不陌生,我们每个人使用的手机、电脑、平板,无论是连wifi还是开4G/5G流量,这其中的数据交互都是依靠网络来实现的,为什么华为的5G技术领跑全世界?为什么我们在浏览器中输入www.baidu.com就可以看到百度的搜索主页?为什么在微信中发送消息一旦没有网络消息就发不出去?计算机网络是可以告诉你答案的。
关于计算机网络中的核心内容这块我就简单的说一下好了。像:网络协议的分层架构与原理(网络层的IP、传输层的TCP/UDP、应用层的HTTP/DNS等),具体的说比如TCP的三次握手、四次挥手,HTTP中GET与POST请求的区别,关于信道复用、WLAN、局域网这些零碎的概念也同样重要,其实这门课的学习和操作系统是非常类似的,这其中的理论知识会为你后续考研也好、做Java开发也罢,提供非常大的帮助,操作系统和Java对接更多的就涉及到了并发/多线程编程,而计算机网络中的那些协议原理则会贯穿整个JavaEE的学习。
3 三方其二:Java编程个人理解与看法
3.1 为什么选择Java?
至于我为什么选择了从事Java软件开发这个岗位,总体来说应该有三个原因:
- 我更愿意从事与大学所学专业相关的工作岗位,毕竟这四年的时间不能白白浪费,未来总要做点什么来应用这四年积攒的知识力量。
- Java软件开发是个高薪、福利待遇好的岗位。
- 我对Java软件开发(更应该说是JavaEE企业级应用开发)有着强烈的兴趣,因为我非常好奇像CSDN、淘宝、京东、b站这些网站的数据检索、文章发表、视频收藏、下单支付等等这些功能都是如何实现的,其实Java就会告诉你答案的。
3.2 我的Java学习路线
JavaSE → MySQL初级 → JDBC → HTML/CSS/JavaScript → JavaWeb → Maven → MyBatis → Spring → SpringMVC → Linux → Git → SpringBoot → Dubbo → Redis → RabbitMQ → Nginx → MyBatis-Plus → SpringCloud → Docker → JUC → MySQL高级 → Zookeeper
上面这个路线是我在Java开发中自学的路线,可能与老师们、部分培训机构给出的路线不太符合,仅供参考。
3.3 如何快速的掌握JavaSE?
这里可能大家会有疑问,Java开发会涉足到很多领域(企业级应用、安卓APP、小程序、游戏等等),为什么我在这里只说如何能够更好的掌握JavaSE?原因就是JavaSE是未来Java所想开发方向的奠基石,如果JavaSE学不好、奠基石都不够牢固,那么你在后续的框架学习中能够学明白吗?所以JavaSE是重中之重。
在此之前,你们应该都学过了C语言的,这是个面向过程的编程语言,而Java则是彻底的面向对象的编程语言,首先肯定也是像C语言那样,了解Java中的数据类型有哪些?如何声明与使用?接下来要做到的就是理解OOP这个核心概念,包括OOP的三大特性(封装、继承、多态),接着可以理解一下包的概念、访问控制、三大变量(静态变量、实例变量、局部变量)、this、super、重写/重载,而后需要掌握的就是抽象类、接口、内部类,接下来就是一些常用的API(String、StringBuilder、StringBuffer、Math、Random、System、Object、Arrays、Date、SimpleDateFormat、8种数据类型的包装类),紧接着就是一个重点:泛型和集合,然后就是I/O流,再接着就是多线程编程,而对于反射和注解这块就简单了解一下就行了。
那么在学习上面的这些内容时,其实我推荐大家刚开始可以去b站上看一些视频,不太建议刚开始去看书,因为书中讲的确实有用有理,但是对于刚学Java甚至于学Java有段时间的同学来说,看书理解的效果并不是太好,而看视频可以更好的听老师讲、跟着老师动手敲代码,我觉得这样上手掌握的会更快。在写代码的同时要理解那些常用类中的方法是干什么的、哪些方法能被调用哪些不能、一些重要方法的底层实现原理等,同样要学会对代码进行debug断点查看,在学习的过程中如果遇到一些不太清楚的类和方法、代码出现了异常、以及Java中的变量/类的命名规则,此时不太建议大家上来就去百度,可以先参考jdk官方的中文文档、阿里巴巴Java开发手册,学会用这些文档对你后续的学习有很大的帮助。而当你觉得自己的Java基础可以的时候,再去书中领悟那些Java大牛前辈们所讲的内容时,就会豁然开朗的,因为我就是这样(这里给大家推荐一些Java名著:Java编程思想、Java核心技术卷I/II、Effective Java等等)。
3.4 JavaEE的核心学习
基于上面JavaSE的学习,那么有关JavaEE的学习就类似了,JavaEE其实包含了很多内容,像JavaWeb、SSM这些,主要也是基于B/S架构的开发。这部分的学习需要一定的JavaSE基础,更多的还是看视频、动手实操、参考jdk文档、框架技术的文档API参考手册,在学习过程中,最开始还是要先搞懂这个技术是干什么的?有哪些核心功能?比如JavaWeb核心的Servlet中的request请求对象、response响应对象主要就是在通过浏览器发出请求(携带请求协议包)、服务器(携带响应协议包)经过一定处理反馈给浏览器,最终浏览器将数据解析展示在页面上响应用户;再比如Spring中的IOC容器、AOP面向切面编程、事务(基于MySQL)这些;还有就是Redis做缓存、持久化等等。当我们带着对这些技术产生的疑点去学的时候,你就会有更强的兴趣、更大的好奇心,自然也就事半功倍了。
4 三方其三:工作就业的经验之谈
看到这里,想必学弟学妹们应该对自己大四往后的时间有了自己的打算吧,是考研?考公?就业?我是选择了直接就业,所以就和你们聊聊关于工作就业这块的一些经验吧。
我目前所从事的岗位是:Java软件工程师,所以下面的经验都基于它而言。首先要说的是,我认为Java开发岗不太看重学历,更看重的就是你的技术能力是否过关。
4.1 笔试
如果是大厂,建议大家多刷题(刷爆力扣、牛客就行了),因为大厂笔试全都是算法题,就两个字:难、懵;如果是其他的企业,更多的考的就是Java OOP、各种框架技术的相关题目,有选择题、问答填空题、编程题这些,应对笔试其实也只能复习之前学过的内容,再次动手敲代码,强化自己对之前学过的技术的掌握程度。笔试写的怎么样将会直接反映出你实际上写过多少行代码,所以给大家的建议就是:多写代码。
4.2 面试
如果是大厂,未知(哈哈哈,毕竟我没经历过,大厂的笔试我压根就过不了);如果是其他的一些中小型企业,面试过程中基本上就是针对JavaSE(集合、多线程、异常、常用API)、MySQL索引/事务、SSM的核心功能/底层原理、Linux常用命令/简单部署、Redis数据类型/持久化/分布式锁、SpringBoot自动装配/起步依赖等等这些技术点进行问答,面试的过程中大家一定要有自信、敢说。
可能大家在学完上面我谈到的那些技术时,再看面试相关的问题会一脸懵,觉得之前学的都白学了,这个其实很正常,面试问的问题往往比日常学的那些要稍微深入一点,所以这就需要大家回顾之前学过的像集合、SSM、Redis、的同时,要多去了解、学习一些拓展的内容(比如高级特性、底层源码等),同时强烈的建议大家对学过的内容做记录(写博客也好),因为这些对后续更多的笔试面试、工作都会有不可磨灭的功劳,毕竟好记性不如烂笔头嘛。
在和面试官交谈的过程中,如果是你会的问题,自然要顺理成章的回答;如果是你不会的问题,我觉得直接说:啊,这个问题我不太清楚,没有了解到这方面的技术问题,最好不要不懂装懂。在面试结束的时候,面试官会问你:我这边没什么问题了,你有什么想问我的吗?这个时候一定要问,一定要问,一定要问!!!如果你不问,会让面试官认为你对我公司以及公司的这个岗位好像也不是太感兴趣吧?你连一两个想要了解的问题都没?所以这个时候必须问他,那么我在面试Java开发岗的时候,如果是技术面试了话,一般会问这几个问题:
- 我想了解一下贵公司主要是从事什么业务的,会涉及到哪些场景?
- 那贵公司的工作氛围这块怎么样呢?(这两点主要体现出你对应聘的这家公司的好奇、热爱)
- 贵公司所采用的后端技术栈都包括哪些技术呢?(毕竟你是做Java开发的,一定要关注技术)
- 像我这样刚进公司的新人来说,会为我分配哪些任务呢?(体现你对这个岗位的热爱)
- 像Java中的JVM、设计模式这些内容适合什么时候学比较好呢?是不是有一定的工作经验之后再去学会更好?(体现你有一定的学习能力)
如果是最终的HR面试,面试过多,记不太清哪家公司了话,还是可以问之前技术面试问过的话题,但是不要问技术相关的,因为HR多半不懂技术。我一般会问这几个问题:
- 我想了解一下贵公司主要是从事什么业务的,会涉及到哪些场景?
- 那贵公司的工作氛围这块怎么样呢?(这两点主要体现出你对应聘的这家公司的好奇、热爱)
- 贵公司的薪酬福利这块大概组成架构是怎样的呢?(我们肯定还是最关注这个岗位的薪资了)
- 贵公司对刚入职的新员工有什么培训计划,会不会有老员工进行带领指导呢?(体现你对这个岗位的热爱)
- 贵公司关于员工晋升、升职加薪、加班这块是怎样的呢?(体现出你会在这家公司长久发展,而不是干三个月半年就跑路的)
4.3 工作
我从2021.12开始工作,到2022.04,前前后后大概也就将近四个月的工作经验,虽然现在找到了毕业之后入职的新工作,总体来说,经验不多,但多少还是积攒了一点。
在工作中,还是希望大家首先可以和自己部门的同时多沟通,多聊技术话题,因为人家再怎么说,也是在这家企业中工作时间比你长的员工了,更方面懂的自然比我们新员工要多,所以要多问多看多做,对于上级布置的任务、项目开发小需求,要在规定时间之内完成,要有一定的时间观念,尽量不要拖后腿,因为你的工作无论大小,都会对企业的利益、进展各方面产生以顶点影响,所以还是希望大家未来在企业中能够做的更加积极、热情。
5 结束寄语
最后,我想告诉学弟学妹们的是:从我开始自学Java,到最后找到工作,一直指引着我、让我坚持走到现在的就是四个字:兴趣 + 自律(不是自律 + 兴趣,因为你如果对一件事压根就没有兴趣,那又何谈自律呢?),所以兴趣这个东西是非常重要的,然后要保持自律。对于任何知识,都是需要兴趣、认真和讲究逻辑的,希望这份兴趣和认真能够让你在学习这些课程、技术的每个细节中都能体会到,同时你也能感受到产生兴趣之后自律带给你的美,具备优秀自律的能力才是在未来可以迁移的能力,如果只是学习一些命令、敲一些代码,则很快就会过时,兴趣和自律以及学习能力的提升才是永远不会变的东西,祝你们成功!!!