工作前几年听说过,大学最重要的几门课其实是数据结构和算法、操作系统、计算机组成原理、计算机网络。
初听时不以为然,感觉没什么用。
近期准备面试八股文得到了一些感悟。这句话随着工作年限和对程序的理解越来越深入,含金量越来越高。
最近面试问的都是技术底层原理和实际使用注意事项。对于技术底层原理,考察的是你使用某一项技术的时候是否会去考虑底层的实现原理。对于实际使用,就是考察你是否真的用过,用的是否合理。
针对于上面提到的两个考察方面要怎么提升呢?
这个也可以拆解成两种努力方向:
第一个是短期内快速提升,就是针对于具体的技术点,去网上找大量的资料,熟悉实际使用经验和底层原理。
第二个方向是长期方向,找到工作以后,每使用一个技术,多思考为啥要这么用?有没有更好的使用方式?底层是怎么实现的?
那么回到开头,为啥那4个科目是最重要的呢?
我们程序员其实就是理解业务需求,进行分析和设计,和其他同事配合,把业务需求用程序软件实现。
最后的成果就是程序和设计文档。
那么程序就是代码,代码包括数据结构和算法。设计就是抽象业务流程,选择合适的数据结构和算法。当然除了专门做算法开发和中间件开发的程序员会自己去用数据结构和算法实现一个需求。但是业务开发程序员的话就是利用一些封装好的框架和工具实现需求,当然框架和工具底层也是算法和数据结构,我们需要去了解。不然永远都是一个只会使用API的码农。
现在程序有了,那程序是怎么运行的呢,这个就需要我们理解操作系统和计算机组成原理。
上面的都搞懂以后,那么在单台计算机上面你已经天下无敌了。那有些需求一台计算机不能满足怎么办,这个时候需要多台计算机配合实现,那么多台计算机之间怎么通信呢?所以就要用到计算机网络了
那么具体对应到面试准备是怎样的一个关系呢?
八股文=考察的是常用技术栈的使用和底层原理
场景题=考察的是你对于一些技术、数据结构和算法、其他技术的底层实现思路能不能灵活应用
算法=纯粹考你的基本逻辑能力,不过一般的公司都不考这个
举个形象的例子
线程池在JAVA面试中常问的有以下的一些问题?
有哪些参数? | 考察实际使用 |
一个任务提交以后运行流程是怎样的? | 考察技术底层设计思路 |
实际工作中各个参数你们怎么配置的? | 考察实际使用经验,这个和具体业务相关,以工作队列为例,用无界队列可能会导致OOM,有界队列的话有2种,要怎么选择呢,这个得看底层实现和数据结构。看看哪种运行效率更好,吞吐量更高 |
线程池底层实现原理、源码? | 这个就考的更深入了,需要花大量时间去研究,所以还是的平常多去看,多去学,不要觉得看了好像对当前的工作没用就不看了,面试就是考察这些基本功。 |
要你自己实现一个线程池,你怎么实现? | 这种就是场景题了 |