背景
本人四年经验的杂活全干工程师,年后疫情原因居家办公,因此面试时也无需到场面试。在这个空隙面试了几家大厂,结果差强人意。
自己在面试前准备不足,面试效果差强人意。印象深刻的是当问到我性能优化常见的指标时,DomContentLoad
这个词死活没有想起来,只记得了 DCL
这个词。因此建议各位同学面试前需要做好充分的准备,无论是去小公司试水
好事多磨,我把几家大厂的经验揉在一起过来分享一下面试经验,面试过程中 技术深度广度,项目及管理 都有涉及,下边就一些印象深刻的做一总结
面试
- 自我介绍
- 这一段,每一家公司都会有,虽然偏于形式,但认真对待,事半功倍。我的建议是写出来,背下来,并注意观察是否能体现自己能力及在团队中的贡献。更进一步,要注意体现自己的产品业务能力及管理能力,业务能力在同类业务公司及其有用,可以是营收(体现市场规模),竞家,产品的区分度及优势,或者解决的痛点。管理能力可以是对技术基础设施的建设,项目掌控及团队管理。
- 业务及产品简单介绍
- 这一个问题,偶尔会问到,一般是在三面。简而言之,对业务要有相当了解,这要求平时与产品多沟通,并多多点击自己做的系统。(可以由公司业务启发,抽离痛点,点醒 SideProject,从对业务的深入理解实现与公司的双赢)
- 讲解下 node 的线程模型
- 这个问题我答的不太好。要理解 node 的线程模型,首先要了解 node 的架构,node 的底层是
libuv
,v8
两大支架及一些较小的依赖如node12
中引进来更快的llhttp
,c-ares
,icu-data
,zlib
等。因此要学好node
,则要了解libuv
以及v8
两大块,其一libuv
与事件循环息息相关,无时无刻体现在你的代码中,而v8
与 cpu/memory/gc 相关,无时无刻体现在你的线上问题排查中。关于线程更多的问题,可以参考 浅析 Node 进程与线程
- 这个问题我答的不太好。要理解 node 的线程模型,首先要了解 node 的架构,node 的底层是
- 在线上如何排查问题
- sentry 监控,根据监控中的异常代码,异常及异常相关上下文(如请求失败,则失败的request,数据库查询失败,则失败的 sql,以及附加的用户信息等)解决问题,未果,往下走
- 根据 requestId 获取全链路式日志,在日志中查找蛛丝马迹 (需要借助 APM)
- 阅读日志相关业务逻辑
- 测试环境尝试复现并解决
- 你们使用了 egg 了没,讲解下 egg-cluster
- 没有,不过这个问题问到了很多次,看来 egg-cluster 确实应该研究下
- 线上的 OOM 如何解决
- 每次上线时紧盯 prometheus/grafana (线上部署基于 k8s,因此对于 deployment 的监控比较简单),如有异常,排查本次上线新上代码 (根据运维方式解决,大部分问题在这里解决)
- 如果从运维角度无法排查,进入容器,借助 heapdump, 发送
USR2
信号,抽离 dump,下到本地,并在 chrome devtool 中分析
- 你们线上流量大时,如何解决
- 如何防止服务雪崩
- 你们数据库为什么采用 postgres,它有什么好处
- 更好用,对于 jsonb 及数据分析更加友好 (老大们选的,我整体对于数据库偏弱了)