【面经】匿名面经

4月19日下午更新

花了一个小时多讨论,最后大家决定原地解散。及时止住,把精力投到更值得的事情上。虽然不能一起打比赛还蛮可惜,但是还是遇到不少好伙伴的。以后可以多多交流。

 

---------------

其实昨天就比较冷静了。今天凌晨才写面试回忆是因为白天事情太多了……当了两门课的TA,思考比赛宣传(我怎么就去当了运营了?),再读读经典,接下来可能还要参加个hackthon。有点逼自己太过了。

 

话不多说,来给我的面试记录“电子化”吧。

 

这次的教训是千万不要在电话面试(啥都没让你干,就让你说说话)的时候动纸笔,可能会被怀疑看小抄_(:3」∠)_这点真的很重要!我真的被吓傻,赶紧解释了一下我有回忆的时候拿笔写字的习惯……因为知识点太琐碎,我担心重复。后来解决了,虽然也没了面试的心情。害,希望不要因为这个误会而让我的学校名声有损,毕竟作弊零容忍啊……这个面试官其实超nice的。我也应该一早就说明,如果有视频面试的话,我希望能视频面试。电话面试让我看不到面试官,不是很能get到面试官的情绪。

 

最早的一些我没有记录。

 

前面简单自我介绍。然后是聊做的题目。我感觉自己做的不太好,在我看来,如果是我的同学,应该早早在半个小时里就AK了……(题少)我不仅没有AK,还没有一道全对的题,尽管第一道我最后想到要怎么做,但是因为时间来不及就没有改……

 

然后聊到项目。提到nginx。我感觉我面试的确做得不好,知道反向代理、负载均衡,但是概念一直没理清,说得含含糊糊,可能这个地方就让人怀疑我是不是“有情况”。项目方面,我后端经验约等于0,不过没有和面试官说清楚,他可能会理解错。他也提及我的简历其实写得比较含糊,会让人误解。然后又是一个尴尬点,我记不太清为什么用户session要放redis了,面试官居然给我解释了……我真的感觉有被用心对待。也提及了cookie和session的区别,首先先说明带信息访问的必要性,http是无状态的,每次请求都是新的,如果后续要处理前面的信息,就要重传前面信息(题外话:23333333这不就是我们平台的恢复历史过程吗,不过后来有了长时运行,下次注意对比一下,如果不一样那也看看区别),带key访问服务器能解决这个问题;其次,如果有多个服务器在接收信息,如果把session放在某一台服务器上,那么其他服务器就get不到这个信息了,举个例子(类似),有一封信要交到某个人手里,随机走到三间屋子中的一间,那么如果他走进去的那间屋子并没有收件人的信息,那么这封信就丢掉了。把session存在Redis相当于这三间屋子的人共享一份表。(然后我还蠢蠢地问这是不是解耦,和消息队列成功地混淆了……)

 

接下来是我最感动的环节了……我不会JAVA,也没学过软工,说了自己看过设计思想,被纠正为设计模式(我真的推荐去看https://segmentfault.com/a/1190000010706695,说的很详细,最好的是有例子。有些我看描述没看懂,看代码看懂了……)。面试官就问了我多线程(缺少经验),告诉我在实践中多线程和反射是用的比较多。问了我我了解JAVA哪些知识,我刚好之前在复习C++的时候有一个博客在对C++和JAVA的对象内存位置,就回答了零零碎碎,我知道JAVA的知识点。

 

面试官:JAVA里一般应用分为SE、EE、ME(面完去查,SE一般做桌面应用,EE企业级规范,ME嵌入式设备)。

 

面试官又问,你了解哪些设计模式?我回答了单例模式(只有一个静态成员,并且需要提供一个能访问到这个静态成员的静态函数,例子有log打印一个类)、工厂模式(简单工厂、工厂、抽象工厂,这里我又开始支支吾吾了,因为我想到了之前看这块时候,文里提的木门、铁门、低级、高级的例子,但是我一下子又没能完全想起来,还是缺少使用……)、观察者模式等(提到网络编程里,这块会比较多)、外观模式(我真实脑抽,外观模式其实没啥好说的,我还扯了个开机例子……)。

 

面试官:我给你说说单例模式的其他一些应用哈。比如Controller(我在看记录打字的时候发现了这个,查了以后才知道是一个Annotation),每多一个request,就多一个thread。网站有100个用户,这样就会有100个线程,而线程独享栈,在web层面就会压力比较大。所以用了单例模式。但是这里会引入并发问题,我们就要用锁。

 

面试官:(讲到工厂模式)JAVA是面向接口编程,比如这有一个动物叫声的函数(有点萌,面试官举例了几种动物的叫声),咆哮、汪、喵,用工厂模式我们就能用统一的接口访问了。

 

接下来聊了聊数据库。哎,我是真的不好意思说我报的数据库这个方向,是因为其他的我都没啥经验……数据库我可能了解过一点,但真的是我能说的最多的东西了。先讲了我本科学过,了解一些MySQL,知道事务(begin…commit,ACID四大特性,面试官补充了一个rollback,你要知道,其他的面试官是不会给你这么多的反馈的,我觉得还蛮特别),知道隔离级别(读未提交、读已提交、可重复读、可串行化,会有脏读、幻读、不可重复读,我太傻了,不可重复读都忘记了……只说了俩)。然后知道Oracle是读已提交级别,MySQL是可重复读级别。然后分析了下delete、truncate、drop的区别,以及delete和truncate要在事务commit以后执行。

 

数据库的锁,悲观锁乐观锁。悲观锁的读写锁都是互斥的(面试官补充了一下,形式是select xxx from…for update),乐观锁里读是共享锁,写是互斥锁(又补充了一下,update…set…where id = 1 and version = 2)。MVCC多版本控制协议,是在每行数据的末尾加上一个创建版本号和删除版本号。又提到两个存储模型,InnoDB和MyISAM,我强行扯到前者是表级锁,后者是行级锁。然后提及数据库的B+树,对比了一下B+树和B树,还有红黑树。红黑树定义,优势。我说红黑树是C++的map实现,在linux的内核中关于长整数指针(这一块可能是我记错了……回去找找当时看的博客链接,我觉得写得挺好的,把linux内核的数据结构与算法列的蛮详细)。然后问了234树,我有点懵,好像没学过,于是面试后去查了一下,等之后有机会一起整理下。

 

多线程死锁的四个必要条件。说完必要条件,然后就是尴尬的被怀疑了_(XO」∠)_害,怪我脑子转不过来,说话太慢,拖太久了,虽然这块还记得还蛮清晰的……就是不能在面试前一天通宵做事……

 

怎么预防。①破除这四个条件;(后面的面试官就没给机会说了,马上转了另外一个问题)②运行的时候预防死锁;③出现了的话检测死锁;④检测出以后处理。(细心的看客可以看到我字节那篇也讲到死锁了……害,我结果还是没时间去查证……)提及了消费者生产者模型,害,还是忘了。之前专门看了华文慕课陈老师操统的这几个ppt,还是没有记起来全部,就记得empty,full,mutex_for_cnt几个锁。然后我又卡壳了,这是个信号还是信号量来着,想到可能有多个产品在池子里,犹犹豫豫说了信号量。信号量和互斥锁没啥关系,我又记错了,互斥锁和条件变量经常一起用(感觉那天有点魔怔了……)。

 

有哪些排序算法。O(n^2)冒泡、插入、选择;O(n*log(n))快排、堆排、归并。说一下稳定性。说一下归并的思路。

 

linux下知道啥命令。top看内存,ls列目录,mkdir创建文件夹,netstat看网络情况。面试官问有更名的命令吗,我回答记不太清,或许是rename?然后面试官说,其实不用那么麻烦,你知道移动是什么吗?我:mv,move。面试官:那你知道什么是复制吗?我:cp,copy。面试官:那你其实可以用mv来,源文件名,目标文件名就是你要改的那个名。(面完以后我又细细想了这个问题,的确是,还是要活学活用,举一反三……)

 

面试其实最后还有一个环节,我就不细说了……

 

还是要努力鸭!

 

------------

发完一看日期,害,是IJCAI的通知日期。但是和我等弱者有什么关系呢?_(:3」∠)_洗洗睡吧。

posted @ 2020-04-19 03:12  Katrin  阅读(158)  评论(0编辑  收藏  举报