全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Xu Tao
CODE 开发实践
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
摘 要 • CODE 是什么
• CODE 的起因
• CODE 的构建
• 案例分析
• 一些相关工作
• 案例启示
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
分享者
2010 本科毕业
2011 Hyenae 软件工程师
嵌入式, C
2012 STDYUN
Python, SmartOS
2013 豆瓣产品开发工程师
Python, CODE
2014 豆瓣运维工程师
补全各种技能中
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
案 例 • 代码协作平台
– 代码仓库
– 代码 Review
– 与内部系统互动(CI, UP)
– GIT
– 开发 2 年半的时间,仍然在继续
– 共有 90+ 个工程师参与
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
• SCM & Project Management
• Subversion (SVN)
• Enterprise-class centralized version control for
the masses
一切从Trac开始
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
• SVN 在协作上有一些问题
• 主站拆分
• 尝试新的版本管理工具 (Mercurial, Git)
• 工程师之间代码 Review 低效
• 这个时候看到了 GitHub
• 没发现满足我们的开源项目
• 工程很有兴趣做这件事情
为什么
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
100 CASE STUDIES
OF THE YEAR
怎样做到 • 从改 Trac 做起
• 加入 GIT 支持
• DAE APP
• 移除 Trac 代码
• 现在的样子
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
DAE
• DoubanAppEngine
• Python PaaS
• 动态 WEB 服务,支持异步/同
步模型
• MySQL 数据库
• 永久文件存储系统
• 自动负载均衡
• API: Email, Sentry, IRC,
Memcached, Beanstalkd, Redis
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
架构
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
前端
• OzJS
– OzmaJS
– grunt-ozjs
– grunt-dispatch
– grunt-furnace
• JQuery
• Grunt
• Bootstrap 2
• FlatUI
• CodeMirror
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
GIT
• HTTP – 上传/下载代码 (git clone, pull, fetch,
push)
• SSH –上传/下载代码 (git clone, pull, fetch,
push)
• WEB – 代码查看,代码管理,代码 Review
(commit, blob, tag, reference, diff)
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
GIT HTTP
•
– 一开始用是这个
– 一个很诡异的 SubprocessIO 的类
– 需要更多扩展
• Sina (GitHub: douban/sina)
– 于是有了我们自己 HTTP 前端
– 替代
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
GIT SSH
• Maria (GitHub: CMGS/maria)
– SSH 支持做的比较晚
– 基于 gevent + paramiko
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
GIT WEB
• Pygit2 (GitHub: libgit2/pygit2)
• Libgit2 (GitHub: libgit2/libgit2)
• Ellen (GitHub: douban/ellen)
– CODE 常用命令的封装
• 一开始使用的是 GIT 命令,但是发现性能太
差,于是就开始调研第3方库,最终选中了
Pygit2,但是这个项目也不是很成熟,WEB
加速是够用的。
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Project
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
代码 Review
• Pull Request – 主要的工作流
• Comment – 沟通
• Notification (Email, IRC, Slack, Web) – 实时提醒
• Real Time (Comment, Merge, Close) – 实时交互
• Timeline (Merge, Push, Close, Open) – 实时动态
• Team – 把程序员和项目组织起来
• Hook (CI, UP) – 集成测试结果
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Diff
• Side by side view – 方便对比代码更改
• Normal diff view – 方便对比代码更改
• Track file changes – 跟踪文件改动
• Custom fonts – 定制代码字体
• Line comments – 逐行代码沟通
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Fork
• Everyone’s repo
– 每个人对自己的仓库拥有所有权限
– 对上游仓库则无权限(一般)
• 权限分离
• 防止主仓库被误操作篡改
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Pull Request
• Merged by Owner
– 代码一般要经过大家的 Review 才能合并
• QACI states
– 可以看到 CI 的状态,成功或者失败
• 仅对讨论改动部分代码
– 讨论有针对性
– 支持扩展到没有改动的部分
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Pull Request
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Pull Request
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Team
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
代码流
• Hook – 触发其他系统
• Notification – 多种提醒
• UP – 部署代码
• QACI – 持续集成测试
• Fork & Pull Request – 提交更改
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Flow
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Dashboard
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
其他
• Badge – 徽章,荣誉(土脚本,重构达人,剪
刀手,讲师,测试达人,开源好心人)
• Praise – 赞扬,由衷的表扬
• Gist – 代码片段
• P – 图片存储服务
• CodeCLI – CODE 的 CLI,很好用
• Linguist – 代码语言统计,这个故事很多
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Badge
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Praise
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Gist
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
CodeCLI
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
User GIT Flow
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Timeline
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Issue
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
一些数字
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Who
• 谁在用 CODE ?
– 工程师们
– HR 有仓库哦
– PM 偶尔会冒个泡
– 其实大家都可以用的
• 谁写的 CODE ?
– 一些核心开发者 (10个以内)
– 实习生们
– 热心的使用者也会经常贡献代码
– 绝对零散的开发模式
– 只有过一个全职开发者
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
HR
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
HR
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
相关工作
• GitHub
• GitHub Enterprise
• Bitbucket
• Stash (Bitbucket)
• Gitlab
• Gerrit (Android)
• GitCafe
• GitCafe Enterprise
•
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
愿 景
开源
• 开源能够开源的库
• CODE 作为一个应用完整的开源
• 期望更多的人可以使用 CODE
• 期望更多的人能够参与CODE开发
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
案例启示
总结
• 兴趣 + 需求
• 小步迭代 (快速实现功能)
• 适当的重构
• 同开源社区合作 (Libgit2, Pygit2, …)
• 依赖现有系统 (DAE, P)
• 开放接口 (API)
• 统一入口,不规定实现 (代码, 上线, CI)
全 球 软 件 案 例 研 究 峰 会
100 CASE STUDIES
OF THE YEAR
Thank You!