“中国梦”我们习主席上台后就大大倡导。国家领导人有他们的中国梦,创业者也怀揣着创业的梦想。我们张罗好产品就要准备风风火火的大干一番了。合伙人很重要啊,就比如结婚一样,一定要找个好的对象。得有不同兴趣互补、又要有共同爱好、互相可以接受对方的缺点,也有很好的处理分歧的方式。找谁合伙可以看之前一篇 《技术人员如何创业《二》- 合伙人的模式》,这次主要说说我们公司创业的时候怎么去分工。

记得公司刚开始成立时,团队有一个技术型boss、一个行政、两三个技术。这个时候主要是为了一个ideal、满腔热血就开始开发。分工是这样的,boss指导方向、行政打点生活和后勤、技术作为先锋开发软件。这里就有个问题了,很多时候一个想法并不能变成一个产品。比如,我要研发一个记录笔记的软件,可以支持本地和在线,还支持交流分享。一句话需求如何去实现呢?在boss的眼里,这些都是他根据自己平时的生活工作发现的机会,技术实现人员就应该把这句话变成一个他满意的东西。我ca,一般技术型老板都认为这个很好实现,然后自我夸奖自己之前开发过什么很大的项目之类,不过这个是产品设计,并不是一个技术难题。怎么说呢?
首先,这不是一个好的产品定义,技术实现人员尝试着去理解开发最后不是boss要的。boss可能也只是了解产品的基本面,知道有这个市场空缺,具体怎么操作、怎么交互他也不清楚。
第二,没有细化,计划无法执行,可能导致项目时间把控不住。很多时候boss也会参与开发,导致产品进度没有人跟进。
第三,技术定义产品,可能会不自觉的添加很多非功能的潜在需求。比如要建立一个业务系统,先要引入一堆新技术。

所以之前这个项目就因为这样的模式很快就暂停了,做了2个月最终还是拿不出手。后来大家总结并改善了合作分工。由boss把握产品方向,建立公司级别的管理制度,定期收集和整理用户的需求和反馈;行政辅助建立督促公司的制度执行,负责部分用户的客服工作;技术负责把boss提的和用户提的需求实现,并先写个需求文档交给需求方开会总结,确认没有问题就变身码农实现系统。没有把这个产品具体定义出来是不能开发的,不是说很完美的一个产品,至少是能够体现得出最核心的功能。因为我们做的是一个针对企业的产品,光靠技术在家里蒙着头发明轮子是不行的,还必须定期了解用户的需求,反馈给我们进行反复迭代。这时一个小的产品研发团队初见规模,在这个阶段最需要的是产品设计、团队管理、技术研发。相当于我们的boss承担了产品设计和整体团队管理的工作,作为公司的负责人必须这么做也只有这么做。因为公司是boss搭建起来的,公司未来怎么走,员工积极性高不高直接影响了项目的结果。公司刚成立企业文化管理、团队管理就要建立起来,不能因为是创业公司生存压力大就不考虑。这些东西就像技术框架一样,没有这些东西也可以开发系统,但是如果不建立,后续开发的模块越多就越乱。导致到了最后添加一个简单的新需求都会寸步难行,制度也一样,一开始没有良好的企业文化和制度,这样建立的团队也是散的、没有战斗力。

产品设计
这个是很重要的,没有好的产品或者好的服务公司是赚不到钱的。是不是每个公司都必须要boss去设计产品,这个不一定,但是boss必须要把握公司的产品战略,或另找一个产品方面比较牛的人来专做这样的事情。特别是我们技术型的人才(不是复合式的),要转型到有产品思维的理念需要有个过程。我觉得就算有专业的产品合伙人,技术型的ceo也要多从业务角度、消费者、商业链条的角度去思考产品和战略。这个刚开始很难,做起来不是特别有感觉,除了课余时间恶补各方面知识外,还需要多从用户角度去收集意见。我记得之前腾讯发布一个版本时,先开发一个基础版本(80%的内部人员满意,不是说自我觉得全部ok)就发布给部分vip用户使用,美其名曰vip用户优先体验新版本,其实这个时候是充分调动了vip用户的积极性来收集这个产品的用户意见,在全面发布版本的时候提前改掉不合理的设计。技术人员是很固执的,一但决定要做一个功能,很难说服他不做这个。通过用户的角度来思考,更有说服力。经过几次迭代,个人和团队的工作方式也好转了,大家在产品的捏拿也更有感觉,不只是ceo。参与这个过程的行政、技术人员都会通过用户反馈吸取到意见。不过技术人才要创业,要当ceo就必须要华丽的变身,后续会越来越少的参与技术,最终可能转变为总体产品经理。常见的技术型ceo有马化腾、李彦宏。

团队管理
这个也很重要,没有好的团队做不了太多的事情。在大公司工作是这样吧,很多时候大家不朝一个方向努力,互相排挤对方,也就是很多大公司难以产出好的产品。小公司的人员管理也很重要,因为每个人承担的东西更加多,一个人相当于多个人用,如果大家不朝一个地方使劲,怎么可以做出非常好的产品。在这个时候有些事情就很重要了,确定企业文化、建立奖惩措施、建立好的工作环境、良好的工作氛围、目标明确的前景规划、看得到的计划里程碑。刚开始创业时最重要的可能是一个想法或者一个产品,但是随着公司的发展人才才是最重要的。有了好的人才可以让公司基业长青。怎么突出优秀的人才?先要好的选拔机制把有突出表现的人选拔出来,如果确实能力很强、态度很好,并且和公司利益一致,可以吸纳为小股东。让每个优秀的人都能有归属感,使他们感觉到自己是企业里的一份子。团队的建设其实在这个时候是很难的,因为公司小、资金紧张、又想找好的人才。很多公司开始有风投的,人才吸引方面问题不大。我们公司开始时没有,靠的是自己积蓄和亲朋好友天使投资。那这个人才问题怎么解决?我们找了一两个核心开发人员,再找一些有潜力工作不太久的开发人员,通过技术总监带核心开发、核心开发给普通开发当导师的模式共同构造一个学习型的团队,鼓励实战中学习。既能把工作做好,也使大家在学习中获利,双赢收效还不错!

技术研发
这个非常重要,技术不给力,就实现不了好的系统。所以互联网技术型创业的公司都有个什么都懂一点技术总监,负责攻克所有的技术难题。其实从刚开始来说他主要负责是需求分析、组建技术团队、系统设计,随着公司的发展,后续可能还需要承担一些产品设计、团队管理,甚至是一些销售的工作。虽然做的事情很多,技术人员也还是从多方面发展和锻炼了。从我的经验里,我觉得目前解决业务的技术都不是难题,所有的技术问题都可以解决。难题就在于在有限的成本下如何构建满足业务高性能需求架构(因为小公司不像大公司预算那么多买高性能服务器)、如何在有限的成本下构建超强执行力的团队、如何实现一个用户喜爱的产品。 关于技术如何做需求、构建超强执行力团队等具体怎么实施后面可以讨论一下,我们采用的自己特有的敏捷开发。

光有了产品还不够,就算再好的产品,用户看不到就谈不上购买了。隆重介绍一下销售。

销售
这个太重要了!怎么让我们的目标用户看到我们的产品,需要一个好的销售总监。在技术型公司,很多时候是看不上销售的,他们认为自己很牛的技术产品客户就自动找上门来。一开始只是研发产品,往往不具备销售人才,这也是刚开始创业公司的一个短板。产品快出来了的时候,可能也有点不是那么完美,不需要等到产品100%完美。要尽早提前预热的预热、准备的准备,其实也是这么回事,产品销售炒作才能体现出他的价值。有时候2块钱卖不出去的苹果,100块钱反而卖出去了。不管任何时代,营销广告都是非常重要的。站外的销售操作也是越早做越好,包括熟人群、qq群、邮件群、seo、sem、微博、微信等等。通过关系网把自己的产品推销出去,适当做些营销造势增加曝光度,树立行业领先地位品牌。而销售型的ceo可能模式就有点不同,他们可能更多的关注业务价值,怎么把核心的商业理念通过简单的技术手段实现来解决客户的问题。所以很多销售型ceo之前积累了很多客户和行业经验创业更容易成功。比如刘强东、马云之类。

其实这些都是一些角色定位,在创业初期可能一个人就兼职了多个角色,怎么去平衡,还看自己的人员配置!

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 技术人员如何创业《三》- 合伙人的分工

不得不说这是个浮躁的社会,人人在这个社会都想暴富或者成名。在这些引诱的驱使下很多人都脱离了原来的稳定工作创业。前几天看了《中国合伙人》,故事讲到了几个大学生从校园到工作、再到创办了一个伟大的企业,这个故事更加激励了创业大军的壮大。大家都想创业,那我们技术人员怎么创业?也就个人的经验分享一下:

    1、好的想法、产品构思。
    2、好的合伙人。三板斧,管理、销售、技术。
    3、构建强大执行力的团队。

产品及想法:
什么是好的产品?一个朋友之前问到,这个问题要系统的回答还真有点不好说。看一下比较理论的解释,产品指一个能够满足用户的需求,我们能够使用可行的技术手段实现并且通过销售给用户给公司带来利润。好的产品指具有很好的用户体验,能够满足用户的刚性需求,受众用户市场空间很大,产品具有核心竞争力,具有不可复制性,有收益并且具备很好的产业链和利益平衡点。

我们技术人员设计产品会是什么样子?这点在创业中遇到了很多问题。有一些技术人员拿到一个产品就开始想象自己的产品未来如何的好,将来会赚多少钱,结果研发到最后往往不是这样的。为什么呢?因为技术人员平时自己总是在搞定一个又一个的问题,做完了一个别人提给自己的需求就觉得自己信心暴涨,认为这么简单的产品自己也可以很轻松就做出来了。看看自己搞的程序,这么复杂的工程,多有成就感。可是,自信心爆满的工程师如果不自我总结,研究用户需求、研究产品,只是自己一个人关门造车的话很难开发一个大众都喜欢的产品。

现在我们处于一个信息量大、优秀产品非常多的时代。要在这个时代获得成功必须得迎合用户的需求甚至超出期望才行。技术人员怎么操作呢?

1、做市场调研、多和客户沟通、认真做好需求分析。

这个看似简单,对于技术人员确实难度很大。因为毕竟大家习惯了面对电脑,喜欢了在电脑面前攻克难题,让我们去做这些事情总觉得时间花的不值得。有时候可能会想,我花这个时间去做个计划、去和客户沟通、写个需求文档还不如多学一点技术或者多写一些代码。技术相关的事情才是看得到摸得着的东西。这样就错了!大错特错!

很多创业公司开始没有产品经理,像facebook的ceo扎克伯格。或者只有技术一个人,这个时候公司的创始人就承担了产品经理的角色,如果创始人就把自己的点子抛出来给大家或者稍微分解一下就给到大家。然后大家分别去实现,自己也不管了,忙着开发自己的功能模块。以我们的经验,最后肯定是个四不像的产品。那意思就是不开发产品了吗?看看电影《社交网络》就知道,扎克伯克其实不仅仅是技术很牛,网站搞瘫了整个哈佛的网络,他的商业敏锐度和用户需求也拿捏得很好。在设计第一个长相匹配的网站时他知道整合爱德华的算法。在设计facebook时知道怎么利用其他学校都想和哈佛名牌学校的学生交友、如何通过熟人关系网络邮件营销、添加用户是否单身的标示(最后这个功能大获成功)。

看到这里其实大家会想到,其实facebook的成功并不是因为他本身产品的技术多么牛,而是他把握好了产品用户的心理、选择了合适的营销方式、整合自身独有的资源优势(哈佛)。其实他这个php网站我想现在很多学过web编程的都可以制造出来,有几个能做成facebook呢?

在《中国合伙人》中也有个场景,成东青因为在外面开小班被大学辞退了。最后一堂课时改变了原有的讲课风格,原来上课小心谨慎的照着课本讲,课上的同学都在睡觉(因为那个时候风气比较严谨),因为他在乎这份工作所以特别小心注意。最后一堂课给大家调侃自己的感情经历,已经释然反正都已经被学校辞退了,结果讲课的风格大受同学欢迎。这个就是市场,有时候自己觉得对的不一定是对的,而是要和用户交流,充分尊重用户。他最后把同学当成朋友,也为他后面赢得了新梦想。

这些在技术人员看起来的没有技术含量的脏活、累活反而是一个产品成功的关键。

2、适当的抛开技术,避免影响到产品设计和开发

技术人员设计产品时,总会把系统搞得特别是复杂。因为做技术框架时会想到重用、接口定义时要很灵活。一但这些技术方面的原因占据了产品的主导地位,那这个产品最终会超级复杂。不过有一点,除非你的客户是专有的或者是面向技术型客户。不过面向大部分社会上的产品一般都比较傻瓜化、尽量简化,不让用户思考,一看这个系统就知道怎么使用。

facebook曾经为了诸多技术原因选择了通用平台化的Html5作为技术实现。最终却因为用户的抱怨不得不重新使用ios、andriod开发原有应用。

很多技术在设计系统时,总想把很多新技术带入项目中来,让自己觉得特别牛X。殊不知这样的技术自己能否掌控,如果掌控不了到时候出了问题影响的就是产品的口碑。并且引入新技术,带来了学习成本,如果团队中还有其他成员,未来他们如何学习和开发。

技术人员还有个弊病。觉得自己的技术非常牛,人家不可能超越我的技术(也就是未来我的产品肯定是市场占有率最高的,通俗讲我的产品是最赚钱的)。研发几个月后发现竞争产品推出来了,会觉得他的技术多么弱,不削一顾。再过几个月,发现对方产品已经占据很多客户,并且推出了好几个新产品,还是觉得他的核心竞争力没有,技术能力弱,我的技术毫无压力的压倒他。再过几个月,tnnd,我这么好的产品怎么没有市场呢,赶紧换一个产品。。。。。结果可想而知。就算是自己最开始研发这种类型的产品,结果到后面反而没有赚到钱。这就是盲目的技术自信,而不是商业自信,开公司是要赚钱的,赚钱才能养活公司。

技术人员设计产品时,一定要有市场眼光、简单化功能、适当摈弃技术。刚开始要做到这些可能很难,需要大家强迫自己不往技术方面思考,不过我觉得只要多发现、总结自己的问题,并想到解决方案终会创造一款好的产品。如果大家尝试了无数次,还是技术影响整个产品的设计,推荐几个选择:
a、找到互补的合伙人,弥补你的短板。
b、开发技术类产品。
b、回到公司工作继续做技术。

现在大概总结了产品设计的一些经验,后面再总结下我们怎么把这个想法变成可运行的东西。

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 技术人员如何创业《一》—— 产品及想法

互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库。在这样严峻的条件下,一批又一批的创业者从创业中获得成功,这个和当前的开源技术、海量数据架构有着必不可分的关系。比如我们使用mysql、nginx等开源软件,通过架构和低成本服务器也可以搭建千万级用户访问量的系统。新浪微博、淘宝网、腾讯等大型互联网公司都使用了很多开源免费系统搭建了他们的平台。所以,用什么没关系,只要能够在合理的情况下采用合理的解决方案。

那怎么搭建一个好的系统架构呢?这个话题太大,这里主要说一下数据分流的方式。比如我们的数据库服务器只能存储200个数据,突然要搞一个活动预估达到600个数据。
可以采用两种方式:横向扩展或者纵向扩展。
纵向扩展是升级服务器的硬件资源。但是随着机器的性能配置越高,价格越高,这个代价对于一般的小公司是承担不起的。
横向扩展是采用多个廉价的机器提供服务。这样一个机器只能处理200个数据、3个机器就可以处理600个数据了,如果以后业务量增加还可以快速配置增加。在大多数情况都选择横向扩展的方式。如下图:
图1

图2

现在有个问题了,这600个数据如何路由到对应的机器。需要考虑如果均衡分配,假设我们600个数据都是统一的自增id数据,从1~600,分成3堆可以采用 id mod 3的方式。其实在真实环境可能不是这种id是字符串。需要把字符串转变为hashcode再进行取模。

目前看起来是不是解决我们的问题了,所有数据都很好的分发并且没有达到系统的负载。但如果我们的数据需要存储、需要读取就没有这么容易了。业务增多怎么办,大家按照上面的横向扩展知道需要增加一台服务器。但是就是因为增加这一台服务器带来了一些问题。看下面这个例子,一共9个数,需要放到2台机器(1、2)上。各个机器存放为:1号机器存放1、3、5、7、9 ,2号机器存放 2、4、6、8。如果扩展一台机器3如何,数据就要发生大迁移,1号机器存放1、4、7, 2号机器存放2、5、8, 3号机器存放3、6、9。如图:

图3
从图中可以看出 1号机器的3、5、9迁移出去了、2好机器的4、6迁移出去了,按照新的秩序再重新分配了一遍。数据量小的话重新分配一遍代价并不大,但如果我们拥有上亿、上T级的数据这个操作成本是相当的高,少则几个小时多则数天。并且迁移的时候原数据库机器负载比较高,那大家就有疑问了,是不是这种水平扩展的架构方式不太合理?

—————————–华丽分割线—————————————

一致性hash就是在这种应用背景提出来的,现在被广泛应用于分布式缓存,比如memcached。下面简单介绍下一致性hash的基本原理。最早的版本 http://dl.acm.org/citation.cfm?id=258660。国内网上有很多文章都写的比较好。如: http://blog.csdn.net/x15594/article/details/6270242

下面简单举个例子来说明一致性hash。

准备:1、2、3 三台机器
还有待分配的9个数 1、2、3、4、5、6、7、8、9
一致性hash算法架构

步骤
一、构造出来 2的32次方 个虚拟节点出来,因为计算机里面是01的世界,进行划分时采用2的次方数据容易分配均衡。另 2的32次方是42亿,我们就算有超大量的服务器也不可能超过42亿台吧,扩展和均衡性都保证了。
一致性hash
二、将三台机器分别取IP进行hashcode计算(这里也可以取hostname,只要能够唯一区别各个机器就可以了),然后映射到2的32次方上去。比如1号机器算出来的hashcode并且mod (2^32)为 123(这个是虚构的),2号机器算出来的值为 2300420,3号机器算出来为 90203920。这样三台机器就映射到了这个虚拟的42亿环形结构的节点上了。
图5
三、将数据(1-9)也用同样的方法算出hashcode并对42亿取模将其配置到环形节点上。假设这几个节点算出来的值为 1:10,2:23564,3:57,4:6984,5:5689632,6:86546845,7:122,8:3300689,9:135468。可以看出 1、3、7小于123, 2、4、9 小于 2300420 大于 123, 5、6、8 大于 2300420 小于90203920。从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个Cache节点上。如果超过2^32仍然找不到Cache节点,就会保存到第一个Cache节点上。也就是1、3、7将分配到1号机器,2、4、9将分配到2号机器,5、6、8将分配到3号机器。
图6
这个时候大家可能会问,我到现在没有看见一致性hash带来任何好处,比传统的取模还增加了复杂度。现在马上来做一些关键性的处理,比如我们增加一台机器。按照原来我们需要把所有的数据重新分配到四台机器。一致性hash怎么做呢?现在4号机器加进来,他的hash值算出来取模后是12302012。 5、8 大于2300420 小于12302012 ,6 大于 12302012 小于90203920 。这样调整的只是把5、8从3号机器删除,4号机器中加入 5、8。
图7
同理,删除机器怎么做呢,假设2号机器挂掉,受影响的也只是2号机器上的数据被迁移到离它节点,上图为4号机器。
图8
大家应该明白一致性hash的基本原理了吧。不过这种算法还是有缺陷,比如在机器节点比较少、数据量大的时候,数据的分布可能不是很均衡,就会导致其中一台服务器的数据比其他机器多很多。为了解决这个问题,需要引入虚拟服务器节点的机制。如我们一共有只有三台机器,1、2、3。但是实际又不可能有这么多机器怎么解决呢?把 这些机器各自虚拟化出来3台机器,也就是 1a 1b 1c 2a 2b 2c 3a 3b 3c,这样就变成了9台机器。实际 1a 1b 1c 还是对应1。但是实际分布到环形节点就变成了9台机器。数据分布也就能够更分散一点。如图:
图91

写了这么多一致性hash,这个和分布式搜索有什么半点关系?我们现在使用solr4搭建了分布式搜索,测试了基于solrcloud的分布式平台提交20条数据居然需要几十秒,所以就废弃了solrcloud。采用自己hack solr平台,不用zookeeper做分布式一致性管理平台,自己管理数据的分发机制。既然需要自己管理数据的分发,就需要考虑到索引的创建,索引的更新。这样我们的一致性hash也就用上了。整体架构如下图:

图10
建立和更新需要维持机器的位置,能够根据数据的key找到对应的数据分发并更新。这里需要考虑的是如何高效、可靠的把数据建立、更新到索引里。
备份服务器防止建立服务器挂掉,可以根据备份服务器快速恢复。
读服务器主要做读写分离使用,防止写索引影响查询数据。
集群管理服务器管理整个集群内的服务器状态、告警。

整个集群随着业务增多还可以按照数据的类型划分,比如用户、微博等。每个类型按照上图架构搭建,就可以满足一般性能的分布式搜索。对于solr和分布式搜索的话题后续再聊。

扩展阅读:
java的hashmap随着数据量的增加也会出现map调整的问题,必要的时候就初始化足够大的size以防止容量不足对已有数据进行重新hash计算。

疫苗:Java HashMap的死循环 http://coolshell.cn/articles/9606.html
一致性哈希算法的优化—-关于如何保正在环中增加新节点时,命中率不受影响 (原拍拍同事scott)http://scottina.iteye.com/blog/650380

语言实现:
http://weblogs.java.net/blog/2007/11/27/consistent-hashing java 版本的例子
http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx PHP 版的例子
http://www.codeproject.com/KB/recipes/lib-conhash.aspx C语言版本例子

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 一致性hash和solr千万级数据分布式搜索引擎中的应用