入职鹅厂4个月感想:年轻人,多折腾

# 这四个月做了什么?

从 3 月底临近毕业,申请提前入职,一直到今天 07.29,差不多 4 个月的时间。由于个人问题,期间花了很长一段时间来做自我调整,也穿杂着毕业、租房等一系列事情。很多时候一个人分身多用,想各个方面和人都照顾好,算是这几年过的最累的一段时光,不想再经历。

在这 4 个月中,从业务来说,主要做了以下几个功能/系统:

  • 云开发社区官网:前端是Next.js,后端是Nestjs,部署是Docker,存储和数据库都是云开发提供的原生能力。利用 Serverless 实现了一套前后端一体化的项目,也作为云开发和 Devops 的最佳实践,过了一把全栈的瘾。
  • 内部运营系统:前端是React+Antd,中间层用的Koa,部署是内部的 K8s 服务。这是去年实习的时候,开发的系统。今年入职之后,使用Hooks进行了一次重构,也设计了二期权限控制,支持基于接口和页面的控制,引入用户、角色、权限集合的概念。
  • 云开发用户体系:跟随导师做了云开发体系下 Web 端能力,包括邮箱登录、短信登录、账号密码登录。短信登录是通过云开发扩展能力实现,邮箱登录主要负责 JS SDK 和腾讯云控制台开发,账号密码是 JS SDK、数据流中台和腾讯云控制台开发。
  • 智能网关(云开发 Http Service):没跟进大功能,支持了编码规范、git message 规范,使用内部微服务中台能力做了埋点上报。
  • 周边开源生态:云开发 CMS、命令行工具 CLI、Framwork 模板都有写些代码,主要目的是了解其他同学在做的业务。
  • 云开发布道:参与运营同学组织的直播或者演讲活动,显著提升现场 code 和 debug 的能力。

在 3 月底入职的时候,给自己的短期目标是:

尽量将整个前端业务涉及的项目亲自“摸“一遍。不是光看,而是通过做真实的需求,来了解项目的架构,功能的设计,以及窥探改进的方向。

由于云开发对外提供 Serverless 能力,组里的前端开发者其实称之为「Node.js 工程师」可能会更合适。比如,数据流中台和网关为 50 万的开发者的应用提供基础能力支持,每日调用 7 亿次,涉及到的发布构建、代码管控、elk 日志、服务治理等都比较复杂。

当然,这也是最有挑战、最有意思的。相信有过几次项目经验的同学应该都能体会到,摸清前辈的系统设计在上面做改动甚至优化,比完全自己重启一个项目,更加复杂。

# 这四个月遇到的问题以及解决办法

# 如何克服“新人恐惧“心理?

在面对一个大型线上项目的需求时,发错一个版本,就可能影响几万开发者,以及他们开发的应用所涉及的更多用户。而项目中各种业务逻辑以及之前的代码设计,也会给新人开发带来“上手成本“。

对于涉及线上的改动、发布,一定要找到非常熟悉的同学,搬电脑过去,面对面请教。不要太相信文档,毕竟文档有时候更新不及时。

对于代码设计和项目架构,建议使用“广度优先法“进行思考,关注点集中在当前需求可能涉及到的逻辑线,避免面面俱到(大佬除外)。

总结来说:首先多自己思考,想不明白,再请教有经验的同学,脸皮要厚,路子别野

# 如何设计/改进一个新系统?

对于设计/改进一个新系统,我觉得可以分为 4 个阶段:

  • 调研阶段,参考同类系统的功能设计,向同事和导师寻求建议。
  • 初期阶段,理清优先级,关注核心功能点,避免追求高大上,防止过度设计。
  • 发展阶段,渐进式优化,螺旋上升。尽量避免抽出一大段时间优化(影响需求进度),除非重大功能缺陷。
  • 后期阶段,关注服务的安全性、稳定性、性能、开发效率;关注开发文档建设,降低其他同学上手成本。

云开发社区官网就是一个很好的例子:

  • 调研和初期阶段,内容管理使用 CMS,前端使用 Nextjs,借助 CI 定时静态导出,后端服务部署云函数
  • 发展阶段,优化数据表结构,优化部署发布流程,前端组件化,后端服务云函数迁移至云应用
  • 后期阶段,区分开发、预览和线上环境,数据丢失回档演练,完善开发文档和接口注释

总结来说:避免过度设计和封装,保持可扩展性,在开发过程中渐进式重构

# 如何更快地上手业务,在工作中学习?

一个人走的更快,一群人走的更远。个人能力总是有限,不可能所有的功能都参与,而了解学习其他功能本身也是一个学习提升、了解业务的过程。

我将其拆解为以下几步:

  1. 了解功能,尝试使用,直观感受
  2. 阅读设计文档,在更全面的角度上去看设计思路
  3. 看相关代码,代码最直接
  4. 搞不明白或者疑惑的点,咨询相关同学。有些实现可能并不是最优,但一定有其考虑

总结来说:有时间就多学,保持谦虚和好奇心

# 这四个月踩到坑

# 明明白白地“自我安排“

需求千万要留 Buffer!需求千万要留 Buffer!需求千万要留 Buffer!

简单做一个排期表,或者 TODO LIST。花费 1-2 小时,但是和 PM 沟通或者之后调整需求会非常清晰,效率奇高。

# 骚年,请保持好奇心

保持输出的同时,也要给自己留点时间,一是避免精力被榨干,二是有时间学习下新的技术,太累的话就换个城市走一走。

关注效率工具,增加知识留存。目前是通过思维导图来勾划目录,通过博客来记录笔记,思维导图的目录项会跳转到博客笔记,完成串联。

# 下一阶段的目标

TODO:2020/7/30 凌晨 1 点了,明天上班,有空补上。

主要分成 2 个部分:技术、产品。

# 关于技术

在和几位组里同学沟通之后,之后的学习按照「算法 => OS => 网络」的路线。算法是目前在学习的,主要在看一本小册以及《编程珠玑》;OS 准备看《Unix 高级变成》;网络就是《TCP/IP》。虽然有些东西大学时间看过,但是理解太浅,希望这次可以做到举一反三。

同步进行就是一整套 Nodejs 后端开发最佳实践的学习,推荐 Nestjs 的官方文档,既详细又全面。

# 关于产品

平日抽时间看云开发能力的相关设计方案。持续关注业界领先的 serverless 厂商的能力,例如 Firebase、Vercel。

这一年多时间(实习+正式),给我最大的感受就是,作为给开发者提供服务的开发,要在不同场景中抽象出公共能力。之前在腾讯 TEG 前端实习的时候,感觉更多是工具人/切图仔,但页面切的再好,或者一套前端状态管理用不同的方式写,影响也不大。

设计一个数据库 SDK 的接口或者 CLI 的命令族,会影响用户的开发成本;提供函数可用率或者优化实时通信的调用链路,会增加服务可用性。类似的地方还有很多,在 Serverless 场景中,前端的价值被放大。

多学习,多折腾,未来更美好

Author:心谭 Github,From:xxoo521.com,专注算法与 web 开发的技术博客