利用碎片化的时间逆袭进百度,我的面试经历你敢听吗?
5.如何把理论用到实际项目/产品中?(产出)
不同方向,意味着不同领域不同,学习的知识和实战项目有共性也有差异。在这里,我主要讲一下通用的思路。重点拿我擅长方向举例,其他方向可按照同样思路举一反三。
根据我的经验,可将内容分为原理、应用、擅长方向三个纬度。原理和应用纬度必须学习,方向纬度根据自己擅长方向深入学习。
原理:
计算机网络、操作系统、数据结构/算法,这些东西都是专业课好好学即可,数据结构/算法可以偶尔刷题。校招的时候再重点复习,初级阶段不必花太多时间深究。
应用:
它是最基础的内容,不管你从事什么领域都将离不开它们。这也是小白入门重点花费时间的地方,你将在这里不断与程序斗争如调试、验证、异常、解决。
方向:
不同方向本质上就是在基础应用上扩充,发挥它们擅长领域和特性去解决特定问题。在这里,简单列一下涉及的技术栈。
1.后端开发:消息队列、缓存、rpc、微服务。
2.大数据开发:Hadoop、Spark、Storm、Flink
3.自动化运维:elk、ansible、zabbix、docker、k8s
基于上述分析,主要讲了整体思路,大家可能会觉得有点不太好理解。接下来,拿我当时遭遇的处境进行举例阐述,这样让不同水平或时期的同学有不一样的体会。
假如有时光机让时间往后倒退 3 年,时间来到我刚上大二的时候,作为一枚小萌新开始学习 JAVA 走上后端开发之路。
对于我来说,操作系统原理、计算机网络先战略性放弃,毕竟刚接触编程,看高大上的原理,每次上课都想睡觉。当然,数据结构/算法我还能好好听听,毕竟我数学功底还行让我不排斥。
为什么不先学习基础性原理?
举例:假设你学骑自行车,你是直接上去就蹬?还是先把轮子拆下来研究清楚原理再去学习怎么蹬?
重点:根据我的经历,在新手阶段不管是接触新的语言,还是新的方向。最快的方式就是先把自行车蹬起来,等你蹬熟练了再去研究轮子是怎么造出来的。
根据上述策略,刨除我踩的一些坑,我把学习征途划分四个阶段,实现学习效率的最优解。
第一阶段:新手入门
在我入门的时候,我遇到的最大困难是代码不会写,DEBUG 不会做,程序报错不会看毫无头绪,甚至大家常说的百度一下的关键字我也不知道搜。
这时候,最大的目标就是根据百度/查文档/看视频,把程序调试出预期结果,甚至你抄代码都行,很多时候抄代
码你都不一定能 DEBUG 出预期结果。这就是现实,主要就是要把对编程的排斥消磨殆尽。
这个阶段,不需要太关注底层实现原理,最重要的工作就是把应用层面的技术,不断练习直到熟练掌握上面提到的应用「 编程语言、Linux、数据库、HTTP 网络协议 」。
?时间:3-6 月?目标:会调试、会查文档、会用搜索引擎。
?内容:JAVA 基础语法、MYSQL 数据库、Linux 操作系统、HTTP 通信协议。
?方法:只关注如何使用技术,难以理解的背下来,不关注底层原理。
?成果:实现常见的管理系统模块,能部署在服务器上,供他人访问。
对于现已从事计算机行业的同学,其实这部分内容非常简单,可能按照正常水平少则几天,多则不超过一周就能开发出简单模块。简单说,它顶多是普通本科毕设设计水准,主要是让新手在感官上体验软件产品。本质上,在计算机世界里,抽象来看就是数据的计算、传输、存储。随着你的经验增多,你会发现很多技术的诞生或优化性能都是在解决计算、存储、传输的问题。?在这里,主要让大家在系统的角度感受最简单、最初级的技术模型。
1.Linux 操作系统:承载应用程序、数据库的运行,提供 CPU 供应用程序计算。
2.应用程序(Java/Python/Php):JAVA 主要采用 Servlet、JDBC 承载网络的传输、数据库连接管理。
3.数据库(MYSQL):主要理解关系类数据库的存储,对数据进行操作。
4.HTTP/TCP:熟悉重点网络协议,它分为包头/包体进行传输,包体格式可能分为 form、json、pb、二进制。
第二阶段:项目练习
通过第一个阶段学习,你对编程从一无所知到有所斩获,对计算机世界充满了好奇,甚至有所开心。这时候,你最应该做的就是去满足你装逼的梦想。
假设你是爬虫方向,你应该去爬表情包、爬知乎数据、自动抢票,去满足你无数个装逼梦想。
假设你是算法方向,你可以去研究推荐算法、图像识别模型,去做个商品推荐、人脸识秀一秀。
假设你是后端方向,你可以去研究下网络编程/网站开发开发个仿微信聊天应用,体验下 lowB 版微信。
画外音:多做项目,坑是一步一步踩出来的。
作为大学生,实验室、软件设计比赛、开源社区都是你发挥想象力的天堂,这些倒腾的经历将是你毕业时最宝贵的经历。
第三阶段:强化理论
经过前两个阶段实践,时间来到大三,这时候基本的软件开发已入门差不多达到普通培训班毕业水平。同时,专业课如数据结构/操作系统/计算机网络也上的差不多了,对概念多多少少有初步了解。
这时候,你会发现很多原理你不懂,将很难更上一层楼。
?你不知道使用 ArrayList 还是 LinkedList?
?你不知道为什么要使用线程池?
?你不知道为什么分层设计使用分布式场景?
你将处于写代码一时爽,一直写一直爽,遇到性能问题直接土崩瓦解。所以,你不得不去学习理论知识让你走得更远。
问题:为什么在这个阶段强化理论知识?
在新手阶段去强化理论知识,会让你兴趣骤减且产生学了有何用的错觉。同时,这是最好的时机,学校专业课学完你有基础概念,你有实际软件应用场景,这些东西让你深挖理论的时候会快速给你构建起基础图谱,让你兴趣激增不断体验学会的东西,将戳痛你最痛的神经,瞬间把你以前遇到的问题有新的认知,这就是答案。简单说,面向问题,解决问题,让你实实在在感受到成长,这就是成就感的力量。
问题:如何高效的学习理论?
其实,编程语言和计算机基础都是相通的,只要你学透一门编程语言剩下的就大同小异。当然,计算机基础毕竟是枯燥无味的,学习毕竟是有方法的。
举个例子:
站在编程语言的角度,你用心去总结,你会发现不管什么编程语言,变来变去都是换了个花样在谈以下内容。
?程序结构(数据类型、控制语句、面对对象、异常处理)
?集合(list、set、map)
?文件操作、网络通信(io、bio、nio)
?线程、线程池
不管在面试还是技术探讨,重点考察的都是集合、网络通信、线程/线程池。源自于它跟计算机基础有紧密结合,你要优化它们你必须具备扎实基本功。
基于我的研究经验,我建议大家在学习计算机基础的时候,不要因为理论而理论。你应该去通过编程语言源码去学习计算机基础,只学你当前认为最重要的。
举个例子:
当我去学习数据结构/算法的时候,我会一边学习源码一边思考数据结构,这样就让我有实际应用场景不会因为理论而理论。我学习 list、set 源码的时候,我就学会链表、栈。我学习 map 的时候,我就学会了红黑树、散列表。
当我去学习计算机网络的时候,我会一边学习 socket 的用法,学习 Linux 网络通信模型 epoll,这样就重点把网络协议学会了。同时,很多应用场景极少的理论知识,我就粗略记忆或者跳过,这样就节约了很多时间。
当我去学习线程/线程池的时候,我会学习锁机制、生产者/消费者模型这些操作系统原理的重要知识,跟编程语言中关联不大的我就粗略记忆。
第四阶段:深究专长
经过前面三个阶段的学习,你已经具备扎实基本功和项目实战经验。接下来,你需要做的就是更加的专业化,研究一些有生产意义的东西。如果你一直写学生管理系统,这些没有价值没有意义的东西,那么毫无意义。
这时候,你应该去互联网公司验证你学习的技能。除此之外,你可以去学习额外的成熟先进技术栈。这样,你就有实际业务经验,就有技术的宽度,同时又有深度,这就是你核心优势,毕竟算法/数据结构这些东西在竞争的时候大家都会。
画外音:去实习,最好去大厂实习,接受互联网软件开发的挑战。要是不能,那么去研究实际企业技术栈的应用与底层实现。
举个例子:
假设你是后端开发,你就可以去学习微服务的技术栈,springboot、dubbo、docker、hadoop 都可以去学习。除此之外,设计模式,redis 原理都可以去学习研究,只有这样当你去面试的时候,你有很多话题和故事讲给别人听,你的专长研究既可以让你说业务场景,你又可以讲底层原理,对答如流。
经过上面的训练,已经具备了解决问题、快速学习、编写代码能力,也就是具备软件工程师的职业素养和扎实基本功。
这时候,进入互联网公司开启职业道路,你将会很快有产出,不会陷入徘徊自闭的状态。更何况,你的职业素养已经能够让你遇到问题,能快速的学习克服困难。但是,要是让你去参加面试可不一定能独善其身,毕竟工作拧螺丝,面试造火箭可不能疏忽大意。
接下来,重点讲一下如何应对面试?
面试也就是把自己卖出去,让别人觉得你值。简历是至关重要的环节,所有的知识和技能全都是围绕它展开,否则毫无意义。因为在面试中,面试官关心你有什么,也就是面试完全围绕着你会的东西展开提问,所以你就把你的优势发挥到极致就行。
环节一:准备简历
简历一定要认真对待,一定要简介精炼,尽可能把内容压缩到一页,毕竟简历筛选就 30 秒不到。这时候,简历排版、简历字体、简历模板都有讲究,细节决定成败。
在写简历的时候,主要分为个人资料、实习经历、项目经历、专业技能。其实,没什么技巧,参考 STAR 原则,重点体现你在项目中的价值和思考。
1.要体现做了什么事情?2.遇到什么困难?3.怎么解决的?4.产出是什么?
假设有读者需要简历模板,可关注提供给大家。
环节二:梳理知识体系和刷面经
评论