我是通过 @sundevilyang 在上海的 #rubyconfchina# 上认识的 @poshboytl 和 @yedingding ,最近他们来北京考察了 36 氪的办公室,约了近期的 TeaHour 访谈,谈话是关于我本人和 36 氪的。
平常和人交流比较少,沟通有点困难,录制效果可能不是很好,这里给个文字版剧透一下,当然不全部涵盖,主要是说说 Rails 和 ruby-china 相关的。
介绍一下本人。男,88 年 11 月产自广西边境,姓名项新智。高二时候从个人博客兴起的时候开始接触互联网。从早期的 BSP 博客百度空间写 CSS 模板开始学习一些 HTML,结识一个域名爱好者搭建过 CMS,BBS 和 Blog,尝试做一些更改和定制,百万格子、分类信息,做过一些小作品如“百度空间发帖助手”等十多个博客周边网站(域名是 hibaidu.cn/net/org 形式山寨百度的 hi.baidu.com),访问量和用户都有不少,投放 Google 广告获得过几百美元收入。个人博客在百度空间也是早期访问量超过百万的用户之一。当时学的是 ASP 语言,用的虚拟机。
高三基本没心思学习,笔记本上规划的是所谓的产品设计,直到现在我一直喜欢研究行为心理。物理考试得分个位数后被辞退回家(我只做我会做的题目),买了台二手电脑,鼓捣 Linux 和 Firefox 浏览器,搭建服务器环境,折腾 WordPress,改模版改插件,学习主题定制,做过词汇测试,对对碰游戏等东西,学习过 Python 环境的 GAE 网站开发,做过一些小企业网站的外包。做过半年的建筑工。
在家里蹲了 3 年,然后去杭州和一个朋友开始创业,两周左右上线了电商网站优惠屋 (youhuiwu.com),自动采集国内一两百个电商网站的最新促销信息,加入返点链接,创建数十个微博帐号从新浪和腾讯微博上吸引粉丝为目标用户,较高日收入达到四五百,因为个人感觉有道德问题受煎熬,三个月后项目终止。
加入 36 氪至今快两年。从早期比较熟悉的 WordPress 开始作维护和模板开发,为第三方合作开放定制页面和内容接口,开发内部协作平台,维护服务器,做自动化数据报表,事务一直比较繁杂。去年 10 月底招聘到一名助手,负责线下活动宣传网页的制作,其实 36kr.com 整站还是我一个人负责的。别忘了我们还有针对创业者和投资人的产品数据库和创业服务平台 36 氪 Plus ( 36kr.net ),这是我们平台部负责的,此外我们还有市场部,负责线下活动、品牌、合作和广告销售。
36 氪成立于 2010 年 12 月 8 日,我接手的时候是 11 年 7 月 7 日,日 PV 5w,年底时候达到 15w,12 年底达到 30w,目前是 50w ~ 100w PV 每天。用户注册量从改版前 4k 左右到目前为止超过 5w。
我主导的两次改版都是纪念日这一天。上次改版我们选用了 ruby-china 论坛的开源代码,主要是底层的改变,数据库从 MYSQL 迁移到 MongoDB(MYSQL 转 MongoDB 是从 MongoHub 导入的,数据在 Adminer 下运行代码转换字段,文章、用户、评论、分类、标签均完整转换,HTML 转了 Markdown 格式保存,很难想象这么复杂的结构都是可视化转换的吧。。新旧版切换时,数据转换过程不到 10 分钟),服务器采用的是云主机,支撑每日 50w PV 的情况下,还没有作很多优化。最初上线的时候,评论显示性能较差,数据库进程导致服务器负荷偏高反应迟缓,因为新旧网站共存,图片上传的一个 Bug 导致将超长 HTML 塞入相关字段导致首页 500 错误达十多分钟,之后由于没有完整测试和后台误操作也导致过短时故障,一直运行还算正常。
去年 5 月开始接触 Rails,简单做过基于 Rails 的内部协作平台和招聘服务,有一点点背景,从决定改版策划到决定采用 ruby-china 源代码,包括后台功能和前端,历时三个月上线,这几个月里我住在公司很长时间,每天晚上都忙到两三点,冬天都基本没盖被子,睡几个小时起床常鼻血不止。选取 ruby-china 代码作为基础,是因为我一直关注它的代码提交和更改,应用之前有过较多了解,部分功能模块也可以毫无更改地使用,比如关注、喜欢、和收藏,我们改版前微博授权注册登录用户就超过 100 万,希望在这个版本中,提供针对读者的服务(目前数据显示收藏功能最受欢迎)。
36Krs-MacBook-Pro:ruby-china xiangxinzhi$ rake stats
+----------------------+-------+-------+---------+---------+-----+-------+
| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers | 1483 | 1174 | 32 | 172 | 5 | 4 |
| Helpers | 352 | 289 | 0 | 40 | 0 | 5 |
| Models | 1490 | 1126 | 24 | 99 | 4 | 9 |
| Libraries | 584 | 394 | 9 | 26 | 2 | 13 |
| Model specs | 979 | 812 | 3 | 0 | 0 | 0 |
| Controller specs | 611 | 516 | 0 | 0 | 0 | 0 |
| Helper specs | 354 | 283 | 0 | 0 | 0 | 0 |
| Routing specs | 58 | 43 | 0 | 0 | 0 | 0 |
| Request specs | 43 | 36 | 0 | 0 | 0 | 0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total | 5954 | 4673 | 68 | 337 | 4 | 11 |
+----------------------+-------+-------+---------+---------+-----+-------+
Code LOC: 2983 Test LOC: 1690 Code to Test Ratio: 1:0.6
36Krs-MacBook-Pro:ruby-china xiangxinzhi$ cd
You have new mail in /var/mail/xiangxinzhi
36Krs-MacBook-Pro:~ xiangxinzhi$ cd 36Kr
36Krs-MacBook-Pro:36Kr xiangxinzhi$ rake stats
+----------------------+-------+-------+---------+---------+-----+-------+
| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers | 3450 | 2824 | 43 | 324 | 7 | 6 |
| Helpers | 1205 | 897 | 2 | 126 | 63 | 5 |
| Models | 3029 | 2301 | 43 | 197 | 4 | 9 |
| Libraries | 3144 | 2524 | 43 | 232 | 5 | 8 |
| Model specs | 994 | 824 | 3 | 0 | 0 | 0 |
| View specs | 85 | 70 | 0 | 0 | 0 | 0 |
| Controller specs | 787 | 637 | 0 | 2 | 0 | 316 |
| Helper specs | 384 | 291 | 0 | 0 | 0 | 0 |
| Routing specs | 93 | 69 | 0 | 0 | 0 | 0 |
| Request specs | 54 | 45 | 0 | 0 | 0 | 0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total | 13225 | 10482 | 134 | 881 | 6 | 9 |
+----------------------+-------+-------+---------+---------+-----+-------+
Code LOC: 8546 Test LOC: 1936 Code to Test Ratio: 1:0.2
我想说我一直是抱着学习的心态,几乎没有可以分享的经验,只是实践自己的想法,我日常工作的大部分时候,是用本子记录想法和收集反馈,研究访问数据,习惯夜间毫无干扰的时候开始编码工作(白天杂务过多容易烦躁)。平常 Ruby China,V2EX,Hacker News 都比较关注,每日造访。36 氪的文章我不会每篇都看,但有时确实会错过一些好东西。