我的秋招实习之旅
本篇主要记录的是个人在 24 年年末找日常实习时的一些面试经历。同时也是一个对自身目前发展情况的检讨,算是给自己的学前端这么久留下的一个交代吧。
先说一下背景:双非,目前在读大三,主要做的就是前端开发+基建和项目管理,目前 (2024/12/31) 无实习经历,所有投递都是从官网投递,无内推。
简历大概投了大概一个月吧,从 2024 年 11 月底开始投,再到现在也就微信,字节和一家外企(RightCapital)给约面,之前看别的佬的面经说内推可以直接推到部门 ld 去,所以内推也算是一个优势之一,网申就经历了不少初筛挂,总之很难受就是了。
通过不同公司几场不同的面试是可以感受出每家公司风格都是不太一样的,字节给我感受最深的就是写题写题,除了搜索岗3面没有做题,其他都在做,而且都是 3 题起步。而微信的话感觉是不同部门风格也不太一样,之前有人说上来就是先做题,一个小时起步这样子,但是面微信游戏的时候没有这样做。而公众号&小程序一面的时候就是这样,当时给我整懵了,不过写题也有个有意思的点就是更多都是场景题,还是挺有意思的,尤其是 glob 库简单实现的时候,这个库我在 astro 源码就看到过,他被用来获取内容集合所有 markdown 文件。而 RightCaptical 的流程分的很清楚,第一次是基础考察,第二次则是问项目以及思考,第三次则是知识边界探究,体验还是很不错的。
现在再想想玩的还是挺大的:上来就面全中国最难的几家的岗位。但也确实没办法,因为其他公司应该是坑位都满了,要么初筛挂要么没有回复,如果抛开面评来说,我反而觉得每次面试都是一个很好的机会,原因如下: 我能有机会去跟企业中的神犇们去沟通和探讨我的想法,一个是,我能借这个机会去反思我项目可以提升的地方,项目 mvp,还有如何决策等问题;其次是我能借一些反问机会去了解不同业务承担的职责,去督促我思考在真实企业场景中更多需要考量的因素;最后,能聊技术和实验室经历真是太开心了(逃)
废话不多说,下面是正文:
wxg 游戏实习
这是作者本人第一次面试时的岗位,当时整个人很紧张,甚至提前一天进了会议上传简历,正式面试开始前20分钟就进了会议室,不过面试官也提前两分钟就加了进来
总共三面,都是视频面试。而对这一次面试的总结就是:需要巩固基础,需要主动抓住面试主导权,并以简练的话语展示这个项目可以深入细究的地方,去体现出自己思考的点,让面试官感受到自身对项目的认真态度
现在想想这几乎简直就是表现最差的一次,很多做不好的地方都是在事后才意识到,但毕竟是第一次面试,还有很多可以成长的空间,慢慢来吧。
一面
面试官人很好,整个面试过程中就像是聊天一样,全程演示项目,中间穿插了一点八股。
后续想想这也是一位很好的面试官,愿意一点点看我项目的细节,还有用的什么包,为什么选他,目的是什么,解决了什么问题,真的是一点点引导。反问聊部门业务的时候还很认真细心的介绍了部门的职责和业务,体验真的很不错。
- 蓝桥杯是什么
- 问简历上的项目是实验室还是个人项目 面试官说都会把比赛项目给放到前面,所以以为这也是实验室作品。然后我就拿了挑战杯写的前端页面简单说了一下
以下基本都是项目细节:
- Mod 开发组与你是什么关系(甲乙方?)
- 为什么分了开源核心 + 后台仓库(后台仓库代码不安全,需要审查)
- 编辑人员提交流程(后台编辑 + 管理员提交 -> gitee pr + 审查后合并 + webhook 触发 cicd 同步到 oss)
- Astro 是什么,SSG SSR 是什么(说了一下基于 vite 进行驱动与支持 ssg + ssr,然后说了一下 ssr 的动态拼接字符串;然后面试官说了什么 jeklly?)
- 选了他的原因是什么(博客落地实践过,知道一些底层原理,内容驱动生成网站,符合 wiki 定位要求)
- 框架可以插入 react 或者 vue 组件吗(可以,且可以一起使用)
- 有试过放在一起吗(没有,提了一下 vite 放在过一起导致开发声明报错,其次是两个应用相互独立,通过各自的 app 创建函数来渲染页面,只要他们副作用不会相互影响我觉得问题都不算大,不过现在看来感觉还得想一想 vue react 底层,他们的更新机制不一样,会不会一个框架的占用线程太久导致了另一个框架更新不及时)
- 编译器和 polyfill 的关系,知不知道每一个 es 版本的区别
- 整个项目内核升级是什么意思(说了用插件将所有的逻辑进行封装,最后进行复用,要求展示了一下除了简历还有哪个网站复用了)
- VSCode 插件展示一下,具体在 VSCode 做了什么,用途(mdx 转 ast 语法树,对节点进行分析,并读取工作目录下的资源进行查错;给一些编外的词条编辑人员使用)?
- 网页插件展示一下?(没实现,说了一下对每一个用户都要开一个专用检查进程的原因)
- 看一下你的分析器和 mdx 官方分析器的关系(完全独立,没来得及说存在的优化部分) 本来要进笔试了,然后说了一下 yjs 是核心之一
- 在线平台演示效果
- yjs 是什么(协同编辑中编辑冲突的一个库)
- 协同主要问题(说了并发冲突和 YATA 算法的作用,面试官似乎没做过这个领域)
笔试:
// 写一个类似迅雷的下载管理器,用户可以不停往里面push url,管理器需要保证同一时间最多只有3个请求在并发下载。
class Downloader {
urls = []
push(url) { }
}
// 每个url均需要被传入以下fakeAxiosWrapper函数。你可以把这个函数当做一个封装好的axios函数,作用是请求远程api,不要改动这个函数。
async function fakeAxiosWrapper(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`download ${url} done`)
resolve()
}, 3000);
})
}
// 验证代码
const downloader = new Downloader()
downloader.push(`url1`)
downloader.push(`url2`)
downloader.push(`url3`)
downloader.push(`url4`)
downloader.push(`url5`)
// 等待3s后,同时输出
// download url1 done
// download url2 done
// download url3 done
// 再等待3s后,同时输出
// download url4 done
// download url5 done
反问:
- 工作时间(上午十点到晚上八点半)
- 地点(深圳总部)
- 实习时长(越久越好)
- 技术栈(挺多跨端技术的,感觉进去又要开始上手新东西了)
- 有没有什么可以改进的地方
- 下一面几天后(最晚一周后)
总结:需要回去总结好项目重点,针对每个重点提炼一套要点内容,而不是想到什么说什么。其次要梳理清楚项目的一些实现。
说个趣事:我在这次面试后看了一下项目,发现自己亲手配了 babel 去实现一个低版本浏览器的提示代码转换。还有一些 polyfill,但是都由于太过久远而忘记了
不过项目本身很大型,因此记不住所有细节也是正常的。因此在二面前一天我疯狂地看我项目的各种细节,就是为了能好好的聊项目,不过二面的计算机基础拷打给我来了个措手不及
二面
-
老家是哪里的,还有住在哪,学校在哪
-
说一下数据结构栈和队列,他们的区别,栈在哪里有应用场景,队列,然后假如队列发生了插入,那么此时这个队列变成了什么,具体应用场景有什么
-
先说一下 localStorage 大小
-
然后引导到操作系统页置换算法,要求写一个按字节数大小计算的 LRU 缓存,问了一下时间复杂度,有没有什么可以优化的地方
-
计算机网络(七层模型,常用的四层),每一层帧封装的格式,知道的越多越好。到传输层后问了一下 udp 的校验和是怎么做的(忘了),应用层有哪些协议(http,ftp,就记得这两个)
-
说一下项目大概的情况
-
看一下你项目的架构图
-
你的项目最终为了解决什么问题,相比其他 wiki 第三方平台有哪些优势
-
看你 wiki 用 astro,性能是不是很好,跑个 lighthouse 看看(第一次不给力,才89,第二次才满分),那么就结果来说你能信任 lighthouse 吗,最好的收集用户数据手段是什么(埋点),埋点的话你会怎么解决(就目前个人能力可能会找 google analysis,现在想想应该回答一下如果能接受就找一些第三方埋点包,评估并进行引入)
-
反问
-
我需要改进的地方
-
这次实习是有考虑提供转正的吗
-
如何提升项目积极性(一个是正反馈,还有就是当你的代码面对千万级用户时你该怎么办)
-
聊了一下跟踪脚本,现场出一个场景题,假如要拦截该怎么办(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy)
-
看一下你的项目文档
-
以为这一面会继续拷打项目,为什么没有深入细节
-
平时怎么学前端的
-
一面是主管吗
-
有因为学历而考虑考研吗
总结:需要回去巩固基础知识,复习计算机基础,以及一些核心开发必须要知道的八股文
在面试前一晚我一直在实验室的小会议室复盘和总结我的项目,就是为了第二天能好好的一点点细讲,结果来了这样一出,属实是有点倒霉,不过还有一点就是信息差,就是微信可能更喜欢问一些计算机基础,可能大部分面试官也是写 C++ 出身的,这点也是在后续跟哥们聊天时才知道。
那天晚上面完后我一直在反思,我真的是热爱计算机吗?其实这个答案其实以及很明确了,我要是不喜欢我就不会坚持这么久,也不会因为说因为学历就想考研,而是努力提升自己的硬实力和能力,更不会说在上学期学操作系统时去看 mit 的实验课,并尝试自己去一点点去做完,还有这学期的编译原理也是。如果未来允许,我希望我能在 35 岁前用 rust / c 在 riscv 电路板上跟着课程实现一遍 xv6;其次是用 rust 实现 bellard 先生的 quickjs js runtime core。
不会东西不可怕,可怕的是不会还不想着去弥补和保持上进心
按字节计算的 LRU
自己写了一份,简单测了一下,似乎没问题:
可以继续优化吗?也许,比如搞一颗搜索树,用来快速查找哪个节点之前所有的节点移除后能够满足空间要求
class ListNode {
constructor(key, value, left = null, right = null) {
this.key = key
this.value = value
this.left = left
this.right = right
}
}
class LRUCache {
constructor(maxBytes = 5) {
this.maxBytes = maxBytes
this.currentUsed = 0
this.dummy = new ListNode(null)
this.dummy.left = this.dummy
this.dummy.right = this.dummy
this.nodeMap = new Map()
}
#getNode(key) {
const node = this.nodeMap.get(key)
if (!node) return
this.#removeNode(node)
this.#putToHead(node)
return node
}
// 最坏情况需要遍历所有节点
#cleanSpace(expect) {
let newSize = this.currentUsed + expect
while (newSize > this.maxBytes) {
const { key, value } = this.#removeTail()
newSize -= value.length
this.currentUsed -= value.length
this.nodeMap.delete(key)
}
}
// O1
get(key) {
return this.#getNode(key)?.value ?? -1
}
// On, 遍历已有节点删除
put(key, val) {
if (val.length > this.maxBytes) throw new Error()
// 更新时移动到顶部
let node = this.#getNode(key)
if (node) {
const expect = val.length - node.value.length
this.#cleanSpace(expect)
this.currentUsed += expect
node.value = val
return
}
this.#cleanSpace(val.length)
node = new ListNode(key, val)
this.#putToHead(node)
this.nodeMap.set(key, node)
}
#removeNode(node) {
node.left.right = node.right
node.right.left = node.left
this.currentUsed -= node.value.length
}
#removeTail() {
const tail = this.dummy.left
this.#removeNode(tail)
return tail
}
#putToHead(node) {
this.currentUsed += node.value.length
node.left = this.dummy
node.right = this.dummy.right
node.right.left = node
node.left.right = node
}
}
三面
- 自我介绍
- 说一下项目
- 问到静态网站的时候拷打了一下 CDN 是什么
- 网站访问量高吗,有多少人在用?
- Astro 框架是你自研的还是第三方的
- 八股:
- http 每个版本的区别(只说了 2.0,本来想讲 1.0 的一些 chunked 机制,但发现自己记不清那个头是啥,索性就不讲了,3.0 知道是 udp 和 google 研发)
- 缓存(结合项目的 html etag 协商 + vite 打包 8 位 hash 说了一下,但是面试官不是很满意)
- 反问
- 需要改进的地方?(反问了你从这个项目学到了什么)
- 阅读了部分 Astro 源码(content collection 与 vite 结合的底层实现,知道了可扩展性和局限性,翻阅了 RFC 文档,知道了其开发目的解决的痛点,最后评价是又好又坏,好在对 mdx 的处理工作是在编译器完成,在运行时无过大开销,缺点也是 mdx 在编译期间处理完成,没法应对更灵活的需求;其次讲到了 Astro 上周第 50 个 RFC 文档,github 可查 content layer api,也是不把运行时编译列在目标内;所以评价是又好又坏)
- 深入研究了 CRTD 思想及其背后的 yjs 生态库(从小团队开发比重权衡选择了 yjs,生态丰富,且配备 demo,体验很不错,尤其是周边库,源码内容简单,要针对做定制开发的成本也比较低)
- 面试官主动问了一下有没有了解 OT (对比了一下 OT 与 CRTD 的区别;他与 CRTD 解决的目标相同,不过思想核心不一样,OT 是保证过程顺序一致,CRTD 保证数据一致性,颇有分布式思想的感觉;OT 在生态上较为薄弱,调研了 ShareDB 实现,发现后端代码过于复杂,对于小团队开发可能时间并不充足;我的中心服务器性能不够的话可能导致体验下降;针对不同数据模型要实现不同接口,开发成本增加)
- 了解了一些 vite 的短板(生产环境与开发不一致,不合理分包导致模块循环引用(上周优化时发生的),首页白屏的问题(vite 仅仅经过最简单的转义便直接把模块发送给首页,没有像 rspack 一样做一个合并优化,导致项目变大时首屏发出大量的模块请求,且 vite 开发服务器 http 协议似乎是 1.1,只允许 6 个 tcp 请求,其他的会被阻塞,进而导致长时间白屏))
- 实践了一些设计模式(模板模式,策略模式)
- 站在了开源包使用者的角度去看待一些内容(包下的语法分析核心分了两层设计,用户可以选择最简单的 plugin 模式去定制规则,也可以自己创建 core 实例去完整覆盖 mdx 的检查行为)
- 总之做这个项目就是很开心,学到了很多也收获了很多
- 您是 GM 吗(不是)
- 平时玩什么游戏,但是当时脑子有点短路答不上来,就说最近玩的比较少,会练一下吉他
- 需要改进的地方?(反问了你从这个项目学到了什么)
虽然最后隔了几天收到了流程结束的信息,但也是从这一次面试后,我就意识到了必须要主动争取面试主动权,面试官给出机会时一定要有意识,抓住项目核心讲,并引导到自己熟悉的领域,因此后续继续优化总结,把项目最重要的几个核心抓了出来,并进行了提炼,因此一天后的字节二面我收获了一个非常好的体验
字节跳动前端搜索方向
这是作者第二次面面的公司,一面就在 wxg 游戏部门隔了一天后。总体感觉这个部门方向挺综合的,感觉是业务和基建都有点?问问题的风格也和后续面的商业化部门不太一样,不过可能因为面评或者侧重点的不同,导致两个部门面试的风格不太一样,不过基础拷打还是差不多的
不太理解就是最后审批挂了,很奇怪,当时收到这个消息冷汗冒了一身,因为当时还在招聘网认识了一个同部门的后端哥们,都加了微信了,还聊的很开心,很憧憬实习后的合作。二面面试官也加了我,想跟我继续聊聊探探底,结果来了这样一出,真的是来了个措手不及。
当时甚至很长一段时间都对自己的实力产生了一些怀疑,甚至开始从头复盘,到底是哪里不对。最后看下来觉得就是一些项目表述可能太过于啰嗦和浪费时间;其次是可能跟部门业务 baseline 有一些冲突;最后可能就是这三面都没有完全确定我是否符合他们的标准,当然这个可以通过加面解决,就是时间成本还是有的。
不过也没办法,明天和意外往往都是意外先到来,所以当时沉默了一会后马上开始继续往各个网站投简历,如果不行动起来去改变一些什么那就只能挨打了。
吐槽一点:大部分面试官都是只知道 acm 的,蓝桥杯没啥用,所以以后自我介绍我绝对不会主动说了,除非面试官主动问
一面
自我介绍
- 蓝桥杯是什么
- 问两个开源项目:
- Threejs 那个怎么说(2年前的项目了,根本不记得多少,扯了一下新版实现,模型优化,看了一下源码解决bug)
- 某音乐网站嵌入 tauri 二次开发(扯了一下写的 vite 插件,实现了把外部网站嵌入到脚手架内实现的直接开发,还有重写部分热重载代码,以及代理后端,实现内容覆盖与整个网站的控制权,以及扯了一下这种跨平台开发要注意的是什么,然后就扯了一下ipc通信与序列化的性能)
- 做了这些插件最终的意义?(提升开发体验与效率)
- 这些是自己做的还是实验室做的(第一个跟隔壁实验室哥们一起做的,第二个是自己做的,2023年7月 -> 2024年8月,有GitHub提交可查)
- 说一下你对前端工程化的理解(尽可能地实现非业务部分过程自动化,使得开发者可以专注开发)
- 用过webpack吗,没有,直接 vite 上手
- 说一下你对 vite 的认知,越多越好,尽可能地说(esbuild 开发环境,rollup 生产环境,vite 在加速方面做了哪些努力(esbuild 构建开发环境js,预构建依赖,对源码更新采用链失活处理(仅概念)))
- esm cjs(同步与异步导入,import 静态分析)
- url 到页面呈现(合法判断,cache,dns,tcp,dom树,cssom,js 阻塞,render tree,绘制,部分 css 送入 gpu 处理)
- 说一下用 Astro 的原因(vite 作为底层驱动支持,内容驱动静态网站生成,支持SSG,SSR)
- 除了 SSG,SSR 还有什么渲染,区别是什么(ISR,CSR,增量静态生成)
- Astro SSR 还有哪些应用场景(扯了一下官网文档的电商平台,用户可以先看到页面商品内容,具有交互性质的按钮可以在后续注水激活)
- 说一下 yjs 是干什么的(以CRTD为核心思想的并发冲突解决库)
- 在线演示平台,平台有多少人在用(不多,给内部人员编辑使用)
- 做这个遇到最难的地方是什么(服务端崩溃上下文丢失后内容恢复,说了目前的实现与未来最好实现)
- VSCode 插件看一下效果(演示了一下并说了转 ast 做处理的简单流程)
笔试第一题:
对url中的query参数中将title提取出来:https://aaaaa/?aaa=bbbb&title=dddd
创建一个 box,长 100px 宽 50px,插入到整个页面中,要求水平垂直居中
针对 box 写一个动画:
500ms 后长宽变成 100px
700ms 后移动到右上角
笔试第二题:
function get() {}
const obj = {
layer1: {
layer2: {
val: 1
}
},
target: [1,2,{ok:1}]
}
get(obj, 'layer1.layer2.val', 'target[0]', 'target[2].ok')
笔试第三题
有一个树:
1
| \
2 3
| \
4 5
现请你遍历该树,并在到达叶子节点时将其前方所有的值拼接为数字,对于本树就是: 124 + 125 + 13 = 262
本来要反问了,感觉节奏不对,继续跟面试官扯完了简历上的后两点:
-
页面预览实现? 成本有点高,目前思路是转发脚手架页面
曾经做过的努力:
- 用 astro 的编译器看看能不能 build 一些组件并拼接完整页面(不能,必须依赖 node 环境或在浏览器实现需要的 api)
- 用 SSR (审查了 astro 部分源码发现对于 markdown 编译逻辑都是写在 vite 插件内,打包时是直接把 markdown 编译成 js,SSR执行时直接静态出字符串,没有运行时编译过程)
- 11月14号新出的 content layer api,去官方文档看了里程碑,不把运行时编译 markdown 放在目标内,与 astro 的 baseline 与解决问题场景不一致
-
jsx 编写通用组件? 曾经做过的努力:
- 调研 tinyMVC,在示例仓库里发现他针对各个框架都写了一套 renderless 逻辑,还为此写了一个专门抹平框架差异的函数
- taro,基于编译器实现,背后有编译团队,运行时团队,小程序团队和跨平台团队支持,对于小团队开发成本太高了
反问:
- base 北京上海
- 二面什么时候
- 主要业务?负责抖音头条等搜索处理
- 需要改进的地方?
总结:需要增强自己的自信心,项目都是自己做的,没必要慌。面对需求时保持冷静,去一点点拆分问题,并解决它
其实有时候也能理解为什么有些同学会请人进行模拟面试,有过模拟面试的话多少都能锻炼一下口才,也不会说更紧张,而是能做到从容应对
二面
省流:无八股,四十分钟项目输出,二十分钟笔试题 + 反问
面试体验最满意的一次,虽然开头细细的讲项目细节导致节奏有点慢了,只讲出了两个核心,还有两个核心没讲,但面试官很耐心的听完并跟我确认上下文细节,下次继续优化
- 自我介绍
- 挑一个简历上最值得讲的项目开始表演
- 背景介绍(某游戏 mod 开发组前端成员,主要负责一些页面制作宣传的需求,后期组内其他成员提出 wiki 制作需求,开始了调研之旅)
- 主流 wiki 框架(语法晦涩难懂,开发者需要时间去学习成本;使用 mdx 可以无压力上手 + 需求/问题快速沟通解决;Astro 我有实践经验,阅读过核心 api 源码,知道底层实现与扩展/局限性)
- 反问了一下这个项目什么时候开始做的:第一版落地时间周期(去年5月调研,7月开始第一版开发,9月落地,到12月前长期维护 + 新功能上线)
- 第一版落地后遇到的问题(项目结构混乱,非业务核心代码与核心混在一起,网站无法进行复用)
- 解决方案(采用 monorepo,重新梳理整个项目业务核心逻辑与周边生态逻辑,进行归类划分并确定职责和要暴露的接口)
- 成果(项目职责分离(解包,语法检查,wiki 核心,组件库,针对不同 ide 的检查适配器)对整个项目有了个更好的认知,知道整个项目的进展和状态)
- 带来的新问题(此时已经半小时了,面试官让我挑2点最大的问题(不同包之间没有权限区分;一些历史遗留插件没法及时迁移,付出了一定开发成本)其实这里可以讲一下代码复用,参考了 Astro Starlight 项目落地后发现全局 Astro 特性被局限至仅 集成暴露 api;部分 api 使用后效果不一样(Astro 官方给出了解决该问题的实验性特性))
- 网站访问量多少(不多,算是技术能力锻炼产品和圈子内的服务用产品)
- 是不是 minecraft 的发烧友(还真是,高中就喜欢玩珍珠炮,并且从里面开始接触到编码解码概念和一些二进制理论)
- 笔试
- 版本号排序(后续讨论了一下健壮性和 plus)
- Promise.all 实现
- 写一个后台管理系统的侧边栏组件,伪代码即可(顺便聊了一下 vue compiler 的 props 宏展开)
- 本来还有第四题,面试官说不用了,直接开聊(以为会问 Promise 顺序,他说他不喜欢考这些,然后聊了一下 Promise 内返回 Promise 的问题,涉及到 v8 以及 ecma resolveThenableJob 规范,不过面试官似乎不是很了解这里)
- 反问
- 我需要提升的地方(计算机四大件别丢了,讲的很认真)
- 部门主要技术栈(react,然后就是要了解一点 node,不用做开发,nginx了解即可,吧啦吧啦的,后续忘了)
- 新技术会用吗(会做研讨会和研究,不过更多是基建部门负责,他们会看手册学习并尝试在小项目落地)
- 主要业务(搜索中台,技术 + 业务结合部门?面试官好像一时也没法彻底讲清楚)
- 部门压力大吗(不算大(真的吗))
- 入职要注意的事情(需要两个月进行磨合,因为有些事情可能没有给到完整上下文就让你做,需要自己翻手册或找 mentor 问,流程清楚后就轻松了,后面一堆不记得了)
- 转正?(会给,但是看分到的名额,说25届留了两个实习生,刚好两个名额就全给他们了,然后细细的讲了一下转正前会给你的各种通知和要做的事情)
- 就面试来说有啥需要改进的地方(笔试侧边栏组件你可以做的更好点,抽象级别可以更高点,加强一下基础框架学习使用)
体验最好的一次,唯一的遗憾就是讲细节太多了,还有一些核心没讲出来。其他我都很满意,1 小时后收到了三面时间选择通知
许愿三面能遇到像这样体验这么好的面试官
三面
- 自我介绍
- 为什么学前端
- 什么时候开始学的
- 看你项目还挺多,挺多方面都有涉及的,node 学的怎么样(仅基础,rust 写的那部分后端可能还多点)
- 平时怎么学(从实验室给的路线发展到自己看文档查资料,会主动关注新 api)
- 关注新 api?举个例子(用我博客的 content collection api 举例子,翻了 rfc 文档,对着英文生肉硬啃)
- 最近科技周报看了啥,举个例子(rspack,阮一峰谈发展 ai 的公司,还有自己想在项目落地实践 ai)
- 为什么想要实践ai,你是想在自己项目的哪里实践?(原来的开发者想更专注于核心开发;词条内容编写,让 ai 写雏形,自动生成框架,我们按需补充(其实有个点没谈到,就是有些内容需要编写者阅读过源码才知道机制,ai 写可以节省一部分时间;其次是语义检查,看看是否符合人类阅读习惯))
- 看一眼你的后台(演示了一下基本内容,是 monaco 做的)
- 讲一下选 Astro 的原因(调研现有 wiki 框架发现不适合,学习成本高;横向对比 VitePress VuePress,局限使用于 vue,扩展性开发难度较高;从 Vite 或者 Nextjs 开始写的话基建要做很多东西,一时看不见效果;页面样式自定义要求程度非常高,css 几乎都是手写;Astro 基于 vite 封装,帮我们做好了很多事,且具备 vite 大部分能力;阅读过内容集合 api 源码,知道扩展性和局限性(其实还有很多可以说,不过脑子一热忘了))
- 有试过什么优化手段吗(开始拷打)
- CSS 规范,强制要求所有元素尽可能有个固定宽高,避免 CLS
- 某些显隐采用 visibility + pointer-events 处理,避免重排
- 后台部分使用
manualChunk
分包(面试官让我打开项目看看分包结果,然后就对着页面的请求在那里讲自己的分包思路)
- 接下来从开发过程,打包编译,网络传输,首屏展示四个方面聊聊你知道的优化,越多越好
- 开发过程扯了一下 vite 全局定义
__DEV__
变量,然后把仅开发逻辑放在这里头,编译过程会移除(其实可以再讲讲引入路径规划,做一个强隔离,项目后台就是对每个页面进行强隔离,保证逻辑无关联,这样分包函数可以针对每个页面打包成一个 css + js,避免过多网络请求),还有 await import 作为分包点 - 打包编译讲了 terser 的上下文分析,分析 dead code 的存在和不必要的逻辑进行移除;其次是避免桶文件 + rollup 静默打包(桶文件在项目中真实出现过,打包整个 mui icon 导致打包时间 + 2min,面试官当场提问最终这些会被打入包内吗(不会,会做 tree shaking);静默输出则是因为 mui 组件都写了 ‘use client’ 导致 rollup 警告大量占用控制台输出间接导致打包时间下降,面试官继续提问如果我不让你用静默怎么办,见我不知道就说了可以写插件去直接替换底层方法,不过感觉不算太严谨(逃));聊了一下通过插件移除指定注释下的代码(类似 rust 注解)(其实可以再讲讲语法转换,即向低版本的 js 代码进行兼容处理,即 tsconfig 的 target 选择)
- 网络传输用了项目从 http1.1 升级到 2.0 避免一个队头阻塞的问题(顺便牵扯到 tcp 阻塞,讲了一下前面的包没到后面的都得等),还有 3.0(其实可以扯 2.0 请求无序 + 服务端主动推送和资源优先级控制,还有 CDN 等,但当时脑子笨想不到)
- 首屏的话则是聊了一下 script 标签的 async defer 去避免 dom 解析阻塞,还有内联资源,扯了一下 tcp 拥塞控制的一个算法算出来首屏 css 控制在 14.6 kb 内,不过没讲出原理;顺便聊了一下我的博客,他的夜间模式 js 是放在 async 内执行的,面试官马上知道了会有闪烁问题,然后我就说在 html 前面写了一个阻塞 script 去修改 cssom 树,避免了闪烁
- 开发过程扯了一下 vite 全局定义
- 场景题,现场设计一个 PC 登录扫码功能,PC 要有消息同步功能(1. PC 向服务器请求登录 token 并展示到二维码内,随后使用轮询或者 ws 等待状态 2. 手机扫码,获取 token 后发送到服务端,服务端改变状态 3. 通知 PC 可以登录了,由 PC 主动去请求个人信息)(中间扯了中间人攻击,包阻断,重放攻击;根据操作系统生成唯一标识符,mac 地址等)(感觉最核心的还是各种安全细节和登录成功后的消息同步功能,如何保证数据一致性)
- 最后十分钟学习 IntersectionObserver,现场投屏写一个应用(前面聊了一下图片懒加载跟面试官说使用原生 loading lazy 和缺陷,面试官就反问有没有用过 IntersectionObserver(没有);最后没写完,但是面试官看完思路说大致没错,改改细节就可以了)
- 反问
- 是日常实习吗(是)
- 您负责的内容(leader,项目负责人)
- 部门主要业务(搜索中台 + 大模型,顺便提醒我可以去学习一下看看真实项目怎么落地的
- 就个人来说要怎么继续提升自己(去一下更大的平台,学习一下企业是怎么管理的,以及整个 workflow 的实现;就我的项目举了一些例子,我自己一些自研的地方其实有插件去帮助实现)
- 压力算大吗
- 实习时长
- 面试有什么需要改进的地方(还可以,主要是有自己的特色)
1 小时后 hr 约明天面,应该没问题了吧?
总结:
体验下来还是很不错的,唯一遗憾的是总是忘记还有更多内容可以讲和远程协同讲不出来(怎么每次都是这样啊(恼))
(我的项目还是太大了(雾),仍然有很多东西可以继续细分,网络优化我自己亲手配置了 gzip 优化,而且还对他设想过一些未来(低于多少 kb 后就不压缩,直接传输,考虑这点是因为小内容可能冗余数据比较少,压缩后的压缩率并不高,且在运行时客户端也要解压缩,会有一定的消耗,但是具体消耗还是要靠用户侧数据收集以及benchmark去确定))
后续假如 oc 了我会把项目总结文档开源给大家学习,毕竟可能到后面面试就基本都问实习了,这个项目就面试来说可能发挥不了那么大的作用,但是他在我心中依然是最好的项目之一,因为他沉淀了我一年半这么久的思考,不能就因为面试结束而结束使命
后续
挂了,hr 说不方便透露原因,运气有点差
字节跳动 - 商业化
这里是字节在牛客捞的简历,这里能很明显感觉到风格不太一样,全程逮着问基础,项目就是几句话带过。应该是面试官看了面评吧,知道项目应该是够了,所以想看看各方面基础怎么样。
这些对于经常做业务的同学应该是很容易上手的,但对于我来说可能就有点吃力,在过去的3个月我几乎全身心投入到远程协同的研究和开发落地中,因此在这方面就稍显的有些劣势,但好在面试官问的这些我基本都能答出个七七八八,对于一些底层部分也有自己的见解和认知
一面
- 自我介绍
- 项目背景
- react 事件处理机制(16,17的不同以及为什么这么做)
- http 缓存,以及应用场景
- react,看组件说输出顺序(元素本身挂载和 react 事件挂载,事件触发后输出顺序)
- this 指向(几乎所有情况)
- 事件循环模型
- 宏任务微任务有哪些
- Promise 输出(比较简单)
- 并发数量控制
- 全排列
- 反问
二面
隔了一天就马上约了,不过当时我要回家,就约在了回家后第一天,也算是第一次在家里面试
- 自我介绍
- 怎么学习前端的
- 更倾向于基建还是业务部门
- 最近学了哪些新知识
- vite 与 webpack 的区别,优缺点
- esm cjs
- 为什么项目升级成 monorepo + pnpm
- monorepo pnpm 优势
- git merge git rebase
- 设计模式
- 观察者和发布订阅的区别
- 对 fiber 的理解
- react hooks 解决的问题
- useEffect useLayoutEffect
- 看一下封装的 hooks
- 你作为实验室负责人,怎么做技术选型的,策略是什么
- 成员积极性不高,或者能力不足该怎么办
- 手撕:给数字增加分隔符(1234567 -> 1,234,567),合并两个有序链表
- 反问
- 部门具体业务(CRM)
- 期望入职时间
- 还有几轮面试
- 改进的地方
整体聊的还是特别开心的,尤其是讲到最近看的科技周报与一些开源事件(rspack投毒)时聊了很多想法和看法,还有实验室经历和我做的一些决策,以及带来的效果
不过可能是因为业务不匹配的问题,两天后收到了感谢信,跟哥们复盘的时候觉得可能是话术不对
总结:可能在话术上需要有一定的谨慎思考,如果下定决心想做基建的话那就直接去投基建岗。面试中我也可以有意识的问问,这样我能确定这个部门主要做的是什么,后续有这样说选方向的问题我就可以根据一个之前获得的上下文来确定面试官想要听到的答案
RightCapital
当时是微信游戏挂了两三天后约面的,有意思的一点是 hr 多多少少也知道前端的一些东西,硬控我 20 分钟,甚至聊了点 react vue 框架,我怀疑 hr 之前就是做前端,想逗逗小孩子罢了(逃)
面试给我的体验还是很不错的,没有做题,没有手撕,更多是看你对技术与项目的思考,是否有自己的独立想法,还有探测知识边界,虽说就深度来说肯定是没有大厂那样厉害,但就一些基础知识也能聊不少东西
不过唯一的遗憾就是工作地点在北京,其次是进去后可能要先做一些测试工作,而且同期还有 wxg 开放平台在等开奖,虽然作为人生中第一个 oc 还是挺开心的,但是由于工作地点的问题。所以到最后还是忍痛拒了这份 oc
一面(45min)
隔了几天才想起了博客没有补充,记得不是很清楚了,将就写写
- 业务介绍,入职时间
- 什么时候开始知道和学前端的
- Astro 框架简单介绍一下
- 用 pnpm?说说项目分包的好处
- 讲一下 git rebase,平时怎么解决 conflict 的
- 用 React 还是 Vue 多
- 用 vite 还是 webpack 多
- 他们的区别以及优势和缺点
- ts 学的怎么样,讲一下几个常用的工具类型
- 如何在类型体操内实现 if 和 for 循环
- React 新特性了解的怎么样
- React 新 hooks 实践过吗
- jsx 编译后的产物是什么
- 讲一下代数效应
- 看一下你项目封装的 hook
- AbortController 以及调用时机(考察副作用清理)
- 知道有哪些设计模式
- 对测试了解的怎么样,编写测试时要注意的点(e2e, vitest)
- 英语水平,给一个文档能看懂多少
- 反问
- 除了 react ts 还有什么技术栈
- 本次面试出结果的时间
- 主要工作
- 需要改进的点
二面 (40min)
面试的是部门 ld,一位很稳重的大哥,能感受到颇有强者的气场,这次就项目提问了不少内容,很多开放性的问题可以探讨
- 自我介绍
- 说一下项目里最难的点
- 为什么升级成 monorepo 和 pnpm
- monorepo 适合的场景
- 实践 monorepo 的时候有没有遇到一些什么问题
- 项目的架构,怎么分包的
- 项目的发展过程
- 团队有几个人,都是自己写的吗
- 项目背景
- astro 框架是什么
- 相比其他框架,astro 卖点在哪
- 用过 nextjs 吗
- 你喜欢 astro 框架吗,说说优劣
- react 平时自己开发的时候有哪些规范和注意点
- 你觉得 ts 的优点是什么
- 有些工作是 ts 推导类型的修复,能接受吗
- 没有实习经历吗
- 英文文档读过吗
- 了解公司实习生职责吗
- 从哪里找到招聘信息的
- 需求有 ddl,能接受吗
- 简单说一下 tauri 项目的难点
- rust 是怎么学的
- rust 与 ts 的过程宏结合是什么
- 为什么想学 rust,你喜欢这门语言吗
- vscode 插件是啥,作用?
- 反问
- 职责(ld)
- 业务|基建?(业务)
- 需要改进的地方
- 还有几轮面试
总结:有些复杂场景还是没有接触到,比如 monorepo 的优劣,但是 monorepo 给我的感受就像是一个工具,我知道项目未来会怎么发展,需要一个模式去改善发展了。我个人觉得 monorepo 主要还是为了逻辑分离,提升模块化程度,缺点就是依赖管理复杂,且没有代码修改权限区分。网上的答案也比较类似,比我想的多的就是测试和重构方便 / 构建部署耗时增加。不过针对后者有类似 turbo 这种工具去进行加速
三面(1h)
最友好的一集,面试官把我几个仓库的结构都看了一下。这一次面就是综合知识 + 业务能力 + 认知边界探究了。不过感觉面我的老哥可能面试人的经验不是很多,感觉比我还紧张(无端),自我介绍还是我主动提出的
- 自我介绍
- 为什么说想做基建
- 有给一些大型项目提过 issue 和 pr 吗,出发点是什么
- 假如现在有一个日历公用组件要进行开发,你该如何完成他
- 假如这个组件需要定制很多地方,你该从哪几个角度去考量
- 假如有一个组件,网络上一点资源都没有,需要你从头定制,你的出发点是什么,该怎么做一个迭代
- 现在有一个功能,针对他有一批库可以选,该从哪几个角度去考量选什么库
- 看你仓库里面有用 js 去写一些 script 运行脚本,他可以用 ts 替代吗,有什么方案,最新的方案是什么,他们之间的优缺点
- 刚刚你说到 bun,那么用这个工具的时候遇到过什么问题吗
- v8 爆内存的可能原因是什么,有什么工具或者方法去定位(从项目实践优化再到快照拍摄,还有开发上用一些 Weak 对象处理)
- 有时候遇到页面卡顿,你的定位思路是什么,解决方案是什么
- 看你开源经历里桌面播放器项目那个似乎是 monorepo 又似乎不是,当时改成 monorepo 的想法是什么
- 你简历的项目也是用 monorepo,出发点是什么,解决了什么痛点,有什么新问题
- webhook 听说过吗,cicd 环境中要注意的是什么,如何从安全上去考量 webhook 的使用
- 最近学的一些新东西是什么,了解了哪些好玩的东西
- 反问
- 团队规模
- 团队项目迭代更新方式
- 您的职责
- kpi or okr
- 会因为 ddl 加班吗
- 团队会关注新技术吗
- 如何针对一个项目提炼一些可复用的方法论
整个面试下来耗时最多的就是组件开发考量 + 知识边界探测了,一开始面试节奏也不算好,双方就沟通上还是有点小问题,不过后续节奏好了后就很愉快,整场面试就像是聊天一样互相分享看法和注意点,整个过程聊下来感觉是很舒服的。
面完后 hr 马上打电话沟通说这边没啥问题,可以发 offer,就看什么时候方便过来。作为人生中第一个 oc 还是挺开心的,不过当时正好 wxg 在等开奖,而且技术面都过了,所以后续还是忍痛把 oc 拒了。舍得舍得,有舍才有得。
复用方法论是今年暑假提出的一个研究课题,起源于之前看别人做 react 最佳实践时总结的一个项目规划管理模式,我自己在我的项目中用 vue 的方式实现了一遍,体验还是不错的,比如页面逻辑强隔离,页面内部 store 管理,专有组件与 hooks,缺点就是可能要编写的代码内容变多了,其次是对于某个被依赖多次的模块需要做好健壮性和完整性考量
但是就我自己的项目说很难提出一套全局可复用方法论,更多是特定场景下的复用实践,这点在我这个项目还是有一些感触的
wxg 小程序 & 公众号基建
最汗流浃背的一集,当时刚好是在游戏部门挂了后几天微信打电话过来问愿不愿意面试,我说上次不是挂了吗,双方就都很尴尬的笑了一下,最后说回去思考一天再确定要不要面。当时学期也快结束了,跟几个哥们聊了一下这件事,就觉得可能是 kpi。还好当时鼓足了勇气,想着就算是 kpi 也要尽力去学到东西和表达想法。
事实证明确实不是 kpi 面,而且拷打的非常恐怖,一面面试官说看了面评知道项目很大很复杂,于是就狠狠的考察了项目的广度,以及临场反应速度。二面则是结合计算机基础深究了项目的细节,现在回想起来我都不知道我是怎么顶住面试官的拷问的。三面则是最轻松但也是最需要口才的一集,就像是在给上司讲述自己的产品,讲自己的思考以及是否存在能效提升一样
视频面两面都没有开摄像头,就最后 hr 面开了一下。
最后实习 oc 也选了他,首先是因为没几个能选的,同期的就另一个外企发了offer,地点在北京,往返比较麻烦。主要是技术栈为 js 和 rust,还是基建岗,感觉还是比较符合胃口的。
我对这次面试最大的总结就是:计算机的基础思想很重要,许多地方都可以用上他。理解思想,并把它融入到自身作为一个工具使用。就好比我前文提到的 monorepo 和 react hooks 一样,我感觉就像是把他融入到自身,他是一个工具,理解他在什么时候该发挥什么样的作用
其次还是基础,一面结束后复盘了一下八股,答得真的是稀烂,寒假还是要恶狠狠的弥补啊。
一面(2h 30min)
上来先四道英文题目手撕(1小时 + 20 分钟思路拷打):
- async pub sub
- 依赖解析
- 爬楼梯
- glob 库实现
八股:
- 事件循环
- 异步任务的作用
- setTimeout 浏览器底层实现
- JS 内存管理(v8 回收,但是讲的不是很清楚
- 引用计数
- weakMap 以及为什么不能遍历,以及只能用引用数据类型做 key
- 对 ts 泛型的理解
- rust 用过什么异步框架(tokio)
- rust 内存管理(drop trait,作用域,无GC)
- css 媒体查询
- git merge 行为(只知道合并成一个提交,面试官说还有一些其他行为,后续看了一下是 fast forward / 无冲突 merge / 有冲突 merge)
- 约定式提交以及如何做约束(命令行应用与 git hooks 正则匹配)
- https 中间人攻击
- https 链接上请求内放密码
- https 的数据是安全的吗(只想到密钥泄露)
- 快排时间复杂度,为什么最坏是 On2
- 对一块内存上的数组尾插 / 头插元素的时间复杂度
讲项目(40min+)
- 立项,重构,后台实现,远程协同
- CRDT 思想
- 脏路径处理
- 并发冲突
- 简单说说 YATA 数学证明?(包不懂的)
- 断网后怎么办,或者说有个客户端延迟很高(插入永远有一个唯一位置,应对比较轻松)
- 服务是中心化还是去中心化
- 一个人删除了一行文字,另一个人在这行文字添加内容,结果是什么(根据 YATA 算法第一层比较,客户端小的操作优先)
- 简单对比 OT
- 项目背景
- 简单介绍 Astro 框架
- 项目设计(做成 npm 包,并作为 astro 插件使用)
- 项目技术栈对比,自研的原因
- 第一次升级后的成果与遇到的问题(框架问题,GitHub issue 讨论,细节挺多的)
- 语法分析器的设计(core 层 和 plugin 层)
- 如何进行语法检查的(ast 语法树遍历分析)
- LSP 服务器设计与消息优化(VSCode LSP 使用 pipeline 或 websocket,如果要优化可以通过自研协议分主动推送和监听广播行为)
- 前后端结构(前端,后端,脚手架后端)
- 项目发布过程
- mdx 中用户如何使用自定义组件
- mdx 可以回退 md 吗(没有研究,后续看了一下,mdx 是作为一个 astro 插件使用,回退的话可能需要对内容进行过滤处理(表达式,用户组件,script 标签过滤))
- markdown 过滤
- astro 编译 mdx 底层实现(讲了用到的插件,但是还可以继续讲讲 vite 怎么去 resolve module 的,和源码中经过了几次编译后才输出结果)
- 如果有用户恶意输入,你是怎么处理的(pr check)
- 如果用户太多你管不过来怎么办(插件过滤 script,工作流中使用 bot 自动检查)
- mdx 注入组件的白名单
- mdx 可以渲染 react,那可以渲染 vue 吗(可以,配置插件即可)
- 如果要在一个 react 组件里面使用 vue,我该做什么
- app.mount 发生了什么(没说全,讲了一下对比和 mount 和 patch,其实就相当于把 vue 渲染讲一遍)
- 如果我想在 react 组件内用 vue,vue 组件内继续套 react,我该怎么办(编译器做一个类似 rust 的宏展开自动注入 render code)
- 还有可以扯的吗(astro wasm 组件编译,content layer api,SSR 编译 mdx 可以实现运行时无编译开销;选择 jsx 作为通用组件的原因)
- 反问
- 技术栈(js ts rust c++)
- 业务还是基建(基建)
- 期望实习时长
- 大概还有几轮(一般三轮)
- 关于微信游戏二面面评(每个面试官都有自己的看法)
- 需要改进的地方
当时开始做题的时候我还没有意识到事情的严重性,还跟群友聊了一下说怎么一上来就做题,随后一顿拷打让我知道自己是多渺小了。
八股复盘的时候感觉自己就是个超级大笨蛋,说不定面试官都躲在屏幕后面笑,说这小孩子想象力还挺丰富的
面完这两个半小时人都虚脱了,在会议室里面跟群友汇报完后缓了好久才走出会议室,刚好实验室外面刚刚结束24届大一同学面试。后端的一哥们说想转前端了,于是就把前端在场的同学一起叫了过来,聊了一下他们的学习进度,并针对他们现场确定了一下学习路线,最需要关注的内容和接下来该做的事情以及未来要如何发展,全部聊完后也都晚上 11:10 了,于是听着私宅特有的歌冲回了宿舍。
实验室真的跟家一样,我可以说实验室和简历的项目几乎就是我大学的全部了,没有这两样我也走不到今天这一步
二面(1h)
最有压力的一集,有两位面试官,一位问一位听。一开始还好,都是从浅层知识开始问起,后续就开始深入拷打,一直拷打到不会为止,太可怕了。
其次是计算机基础,还得是科班同学,当时从编译原理一路回溯到计算机组成原理,最后感觉还是操作系统最重要,当时做 mit cow 实验理解了一下其思想,没想到现在回过头来在面试用上了,这个寒假一定要好好看看操作系统和数据结构以及一些基础。
感觉入手比较简单的还是计算机网络,毕竟可能更多时间都会花在 rfc 文档的阅读和对传输的理解和作用以及优缺点
其次是远程协同这个课题能拷打的地方真的很多,我虽然认真想了,但想的还是不够,还可以变得更好,只能说慢慢来吧
我曾经也憧憬过在开源圈内总结一套比较稳固的远程协同实现,包括服务器崩溃,服务中断等,这些都留给未来的自己吧
- 简单自我介绍
- 什么时候开始学前端
- 前端工程化,以及各种其他方面的东西是怎么学习到的
- 怎么平衡学校与个人学习
- 觉得学校的课业对学习有帮助吗,举个例子
- 讲一下 cow 是什么(copy on write)
- 为什么说考虑过用编译原理的知识尝试去实现 markdown 编译
- 对于 string.replace 方法假如要自己实现有什么优化的想法吗
- 挑一个项目最有挑战的点来说
- 简单解释一下 CRDT
- 协同面对的两个问题
- 跟 OT 对比优劣在哪
- 为什么选择远程协同作为解决方案,在此之前调研过其他方案吗
- 说一下光标速度优化,具体为了优化哪个层面(网络传输)
- 讲一下前后端结构设计
- 服务器崩溃问题(一路延申到快照创建,历史版本,内容压缩,使用外存)
- 说一下现在的解决方案和未来的解决方案
- 为什么快照可能可以解决 yDoc 实例占用内存过多的问题
- 遇到环形引用怎么解决,这里如果改为 json 可不可以进行压缩
- 结合 cow 说一下 json 压缩实现
- 说一下 yjs 在避免内存泄漏上实现的 gc 是什么
- 做上下文序列化时为什么说可能阻塞
- 说到阻塞,解释一下为什么 js 与 gui 互斥,从操作系统层面来说可以通过什么方式去实现互斥
- 平台有多少人在用
- 了解 js 与原生语言之间的通信吗
- 简单说一下 tauri 那个项目
- 用 rust 实现了什么功能,解决了什么问题
- 除了编程还有什么爱好
- 反问
- 需要改进的地方
- 您负责的内容
这一面能很明显感受到考察的是项目思考深度,我可以说一个好的项目是非常加分的,这个好指的是你对他的思考,深入到了什么地步,对比过什么方案,最终权衡下怎么解决的,为什么选用这个方案,效能比怎么样,有考虑过未来发展吗等等问题,即 STAR 法则。而不是单纯说我 star 多,被推荐等。我简历上的项目也没说多少人 star,因为他面向的是一个特定领域的解决方案,是我们团队内部为了解决问题而实现的一套工具。
压力面加上发挥的一般,一些基础和深入点没讲好,面完后有点难过,觉得自己马上挂了,结果两个小时后约了电话 3 面,真的是极大惊喜啊。
三面(电话面 30min)
这一次是电话面,连时间都没约,直接发邮件问面不面,那当然是趁着这股劲狠狠的面了!
听声音感觉是一位很和蔼的面试官,给了我 20 分钟讲项目,中间提问 + 反问。可能是为了考察一下沟通能力,因为二面的时候讲塞壬唱片项目的时候没有讲好,有点啰嗦和抓不到重点,可能因此加了一面。
- 自我介绍
- 之前有实习过吗
- 简单说一下项目立项
- 第三方平台卡内容?那有没有想过其他自由的平台(我们的平台有属于自己的精神内核和思想,希望从自己的网站上去体现)
- 平时平台上面会发布什么内容,选择 astro 框架的原因
- 除了对比市面上的框架,还有没有调研过 hexo wordpress 这种框架?
- 成果怎么样
- 之前面过微信游戏,有没有总结面试为什么挂了,简单说说
- 对于玩具项目的定义
- 项目第一次大更新的目的是什么,解决了什么问题,中间有什么困难,现有的问题和未来的发展
- 第二次大更新解决的问题和困难,以及现在的状态
- 聊聊结构设计,为什么分了新仓库,基于什么考量,为什么要这样设计,好处和缺点
- 反问
- 这一次面试这么快的吗(把内容输出总结了就大概知道是什么水平了)
- 您负责的职责(c 端用户端)
- 还有几面(应该是最后一面)
- 可以改进的地方
- 入职时间
整个过程还是聊的很愉快的,能感受到面试官为了理解我的项目在做提问。
沟通真的是很重要的一环,作为开发人员沟通是绝对少不了的,因为你要搞懂需求,确认上下文,个人觉得唯一不用沟通的就是搞算法科研,天天发论文就好(雾)。不过把沟通交给我的话我还是要事先准备准备,对自己要说的各种东西有一个大致的了解,这样才不会在现场时显得很慌乱
其次就是感觉在与大佬沟通的时候,我就像是在给老板分析我的产品,他的优劣,以及综合团队的思考等,还有他带来的收益
后续
2025/1/2 - oc
我的秋招实习之旅到此算是以 1 wxg 日常实习 offer + 1 外企日常实习 offer 结束了,虽然我完全有信心一口气在外企干到毕业并努力转正
后记
有人问过我说为什么我的项目能做这么多东西,我的答案是:经历了长时间的沉淀,为什么能坚持这么久,因为我想我正在做我喜欢,且能满足我和让我充满动力的事情,在此引用一句其他大佬精辟的总结:Do what you love, love what you do.
其次是由于面试,我也脱离我的项目组有一段时间了,是时候要回归他们,做一些 mvp 开发和文档攥写了。他们都是很善良很友好的人,没有他们我可能就没有我简历上这个项目,也没法约到这些面试了,可以说是他们成就了我的项目基础;其次要感谢社区所有的开源开发者,他们燃烧自己的热情去实现了一个又一个无与伦比的开源库与包,尤其是感谢 astro 与 yjs,astro 官方维护成员很积极,社区声音也很多,对于 bug 处理也非常认真;yjs 则是实现了一整套生态周边,方便了我们快速上手,如果单纯给我一篇论文让我自己去实现远程协同那绝对是做不到的。
希望这份经历能够帮助到正在阅读的你,给你带来一些思考或者启发
另附文中说的项目和一些参与过的项目:
-
dmv-wiki-toolkit - 一套一站式生成 minecraft mod Wiki 网站解决方案
-
pdc-wiki - Wiki 网站解决方案项目的前身
-
MonsterSirenDesktop - 对塞壬唱片官网实现的一个功能增强,为其增加了自定义播放列表 / 第三方音乐平台接入 / 歌曲下载 / 离线访问等功能
-
astro - 一套以内容驱动为中心,支持 SSR & SSG & 混合渲染的全栈 Web 框架(提了两个小 pr 和文档修改)
-
elysiajs - 一个基于 bun 的后端框架,支持高度自定义编码风格(只是改了一下文档(逃))