知己知彼,百战不殆
兵法有云,知己知彼,才能从容获胜。我们要想应对大厂的面试,首先应该知道的就是大厂面试会问哪些问题,我们对应准备才能得心应手。
如果你是科班出身的话,那么恭喜你,你们大学开的课程,基本上都会被问道,因为那些就是构成软件开发的基础。
如果你不是科班出身,那么我就给你介绍下计算机科学与技术都会学习哪些基础课程。
没有任何一个人是孤岛,同样没有一个计算机是孤立的,而连接起它们的就是互联网,而大学里面有个课程就是计算机网络,它会讲解数据是如何传输的,是如何封装的,是如何路由分发的,它里面会有很多协议,这些协议都是为了更好地传输数据使用的,你需要加深理解它们。
程序=算法+数据结构,你可能经常会看到这个等式,没错,等式的右边就是计算机的两门基础课程,一个是算法,一个是数据结构。
提到算法,很多人可能记住的只是排序算法,其实那只是算法的冰山一角,算法有很多,每一种算法都是为了解决一定问题而产生的,你需要能做到手写各种算法,如果做不到,请做到为止。
数据结构也是一门基础课程,它也是非常重要的,我们的数据如何存储才能更方便查找添加修改可以说是计算机的核心,而数据结构就是解决数据如何存储的,数组,链表,堆和栈,二叉树,红黑树,B+数,跳表,字典树,图,森林等等数据结构,你要做到可以手写它们,其中有些可能会很难,但是如果这些不掌握,以后还会有更难的等待你。
如果你够细心的话,你会发现99.99%的软件应用都离不开数据库,而数据库就是计算机课程里面的一门基础课程。你要学会如何设计表,如何操作数据库,你要对一门数据库精通,知道它的底层设计逻辑,知道它是通过什么数据结构实现的。最好你要掌握一个关系型数据库和一个非关系型数据库。
无论什么软件,最后都是运行在操作系统上面的,所以操作系统也是一门基础课程,学习这门课程,你不需要能够开发出一个操作系统出来,但是你需要理解它的设计原理,理解程序是如何被执行的,你要理解操作系统是如何工作的。最后,你最好有对linux操作系统有所了解,掌握一些基本命令行的用法,掌握一些脚本的编写,记住,用过和会使用是两个概念,你要做到熟能生巧。
学习了这些理论知识,你还不能做出一款软件来,因为你还缺少一门编程语言。编程语言有很多种,你不需要也不可能全部精通,你需要做的就是精通1-2门即可,而c语言是我强烈推荐的,因为它更灵活,很多语言都是用c语言编写出来的,学习c语言,更能让你掌握底层的数据结构和算法。
一个复杂的软件往往是很多人才能够设计开发出来,软件开发不仅仅只有编码。需求分析,产品调研,测试等等过程都是需要的,而软件工程这门课程就会告诉你一个完整的软件开发周期是怎样的,设计和开发一个软件需要注意哪些问题。
编程语言是如何设计的,如果你感兴趣的话,计算机课程里面是有一个编译原理的课程,学习它之后,你会明白编程语言是如何设计和工作的。会加深你对编程bug的解决能力。
投其所好,从容面对
不管你承不承认,每个人都是有喜好的,计算机大厂也是有它们的喜好的,它们喜好什么呢,那就是算法和数据结构,如何提升算法的能力,刷题是最直接有效的方法。有句话说的话,见多识广,很多大厂的面试题基本来自于算法刷题网站或者是一些题目的变通,有些问题,如果你没接触过或者见过,你很难在面试那么短的时间里想到解题思路,而如果你见过的话,那么在回答的时候就能做到从容面对。
如果仅仅刷题就能进入大厂,那么你太小看大厂的入门难度了,想要进入大厂,你一定还要有两把刷子,你需要对算法和数据结构有更深入的了解。比如分布式算法有哪些,如何实现,面对海量数据,如何设计数据库,如何优化数据库,高并发的时候,需要注意哪些问题,面对高访问的时候,架构如何设计,这些都是你需要思考和准备的。你可能没有实战的高并发经验,但是你不能没有高并发的应对策略,你需要架构的能力。
都说面试造火箭,入职拧螺丝,话虽然这样说,但是相对来说通过考察造火箭的能力,的确可以筛选出一些更有潜力的人,虽然可能有漏网之鱼,但是只要大方向是对的,大厂就会坚持的。
心有猛虎,细嗅蔷薇
无论你有什么远大的理想和抱负,脚下的路要一步步走,永远不要好高骛远。
有些人很喜欢说一些网络新名词,显得自己高大上,然而当你想要向他深入了解的时候,他却不能说出个一二三,这样的人是没有长远发展的,大公司也是不喜欢这样的人。
手写各个算法,自己亲自实现各个数据结构,这些基础中的基础很多人感觉到无聊,但是万丈高楼平地起,你只有把基础打牢了,你的大厦才能屹立不倒。
总结
没有人能够随随便便成功,失败了不可怕,被淘汰了不可怕,每次面试的时候没有回答上来问题也不可怕,可怕的是你不吸取经验教训,可怕的是你固步自封,总认为面试官问的问题没有用。
记住,每次当面试官问你还有问题的时候没有,你就可以让他讲解下你没有回答上来的问题,认真听讲,三人行必有我师,你一定可以从中有所收获。