实习总结

实习总结

拿到腾讯这个 offer 纯属意外,当初得知需要线下面试的时候,拒绝了线下面试的邀请。最后面试官(现 leader)打电话过来问拒绝的原因,得知原因后 leader 给了个机会线上面,最后拿到了这份实习 offer。

从 7 月份实习到现在也半年多了,在这个半年多的时间里,接触到了不少东西,比如工具类vtools xboos mojo 等,也实践了很多自己的想法,还是有一些收获的,所以决定写一篇总结。

关于技术、业务

文档输出

刚来的时候和另外两个实习生写了大概 3 个礼拜的技术文档吧。补全了各种文档,也是第一次写技术文档。在写文档的过程中读完了express-ci的源码,这是一个express的改版,无中心路由的一个 node 框架,通过中间件解析出querystring 中的path controller method 然后实例化 controller 然后去调用,但是在阅读代码的过程中发现express-ci的几个问题

  1. express-ci自己维护的中间件模型是混乱的。
  2. express-ci频繁实例化controller的类,每一次请求都需要实例化一次

这种无中心的路由方式其实有好有坏,好的在于下一个接手代码的人很容易的就能知道这个请求的处理方法在哪里,坏的在于管理混乱,并且对开发者约束太强。

工程开发体验

刚开始实习的时候,大部分工程还在 svn 上,正在逐步的往 git 上迁移。当时的发布流程是本地构建文件,然后上传到 svn,再通过发布系统去拉 svn 的文件发布的 IDC,然后就会有特性相互覆盖的事件发生。并且由于所有人的构建环境都不一样,很危险,而且发布的时候 每个人的权限都非常大,经常都是免测发布,以至于,我刚到的时候都不敢用那个发布系统,每次都是找同事帮忙发,直到现在,我还是没学会那个发布系统(因为已经抛弃那个系统了)。

给同事介绍 CI 和 CD 的概念之后,开始尝试提升整个开发的体验,想在现有的条件下,最轻量的接一个集成系统。研究了Jenkins Drone 还有部门的Jats Jats是部门一直有的集成系统,但是主要是针对 Cpp 和移动端的集成。经过以下尝试:

  1. drone 接入内部 git
  2. 搭建 Jenkins 接入内部 git
  3. 使用 jats 搭建 web 发布环境

经过这些尝试后,使用了jats发布了一段时间,稍微提升了一点开发体验,但是其实感受没有特别明显。

直到现在,公司内部有了类似 tranvisCI 的工具,公司内部几个 CI 系统的竞争,我们也选择了某个 CI 工具,开发体验有了大幅度提升,不需要 scp 去部署开发环境,不需要上传 svn 去部署测试环境和发 IDC。

在探索这个的过程中还是有一些阻碍的,比如最开始由于公司网络隔离,导致构建的机器没办法通过 22 端口拉git的依赖。有一些私有依赖都是放在 git 上的,npm install的时候没办法拉下来这些依赖。于是写了一个工具去分析这些依赖,然后通过git clone的方式安装下来,场景越来越复杂,最后这个工具也迭代了好多版本。不过现在网络环境优化,已经弃用了这个工具了。

还有测试环境隔离,在测试环境需要把不同版本隔离开来,于是写了一个工具,自动管理这些版本,工具在 github 私有仓库躺着。最后也没派上用场。因为 IDC 上不是 docker 环境,为了保持环境的一致性,所以最后写了个脚本,对代码工作目录和启动的端口做了隔离。

这段时间也了解到了不少东西,比如MonorepoMultirepos 学到了一些相关的工具lerna teambit等。

这部分应该是实习这段时间做出最大贡献的一部分吧。个人认为。

Laya 小游戏

又点了一个技能点,第一次尝试前端开发小游戏。世界杯期间,小游戏也刚刚开始火起来,所以有部分业务是小游戏的形式存在,为了维护这部分内容,去学习了 laya 框架,学习如何通过 laya 提供的 IDE 写一个小游戏,阅读了以前的一些代码。小游戏的交互比 web 复杂,同事在开发小游戏的时候,把 web 上的一些概念带到了游戏里面,我觉得还是不错的,比如路由和页面的概念。降低了一些开发门槛。

在线 JKC

由于 JKC 原来团队人手不够,于是加入去开发 JKC,JKC 的一款在线的游戏,要求的及时性很高,所以用的 websocket,node 框架用的 socketcluster,前端是 vue。

接手的时候发现了一些问题,比如所有消息都是全频道广播,但是其实这个产品是有房间的一个概念的,很多东西都不需要全频道广播,为了偷懒,所以全部消息都全频道广播,然后前端去过滤。所以接手的时候就把后端服务重构了一下,然后顺便了解了一下后端的 MQ 框架。

对于这个项目的前端部分,这个项目的前端走向了一个极端,所有数据都放 store。连 modal 等都是用 store 去驱动的,这就算了,大部分数据还是通过事件去传递的。所以整个数据流非常混乱。

经过这个项目后,变得极其讨厌 store 与 eventemitter

BY 小游戏

转了一圈又回到了小游戏的开发,这次的小游戏也是一个及时性很强的游戏,尝试了一个叫做行为模式的游戏设计模式,定义一些物体的类,并且在类上对这些物体定义它的行为,通过这些类和行为组合起来整个游戏。这个游戏特殊在于,所有计算模型都是在前端,但是是一个多人在线对战的游戏。所以会导致所有玩家的界面不一致,就会很奇怪,所以尝试了很多方案去同步所有玩家的画面,比如有一个玩家进入,其他玩家接收到玩家进入房间的消息就把自己画面中的内容同步给进入的那个玩家。经过很多尝试,但是毕竟存在网络延迟等一些因素,所以最后的结果也没有让人很满意。

经历了这个项目,我感受到了和别人协同的重要性。很重要的一点,不要在别人不知情的情况下重构别人的代码,如果非得重构,一定要保持暴露的 api 和以前的一致性,如果没办法保证一致性,请通知其他同事,不然会给别人带来很大的困扰。(作为受害者深有感触)

VB

上面的项目存在的时间都非常短,因为战略调整的原因,我们开始了 VB 项目,VB 这个项目 前端是 weex + ts,后端是 egg + ts 。// 阿里全家桶。在我所负责的业务中我尝试了一个新的想法:

我认为 store 的本质是一个全局变量,只是它比较特殊,它挂在 vue 的原型链中。我认为 store 一定程度上破坏了整个应用,是具有副作用的,所以我尝试用各种办法来处理掉一些原来需要 store 的场景。

我们的前端结构是View --- Store --- Business view 层很简单就是.vue文件。business 这一层是用来处理一些逻辑的,比如接口拉到的一些数据需要排序,或者需要几个接口组合的各种逻辑,并且不与 store 耦合,也就是说 business 不会去 commit 数据到 store。具体的业务逻辑:View 层所需要的数据都会从 business 或者 store 里面拿,view 层不进行任何重逻辑的处理。

有以下几个场景:

  1. A 页面与 B 页面都依赖一个接口的数据,这个数据纯展示数据。在以前会将这个数据放在 store 中,这次我尝试在 business 使用 promise 做了一层 cache,将这个数据缓存在 business 中。不管先进入 A 页面还是 B 页面,都是调用 business 的提供的方法获得需要展示的数据。所以 A 和 B 其实就不相互依赖,因为如果使用 store,那么一定是 A 依赖 B 或者 B 依赖 A,总有一个要去 commit 数据到 store 的嘛。
  2. 使用 promise 做缓存还能解决一些请求穿透的问题,如果缓存的是请求结果,那么同时有 2 个并发请求就会请求 2 次,如果缓存的是这个请求,有 2 个并发请求也只会请求 1 次。
  3. 前置的接口拉到的一些数据,后置的请求需要依赖,比如前置请求拉到的一些 id 之类的东西,不给用户展示的。这些数据以前也会存放在 store 中。这次我在 business 中开了一片内存(其实是个对象),专门用来存放这些数据。虽然说还是一个变量,但是他没有暴露给其他模块,可以在 business 里面自己处理,自己消化。
  4. 下单接口一般都会有预下单和正式下单,这 2 个步骤是一个事务,并且下单的请求依赖预下单的返回结果,如果预下单是个生产者,那么下单请求是它的唯一消费者,所以我把整个过程封装成了一个类。每次用户需要下单的时候我会实例化这个类,然后依次调用预下单和下单,如果中间某个过程取消了或者失败了,下次下单直接重新实例化这个类,就不需要关心怎么去清理一些垃圾(比如存放预下单返回的结果的变量)

总结一下:

关于 store,我认为只有符合一下条件的才需要放于 store

  1. 多个组件共同依赖的状态
  2. 这个状态会发生改变
  3. 这个状态与 view 层有关,需要展示给用户的

学习到了几个东西:

  1. to 函数,解决 try catch 的一个痛点,对代码风格有了很大的提升
  2. 使用 promise 做缓存,解决了一定的请求穿透

总结

以上是大部分这段实习期间的所感。还有一些边边角角的东西,比如特殊的 node rpc 请求库,后端是基于 gRpc 定制的一个协议,当初写了个 demo 就丢给同事去维护了。虽然我觉得还是缺点什么。。。

这段时间基本把很多前端的应用场景都尝试了一遍: 小程序、小游戏、移动端、H5

端越来越多,前端需要学习的东西也越来越多,小程序 快应用 移动端 各种各种的端出现,如何提升个人的核心竞争是一件头疼的事情。

这段时间只发了 2 篇博客,一篇是immer源码解析,一篇是实现一个装饰器风格的node框架

这段时间坚持打了 7 场的 LeetCode 周赛,坚持每周都去看前端周刊,知乎专栏。

这段时间参加过一次前端大会(IMWeb)感谢 leader 给的票。

这段时间很多项目半途而废。

这段时间有了很多机会实践。

除了技术以外

最大的感触还是最后拿了个白菜价的 offer 吧。后面这段时间没有刚开始那么努力了。感觉所有的努力都是无用功。但是还是接下了这个 offer,毕竟懒,也就这样了。

王者荣耀也几个赛季都打上了王者。

没有认识更多的人,只是有些人又开始有联系了。

生活技能点没有发生变化,也没有学会做菜。

体重没有明显下降。

生活质量没有明显提高。

赚多少花多少没有存钱。

展望 2019

加油。