程序员一直永远逃不开的面试关-程序员宅基地

技术标签: 面试  java  编程语言  人工智能  数据库  

在这个行业和社会都处在特殊时期的时期,有多少人正在找工作,或者正准备找工作。。。本文想从发展阶段、主语言、项目等几个方面来总结下我们到底应该怎样准备面试和发展我们的技术,希望可以给各位带来一些帮助~


  • 关于阶段 

对于职场人,在这方面情况基本应该都一样,一年 、 三年 、  五年。。。基本都可以用这个时间段来给自己定个衡量的标准,每个阶段要达到这个阶段应该具备的水平。

(图片来自网络)

   2~3年

经过一年的历练,基本的开发技能和语言特性都应该有所了解,这个时候,就是从初级向高级转化的重要阶段。要把停留在使用层面的知识研究的更加深入,要知其然也知其所以然。只要理解透,我们是不必惧怕传说中的连环炮的。

例:

问:什么数据结构可以快速查找一个元素?

答:hashmap。

问:为什么可以快速定位?

答:散列算法。

问:hash函数是怎么降低冲突的?

答:扰动函数通过高位和低位特征融合,减少低位取模时的哈希冲突。

问:1.7 和1.8的扰动变化是否了解?

答:四次降为一次,边际效应,投入产出不对等。

问:1.8还有什么改进?

答:链表转树。

问:为什么转树,为什么用红黑树,而不是其他树?

答:链表查找效率低,红黑树调整效率比其他平衡树树高。

问:为什么扩容要保持2的次方,和此相关的1.8的改进了解么?

答:保持2的次方,在hash函数中取模时,直接移位就行,速度快,1.8在扩容方面进行了优化,不再计算哈希值,直接用旧的容量加上偏移量,允许这么做的前提是保持2的次方和两倍扩容,提高速度。

问:1.8对并发下的死锁修复?

等等。。。。。 

3~5年

这也是个重要的阶段,这个阶段是一个知识融会贯通的时期,要把点连成线,把线连成面,把面组成体,然后再窥探整个生态的组成和发展。

  我们要从hashmap关联到支持并发的currenthashmap,从而可以关联到currentHashmap  原理中锁的运用,那自然就想到了锁的种类,每种锁的优缺点。

        说回来,为什么1.8里currenthashmap要弃用Lock改成synchronized,那就要谈到synchronized进化史,就有了偏向锁的原理、偏向锁的缺点、偏向锁在高并发情况下对系统性能和gc耗时的影响,什么情况什么时间怎样撤销偏向锁、什么是安全点为什么要有安全点、什么情况会使用到安全点。

        谈安全点肯定谈到gc,那gc的发展历程,cms到g1到zgc都有哪些提升,从对象的可达性分析联系到root对象的种类,这些对象都是存在哪里,然后就自然想到了jvm内存模型,对象的加载创建,内存中哪些地方存储哪些东西,为什么说G1适合更大内存规格的服务器使用,因为它使用额外的内存空间来创建Rset,有什么作用呢,说白了就是空间换时间,提前维护每个内存区块的内部信息,已遍快速精确的根据用户诉求,控制垃圾回收目标。

        那么还有哪些地方用到了这类思想,可能想到redis,比如字符串,底层自定义的struct中,包含并提前维护了原始c语言字符串结构,还有相关的各种信息:长度、富余可用空间等等,用空间换时间,达到操作时的高性能,那么redis的高性能还有哪些方面,单线程,多路复用io。

        谈到多路复用,可能就联系到了NIO、netty,什么机制促成了其高性能,其用途那自然是各种rpc框架。

        Rpc的话,负载均衡有哪些策略,除了服务端rpc的负载均衡,还有哪些地方需要负载均衡?

        那可能是ip解析,四层七层网络协议这边的事了,用ngix,HA来进行上层负载。

    rpc服务发展机制用什么实现,可能想到dubbo的zookeeper注册中心,那基于zk的注册中心有什么问题,曾经老东家用zk做注册中心,为什么在大促时候出现了血崩。。。。。。

遇到问题多想一步,收获可能会大很多。当然,上面的这些也只是在知识层面的相互联系,或者还应该可以把他们揉在项目里,用了某些策略带来的连带影响,业务场景对技术选型的要求等等。实话说,这两个阶段,我自己应该是没特别把握好的。顿悟的太迟了。。。 


  • 关于主语言 

作为自己吃饭的家伙事,不管你有多全能,主语言是一定要通透的。不过对我就是Java没有主副之分,因为其他我也不会呐(  ˃᷄˶˶̫˶˂᷅  )

(图片来自网络)

Java的生态非常庞大,不过只看语言的话,其实可以摘出四个比较重要的方面,如果是在准备面试的小伙伴,按这几个模块挨个的啃啃,应该也是不错的选择:

 数据结构、并发、IO、虚拟机 

当然,像我这种渣渣,肯定是没法把所有的点全部掌握的,像IO 、网络 这部分,我就基本上是泛泛的了解,因为写的都是服务端上层业务,基本也没有机会接触到底层的通信。不过我们可以想办法往我们熟悉的区域蹭,引导面试官。

比如项目中经常使用线程,那就可以吹一会线程的东西,怎么评估业务场景,怎么确定线程池参数,为什么重来不用java提供的线程池创建工厂去创建线程池,自动创建的那四种线程池各有什么弊端,会带来什么问题,线程池提交的任务结果怎么获取,有什么问题,设置超时的必要性,线程池超时中断原理等等。 

又比如我们有压测调优的经验,那又可以从jvm的角度来扯扯,我们的用户规模,访问并发,机器集群数量,规格,gc策略,线上问题,调优方案,gc时间的影响因素,堆大小,对象大小在高并发下对gc的影响。线上oom的原因,处理方法,保存现场,止血,问题分析等等。

值得提一句的是,如果我们身在大厂,对原始的常用操作命令还是要适当回顾了解一下,不能当人家问我们,怎么保存现场呢,回答,公司有九州操作平台,我们点一下dump就行,这样就显的low了点, 就比如我 ????,不过我说的也是事实,越大的公司,对线上服务器的权限控制越严格,一般是不会允许我们自己搞命令行的,重启大法还是最有效的 。


  • 关于项目 

项目这一块是个大头,一般面试,都要求讲一个自己认为最牛逼的项目。简历上的东西最好都提前回顾下,我记得有次面试,就很大意,就没在乎上一家公司的项目,被一兄弟逮住一通问,都他妹的忘了,白白让他享受了一波虐人的感觉。

(图片来自网络)

如果项目吹的好,基本半个小时开外了,其他的点也就捎带一下,当然,前提是我们要吃透项目的整体架构,上下游的依赖,然后就是里那些最牛逼的技术点,最好是自己参与过的。

比如说用到了分布式事务,那就要知道业界常用的XA、TCC这些方式和原理,特别是处在阿里这种公司,很多东西都是定制化,不和业界的通用技术来对比着看,总有些自说自话的感觉。

要知道它的发起方、参与方、协调者等角色,要知道怎样通过spring的后置处理器等钩子函数注册二阶段处理器,什么时机怎样将主事务信息和分支事务信息落库,落哪些信息就足够二阶段进行,怎样通过数据库中的字符串字段找到对应的二阶段服务,发起二阶段调用。

更重要的要知道服务器宕机时候事务怎样恢复,网络延迟抖动的时候,怎样防止资源悬挂,怎样幂等防重发。要把这些能清晰的讲出来,能把具体的对应方法讲清楚,即使有些地方没做过,只要能讲清楚,应该也是可以的。

当然,不是自己做的东西其实也可以讲,不过要能基本理解其原理,比如阿里这边的单元化部署,同城和异地容灾,流水数据库和状态型数据库各自的failover方案演进,只要能讲明白,起码证明在这方面我们有一定的积累和关注,同时也是对服务稳定性和高可用的理论经验吧。

不太熟的东西最好不要提了,如果正好遇到一个对这个东西特别熟的兄弟,那就会死的很惨了。用的啥数据库?OB。哦?那OB怎么部署的,用什么方法兼顾其高可用和性能,强一致性策略。因为了解的不深,所以被问了一脸。你说我说用的是mysql不挺好么,不过可能也会被呲:“胡说,你们肯定用的都是ob,来  给我说说ob吧!”


  • 关于框架和中间件

这部分其实是比较能体现我们技术深度和广度的。因为这些东西基本都是现成的,而且是平常开发用不到的,RPC,消息队列,ZK,Redis 等等等等等。。。

这块我其实还是欠缺不少的,只能大概的应付应付。其实说平常业务需求忙、用的都是公司定制化的中间件都是借口吧。时间像海绵,挤挤总是有的。。。 

革命尚未成功,同志仍需努力,共勉共勉~  

(如果感觉某些观点对您有帮助,也可以分享给朋友,毕竟大家好才是真的好 ^_^ )



-END-
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。


Java后端编程交流群已成立


公众号运营至今,离不开小伙伴们的支持。为了给小伙伴们提供一个互相交流的平台,特地开通了官方交流群。扫描下方二维码备注 进群 或者关注公众号 Java后端编程 后获取进群通道。






—————END—————



推荐阅读:


最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:关注公众号并回复 java 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/itcodexy/article/details/116280633

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法