简略介绍下背景:自己已工作两年,这次属于社招,不是校招哦!投递的岗位 base 是北京。
先上注释
一面内容大略:
- 先来道算法题,不难:链表示意的两个数相加。面试官说不必运行,大略写一下就行,说是因为说牛客上的运行环境不行。这题之前做过,写完之后没跑就间接给他了,他问是不是之前刷过,为了装逼我说没有刷过,而后答复说:这题不就是 CPU 的加法器的实现嘛,计算机组成原理。
- Https 的过程讲一下。先是说了 http+ssl,dns 之后,筹备讲 ssl 的原理时,他示意我说答复一下传输层相干的。而后我就答复了 tcp 三次握手,对着服务器端指定端口,比方 80 端口发动连贯,之后就是失常的数据申请了。
- 缓存穿透和缓存击穿。其实是晓得雪崩、穿透和击穿的,然而一下子没间接说分清穿透和击穿,次要是太久没用过,忽然感觉击穿和穿透,如同都差不多啊。
- Go 协程简略用法;
- Go func 与 method 之前的那个 Receiver 是什么?(答:相似 Java 的实例自身,成果同 java 中的 this 关键字,同时在 go method 也能够把这个 Receiver 当做参数来失常应用);
- java 实例放在哪个区,常量放在哪个区;
- 说一下 Netty 的 IO 原理,答:Reactor 反馈模型,Linux 那边叫做 IO 多路复用。一个线程用来接管申请,将读写事件交给背地的 worker 线程。Redis、Nginx、Netty 都是用到了这种模型。Redis 其实也是多线程,只不过是用单线程来接管申请,在客户端看起来是串行接管执行,所以成果上就是单线程。然而 IO 多路复用才是 Redis 能高并发的底层保障。
- MySQL left join、inner join:inner 的就是差集、left 的就是保右边;
- Go 的闭包语法,答了外部函数对外层函数局部变量的援用,相似的还有 js、java 的 lambda;
- Redis 的 setnx;(这个尽管只是提了一下,然而感觉没答好,须要增强。顾着筹备 Redis 集群原理去了)
- 分布式锁的提供方,答:用过 ZK 和 Redis 的分布式锁;
- 我的项目相干问了不少,比方前家公司所负责我的项目的次要内容;
- 我的项目所产生的的一些价值,能够具体点,用一些案例或者数字来佐证都行;(这块没答好,接下来二面须要再整个对于我的项目教训的形容、集体所负责我的项目、产生的价值等,越具体越好,能有一些具体案例或者数据来撑持更好);
- 接上,总之,也要花点工夫来回顾本人在之前公司的奉献和工作内容,越具体越具体越好,回绝假大空;
算法题:
给出两个 非空 的链表用来示意两个非负的整数。其中,它们各自的位数是依照 逆序 的形式存储的,并且它们的每个节点只能存储 一位 数字。
如果,咱们将这两个数相加起来,则会返回一个新的链表来示意它们的和。
您能够假如除了数字 0 之外,这两个数都不会以 0 结尾。
示例:
输出:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输入:7 -> 0 -> 8
起因:342 + 465 = 807
二面大略内容:
- 自我介绍,次要是说了工作经验,负责的我的项目的次要内容,越具体越好,把最能体验价值的后果或者报告什么的讲一讲;
- TCP 四次挥手,联合 CS 两端点的 TCP 栈和下层利用的交互来解释四次挥手,以及为何须要两头那个 FIN-WAIT- 2 这个过程,最初由被动敞开一方的下层利用通过调用 socket.closed() 来完结数据传输,进入最终的 FIN 模式;
- 操作系统内存模型?这玩意儿不是就段页转换啥的嘛,面试官进一步提醒说哪些区放数据,哪些区放线程数据之类的,我问了下您是问相似 JVM 内存模型那样子的吗?他说不是。我又说,那不是的话,我对操作系统内存模型的认知大略就是高地址空间寄存内核数据,而后低地址空间对于过程来说就是个虚拟空间,领有残缺的寻址空间,这里寄存着过程的数据和代码等,再细就不是很理解了,而后就跳过这题了;
- 算法题是股票买卖,一次和有限次两种。写出了有限次的状况,一次的一下子遗记怎么转过来,这题做的比拟卡,整题至多有 20 分钟,哎。今天下午温习的时候还再次温习看了这个股票全家桶系列的解法呢,感觉只有看是不行的,要有短缺的工夫,就算没有从头了解,也要再默写一遍才算温习过。所以下次如果没有温习状态的时候,不要看着文字思路发愣,能够边默写边找回状态,嗯;
算法题:
给定一个数组代表股票每天的价格,请问只能交易一次的状况下,最大化利润是多少?日期不重叠的状况下,能够交易屡次呢?
输出: {100, 80, 120, 130, 70, 60, 100, 125}
1)只能买一次:65(60 买进,125 卖出)
2)能够交易屡次: 115(80 买进,130 卖出;60 买进,125 卖出)
输入交易的序列和最大利润
三面次要内容如下:
- 自我介绍;
- 介绍我的项目状况,重点说了近一年的工作我的项目的大略;
- 研究生在校的钻研内容之类的,比拟杂;
- 我的项目中的技术亮点:理解几个,面试官貌似对这些也不是很感兴趣,这预计也是前面他感觉我没有成长的起因吧,可能认为这些货色我在之前就应该都学会了的;
- 实现简略令牌桶算法,没有思考随工夫滑动的状况;
- 加强版:令牌桶,加上随工夫滑动的要求,即:限度用户在任一间断的一小时内,不能超过 5W 的申请。这边提到了说将一小时分成多格,比方 60 格这样的,面试官拍板貌似批准了,而后就实现代码了,包含协程异步更新工夫窗口;
- 没有基础知识问答;
- 没有算法题;
三面反诘环节 ,问:我咋样?(措辞是:这简短的面试交谈过程中,您感觉我咋样?),面试官说,我这一年来成长不大,简直没变动,可是我感觉这一年来才是略微有点儿提高的呀。
不过,通过这么一问,感觉反诘环节也挺有意思,当前如果再有面试,反诘环境能够多问些面试官对于咱们本人的评估和认识,比方:下面说的您感觉通过这一小时的交换,我整体怎么样?如果像下面的面试官说最近一年提高不大,那么应该持续诘问:那您感觉应该向什么方向去深刻学习和思考比拟好呢?态度恳切一点就行,作为面试官人家还是乐意帮你指出不足之处的。
而上述的两个问题:我咋样和如何改,抛开 offer 不谈,这两个问题我感觉能够说是失常面试最大的播种了。而面试之前筹备的那些常识毕竟比拟零散,还是须要靠平时的积攒来坚固。面试最重要的是让别人来评估你,以前没反诘这两个问题的时候,这些评估人家面试官根本不会被动通知你,只会整顿一下而后录入到公司的人才管理系统,以供后续评估。
但你当初反诘一下,就能够得悉这两条信息,这些评估信息对你来说才是最有用的,放在公司它只是大量候选人评估数据中的一份,可有可无。但对你来说却是个贵重的信息,你能够据此从他人的视角来扫视本人,这种换个角度的扫视比本人素日里思考写总结来得主观。毕竟你体现进去的才是主观的,外在的其余没表达出来的方面只能说你表达能力不行,也是种毛病,须要反思之一。
如果没有进行这样的反诘,就不能更加全面的得悉他人对你的认识,也就错过发现自己弱点和改过的机会,以前面试反诘环节都是傻傻的问一些没多大意义的问题。今后该当多留神,要懂得跟面试官“要回”属于你的那份评估信息。
以上就是面试过程中波及的一些内容,属于流水记账式的列了一下。
上面谈谈一些感想吧
- 对于算法的考查。联合上述三面的内容,会发现对于社招来说,算法题的比重并没有特地大,相同,工作教训和我的项目这块的占比会更多,但也不是说不考核算法,该刷的题还是得持续刷,算法是根底;
- 对于工作我的项目的梳理,有几个感想。首先表白分明我的项目介绍的内容,而后是价值所在,对于我的项目所产生的的价值和你所做的奉献,这个很重要,是掂量你价值的一个点儿。最好可能梳理一下过来的一些文档和报告,整个具体的数据和细节点来谈谈,防止假大空;
- 日常工作中,最好无意识的去加入一些高质量的 bug 交换解决当中,这样不仅可能在日后面试当中跟面试官交换,也能在当初解决问题的时候晋升本人的能力。这类高质量 bug 的解决就属于技术亮点,很考验一个人的基本功;
- 自我介绍的时候,就不用说本人叫什么、哪里人、什么时候在哪个学校毕业之类的,间接说毕业之后在哪里工作,负责的我的项目是啥,而后就能够把提前准备好的对于上述第二点的内容都讲一遍;
上述的感想也是比拟离散、杂碎。还想再分享一下集体的一些学习教训,欢送交换斧正。
学习教训
技术面完结之后,今后对于根底的常识的学习可能没有这几天这么紧凑了,短时间填鸭式的学习大脑有点忙,不过这种感觉也还行,接触到了新常识有点成就感。当你在浏览面经的时候,外面提到的问题你感觉你都会了,是不是也有种自我必定的情绪呢。
不过,面经外面提到的常识都是比拟扩散的,毕竟在那么短的面试工夫内,面试官也只能随机抽样的查看,没工夫做太全面的交换。这也导致咱们看面经的时候都是比拟扩散的知识点,所以须要在今后,继续的学习,每段时间都分心钻研某个常识系列,系统性的学习比拟有成果,也比拟全面。比方 MySQL、Redis、ZooKeeper、MQ、JVM、OS、网络、算法等。
就算法来说,它是须要长时间的积攒,短时间内的突击成果不是特地大,也累。所以今后对于算法的学习能够这么来:每日一题、或者之前做过的题目每天拿一两题进去再做一遍,从新思考,深刻的多看看题解领会领会,不再是赶时间的去冲量。学会总结,了解每个算法与数据结构的含意,工夫久了就能做到不变应万变。
另外,算法大部分还是属于背诵题,不少题目把模板写进去就实现的差不多了,只须要把细节解决一下就差不多了。工夫久了,这些模板题就变成条件反射,此时对高级的数据结构也会有进一步的理解,思考速度和解题能力都有所提高。
OS 和网络也差不多,这三者属于素日工作都很少间接可能体现进去的常识,素日工作用得少,又没去温习工夫一久就会遗记,用进废退,人情世故嘛。所以才像下面说的,应该要保持每日一题、或者时不时挑一些做过的题目从新做做,次要是为了放弃手感,而做过的题目拿进去再做一遍也不会花太多工夫,这样在日常工作之余也比拟容易保持下来。
通过这段时间的面试筹备,算是把算法入门,找到刷题的状态了,尔后应该如上所说,保持每日温习做做老题,偶然周末工夫富余跟着“每日一题”做做新题,放弃上来。
说回 OS 和网络,这类常识对于逻辑思维的要求没有算法题那么高,算法题属于“CPU 相当密集型”,不练就不会。而 OS 和网络这类可能更多的是了解之后带点记忆的常识,做点输入存到笔记或者博客,定期来回顾回顾就行,属于“轻微 IO 密集型”,看完之后一段时间,也多少还有些印象,可能知个大略。每两年重看相干书籍,温习一下就能够坚固。
整个计算机体系,包含底层硬件组成原理、再上的操作系统和网络,这些之间其实都是有逻辑关系在的。能够 OSI 七层或者 TCP/IP 四层模型来看,它们就是个整体,全副理清之后,在大脑内能够存在相当长的工夫。日常工作和生存中,只有遇到计算机相关的问题,大多都能够从这个整体来思考,这种思考也算是种回顾温习。
相比而言,算法算是比拟离散的,排序、BFS/DFS、DP 等之前的分割不是特地的严密,至多没有像上述 OSI 七层模型这种递进关系相互依赖的状况,学习的时候也就能够独自知识点一个个击破了。
对于今后放弃基础知识学习的想法,首先算法就如上述所言,每日一题、或者做过的题目重做,这样是为了不给原本就繁忙的工作日减少太大的压力,用简略的算法题来放松放松就行,搞几个 AC 找找成就感。
而对于基础知识,后期打算持续多翻阅翻阅面经,以面经中的题目为切入点,来温习(如同技术博客首页的文章也是个不错的切入点)。温习过程中再由点及面的去谷歌各种不明确,每个疑难点在输出谷歌之后,一次性多关上几个页面,多看多比照而后联合整顿本人的了解,输入到日记或者博客中。
比方,最近看到个比拟经典的题目是 MySQL 的隔离级别,这个问题谷歌一搜,大部分都有提到 MVCC、以后读、快照读、行锁、间隙锁,都什么常识啊,反正对于工作教训尚浅的我来说,曾经涉及到常识盲点了。也好,这些点都记下来,一个也别想跑,而后再别离谷歌这些知识点,可能又会引出一些更加底层的、你没见过的知识点,也没关系,持续记录持续搜。
今后可能又会看到 MySQL 索引相干的面试题,搜这个的时候,兴许会碰到 MyISAM、InnoDB、B/B+ 树、磁盘 IO 块与零碎页、主索引与辅助索引、m 叉树的决裂与合并……之类的,这样对 MySQL 的认知又多了一些。过些时日,你可能想着残缺的去学一遍,这时候买本《高性能 MySQL》来看,而且你之前学到的隔离级别、索引它外面都提到了,并且更加全面和认真,从基本概念的呈现到最终的罕用场景,都给你列出来了。
上述之所以要先从面经题目切入学习是因为集体在看书的时候,总有种大而全的感觉,书毕竟比拟实践,八面玲珑,有用的没用的都会列出来。而面经上的题目是面试官联合当下工作内容提出的,有可能就是他最近工作中遇到的问题,间接抛给你看你怎么思考。那么这种面经题目就比拟有意思,贴合理论工作,可能更好了解,通过面试官这么一折腾印象也更加粗浅。这种零散的知识点学的差不多了,再来看书,就比拟有感觉,晓得书中哪些地方是重要常识,哪些地方其实没那么实用作为理解即可。
其实,日常工作中不论是用到的常识,还是遇到 Bug,所波及的知识点也是比拟随机离散的,相似下面浏览面经过程中遇到的问题,看缘分。而在我的项目排期不那么紧的时间段里,找本书系统化的把之前的碎片化知识点串起来,就很有必要了,既是总结也是坚固。
对于学习的另一个观点:
任何事物都是从小倒退到大,学习的时候应该从它过来小的规模,跟着时间推移发展壮大,逐渐去理解。比方学习 Linux 内核能够从晚期低版本、JVM、Spring 也相似,晚期规模小,构造绝对简略,比拟容易了解。再逐渐的依照倒退须要,减少各种功能模块,直到以后最终版本。这样的学习门路能够分明的常识零碎中各个模块的由来与作用,也可能晓得哪些是根底重要模块,而哪些是为了解决历史特定问题的模块,理清主线。
再举个例子,前些时候看到一篇对于限流的文章。文章一开始先从简略计数谈起,对于晚期利用来说,简略的计数算法的确够用,起初随着业务的倒退细化,简略计数粒度不够细,所以须要有相似滑动窗口这种成果的限流,也就衍生出了令牌桶和漏桶两种限流算法。
最初放上一个不错的记忆法——艾宾浩斯记忆法则,嗯就是小时候书上介绍的那个。新常识学习之后,分屡次,每次不同距离的去温习,大略十来次就能较好的将短期记忆转化为短暂记忆了。而且学过之后,第二遍开始从新温习就简略多了,因为都了解过并整明确了,再从新温习更容易,更快,更省时。
之前考研的时候,背单词就隐约有用到这种形式。整本单词书,第一遍先花个三个月背一遍。之后,第二遍开始就越来越短,越来越快 (这都什么虎狼之词)。前些时候背诵《道德经》也是相似,用了个 APP,把每天背诵好的篇章截个图放到这个 APP 中,而后它会依据艾宾浩斯曲线的法则节点,定期揭示你温习。你要做的就是当它揭示的时候,关上疾速默念一遍,默写一遍就能够勾掉了。还是那句话,第二遍越到前面,所花工夫 就越来越短,越来越快。
以上,对于是学习形式和记忆办法的一些教训分享。
最初
最初再说句,任何工作和学习都是须要背诵记忆的,以此为根底来进行创作、推理和总结。比如何洁,他也是背过了大量的棋谱之后,再联合本身的想象力和逻辑能力,才有精湛的棋艺;比方钢琴家,也是须要背大量的琴谱、*,之后基于此再联合生存教训和灵感,来进行创作。巧妇难为无米之炊,脑中记忆的内容就是咱们的大米,只有领有大米,才有做出香喷喷的米饭的前提。并且大脑善于的就是记忆,他就像是缓存,之前推理过的经验过的间接缓存在大脑中,之后如果再次遇见,间接查出来返回即可。
之所以还要再啰嗦的说下对于人尽皆知的记忆办法,是想强调任何学习和工作,它首要做的就是先去记忆,背一些概念。所以学习新常识的时候,遇到太多的概念不必慌,先背下来,背不住的就记在小本本上,常回顾。背到一定量之后就能产生量变,之后各种脉络也就缓缓关上了。
看完三件事❤️
如果你感觉这篇内容对你还蛮有帮忙,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的『点赞和评论』,才是我发明的能源。
- 关注公众号『java 烂猪皮 』,不定期分享原创常识。
- 同时能够期待后续文章 ing????