分类目录归档:百姓网

谁是创业公司招聘的负责人?业务!

谁是招聘负责人?1)HR 2)业务负责人

答:业务负责人。

以一个公司为例,找到业界最优秀的人,吸引他们加入公司,是CEO之职责还是HR?我认为这是CEO负主责任,HR是副手。业务负责人也是一样。业务负责人负责公司的一条业务线,并对这条线的最终结果负责。

招到并用好需要的人,是这个业务负责人达成目标的必由之路。业务负责人对于招到人负总责,需要和HR一起招到好的人。这也避免两个问题:一个是责任不清。如果HR负责招人,一条业务线达不成目标最经常的借口就是HR没有按时招到人。即便是招到了,会说招到人不合适,所以达不成目标。当一条业务最重要的成功因素不是自己的责任,很容易出现全公司的问题都是HR的问题的局面。第二个问题:千军万马挤独木桥。如果各个部门都要HR负招人的总责,协调各部门的人员要求变成难题,各个部门不被授权招人,产生了吃大锅饭的情况。只有把责(业务指标)和权(可以招人)合在一起,放入业务部门,才能解放生产力。

例子:显然,百姓网在完成这样的观念转变的第一周,就有了来自移动业务线的第一个招聘微博,24小时内转发过1000。我想这就是是放了的生产力。

62065918jw1e6bt777uacj20m83gox3z

《百姓网须知》初稿

  • 百姓网是本地的。请仅在一个城市发帖,如果你的帖子需要出现在多个城市,百姓网可能不适合你。
  • 百姓网是分类的。一个帖子请只发布在一个最相关的类目。请不要重复发布相同信息。
  • 百姓网是为见面交易设计的。卖家发信息,留电话,见面交易;买家看信息,打电话,见面交易。非见面交易在百姓网上有巨大风险,请避免。
  • 百姓网是公平的。我们限制每个人每个类目的发帖数量,我们相信这个限制对绝大多数用户是足够的。请不要注册多个帐户发帖,不允许用机器发帖。
  • 百姓网的信息是新鲜的。所有信息按照发布时间排序,发布60天后删除。我们相信越新鲜的信息越有价值。
  • 百姓网的信息是用户发布的。象现实社会一样,难免有骗子,请提高警惕,只相信见面交易,发现骗子立刻举报。
  • 百姓网的付费产品是市场定价的。为了保证效果,我们严格限制每个类目付费服务的数量。买的人少就便宜,买的人多就贵,百姓网不参与定价。
  • 百姓网是为大多数人服务的。为了服务大多数用户,大多数城市和大多数类目,我们不提供只服务少数用户的功能,以保证我们有限的资源可以服务更多的用户。

为什么百姓网开源?

2012年9月6日,百姓网的第一批项目开源发布。其中包括前端的模版语言Jedi(Hax的作品)和后端的数据访问层Baixing Graph API(小排作品)。这次发布是小范围的,仅仅是第一个尝试,以后每隔一段时间我们会把做出来的东西拿出来和大家分享。

为什么要开源?在中国的互联网环境中这么做是不是太另类了点?

1. 署名原则

在写这篇文章的时候,我在考虑开源的事情。

第三,署名!!!!我刚刚注意到这一点。为什么在出版领域,作者,记者,专栏作家,甚至blogger,微博,都是署名的,而只有程序员在大多数软件和互联网公司是不署名的?署名是很重要的权力,为什么号称先进的软件/互联网行业没有采纳呢?

我希望百姓网的工程师的作品是署名的,而且向公众发布的,这样一个优秀的程序员的作品可以被更多的人看到和使用。

2. 发现组织的错误

我并不担心因此我们最好的程序员会流失,因为如果这件事情发生,仅仅是因为这里已经不是一个最好的工作场所了,不是生产效率最高的环境,周围已经不是自己最欣赏的人了。如果这些条件发生,把hacker保护起来不被外界知晓仅仅是皇帝的新装。我宁肯暴露这里的不好,并且努力做到业界最好。因为死,仅仅会因为自己做得不够好而死,而不是暴露了不够好而死(暴露只是加速了死亡)。赵赵分享了一个关于错误的TED视频。Kathryn问大家犯错的感觉。大家说“有压力”,“难堪”,但她指出,这仅仅是意识到自己犯错的感觉,而真正放错的感觉,就是“我做得很对”。我希望如果我们有任何做得不好的地方,让我感觉到那种知道犯错的感觉。

3. 提高质量

如果知道代码会被所有人看到,我们每个人会写更好的代码。让我们面对它吧,即使开源也不会有多少人真的关心的,但这种可能性让自己有更高的标准。当每个人的工作都考虑到开源的话,代码很自然的模块化了,很自然的需要思考和别人的模块的交互。

4. 找到最好的人

很快百姓网的技术人员面试会完全转移到GitHub上面去,如果希望加入我们的团队,只需要找到任何可以改进的地方然后发Pull Request过来就好了。我希望当我们见面的时候,双方都已经非常确认了。如果未来的百姓网有任何的功能你不喜欢,如果你又是一个Hacker,直接撸起袖子写程序就好。怎么让这么多人的程序有一种办法(除了苹果那种审核以外的做法)可以共存呢?恩。好问题,等着你来解决。

总之,我们持续的寻找全球范围内最高效率的工作方法。开源是不是最高效率的方式我们还在探索,但这个追求是恒定的,不变的;而对效率的追求就是这家技术公司的灵魂。

 

 

压制了贬义词就压制了褒义词

那天我提到Hacker的反叛精神,有人问:如果无法无天怎么办?如果。。。怎么办?我说,要的就是无法无天。

同义词的褒义词和贬义词两种说法很容易让人代替思考。

我在想,其实当我们用褒义词形容一件事情的时候,我们很接受;但是如果拿贬义词形容同一个行为的时候,我们就反对。但关键,正如同义的褒义词和贬义词的定义所揭示的那样,这个褒贬代表的不是事物本身的好坏,而仅仅是观察者的好恶。如果是这样,排除了自己的好恶,你到底是接受还是不接受呢?

真正想明白一件事情,是用贬义词对这个事情描述一下,如果依然能够接受,才是真正接受,否则仅仅是一个语言游戏,并没有思考到事情的本质。当我们压制了贬义词,就压制了褒义词,因为这两个就像用两个reference到同一个内存地址的变量,改动了一个,另一个也就改变了。

怂恿就是鼓励,吹捧就是赞扬,武断就是果断。如果当自己理直气壮的内心接受别人用贬义词来形容自己的时候,就是真正坚定的时候。

比如创业公司因为尝试太多,随时上线导致了服务器不稳定。第一个想法就是加流程保证服务器稳定,但当我们开始做这件事情的时候,也就必须接受我们在压制创新。这很难接受。对于服务器的down,eBay的办公室里面写着一秒钟的宕机意味着多少多少美金,一看就是不懂技术的CEO的思路。而Facebook的墙上写着:Move Fast and break things!  Move fast我所欲也,not break things亦我所欲也,两者不可兼得,break things而move fast也。

我们太容易头疼医头,而忽略了它带来的副作用。问个问题:当一家创业公司如果一年了都没有服务器瘫痪一回,是不是什么地方出问题了呢?是因为系统维护做得太好了的可能性大一点,还是跑得不够快的可能能性大呢?

 

Github vs SourceForge

最近一直在用GitHub,再看一下SourceForge,对比一下。比如:

比如这个项目:https://github.com/mxcl/homebrew

再看看这个项目:http://sourceforge.net/projects/clisp/

感觉不一样吧?(不是比较两个项目,而是类似的项目放在不同的地方的感觉)

一个2001年闭源,10年没有变化的SF,和一个每天都有惊喜的GitHub,我们要做哪个?

一个千方百计用广告赚钱,把广告商的利益放在前面,而用户的利益放在后面,和一个为了用户着想,用户回来付钱,我们做那个?

我们如果关心的不是熊猫用户,就像SourceForge不关心程序员一样,必死。(虽然需要10年的破败期才会真死,但放弃用户的那一刻这个公司已经死了)。

不好了,池子漏了

周末在杭州给天使湾的十几家移动互联网公司分享,看到他们做的东西,和庞小伟聊了聊,得到如下思考,和大家分享。

2012年是传统互联网公司遇到前所未有的挑战的一年。

从1995年开始,中国的互联网网民就不断的增加,每18个月网民总数翻番的速度几乎没有停下来过。如果看看当年中国最大的门户网站新浪上市的时候日浏览量只有1000万,而现在随便一个网站都有可能超过千万就能知道这十几年的发展速度。不过,坏消息是,这种增长从2011年开始放缓了。现在中国5亿网民,我可以非常自信的预测,中国网民数永远不可能翻番两次了。在之前的10年,每天都有新用户,对于网站来说永远有机会,新用户就算是平均分配也有不错的增长,而增长低于两年翻番就是落后。而这种情况,变了。互联网的人口红利,第一次接近发完,传统互联网增长压力剧增,看看最近的一两年,很多的报表都在显示网站增长速度放缓,从百度,腾讯的网页到第二梯队的大多数网站,都是一样。

屋漏偏逢天下雨。在过去的十几年里面,互联网的网民数只增不减,无论什么时候拉上来的网民,都在一个大池子里面,这个池子从来没有漏过水。但是,从2011年开始,这个池子开始有了一个大窟窿,这个窟窿就是移动互联网。越来越多的用户迁移到移动终端上。虽然不是一去不复返,但是在PC上上网的目的,时长等发生着重要的改变。

看看移动的这个窟窿有多大!现在智能手机大约4000万终端,但这个数字很有可能在未来的3年里面达到4亿(3年还是5年不是关键,关键是短期一定能达到这个数字)。如果真的是这样的话,以Android,iPhone为代表的智能机用户每个月可能就要新增加1000万,这是一个大得不得了的数字,是一个不能忽视的人口红利(天哪,不是红利,就是本金派发了)。

同样,我们看一下智能手机的移动客户端的安装量。现在一般的安装量在100万以下(包括我们的)。一些300万左右的是比较大的,超过1000万安装量的几乎就是人手一个了。新浪微博,微信,大众点等等。但是想想一下,再过3年,会出现什么状况?一个普通的应用的安装量应该在1000万以上,智能手机安装量过亿的将会诞生。这是一个非常大的机会。我们这里仅仅探讨智能手机,就是Android,iPhone,其他的终端暂且不算作移动互联网。

而手机领域,一定和网站领域不同。一定不同。具体的不同我还没有特别的感觉,但需要恶补这方面的知识才能够在这个领域不被甩下。隐约感觉互联网是主机的一张脸,让用户过来看这张脸,而移动互联网是用户的一张脸,用户打开的应用应该就是非常个性化的自己要的东西。移动互联网绝对不应该和PC互联网的体验一致。我们需要重新思考这个问题:我们解决什么问题?我们怎么解决?而完全不需要考虑PC互联网的很多的做法。我们很有可能需要按照你是谁来做程序,比如给房东用的,给工人用的,给白领用的这样的方式做APP。等等等等。需要有很多的思考。

结论:我们需要非常非常的重视移动互联网。这其实是百姓网的第二次创业。被一个大潮甩掉太容易了,能够在两次大潮中间都有所表现的公司,太少见了。按照历史的平均水平来看,如果我们不做些什么,百姓网很快会在移动互联网来到的时候变得无足轻重。

创造价值

很有趣的事情。如果不发生交易,一个家庭的“钱”的数量应该是不变的。比如,在这个时刻,我们象木头人游戏那样喊“停!”,然后谁都不要动,每个人手里的钱的数量就会不动。这个时候假设一种情况:你开始把自己的一个坏了的相机修好了,这个时刻你的钱虽然没有发生变化,但是你的财富发生了变化,你变得比原来多了一个“好相机减去坏相机的差价”那么多财富,广义上来说,整个人类社会的财富增加了这么多。

钱仅仅是一种流通的符号。在任何时候,钱的总量应该是比较固定的,至少纸币是这样,因为政府保证了它的稀缺性,就是总量的稳定。如果一个人拿到了一张纸币,一定有另外一个人少了一张纸币。如果广义的把所有电子货币也算进去,其实总量还是固定的,除非中央银行干点儿事情。从这个角度上来讲,钱是大小不变的蛋糕,我们只是决定怎么分蛋糕,如果多点,有人就会少点。

但财富不是。如果你拿一张白纸出来,画了幅画,你就在改变手里的财富。如果你是个好画家,财富就在增加(我们假设画好画的白纸的财富大于白纸本身,虽然有很多人会反过来),当他不断的画画的时候,财富在不断的增加。注意,不是他一个人的财富,而是整个人类社会的财富在他疯狂的画画的时候在增加。

但不幸的是,随着工业社会的发展,能靠一人之力创造财富的机会慢慢减少,仅仅剩下有限的一些手艺人可以靠自己的双手创造财富:修鞋的,开锁的,捏脚的,画画的,写文章的(越到后面,且是越不象修鞋的那样可以真的靠一个人,他们也依靠其它的人才能实现财富),但其中人数最多的一群人,是程序员。

我所见到的对于公平主义最猛烈的抨击者,都是一些创造财富的人。曾经和一个美国的外科医生聊天,他对奥巴马的医疗政策恨之入骨。他说,如果没有极高的收入,我们为什么要花那么多的时间去学习和保证做最好的手术?如果听到世界上1%的人拥有远超过1%的财富,我们的第一反应是“不公平”,但我们需要去了解的是到底这个差距是如何产生的,是因为贪污,腐败,挪用,抢劫,勒索,偷盗,印假钞得来的,还是继承,结婚,金融,商业,还是最后一种:创造出来的。

创造财富和变现是两个概念。我们可以创造出巨大的财富,但是并不卖钱而是直接捐赠。财富的定义是“人们想要的东西”。我写了很多的blog,我相信在这个世界上还是有人认为这些是他们想要看到的,我仅仅把这些创造出来的财富免费贡献了出来而已。从财富的角度来看,我们能够更清楚地知道我们的哪些行为在创造财富,哪些不是,而这个过程和是不是看到钱进入口袋不尽相同。

什么不创造财富呢?不是所有创造或者制造的行动才是创造财富的过程。比如洗车,去除了灰尘,让车变得更轻,更小,但更漂亮了,他们在创造财富;流通环节,大量的批发物品分成小量的零售,这也在创造财富。判断标准是,到底有没有人要这样东西。只要有人要,就是创造财富。我个人觉得马克思所说的价值是无差别的人类劳动的定义不准确,人类劳动并不总创造价值,就像一个人在树上搓痒痒几个星期,这些劳动也不创造任何其他人想要的东西。而且,无差别的也是在现代社会不合时宜的说法。对于程序员和作家这种劳动,如何可以真的界定无差别呢?按工作时常,还是行数呢?劳动一定是有差异的!

如何有效的衡量一个人创造出来的价值是个历史难题,且不要轻易去尝试(这种说法政治上不正确。应该说:去大胆的试吧!同时伴随着难以觉察的坏笑)。CEO是一个很有趣的职位。CEO是可以用公司创造的价值来衡量的,如果把一个公司分拆成每人一个公司并且互相付费好让大家一起工作,每个人都是CEO,倒是一种衡量的异想天开的做法,虽然这完全不现实,因为越来越多的工作需要一起做,而每个人都是用自己和周围所有人的平均值来领工资的。

最近开始思考对于软件这个行业,微软的一些做法还是有其先进性的,至少在1995年之前。其中一种做法就是把团队都搞得很小。比如Microsoft Project团队,就十几个人,这样东郭先生和猛男都很容易看出来。比如只有十个人的公司,虽然还是无法衡量每个人的贡献,但至少偏差变小了。一个人的贡献大不过总产出,小也不会比1/10小太多。一个小的团队,你最好找最好的伙伴,因为最终你的工作会和他们平均。对于一个CEO来说,最好找最聪明的人,因为最终你是你找来的所有人的平均值的代言人。

我们一定要找到一种方式让各个团队松耦合。比如一个工具团队给所有人提供工具,让其它的团队各自相对独立。这不仅仅是一个技术决定,更是一个管理学上的决定,而且管理上的决定比技术决定更重要。通过让工作独立,让一个团队的工作不要和太多的人求平均数,我们其实在提高每个人的产出。

小还有一个好处,就是你有可能拿到你能找到的最优秀的人。好是没有绝对意义的。在一个全明星的队伍里,你还是能够挑出最好的几个。在奥运会的竞技场上,其实是无数的国家自己的冠军在一起争夺冠军。冠军之所以表现好,就是因为我们仅选一名。我们可以确信的是,当我们选的人越多,平均水平一定越低,比如金银铜牌的平均值一定低于金牌,却一定高于全民水平。当一个公司越大,平均水平一定越接近于社会平均水平。一个成功的公司不就是因为它在某方面的能力远高于社会平均水平吗?我很难想象一个一万人的公司比社会平均水平高太高,无论他叫微软还是Google.

我们在创造财富,只有理解财富是如何创造出来的,才会沿着正确的方向去理解如何安排创造它的活动以及如何分配。

PS. 本文受Paul Graham的很多思想启发,表示感谢。

一个建都的计划

前天晚上我们打破了一个世界。面对我们自己给自己设置的边界,我摔了第一个盘子,大家都看到了,知道原来那些桌子架子上的碍着自己事儿的盘子是可以摔的。于是大家有跃跃欲试,准备跟着摔盘子。但问题是,不是摔了盘子就能解决问题的。我们重建的是什么,怎么重建?这是一个计划。

1. 兵分两路。

现在公司需要立刻成立一个小分队,开始筹划重新搭建我们可以依赖的系统。这部分开始只需要很少的人做先锋队。为了速度,我们可以用独立的服务器,新的架构,不考虑和老程序兼容。另外,所有的其他开发和业务,在现有基础上继续推进。原来所有的目标和计划不变。我们的老都城朝歌还要继续存在2年以上,我们需要完善它。这两路兵,对于百姓网都至关重要,我们在变革的时候决不能停下来。

2. 快速推进,长期并存

我们需要快速的推进新都城的建设。我们会在路由器那一层尽快的把第一个页面指向新系统,比如说用户页面。当我们可以看到一个新页面在新的服务器上运行的时候,第一面红旗就已经开始飘扬了。只要有第一个人完成了第一个页面,其他各个页面,比如Listing Page,View Ad Page,Home Page,User Page都可以沿着这条路或快或慢的迁移过去,因为路已经通了。

我们以最高的质量要求建设新页面(code review等流程随之建立),但选择非常小的功能集。所有的没有实现的功能,依然由老的朝歌系统完成。所有的写操作(发帖,付费,信息审核等)都在老朝歌。朝歌作为陪都会一直保留,直到几年后最后一批功能和用户迁移出去。而有一些功能,比如赤壁,牧野以及大多数的管理工具,近期没有改变的计划。

3. 先读后写

这是给技术人员的注释。我们的新都城会先实现读的功能,让主要页面都跑起来。因为读的难度较低,对用户影响最大,对错误容纳度非常高,可以让我们的功能平稳过渡。我们应该可以很快的把80%的流量迁移到新代码上来。当读全部迁移到新代码以后,会逐步小心的把写分步迁移过来。直到全部完成。

我们这几天正在筹划这个新的团队,其实有些工作,在3周前已经开始了。我需要大家这个时候打起精神,在各条线推进;同时要有耐心,罗马不是一天建成的,我们的新都城也不是。

加油!

192行

//wangjianshuo@baixing.com
namespace Graph;

class CompanyAccount {
…function occuredRevenue($startTime, $endTime) {
……$money = 0;
……
……if($endTime > time())
………throw new Exception(“Refuse to tell you future, because that may be inaccurate”);
……
……$s = new Searcher(
………new AndQuery(
…………new Query(‘type’, ‘Order’),
…………new Query(‘paid’, 1),
…………new RangeQuery(‘startTime’, null, $endTime),
…………new RangeQuery(‘endTime’, $startTime – 1, null)
………)
……);
……
……foreach($s as $order)
………$money += ($order->occuredRevenue($endTime) – $order->occuredRevenue($startTime));
………
……return $money;
…}
}

class UserAccount {
…public $balance; // money + credit;
…public $ratio; // money / balance;

…function in($money, $credit){
……$this->ratio = ($this->balance * $this->ratio + $money) / ($this->balance + $money + $credit);
……$this->balance += $money + $credit;
……$this->save();
…}

…function out($mondit) { //mondit = money + credit
……$this->balance -= $mondit;
……$this->save();
…}

…function pay($order) {
……$order->pay($order->listPrice * $this->ratio);
……$this->out($order->listPrice);
…}

…function partialCancel($order, $time) {
……$order->particalCancel($time);
……
……$refund = $order->price – $order->occuredRevenue($time);
……$ratio = $order->price / $order->listPrice;

……$this->in($refund, $refund / $ratio * (1 – $ratio));
…}
}

class Order {
…public $unitTime = 24 * 60 * 60; // 1 day
…public $paid = false;

…function occuredRevenue($time) {
……$money = 0;
……$unitPrice = round(($this->price) / ($this->endTime – $this->startTime) * $this->unitTime, 2);
……for($i = 0; $occuredTime = $this->startTime + $this->unitTime * $i, $occuredTime < min($time, $endTime); $i++)
………if($this->endTime – $this->occuredTime <= $this->unitTime)
…………$money += ($this->price – $unitPrice * $i);
………else
…………$money += $unitPrice;
……return $money;……
…}

…function place() {
……$pa = new BiddingPrice();
……$this->listPrice = $pa->price($order);
……$this->save();
…}

…function partialCancel($time) {
……if($time >= $this->endTime)
………throw new Exception(‘Cannot cancel completed order’);
……
……$neg = clone $this;
……$neg->startTime = max($this->startTime, $time);
……$neg->price = $this->occuredRevenue($time) – $this->price;
……$neg->save();
…}

…function attributes() {
……$ad = graph($this->adId);
……
……return array_merge(
………parent::attributes(),
………’categories’ => cg_array_upto(array_reverse($ad->category->path()), $this->category),
………’areas’ => cg_array_upto(array_reverse($ad->area->path()), $this->area)
…}
}

function cg_array_upto($arr, $c) {
…$result = array();

…foreach($arr as $a) {
……$result[] = $a;
……$if($a == $c)
………break;
…}
…return $result;
}

class DingPrice extends BiddingPrice {
…public $capacity = 12;
…public $sensitivity = 0.5;
…public $bottom = 3;
…public $tolerance = 30; // day
…public $basePrice = 10; // RMB
}

class RefreshPrice extends BiddingPrice {
…public $capacity = 12;
…public $sensitivity = 0.5;
…public $bottom = 3;
…public $tolerance = 30; // day
…public $basePrice = 10; // RMB
}

class BiddingPrice {
…function price($order) {
……$s = new Searcher(
………new AndQuery(
…………new Query(‘type’, ‘Order’),
…………new Query(‘paid’, 1),
…………new Query(‘area’, $order->area),
…………new Query(‘category’, $order->category)
………),
………array(‘order’ => ‘startTime DESC’)
……);
……
……if(count($s) == 0)
………return $this->basePrice;
……
……$currentPrice = $s[0]->listPrice;
……
……if(count($s) > $this->capacity) {
………foreach(array_slice($s, 0 floor($this->sensitivity * $this->capacity) as $o)
…………if($o->listPrice != $currentPrice)
……………return $currentPrice;
………return $this->increase($currentPrice);
……}
……
……if(count($s) <= $this->bottom &&
………time() – $s[0]->startTime > $this->tolerance)
………return $this->decrease($currentPrice);
………
……return $currentPrice;
…}

…function increase($price) {
……return $price + 10;
…}

…function decrease($price) {
……return $price – 10;
…}
}

class DingAds {
…function ads() {
……$v = new Visitor();
……$s = new Searcher(
………new AndQuery(
…………new Query(‘type’, ‘Order’),
…………new Query(‘paid’, 1),
…………new RangQuery(‘startTime’, null, time() + 1),
…………new RangeQuery(‘endTime’, time(), null),
…………new Query(‘categories’, $v->category),
…………new InQuery(‘areas’, $v->area->path())
…………)
………)
……);
……
……$dingAds = array();
……$negAds = array();
……
……foreach($s as $o)
………if($o->price >= 0)
…………$dingAds[] = $o->id;
………else
…………$negAds[] = $o->id;
…………
……return array_diff($dingAds, $negAds);
…}
}
/**
* 1. AccuralBasedAccouting DONE
* 2. Ding (Category, Filter, City, Province, China) DONE
* 3. Place order, pay, refund, partialCancel DONE
* 4. Pricing (Ding bidding based pricing, Refresh bidding, list bidding) DONE
* 5. User Account, real money, fake money DONE
* 6. Ding display DONE
* 7) Refresh 5 RMB
* 8) listing fee 10 RMB
* 9) Sales tools
* 10) Automatic invoice
* 11) Port service
*
* o—–o—–o—–o—–ø–
* ^ time
* o—–o—–o—–o—–o—-
*
*……………………………o—–o—–
*
* |——|——|——|——|——|——|——|
* ^ startTime ^ endTime
*
* Order
* =====
* orderId
* starTime
* endTime
* listPrice
* price
* paid
* area
* category
* adId
*
* 1. Order never change after paid.
* 2. Range [startTime, endTime)
* 3. price, money refer to real money,
* 4. listPrice, $credit refer to fake money.
*/

一艘没有人有浆的船

付费是我们众多代码泥潭的一个。5个工程师耗时半年,2万2千行代码,却bug不断,每天都有用户付了钱没置顶,对账对不清,退费消耗整个公司大量的精力,而我们的付费工程师还在抱怨业务过于复杂,对于新增的业务需求,没有人有信心完成。

昨天晚上,我召集所有工程师看我从一个空白页开始一个字一个字的敲代码。把我们大多数现在的业务需求(置顶,竞价,权责发生制记帐,退款等),以及现在还根本没有希望近期支持的业务需求(真钱假钱,刷新竞价等)实现了一遍。代码总共192行,耗时1个小时。

一个192行代码解决的问题,我们花了这么多工程师这么长时间还没有解决!!!这,就是我们的代码质量!这,就是我们的技术?这,就是一家号称技术公司做的事情?!我真想用最脏的话来骂这些该死的代码!

昨晚,我们安静的看着一行一行代码产生的一个小时,其实是我们集体默哀的一个小时。这是对于我们浪费掉的时间,我们浪费掉的机会,我们给所有其他部门带来的痛,以及我们失去的这家技术公司的灵魂,默哀。。。。。

一艘没有人有浆的船

在过去的7年里面,我从来没有觉得公司象今天这样危险,这个公司从来没有象今天这么差,差到真正优秀的,有血性的人,在考虑离开。

大家对于方向迷茫的抱怨由来已久,对于部门之间协作的抱怨也从来没有停止,但我明确的告诉大家,我们现在最大的问题,不是船划向何方的问题,不是如何配合的问题,而是在这条船上的所有人手中,没有一个人拿着浆!

现在的百姓网业务部门的人,只要没法动代码,就几乎什么也做不了。这是互联网公司的特质。

但大家可能不知道的是一个事实是,我们现在的工程师,也根本动不了代码。一个功能工程师不是不给你做,是做不出来。

面对代码的泥潭,没有人敢跳出来整理,只好随之沉下去。我没有说错。我再说一遍,在这个公司里面,工程师现在也没有办法改动我们的代码了。如果一个192行代码可以完成的功能,已经用了2万2千行了,在上面再加上2万2千行,局面只会越来越不可收拾。

现在的核心问题是,在这艘船上,无论业务还是Dev都苦恼得要死,都喊破了嗓子,对于方向达成或者不达成任何一致,我们依然没有看到我们的船向任何一个方向有进展。为什么?因为这艘船上,没有一个人手里面有浆!这就是我们最大的问题!

重建一个有Hacker精神的团队

大家看到我从3周前开始阶段性的闭关,看我们的代码,也写了些代码。用一种对自己很残忍的方式把付费的代码敲给大家看, 昨晚也已经是第四次了。我这样做就是为了消除业务人员对代码的恐惧,让工程师看到,除了2万行,还有一个192行的解决方案。我需要让大家的注意力放到,我们可以做什么上面,而不是不能做什么上面。

我需要立刻开始抽人重新构建我们的百姓网基础代码。我需要立刻开始以最高的标准来搭建我们的技术架构,我需要我们的技术能够第一个稳稳的拿起第一把浆,并且逐步把浆交到每一个业务部门的手中。我需要这条船开始启动,哪怕开始是慢的,我们必须起航。

我们的PM们原来多是优秀的Developer,甚至比现在很多Dev的代码写得更漂亮。我们公司有非常多可能的Dev,非常多业务部门的人本来就是工科毕业。花花和丰胸都看得懂代码的大概意思。我们的程序员很多有着非常深邃的对世界的认知,有着创造性的想法,如果愿意并有机会,他们可能比业务更了解用户,了解生意。我们是一家没有边界的Hacker组成的公司,我们会有更多人投入基础的代码工作,我们会让业务部门更直接和我们的Dev工作,让Dev和大家一起动脑子,一起搭建一个伟大的系统。我不信我们真的只能组成瘸子和瞎子互相搀扶才能前行的团队。

一个时代的结束的开始

晓良把我们的付费代码打印出来,贴在了会议室里,让大家永远记住在百姓网的历史上,有这样一段耻辱的时刻。我们知耻而后勇,我们一定能重新站到最棒的技术公司的前沿。我发誓!

昨晚,我说,“今晚不会是一个时代的结束。我们需要一起努力结束它。但今晚一定是一个时代的、结束的、开始。”

这的确会是百姓网的一个糟糕的时代的结束的开始!放心,我们在一起!