About Me

GitHubhttp://github.com/0neSe7en
Email[email protected]

  • 热爱计算机与编程,从中可以获得很强的成就感
  • 对新事物有很强的好奇心,愿意不断的尝试与学习新技术
  • 不断的试着提高自己的工作效率,优化使用的工具

Skills

并不排除学习或使用任何语言,应该用最合适的工具做最合适的事情。下面的技能只是目前我的情况。

  • 掌握Node.js & ES6
  • 熟悉React.js & Jest & Mobx & mobx-state-tree & Electron
  • 熟悉Golang & Python
  • 了解TypeScript

Experience

研发工程师 (2016.7至今)

项目经历

实时消息平台 (2017.11至今)

所用技术:Node.js | gRPC | Redis | Socket.io | statsd | Docker

此项目由我进行技术选型与架构设计,与另外一名同事合作开发。此平台用于直播实时消息通信。并提供SDK供其它团队方便的开发业务。

  • 使用gRPC进行主动调用。使用RabbitMQ作为消息队列。Redis存储Session等信息。
  • 在接入层提供多种协议支持(目前提供RTMP与Socket.io)
  • 使用Node.js实现了RTMP协议服务端
  • 每个组件都可以水平扩容
  • 内置APM监控(statsd):每个业务每个方法的QPS与响应时间
  • 内置事件录制功能
  • Jenkins自动构建Docker镜像、Kubernetes部署
  • 使用Jest进行代码测试与持续集成
日志收集与数据分析平台 (2016.7至今)

所用技术:Node.js | Golang | MongoDB | Redis | InfluxDB | Python

此项目基本由我独自进行架构与开发。已开发部分主要分为如下方面:

  • 使用Golang对外提供日志收集,将数据传输至NSQ,容器化部署。
  • 使用Node.js从NSQ中消费数据,并存入Redis、InfluxDB、Statsd等
  • 目前每日处理几亿条数据,QPS大概为20K
  • 使用Grafana、InfluxDB、ELK、Statsd等服务,基于收集到的日志,搭建客户端的报警与监控系统
  • 使用Highcharts + Mithril.js 开发数据统计与前端Dashboard展示页面
  • 针对每一节课,使用Celery与Python生成相关的统计数据并存入MongoDB中:用户网络状况、听课时长等

目前此项目正在进行重构,将前端的Dashboard展示页面从 Mithril.js 迁移到 React.js + Ant.design。后端统计服务使用TypeScript开发,支持获取当前实时在线用户、将日志归档到Kafka中等等。

基于Electron的直播客户端 (2017.05-2018.05)

所用技术:Electron | React | Mobx | mobx-state-tree | C++

由于一些原因,导致使用 Unity 开发的客户端无法满足我们的需求,所以采用Electron重新开发了直播用客户端。我主要是验证技术可行性、封装一些库供业务开发者使用。

  • ffmpeg-node-capture:使用 N-API 与 FFmpeg 开发。用于在Mac于Windows上捕获摄像头、麦克风、桌面等,并进行视频缩放、色彩格式转换与音频重采样等。
  • node-sdl-speaker: 使用 N-API 与 SDL2 开发。用于在桌面端实时播放多路音频并混音。相关文章GitHub地址
  • dby-node-sdk :使用 node-ffi 对原生SDK进行封装,提供给Electron与Node.js使用。
  • react-blackboard:使用React对 fabric.js 进行封装。提供支持划线、写字、拖拽、缩放等功能。
  • react-yuv-video :在 mainProcess 收取来自SDK的YUV420P数据,并将其在 renderProcess 上进行展示。使用IPC传输数据。在 renderProcess 中,使用WebGL与Canvas渲染 YUV420P 的视频数据。
  • 使用实时消息系统与MongoDB构建了JsonPatch同步服务。供使用 mobx-state-tree 作为状态管理的客户端使用。
基于Unity的直播客户端 (2017.02-2017.05)

所用技术:Unity | C# | C++

  • 采集本地摄像头与麦克风,并将原始数据传给SDK发送到远端
  • 从SDK中获取PCM与YUV420P的原始音视频数据,并将其播放与展示。
  • 使用C++对原有的移动端SDK进行封装。可以编译成动态链接库供Unity使用(Electron客户端也是采用此方式)
基于WebSocket的低延迟音频直播播放器 (2016.12-2017.01)

所用技术:TypeScript | WebSocket | AudioContext

在手机端(微信、Safari等浏览器)直播一般会采用HLS。但是HLS的延迟会比较久(正常情况下10s以上)。所以构建了一个低延迟(经测试,延迟在1s左右)的音频直播播放器。

  • 使用TypeScript进行开发
  • 使用WebSocket传输Binary的ADTS数据,并使用AudioContext进行音频
  • 处理不同手机不同浏览器的兼容性
    • 解决个别浏览器连续播放多个ADTS帧产生爆音的问题
    • 解决个别手机AudioContext播放速度较慢,导致声音断断续续的问题

其它工作

除了上述提到项目,也努力提高大家的工作效率,引入一些工具、优化工作流等

  • 推广Code Review与单元测试
  • 引入并推广Phabricator。目前代码托管、Code Review、项目管理等都基于此。
  • 搭建Jenkins服务用于构建Docker镜像、自动化测试、自动打包Mac、Windows平台客户端。
  • 搭建内部的Docker私有镜像、npm私有仓库等

光音网络 - Node.js 全栈工程师 - 实习 (2015.12-2016.07)

所用技术:Node.js | Golang | Mithril.js

  • 使用 Mithril.js 重构SSP (Sell Side Platform) UI
  • 重构 SSP 的API接口
  • 优化 SSP Server

Keep - Node.js 后端开发 - 实习 (2015.05-2015.12)

所用技术: Node.js | MongoDB | Redis | RabbitMQ | Python

  • 主要使用Express、MongoDB、Redis开发Keep的后端API
  • 独立完成 Keep 的成就系统
  • 使用Python开发批量上传训练数据工具与一些数据统计任务
  • 使用MongoDB作为主存储,Redis作为缓存

人人集团 - Python 开发 - 实习 (2014.11-2015-04)

所用技术:Django | Angular JS | LVS + Keepalived

独立研发公司服务器选型组的TCO平台开发。

教育经历

  • 2012-2016 北京信息科技大学 - 计算机与科学