使用社交账号登录
转本上岸之后基本天天写些自己的小玩具,一下子就到了 5 月中旬,才发现自己暑期实习还没有找,简单调研后发现很多公司部门已经没有 HC 了,此时自己 LeetCode 基本为 0,八股也完全没背过,加上三本学历,boss 上投递自然没人鸟。
背了 4 天八股后,即 5 月 16 日,终于有一家武汉的公司给了我面试机会,同时也是我第一次参加面试。
面试期间全程社恐紧张,说话也是各种结巴,面经如下:
最后也是顺利通过一面了,二面是老板面,跟他讲了下平时如何使用 AI 工具和大模型的,大概讲了 Grok, Gemini, Claude, ChatGPT 平时是如何使用,个人感觉的优劣那些。
大概隔了两天,也是顺利拿下了 offer
大概背了一周八股后,即 5 月 19 日,一家苏州的 AI 公司给了我一次面试机会。
这次面试开局就是两道算法题,反转链表和括号匹配。由于自己没有刷过 LeetCode 自然是写不出来的,可以说面试场面非常尴尬。
之后又问了些八股,这次回答的还不错,基本都回答上来了。但由于算法题没写出来的缘故,也只能止于一面了。
之前也通过官网投递了 20 多家公司,在 5 月 21 日哔哩哔哩给我安排了隔天的一面,当时看到面试安排挺激动的,直接翘掉了当天全部的课,用来复习八股和刷了 10 道 easy 算法题。
第一次体验大厂面试,也看了些牛客上的各种面经,害怕会被要求撕各种算法题,晚上焦虑的更是睡不着觉。
面试官交代了面试的是直播部门,面经如下:
我自己比较喜欢一边看动漫,一边有着弹幕,但在 macos 没有类似本地视频弹幕播放器,所以我会去做一个这个
用户目前有几十个,他们有时候也会给我发起一些 Github Issues,我也会及时推进并改善 BUG
目前并不支持,我是有这个支持打算的,目前打算做一个媒体库功能
因为我自己看动漫的习惯还是下载到本地,这样码率会高很多,画面会更加清晰。并且有一套类似自动化的追番流程,有新番更新就会自动下载的那种。
增加媒体库功能,支持对动漫进行元数据刮削
chromium 在 mac windows linux 上硬件解码依赖用户电脑配置,chromium 自身的 ffmpeg 因为版权问题,软解缺乏对于 h265 的支持,对于不支持 h265 硬解的用户,会出现黑屏问题。所以要考虑降级到 wasm 软解,似乎哔哩哔哩也有这方面的实践(DashPlayer + WasmPlayer)
再提一些 linux 上硬件解码的坑,要打开实验 flag
firefox 不支持 mkv 视频容器,今年 1 月对 h265 硬件解码支持
有简单了解过,它编解码的核心是 libavcodec,用于对音视频的编码和解码,就是 H.265 H.264 AAC
使用的是 IndexedDB(Dexie.js)进行缓存的,加载的时候把数据注入到 tanstack query 里面。因为项目目前是提供 web linux windows macos 四个版本,使用 IndexedDB 可以确保代码的一致性,减少不同平台之间的 bug。
同时 tanstack query 本身也具备的缓存机制,可以利用其 staleTime 和 gcTime 实现一些临时的缓存效果
利用 opencc-js 实现
libass-wasm 实现的,它是一个用 c 语言编写解析 ASS/SSA 的库, 它是利用 canvas 把字幕画上去的,从而实现 ASS/SSA 字幕复杂样式和动画效果
利用的是 danmu.js 实现的,它是利用 DOM 方式实现的,有碰撞算法,利用 requestAnimationFrame 来实现弹幕平滑滚动,它是根据用户设备刷新率来执行的,其中弹幕轨道可以根据播放器的有效高度/设备标准字号实现
用户可以单独设置每个弹幕的时间轴,来解决
后续或许可以考虑借用大模型辅助对齐
目前历史记录的封面就是利用 ffmpeg 截取用户最后观看位置的图片,利用 -ss 定位时间点,-vframes 确保只提取一帧图像
打包的时候会执行 electron-builder --win 那些 flag,等于告诉 electron 当前是什么平台了,如果后续钩子需要,可以通过 context 获取出来
或者 nodejs os 模块,可以通过 os.platform() 获取平台
后续启动会更快一点,可能操作系统会有些缓存
在组件卸载的时候,我会及时清理 useEffect 里面的副作用,把它放到 useEffect 清理函数里面
react 的话可以利用 react devTools,观察组件的重新渲染变化,也可以使用浏览器控制台里面 performance tab 进行性能录制,从而分析出原因
直接弹幕通常是使用 WebSocket 进行与弹幕服务器双向通信的,在项目中引入 Websocket 客户端逻辑,即可
利用 sentry 和 electron-log 日志处理
不知道
是的
说实习经历
他们都是现代前端的框架,很多思想都是相同的,比如组件化架构、虚拟 DOM、响应式数据绑定,并且都是基于 JavaScript。而且我之前也用过 Vue 开发一些后台管理系统和浏览器起始页,我相信我可以在几天之内,通过阅读官方文档快速上手 Vue 的
monorepo 一般会分为 app 和 packages 两个文件夹,我的项目....
比如我博客的 Markdown 双栏编辑器,左侧是封装的 codemirror 实现代码高亮,右侧是用 markdown-to-jsx 写的 markdown 渲染组件。左侧修改 markdown ,几乎可以无延迟的在右侧渲染出来。这里我使用到了 useDeferredValue,它是用到了 react 18 的并发特性,可以实现根据当前渲染压力,来动态实现一个防抖的效果,让用户基本感受不到渲染延迟。
减少重排和重绘,图片、组件懒加载,使用防抖和节流函数
CSS JS 图片 .m4s 切片
html 也可以放在 cdn 上托管,但很多网站 HTML 是动态生成的,会有延迟问题,所以一般不用 cdn 托管
八股
八股
八股
八股
大概长下方这样
这题挺麻烦的,还要写出 promise 状态。而且在 Node.js 环境下似乎会直接被 throw new Error() 给中断掉,怪怪的。
不会写,只写了个普通的反转链表,给面试官看傻眼了
本以为一面要凉凉,没想到面试结束后 5 分钟就收到了 HR 电话,约了下周一的二面。
这次八股问的多些,面经如下:
这次问的还算简单,当天下午 HR 就联系我二面通过,因为是日常实习,没有 HR 面,当天给了 offer
5 月 26 日,杭州一家 500 人左右公司,给了我一面。
有了被大厂拷打经验之后,这次面试直接速通,基本都是秒答,面了 15 分钟就结束了,隔天 HR 面后,也是给了 offer
const promise1 = Promise.resolve().then(() => {
setTimeout(() => {
console.log("111", promise2);
}, 1000);
});
const promise2 = Promise.resolve().then(() => {
throw new Error();
});
console.log("111", promise1);
console.log("111", promise2);
setTimeout(() => {
console.log("111", promise1);
Promise.resolve().then(() => {
console.log("111", promise2);
});
}, 3000);