奇安信今日面试记录-python服务器方向
春招以来完全在准备前端, 奇安信因为应届没有前端岗, 就随手投了用的比较多的python, 本来以为没机会面试了, 结果昨天收到了面试短信, 想着一晚上也准备不了啥, 就干脆走一步看一步了, 从天津到北京, 去火车站路上有点堵, 预约的一点半结果迟到一小时。扫码签到以后, 过了十几分钟就被按排上了, 接下来是正文:
一面, 一个多小时, 面试官很和蔼
先是自我介绍, 随便说了两句(好像我面试自我介绍都是想到啥说啥)
然后开始问实习期间做的项目, 具体干嘛的, 怎么实现的, 我边说, 面试官边发散的问
接下来面试官看了眼我简历, 就问我: "我看你前端做的比较多, 怎么投服务器", 我心想, 卧槽, 当时懒得改简历, 瞎投了一份,这个时候我已经开始慌了, 然后顺嘴一说, 我的规划是做全栈, 先做前端或者先做后端只是一个过程, 说完我就后悔了, 我依稀记得有人说过面试一旦说自己做全栈, 面试关就会进入拆逼模式, 这个时候我真想抽自己俩嘴巴子, 还好面试官笑了笑没切换模式, 总算有惊无险, 哈哈哈。
然后, 面试官就开始问python, 先是is和==的区别, 哎呦~ 这个我熟, 不就是每个对象都有一个唯一的身份信息, 可以用id()获取, is比较的就是这个值, 而==跟c 里的==意思差不多, 这个时候我露出了自信的笑容, 面试官与我相视一笑, 继续追问, 那a = [], b=[], a is b 返回什么, 这时我依稀记得python有内存缓存, 小的对象直接从缓存里拿内存, 这个[]应该是个小对象, 于是我自信满满的回答True 面试官又笑了, 当时我以为面试官是开心的笑, 值到刚才我敲了一下, 妈蛋, 返回False。"你判断是否是None时候用的is还是==?为什么用is可以判断?", "(这里我其实不知道, 平常习惯性用is, 于是开始猜)我猜是None其实是一个全局的对象, 所有的代码块都访问的同一个对象", "其实None是用的单例模式", 接下来继续追问, python闭包了解吗, 艾玛, 这个前端js用的比较多, 不就是一个函数内部定义一个函数并返回, 这个内部函数可以访问外部函数的局部变量吗, 本来还想追加一句,这种方式外部函数的局部变量会长时间驻留在内存里, 不过面试官比我更快, 继续追问,那你知道内部函数如何修改外部函数的局部变量吗?, emmm???能访问我知道, 修改还真没注意到, 引用类型能访问就能修改这倒好说, 值类型不管传递参数进去还是直接访问, 都没听说过能修改, 我又开始慌了, 于是开始胡说八道, 用global?面试官摇了摇头, 你知道nonlocal吗, 诶嘛, local我知道, nonlocal还真没用过, 面试官:"好,跳过, 说一下url的结构吧", 欸嘿嘿, 主动权又回来了, 我可是做过前端的, 不就是proto://domain:port/path这样吗, 顺便一提, github项目的ssh链接不完全按照这个格式, 虽然我也记不清具体格式, 说一下表示我观察仔细。那有验证的情况呢?, emmm, 是proto://user:password/domain:port/path这样?"passsword后面是@", "哦~ ~ 这样啊~ ~ ", get请求时候的参数呢?, "oh对, proto://user:password@domain:port/path?key=value&key=value这样的形式", "还有别的吗?", "emmm, 后面带上#, vue中的hash方式路由, 直接定位页面中的一块儿", "osi七层模型比较常问, 那我问一下五层...", 这个时候我有点兴奋, 开始了抢答, "先是应用层,然后...", "等会儿, 我还没问呢, 你从应用层开始说一下你知道的协议, 和他用***嘛的", "好的, 应用层有http, https, smtp, ftp, pop3等等协议, balabala..., 具体用***嘛的, 我现在哈没想好怎么描述", "那传输层呢?", "主要有tcp, 和udp, tcp面向连接的, 会经过三次握手, udp是无连接的, 常用在在线视频, 多人会议等上面", "那tcp为什么非得三次握手, 不可以两次?", "emmm, balabla..."(其实这里我早忘记是为啥了), "你确定吗?", "好吧我不知道", "那三次握手客户端会发送什么包?", "包里面有seq, emmm..., 服务器端第二次握手会返回ack包,ack值是客户端发过来的seq 1, 并且带上自己的seq, 第三次客户端返回ack包, ack值是服务器端发过来的seq 1", "那四次挥手为什么必须四次?", "(我已经慌得不要不要的了, 开始瞎说)第三次挥手之后涉及tcp迷途, 客户端必须等待一段时间, 保证之前迷失的包完全从链接路径上消失, 不然如果直接在这一步断开, 然后立即在相同端口和IP上建立相同的连接, 那么上一次连接中迷失的包假如这时候到达, 就无法得知是上一次的还是这次的, 会引起混乱", "那第二次挥手和第三次挥手可以合并吗?", 我想了一会儿, 实在想不出来, 因为我本来就没细想过, 直接说我不知道, "你继续说下一层", "网络层到链路层有arp协议做ip到mac地址的转换", 面试官继续追问, "既然mac地址是唯一的, 那为什么不直接用mac地址做链接,还要用IP地址", "(其实我不知道,开始分散面试官注意力)您电脑绑定了一个mac地址, 您拿着电脑去了别的网络环境, 如果直接用mac, 很难判明您处于哪个网络, 有了IP, 您随便走, 反正做个转换就行了, (嘿嘿嘿, 我张口就来, 怕不怕)", "那你还知道网络层和链路层哪些协议?", "(就知道你要问这个), emmm, 想不起来了", "ICMP知道吗?", "ping用到了ICMP", "他用***嘛的", "经常用来做一些状态检测?", "跳过, 你用过Flask, 说一下Flask架构", "(???对不起,我错了, 我没看过)balabala...", 面试官又笑了, 我也跟他一起笑, 嘿嘿嘿, 我就是那个傻子, "flask跟django有什么区别", "balabala....", "用过sqlalchemy, 那ORM有什么优点和缺点", "balabala(一顿瞎扯)", "了解python里的锁吗, 说下GIL", "(又是一通扯)~ ~", "问一下数据库吧, MySQL里的索引用过吧, 索引为什么快", 其实我知道是建立了b tree, 但是不知道咋地从我嘴里冒出了"好像是建立了个红黑树啥的结构", "值到btree, b tree吗", "b tree的数据都存在叶节点, 并且叶节点会建立一个链表, 数据都存在一起, 再读取时候可以一次读一整块儿来做优化, btree每个节点都会存数据, 也就无法做b tree那种优化, 其他的想不起来了", "其实索引就是用的b tree, 那你MySQL有做过优化吗, 讲讲吧", "(不好意思, 我真没有, 平时最多crud, 当然我不能这么说, 必须瞎扯啊)balabala...", "知道或者用过mysql里的锁没有", "(想了想, 四个月前看过, 想不起来了, 我真是个辣鸡)没用过", "行, 跳过, 你说了python里GIL锁导致一次只有一个线程能运行, 那他的多线程不久没意义了, 你知道python多线程什么情况下比较适用", "(这又涉及到了我的知识盲区, 卧槽, 我只是盲区咋这么大, 我是不是瞎了), cpu密集型任务, python多线程不过不会提升效率, 还会降低效率, i/o密集型, 也顶多是不会降低效率, 还真想不到python多线程有什么情况适用", "其实像那种需要输入的I/O密集型可以考虑用多线程, 那python里面有没有其他异步方式", "有multiprocessing模块,实现多进程", "多进程怎么通信", "(哈哈哈哈, 这个我看过, 现在还没忘完)balabala...", "python还有没有别的异步方式", "emmm, 有协程, 我是用yield来做的...", "平时开发是在linux还是windwos", "以前是在windows, 最近完全转入Ubuntu了", "抓过包吗", "抓过啊, 用wireshark", "没有用命令的方式抓过吗", "(这个还真没有, 我是一个只会ls, mv, cp的辣鸡)没有", "自己在linux配过ip吗","(我印象中以前玩虚拟机时候是用ifconfig来配)好像是用ifconfig来配", "查询端口占用用什么命令?", "lsof", "还有别的方式吗?","netstat也可以", "查看进程用什么命令", "(我自己印象中是ps, 好像不太对)ps吧", "了解过加密算法吗, 知道什么是非对称加密和对称加密吗, 非对称加密和对称加密有哪些算法?","(这个我熟, 之前写过ssh2客户端,又能吹逼了)巴拉巴拉巴拉(这中间把aes算法记错了, 他是非对称加密, 我记成了对称加密, 面试官提醒是rsa)", "用过虚拟机, 知道虚拟机配网络的有哪几种模式吗","有桥接, nat, host-only(面试官追问它们的区别时候, nat, host-only没分清楚,这块儿只是用过, 没深入了解)", "时间有点久了, 就不让你写算法了, 你觉得我今天问的这些问题超纲了吗(微笑脸)", "肯定是没有的...", "那你觉得你答的怎么样", "很多问题没深入了解过, 自己深度不够吧..."
现在就只能想起来这么多, 有些问题忘记了, 顺序可能也不是这样, 总之一面好多问题能说一点点, 一往深得挖我就歇菜, 其实我感觉面试官发现我深度不够, 就开始瞎几把乱问来抢就我了, 我最后问了面试官我能不能进二面, 当然是没回答喽, 然后结束以后我走向了门口(其实我只是想去门口接待那确认一下一面结束之后要做什么), 到门口的时候我回头看了下面试官, 发现他跟我说了啥, 有点远当然没听见, 然后我出了门, 去问接待了, 然后面试官就给我打电话, 说还没完呢, 哈哈哈哈, 我怎么可能那么快就走, 于是我踏着轻快的步伐回到了等候区...然后等了二十几分钟吧, 进行二面
二面, 差不多一个小时, 面试官依然很和蔼
首先依然是自我介绍
然后还是怼项目, 比一面更详细的问了实习期间的项目, 从逻辑, 流程上面扣的很细, 中间还问了一些地方有没有其他方法实现, 有些面试官提示很多, 我依然没完全说到点子上, 好菜啊我, 这部分大概半个多小时。
然后问了,csrf, xss, 这些一开始没理顺思路, 说的自己都感觉混乱, 后来面试官一点点引导, 倒是说完了, 然后问了"sql注入", 没深入了解过, 也就跳过了, 然后依然问了加密算法, 我顺道说了下https, 二面现在就记得这么多了, 总之二面项目抠得很细, 必须对项目细节很熟悉, 并且要求思维灵活, 这期间因为位置就在一面的位置旁边, 一面面试官每问正在面试的小姐姐一个问题, 就转过来一会儿, 看我吹牛逼, 我用余光看见他在笑, 好尴尬, 后面越吹越起劲, 感觉自己有点飘了, 一面和二面面试官笑得很开心
然后等了差不多半个小时吧, 进入了三面, 这期间, 差不多六点时候, 一面面试官好像要下班了, 还打电话过来问我过二面了吗, 这时候我真的开始飘了, 一下子自信爆棚
三面hr面, 一开始自我介绍, 稍微问了点家庭情况, 为什么在北京找工作之类的, 然后差不多六七分钟面试官就不问了, 到了我提问环节, 我一看这哪行, 就开始瞎问拖时间, 比如问了面试官对我的第一印象, 哈哈哈, 面试官说第一印象来看我挺靠谱的, 就是技术深度不够, 只能算中等水平, 简历因为都是外包项目, 没有大型的企业项目, 所以也没什么亮点, 还追问了我面过哪些公司, 有多少offer了, 我说我这是我春招第二次面试, 还没offer, 面试官一惊, 然后瞎扯了会儿, 我又问您能从自身角度跟我介绍下360吗, 还有从自身角度跟我说说在360工作的感受, 然后又跟面试官扯了十几分钟, 甚至扯到了国家安全, 我真是扯淡小能手, 然后我问了您对996的看法, 哈哈哈, 这最后一个问题成功拖到了六点半, 我真是个人才, 面试官说了一点我也很认同, 反对996的肯定生活相对稳定, 有了一定的社会地位, 有闲心去考虑这些问题了, 对于刚毕业的学生, 特别还没找到工作的学生, 或者工作不理想, 生活还没稳定下来的那群人来说, 哪有闲心关心是不是996, 自己生活都还顾不好呢, 像农民工之类的, 一天工作十五六个小时,还是体力活, 对他们来说这可能都是生活常态, 总之跟面试官聊的挺投缘的, 哈哈哈, 也不知道能不能过, 写个面筋攒人品吧。
总之, 一定要对自己的项目非常熟, 然后认准一个方向去准备, 别像我没定好方向, 都靠临场发挥, 难怪现在还没offer, 真是个辣鸡