风变科技面试总结 – 2020 年 6 月 15 日

风变科技详情

风变科技当前最为知名的产品是《Python小课》。

一些关于风变科技的文章

风变科技网站

总体描述

我的简历应该是由他们的前端 Leader Function 提交的,因此,第一轮给我打电话的直接是 HR ,而不是一般时候我们的业务方。

技术面

技术面的面试官准点上线,这一点给赞。

技术面一共问了以下的一些题目

1. 后端模板引擎在 2020 年的时间节点中,他的存在有什么意义?

我的回答:后端模板引擎目前还存在,更多是从 SEO 的角度来看到的。当然,实际上为了 SEO ,前端还搞出了 SSR (Server Side Render)来处理这些问题。

2. 你搞过 SSR 么?

我的回答:没有。

这里可以看出,在当前 SSR 当道的情况下,搞一搞 SSR 还是有必要的。这个我需要在后续补充一下。加到 TODO 里。

3. 你为什么会在你自己的项目中配置 CI & CD?

我的回答:

因为我自己会觉得,CI & CD 的配置会让我能够更高效的完成自己项目的开发。

其实可以补充一些内容:

CI & CD 可以提升项目的质量,因为 CI & CD 并不是简简单单配置一个 CI & CD 就结束的。CI 、CD 背后是项目测试完善的标志。如果没有测试,CI 和 CD 就仅仅是一个自动部署的脚本而已,没有发挥出其最大的价值。

4. Vue 的单文件组件的 Data 为什么是一个函数,返回一个 Object,而不是直接返回 Object?

我的回答:

涉及到单文件组件复用的时候,可能会导致不同组件实例的数据紊乱。如果返回一个 Function ,Function 内部返回的 Object 会借助闭包机制来避免这样的问题。借助闭包机制构建诸如私有变量的形态。

面后研究:

这部分内容被记录在 Vue 官方文档中的组件基础页面

这里官方给到的描述是,当返回的是一个函数时,会让每一个函数维护一份被返回对象独立的拷贝

相关的 Vue 源码参考:https://github.com/vuejs/vue/blob/dev/src/core/instance/state.js#L112-L152

5. 当一个父组件和子组件中的 Mounted 都加入一个 console.log 的时候,哪个会先打印出来?为什么?

正确答案:子组件的 console.log 会先打印出来。

这部分你可以参考实例代码 https://codepen.io/madman0621/pen/vQyBPB/

面后研究:

简单来说,组件会在 父组件进入 BeforeMounted 之后,进入子组件的 BeforeCreated 中

可以参考这篇文章:https://juejin.im/post/5c95ee98f265da60dd354c6c

6. Vue 的函数式组件如何使用

我的回答:这部分只答出了 Render 的函数和他使用 createElement 来创建 Element ,没有回答出其他的内容。

面后研究:

可以参考 Vue 官方文档中关于渲染函数的描述

https://cn.vuejs.org/v2/guide/render-function.html

7. Vue 如何做 Diff 的

这部分没有回答上来。

面后研究

https://github.com/answershuto/learnVue/blob/master/docs/VirtualDOM%E4%B8%8Ediff(Vue%E5%AE%9E%E7%8E%B0).MarkDown

8. v-if 和 v-show 的区别是什么?

我的回答:

v-if 和 v-show 一个是在渲染的时候控制,一个是在显示的时候控制。

v-if 会带来渲染开销;v-if 会带来显示开销。可以感受自己的需要选择。

9. 如果对 Vue 单文件组件的空 Object 进行操作,会触发更新么?

题目大概是下面这样的含义,问是否会触发更新

new Vue({
  data:function(){
    return {}
  },
  methods:{
  onClick(){
    this.data.xxx = abc
  }
 }
})

我回答的是不会,理由是和之前的 Vue 组件的 data 为什么是一个函数而不是一个 Object 一样的。这里使用类似闭包的机制让其来完成其数据的不互相干扰,带来的问题是,必须提前声明才能确保相应的数据被自动生成 setter 和 getter 。

面后研究

这个问题源自 Vue 的响应式原理,具体的内容可以参考下方的内容

https://cn.vuejs.org/v2/guide/reactivity.html#%E5%AF%B9%E4%BA%8E%E5%AF%B9%E8%B1%A1

10.关于 Web Socket 的原理

我的回答:这里我回答了之前在做嵌入式开发时的一些经验。

后来面试官告诉我他想了解的其实是我之前写的一篇公众号文章 。我就说了一下自己的理解。

https://www.ixiqin.com/2019/08/websocket-how-to-implement-the-server-to-the-client-sends-the-message/

11. Node.js 中的双工模式

这部分我没有了解,没有回答

12. 僵尸进程与孤儿进程

13. Git 的 Merge 和 squash merge 的区别是什么

我的回答:

squash merge 的最大区别是可以将多个 commit 合并为一个commit ,我会在整个 pr 中的 commit 无意义的时候,使用 squash merge。 当 commit 有意义时,就使用 merge。

面后研究

这里还有一个问题,我没有回答上来,就是 cherry-pick 能干嘛?

这里可以看看阮一峰老师的博客:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html

13. Node.js 的流(Stream)

这部分我只说出了自己用过 fs 的流

面后研究

面试官的预期答案,可以参考 http://nodejs.cn/api/stream.html#stream_stream

14. Egg.js 为什么没有用 Pm2,而是自己实现了守护进程?

这部分我没有回答出来。只是说出了,如果你要将自己的项目改用PM2 管理时,需要去除script 中的 daemon 模式,以标准的进程模式来运行。

涉及到的页面

https://www.eggjs.org/zh-CN/core/deployment

https://github.com/eggjs/egg-cluster

15. 如何平衡工作时间和 Side Project 的时间?

我说了一下自己的模式,每周五晚和每周六晚通宵搞代码

16. 如果团队没有人分享的话,如何让他们分享?

面试总结

本次面试的时长约 1 个小时,讨论的问题达到了近 20 题(实际上还有一些我记得不太清楚的题目),可以看出,几乎在每个问题中,我都没有和面试官去往深处去讨论,这其实会为我的面试失败埋下伏笔(写这篇文章的时候还不知道结果,暂且认为这样不太好)。

下一次面试需要优化的点包括:

  1. 对于自己常用的工具需要熟悉,比如 Vue,比如 Git
  2. 对于 Node.js 的原理还是有待深入学习

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注