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

技术标签: 面试  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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签