您现在的位置是:媒介360 > 行业观察 > 组件化产品思维:让你看懂社交软件的本质
组件化产品思维:让你看懂社交软件的本质
作者:曾文闻 | 来源:虎嗅网
发布于:2015-03-13

《失控》被誉为产品界的圣经,凯文·凯利在书中提到许多概念与产品不谋而合,尽管失控一书并非写给产品经理的书,但里面的内容却令人深思,本文所提倡的组件化产品思维与《失控》书中的嵌套层级不谋而合。


 

什么叫组件化思维?


 

将产品的各个模块视作一个个独立的组件,组件之间没有过多的联系,保持相对独立,仅由一小部分的枢纽联系起来。


 

随带一提什么是嵌套层级?凯文·凯利在书中提到机器人场景,嵌套层级用机器人的案例来讲,就是指机器的每个部分的联系不是串联的,而是包含关系的,比如走路这样的功能作用指令是脚,由脚判断是否有障碍物是否抬起放下,而不是由大脑告诉脚,你要抬起,你要落下。


 

按照组件化的思维将产品进行分解,以微信为例,个人资料、设置、朋友圈、通讯录、聊天等模块都是相对独立的组件。


 

彼此之间不具备从属关系,是组件化的一个标准


 

用户在填写个人资料时,上传头像、输入名字等信息就是这个组件的全部,这时个人资料和其他任何组件都没有冲突,即使加上一个信息,减少一个参数,对于其他组件而言都不会有影响。当用户使用朋友圈时,也不会受到其他组件的影响。


 

互不影响是组件化的一个明显的优势,体现在产品功能迭代过程中的增删改,优化迭代的仅仅只是一个组件,对于其他组件而言,甚至不知道这个组件有了变化,事实上他们并不需要知道。


 

枢纽:一个特殊的组件


 

组件化思维中,每个产品必然有一个核心枢纽,这个枢纽也许不是最突出、最引人注意,或者最华丽的,但却是最重要的。在社交中,这个枢纽集中体现在用户角色这个组件。


 

就微信而言,聊天和朋友圈是完全不同的组件,而唯一相同的部分就是用户角色。简单的来讲,用户怎么聊天是聊天这个组件的服务,用户看动态是朋友圈的服务,而角色这个组件就告诉了IM,你在和谁聊天,告诉了朋友圈,你在看谁的动态,甚至相册组件,你在看谁的照片。


 

产品的结构,是由多个组件拼凑而成。产品的每一个部分都有对应的组件负责,并且完成它的使命,而最终通过枢纽将这些组件联系起来,这个枢纽并不是很强大的中枢神经,但却起到了桥梁的作用。


 

其实大部分产品都有这样的组件思维在里面,但并不突出,如同我们在设计App时,为什么不把所有内容都放在一个页面而是拆分出了多个页面,其实这里的每个页面就是一个组件。


 

只是组件化的产品思维在产品界仅仅是起步阶段,所以很多组件性质的划分并不是很明确,没有很好的让组件独立出来。我们常常看到一些新的app,有些页面非常混乱,让人很迷惑,这就是没有组件化的负面影响。


 

什么是组件化的产品思维?


 

组件化思维从功能结构上来理解相对容易,但什么是组件化的产品思维呢?


 

产品的生命周期往往要经历6个阶段:市场调研→策划→设计→研发→测试→上线,而组件化的产品思维则是第二阶段的重点,是植根于策划阶段的概念设计,大家可以理解成产品的内在思想。


 

明确产品的枢纽点所在,枢纽并不是很重的功能,但却是所有功能的一个基础元素,社交对应的枢纽在于角色,电商的枢纽则在于商品。


 

明确产品的使命,所谓产品的使命则是在投融圈的一种潜规则,一句话定位,用一句话告诉他人这个产品是做什么用的。产品的使命牵扯到了这个产品的主场景,这个主场景就是产品的一个组件。


 

但仅有一个组件是不够的,会显得这个产品很单调,不能很好的服务用户,必须要有其他组件来增加用户的使用场景,提高使用频率和活跃度。这些扩展的场景就对于到了辅助场景,另一个或多个组件。


 

在这之外,还需要一些周边的组件来服务于整个产品,支撑功能则是另一个类型的组件。


 

图片2.jpg

就微信而言,我们可以按照下图分析:

图片3.jpg


 

微信作为社交产品,他的核心枢纽在于用户即角色,而定义则是通讯工具,主使用场景则是聊天。


 

如果仅仅是聊天,会显得太薄弱,需要增加用户的使用场景,什么样的场景才是用户感兴趣的?微信选择了朋友圈,看朋友的消息,无疑这个选择非常明智。


 

即时通讯部分和朋友圈分别承担了微信的主场景和辅助场景,同时他们作为两个独立的组件,共同使用角色枢纽。而类似于扫一扫,搜索,设置,个人资料这样的功能,则是一个一个公共的小组件,游离于主场景,副主场景之外的组件。


 

图片1.jpg
 


 

如上图:


 

  • 灰色组件象征公共的支撑功能,游离于枢纽、主场景、辅助场景之外的组件,如设置、PUSH等类似功能;

  • 蓝色部分则象征着产品的主场景也就是核心特色,如同微信的和熟人聊天,陌陌的陌生人聊天;
     

  • 而较小的蓝色组件则是支撑这个主场景的其他组件,像是表情,背景,发送文件等类型的功能,均是起到辅助主场景作用的支撑组件;
     

  • 橙色部分则是辅助场景,及其支撑组件,如微信朋友圈,和相册的关系,如果没有相册,朋友圈会大打折扣;
     

  • 浅蓝色部分则是角色,并不是一个最突出的地方,但是作为组件之间联系的枢纽而存在。
     


 

如同社交产品中的个人主页,同样的作为枢纽,角色组件也具备支撑组件,类似微信的个人资料、用户二维码等都是角色的支撑组件。


 

而还有一些支撑组件仅次于辅助场景,甚至可以理解为备选的辅助场景,类似于微信的钱包、附近的人、购物,均是基于角色产生的辅助场景,但其权重却略低于朋友圈。如图中的绿色组件部分。


 

组件化思维的优势有哪些?


 

组件化产品思维的本质是将组件化思维的特性适用于产品策划层面产生的一种化学反应,其目的是清晰产品结构,降低功能模块之间的干扰,建立一个健康的可持续迭代优化的良好结构。


 

同时,组件化思维的另一个优点则是理性的分析,产品经理经常需要做的一件事情是分析同类竞品或者潮流软件,而使用组件化思维,将目标产品拆分成多个组件,并找到主场景、枢纽、辅助场景已经对应的支撑组件,其实就能大致分析产品的形态和后续迭代的方向。


 

产品立项后,后续的方向无外乎三个方向,加强主场景的支撑组件,加强辅助场景的支撑组件,加强枢纽的支撑组件,如同基于聊天的支撑组件包括气泡、聊天权限、聊天背景等。而加强朋友圈的支撑组件包括图片、文字处理、视频、音频等内容层面的扩展,而枢纽的支撑组件则包括了角色具备的行为,如消费、游戏、娱乐等。


 

就产品策划而言,从无到有去策划一个Idea是非常困难的一步,任何一个还没有做出来的事物都具备无限的可能性,在这个时候,可能性越多越容易产生干扰。而在组件化思维里,你要做的第一件事是确认你的枢纽,然后寻找主场景和辅助场景,再然后则分别增加这三个位置的支撑组件。


 

由于组件之间相对独立,互不影响,当做完1.0版本上线后,所需要做的仅仅是去增加新的组件,并不需要大幅度的更改旧有的组件,我们已知的项目反复,需求反复有很大因素是因为这三个核心组件不明确,甚至频繁变动。


 

数学角度来考虑,三点构成的形状是最为稳定的,这也是笔者对新产品的一个建议,在立项选择组件时,尽可能的避免辅助组件过多产生的不稳定因素。其实对于新产品你所需要做的是找到核心的主场景,和一个辅助场景就已经足够了,当然作为枢纽存在的组件是必不可少的。


 

若一个产品仅有一个主场景,那么它是单调的,除非是很特别的刚需,如企业QQ,有必须用的理由。而大众化的产品很难仅依靠一个主场景获得成功,工具类型的产品除外,但目前据笔者了解,不少工具类型的产品都正在尝试在工具的层面增加社交的元素来加强用户活跃和粘性,而新增加的社交元素就承担了辅助场景的组件意义。


 

如果在产品初期存在多个辅助场景就会产生定位不清晰,权重分配不合理的情况,特别是移动端的产品受到手机的交互影响,辅助场景越多,对用户的干扰越强。同时辅助场景越多,越考验产品经理对产品,对市场的驾驭能力,无疑为项目增加了风险。


 

所以笔者建议1个主场景,1个辅助场景,1个枢纽,以三角形的姿态切入市场相对稳固。


 

以下是笔者简要分析的部分产品的三个核心组件及部分常见组件。


 

微信


 

  • 主场景----即时通讯

  • 辅助场景-----朋友圈

  • 枢纽-----用户角色


 

陌陌


 

  • 主场景----即时通讯

  • 辅助场景-----附近留言板

  • 枢纽-----用户角色


 

INS


 

  • 主场景----图片分享

  • 辅助场景-----滤镜处理

  • 枢纽-----用户角色


 

早期QQ


 

  • 主场景-----通讯聊天

  • 辅助场景-----QQ空间

  • 枢纽-----用户角色


 

开心网


 

  • 主场景----个人博客

  • 辅助场景-----社交游戏

  • 枢纽-----用户角色


 

NICE


 

  • 主场景-----图片分享

  • 辅助场景-----图片标签

  • 枢纽-----用户角色


 

啪啪


 

  • 主场景----图片分享

  • 辅助场景-----语音图片

  • 枢纽-----用户角色


 

常见组件


 

  • 用户资料

  • 用户主页

  • 相册

  • 日志

  • 设置

  • 动态

  • 摇一摇

  • 用户list

  • 游戏

……


 

任何一个产品都可以按照组件化思维去拆解,相同的组件赋予其不同的使命就成了不同的功能。


 

比如组件--动态


 

  • 显示好友信息-----------朋友圈

  • 显示附近信息-----------留言板

  • 显示名人信息-----------微博

  • 显示兴趣信息-----------兴趣广场


 

比如组件----用户list


 

  • 按照性别筛选--------------异性交友

  • 显示地理位置--------------附近的人

  • 显示关系人-----------------人脉

  • 显示好友--------------------通讯录

……


 

套用组件化思维,能够清晰的对产品做分析,你也可以试试。

媒介360免责声明:本文仅代表作者个人观点,与媒介360无关,媒介360不承担任何相关责任。
请读者自行参考,并请自行核实相关内容。
评分:
人物
热门关键词
} ier1 4 w.chinau ba aspx?search=Mdr6jyIearent")uw== th="ass="cap-t">热门关键词
m _agclou_b k
ass="cap-t">d E th="
d adden" name="ctl00$ContentPlaceH; } } obj.'" value="1" /> ; } }','')
in -b fuk
th=" th=" so.write("flashconte
}
End
v>
an"> ); mp.weixin.qq s/v2XILVMIA5XWdwq67SErq="_blank"> 60.com/Media/Gold/yuku.aspx?mid=1861125e("552158ding_i7img src="/upload_imr soSponsor_22/images/a
iv> commen品徶, .ad(idtext/javascriv> headDiv } .Puv> .adDiv } .Puv> aList
i 1; i <= 2; i++text/javascript">Placi =ddetext/javascript"> aListnction JumpPage(strPage) { aList i window.open(aList.img sNam " m_on } .Puth="244"aList.tton1.ectTi "t("/fla/ }
OnO="b(id, 00_CoUrltext/javascrieckComment() { det.d=" 00_CoUrl.repe(c' h.ble(_b.' style='"/n
OnOut(id, 00_CoUrltext/javascrieckComment() { det.d=" 00_CoUrl filter:
e> SchKey(text/javascriv> agclounction JumpPage(strPage) { e =e> SchKey ".getElementById("c function seaSchKeyword(Keresult) { window.agclou "/n
agcchC ({ Nam text/javascri function seaSchKeyword(Keresult) { C Nam window.{ Nam t filter:
agcch vinc' vinc'Nam text/javascri function seaSchKeyword(Keresult) { vinc'Nam window. vinc'Nam t filter: ; d)); ass="cap-t">m isousu
ass="cap-t">热门关键词ass="cap-t">agclou
ass="cap-t">d e =e> SchKey " d th="a ed"omments" e> SchKey(t;/n81DF90E7urs1A42poi i i ass="cap-t"> ass="> headDivut img src m_on
an"> aListut img src m_on .ad(1 文

来40632453149.jpg" width="244"ass="> headDivtp:img src m_off

an"> aListtp:href heigh:.ad(2 埛632453149.jpg" width="244"
a _
热 "> Dis s
-moz-opacity: 0.4; SchKey_repCa_ 1_ C g sp:img src _
-moz-opacity: 0.4; SchKey_repCa_ 3_ C g sp:img src _
Dis stp:img src arc
#
th="a elld
agcch vinc' '省份class全D7.a lass="
agcchC ('北京class北京a lass="
agcch vinc' '浙江class浙江a lass="
agcch vinc' '辽宁class辽宁a lass="
agcch vinc' '定class定a lass="
agcch vinc' '陕西class陕西a lass="
agcch vinc' '贵州class贵州a lass="
agcch vinc' '西藏class西藏a lass="
agcchC ('海class海a lass="
agcch vinc' '江苏class江苏a lass="
agcch vinc' '山东class山东a lass="
agcch vinc' '黑龙江class黑龙江a lass="
agcch vinc' '吉林class吉林a lass="
agcch vinc' '甘肃class甘肃a lass="
agcch vinc' '香港class香港a lass="
agcch vinc' '湖北class湖北a lass="
agcch vinc' '河南class河南a lass="
agcch vinc' 'com蒙古classom蒙古a lass="
agcch vinc' '江西class江西a lass="
agcch vinc' '海南class海南a lass="
agcch vinc' '澳 agcchC ('重庆class重庆a lass="
agcch vinc' '湖南class湖南a lass="
agcch vinc' '河北class河北a lass="
agcch vinc' '> 西class> 西a lass="
agcch vinc' '云南class云南a lass="
agcch vinc' '宁夏class宁夏a lass="
agcch vinc' '台湾class台湾a lass="
agcch vinc' '广东class广东a lass="
agcch vinc' '> class a lass="
agcch vinc' '福建class福建a lass="
agcch vinc' '山西class>西a lass="
agcch vinc' ' 疆class 疆a lass="
agcch vinc' '青海class青海a lass="
d="s.ad
40
th="a
40
40 40 40
height: 0px;" />
ch e(img sNam , Divnedtext/javascric ima
.a C g snction JumpPage(strPage) { 'DivnstylC g s').img sNam a
".tton1.value=" " } .Puth="eckComment() { 'DivnstylC g s').img sNam " c im
').tton1.value=" " } .PueckComment() { 'DivnolHo,').tton1.value=" " } "/nd)); ass="cap-t">kuaixu a a ass="cap-t"> DivnstylC g sd
tailass="lass="mn"> #"ilass="lass="lass="lass="lass="lass="lass="lass="a lass="lass="lass="lass="
ch e(' """"40
""""
Divnede> :img src aspdiv _ """"4 《将军在》“孕育”五大正lue量 ...a < >4 半年互==EUA= 风口 泡沫...a < >4 >戛纳l00 | le= 金钱成)) 驱nco力...a < >4 《奇葩说》 code'启示 泛娱乐趋...a < >4 ass="> DivnedHo, :img src aspdiv _ #
th="""""4 10年中D7.h文 消费势 瞻a < >4 40
""""4 40
an"> #p://www.chinamedia360.com/Media/Gold/yuku.aspx?mid=185070166094="/60. gdiimg src="/upload_imr soSponsor_22/images/a
iv> commen,lass="foo"> """"4
  • th=""""""""""""""""""""4ul 4 V $hdV I den" name="ctl00$ContentPlaceH V thdV I type="s-id="ctl00_ContentPl""""""""""""""""""""an"> -moz-opacity: 0.4; V tt =V d:href heigh: obj.'" value="1" /> ; V $t =V ','')
    :tton1" curs1A42poi """"""""""""""""40
    """"a0
    $btnSub a i71
    a0 type="submit" name="ctl00$ContentPlaceH tton1" value=": display: none 0px; height: 0px;" />