开发过程,这个事我也没有真正研究过,我想英国维基百科上,我看了一大废话,软件开发过程是开发软件的过程,我找了中文的说软件开发是根据用户 要求建 造出软件产品开发的过程, 这两个哪个好一点豆瓣开发是在有限人力资源下按照网站需要开发的过程,豆瓣一直到现在虽然我们也出了一些手持设备应用,但是从基本上所有应用都需要联在 网上,还是一个互联网公司。互联网公司最重要一个特制是快,需求变化也快,上线也快,产品经理天天追你,工程完成没有,今天能不能上,但是豆瓣有另外一个问题,我们人员相对比较少,是因为我们经营一些技术还有说我们一些想法理念,在后面会谈到。
所以,我们总结了一下,我认为这个豆瓣开发部门文化,创业团队的文化我觉得有两点特别重要,所以我想分享一下一个就是效率,我们非常坚持效率, 不管是工作效率还是开发效率,这个是非常重要的,因为会直接影响到你的效率。另外是团队热忱,创业团队,开发一个东西的时候什么时候是最有效率,什么时候产出率 生产出来代码好,自己一个人有一个特别好的点子刚想出来熬夜做出来,这个时候你的工作效率是特别高的,最后豆瓣反映在创业团队里面就是热情,如果没有热情不能一直非常高效的开发工作。
说到效率豆瓣有一些经验是非典型的,比如说第一个我们选择用python这个语言,愿意就是大蟒蛇,这个高级语言对我们来说其实是有利有弊,首 先它的语法是类函数式编成混合,很符合开发人员胃口,想这样做就这样做,那样做就那样做,两个都支持,都可以考虑,另外是脚本语言,腾讯说到上线过程中要有专门 服务器,我们不需要对准服务器,我们是脚本上去以后我们就可以直接跑了,但是也有一些弊端,是高级语言是动态化,带来一些非常难解决的问题,在运营过程中 某些问题才能体现出来,我们发现已经非常常见问题,循环进入,但是当你代码规模越来越大的时候,之间交互关系特别复杂,一旦没有控制好模块,我引用你,你 引用我,跑的时候逻辑不是这么简单,涉及三四个模块,人没有发现这个循环,上线跑程序直接就不行了,这个是很要命的,我们也做了一些工作,还没有解决这个也是我们需要解决的问题。中国有一个很活跃的python圈子,python语言用于web是非常好的选择。
说一些实际例子我们看一看实际怎么用的,这里面一个任务是一个交互式直行页面,python非常大的优势是可以交互式执行,在交互式可以直接用 一条,这个文件前面出现第一个提示符做了一大堆工作,把所有豆瓣网站代码都已经启动起来,可以无缝调用代码,做一些调试,运维工作特别重要,因为有些工作比如说 我把某一个有问题缓存清理掉,有一个人什么东西丢了,我查一下看看具体后台数据有没有,这些工作是用代码里面的某一行调一下就知道了,这个东西节省我们大量时间。
MC是我们内部用的一个访问缓存系统标准接口,后面可以把这个页面取出来,这里面也涉及到python另外一个优点,高级语言优势在这儿显示出 来。另外一个节省时间python是一个非常有历史语言,出现时间跟Java是一样,这些年发展过程中有第三方人写一些非常好的代码功能,我们是可以直接拿出来 用,这个是豆瓣代码里面截取出来,上面三行PL是美国一家公司开发处理图象的一个软件包,我把某个图片调一下透明度,下面可以给某个图片加上一个水印,这两个简单功能有这些第三方工具支持下可以很容易的写出来了。
另外一个非常重要的高效率的方式我认为也是创业公司,并不是说特别注重我们现在每个团队都是创业团队,我们做任何事情并不是说把这个东西限制 死,我现在上线系统启动起来,有一个专门做这个上线事,我们发布一个上线流程,最后大家都来批单子,豆瓣是说有需要上线事物过来跟我说,我们相信内部沟通比烦琐过 程更有效,尤其是豆瓣人数并不多的情况下,我不是攻击其他大公司,我相信人数到一定数量的时候有一些必要的流程是要走的。看一下开发流程,对于一个开发者 来说基本上这些东西都是每天每个星期都要接触的,要做一个事情,今天我要给图书频道加一个新功能,程序员把程序主干搞出一份作为分支,生出一个新的小芽, 这样的话,不管我提交跟其他代码不影响,剩下就是开发,改程序提交,测试,甚至把其他人拉过来,工程师有没有时间帮我测一侧,这些事都做完以后,剩下最没技术含量上线工作。
但是这个开发流程并不是唯一的流程,我们流程随时是可以拿掉的,可以看一下这个,作为一个很常见情况要预测所有事情有可能出问题,包括硬盘我们 觉得用几年没有问题,到机房一百台机器基本上每天都有硬盘坏,比如说紧急上线我出问题,导致上线上人完全不可用,用了以后会有各式各样的问题,这种时候要紧急上 线,出了一个问题赶紧修,两分钟修完了,大家看看修的有没有问题,没有问题,马上帮你上这个就是过程,可以说一个例子,星期五有一次紧急上线,这次上线是 四分钟,发现问题,到修改,最后所有都完毕,这个能力是非常重要的,因为作为一个互联网公司我们保留一个传统,带来一个问题不可能把所有大的都在前期解决 掉,因为现在要维护产品也是非常多的,在所有这些每天都会有代码提交情况下,要保障完全覆盖两个测试中心每个公司都做不到,我们允许出现问题,所以上线的时候大家要在那盯着,一出问题上线工程师直接把上线过程暂停,谁谁出问题了赶紧修,这个是非常好的办法,如果我没计错是从Facebook学来的。
把上线流程详细说一下,实际上后面还是有正常环节下还是有很多工作要做,比如说开发以后首先代码要复审,在开发过程中每天团队要看看这个代码怎 么样,复审过程中图片上看到一大堆人对你的代码指指划划,团队复审是促进团队交流系统越来越大,里面架构,各种需要注意的地方越来越多,这个事情并不是每个人都 能意识到,尤其是对于新加入豆瓣的员工,通过代码复审,尤其是新员工入职前保证基础开发知识,代码规范在团队内进行良好沟通,包括团队内部也是每个人做不同事情,做这个产品我之前没有接触,如果没有代码复审团队内部交流,虽然在同一个团队工作对某一些代码是不清楚的。
测试在豆瓣也有非典型,测试这个活由开发测试时工程师共同复杂,单元测试,web测试,所有这些东西开发工程师必须了解,学习,必须使用,这个 过程中为了提过效率有一些自动化系统帮助工程师做这个事情。一个最重要目的就是说测试并不是由软件质量代码质量并不是由测试工程师决定,这个工程师起到事后弥补 作用,代码质量源头是开发工程师,没有对测试美的追求的话,可能写不出好的代码,应付一下今天要上,赶紧拷贝粘贴。所以我们希望每个人都有质量意识,有了 前面这些东西以后,对于豆瓣来说工具是一个很大程度提高工作效率一种手段,工具包括很多方面,豆瓣我们可以看一下这几个例子,交互式执行,有些东西是不适 合我们做,有些东西虽然不是上线给用户用,但是也是一长段代码,tools有大量上百个脚本是以往留下来,这些脚本实际上我认为凝结前人一些智慧知识,比 如说我下来要发一些信,考虑我从头写,学习一下豆瓣内部怎么发邮件,有了tools有人会告诉新员工不用,搜一下,搜一下就可以发现很多版本,每个代码是经过很多人验证的,在线上运行很久是经过实践的经验。
下面是有一些截图,是做代码静态扫描,很多毛病只有真的跑起来才知道,但是软件写到后面分支那么多没有办法在测试的时候把所有分支再跑一次,需 要扫描所有原代码元件,包括这里面显示,有一个自己扩展能力,写了一些豆瓣自己扫描代码的小工具放进去,扫描话段引用,发现三个元件可能有问题,这行代码要用某一个函数处理一下,这个可以提醒开发者有一些隐患,这个里面已经包含一些问题,写的时候不用说自己要去跑来跑去的,把所有东西都折腾一次。错误日志是web公司强项,所有错误都在自己的服务器上,但是有产生另外一个问题,同样分布在很多机器上,可能尤其是有运维人员维护并不是每台服务器都能上去,我们 开发了这样一个工具,目的把所有出现错误日志抓下来,会把每一个当时出错现场涉及每行代码留下来,把每个当时涉及变量值保留下来,包括用户当时访问这个的 时候带着各式各样变量之类的,让我们的程序员可以专注于说在一个地方发现所有问题,比如说我上线了,代码上线出没出错,首先要高优先级错误,我刷半个小时 发现没有错误,可能出新一两个其他的东西,看一看,是我还是其他人,出去是其他人可以通知他一下,让程序员调试里面解脱了,包括出错怎么回事,点开可以看到当时出错用户请求传过来的东西,大多数时候可以改程序不用做本地环境复建等等。
另外我们也需要一些提高网站效率的工具,豆瓣资源少不光指人,包括我们服务器也很少,所以服务器上面程序执行效率对我们来说意义很重大,可以帮 我们省很多钱,我们很早的时候做了一个工具,可以在线跑,刷一个页面,底层有哪些语句,运行情况怎么样,哪些是热点,执行特别多,花费时间特别长等等之类的,这个是对我们非常有效率的工具,用了这个工具以后平均访问时间保持在一个比较小的范围之内。
这些工具还是需要人去执行。我们希望这个工具让计算机自动做,我们可以做更多事了,最简单web测试,我们把它框架建设起来,也建立起来自动化 的方式,之前程序员一个一个测试,跟我们报表结合起来,只有在程序员做完以后提交,提交以后程序自动考,没有消息就是好消息,没有收到邮件说明你的代码很好已经通过了,如果收到邮件就要赶紧修,所有后面人也会收到同样报告,这里面只有功能失效才会发警告信。
说了这么多东西,但是我觉得最核心一个,也是对豆瓣来说保持开发团队创造力的一个很重要方面,就是我们给大家提供很灵活选择空间,回想一下现象 独立开发,创业团队高效率原因,一心铺到上面去,他做的是一个全新前人没有做过的事情,因为没有前人经验,所以从用户角度对这个东西做设想,分析所有里面利益, 他会选择一个最好的方案去做,这个过程中如果没有这些东西只给他限定一条路线,你只能用python就不好玩了,我们希望程序员有一个更灵活选择空间,希望团队能够不断接触新的机制,技术,把这些技术应用到豆瓣开发里面来。
我们有一些基础的设施,就是通过这种方式逐渐实现起来的,比如说我们有一个分布式数据库方案,我们内部也做了一些其他东西,这个东西接口非常简 单,只有放进去,取出来,删除就这么几个操作,有了这样基础设施开发者有省事了,这个时提高效率非常重要的方面。包括前面说的我们可以自由选择设计方案,这个自 由也是有限度我们公司也有架构师,我们会一起讨论这个新项目打算怎么做,选择这个东西跟现有有什么好处,所有东西都是在大家广泛沟通之下达成共识,比如说 豆瓣有一些项目是用django做的,还有一些其他的,类似的也有,我们开发方式,豆瓣是一个非典型,用了一个python,但是python也不是必选 项,有用C的,有一个算法R,这些东西也都有,通过给大家更好的选择空间我们希望避免我们内部架构,技术僵化,希望提供一个更像创业团队自由用最好的方式把这个事做起来。
我们相信所有这些我们自己都做完了,如果大家团队死气沉沉,干活没有什么兴趣,我想这个公司不用创业,直接就可以倒闭,我们非常强调工作热情, 里面人,环境成长这些都是非常重要的因素,我们的员工都是平等的,开发部门,技术主管,我们架构师,我们所有运维,我们开发等等所有人都是可以开发的,而且直 到今天大家也还在做开发工作,我们希望通过这个东西可以让大家能够感受到我们真的是一个团队,我们讨论问题的时候也不会说像一个领导,大家都懂技术大家可 以进行真正沟通,选择我们用什么东西,所以我觉得工作热情一个员工是肯定不行的,引用一下Facebook前工程总监一句话,他说永远将招聘作为你的第 一要务。
当然豆瓣虽然没有把它作为这么严格的重要一点,但是豆瓣来说实际上招聘也已经相当于我们第一要务,我们对于招人非常谨慎,几年时间下来我们人数 并不是增长特别快,我们招人有很多要求,当然这个要求并不是要求你有这个能力,那个能力,我们觉得最后最重要一关就是前面说的,我们要保持工作团队热情, 所以你这个人不管你再牛,要能跟团队和谐工作,大家在一块做得很好,不能说我能力很高,我来了以后就看其他人不顺眼这个团队就完蛋了,所以我们招聘工作会 邀请所有招聘员工团队甚至于跟这个团队跟他可能会产生合作的人都来面试一下,确认这个人是符合豆瓣,适合豆瓣,我有一个课题放在这儿,可以用非常好的办法实现,可以用一个团队成员能够接受方式做创新这个是非常重要的事。
还有一个很重要工作环境,很多人到豆瓣办公室去过一次,用一句话说你们环境真是不太一样,很开放。另外现在我们选择在798,相信很多人去 过,798都是大厂房,科工委保密机构,甚至于之前我们租办公室是在中间再加一层,豆瓣去了以后把那些都给拆了,我们鼓励大家交流,讨论,所有桌子是没有隔板统统在一起,现在挤了一点,我们又租了一个。
我们说软件环境,我们希望开发工程师最重要是替产品经理把事做成了,做好上线了,我们希望其他杂物能替他多节省一些时间,豆瓣集中一个例子,看 到把当前代码直接数据库初始化,一键式工作环境,希望把这个东西做成尽量简化,这个相对来说还是算比较快。还有一些已经配制好开发虚拟机,不管你在哪,办公室家里面联上就可以了。
说了各式各样的东西,其中提到一点尽量少限制,尽量不做一些行政方面强制的东西,比如说有了测试代码,是不是要有一个代码覆盖率,这个很多时候 会成为你工作一个指标,如果达不到80%,在豆瓣我们尽量不会做这种限制,我们更多是给一些建议,你这样做会比较好,但是你也有其他选择,如果有其他选择沟通一 下,确实好我们就让你做,这是一个我们高效很重要原因,如果你把所有事情限制死了,大家在一个框框里面工作就没有什么创新可言了,行政限制里面有时候也是 必须做一些的,比如说要求写单元测试,我们不要求测试的覆盖率。
还有一点就是我们尽量鼓励中产生一些明星出来,不像影视明星闪闪发光,开发部门出来一个牛 人,做了一个特别牛的事在开发部门都是一个明星,跟影星等级是差不多,我们更崇拜这种明星,明星有示范作用,做出一个好东西,这个人做得太好了,同样工作 用了一天搞定了,他做出来的分布式数据库用起来太方便了,通过他的示范效应会把这些好东西向所有团队推广,出这么一个人所有人都会拿来用,去学习,但是要 考虑到团队里面有各式各样人,性格是不一样的,有的人特别喜欢造新东西,搞一些前人没有做过的东西,有爱研究新技术,语言增加一个新特性,用在我们网站上特别好等等,还有有洁癖的,我也是我还跑来搞QA,有洁癖就打发他去做QA或者做单元测试。
这个里面还有一种是任劳任怨,默默工作,起得比鸡早,大家都知道了,这种老黄牛精神人本身性格不愿意做明星,这种人我觉得必须要加以鼓励的,可 以通过跟大家在某些时候跟大家肯定他,让团队人知道他这样做法给我们带来什么好处。每个都有自己角色,位置我相信每个人只要充分发挥他最擅长的东西,让他做自己最感兴趣的东西就能够把事做好,像自己独立做事情的人,对那个东西特别捉迷就能做好,很不感兴趣这个事就给你撂挑子了,干也干不好。说了一大堆让员工给我们奉献,员工自己也是有需要,豆瓣我们希望做各式各样事情让大家能够每个人都成长提高
我们做代码复审等是一种技术标准, 另外我们有一些团队内活动今天这位同学读了一本书,看到有一个东西特别好,我们到会议室聊一会儿,团队合作把团队之间知识进行交流,我们也有一些培训,开发部门,测试部门,我有一些知识可能大家了解不清楚,可以给大家讲一讲,大家一块来探讨一下,另外我们每个月允许员工购书,世面什么书特别好豆瓣没有我们可以帮你买,看完了可以讲一讲,还有一个活动就是Happy Day,设计一个游戏大家一起来玩,推广单元测试知识我们设置了一个,是一个真的游戏,有一个小游戏关于一个人配一把剑、盾,今天我们要做的事大家都知道 A组上来以后写单元测试,B组实践这个单元测试,下面C组写一个单元测试披露前面人的问题,形成挑战赛,这是非常好的推广方法,但是这个过程中一定要跟其他团队合作协调一下,产品部门说又拉出去,一个月搞很多次,要处理好大家之间的关系。
前面所有东西都是围绕着一点,人是最宝贵的,人来的以后不要玩命用,不要老加班,要更好的一个环境,更能激发他们环境做,这个实际上可以参考一 下自己,我相信大家都是开发出身的,自己开发过程中曾经觉得压力很大的时候有哪些事是你不能接受,有哪些如果那样做肯定我会工作更舒服这些事情是我们在团队里面要时刻注意,我们要善待自己,善待员工,自己不愿意做的事情,也不要强加到员工身上。