上周,我的第一个 Rails 网站上线了,关于跑步比赛的。提供上周六举行的杭州西湖跑山赛的实时成绩发布。功能很简单,但用户反应非常热烈,收获远远超出我的预期。有些东西想写下来分享给 ruby 社区的朋友们。
我是 2003 年非典的时候开始跑步了,从此一发而不可收,喜欢上了运动,喜欢上了跑步,从 04 年开始每年都跑马拉松/半程马拉松,08 年开始铁人三项,到今年已经跑了 10 年。家里积攒的奖牌已经放满了一个小储物箱,ikea 5L 的那种。(p.s.我高中长跑不及格,各位沙发土豆们不要说自己没天赋!)
大概是 08 年底上海马拉松的时候想起来可以做个比赛相关网站,大家上去查询交流比赛信息照片啥的。网站无关的东东有靠谱的人很快搞定了。网站这块自己啥也不会,当时网站相关的东西找了一个喜欢跑步的朋友一起做,技术很强,就是两个人都拖延了好久。墨迹到 10 年底说不想弄了,还是你自己弄吧。我 xxxxx!好吧,自己弄。
2010 年到 2011 年,工作转换和家里的事情有点多,这个就暂时放下了。
2011 年底,我觉得这个比赛网站这个事情再不做不行了,决定重新开始。一开始还是打算找外包,有相熟的同学是做外包的,谈了一下,觉得像我这样需求不明确的,外包很难接,最好还是自己搞。正好也看到 quora 上的这篇: Where is the best place to find a rockstar developer to bring an idea to life? http://qr.ae/TgiRg 嗯,还是自己做靠谱。那么开始学 Rails 呗。2012 年 2 月 23 日,注册 rubychina 社区。
大家都说 Rails 开发快,其实是个伪命题。对于熟手来说,Rails 的确很快。但是对于新手,Rails3 的学习曲线,上来很缓,按照教程上手很容易,但是一旦你有些非标准定制需求,找到应该怎么实现不是那么容易了-,- 不瞒您说,我第一次写 nested resource 花了两天才 debug 出来,form 的 post path 搞了好久才搞定。
中文资料里面@xdite 大神的 blog 很赞,写的两本书我也都买过以示支持,可惜现在内容有点落后了。 英文资料推荐订阅 Railscast,一个月几美金不贵的。Codeschool 课程很精美,不过内容覆盖的比较窄,适合入门了解,一个月的订阅费也不贵。 为什么只推荐付费的东东,因为付费的东东的确好,而且你花钱了更有动力学!
一个人做的很慢,做了一些小功能之后还是不满意,前端也完全没搞。做的乱七八糟的东东始终没有上线。不过所幸尝试过了很多东西,不少东东略懂了。
@knwang 在 rubychina 上开公开课的时候去听了一下,觉得还不错。他开中文班的时候就报名去上了,收获蛮大的。课程编排的很合理,live session 互动的效果很好。就是比较花时间,每周至少 16 个小时,10 个小时候真心不够用。推荐自学 rails 觉得有难度的同学可以去上上看。应该不后悔的:P http://ruby-china.org/topics/6717
课程结束收到提高班的邀请,虽然要 1k 多美刀,也毫不犹豫的报名了!目前还在上课中,总体非常满意。
2012 年 11 月的杭州跑山赛,是朋友办的。本来想让我帮忙做一下芯片计时系统(专业的芯片计时太贵了,要 1w 多一次),我做芯片读取到 pc 这块。后来测试下来通用的 RFID 没法用在比赛上,这个方案就放弃了。不过做的过程我想到可以手机人工计时,就简单做了一个原型,手机记录下号码和时间,比赛后手工汇总到电脑上。跑山赛的时候进行了测试,能 work,数据导出来传给的组织者,网站也没上线。比赛完了,这些东西也就丢在一边了。
去年底终于看了 Lean Startup,里面 MVP 的概念很赞。不过拖延症患者还是没怎么实践啊! @xiaolai 老师的 Knewone 上线第一天就看了,我的感觉就是:“这个评测好没有深度啊”,顺便回帖推荐了比 Jawbone up 检测睡眠准 N 倍的 Zeo,不过好像没有任何人注意到这个 Zeo。。。(p.s. 本月最新消息 Zeo 即将关闭服务,又是太细分的市场没法支持公司生存的例子。(我想做的是还要细分的市场-,-)) http://ruby-china.org/topics/8335
没想到后来 Knewone 后来会这么火啊,@xiaolai 和@lilu 的分享都有很多干货,触动很大。 http://ruby-china.org/topics/9120 http://ruby-china.org/topics/9585
过年前的是杭州的另一朋友给我打电话,说他们 3/24 要办比赛,问我能不能再帮他们搞计时系统。想想最坏情况就是想去年一样做成离线的呗,就答应下了。后面也没继续做啥。直到看了@xiaolai 老师的分享…
比赛前一个周末要去现场测试了,想想还是把实时发布加上吧,因为这个功能对我来说很有用。 周六一天写好手机端上传和服务器端上传的 code,因为时间有限,登陆功能不做,就用个 token 来做授权验证。(Token 这个是 Kevin 课上刚刚学的,现学现卖) 晚上部署到 linode 的时候发现悲剧了,总是 pipleline 编不过,debug 了一会儿也没排除干净。 干脆就用 Kevin 上课用的那个程序的架子,把代码移植过来,部署到 heroku 上。折腾到快三点,搞定。睡觉。 早上爬起来去杭州跟跑山赛组织者现场测试,没问题,数据都能收到,写好志愿者培训文档,收工回家。 这个时候,前端啥也没写,就是几个 scafold 出来的页面,稍微改了一点点。
周二的时候,想想前端实在拿不出手,就临时找了做前端的跑友@bullockzhou ,请她帮忙做一下前端,只有 html 和 css 啦,其他任何复杂的不要,晚上画好 mockups 发过去。
周三开始改前端的东东,周四拿到第一版前端代码,整合,还不支持 flow。@bullockzhou 觉得手机端实在太差,在周四生日那天还加班帮忙改好支持流式布局,各种感谢。。。
周四晚上拿到新版的前端代码继续整合,基本上可以见人了,加上 Google Analytics,new relic。半夜发现性能有严重问题,sql 请求实在太多,又看了一边 railscast 上的 eager loading,并改写 view 的一些代码,分组成绩列表页面的时间从 2904.7ms 降到 25.9ms。不过比赛那天才发现 erb 忘了写“=”,啥都没显示!幸好对大部分人来说不重要。比赛当天晚上才修正过来。TDD 很重要啊-,- 等下一版就 TDD 重写一边了。
另外组委会还提了个需求,本来需要增加个 has_many through 的,不想动数据库,直接条件判断 hard code 搞定。还有一堆各种小问题,忙到 6 点多才搞定,多年没这么通宵了。
上午起来申请微信公众账号,设置自动回复查询成绩的 url。 微博发布第一条信息,宣布上线,并提供 url 和微信二维码。因为发的实在太晚了,比赛前一天被只被转 40 多次。(一共四百多参赛选手) http://weibo.com/3178513797/zoAPurN0Y
比赛当天还是碰到一些问题的,比如前面提到的全部成绩列表没内容,有一个打卡点的手机时区设置不对,导致这个点部分成绩差了 8 小时。但是不影响查询单个选手成绩,是否经过哪个打开点之类的信息。我也跑在山里,没空处理。
跑完回来,看看网站情况,看起来还不会挂掉,有问题等赛后结束处理吧。
微博上的反馈非常好,除了表扬就是表扬。比如这条: “很给力啊,我老婆在酒店悠闲的刷网页,实时跟踪我,刚到终点线她就打来电话祝贺” http://weibo.com/1692963072/zoO1PB0Vx
比赛结束的当天晚上,整理数据,fix bug。搞干净了以后分组成绩终于可以用了。
@比赛控 微博两天一共被转发大概 70 次左右,从 0 开始到 78 个粉丝。微信公众账号两天涨了 70 多个用户,比微博还快,你懂得。这还是我只在微博和比赛网站上挂了微信二维码而已,没有在比赛前后做任何线下推广,当时怕搞砸了太丢人,还是太保守了。
网站最近四天 636 people visit, 1,170 visits, 7,708 views.对于 400 人的小比赛来说。我觉得覆盖率够高了。
需求是硬需求,要认真去做了,晚上跟@bullockzhou 谈,决定一起做下去了。 就酱紫。。。。
感谢 ruby-china, 感谢 kevin 老师,感谢@xiaolai 和@lilu ,感谢@bullockzhou
最后 插播两个广告:
Kevin @knwang 的 Tealeaf 课程非常好,没有 kevin,我不可能只花这么点时间就做出一个能用的网站并部署到 heroku 上线的。推荐自学 rails 觉得太慢或者碰到障碍的人都去上他的课。虽然他的课对于我们赚人民币的人来说有点小贵,但是,你自己时间更贵! https://www.gotealeaf.com
有没有爱跑步、爱马拉松、爱铁人三项的同学或者打算跑马拉松的 Ruby 爱好者愿意加入我们。我们先只是为跑友自己服务,先解决自己的硬需求,做有用的东西。 p.s. @bullockzhou 是设计出身的前端 mm 哦,自己会给 mbp 换 ssd 和内存,目前已经开始学 ruby 了。ruby-china 的众多男童鞋你们懂得!