今日乃实习离职首日,福毅、宏铭同学便纷纷前来寻我解惑。问道:你跟我们说了校招需要准备的知识点,我们也按照你说的用思维导图整理了所有的知识点?可是那么多知识点还要研究源码,在下可谓有心而无力,眼看时间不断流逝且秋招即将来临,我们真的是心力交瘁,比考研同学起得早睡得晚恐怕都难把这些问题解决通透,你说的是不是谬论?
疑问
1、在准备校招基础知识复习的时候,是否做到面面俱、这样做会感觉时间不够用呀?集合为例,抽象类、具体实现类他们之间的关系以及各自优缺点?我们是否要每一个类都要去精读它的源码?新版本的JDK10的是否有必要去研究?
2、在准备理解某个模块知识的的时候,是否需要精读一本书去解决一个版块的学习?并发编程为例,深入研究并发编程实践这本书直到对并发编程的每个锁、并发容器、线程池的来龙去脉全部了解一清二楚,否则感觉掌握还是不太彻底(钻牛角尖做法)?
3、在准备校招项目的时候,是否要重新运用市场上主流技术做一个完整的项目?感觉以前做的项目在技术纬度亮点不足,更加偏向于业务?
4、在准备校招面试的时候,重点考察那些方面?计算机基础(数据结构/算法、计算机网络、操作系统、数据库)、Java基础(设计模式、源码研究)、互联网技术栈(SpringBoot、Mybatis、缓存、消息队列、RPC框架)、大并发与大数据的处理。是不是这几个方面都研究完,我再去投简历、笔面试?
解决思维的共性阐述
1、世间万物无非都分为深度和广度。
广度:纬度思维,它是知识面的全局把控,能够清晰展现所有知识点的内在联系。对于广度来说是一张蓝图或者目录,而不需要care它的具体实现,只需要了解知识点之间的关系。
深度:线性思维,它是知识点的深度挖掘,能够清晰展示某个知识点的来龙去脉。对于深度来说这个不用赘述,因为我们从小到达刷题做数学题大家都有了解。
2、校招面试中对深度和广度的要求是什么?该怎么去把控?
我刚刚解释了我对于宽度与广度的理解,从知识角度来说分为知识宽度如计算机科学、心理学、知识管理,知识深度如在计算机科学面中的分布式架构有深入研究。
那对于校招面试中对于深度和宽度该怎么去阐述呢?
假设我毕业校招目标应聘的岗位是Java后台工程师的岗位,在我另外的文章有说过需要掌握哪些知识面和知识点是需要我们掌握的。
从宽度来说,以Java基础为例无非就是分为语言基础用法、容器、IO/NIO、网络、反射、JVM、并发编程。
从深度来说,以容器中的HashMap来说?我们怎么从深度解释它原理呢?比如让你阐述HashMap这个问题你怎么说呢?
日常回答:
HashMap是一个容器,它以key和value的形式存储,key不能重复......。这样回答是非常的平庸的,且显得深度和条理极度欠缺。
深度回答:
(1)HashMap的数据结构是什么?数据+链表(画图)
(2)Key、Value是通过什么方式存储进去的?解释hashcode、取余、去重等操作。
问题:Key在HashCode取余以后,它可能全部堆积在某几个Key对应的链表上,这样就会造成该数据结构存储或者查询低效,那怎么解决呢?
抛出问题:
(3)怎么保证Key用hashcode取余以后能够均匀分布到数组对应的链表上位置?......
问题:等存储的数据逐渐增加,那也会造成链表过长,导致查询变慢,那怎么解决呢?
抛出问题:
(4)为什么会链表要变成红黑树,什么时候从链表变成红黑树,什么时候从红黑树变回链表?
问题:假设多个线程并发访问,那可能造成容器更新或者操作出现问题,可能会说synchronized加同步锁,有没有其他办法解决呢?
抛出问题:
(5)为什么采用CAS,能说一下ConcurrentHashMap的具体实现吗?
不知道大家发现问题的共性没有?任何事物都可以分为深度和广度两个方面,甚至是有条理说出HashMap的实现,也是从广度与深度。
横向问题:数据结构+算法、存储查询方式、存储效率、安全性?
纵向问题:具体逻辑实现流程。
具体问题的解决办法
问题1:不需要,宽度深度不可兼得,集合为例。
(1)用类图或者思维导图展示出整体轮廓、掌握集合类之间的关系。(广度视角)
(2)通过面试题+牛客面经,洞悉集合中比较重要常问的集合,标记重点研究,非重点了解即可。(深度视角)
问题2:需看书系统学习,但有侧重点,以深入理解JVM为例。
这书枯燥且难懂,若想把这本书的来龙去脉精读通透确实太难。
(1)看书目录和粗看了解整体的知识与内在联系。
(2)通过看视频+博客+面经,标记这本书需要精读的重要章节。
(3)系统读这本书,重要的地方必须精读直到理解为止,不重要的地方可战略性放弃或者略读。
问题3:项目没有low或者不low之分,应该是思考原项目的不足,你该怎么去优化,而不是推倒重新去做另一个项目。
(1)提取你项目的亮点,你在这项目中获得什么?包括业务经验、代码设计,而不是就感觉就是增删改查很low。
(2)根据你现在的认知,假设让你重新再做,你该怎么设计?系统健壮性、扩展性、并发性,甚至可以添加一些新的没有在项目用到的技术栈,但是你讲清楚且会怎么用也可以?
(3)不需要推倒重做一个新的项目,而是做一个模块或者什么去反衬你的技术栈(nginx、redis、消息队列等)?这时候,你就应该去做一个模块,就如简单的秒杀系统,你该怎么去设计?为什么要用到这些技术,每一种技术主要解决的问题是什么?
问题4:任何事情都不可能等你准备齐全才行动,最好的方式就是想好了马上行动,多尝试与实践,形成自己独特面试风格。
一般面试的要求无非就是就是基础扎实(研究的深入宽度问题)、技术视野开阔(广度问题),不用把面试弄的紧张兮兮,就是一个“约会”的经历,只是不能开车。
(1)面试考察:基础扎实、项目/实习经验丰富、技术视野开阔。
(2)面试期望:短时间培养内能够干活,能够有潜力承担更多职责。
(3)面试结果:面试官主要是引导你回答问题,而不是让你把所有东西都能做到最完美,这也不可能。主要你在面试中展现出你1-2个特长认为你可培养那么将会被录用,例如你表现出基础扎实算法好?项目/实习经验丰富团队配合能力强、快速学习能力强?技术视野广、发散性思维强、code能力强?
实践案例图
1、看容器章节总结
2、读深入理解JVM总结
深入理解JVM.png
网友评论