邵珠庆の日记 生命只有一次,你可以用它来做很多伟大的事情–Make the world a little better and easier


277月/17

时间和金钱的思考

发布在 邵珠庆

富人会寻找最卓越的、合适的人帮助他们完成目标中的各项任务,花钱请最专业的、效率最高的人帮助他们完成他们并不最擅长的事。比如,管理,投资,创业,教育等等。

穷人倾向于用最省钱但也可能是最费力的方法完成一件他们也许并不擅长的事。

为什么?

1、)哪种资源越稀缺,认知就越可能过度关注那种资源,而导致判断力下降,决策质量下降。

穷人缺钱,容易过于看中钱,而忽略其他比钱更重要的,同样是可利用的资源(人,思维,创意,文化等等)。

2、)所具备的资源组合会一定程度限制目标设定和战略计划,以及特殊能力的发展。

穷人缺钱,就难免因为缺钱而思维受限,思路狭隘,也许有点小钱的就会以赚点小钱作为目标,又也许固化了穷的习性和习惯,难以进入追求理想和财富的上升循环。

3、)文化、教育背景塑造的思维方式不同,经历与成长方式的不同,价值判断、认知体系不同,态度与行为自然不同。

人生对每个人都是开放的,并非富是终极目标,穷也未必是可耻的,因为穷富不过是相对的概念,不代表具体的处境。

只能说很多表面现象(譬如富人为何富,穷人为何穷)都有独特的起源,那起源受一个人的文化、教育背景的影响,更根植于个人的经历、认知和成长,最终个人所得及个人境遇,不过是每个人追求理想人生的副产品。

许多年轻人奋斗的唯一目标,就是早日实现财务自由。但是财务自由的本质并不是钱多到花不完,而是终于可以从每天靠消耗时间来换取金钱这个阶段抽离出来。又或者说,实现财务自由的人,是找到了一个渠道,并在这个渠道上建立了一个相对完善的系统,这个系统在离开了他本人之后,依旧可以正常运转并获得收益。从而,解放了他的生命和时间。这有点像是发现了一口井,然后找来几个人负责打水卖水,然后给这几个打水的人发放收入一样。

有一个悖论其实非常有趣,就是说我们在谈论收入时,往往没有谈及时间投入。比如说A收入是五千,但是每天只需要工作一两个小时;而B收入是一万,但是每天却需要工作十个小时以上。从绝对值上,B收入是A的一倍,但是从性价比上,B简直是太不划算了。因为人的生命和时间是无价的,而B却把它卖的如此廉价。更可惜的是,每天的时间又是固定的,如果按照B这样用生命换钱,那么他的一生就会陷入一个怪圈:像机器一样运转,损耗自己,换取收入。

对于金钱的获取和支配,对于所有普通人而言,都是与常识相反的逻辑怪圈。如果不能早些顿悟并跳出圈外,那么终其一生,都将被碌碌无为所困扰。

57月/17

关于对称加密算法与非对称加密算法

发布在 邵珠庆

我们来讲解下关于各种加解密算法的比较,其中有对称加密算法,非对称加密算法,散列算法等等。

称加密算

对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:

DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。

3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。

AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

AES与3DES的比较

算法名称 算法类型 密钥长度 速度 解密时间(建设机器每秒尝试255个密钥) 资源消耗
AES 对称block密码 128、192、256位 1490000亿年
3DES 对称feistel密码 112位或168位 46亿年

非对称算法

RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);

ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:

抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。

计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。

存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。

带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

下面两张表示是RSA和ECC的安全性和速度的比较。

攻破时间(MIPS年) RSA/DSA(密钥长度) ECC密钥长度 RSA/ECC密钥长度比
104 512 106 5:1
108 768 132 6:1
1011 1024 160 7:1
1020 2048 210 10:1
1078 21000 600 35:1
攻破时间(MIPS年) RSA/DSA(密钥长度) ECC密钥长度 RSA/ECC密钥长度比
104 512 106 5:1
108 768 132 6:1
1011 1024 160 7:1
1020 2048 210 10:1
1078 21000 600 35:1

RSA和ECC安全模长得比较

功能 Security Builder 1.2 BSAFE 3.0
163位ECC(ms) 1,023位RSA(ms)
密钥对生成 3.8 4,708.3
签名 2.1(ECNRA) 228.4
3.0(ECDSA)
认证 9.9(ECNRA) 12.7
10.7(ECDSA)
Diffie—Hellman密钥交换 7.3 1,654.0

RSA和ECC速度比较

散列算法

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

l         MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。

l         SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;

SHA-1MD5的比较

因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

l         对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

l         对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

l         速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

对称与非对称算法比较

以上综述了两种加密方法的原理,总体来说主要有下面几个方面的不同:

l         在管理方面:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名。

l         在安全方面:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性。

l         从速度上来看:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。

  1. 三.加密算法的选择

由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

对称加密算法不能实现签名,因此签名只能非对称算法。

由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

那采用多少位的密钥呢? RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

  1. 四.密码学在现代的应用

保密通信:保密通信是密码学产生的动因。使用公私钥密码体制进行保密通信时,信息接收者只有知道对应的密钥才可以解密该信息。

数字签名:数字签名技术可以代替传统的手写签名,而且从安全的角度考虑,数字签名具有很好的防伪造功能。在政府机关、军事领域、商业领域有广泛的应用环境。

秘密共享:秘密共享技术是指将一个秘密信息利用密码技术分拆成n个称为共享因子的信息,分发给n个成员,只有k(k≤n)个合法成员的共享因子才可以恢复该秘密信息,其中任何一个或m(m≤k)个成员合作都不知道该秘密信息。利用秘密共享技术可以控制任何需要多个人共同控制的秘密信息、命令等。

认证功能:在公开的信道上进行敏感信息的传输,采用签名技术实现对消息的真实性、完整性进行验证,通过验证公钥证书实现对通信主体的身份验证。

密钥管理:密钥是保密系统中更为脆弱而重要的环节,公钥密码体制是解决密钥管理工作的有力工具;利用公钥密码体制进行密钥协商和产生,保密通信双方不需要事先共享秘密信息;利用公钥密码体制进行密钥分发、保护、密钥托管、密钥恢复等。

基于公钥密码体制可以实现以上通用功能以外,还可以设计实现以下的系统:安全电子商务系统、电子现金系统、电子选举系统、电子招投标系统、电子彩票系统等。

286月/17

HTTP协议中的短轮询、长轮询、长连接和短连接

发布在 邵珠庆

引言

最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码。在研究一个项目的时候,源码里面用到了HTTP的长轮询。由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HTTP的长长短短。

了解的方式主要都是LZ在网络上获取的,这里只是谈一下LZ对于这四种叫法最直观的理解。如果你之前不懂的话,可以帮你普及一下,如果你之前就懂得话,可以互相对照一下。

以前的误解

很久之前LZ就听说过长连接的说法,而且还知道HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接。但LZ终究觉得对于长连接一直懵懵懂懂的,有种抓不到关键点的感觉。

今天LZ通过一番研究,终于明白了这其中的奥秘。而之前,LZ也看过长连接相关的内容,但一直都是云里雾里的。这次之所以能在这么短的时间里搞清楚,和LZ自己技术的沉淀密不可分。因此,这里LZ借着这个机会,再次强调一下,千万不要试图去研究你研究了很久都整不明白的东西,或许是你的层次不到,也或许是你从未在实际的应用场景接触过,这种情况下你去研究,只会事倍功半,徒劳一番罢了。

回到正题,既然说是误解,那么LZ的误解到底是什么?

那就是LZ一直认为,HTTP连接分为长连接和短连接,而我们现在常用的都是HTTP1.1,因此我们用的都是长连接。

这句话其实只对了一半,我们现如今的HTTP协议,大部分都是1.1的,因此我们平时用的基本上都是长连接。但是前半句是不对的,HTTP协议根本没有长短连接这一说,也正因为误解了这个,导致LZ对于长连接一直不明不白,始终不得其要领,具体下面一段会说到。

网络上很多文章都是误人子弟,根本没有说明白这个概念。这里LZ要强调一下,HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,或者更准确的说,是本次HTTP请求就结束了,根本没有长连接这一说。那么自然也就没有短连接这一说了。

之所以网络上说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

其实知道了以后,会觉得这很好理解。HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接。

一个形象的例子就是,拿你在网上购物来说,HTTP协议是指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP请求,等货物运到地方了,快递员会根据你发的请求把货物送给相应的收货人。而TCP协议就是中间运货的那个大货车,也可能是火车或者飞机,但不管是什么,它是负责运输的,因此必须要有路,不管是地上还是天上。那么这个路就是所谓的TCP连接,也就是一个双向的数据通道。

因此,LZ现在甚至觉得,“HTTP连接”这个词就不应该出现,它只是一个应用层的协议,根本就没有所谓的连接这一说,就像FTP也是应用层的协议,但是你有听说过FTP连接吗?(恩,好像是听过,-_-,但你现在知道了,其实所谓的FTP连接,严格来说,依旧是TCP连接)

实际上,说HTTP请求和HTTP响应会更准确一些,而HTTP请求和HTTP响应,都是通过TCP连接这个通道来回传输的。

不管怎么说,一定要务必记住,长连接是指的TCP连接,而不是HTTP连接。

一个疑问

之前LZ一直对一件事有些模糊不清,首先是怎么样就算是把HTTP变成长连接了,是不是只要设置Connection为keep-alive就算是了?

如果是的话,那都说HTTP1.1默认是长连接,而观察我们平时开发的Web应用的HTTP头部,Connection也确实是keep-alive,那就是说我们大部分都是用的长连接,但是长连接不是一般用于交互比较频繁的应用吗?像我们这种普通的Web应用,比如博客园这种,或者我的个人博客这种,长连接有什么用?

如果有用那用处到底是什么,我们又不是客户端与服务器交互频繁的那种应用(毕竟你打开网页肯定要半天才打开另外一个吧),如果没用的话,那到底应不应该把Connection为keep-alive这个header值给改掉,从而改成短连接?

这个疑问,在LZ明白了长连接其实是指的TCP连接之后,基本上就明白了。而这个疑问,也正是LZ在“以前的误解”那一段所提到的,那个因为误解导致LZ一直搞不明白的问题。

为什么解决了上面那个误解之后,前面所说的这些疑问LZ都明白了?

因为长连接意味着连接会被复用,毕竟一直保持着连接不就是为了重复使用嘛。但如果长连接是指的HTTP的话,那就是说HTTP连接可以被重复利用,这个话听起来就感觉很别扭。之所以觉得别扭,其实就是LZ的一种直觉,没什么理论依据。而这种别扭的根源就在于,之前一直没有融会贯通的感觉,所以总感觉缺少点什么。不过这点疑惑,并没有影响LZ的工作,因此也就没深究过。

但现在好了,明白了长连接实际上是指的TCP连接,LZ瞬间自己就想明白了上面的那些问题。

第一个问题是,是不是只要设置Connection为keep-alive就算是长连接了?

当然是的,但要服务器和客户端都设置。

第二个问题是,我们平时用的是不是长连接?

这个也毫无疑问,当然是的。(现在用的基本上都是HTTP1.1协议,你观察一下就会发现,基本上Connection都是keep-alive。而且HTTP协议文档上也提到了,HTTP1.1默认是长连接,也就是默认Connection的值就是keep-alive)

第三个问题,也是LZ之前最想不明白的问题,那就是我们这种普通的Web应用(比如博客园,我的个人博客这种)用长连接有啥好处?需不需要关掉长连接而使用短连接?

这个问题LZ现在终于明白了,问题的答案是好处还是有的。

好处是什么?

首先,刚才已经说了,长连接是为了复用,这个在之前LZ就明白。那既然长连接是指的TCP连接,也就是说复用的是TCP连接。那这就很好解释了,也就是说,长连接情况下,多个HTTP请求可以复用同一个TCP连接,这就节省了很多TCP连接建立和断开的消耗。

比如你请求了博客园的一个网页,这个网页里肯定还包含了CSS、JS等等一系列资源,如果你是短连接(也就是每次都要重新建立TCP连接)的话,那你每打开一个网页,基本要建立几个甚至几十个TCP连接,这浪费了多少资源就不用LZ去说了吧。

但如果是长连接的话,那么这么多次HTTP请求(这些请求包括请求网页内容,CSS文件,JS文件,图片等等),其实使用的都是一个TCP连接,很显然是可以节省很多消耗的。

这样一解释,就很明白了,不知道大家看了这些解释感觉如何,反正LZ在自己想明白以后,有种豁然开朗的感觉。

另外,最后关于长连接还要多提一句,那就是,长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。

这一点其实很容易理解,否则的话,TCP连接将会越来越多,直到把服务器的TCP连接数量撑爆到上限为止。现在想想,对于服务器来说,服务器里的这些个长连接其实很有数据库连接池的味道,大家都是为了节省连接重复利用嘛,对不对?

长轮询和短轮询

前面基本上LZ已经把长短连接说的差不多了,接下来说说长短轮询,今天也正是为了研究长短轮询,LZ才顺便研究了下长短连接这回事。

短轮询相信大家都不难理解,比如你现在要做一个电商中商品详情的页面,这个详情界面中有一个字段是库存量(相信这个大家都不陌生,随便打开淘宝或者京东都能找到这种页面)。而这个库存量需要实时的变化,保持和服务器里实际的库存一致。

这个时候,你会怎么做?

最简单的一种方式,就是你用JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询。

这种方式有明显的坏处,那就是你很浪费服务器和客户端的资源。客户端还好点,现在PC机配置高了,你不停的请求还不至于把用户的电脑整死,但是服务器就很蛋疼了。如果有1000个人停留在某个商品详情页面,那就是说会有1000个客户端不停的去请求服务器获取库存量,这显然是不合理的。

那怎么办呢?

长轮询这个时候就出现了,其实长轮询和短轮询最大的区别是,短轮询去服务端查询的时候,不管库存量有没有变化,服务器就立即返回结果了。而长轮询则不是,在长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒)。在这个时间里,服务器会去检测库存量有没有变化,检测到变化就立即返回,否则就一直等到超时为止。

而对于客户端来说,不管是长轮询还是短轮询,客户端的动作都是一样的,就是不停的去请求,不同的是服务端,短轮询情况下服务端每次请求不管有没有变化都会立即返回结果,而长轮询情况下,如果有变化才会立即返回结果,而没有变化的话,则不会再立即给客户端返回结果,直到超时为止。

这样一来,客户端的请求次数将会大量减少(这也就意味着节省了网络流量,毕竟每次发请求,都会占用客户端的上传流量和服务端的下载流量),而且也解决了服务端一直疲于接受请求的窘境。

但是长轮询也是有坏处的,因为把请求挂起同样会导致资源的浪费,假设还是1000个人停留在某个商品详情页面,那就很有可能服务器这边挂着1000个线程,在不停检测库存量,这依然是有问题的。

因此,从这里可以看出,不管是长轮询还是短轮询,都不太适用于客户端数量太多的情况,因为每个服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满。之所以举这个例子,只是因为大家肯定都会网购,所以这个例子比较通俗一点。

哪怕轮询解决不了获取库存这个问题,但只要大家明白了长短轮询的区别,这就足够了。实际上,据LZ自己平日里购物的观察,那个库存量应该是不会变的,这个例子纯属LZ个人的意淫,-_-。

长短轮询和长短连接的区别

这里简单说一下它们的区别,LZ这里只说最根本的区别。

第一个区别是决定的方式,一个TCP连接是否为长连接,是通过设置HTTP的Connection Header来决定的,而且是需要两边都设置才有效。而一种轮询方式是否为长轮询,是根据服务端的处理方式来决定的,与客户端没有关系。

第二个区别就是实现的方式,连接的长短是通过协议来规定和实现的。而轮询的长短,是服务器通过编程的方式手动挂起请求来实现的。

结语

好了,本文就到此为止吧。LZ写这篇文章,主要也是为了避免自己遗忘。说实话,写到最后了,LZ感觉对于它们的理解又进了一步,这就是写博客的好处吧。

144月/17

深入浅出PageRank算法

发布在 邵珠庆

PageRank算法是谷歌曾经独步天下的“倚天剑”,该算法由Larry Page和Sergey Brin在斯坦福大学读研时发明的,论文点击下载: The PageRank Citation Ranking: Bringing Order to the Web

本文首先通过一些参考文献引出问题,然后给出了PageRank的几种实现算法,最后将其推广至在MapReduce框架下如何实现PageRank算法。

PageRank的核心思想有2点:

1.如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是pagerank值会相对较高;

2.如果一个pagerank值很高的网页链接到一个其他的网页,那么被链接到的网页的pagerank值会相应地因此而提高。

下面是一张来自WikiPedia的图,每个球代表一个网页,球的大小反应了网页的pagerank值的大小。指向网页B和网页E的链接很多,所以B和E的pagerank值较高,另外,虽然很少有网页指向C,但是最重要的网页B指向了C,所以C的pagerank值比E还要大。

参考内容:

1.Wiki about PageRank

2.Google 的秘密- PageRank 彻底解说 中文版

3.数值分析与算法 Page 161 应用实例:Google的PageRank算法

4.Numeric Methods with Matlab 或者中文翻译版本Matlab数值计算

5.使用 MapReduce 思想计算 PageRank Page 62 PageRank和马尔可夫链

1.问题背景

来自参考内容3

2.数学建模

来自参考内容3,理解网页连接矩阵$G$,马尔科夫过程("网上冲浪"),转移矩阵$A$,概率$p$为用户点击当前网页中的某个链接地址的概率(一般都为0.85)。


最后得到一个等式$Ax=x$,这实际上就是求矩阵$A$的特征值为1的特征向量!

下面的内容使用圆盘定理解释了1是矩阵$A$的主特征值,所以我们可以使用幂法来求解。

关于幂法的详细介绍参考另一篇文章Numerical Methods Using Matlab: 第三章 矩阵特征值和奇异值求解


3.求解PageRank

假设有如上图右侧所示的网页链接模型。

(1) 幂法

wiki上有一个PageRank的简便算法,它不考虑转移概率,而是采用的是迭代的方式,每次都更新所有网页的pagerank值,更新的方式就是将每个网页的pagerank值平摊分给它指向的所有网页,每个网页累计所有指向它的网页平摊给它的值作为它该回合的pagerank值,直到全部网页的pagerank值收敛了或者满足一定的阈值条件就停止。

后面的MapReduce框架下PageRank算法的实现就采用了这个思想。考虑转移概率的情况和这个算法类似,乘上一个转移概率再加上一个随机跳转的概率。

根据上面的思想,下面Matlab代码实现可以得到各个网页的PageRank值。

n=6;
i=[2 3 4 4 5 6 1 6 1];
j=[1 2 2 3 3 3 4 5 6];
G=sparse(i,j,1,n,n);

% Power method
for j = 1:n
   L{j} = find(G(:,j));
   c(j) = length(L{j});
end

p = .85;
delta = (1-p)/n;
x = ones(n,1)/n;
z = zeros(n,1);
cnt = 0;
while max(abs(x-z)) > .0001
   z = x;
   x = zeros(n,1);
   for j = 1:n
      if c(j) == 0
         x = x + z(j)/n;%转移到任意一个网页
      else
         x(L{j}) = x(L{j}) + z(j)/c(j);%将上次的pagerank值平摊给所有指向的网页
      end
   end
   x = p*x + delta;
   cnt = cnt+1;
end

得到的向量$x$保存了各个网页的pagerank值,虽然链接数目一样,但是网页①比网页④和网页⑤都高,而网页②的pagerank值第二高,因为网页①链接到了它上面,相当于沾了网页①的光。

x =
    0.2675
    0.2524
    0.1323
    0.1698
    0.0625
    0.1156

这篇文章给出该算法的一个Python版本实现,该博主使用第三方模块python-graph,python-graph模块实现了很多图算法,该模块的使用示例,使用前需要先安装,代码如下:

easy_install python-graph-core
easy_install python-graph-dot

Python版本的算法实现:

# coding=utf-8

# python-graph https://code.google.com/p/python-graph/

# Import graphviz
import graphviz as gv

# Import pygraph
from pygraph.classes.digraph import digraph
from pygraph.readwrite.dot import write

# Define pagerank function
def pagerank(graph, damping_factor=0.85, max_iterations=100, \
             min_delta=0.00001):
    """
    Compute and return the PageRank in an directed graph.

    @type  graph: digraph
    @param graph: Digraph.

    @type  damping_factor: number
    @param damping_factor: PageRank dumping factor.

    @type  max_iterations: number
    @param max_iterations: Maximum number of iterations.

    @type  min_delta: number
    @param min_delta: Smallest variation required for a new iteration.

    @rtype:  Dict
    @return: Dict containing all the nodes PageRank.
    """

    nodes = graph.nodes()
    graph_size = len(nodes)
    if graph_size == 0:
        return {}
    # value for nodes without inbound links
    min_value = (1.0-damping_factor)/graph_size

    # itialize the page rank dict with 1/N for all nodes
    #pagerank = dict.fromkeys(nodes, 1.0/graph_size)
    pagerank = dict.fromkeys(nodes, 1.0)

    for i in range(max_iterations):
        diff = 0 #total difference compared to last iteraction
        # computes each node PageRank based on inbound links
        for node in nodes:
            rank = min_value
            for referring_page in graph.incidents(node):
                rank += damping_factor * pagerank[referring_page] / \
                        len(graph.neighbors(referring_page))

            diff += abs(pagerank[node] - rank)
            pagerank[node] = rank

        print 'This is NO.%s iteration' % (i+1)
        print pagerank
        print ''

        #stop if PageRank has converged
        if diff < min_delta:
            break

    return pagerank

# Graph creation
gr = digraph()

# Add nodes and edges
gr.add_nodes(["1","2","3","4"])

gr.add_edge(("1","2"))
gr.add_edge(("1","3"))
gr.add_edge(("1","4"))
gr.add_edge(("2","3"))
gr.add_edge(("2","4"))
gr.add_edge(("3","4"))
gr.add_edge(("4","2"))

# Draw as PNG
# dot = write(gr)
# gvv = gv.readstring(dot)
# gv.layout(gvv,'dot')
# gv.render(gvv,'png','Model.png')

pagerank(gr)

经过32次迭代之后得到的结果如下,和前面的结果一致:

This is NO.32 iteration
{'1': 0.2675338708706491, '3': 0.13227261904986046, '2': 0.2524037902400518, '5': 0.062477242064127136, '4': 0.1697488529161491, '6': 0.1155828978186352}

(2) 利用马尔可夫矩阵的特殊结构

来自参考内容4,其中$\delta=\frac{1-p}{n}$

也就是将矩阵$A$进行分解,并不需要显示求出矩阵$A$,然后便是求解一个线性方程组即可。

function x = pagerank1(G)
% PAGERANK1  Google's PageRank modified version 1 - hujiawei

%if nargin < 3, p = .85; end
p=0.85;

% Eliminate any self-referential links

G = G - diag(diag(G));

% c = out-degree, r = in-degree

[n,n] = size(G);
c = sum(G,1);%each row's sum
r = sum(G,2);%each col's sum

% Scale column sums to be 1 (or 0 where there are no out links).

k = find(c~=0);
D = sparse(k,k,1./c(k),n,n);

% Solve (I - p*G*D)*x = e

e = ones(n,1);
I = speye(n,n);
x = (I - p*G*D)\e;

% Normalize so that sum(x) == 1.

x = x/sum(x);

(3) 巧妙解法:逆迭代算法

巧妙利用Matlab中的精度误差导致原本是一个奇异矩阵的$I-A$变成一个非奇异矩阵,运行时只是会有些警告提示,但是运行结果和其他算法一样。

function x = pagerank2(G)
% PAGERANK1  Google's PageRank modified version 2 - hujiawei
% using inverse iteration method

%if nargin < 3, p = .85; end
p=0.85;

% Eliminate any self-referential links

G = G - diag(diag(G));

% c = out-degree, r = in-degree

[n,n] = size(G);
c = sum(G,1);%each row's sum
r = sum(G,2);%each col's sum

% Scale column sums to be 1 (or 0 where there are no out links).

k = find(c~=0);
D = sparse(k,k,1./c(k),n,n);

% Solve (I - p*G*D)*x = e

e = ones(n,1);
I = speye(n,n);
% x = (I - p*G*D)\e;
delta=(1-p)/n;
A=p*G*D+delta;
x=(I-A)\e;

% Normalize so that sum(x) == 1.

x = x/sum(x);

最后,附上参考内容4中给出的一份好代码,用于模拟随机冲浪生成矩阵$G$的代码

function [U,G] = surfer(root,n)
% SURFER  Create the adjacency graph of a portion of the Web.
%    [U,G] = surfer(root,n) starts at the URL root and follows
%    Web links until it forms an adjacency graph with n nodes.
%    U = a cell array of n strings, the URLs of the nodes.
%    G = an n-by-n sparse matrix with G(i,j)=1 if node j is linked to node i.
%
%    Example:  [U,G] = surfer('http://www.harvard.edu',500);
%    See also PAGERANK.
%
%    This function currently has two defects.  (1) The algorithm for
%    finding links is naive.  We just look for the string 'http:'.
%    (2) An attempt to read from a URL that is accessible, but very slow,
%    might take an unacceptably long time to complete.  In some cases,
%    it may be necessary to have the operating system terminate MATLAB.
%    Key words from such URLs can be added to the skip list in surfer.m.

% Initialize

clf
shg
set(gcf,'doublebuffer','on')
axis([0 n 0 n])
axis square
axis ij
box on
set(gca,'position',[.12 .20 .78 .78])
uicontrol('style','frame','units','normal','position',[.01 .09 .98 .07]);
uicontrol('style','frame','units','normal','position',[.01 .01 .98 .07]);
t1 = uicontrol('style','text','units','normal','position',[.02 .10 .94 .04], ...
   'horiz','left');
t2 = uicontrol('style','text','units','normal','position',[.02 .02 .94 .04], ...
   'horiz','left');
slow = uicontrol('style','toggle','units','normal', ...
   'position',[.01 .24 .07 .05],'string','slow','value',0);
quit = uicontrol('style','toggle','units','normal', ...
   'position',[.01 .17 .07 .05],'string','quit','value',0);

U = cell(n,1);
hash = zeros(n,1);
G = logical(sparse(n,n));
m = 1;
U{m} = root;
hash(m) = hashfun(root);

j = 1;
while j < n & get(quit,'value') == 0

   % Try to open a page.

   try
      set(t1,'string',sprintf('%5d %s',j,U{j}))
      set(t2,'string','');
      drawnow
      page = urlread(U{j});
   catch
      set(t1,'string',sprintf('fail: %5d %s',j,U{j}))
      drawnow
      continue
   end
   if get(slow,'value')
      pause(.25)
   end

   % Follow the links from the open page.

   for f = findstr('http:',page);

      % A link starts with 'http:' and ends with the next quote.

      e = min([findstr('"',page(f:end)) findstr('''',page(f:end))]);
      if isempty(e), continue, end
      url = deblank(page(f:f+e-2));
      url(url<' ') = '!';   % Nonprintable characters
      if url(end) == '/', url(end) = []; end

      % Look for links that should be skipped.

      skips = {'.gif','.jpg','.pdf','.css','lmscadsi','cybernet', ...
               'search.cgi','.ram','www.w3.org', ...
               'scripts','netscape','shockwave','webex','fansonly'};
      skip = any(url=='!') | any(url=='?');
      k = 0;
      while ~skip & (k < length(skips))
         k = k+1;
         skip = ~isempty(findstr(url,skips{k}));
      end
      if skip
         if isempty(findstr(url,'.gif')) & isempty(findstr(url,'.jpg'))
            set(t2,'string',sprintf('skip: %s',url))
            drawnow
            if get(slow,'value')
               pause(.25)
            end
         end
         continue
      end

      % Check if page is already in url list.

      i = 0;
      for k = find(hash(1:m) == hashfun(url))';
         if isequal(U{k},url)
            i = k;
            break
         end
      end

      % Add a new url to the graph there if are fewer than n.

      if (i == 0) & (m < n)
         m = m+1;
         U{m} = url;
         hash(m) = hashfun(url);
         i = m;
      end

      % Add a new link.

      if i > 0
         G(i,j) = 1;
         set(t2,'string',sprintf('%5d %s',i,url))
         line(j,i,'marker','.','markersize',6)
         drawnow
         if get(slow,'value')
            pause(.25)
         end
      end
   end

   j = j+1;
end
delete(t1)
delete(t2)
delete(slow)
set(quit,'string','close','callback','close(gcf)','value',0)

%------------------------

function h = hashfun(url)
% Almost unique numeric hash code for pages already visited.
h = length(url) + 1024*sum(url);

4.MapReduce框架下PageRank算法的实现

利用前面wiki上的迭代(或者幂法)的思想来实现MapReduce框架下PageRank算法很简单,可以先阅读下参考内容5。

这篇文章using-mapreduce-to-compute-pagerank更加详细,可以参考

以下是我的大数据的一次作业,要求是参考wiki上的简便算法,实现MapReduce框架下的PageRank算法。给的数据集是Twitter的用户之间的关系,可以看做是网页之间的关系,但是助教没要求写代码以及运行这个数据集(有1G多),所以下面只是一个Python版本的理想可行版本,并没有通过实际大数据集的验证,另外,博主暂时还不太会Python的mapreduce框架中的一些函数,所以实现的是一个简明的可以测试的PageRank算法。

1.输入输出格式

map函数的输入是<节点,从该节点引出的边列表>,其中节点是一个类,包含了其当前的pagerank值,输出是<节点,反向节点pagerank值/反向节点引出边的总数>;

reduce函数的输入是<节点,反向节点pagerank值/反向节点引出边的总数>,输出是<节点,从该节点引出的边列表>,其中节点包含了其更新后的pagerank值。

伪代码: [一时犯二写了个英文形式的 ]

process the data to the form of {node i:[its adjacent node list],...}
while the sum of difference between the last two pagerank values < threshold
    map({node i:[its adjacent node list],...}):
        map_output={}
        for every node j in adjacent node list:
            put or sum up {j:(i, PageRank(i)/length(adjacent node list))} into map_output
        return map_output

    reduce(map_output):
        reduce_output={}
        for every entry {j:(i, PageRank(i)/length(adjacent node list))} in map_output:
            put or sum up all values pagerank values for node j with its adjacent node list into reduce_output
        return reduce_output

2.示例演示

假设用户1,2,3,4是如下图所示的关系:

假设有2个mapper(A和B)和1个reducer(C),初始时4个节点的pagerank值都是0.25

其中,关于用户1和2的数据被mapperA读取并处理,关于用户3和4的数据被mapperB读取并处理 [经验证,即使一个用户的数据是由不同的mapper来读取的,最终收敛到的结果差不多]

map的输入输出结果如下:

reduce的输入输出结果如下,输入是2个mapper的输出,输出的结果中更新了节点的pagerank值

reducer处理完了之后又将它的结果输入给mapper处理,直到迭代的次数超过了设定值或者两次迭代之后得到的所有节点的pagerank值之差的总和(也可以是取二范数)小于设定的阈值。

3.示例的实验结果

(1)首先是使用Matlab采用幂法的方式计算出在p=1.0的情况下示例得到的结果 [它的主要作用是验证后面python版本的正确性]

matlab源码如下:

n=4;
i=[2 3 4 3 4 4 1 2];
j=[1 1 1 2 2 3 3 4];
G=sparse(i,j,1,n,n);

[n,n] = size(G);
for j = 1:n
   L{j} = find(G(:,j));
   c(j) = length(L{j});
end

% Power method
p=1.0;
delta = (1-p)/n;
x = ones(n,1)/n;
z = zeros(n,1);
cnt = 0;
while max(abs(x-z)) > .0001
   z = x;
   x = zeros(n,1);
   for j = 1:n
      if c(j) == 0
         x = x + z(j)/n;
      else
         x(L{j}) = x(L{j}) + z(j)/c(j);
      end
   end
   x = p*x + delta;
   cnt = cnt+1;
end
sprintf('pagerank result:')
x

结果为:

0.1072
0.3571
0.2143
0.3214

(2)matlab版本的page rank没有采用mapreduce的思想进行迭代,所以我另外写了一个python版本的利用mapreduce思想实现的pagerank算法(注:我并没有使用python的map和reduce函数去实现,而是使用更加容易明白的实现),使用的阈值为0.0001,最多迭代的次数为100次。

# coding=utf-8

__author__ = 'hujiawei'
__doc__ = 'pagerank mapreduce'

class Node:
    def __init__(self,id,pk):
        self.id=id
        self.pk=pk

def pk_map(map_input):
    map_output={}
    for node,outlinks in map_input.items():
        for link in outlinks:
            size=len(outlinks)
            if link in map_output:
                map_output[link]+=(float)(node.pk)/size
            else:
                map_output[link]=(float)(node.pk)/size
    return map_output

def pk_reduce(reduce_input):
    for result in reduce_input:
        for node,value in result.items():
            node.pk+=value

def pk_clear(nodes):
    for node in nodes:
        node.pk=0

def pk_last(nodes):
    lastnodes=[]
    for node in nodes:
        lastnodes.append(Node(node.id,node.pk))
    return lastnodes

def pk_diff(nodes,lastnodes):
    diff=0
    for i in range(len(nodes)):
        print('node pk %f, last node pk %f ' % (nodes[i].pk, lastnodes[i].pk))
        diff+=abs(nodes[i].pk-lastnodes[i].pk)
    return diff

def pk_test1():
    node1 = Node(1, 0.25)
    node2 = Node(2, 0.25)
    node3 = Node(3, 0.25)
    node4 = Node(4, 0.25)
    nodes = [node1, node2, node3, node4]
    threshold = 0.0001
    max_iters = 100

    for iter_count in range(max_iters):
        iter_count += 1
        lastnodes=pk_last(nodes)
        print('============ map count %d =================' % (iter_count))
        in1 = {node1: [node2, node3, node4], node2: [node3, node4]}
        in2 = {node3: [node1, node4], node4: [node2]}

        mapout1 = pk_map(in1)
        mapout2 = pk_map(in2)

        for node, value in mapout1.items():
            print str(node.id) + ' ' + str(value)

        for node, value in mapout2.items():
            print str(node.id) + ' ' + str(value)

        print('============ reduce count %d =================' % (iter_count))

        reducein = [mapout1, mapout2]
        pk_clear(nodes)
        pk_reduce(reducein)

        for node in nodes:
            print str(node.id) + ' ' + str(node.pk)

        diff=pk_diff(nodes,lastnodes)
        if diff < threshold:
            break

if __name__ == '__main__':
    pk_test1()

得到的结果为如下,总共迭代了15次

1 0.107138774577
2 0.35712924859
3 0.214296601128
4 0.321435375705

上面的结果和Matlab用幂法得到的pagerank值差别很小,可以认为是正确的,所以说明了使用这种mapreduce输入输出格式的正确性。

OK,差不多了,希望对需要理解PageRank算法的人有帮助! 🙂

144月/17

浅谈围绕业务和资源的成熟度,设计团队和项目管理模型

发布在 邵珠庆

房如华: 从五人到五十人:浅谈围绕业务和资源的成熟度,设计团队和项目管理模型

 

如何度量研发和项目管理模型是否良好的支持了业务发展?

互联网的产品植根于高度充分竞争的土壤中,对外界环境的变化是非常敏感的,我们不能保证时刻都做正确的事,因为正确是相对的。在传统软件行业里,通常软件会被交付给明确的客户群体,那么软件的品质只与是否满足了客户需求,以及与同类产品的相对优势有关。而一款互联网产品,在出生之日起,就面临着用户的不确定性,用户需求迁移的不确定及复杂性,竞品可能来自多个领域等因素,我们唯一能够确定的就是变化本身。

研发和项目的管理模型,实际上就是团队的能力成熟度模型。我们既不能在缺人的时候才开始招人、培养人,也不能在业务尚未成熟时招到无法施展拳脚的专家,同时还要确认团队中的大多数同学的潜力能够跟随业务一起成长,否则团队在早期的波动会严重影响甚至毁灭整个业务的进程。因此,业务的成熟度与团队的能力成熟度是呈双螺旋不断迭代的,两者不能产生较大的偏差。

评估两者是否匹配的标准,我认为主要有以下两点:

  1. 敏捷性:能够控制从“决定做某种修改”到“该修改结果正式上线”的这段时间,也叫做周期时间(cycle time)
  2. 灵活性:只有当能够控制每一次从引入变更到发布的整个过程时,你才能开始优化和改进软件交付的速度和质量。

下面,为了简化表述,我们把业务和团队的成熟度分为四个阶段,每个阶段有其自身的特点和面临的挑战,接受并克服了这些挑战,团队将变得更为强大。

0-5人:挖下成功的第一锹泥土

当你想办法向你的老板或者投资人讲完一个美妙的故事之后,你就拥有资源了,这时你需要的是招募(确切的说是说服)一个能够把事情做起来的初始团队,也许一开始只有5个人,但不要紧,明确好从0到1的目标,马上开始工作吧。

这一步通常是用最小的抛弃成本来验证目标、团队的可行性。你要想办法在团队没有产生自我怀疑之前,把事情尽快做成。此时,应遵循INVEST原则,即独立的(Independent)、可协商的(Negotiable)、有价值的(Valuable)、可估计的(Estimable)、小的(Small)并且可测试的(Testable)。

对于这5个人,角色分工很简单,你是项目经理,其他成员都是研发人员,一切资源面向把事情做成。沟通方式是次要的,大家坐在一起,早期不会有太大的沟通障碍。此时人员的单点不是最大的风险,没人测试也不是最大的风险,因为很多项目没等第一个Demo做出来就已经失败了。

但不关心沟通不代表工具是次要的。好的工具可以极大的提高工作的效率,例如代码控制、Wiki这些基本的工具还是要使用的,而且等团队成型之后,容易成为团队文化基因的一部分。

这个阶段对团队的技能和经验也提出了一些必要的挑战:

  1. 需要有解决问题能力很强的人,在项目因各种原因停滞的时候需要有人站出来解决;
  2. 需要有较强项目过程管理能力的人,在优先级、项目品质等方面受资源影响需要调整计划时,要能基于不全面的信息做出合理的决定。
  3. 要从一开始就让团队养成持续交付的习惯。持续交付就是要形成需求、开发、测试、部署的流水线。对于早期团队来说,就要想办法让部署的工作流水线化。首先,版本控制是必要的,它能够保证随时checkout一个版本用于上线,并且随时回滚;其次,配置管理也是必要的,方便我们基于部署环境编写不同的配置文件;最后,部署的变更管理也是重要的,而且需要尽可能的自动化,为什么要自动化?因为早期你的产品很显然会出现大量的缺陷,你唯一能做到的就是把缺陷在代码里修复之后,以秒级的速度发布到线上。目前国内有很多初始成本低廉的公有云产品可以使用,通过写一些简单的脚本,可以把程序和配置快速发布到一个高可用的环境中。
5-20人:踌躇满志,更快的奔跑

初始的业务模式得到验证,团队活下来了,可以沿着预计的大方向前进了,这时候,终于可以把之前的Demo细化了,因为Demo只是跑通了流程,但此时产品可能连可用性还谈不上呢。

你招来了一名产品经理,他开始兴致勃勃的编制未来半年,甚至一年的路线图。假设能够完成这些需求,并保证品质,那么前途是一片光明,并有望领先大部分竞争对手。

这时,作为项目负责人的你,欣慰的发现产品经理在大多数方面和你的业务见解是一致的,因为都提出了大量不得不做的需求,我们确实辜负了用户太多的期待,但你突然意识到一个更关键的问题,完成这些的资源远远不够!

要开始做取舍了,你知道在这个冗长的列表里,永远存在“更有价值“的需求。

好的,列一个Excel,我们开始排个序。

判断优先级的标准是什么?很简单,做两个极端的假设,一个是:哪个需求不做会死人?另一个是:哪个需求带来的预期收益更大?

可能有的需求需要加三个月的班才能完成呢,浪费了时间,贻误战机怎么办?其实不用担心,先把可用性做好,再找你的目标用户群体不晚,在此之前,患得患失是无意义的。

与其患得患失,不如多花点开发量,做点更“精益”的事吧。比如通过小范围的用户测试、灰度发布等方法,快速验证产品的可用性,使用尽可能多的用户行为分析软件来评估你的用户按照你的预期使用了功能并且留存下来。这样万一你先前的决定是错误的,你也可以用较小的抛弃成本来调整方向,少留些遗憾给未来。

努力奔跑的日子总是充满期待的,但你也经常会从资深的员工嘴里听到些许纠结:“我是不是该重构了?”先重构后开发总是没坏处的,这正是素养优秀的表现。然而此时你仍需要帮助他们进行取舍,合理的留下一些技术负债。

如何判断要留下哪些负债呢?

负债产生利息吗?也就是未来团队和业务复杂度不断增加的情况下,是否会让技术问题的影响范围扩大,或是优化成本不断升高直至失控?如果负债会产生短期的利息,那么把精力花在减少利息和让业务加速奔跑相比,哪个更合算?

当前的负债,能够通过后期招募一名专业、资深的成员,用更少的时间、更好的经验或者更成熟的组件来一次性解决它吗?

如果某个业务模块的需求变化本身是频繁的,那么此处产生的负债也是不确定的,刻舟求剑的优化之后,发现需求已经变化了,也是一种浪费。

在这个阶段,因为引入了制定需求和跟踪缺陷的角色—产品经理,所以需要使用工具来对需求和确信进行追踪,一个类似Bugzilla的开源缺陷跟踪软件就能满足你大部分的需求了。

20-35人:总体产出随人数增加减缓,团队能力出现瓶颈

你的团队成型了,80%的成员都是工程师,他们努力的实现着一个一个小的目标,照此速度运转下去,似乎你脑海中的那个路线图就要实现了!

“继续招人吧!多一倍的资源投入就能换来多一倍的回报,因为他们负责的业务模块是不同的,不会产生沟通上的麻烦。”

观点听起来很有道理,但实际是错误的,你的团队毕竟不是流水线上的组装工人,更何况,随着事情越来越复杂,沟通的交集是不可避免的。这就好比一片森林,地表以上的树干都是笔直挺拔,互不影响,但地表以下的树根已不可避免的盘根错节在一起,更可怕的是,没人能完整的掌握这种交集的状态,更不要提如何改进了。于是,一辆战车抛锚了,而看起来任何人都没做错什么。

瓶颈到来了。

我们知道在早期的网络通信技术里有一个名词叫做“广播风暴”,指的是在集线器组成的共享网络下,所有用户的实际可用带宽,随用户数的增加而递减,并且在争抢信道的时候产生用户的等待。

这是不是很像目前你的未被治理的早期团队遇到的情况?为了确保每个人都得到足够的信息,全员会议在增加,人数越多,会议议程越复杂导致沟通成本的进一步增加,这还不包括团队成员随时被打断、叫到某个会议中的情况。

集线器最终被交换机和路由器彻底的取代了。随着团队增长,也需要主动革新现有的成员之间的沟通协作方式。

沟通的本质是解决信息传递问题,让信息的生产者能够尽快抵达必要的受众。但自发的信息传递并不保证效率,也不保证可达,所以需要一个协调员来优化沟通的效率,当然协调员就不能总是组织全体会议了。

  1. 必要的信息,还是要广播出去,提到Dashboard的概念,Dashboard是团队成员需要得到的信息的最小子集,通过这些信息,团队成员能够基于自身角色和目标的考量,迅速开展后续行动。如何让Dashboard的变更成本最小化?就必须协作了,一开始这种协作是痛苦的,因为并没有流程来保证不同角色间信息传递是一致的,所以只好让团队中的每个角色的关键成员都来更新Dashboard,刚开始会出现大量的信息不完善、不一致甚至自相矛盾的情况,但不要怕,频繁的去做,坚持两三周,情况一定会好转,管理就是不断重复,把主观上想做好变为真正有能力做好的过程。
  2. 局部的信息传递给团队中局部的群体,该如何来操作呢?如果你的团队中有几个人具备项目经验和较强的责任心,还是可以通过定期的会议和不定期的沟通来解决的,但你一定觉得在这个阶段投入专职的项目管理或流程优化的人员还是过于奢侈了,那么不要紧,充分利用好工作流这个IT界的伟大发明吧。工作流能够让你的团队根据一系列预先设定好的过程规则,将文档、信息、任务在不同的执行者之间进行传递与执行,避免人工的方式造成的低效、等待和错误。可以考虑购买Atlassian的Jira软件,这可能是你的第一笔软件投资了,或许觉得有些昂贵,但这一定比你招募一个专职的员工便宜多了。
  3. 加强团队不同角色对信息中“一致”的部分的约定,例如版本,版本用于识别一篇文档、一份代码的各个时间点的历史快照,不同角色的成员基于对版本的一致命名,可以有效的识别需求、实现、部署工作之间的对应关系。
35-50人:重装上阵,提高整体交付品质和团队成熟度

你拖着沉重的身躯,靠一己之力把团队带到了一个执行力和结果都还不错的状态,终于可以停下来歇一歇了。

这是大多数业务负责人梦寐以求的状态,但要想从同行中杀出血路,保持进一步的竞争优势,这还不够完美。

你望着窗外鳞次栉比的建筑物,发现大多数二三十层的楼房并没有什么不同,但鹤立鸡群的几幢摩天大楼,让你意识到,一定有一些工作是只有某些人才能完成的,而当你的进取心激发你要建造摩天大楼的时候,你也需要他们。这就是专家的价值。

如果你想停止修修补补的民工游击队的日子,就在这个时候引入专家团队,来让团队变得更加高大上吧。

专家能扮演怎样的角色,取决于你需要他们发挥怎样的作用,每位专家都有自己擅长的工作模式,你需要了解他们的工作偏好,以帮助你改善团队的能力基因。

  1. 架构师:具备一定的理论高度,并在相当规模的环境下,成功的完成过研发或管理能力的升级。他倾向于了解到具体情况后去务实的推进解决问题,并怀着积极和包容的沟通心态获取团队的支持。这种工作模式的优势是目标明确,执行有力;劣势是可能过程中需要调用较多的资源,会与业务线的资源调配产生优先级上的冲突。
  2. 咨询师:他不是最主动或者最敏感解决问题的人,也许平常他只是收到各个项目组抄送给他的邮件,但遇到紧急情况时,能够快速亲自解决,或者叫上其他同学一起会诊,对于可能会重复出现的问题,或者重复产生的工作量,会设法通过优化流程来降低内部消耗。这种工作模式的优势是面向问题持续迭代团队,确保短期的成果总是可被衡量的;劣势是受团队现有成员的视野的限制较大,总是踩过坑后才能促使团队意识到问题并统一思想。

此外,还要使用IT管理的思想来提高团队的流程成熟度和专业度,从而提高整体交付品质。

互联网的商业化只经历了短短的不到二十年的时间,但在此之前,IT的信息化就已经在国外很多企业中普及开来了,企业中的大部分员工是使用IT设备作为生产力工具和协作沟通的渠道,那么如何支持好IT基础设施就变成了很重要的工作,并由此催生了IT服务管理的概念,在20世纪80年代末期,还由英国政府部门发起制订了一个信息技术基础架构库即ITIL,到目前已修订至第3版,从流程的规范制订,发展为面向全生命周期的服务管理。

虽然前面反复提到:互联网与IT企业对于需求的管理存在相当大的差异,但这只会促使我们思考如何吸取面向交付品质的ITIL的理念,并在此基础上让一切环节运转在一条流水线上,并想方设法让流水线变得更快。

让流水线变的更快,可以从两个角度进行优化,一个是提高效率,一个是减少损耗。工具的高度自动化,把尽可能多的事情交给机器去做是提高效率的最显而易见的方法。那么减少损耗呢?通常因为测试资源、环境复杂性等问题,导致原本在测试环境运转正常的软件,在服务器或者用户的手机上出现了问题,你几乎没有办法在生产运行环境下远程调试和修改程序,但这些问题又无法复现,所以捕获现场就变成了非常重要的事。日志和监控是经无数团队和项目证明的最重要的两种捕获现场、衡量线上交付品质的方式,所以在你的团队有允许的资源时,一定要有专人面向其进行持续的分析、优化和质量评价。

总结
  1. 在业务还比较小的时候,要面向成功率最大化进行团队资源配置,随着业务的逐步发展,资源配置的原则要逐步倾斜至执行效率、交付品质,直至从理论的高度设计相应的流程和角色来固化你的团队,使之变得优质、高效、稳定、可控。
  2. 充分利用工具,尽可能将一切工作自动化。
  3. 重复、频繁的做一件事,尤其是你发现这件事情既重要又困难的时候。
  4. 在你的团队没有强大到能够筑巢引凤的时候,不用花精力弥补技能的短板,因为成功率低,回报也有限,反而对团队的项目管理要亲力亲为,识别损耗并推动改进。
158月/15

谈谈美团的价值观

发布在 邵珠庆

作者:钟永健,现任美团酒店战略合作总监,曾任美团编辑部总监

很多人好奇,美团为什么可以在过去5年内取得这么大的进展,可以有很多答案。

比如,美团的创始人及CEO王兴很有前瞻性,而且善于学习,会反复思考一个问题直到得到一个结论,但他又不让自己的结论变成一尘不变的东西,事异时移,王兴会带头挑战自己的结论。又比如,美团的团队很正,虽然来自五湖四海,各自的背景经历都不一样,但都乐于“行正道”,同时瞧不起那些想走捷径或者想钻营的人。再比如,在过去5年的多的时间里,美团在恰当的时间点都做了正确的选择,并且专注于这些选择猛搞:2010年在利基市场取得成功后迅速搭班子开始扩张;2011年年初猛抓城市覆盖并率先推出手机APP;2012年沉下心来补组织建设的短板;2013年线上线下一起抓效率,控成本,扩规模;2014年落地T型战略;2015年搭平台、建生态。是的,该发生的事情几乎都发生了。

但是,美团自上而下都相信,“事情是人做出来的”,所以,当美团的团队规模越来越大的时候,业务越来越复杂的时候,无论是王兴,还是整个美团团队,都觉得伴随美团发展内生出的价值观,在发挥越来越重要的作用。就像美团的COO阿干经常说的,公司发展快,有些问题流程制度管不到的时候,就得靠价值观了,而他评判价值观案例时,很重要的一个标准是,这个事情是你本职工作该做到的,还是你额外做到的,如果是后者,他会觉得是个好案例。

美团有七条价值观,其实并不是太好记,但回顾过去美团5年多的发展,确实是感觉这些价值观并不是从天而降,强加给这个团队的,而是在这片土壤中一点点长出来的,所以不是太好通过几个符号化的词语记忆反倒可以理解,因为这些东西就一直在那里。

以客户为中心

在2011年年初的时候,美团召开第一次城市经理会议,会议上有很多讨论,其中有一个问题,当有些好商家希望得到特别的照顾时,我们该怎么办,例如希望自己的位置可以出现在页面的第一行(那个时候美团已经是一天多单的情况了),是不是美团可以手动调整下。讨论很激烈,最后王兴说,因为美团是个市场,所以消费者和商家都是我们客户,他们的利益都应该排在美团的前面,但因为我们是个交易市场,钱归根结底都是从消费者的口袋里出来的,所以消费者应该排在商家前面,我们还是首先考虑对消费者有利的做法。例如排序的问题,还是应该从消费者的角度出发,对消费者最有价值的商家排在前面。

这样就有了消费者第一、商家第二、美团第三的价值排序。2011年年初的时候,所谓的千团大战其实还没有开始,现在回头来看,这个排序的确定,在此后近乎恶劣的竞争中,从根本上保证了美团这个平台的策略倾向,从而也保证了这个平台的稳固,但确实不是一件容易的事情,例如一个大品牌商家临时违约变卦说不再接待美团的用户,当消费者打来电话投诉的时候,美团是把责任推给商家,还是采取直接的补偿行动,内部几乎没有怎么讨论就决定当然是后者,不但补偿了消费者付出的钱,还代商家补偿了此前承诺的折扣,但同时,因为美团相信商家排在自己前面,之后解决了具体问题,还要和这个品牌继续合作,所以也并没有对外传播商家临时变卦的情况。再比如在2011年3月4日,美团决定推出“过期退”,把过期消费券的钱都还给消费者,同时追溯到2010年3月4日,美团认为这些沉淀资金并不应该是自己的所得,但彼时风生水起的Groupon和国内的很多同行并不是这样想的。

团队合作

在美团这样一家公司谈团队合作确实是件不容易的事情,例如线上的团队和线下团队的做事风格并不一样,线下团队又分散在全国各地,同时美团因为发展经历很短,面对的又是一个全新的市场,所以团队整体很年轻,职业化经历都很短,随着美团的T型战略落地,美团的组织结构比之前变得更复杂,这些因素都不是太利于团队合作的。但当大家觉得团队合作是个很重要的事情的时候,这些不利的因素统统都不是问题。

比如昨天刚发生的事情,8月13日凌晨天津港发生了爆炸事故,事故发生后半个多小时,网上已经有些传播,到店事业群负责京津大区的大区经理就拉了一个在线交流群,一方面说了下在当地工作的同学都安全,另一方面和酒店旅游事业群的同学提了一个建议,希望酒店在当地的同学多联系一些合作商家,看看是不是愿意提供一些免费的休息场所等应急服务,然后公布到美团平台上,让更多受事故影响的同学知道。8月14日上班,有关于这个建议的8个工作交流群迅速建立起来,通过在线讨论,酒店天津的同学马上开始行动起来,给自己负责的当地商家打电话沟通,包括总部负责电话营销的同学,也马上进行了“空中力量”的支持,与此同时,数据同学开始为业务同学提供数据支持,“天津的滨海新区有多少酒店,他们都在哪里,KP是谁联系电话是多少等等”,正在忙着准备七夕促销的运营同学也在几分钟内协调出资源,和设计师配合,一起开始准备专题页面的上线。在这个过程中,与商家沟通-确认服务信息-信息汇总-信息发布的工作流程在讨论群里自发的形成了,12点,32家提供免费服务的酒店信息上线发布并通过朋友圈开始传播。事情还没有完,在酒店同学和酒店商家联系的时候,到店事业群在天津的同学也已经和当地的餐厅、足浴等商家联系,希望他们也提供一些免费的应急服务,酒店的产品经理和技术组成了一个临时的小组,准备开发一个在线地图,把酒店同学和到店事业群的同学确认的免费信息发布到这个地图上,而平台端的运营同学已经准备好了入口资源,地图发布后迅速在天津的首屏设置了入口。而整个过程中,市场的PR同学给出了传播的建议,我们这是纯粹做公益,所以所有的文案不要有任何营销的元素在,这个应急项目的唯一目的就是给受事故影响的群众提供有价值的信息,让这些危难时刻伸出援手的当地商家的信息被更多需要的人知道。

在这个大约9个小时的应急项目基本告一段落后,我简单回顾了下,从不同角度,花了不同的时间资源参与这个事情的同学差不多有100人,涉及十几个不同的岗位,但关键是,整个这个项目无论是到店事业群的总裁,还是酒店旅游事业群的总裁,都没有出来说一下,说我们应该搞下这个事情,应该怎么搞,谁和谁配合一下,甚至牵涉各块的业务负责人,也没有说这个事情多重要,我们应该怎么办,整个项目的缘起就是8月13日凌晨到店事业群负责京津大区的大区经理拉了一个讨论组,说了一句话,提了一个建议,然后与此有关的各个环节的同学就自发的通过在线交流群连接在了一起,这个事情就发生了。

拥抱变化

很多从其它公司,其它行业加入美团的同学都觉得,在美团干一年,相当于在其它地方干三年、干五年,很明显的感觉,时间轴被压缩了,一切都是在快进。前几天,王兴也说,每天工作不觉得,但回过头去看,有一种恍然的感觉。

是的,5年多的变化,从10个人到近20000人,从1个城市到1000多个城市,从第一天的3950元交易额到单日交易额突破5亿元,可以列举很多,而这些都只是数字,数字背后是无穷无尽的变化。

当变化到来的时候,是左顾右盼,还是纵情向前,这直接决定了变化是否能快速发生。例如在过去的几年中,美团在业务侧有着不同的尝试,有些业务做起来了,有些业务经过快速尝试后,觉得不行,或者时机未到,但资源总是有限的,不可能一直尝试,所以就会把测试的项目停掉,把资源投入到其它地方去。从旁人来看,这并不是一件很难的事情,但是如果是身在其中的同学,就不是一件容易的事情了。感性地讲,自己起早贪黑,种了一亩地,忽然有一天说,这亩地不种了,干点儿别的,将心比心,接受起来没那么容易。但在美团,所有这些事情发生的时候,我们看到的都是,第二天太阳升起,就是新的一天,“既往不恋,纵情向前”。

再比如,因为线下团队规模越来越大,业务的发展,业务模式的细分等等因素,对于美团各城市的同学,过不了多久就需要面对一次变化,例如佣金的政策调整,需要人奔赴新的城市,需要抽调人去服务新的业务,阿干说,来了美团后,感觉美团调整佣金政策的速度估计是很多传统行业管销售的人不可想象的。当这些变化来的时候,各级管理者的第一工作就是讲Why,同时,也要保证在变化过程中的公平、公正、公开。所以拥抱变化,并不仅仅是一种态度,这一条价值观的落地,也取决于能力,或者换言之,是一个组织的管理水平。

诚信

诚信不仅仅是说真话,还有更重要的一层意思是,说到做到。从这个角度讲,王兴作为美团的领路人,确实是个很诚信的人。接触王兴多的人都会觉得,王兴不是那种“大忽悠”型的,话不多,但逻辑清晰,字字珠玑,而且,也不喜欢画大饼。2012年年初王兴说我们要实现全年盈利,结果年底算了下帐,确实全年盈利了。2013年,王兴提出2015年我们要做到交易额1000亿元,现在看,到今年年底没问题。前几天美团内部的工作会议,王兴与一线同学面对面交流,有同学问美团目前的估值是多少,王兴说,最确切的估值就是上轮融资的估值,70亿美金,虽然我们这半年来进展很大,我们的价值肯定也随之提升,但你让我现在回答,我只能告诉你,最确切的估值就是上轮融资的估值。而王兴回答这个问题时,很多无良的媒体正在热炒抹黑美团亏损严重、现金流紧张、融资受阻,李首富也三番五次说,要投入200亿云云,在这样的竞争氛围里,王兴本人依然坚持诚信的原则,有一说一,不浮夸,不画大饼,于很多同类型企业,都不是一件容易的事情。而在过去的几年中,“启动上市”、“预计融资”这样的词语并不鲜见。

美团诚信不诚信,拆开来说,是对消费者诚信不诚信,对商家诚信不诚信,对员工诚信不诚信,对股东诚信不诚信,对媒体诚信不诚信。这里面的例子有很多,例如美团发布的交易额数字都精确到小数点后两位,对数据的表述也尽可能做到准确,比如美团酒店的间夜数据,传播时很明确说是“消费间夜数”,那些交易后发生退款的数量并不计算在其中,同时,面对极个别商家的恶意刷单,美团采取了零容忍的态度,发现一个处理一个,同时投入巨大的资源提升自己的风控能力。

而在美团,每个人诚信与否,也成为团队内部衡量一个人的一把重要的尺子,不诚信的人是态度问题,在美团,态度问题是大问题,影响个人发展,甚至影响去留。在这样一个环境里,把一个事情查清楚的效率就变得更高,通常某件事情出了问题,当事人都会被首先问讯,而不是背后搞调查、搞动作,因为大家都首先相信,当事人会说真话,这也从另一个角度体现了对人的尊重。

敬业

敬业这个词经常被理解成拼命干,对自己要求高。我的感觉,敬业在这个词,首先是对自己岗位的尊重,然后是在不同岗位工作的同学互相之间的尊重。

例如这次制作价值观的海报,我相信在很多公司,做海报就只是做海报那个设计的事情,通常的方法就是设计师做了几个版本,给老板挑,老板说OK了,就行了。但美团这次价值观海报的制作,我知道的就开了3次正式的会议,参加会议的有HR的同学,设计的同学,还有一些在美团工作时间比较长的同学,相信期间设计同学自己还有不少次交流。无论是海报上的图案,还是文案,都经过了反复讨论和相互挑战。我想整个过程表现出的就是参与这项工作的同学对这次工作的尊重,大家都知道自己使命在肩。

美团因为业务牵涉到线上、线下,又涉及不同的本地服务领域,所以和传统的互联网公司相比,岗位就多了很多,而在美团,不同岗位的同学之间,都能表现出一种对对方岗位的尊重,这种尊重很纯粹,例如新业务推进过程中要解决一个运营流程,负责的同学就会在线上找到此前负责类似业务的同学请教,产品和技术在听到销售同学一起喊口号的时候感觉都很震撼,而销售同学每每在朋友圈上分享产品技术的进展时都充满了满满的自豪。如果你有过在大型公司工作的经验,你会了解,其实这种互相尊重并不是一件容易的事情。

除了尊重外,很多美团人都相信,在自己现在的岗位上只要不断去深耕,就会挖掘出一口甜美的水井,进入到下一关。比如我认识一位同学,最早在商户服务的岗位上通过电话解决商户的问题,因为自己会在工作过程中不断总结梳理,就想到要挑战商户服务BPI的工作,但应聘并没有成功,可她没有放弃,继续努力,没过多久负责商户系统运营的小组招人,她因为有商户服务的经验,又希望在BPI上有所进步,成功的应聘,开始了运营工作,大概过了一年多,运营的经验积累了很多后觉得自己可以在产品上有所学习,又努力应聘了内部通讯系统的产品经理,而现在她已经在这个岗位上工作了快一年了。

王兴说,他作为CEO,主要有三方面的工作,确定公司的战略,保证公司有发展所需要的充足现金,把战略传递给公司的核心管理人员,王兴在几次内部讲话中都提到希望自己可以把自己的工作做得更好一些。除了他的本职工作外,王兴并不会替他的下属去做决定,虽然他会花很多时间参加业务会议,但他往往只是给出自己的建议,而因为他和下属之间有建立起的互信,在讨论问题的过程中也可以保持互相的尊重,所以他的下属也不见的会把他话当成“圣旨”,除非确实觉得王兴的建议更好。

很多事情都是自上而下的,敬业更是如此。

勤俭

在美团的七条价值观里,勤俭这条是受到挑战最多的一条,因为很多人都觉得,勤俭就是“抠”的同义词,但另外一个情况是,这种挑战变得越来越少,因为越来越多的人理解了勤俭更深层次的含义。

王兴曾经说过一个自认为很不雅的比方:“赚钱如吃屎,花钱如拉稀”,但作为公司的CEO, 他确实是觉得省钱对于美团所处的这样一个低毛利的行业,是一件很重要的事情,例如他就还发过另外一条饭否(是的,就是中国最早的微博),内容是:“住在汉庭,和人谈事情约在朗廷。” 汉庭一晚的价格差不多是100多元,而朗庭一晚的价格差不多是2000元,王兴认为出差,100多元的汉庭完全可以解决自己的问题,能省则省。阿干也曾讲过一个相关的故事,王兴去杭州请他入伙的时候,也住在一个经济酒店里,阿干当时还想,既然来挖我,总应该住在一个差不多的地方,显示下公司的实力吧,可是王兴并没有这样做。

当然,出差住宿省钱只是勤俭的一个很小的细节,对于美团现在所处的市场环境而言,如何效率更高的花钱是更重要的事情,无论是提高IT的能力让团队工作的效率更高,还是通过制定清晰的业务策略,建筑高水平的风控能力,不要傻大粗的去撒钱,这些都是我认识的几乎所有管理人员在讨论所有涉及花钱的问题上,都在不断讨论、反复挑战的问题——是不是有投入更少的方式可以得到相同的效果,如果投入不能减少的话是不是可以得到更好的效果。

大家都相信,如果我们比同行可以更高效率的花钱,一样的钱花出更多的效果,那美团的价值就会提高,如果美团需要更多的钱,钱会自己涌过来。毕竟这个时代,不是比拼谁的账户上更有钱,而是在比拼谁的效率更高,吸引资源(比如钱)的能力更强。

除了钱以外,“人”和“时间”都是节省的对象,省确实不容易的事情,但当“省”变成美团的特色后,反倒会让很多美团人觉得“省”才是酷,例如销售部门在组织工作会议的时候,会觉得相同的花费下谈来比去年更好的会议场所,是件非常牛的事情,而王兴和大家一起在会间吃盒饭的场景,也会成为一线同学纷纷在朋友圈转发的内容。

学习成长

王兴写过一条饭否,差不多是2011年,王兴说:开会时一个年轻同事的一句话至今回荡在我耳边,当时大概是晚上12点 ,讨论接近尾声,需要有人整理会议记录,涉及流程图的部分用visio画比较好。我问她会用visio吗,她毫不犹豫地说 “我可以学” 。这四个简单的字里有无穷的力量。

而在一个月前,酒店的年中工作会议上播放的视频里,一位酒店的一线管理者也说道,“在我的团队里,没有会不会,只有学不学”。

在一个飞速发展的行业里,学习成长就成为了这个公司是否可以持续卓越的根本动力,每个人都在学习,许多人都喜欢分享,大家都认同学习能力强的人会有更好的发展,而几乎所有岗位的面试,除了是否有相关经验外,学习能力也成为考核的要点。

除了提高学习能力,保持空杯心态也是许多同学看重的东西,大家相信,太阳底下无新知,我们遇到的问题并不是全新的问题,如何从前人的经验,从书本中去汲取力量解决问题,而不是凭经验凭习惯甚至凭资历凭地位去武断答案,成为了越来越多人的习惯,虽然这并不是件容易的事情。

有学习才会有成长,美团作为这个行业的领先者,即是学习的好场所,也是成长的快车道,阿干和很多员工分享成长经验的时候,讲过每个人有三笔钱,一笔是今天的钱,也就是大家现在的收入;一笔是明天的钱,也就是通过自己的成长可以获得更多的收入;但对于很多20多岁的年轻同学而言,最值钱的是后天的钱,也就是你在美团的所学所获。学习成长很像是零存整取,对美团发展有信心的同学都倾向于在年轻的时候获得更多的成长。

以上就是我对美团价值观的一些认识和理解,我自2003年开始工作,到今天已经12年了,12年来,我从来没有像现在一样感觉到价值观的重要,或者说价值观的力量。所以即便写这么多字并不是我希望的事情,但发现想把自己的体会说清楚还是需要写这7000字。

美团的七条价值观构成了一个金字塔,我们都知道修金字塔并不是一件容易的事情,价值观的落地比修金字塔,只会更难,不会更容易,所以在“金字塔”海报上,有一句话,也是很多美团人信奉的一句话,“坚持做正确的事,而不是容易的事”。

坚持做正确的事情,美团才这样一路走来,坚持做正确的事情,美团才会在这条平凡之路上继续走下去。美团有三门课,《我们的历史》,《我们的事业》,《我们的价值观》,正如回答保安的那三个经典问题,《我们的历史》回答的问题是我们从哪里来,《我们的事业》回答的问题是我们到哪里去,而《我们的价值观》回答的问题是,我们是谁。

我想,我们是一家有价值观的公司,我们是一群有共同价值观的人,这就是美团最大的特色——志同还要道合——同时,这也是美团在昨天,在今天,在明天可以持续创造价值的原因之一。

2015年8月14日, 钟永健 于厦门。

261月/15

资源平台化、O2O获客以及移动端C2C服务做定制旅游

发布在 邵珠庆

根据去年 5 月的一份《2014中国高净值人群心灵投资白皮书》,我们可以看到越来越多的有钱人热衷于在旅游领域的投资,而且相比于大众化的旅游产品,他们更青睐定制游、主题游等个性化的产品。

目前在高端旅游市场,也已兴起了一大批定制旅游品牌,比如中青旅的耀悦众信旅游的奇迹旅行携程的鸿鹄逸游太美,还有兰卡之星主打私人健康旅行的优翔遨乐网帝国假日等,不过中端定制市场的选手貌似并不多,目前有无二之旅十方旅行等,另外还有将在中高端市场掘金的游心旅行

在游心旅行的创始人蒋松涛看来,定制旅游市场是没有巨头天花板的,而且目前太美、鸿鹄逸游等高端定制逐渐趋于标准化,并不能满足人们日益多元化的需求,再者,目前并没有同时涵盖中高端市场的定制旅游品牌,游心旅行就是想填补这个空白,为这些用户提供定制、半定制旅游产品及服务,并且以平台化资源、O2O模式获取顾客,以及打造移动端C2C服务来完善整个定制体系。

资源平台化——以自营产品为主,商家资源为辅

游心旅行会经营主要出境游业务,包括定制旅游,以及自助游中消费频次较高的目的地产品,海岛、美国、澳大利亚、新西兰等地都会主力经营,然后引进一些其他的商家,像鸿鹄逸游等高端定制的资源,游心旅行也都能获取,而至于邮轮等比较低频的产品,游心旅行就不会自己去做。

之所以将资源平台化,蒋松涛表示:一则是因为旅游的消费频次低,所以通过平台引入其他供应商可以从产品类型上进行扩张,让用户有更多选择;其次是为了把控资源和用户双方,举个栗子,像赞那度虽有调性、品位,虽然产品做得很精致,事实上它也只是一个媒介,资源并不在赞那度手中,而游心旅行通过轻重取舍则能很好的把握优质资源,并保留住忠诚用户。

开设线下体验店,以O2O的模式获取顾客

一直以来,定制都是一个重线下运作的过程,即便在互联网的冲击之下,这些单价较高、消费频次低的产品也并没能有效走到线上。所以,游心旅行也采取 O2O 的模式,通过开设线下实体店来获取用户,一方面能给用户舒适的交流环境,另一方面也增加了用户对游心旅行的信任感。

打造贴身旅行管家Mr.U,在移动端提供C2C服务

用户在目的地的体验才是真正的消费环节,因此,游心旅行在移动端提供 C2C 服务来解决用户行中问题,目前姑且称它为“游心旅行管家”。

与上述的资源平台化思路,提供目的地服务的旅行管家一部分来自游心旅行全职的旅游产品经理,也会逐渐让众信、中青旅等旅游机构的专业人士入驻;另一部分则由旅行达人组成,比如即将合作的眭澔平(具体介绍见全文末尾)。

通过这种方式,既不会让游心旅行的业务模式过重,也能保证行中服务的快速有效。当用户在行程中遇突发情况,比如临时更改行程,直接就可以通过 App 联系到旅行管家,问题不大的情况下旅行达人就能直接提供建议,如果比较复杂,那么专业人士就会帮助落实这些服务。

最后,用户还能对这些旅行管家评分,优胜劣汰之下能将有潜质的旅行管家挖掘出来,而那些起初以兼职身份存在的人也可能因为挣到钱而转作全职。

而提及未来,游心旅行不仅想做一个中高端定制旅游的服务平台,他们更希望能打造出一个中高端的品牌形象,将通过定制旅游获取到的具备极强消费力的中高端用户往其他服务进行导流,比如推出Ms.U品牌——可以提供针对女士美妆、购物、养生的产品,或者是Baby.U这样的形象来为孩子推出游学等服务。

团队情况上,游心旅行团队聚集了来自鸿鹄逸游、太美旅行、穷游网、赞那度等的成员,也吸纳了腾讯、网易等互联网人士加入。蒋松涛告诉36氪,游心旅行于 2014 年 5 月份上线,上线的当月便获得了天使投资,又于 2014 年 8 月又完成了鼎晖投资与北极光邓锋的 Pre-A 轮融资,12 月份完成千万美金级别的 A 轮融资后,又并购了转型旅游定制的五星汇

注:报道所涉融资金额由对象公司提供保证,36氪不作任何形式背书。

注:眭澔平,台湾人,集记者、作家、歌手与主持人的身份于一身,更是一名虔诚的旅行者。他是三毛的忘年交,也为实现对三毛的承诺,二十多年已走遍180多个国家,踏遍世界的每一个角落。在《我看到的世界和你们不一样》一书中,他在南极给企鹅唱着月亮代表我的心,在菲律宾古毒体验耶稣之苦,遭受钢钉穿手的洗礼......读了他的故事之后,希望你也能“与年少初始纯真的自我相逢”。

257月/14

About TripAdvisor

发布在 邵珠庆

About TripAdvisor
TripAdvisor® is the world's largest travel site*, enabling travelers to plan and have the perfect trip. TripAdvisor offers trusted advice from real travelers and a wide variety of travel choices and planning features with seamless links to booking tools. TripAdvisor branded sites make up the largest travel community in the world, reaching nearly 280 million unique monthly visitors**, and more than 170 million reviews and opinions covering more than 4 million accommodations, restaurants and attractions. The sites operate in 43 countries worldwide, including China under daodao.com. TripAdvisor also includes TripAdvisor for Business, a dedicated division that provides the tourism industry access to millions of monthly TripAdvisor visitors.

TA®是全球最大的旅游网站*,使旅客计划,并有完美的行程。到到网提供值得信赖的真正旅行者的建议和种类繁多的旅游选择和规划功能的无缝链接,预订工具。TA品牌的网站,弥补了世界上最大的旅游社区,达到了近280万独立访客每月**,和170多万条评论,覆盖超过400万的住宿,餐馆和旅游景点的意见。该网站在43个国家经营业务遍布全球,包括中国下daodao.com。TA还包括到到网的业务,有专门的部门,提供旅游业访问数以百万计的每月到到网的游客。

TripAdvisor, Inc. (NASDAQ: TRIP) manages and operates websites under 23 other travel media brands: 

TripAdvisor(NASDAQ:TRIP)管理和运营的网站在其他23个旅游媒体品牌

www.airfarewatchdog.com,

www.bookingbuddy.com

www.cruisecritic.com

www.everytrail.com

www.familyvacationcritic.com,

 www.flipkey.com

www.gateguru.com,

www.holidaylettings.co.uk

www.holidaywatchdog.com,

www.independenttraveler.com

www.jetsetter.com

www.lafourchette.com,

www.niumba.com,  

www.onetime.com

www.oyster.com

www.seatguru.com

www.smartertravel.com

www.tingo.com

www.travelpod.com,

www.tripbod.com

www.vacationhomerentals.com

www.virtualtourist.com,

www.kuxun.cn

125月/14

马云内部邮件:为什么这15年我们能幸运的生存下来

发布在 邵珠庆

5月7日凌晨消息,据新浪科技报道,阿里巴巴集团董事局主席马云通过内部邮件向阿里巴巴员工宣布,阿里巴巴集团正式向美国证券监管委员会递交上市注册登记书,并提醒全体阿里巴巴人,感恩过去,敬畏未来。

附,马云邮件全文:

新的机会 新的挑战 新的征程

各位阿里人,

几分钟后我们将会正式向美国证劵监管委员会首次递交上市注册登记书。这将意味着阿里巴巴即将进入新的挑战时代。

15年前,阿里巴巴18个创始人立志创建一家中国人创立的属于全世界的互联网公司,希望能成为全球十大网络公司之一,成为一家能生存102年的企业。15年过去了,我们幸运的生存了下来。我们活的比我们当年想像的好得多。

我们明白这不是因为我们多么的努力,或者是多么的聪明能干让我们走到了今天,而是因为我们幸运的生活在这个时代。感谢互联网,感谢生气勃勃的年轻人,感谢在一路相伴的创业者和追梦人,感谢这个国家改革和开放的进程。。。

我们深知,我们生存下来不是因为战略多么的宏远,执行力多么的完美,而是我们十五年来坚持了“让天下没有难做的生意”这个使命,坚持了我们“客户第一”的价值观,坚持了相信未来,相信相信,坚持了平凡人一起做非凡事。

相信公司的注册登记书(内含招股书)第一版公布之后,我们将会面临各类评论。15年来,在大量的支持,赞语和掌声背后,我们从来不缺指责,批评,漫骂和质疑。回应这一切最好的办法是用我们感恩和敬畏的心态,一如既往的追随“让天下没有难做的生意”的使命,专注工作,让小企业成功,让时间让结果去说明一切。

上市从来就不是我们的目标,它是我们实现自己使命的一个重要策略和手段,是前行的加油站。但阿里人要清醒的认识到资本市场巨大利益诱惑背后有着无比巨大的无情和压力。只有很少数的杰出企业能够在资本市场持久驰骋。阿里巴巴这次在国际资本市场必将会因为规模,期待值,国界意识,文化冲突,区域政经。。。。遭遇空前绝后的挑战和压力。只有坚持我们的坚持,相信我们的相信,我们才有可能在压力和诱惑中度过未来艰辛的87年。能够面临这样全球性挑战的企业并不多,我们荣幸成为其中一个。

上市后我们仍将坚持“客户第一,员工第二,股东第三”的原则。我们相信做任何艰难的决定,不管是在过去还是将来,坚持原则才是对各方利益最大的尊重和保护。上市某种意义上是让我们更有力量去帮助客户、支持员工、守护股东利益。

最后,提醒大家注意严格遵守证券监管法规及集团的保密规定,不要对招股书做任何公开评论,所有采访须知会集团公关部,通过集团公关部进行协调。

至于每个员工的股票事宜,集团HR将会发出处理方案。这是件令人高兴的事。我们也必须坚持“认真生活 快乐工作”的原则,请大家处理好自己的财富,在照顾好自己,家人的同时,力所能及的做些回报社会的工作和捐助。谢谢大家了。

“兴于诗 立于礼 成于乐”,阿里人,过去15年我们过的很艰难,但很精彩。未来的每一天注定不会平凡,不会简单。今天不努力,我们可能看不到后天的太阳。没有一家企业会持久顺利,我们在坚持我们坚持的同时,必须为客户而变,为世界而变,为未来而变。

马云

阿里巴巴集团董事局主席

2014。5。7

阿里大事记

94月/14

同程网吴志祥:拒绝赢在中国500万后,我是如何融资的

发布在 邵珠庆

今天是一个值得纪念的日子(同程网获腾讯、博裕、元禾5亿元的新一轮融资),就讲讲公司的第一次融资吧。融资对任何一个创业者来说都是非常重要的,而在2006年之前,我们对此却毫无概念,虽然有时也会看看国内的互联网公司融资上市的故事,但觉得那实在是太遥远,就象那个卖火柴的小女孩隔着玻璃看着有钱人吃火鸡一样,觉得这是两个世界的事。直到06年参加完赢在中国,半年多时间,接触了国内最顶级的企业家,投资人,象马云熊晓鸽阎焱徐新等,在12进5的七场商战中,每周都可以面对面与他们交流,对自己的提升帮助确实是无与伦比的。从北京回来后,我们也在更多的思考我们的商业模式(之前我们一般说如何赚钱,从北京回来后,知道了“商业模式”这个词比“如何赚钱”高大上多了,其实是一回事)。

同程网吴志祥:拒绝赢在中国500万后,我是如何融资的

这是当时参加赢在中国108进36模拟商战时的照片,他告诉我,任何时候,帐上有钱是多么重要。

前几篇讲了,我们找到了第一个产品网上名片,赚了第一个100万,可是在北京参赛的时候与投资人一交流,人家觉得你这个模式太没想象空间了,1万家旅行社老总,每家给你交1000元,只不过1000万,这只是一个能赚点钱的生意,做不大,当时不知哪个大佬说了句,同程网这个模式是苍蝇趴在玻璃上–有光明没前途。

于是回到苏州后,经过激烈讨论,我们做了个艰难的决定,放弃赢在中国的500万投资,下定决心融一笔更大的钱,做一件大事,于是一方面我们继续做网上名片把眼前的钱先赚了,另一方面尝试各种各样的模式,那时记得经常几个人在办公室的白板上画各种模型,计算市场有多大,能赚多少钱,每次计算的都热身沸腾,连夜写好商业计划书,第二天与投资人一交流又是一盆凉水从头淋到脚,那一段时间,大概谈了十几家国内知名的VC,我与和平跑了上海最高档的写字楼(风投一般都在最高档的写字楼里),但可能我们这个团队实在太土,基本回答都是你们的项目很有意思,有消息我们通知你们,但我们一般都等不到消息。

就在我们自己都快要放弃的时候,大概2007年7月的一个中午,一个投资人主动上门了,一换名片,中新创投,觉得这个名字挺大,一聊其实就是苏州园区的,当时负责我们这个案子的是刘彪,到今年他跟我们已经走了六年多了,投了齐家网,笛莎公司,从投资经理变成了知名投资人。但那时他也刚做投资不久,青涩的投资人遇到青涩的创业团队,第一次居然谈的很投缘,从那次以后,我们一两个月见一次,每次聊的也很随意,到2008年3月的时候,他告诉我们,投委会已经通过了,第一笔投资1500万,但觉得我们的价格太贵了,如果一定坚持这个价格的话,就需要加上对赌条款。这些对我们来说,完全没有概念,幸好参加赢在中国认识了很多很牛的朋友,当时的百合网的老大钱江给了我们至今我们也认为非常正确的一个建议,价格可以谈,但投资一定要一次性到帐。于是,我们接受了对赌,但要求不能分期,一定要一次性到帐。又经过1个月的最后谈判,最后签订了合同,合同签完,我与和平就放心出差了,结果三天后的中午,接到刘彪的短信,“资金调度有点问题,我们财务总监正在筹措”,当时我的感觉就是悬了,地主家怎么也会没有余粮呢?还好,两天后,2008年4月的一天,公司的第一笔融资1500万终于到帐了。我们向苏大借了个会议室,开了一次全体员工大会,请投资方代表讲话,中新创投的赵总说这是他们最大的一笔早期投资,希望我们为他们争光(现在看来,基本做到了,以后应该会争更大的光)。我宣布了公司融资后的第一项也是唯一一项福利,从今天起,公司所有同事不用轮流扫地了(之前我们都是值日部门提前15分钟到公司打扫卫生),我们请了一位扫地阿姨,我说,扫地阿姨就是我们融资成功的象征,以后大家看到阿姨,就要充满信心,因为我们是一家帐上躺着1500多万人民币的公司(当时真的觉得1500万是一笔几乎无法花完的钱,特别喜欢用“躺”这个字),所有同事热烈鼓掌,似乎美好的未来就在我们面前。

半个月后,汶川地震了,全国旅游形势急转直下,幸好,1500万已经躺在了我们的帐上。

这就是公司的第一次融资。

网上融资的心得很多,适合自己的才是最好的,下面几条是我们自己的经验,不一定对:

一、投资人的钱袋和他们的脑袋一样重要

二、商业模式是讲出来的,更是做出来的

三、你讲的商业模式可能以后证明是错的,但在你讲的时候,你一定是发自内心的相信

四、在帐上有钱的时候找钱

五、想清楚为什么拿钱比拿钱本身重要

六、拿钱的时机比拿钱的多少重要

七、不同的发展阶段找不同的投资人

八、第一轮投资找一个能长厮守的投资人比一个大牌的投资人重要

同程网吴志祥:拒绝赢在中国500万后,我是如何融资的

这是参加赢在中国36进12淘汰赛的照片,我是第一场第一号,当时2分钟限时讲商业模式,

我临时准备了四张纸,打印好。为什么能赚钱?能赚多少钱?能赚多长时间?为什么是我们?

这招让我通过了马云吴鹰熊晓鸽的考核,顺利晋级。后来很多朋友告诉我,他们融资商业计划书就是按这个思路,我听了有点小得意。

作者:吴志祥(同程网CEO)

   下一页