Thoughts, stories and ideas.

在 BearyChat 写代码是一种什么样的体验?

本文作者@hbc

  • 代号 xx,江湖人称老司机
  • 倍洽(BearyChat)后端工程师
  • 不爱吃福建人

本文起因于一个关于「创业公司技术选型」的提问。在大约两年前,熊小队 CTO 唐晓敏同学的 一个专访 里我们曾提及过这个问题,两年后再回顾,hbc 同学也从另外的视角为熊小队再次补充了答案 :P

工程部门概括,or: BearyChat 码仔的搬砖日常

BearyChat 工程部门可以按照不同方法来划分(当然人还是那么多的人)。
传统方法就是按照不同的职责来区分:

  • 前端天团
  • iOS/Android 客户端天团
  • 后端天团

顾名思义,不同天团的同事会负责对应方向的工作。例如我大部分时间都是作为后端天团的代码仔来上(搬)班(砖)的,所以主要会关注后端开发的事宜(下面也会介绍一下我们的后端架构的情况)。

但又因为目前的 BearyChat 技术团队还不算十分庞大,所以不一定会强制各位工程师只能做某个方向的事情。所以还可以按照以下方式划分:

  • 公有云 SaaS 开发天团
  • 私有部署开发天团
  • 基础架构天团

也就是说,在 BearyChat 做码仔,很大程度上都要身兼多个方向的研发任务(我们有萌系前端工程师速成 Clojure 的「奇迹」,也有后端工程师轮番上阵用 Angular/React 写搜索输入框的惨痛故事)

因为 BearyChat 产品功能比较多,所以日常开发任务都会按照功能模块来划分、以小组方式来组织开发(当然会带上稀缺资源设计师 XD)。典型的日常会是如下:

  1. BearyChat 的研发在与一生的敌人产品锦鲤讨论新功能的产品需求(包括用户故事、功能设定、边界条件等杂七杂八的东西)后会产出一份基本的产品文档;
  2. 工程师会在一生的敌人的帮助下根据产品文档把任务分拆到自己喜欢的整理工具中去;
  3. (前后端)工程师、设计师会根据拆分好的需求尽可能地并行做开发、设计的事情;
  4. 工程师在领取一个任务之后,会通过 GitHub Pull Request Flow 的形式来提交自己的实现给相关同事进行 review (原则上不少于两个), 同时 pull request 会有专门的 CI 流程进行测试;
  5. Review 同事在 CI 测试通过后会进行 code review, 这部分主要就是在 tracker/BearyChat 上吵架了 :P
  6. Code review 完成后,最后一位 review 的同事会 merge 代码到主干,并把相关任务标记为已完成;
  7. 代码自动部署到 stage 环境,相关同事会在 stage 环境上进行集成的测试;
  8. 每周二、周四对主干代码进行 release, 上线

Take away:

通常一个简单的需求从确认到开发再到上线周期一般在半个星期到一个星期左右。这套流程的基本概念从 BearyChat 创建伊始就开始使用,改动不大,主要有几个重点:

  1. 坚持 code review: code review 能帮助工程师找到很多盲点,盲点可以是代码上的,也可以是产品上的。同时 review 的过程也有利于不同的同事熟悉整个业务。
  2. 完整的 CI/CD 发布流程非常重要:因为 BearyChat 本身是一个涉及多个大功能模块的复杂系统,所以单独的测试不一定能把所有问题都暴露出来,因此一个完整的持续集成流程和测试环境能帮助工程师尽可能快地看到功能在完整环境上的运行效果,大大缩短了问题发现、重现周期。

后端架构

TL;DR:

  • Clojure + Erlang
  • MySQL + Redis + RabbitMQ + Elasticsearch
  • Thrift + HTTP
  • Ansible + Docker + Jenkins

最初的架构设计

最初的架构设计可以参考 CTO 唐晓敏在15 年一次访谈 创业公司的技术选型 中提到的草图:

这套架构的特点就是:简单 + 可扩展。

目前的架构设计

BearyChat 后端可以划分成几个部分:

  • 核心数据储存
  • API 服务
  • 即时通信 RTM 服务
  • 私有部署服务

核心数据储存主要使用了 MySQL / Redis / Elasticsearch / products / elasticsearch . MySQL 储存了大部分业务数据(最大的消息数据表已经接近过亿条记录,所以不久之前我们也对该表进行了一次横向切分迁移,下次再给大家介绍相关细节)。 Redis 作为万金油既保存了部分非结构化的业务数据,也作为缓存用途保存了使用中产生的临时数据。 Elasticsearch 则索引了 BearyChat 的消息、文件等可搜索的实体。

Take away:

核心数据部分,BearyChat 采用了成熟的开源技术,好处就是大部分坑都被人踩过填过了,工程师不需要浪费太多时间就能得到很好的成效。

API 服务和即时通信 RTM 服务可以放到一起讲。这两个模块一「静」一「动」。

API 模块是没有状态的服务,对外通过 HTTP 协议暴露接口。API 服务主要用了 Clojure 来实现,跑在 JVM + Ubuntu 上。

RTM 模块则是一个大型的连接状态机,所以用了 Erlang 来实现,同时也是部署在 Ubuntu 上。对外可以通过 WebSocket / TCP 进行连接。

动静两个大模块之间使用了两种方式来进行跨服务通讯:

  • RPC (Thrift):服务间通过 RPC 调用来获取状态、信息
  • RabbitMQ:目前主要作为任务队列来使用,会把用户消息处理、搜索索引、推送等异步任务放到这上面来进行消费

Take away:

这两个模块从最开始设计就坚持以下要求:

  • 横向扩展(x 轴)要方便:API 服务无状态自然是简单的。而 RTM 服务因为采用了 Erlang, 所以在进行横向切分的时候也非常简单。
  • 纵向扩展(y 轴)要灵活:除了可以很方面加大机器性能来提升以外,还要在模块内尽可能地应用服务状态监控(目前使用了 ELK + Grafana stack. zipkin 等一大波 opentrace 工具正在路上)和进行业务解耦(API 模块正在做从 monolithic app 迁移成 micro service 的相关重构)。
  • 业务扩展(z 轴)要无痛:目前 BearyChat 产品是围绕团队这个概念来进行设计的,所以根据团队切分(公有云)、迁移到私有部署成本都会非常低。

私有部署服务主要用于 BearyChat 的私有部署实现、发布、交付。BearyChat 的 私有部署 版本和公有云版本产品功能基本相似,但会有其他针对大型组织体系实现的功能。同时因为私有部署环境不完全属于工程师可以直接控制的范围,所以目前搭配使用了以下技术:

  • Docker: 私有部署实例会通过 docker 镜像发布,同一个 docker 镜像可以单独作为完整服务启动,也支持作为集群服务的节点启动;
  • Ansible + Packer: 因为 dockerfile / docker composefile 本身表达语义和操作存在很大的局限性,所以私有部署镜像使用了 ansible 作为 provision 脚本、packer 作为 repreduceable/identical 镜像的构建器;
  • Jenkins: 目前私有部署的打包发布会涉及 BearyChat 所有模块,因此镜像的打包会通过若干个 Jenkins pipeline task 来完成串联、自动化。

Take away:

  1. docker 不保证兼容是 feature 不是 bug
  2. 构建复杂的工程需要关注变与不变的地方,通过把不变抽离出来能减少很多重复的步骤。在私有部署中,变的主要是核心模块的代码,不变(相对来说)的则是核心模块的底层依赖

展望

除了要为更多的用户提供更加高效的工作方法,BearyChat 的工程师也在以下几个领域不断推进:

  • 更加快速的产品迭代、交付
  • 微服务化 & GraphQL
  • 更加开放的机器人集成生态环境(机器人市场 & OpenAPI
  • 适应更加多组织企业的私有部署版本

在这个很详细的回答下面,我们也打个小广告:假如你认同 BearyChat 对高效工作的理念,也有兴趣做一些不那么 SoLoMo 但依旧很酷的东西,点击左下角「阅读原文」,熊小队正在寻找 Android 研发等小伙伴,欢迎随时跟我们联系 :P

Hire - 资深 Android 工程师

很明显这是一则招聘帖。我们正在寻求一位有经验的安卓工程师。

我们希望你:

  • 有 2 年及以上线上项目开发经验,能独立开发完整的 App;

  • 熟悉 TCP、HTTP 网络编程;

  • 熟悉 Android 系统以及 SDK;

  • 精通 Java,熟悉多线程编程;

  • 有独立钻研移动领域新技术的热情和能力;

加分项:

  • 有属于自己的应用上线,或者有自己维护的开源库;

  • 熟悉 Android NDK,并具有 NDK 开发经验;

  • 熟悉 Kotlin;

如果方便的话,来信请附上 Blog、GitHub、Twitter 等能够让我们更加了解您的信息。

我们能提供的:

除了必备的五险一金之外,每个月还有基本的房补餐补;零食咖啡供应;段子不停歇笑到有皱纹的日常;时不时的踏青以及一年一次的 TB;以及其他你能想到的并且我能提供的。

欢迎志同道合的小伙伴加入我们,简历可投递: ly@bearyinnovative.com

想要了解更多的可以戳以下链接,运营妹纸欢迎大家勾搭:

BearyChat 官方博客:http://bearyinnovative.com
BearyChat 官方微博:http://weibo.com/bearychat
BearyChat 官方微信:bearyinnovative

Hire - 后端工程师

作为一名专(dou)业(shi)资(jia)深(de)的 HR,我的梦想是让一熊可以成为他人口中的“别人家的公司”。于是我们年会去泡了温泉,抽奖是别墅寻宝,团建去济州岛徒步,我们坚持扁平化管理,上班不打卡,每天有半个小时的弹性工作时间,零食和饮料只要你提出来都能满足你。

如果你刚好会写点后端,又刚好对我们感兴趣,请继续往下看。

后端产品开发工程师

职位职责:

  • 与各个端的同事一起定义、开发 BearyChat 的产品功能
  • 与各个端的同事一起收集用户反馈,进行产品快速迭代
  • 负责后端产品、平台模块的代码重构及优化
  • 和其他后端同事一起保证 BearyChat 平台服务的稳定性和扩展性

我们希望你:

  • 有扎实的数据结构和算法知识 (在你眼里,反转二叉树真的不是什么问题对吧)
  • 熟悉 Java / Clojure 其中一种开发语言及其生态系统 (热爱编程的你语言不应该是一个问题)
  • 熟悉互联网产品、服务的开发过程
  • 熟悉 Docker / ansible / packer 等虚拟化容器管理工具
  • 熟悉 Linux / 命令行 / AWS / Git / GitHub 等工具链
  • 熟悉 TCP / HTTP 协议,了解网络协议优化内容
  • 掌握代码重构、写出干净、整洁代码的技巧
  • 能够没有障碍地阅读外文文档和科学上网
  • 有超强的团队合作精神及责任感
  • 坐标深圳或者北京

假如你还满足这些条件就更好了:

  • 读过这个书单里面的书 https://www.douban.com/doulist/1466659/
  • 认同工具可以改善工作效率,乐于发掘新工具并推荐给别人
  • 有过开发 SaaS 服务的经验
  • 从心底里喜欢函数式编程语言 (知道 R7RS / R6RS 有几种写法就更好了)
  • 有定期阅读优秀论文、工程师博客的习惯
  • 在 GitHub / Twitter / Stack Overflow 等大型同性交友网站有好玩的内容方便我们了解你

如果你是应届生,或者还没毕业,不要怕,我们非常欢迎小鲜肉

后端产品开发工程师(应届、实习)

职位职责:

  • 与各个端的同事一起定义、开发 BearyChat 的产品功能
  • 参与到日常与用户的沟通工作,和其他同事一起进行产品快速迭代
  • 参与到后端产品、平台模块等代码重构及优化
  • 和其他后端同事一起保证 BearyChat 平台服务的稳定性和扩展性

我们希望你:

  • 应届生或者大三在校生
  • 有扎实等数据结构和算法知识(喂刚毕业不会那么快就忘光了吧)
  • 熟悉 Java (我们有同事两周学会写 Clojure 真的不是骗你的)
  • 了解互联网产品的开发流程
  • 熟悉 Linux / Git / GitHub 等工具链
  • 了解网络协议及优化的知识
  • 能够手写 sql 语句 (用得了 ORM,怼得了 DBA)
  • 能够没有障碍地阅读外文文档
  • 有超强的团队合作精神及责任感
  • 坐标深圳或者北京

假如你还满足这些条件就更(wan)好(mei)了:

  • 读过这个书单里面的书 https://www.douban.com/doulist/1466659/
  • 是个工具控,并且乐于分享工具给别人
  • 不排斥写各种语言,明白 imperative / declarrative / functional 在合适的人手中都是坠猴的风格的道理
  • 有定期阅读优秀论文、工程师博客的习惯
  • 在 GitHub / Twitter / Stack Overflow 等大型同性交友网站有好玩的内容方便我们了解你

关于我们后端团队

技术栈

我们目前使用了

  • Clojure (Ring / Compojure / sqlkorma) & JVM
  • Erlang
  • RabbitMQ / Redis / MySQL / Elasticsearch / Riak
  • Python(各种运维自动化脚本)/ Ruby(集成测试)/Go(各种自动化任务)
  • Docker / Ansible / Packer / Jenkins / AWS / LeanCloud
  • statsd / grafana / ELK 套装 / Sentry

等各种各样的技术。

工作流程

我们日常开发使用 GitHub workflow, 保证每个到主干的修改都会经过同事的 review. 同时我们也在使用 BearyChat 的基础上做了很多深度整合,例如每次 release 上线都会由相关机器人生成 changelog, 使用各种 ChatBot 来整理日报内容、项目开发进度;同时也在不断地优化改善持续集成、交付的流程。

要说的东西可能很多,但还是直接上一下 The Joel Test 结果吧:

  • 有版本控制吗? ✔︎
  • 能够一步就完成构建吗? ✔︎
  • 有每日构建吗? ✔ 我们采用两天一次的发布周期,主干上的代码一直可用可构建
  • 有统一收集 Bug 的地方吗? ✔︎
  • 会在开发新功能之前修 Bug 吗? ✔︎
  • 是否有实时更新的计划安排? ✔︎
  • 是否有规格文档?✔︎
  • 码仔是否有安静的工作环境? 这个看个人习惯吧,毕竟办公室一堆机械键盘控
  • 是否有使用能用钱买到的最好的工具? ✔︎
  • 有专门的测试吗? 目前还没有,我们推崇负责到底的交付方式(当然测试也在招啊, 欢迎来跟我们一起改善 BearyChat)
  • 面试的时候面试者是否需要写代码? ✔︎
  • 有在实践使用 Hallway 可用性测试吗?✘

与此同时,我们也有 iOS 工程师/前端工程师 的岗位正在招聘,欢迎随时来跟我们交流 :)

简历投递邮箱:ly@bearyinnovative.com

邮件标题:岗位+姓名

Hire - iOS 高级工程师

步入正题前,先祝大家新年快乐,希望在新的一年里大家工作顺利,感情顺利,代码没有 bug.

在过去的一年里,我们仍然专注于 BearyChat,并在 16 年底顺利完成了 A 轮融资,无比感谢大家的帮助与支持。新年新气象,我们也准备开始壮大队伍,为熊公司注入新鲜的血液~这次招聘主要是面向 iOS 工程师(接受小鲜肉实习生)。

我们对 iOS 工程师的期待:(实习生可酌情放低要求)

1、精通 Objective-C & Swift
2、熟悉 C/C++
3、熟悉至少一门后端开发语言
4、熟悉 Git
5、良好的英文水平
6、发自内心的热爱技术, 有探索精神

加分项:

1、简历附带有意义的 Blog/GitHub/StackOverflow/Douban 地址
2、熟悉 Clojure 或者其他 Lisp 家族的语言
3、熟悉函数式编程

我们能提供的:

1、有竞争力的薪酬,不会特别浮夸但是肯定对得起你的能力
2、五险一金,年终奖,调薪等等
3、相对弹性的工作时间(弹性≠加班),双休
4、每月固定金额的饭补和房补
5、每月一天年假,可以攒着用
6、入职时按你的需要为你购买办公设备
7、技术分享,愉悦的团队氛围
8、每天的下午茶就不多说了,还有不定期的 TB 和定期的团队旅行

欢迎志同道合的小伙伴加入我们。

简历可投递: ly@bearyinnovative.com

如果需要了解这篇招聘贴一切未尽的事宜,以下官方沟通渠道,运营妹子欢迎大家勾搭和联系:

BearyChat 官方博客:http://bearyinnovative.com

BearyChat 官方微博:@bearychat

BearyChat 官方微信:bearyinnovative

最后放出我们的负责人肉肉来镇宅

前端实习宝宝,快到碗里来

事情是这样的,有一天,熊公司党性最高的波波一言不合就买房扯证步入新的人生旅程了,在各位熊宝宝的祝福中,波波拉开了新婚第一天的序幕,波嫂带着波波去看了一场意义非凡的演出——“纪念红军长征80周年”(严肃脸)。

于是,我们意识到了,培养党(qian)性(duan)要从娃娃抓起。所以,这又是一则招聘帖,我们现在需要一枚写前端的宝宝。

职责:

  1. 与设计师和后端工程师协作,开发前端业务需求;
  2. 设计和实现前端框架;
  3. 前端程序的体验改善和性能优化;

要求:

  1. 大三以上或研究生在读计算机及相关专业学生;
  2. 有 Javascript 基础,熟悉 html5、css3,对前端应用开发有浓厚的兴趣;
  3. 良好的计算机基础,熟悉基本的数据结构和算法;
  4. 对现代前端工具和框架有一定了解,如:babel、angular、react、webpack 等;
  5. 有较强的自学能力和自我驱动能力;
  6. 具有良好的沟通能力;

我们能提供的:除了还算丰厚的薪酬,只要你投递了简历并切顺利通过我们的面试,成为我司的一枚前端宝宝,你还能收到来自 boss、Hr、以及前端各位男神 oba 们的疼爱。

欢迎志同道合的小伙伴加入我们,简历可投递: ly@bearyinnovative.com

想要了解更多的可以戳以下链接,美丽滴运营妹纸欢迎大家勾搭:

BearyChat 官方博客:http://bearyinnovative.com
BearyChat 官方微博:http://weibo.com/bearychat
BearyChat 官方微信:bearyinnovative