All posts by dotte

LB 负载均衡的层次结构

作为后端应用的开发者,我们经常开发、调试、测试完我们的应用并发布到生产环境,用户就可以直接访问到我们的应用了。但对于互联网应用,在你的应用和用户之间还隔着一层低调的或厚或薄的负载均衡层软件,它们不显山不露水默默的发挥着重要的作用,以至于我们经常忽略了它们的存在。因为负载均衡层通常不在一般开发人员的问题域内,而且它们一般都是现成且成熟的解决方案,以至于我们习惯性的忽略和认为乏善可陈。其实不然,本文就写写我对负载均衡层次结构的认知和理解。

硬负载

所谓「硬负载」就是采用硬件设备来提供负载均衡。

在七、八年前那时我在做 Java 的企业软件开发,开发出来的企业级 Java 应用程序就部署在像 Weblogic 之类的应用容器中。而这类应用容器软件又跑在 Unix 的小型机上。把硬件和软件一体打包作为企业应用解决方案卖给客户。这类应用部署的方案十分简单,层级也比较浅。为了保证可靠性,使用两套小型机上各部署一个 Weblogic Server,在应用服务前面使用像 F5 之类的硬件负载均衡器,如下图所示。

由于小型机和前面的 F5 负载均衡硬件都比较贵,所以出于可靠性、可维护性和成本的综合考虑,一般应用部署两套跑在两台小型机上,在前面共享一个 F5 做负载均衡。而一般 F5 和小型机这类硬件设备都至少是 5 个 9 的可靠性保障,所以整体的系统可靠性基本有保障。

进入互联网时代后,应用开发拥抱开源,部署使用更廉价的 PC Server 和免费开源的应用容器。负载均衡也逐步从硬负载向软负载变迁,由于互联网应用的海量特性和部署规模的急剧膨胀,前端负载均衡也开始变得丰富起来。

软负载

进入互联网公司后,我们刚开始开发应用时,业务规模小用户量还不大,机器数量也少(<10)。所以一开始的负载均衡的结构也是很简单的,类似硬负载只是把硬件换成了免费的开源软件并跑在可用性是有 3 个 9 的廉价 PC Server 上。

前面一个 LVS 后面跟着几个应用服务,后来为了方便做按域名的分流和适配切流量上线,中间又加了一层 Nginx。

这样就变成了两层软负载结构了,LVS 负责 4 层,Nginx 负责 7 层。 但 Nginx 只负责了单机内多实例的负载均衡,这里主要是因为当时 PC Server 是物理机,CPU 16/32 core,内存 32/64G 不等,为了更充分的利用资源,一台物理机上都部署了多个应用服务实例,而考虑到 Nginx 工作在 7 层的开销远高于 LVS/DR 模式,所以一般在一个 Nginx 后面挂的实例数也不会超过 10 个。

但随着业务发展和用户流量上升,机器规模也在不断扩张,导致一个网段内的 IP 都不够用了,这套负载结构又遇到了横向扩展的瓶颈,因为 LVS/DR 模式下跨不了网段。所以后来又在 LVS 和 Nginx 之间加了一层 HAProxy,负载结构就变成了下面这样。

其实加了 HAProxy 之后,它也是工作在 7 层,这样 Nginx 这层看起来就不是很有必要。但三层的负载结构能支撑更大规模的集群,而原本在 Nginx 层做了一套方便研发切流量上线的运维管理系统,所以牺牲一点性能换取现在的可维护性和将来扩展性,Nginx 这层就一直保留下来了。而且 Nginx 相比 HAProxy 不是纯粹的负载均衡器,它还能提供 cache 功能,对于某些 HTTP 请求实际只走到 Nginx 这层就可以通过缓存命中而返回。

DNS负载

随着业务发展,公司开始了多个 IDC 的建设,考虑到 IDC 级别的容灾,集群开始部署到多个 IDC。跨 IDC 的负载均衡方案可以简单通过 DNS 轮询来实现,但可控性不好。所以我们没有采用这种,而是采用一主加多子域名的方式来基于业务场景实现动态域名调度和负载。主域名下实际是一个动态流量调度器,跨多个 IDC 部署,对于 HTTP 请求基于重定向方式跳子域名,对于 TCP 方式每次建立长连接前请求分配实际连接的子域名,如下图所示。

CDN负载

最后再加上互联网应用必不可少的 CDN 将静态资源请求的负载分流,那么整个负载的层次结构就完整了。

SSL 带来的负载结构变化

随着互联网的普及,安全问题益发严重,原本早期只有银行网银等使用 HTTPS 方式访问,现在电商类网站也开始启用全站 HTTPS 了。引入 SSL 后对负载结构带来了什么影响么?SSL 属于应用层的协议,所以只能在 7 层上来做,而 HAProxy 也是支持 SSL 协议的,所以一种方式是只需简单的让 HAProxy 开启 SSL 支持完成对内解密对外加密的处理。

但 HAProxy 的作者不太赞同这种方案,因为引入 SSL 处理是有额外的性能开销的。那么在承担确定流量的情况下,假设原本需要 M 台 HAProxy,在开启了 SSL 后可能需要 M + N 台 HAProxy。随着流量增长,这种方式的横向扩展成本较高(毕竟 SSL 证书按服务器数量来收费的)。他给出的解决方案是再独立一层 SSL 代理缓存层,像下面这样。

L4 和 L7 之间独立的 SSL 代理缓存层只负责 SSL 协议的处理,把 HTTPS 转换成 HTTP,并检查本地缓存是否命中。若未命中再转发请求到后端的 L7 层应用负载均衡层。这样的好处是每个层次都可以根据流量来独立伸缩,而且 SSL 层显然可以跨多个应用共享,更节省成本。如果按这个思路来重新调整我们前面的负载均衡结构层次,将会演变成下面这样。

其实,这时我觉得应用前面的那层 Nginx 可能就显得多余了点,不是必需的。但如果现实这么演进下来很可能就会有这么一层冗余的东西存在很长一段时间,这就是理想和现实之间的差距吧。

总结

好了,本文到此为止。作为一名后台开发我其实对上面提及的各类开源软件如何配置、调优和管理并不熟悉,这属于运维开发的问题域范畴。但这并不妨碍我去了解我所开发的应用所处的整个环境是怎样的,多了解些你工作领域范围边界外的 What 和 Why,有时也能帮助我们更好的设计和解决自身问题域内的问题,别为自己设限而最终画地为牢。

本来以为负载均衡这个古老的课题已经定型了,在写本文时又看到新闻,在近日举办的第十三届网络系统设计与实现 USENIX 研讨会上,来自 Google 的工程师又分享了其自研的 Maglev 负载均衡器。刚下了论文还没看,回头看了再来写写。

参考

[1] HAProxy Documentation.  HAProxy Management Guide
[2] HAProxy Documentation.  HAProxy Starter Guide
[3] Willy Tarreau.  Making applications scalable with Load Balancing
[4] LVS wiki.  Load balancing
[5] Wikipedia.  Virtual Router Redundancy Protocol
[6] shuming.  LVS 工作模式以及工作原理

from:http://www.cnblogs.com/mindwind/p/5339657.html

程序员必读的十篇文章

作为一个Java程序员和软件开发者,我从许多『关于某某每个程序员必知』这类文章中学到了很多东西,它们会就一个特定的话题给出很多有用有深度而且难以被发现的信息。我在求知的过程中遇到过一些很有用的文章,并将它们存为书签用于日后参考和重复阅读。

个人认为所有程序员都能从中受益,这也是我写这篇文章和跟大家分享所有这些文章的原因。这些都是从我个人书签里挑出来的。你将在本文中看到每个程序员都应该知道的经典话题,诸如内存、Unicode、浮点运算、网络、面对对象设计、时间、URL编码、字符串等等。因为初学者和新手的实际经验匮乏,所以本清单对他们来说非常重要。由于大部分文章其实是从实践中来的,所以初学者和中间件编程者可以从中获得很多知识。同时在职业生涯早期获得基础知识也有助于避免犯错,这些错误其他程序员和软件开发者在他们学习过程中都已经解决过了。

尽管仅仅通过一次阅读并没那么容易就汲取这些文章中给出的知识。你可能并不能理解浮点数的一些细节,或者被内存那些微妙的细节搞得头很大,但是手头留有这些文章列表并时不时联系上下文用作参考还是非常重要的。所以祝你们好运并希望你们可以享受阅读的乐趣。同时,请记得分享其他不在这个列表中的《关于某某,每个程序员必知》的文章。

关于内存,每个程序员必知

这是一篇很经典的文章,它展示了关于内存的方方面面,老的、新的、已知的、未知的。尽管内存问题相当普遍无处不在,也并不是每个程序员都足够了解它。如果你正在写高性能应用,关于现代系统中内存的知识尤显重要。硬件设计者会遇到更多复杂的内存处理和加速技术,比如CPU缓存,但是这些在没有程序员帮助的情况下并不能得到最优性能。我还在阅读这篇文章,我也无法告诉你从中我学到了多少关于诸如RAM、CPU缓存之类的知识。L1缓存和L2缓存、不同类型的内存、DMA、内存控制器涉及和通用内存。简而言之,这是一篇所有经验层次程序员都必读的文章。

关于浮点运算的每个计算机科学家必知

浮点运算是一个很微妙的东西,且并不容易掌控。甚至很多Java程序员都不知道当使用==运算符来做float或double类型的数值比较时会出什么错。我们中的很多人在用float和double类型做货币运算时都经常搞错。本文是此类文章中另一篇佳作,也是所有软件开发者和程序员必读文章。随着经验增长,你期望了解普通问题的细节,而浮点运算就是这些细节中的一个。作为一个高级Java程序员,你必须知道怎么用float、double或是BigDecimal类做货币运算,怎么对浮点数取整,等等。即使你知道浮点运算的基础,通过阅读本文你也会学到一些新的东西。

关于Unicode的每个开发者必知

字符编码是另一个让很多程序员纠结的领域,《每个软件开发者绝对必须要无理由知道的关于Unicode和字符集的最基本常识》一文旨在填补这个领域知识的空白。附注一下,没错,这就是这篇文章完整的标题。它的作者是statckoverflow.com的创建者之一————Joel Spolsky。Joel差不多在十年前就发表了这篇博文,而今看来它仍然适用于当前情况。本文将告诉你什么是Unicode,什么是字符编码,字符是如何用字节表示的,以及其他许多许多。这篇文章最赞的部分是它的表达方式(语言和流畅性),即使你对Unicode一无所知,你也可以无障碍阅读。总之,这是一篇对所有程序员、编程者和软件工程师而言更重要的必读文章。

关于时间,每个程序员都应了解的》(伯乐在线 2013年1月翻译)

在字符编码以外,时间和日期又是另一个让包括我自己在内的很多程序员纠结的领域。即使是高级开发者都会被GMT、UTC和夏令时,以及闰秒搞晕。坦白说,很难做到在处理时区问题时完全不犯错误,处理夏令时差以及它带来的影响同样也不容易。如果你用试错的方法时问题会更糟,因为这个办法永远无法帮你解决这个问题。有多少可能出错的地方,就有多少会发生误解的事。不管日期是否包含时区可以像地狱般把你搞混,将UNIX时间转化为其他时区会让你崩溃,从而忘记时钟同步和延时。我希望通过阅读这篇经典的文章可以消除你们对于时间的很多误解,可以打好关于时间的基础。

关于 URL 编码,每个开发者必须知道的

本文描述了一些大家对于URL编码的一般误解,在给出常见的问题及其解决方案前,先讲了HTTP的url编码。虽然本文并非针对某一具体的编程语言,它还是以Java来说明问题,并解释了如何在不同层次的Java web应用中解决URL编码的问题。你回学到URL语法基础,HTTP以及其他协议的通用URL语法。本文还阐述了URL的常见陷阱,比如字符编码、URL不同部分中的保留字符,以及URL编解码问题。如果你是一个Java程序员,你也将学会如何在Java应用中正确处理URL,如何构造URL和使用Apache CommonsHTTP客户端库。最后它还给出了最好的练习和处理URL的建议,比如应该在建URL的时候对URL编码,保证URL重写滤波器可以正确处理URL,以及其他很多很多。总之,这事一篇任何web开发者和程序员必读的文章。

关于Web开发的每个程序员必知

程序员和软件开发者必读文章。本文来自 stack exchange,是一篇每个程序员在发布站点前关于web应用需要学会的技术细节的文章。文章涉及接口设计、用户体验、安全、web标准、性能、搜索引擎优化、相关技术,还包含了一些重要资源。由于当今世界强烈依赖于互联网,程序员有个人网站和博客的现象很普遍,本文提供的经验不仅仅只对你的职业有帮助,也有助于你的私人工作。你将学到所有关键的技术,比如HTTP、HTML、XML、CSS、JavaScript、浏览器兼容性、降低网站载入时间的tips、XML地图、W3C规范和一些其他的关键细节。

关于SEO的每个程序员必知

这是另一篇对web开发者、程序员和博主来说非常重要的文章。SEO如此重要无法被忽视,因为很多程序员同时也是博客撰写者,所以学些搜索引擎优化基础来让Google搜到他们的文章并将文章展示给其他程序员很重要。在当今这个内联的世界,每个公司都必须将自己展示在网上才得以幸存,由此看来,SEO显得极其重要。如果你开办一个公司并开始销售商品,那么SEO就是你需要关心的东西。所有程序员,尤其是web开发者,都能从本文中受益良多。记住,搜索引擎优化是一个涉猎很广且变化迅速的课题,而且针对不同的搜索引擎差异很大,比如Google、Yahoo以及其他搜索引擎。所以为了掌握这门技术你将需要经常学习新知识。

关于未定义行为的每个C程序员需知

C语言有一个“未定义行为”的概念。未定义行为是一个有很多细微差别的很广泛的课题,这也是我喜欢Java语言的其中一个原因,Java的未定义行为少得多,混淆也很少,而且更加稳定和太平。C中很多看上去很合理的东西都有未定义行为,这也是程序里出bug的常见原因。此外,C中的任一未定义行为都允许实现方式(编译器和运行)来生成运行得很痛苦的代码,做一些完全不期望其发生的事,甚至更糟。这篇精彩的文章将带你在未定义行为的海洋中遨游。

关于网络,每个程序员需知

文中写道:“你是一个程序员,你是否曾想知道多人游戏是怎么运行的?这看起来似乎很神奇:两个以上的玩家通过网络分享同一段经历就像是在同一个虚拟世界里真正在一起一样。但是作为程序员,我们知道事实上发生的和看到的完全不一样。所有一切都是错觉。”

这是一篇关于网络的趣文,目标读者是游戏开发者,但我认为每个程序员和开发者都能从中受益。

关于String,每个Java开发者需知

这是我写的一篇关于java.lang.String的文章,我个人认为是每个Java程序员都需要了解的东西。String在每日的Java编程中很重要,所以任何Java开发者都必须了解这些。本文涉及了String的很多重要领域,包括string pool、string literal、用==和equals()比较String的区别、将字节转换为String、为什么String是不可变的、正确拼接String,等等。高级程序员可能已经知道所有这些情况,但是即使这样复习一下这些也是好的。

程序员都应该了解哪些安全知识》伯乐在线 2012年3月翻译

这个问题是StackOverFlow上的一个电脑编程的学生问的。就像我们学了很多常见的编程概念(比如操作系统、算法、数据结构、计算机架构等)一样,学一下安全相关的知识也很重要。虽然安全是一个很大的课题,它涉及加密/解密、SSL、网络安全、模糊处理、身份验证、证书授权等等,一些最基本的常识对每个程序员而言都是必需的。刚开始工作的时候,我个人对安全知之甚少,当开始写基于Java web应用的Servlet/JSP的时候,才开始了解网络安全和一些类似SQL注入、拒绝服务、XML注入、跨站脚本攻击等的安全威胁。作为一个Java开发者,现在我开始跟一些fortify、PMP和其他静态代码分析工具提供的安全Java编程经验。本文是非常好的安全主题集和链接集,不管你是否在编程,你肯定可以从中受益。

每个程序员都应知的延迟数字

这是一篇额外奖励的文章,但也是每个程序员必读之文。无论用哪种编程语言,如Java或C++,为了写出高性能的应用程序,你都应该了解基本的耗时数问题,比如,从内存、L1缓存、L2缓存、SSD随机读、硬盘中读取变量分别需要耗费多少时长。对互斥锁加解锁需要花多长时间,城市间传输一个数据包或是同一个数据中心循环传输一次需要花多长时间。这些耗时数与编程语言无关,属于内核知识的一部分,开发者必须写出高性能低耗时的应用。这篇文章好在它还提供了这些耗时数在多年来演变的对比分析。你可以看到这些耗时数在2006年和今天分别是什么样子的。

后话

以上是所有每个程序员必读文章清单。坦白说,程序员要学的东西太多了,学习一门编程语言,如Java,仅仅是冰山一角,但我们不都对学习充满热情的吗?编程是一项很有挑战的工作,在你的整个职业生涯中唯一能帮到你的就是基础知识,如内存、Unicode、浮点数、时间、安全相关对任何程序员都很重要。很少有什么是与特定的编程语言相关的,比如我那篇关于Java String和关于未定义行为每个C程序员需要些什么的文章,但对于初学者和开发者而言仍然是很好的学习材料。

from:http://blog.jobbole.com/71723/

知乎产品体验报告

1、产品概述

1.1 体验环境

体验机型:MI 5

系统版本:6.0.1MXB48T

App版本:4.11.0

体验时间:2016.12.3-2016.12.9

体验人:Grocery

1.2  产品简介

Logo:以代表诚实、信赖、知性的蓝色为底色,以“知”字作为产品标识,特别是对其右侧的“口”做了仿对话框的改动,点明知乎是汇聚智慧的知识交流平台。

Slogan:与世界分享你的知识、经验和见解——清晰易懂的平台功能介绍。

1.3 产品定位

以大学生、办公职场人士为主要对象的中文互联网最大的知识社交平台。

1.4 目标人群

“知乎的生态基于内容输出者、内容获取者以及第三方之间的价值关系。”——by 尼古拉斯 chaos 郭。

这样看来,知乎的用户主要有以下三种类型:

1、内容输出者——内容输出者分为两类。一类是各领域的专家级人物,以互联网领域居多,作为知乎的早期用户,这类专家级人物多是社区、移动互联网领域的CEO或者创始人,还有不少经理、总裁级别的专家。另一类是有相关从业经验但还称不上专家的学习型用户;

2、内容获取者——寻求高质量专业性解答,希望成为某领域专家的小白用户;

3、第三方——有广告、招聘等引流需求的用户。

1.5 产品功能

问答(包括付费语音问答“值乎”)、专栏、知乎书店(知乎周刊、一小时、知乎盐)、在线讨论(圆桌)、话题分享(知乎Live)

2、产品详情

2.1 需求及解决方案

1、问答

(1)需求分析

用户行为:搜索、提问和回答问题,对热门回答进行分享/投票/感谢/收藏/屏蔽/评论(包括拷贝、回复、踩、赞、举报评论等)

基本需求:获得专业解答,通过经验分享打造个人IP,问答双方需要信息反馈和良性互动的渠道

深层需求:主要满足小白用户的求知欲,以及专家和“中产阶级”对尊重和自我实现的需求

(2)关键因素分解

用户体验目标:针对特定问题能在最短时间内获得高质量的解答、能快速针对自己感兴趣或领域相关且有价值的问题作出回答

担忧:搜不到对应的问题、回答质量过低、得不到对方反馈和回应、低端问题(百度知道可以解决的问题)遍布、邀请信息过多等

障碍:用户基数不够大、问题覆盖面不全、不能对用户提问内容作过多限制、对回答质量进行筛选可能加大运营成本

(3)解决方案:

  1. 在扩大用户基数方面,知乎起初招募圈子精英先玩,然后开放公众注册,通过大V的口碑营销和名人光环效应进行社会化分享推广,用户量多了,问题覆盖面也逐渐扩大;
  2. 在减少低端问题和重复性问题方面,知乎虽不强行阻拦用户提交重复问题,但对问题进行聚类和重定向;
  3. 在保证问题和回答质量方面,知乎限制每人每日提问数及回答数,建立用户自筛选、举报和主页推送机制,优化算法,让好的答案排列靠前,对“没有帮助”的回答进行折叠;
  4. 建立回答邀请模式,同时鼓励用户修改题目以获得更多关注;
  5. 完善设置,让用户自行选择想接收的信息类型(例如用户可选择只允许自己关注的人给自己发私信)。

2、专栏

(1)需求分析

用户行为:写专栏(有@功能)、对专栏文章进行点赞/赞赏/评论/收藏/分享/关注等

基本需求:让用户可以撰写笔记、发表见解和分享经验(打造个人IP);自动推送特定主体的优质内容,降低搜索成本

深层需求:主要满足专家和“中产阶级”对尊重和自我实现的需求

(2)关键因素分解

用户体验目标:简便快捷地发布文章,能得到读者反馈、能找到感兴趣的话题

担忧:专栏内容支持格式过少编辑麻烦、写完专栏后没人看到没有反馈、找不到有趣的内容、无法保留优质内容

障碍:缺乏技术支持、“马太效应”即用户大多只关注大V、用户行业过于集中、专栏内容不够丰富、用户记性差

(3)解决方案:

  1. 从优化文字编辑开始,逐步对图片、语音和视频给予技术支持;
  2. 用户可利用@功能引起大V注意,同时知乎工作人员会定时筛选出普通用户的高质回答,放在首页推荐或知乎周刊中,增加曝光率;
  3. 邀请各行业的专业人士加入知乎专栏;
  4. 设置“收藏”和“浏览历史”功能,帮助用户轻松保留和找回优质内容。

3、知乎书店

(1)需求分析(整合价值,为优秀内容输出者提供变现渠道,以下仅考虑内容消费者)

用户行为:购买和下载电子书,进行阅读/书签/分享/点赞/评论

基本需求:找到感兴趣的电子书,阅读方便,能做标记和分享

深层需求:满足用户的求知欲、好奇心,让其获得将碎片时间都利用起来的充实感

(2)关键因素分解

用户体验目标:能找到感兴趣的书目并获得高效流畅的阅读体验

担忧:价格贵、内容不够丰富、篇幅过长、某些场景下使用不方便、买了之后才发现读不下去

障碍:用户对付费阅读有排斥心理;内容仅取自知乎问答和专栏,内容丰富度受限

(3)解决方法:

  1. 知乎周刊部分免费,收费部分定价多在3元左右,在多数人可承受范围之内;
  2. 推出“知乎周刊”、“知乎周刊Plus”“一小时”和“知乎盐”三种系列,丰富产品内容,篇幅有长有短;(注:“知乎周刊”多为时事和科技主题、“知乎周刊Plus”为结构化的技能经验合集、“一小时”为各行专业人士对一个问题的见解、“知乎盐”则属于深度行业介绍)
  3. 提供“试读”,允许用户阅览部分内容后再决定是否购买;
  4. 阅读体验方面,为用户提供“书签”和“评论”“分享”等实用功能。

4、在线讨论

(1)需求分析

用户行为:提问、回答或邀请参与活动的嘉宾回答,对动态和讨论进行关注/评论/感谢/分享/收藏/举报

基本需求:为用户和各专业领域的优质嘉宾提供和对方交流接触的途径

深层需求:满足用户的社交需求和品牌(主办方)的推广传播需求

(2)关键因素分解

用户体验目标:能与受邀嘉宾及其他用户展开高效有序的讨论和交流

担忧:提出的问题没有得到回答、讨论区变成“水区”、嘉宾都来自同一品牌、观点可能有失客观

障碍:受邀嘉宾参与积极性不高、讨论时用户言论不可预测、需要给予品牌一定的推广空间

(3)解决方法:

  1. 允许用户提问时邀请到场嘉宾或热门回答者回答问题,同时圆桌期间主持人也会将讨论区中较有价值的热门话题收录至圆桌中,提高曝光率;
  2. 在防止讨论区变成“水区”方面,主持人会做些引导,用户也可对不良内容进行举报;
  3. 邀请的嘉宾中包括来自同一领域但不同机构的专业人士。

5、话题分享

(1)需求分析(内容输出变现的新模式,以下同样只考虑内容消费者)

用户行为:赞助参与、赠送给好友、对知乎Live的内容进行赞赏/点赞/感谢/祝贺/鼓掌/收藏/评价/提问等

基本需求:高效专注的学习氛围,能有效地与播主进行实时互动交流

深层需求:满足用户的求知欲、归属感,以及尊重和自我实现的需求

(2)关键因素分解

用户体验目标:清晰、顺畅、反馈及时且无干扰的直播过程,支持多格式内容

担忧:价格贵、直播内容以语音为主不方便保存、主讲的解说容易被刷屏的问题淹没导致查找费力、提交的问题没得到答复、Live质量过低

障碍:技术问题无法支持多格式内容;问题过多主讲忙不过来

(3)解决方法:

  1. 功能刚起步,先做好语音和图文的分享,后续技术在逐步实现对PPT和小视频等格式的支持;
  2. 知乎Live最低1元起,高低由用户自选,不定时会有限时特价活动;
  3. 为用户提供“语音收藏”和“只看主讲”的功能;
  4. 知乎Live的所有听众可对直播中出现的问题表达“喜欢”,主讲根据问题“喜欢”次数的多少挑重点问题进行回答;
  5. 每场Live结束时都会邀请参与者进行评分和反馈,据此规范Live的质量。

2.2 产品分析

1、功能结构图

知乎 (2)

以下将从产品结构的清晰度和延展性两方面来评价知乎的功能结构。总体来看(左图),知乎的产品骨架比较清晰,底部共5个标签页:

  • “首页”的信息分为三种,顶部标签栏为搜索(重要功能)以及Live(热门子产品)的入口;中间卡片列表部分为内容推荐(包括关注人的动态、优质问答和热门Live);局部信息块为用户活动提供入口(写文章、提问、回答)。
  • “发现”是对各类细分内容的推荐。
  • “消息”是在用户收到“通知、赞与感谢、关注”时给予用户提醒。
  • “私信”方便用户与知友进行交流。
  • “更多”的信息也分为三种,上半部分属于用户信息的记录,下半部分为其他子产品提供入口(知乎书店、知乎Live、值乎),最后还有常规设置。

知乎从最初只做问答功能,到现在已成功添加“知乎书店、知乎Live、值乎”等多个子产品,界面结构仍保持清晰简洁,由此可见知乎产品结构的延展性还是很不错的。

关于知乎的产品功能结构,我有以下的一点想法:

相比于在首页有明显入口的“知乎Live”,知乎另外两个子产品“知乎书店”和“值乎”显然藏得较深,从推广付费内容的角度讲,建议将“私信”归到“消息”菜单下,同时将“更多”中与个人记录相关的内容提出来,放在一级菜单“我的”名下,效果如上面右图所示。

撤去“私信”菜单的理由有两个,一,尽管知乎想做的是知识社交,但大部分用户上知乎主要还是为了找答案,最常用的功能是搜索、问答、评论和写文章;二,很多时候在知乎上发“私信”会有去无回(对方觉得陌生人私信是种骚扰,选择屏蔽),且“私信”不配备表情包,实际体验一般。以上两者都会减少用户打开“私信”菜单的频率,因此建议撤去。

2、核心流程分析(注:以下用粗体标出对应的功能)

(1)提问

首先,对照线下经验,提问是“一对多”的业务流程,其过程大概如下:

找到同伴——我提出一个问题——每个人发表自己的看法(没有见解的会表示支持/反对/做出评论等)——讨论——总结起来得出结论——问题解决

由于app要做的是线上“一对多”的模式,所以区别会在哪呢?

【1】要怎么“召集同伴”:由于互不相识,所以相对比较被动,主动召集只有一种方式:“邀请”,那么这里需要做的就是推荐一些“可被邀请的人”。由于用户提问时默认面向所有对象,因此知乎定义,只要问题有人回答,就为公众所有。

【2】每个人发表看法阶段:就像线下讨论,总有几个意见领袖,有几个没想法的就对意见领袖的观点表示支持或反对,这里需要做的功能,一是让意见领袖的回答人人可见,二是允许非意见领袖们表达赞同、反对、举报等功能。

【3】讨论:参照线下,每人发表观点完毕,会发现存在分歧或有些值得深入探讨的点,这时候要给这群人提供的功能,一是能对每条回答都进行评论,二是更便捷的沟通方式像私信

【4】总结得出结论:提问是为了得到结果,与线下不同,在线提问的对象是所有用户,那么根据“一万个读者就有一万个哈姆雷特”法则,统一结论是困难且非必要的,因此这里只要提供类似投票的功能,如没有帮助,点赞,让用户自筛选高价值内容即可。

【5】最后问题解决:在现实生活中,找到一个难题的解决方法,你担心日后忘了所以你会找本东西把方法记下来,或者你会想把方法分享给朋友们。那么这里需要提供的,一个就是历史保存功能,像我的提问,一个是分享功能。

从以上整个提问的流程来看,由于在线问答不像线下,不是多人实时互动模式,所以也许你还需要一个消息提醒,像通知,这样就允许你转移精力做别的事同时在第一时间了解问题的动态。

(2)回答

相对于提问,回答是个“多对一”的模式,其流程可以参考学生课上老师的提问:

老师提出问题——学生主动回答/老师点名回答——学生回答问题——老师点评回答,问其他同学意见

【1】老师提出问题:对应地,线上有人提交了一个新问题。

【2】学生主动回答/老师点名回答:

一个是答主主动寻找问题来回答,这时候要给他提供获取途径,像搜索、推荐功能等。在线下,能引起学生回答兴趣的问题主要有两种,一种是有把握、能回答的问题,另一种是近期比较流行而自己也有点见解的话题。因此针对前一种我们要知道用户擅长的领域,对于后一种,考虑推荐最新的、热门的问题。另一个是答主被动受到邀请,这时要给答主提醒。

【3】学生回答问题:面对课堂上老师的提问,同学举手之前一般会打腹稿,有的可能会做点笔记。应用到线上,也可以给用户提供草稿的功能。

【4】老师点评同学回答,问其他同学意见:现实场景中,学生答完,老师会感谢同学站出来回答问题,其他同学如果还有想法会站起来补充,如果觉得他的回答很精彩,会用笔记下来,课后还会分享给其他人。这样看来,线上也可以允许用户对答主表达感谢,收藏或评论答主的回答。

(3)专栏

对应现实中给杂志写专栏的流程,知乎“专栏文章”的发布不需要经过审核,其流程大体如下:

打草稿——修改内容、排版——发布

【1】打草稿:用纸笔写作时草稿笔记不会突然消失,而线上用户如果不注意保存草稿就会丢失。要做到像笔纸一样自动留下草稿的痕迹,此处为用户提供自动保存的功能,同时让用户可以从随时查看草稿。

【2】修改内容、排版:杂志内容一般注重图文并茂,结构分明,类似的,线上专栏也应给支持用户上传图片,并能对图文的段落结构进行修改和排版

【3】发布:对于给杂志写专栏的作者来说,尽管文章在发布前会有审核,但偶尔出现错别字或信息错漏在所难免,读者反馈问题,杂志社一般会在下一期对问题声明修正。而在线写专栏无需经过审核,问题可能更多,应为作者提供更方便快捷的修改方式。对于杂志的读者来说,喜欢一个专栏,有人会持续订阅这本杂志,喜欢一篇专栏,有人会把它给剪下来收藏,还会在朋友间进行分享。类似的,我们也可以给用户提供订阅、收藏、分享的功能。

杂志订阅量高了,作为一种激励,作者的稿费价位也会相应提高。与之不同,在线专栏的发布没有“杂志社”作为中间人,为激励作者,可允许读者用户对优质内容进行评分和评价,因此应该提供点赞/赞赏/评论的功能。缺少像杂志这样拥有大量受众的载体,知乎上普通用户所写专栏一开始往往关注度低,曝光率不足,为激励用户可以为其提供@功能,让用户有机会引起大V注意从而借力传播。

总的来说,以上三个流程都具有目的性,刨去用户闲逛知乎的场景需求,以上各部分涉及的功能都能做到与业务需求一一对应,不过少也不冗余。

3、界面体验分析

(1)入口

捕获

左图为知乎首页,一眼看去有三个局部块特别显眼,一个是顶部搜索框,一个是旁边的闪电符号(用户起初不知道是知乎Live的入口,所以会去探索),以及用互补色突出的,位于右下角的黄色元件。点击黄色元件出现右边界面,该过程,元件旋转的同时,“写文章”“回答”“提问”的图标并列跳出,对应标签向左划出,同时卡片列表区出现白色遮罩层。

此处入口设计的巧妙在于:

【1】采用互补色突出元件,并将元件放置在移动端用户拇指容易触及之处,方便点击,一键找到入口。

【2】点击元件后,动态弹出入口捕捉用户视线,同时弱化背景提高对比度。

【3】受点击的黄色元件发生旋转,明确提示用户所处状态已发生变化。

(2)提问

捕获1

左图由首页黄色元件弹出的“提问”入口而来,为问题撰写页面。灰白搭配的页面风格清爽干净,在这类配色相对单调的背景上,自带阴影的弹出框对弹出内容起到了恰到好处的突出。该页面的元素非常简单:灰色提示文字、水平线、发布/设置/关闭元件,用法也一目了然。右图是在“问题”一栏输入关键字后出现的页面,为减少重复问题产生,该步骤会自动弹出“相关问题”列表,引导用户查看。

此处提问设计的优点在于:

【1】背景干净,能有效突出内容。

【2】结构清晰。页面顶部是编辑“问题”的位置,采用浅灰色背景突出层次,同时通过水平线提醒用户,“问题”和“话题”是必填项,“补充说明”可选填。

【3】为避免页面元素过于单调,采用飞机图形代替“发布”按钮,形象简洁;通过将灰色水平线变为蓝色来提示用户其所在位置。

缺点在于:弹出的“相关问题”列表中,由于排版问题文字有时会与数字重叠,导致用户看不清问题,同时影响美观。建议在重叠的地方对数字另起一行。

(3)回答

捕获5

左图由首页黄色元件弹出的“回答”入口而来,据前面核心流程分析,用户回答问题前要先确定擅长的领域。按照提示添加后出现中间页面,“推荐”中出现问题列表,点击“写回答”调转到第三页。前两个页面主题色采用知乎蓝,回答撰写页面采用浅灰/白色,与“提问”处保持一致。相较于“提问”页面,“撰写回答”一页的界面更为简洁,还多了@、上传图片功能以及禁止转载的设置。

此处设计的优点在于:

【1】思路清晰,用户撰写答案前要先确定擅长领域,找对问题。

【2】保持编辑页面风格前后一致,对于查找问题和撰写回答页的主题色,采用蓝色和灰色加以区分。

【3】有效地突出内容。上面前两张图都对重点信息(如“点击添加”、问题的内容和“写回答”)进行加粗或变色处理,以便突出。

需要说明的是,用户在成功提问和回答问题之后,都会默认关注该问题。因此用户有两条途径可查看提问和回答记录,一是:更多——个人主页——我的回答/提问,二是:更多——我的关注——问题。

(4)写文章

捕获7

左图由首页黄色元件弹出的“写文章”入口而来,可以发现“撰写文章”和“撰写回答”不仅风格一致,功能也十分相似。不同点在于“撰写文章”新增了导入草稿的功能,但从写作方便性来看,此页基本不具备排版功能。这会增大作者检查和读者阅读的难度。

此处写文章设计的建议是:

1、左侧键盘收起功能可去掉。目前主流输入法如讯飞、百度、搜狗等都自带该功能,如上图最右侧红框所示。

2、在技术允许的情况下,在界面底部可扩展一些基础的排版功能,如撤销键/字号/加粗/项目符号(尽管只有极少数用户会用app打长文,但不同字号的标题能帮助缕清文章的结构,这对中短文来说也同样重要)

3、 竞品分析

3.1 市场现状

1、行业分析

据易观数据今年12月2日发布的《中国知识付费行业发展白皮书2016》,近年来我国居民人均可支配收入快速增长,消费结构发生变化,人们对于“内容”和“知识”的付费意愿和消费逐渐发生改变,从不愿付费变得对于显著高质量、服务更好的类似产品愿意付费;同时随着移动互联网和移动支付的普及,人们的消费方式也发生了根本性的变化;人们获取信息的方式也从漫无目的地接受变为主动获取知识,信息的选择行为更为成熟。这些基础条件日渐成熟,推动知识付费行业成为新风口。

知识付费不同于出行和外卖行业“高频+刚需”的应用场景,知识交易的频率相对低且个性化程度高。但基于认知盈余分享的供给需求、用户对专业化和垂直化等优质内容的认知渴求,以及为有一技之长的个体提供闲置时间和知识技能的分享平台,知识付费行业仍存在巨大的潜在市场。

2、产品数据

2016年4月20日,ALEXA排名显示,zhihu.com成为中国第29大网站,此时距离2014年8月知乎在ALEXA中国区的排名143,仅仅过去20个月。而2016年12月8日,zhihu.com在ALEXA的排名已经晋升到23位。在移动端,根据appannie知乎iOS版本中国区排名显示,其在社交类app中国区下载量排名最近一年基本稳定在10到15位之间。知乎创始人兼CEO周源在2016年10月28日广州“知乎品牌开放日”上提到,截止至2016年9月,知乎已经拥有6000万注册用户,平均日活跃用户达1600万,人均访问时长达40分钟。目前,知乎已成为国内知识型社交的代表型产品。

3.2 竞品选择

本次选择百度知道(7.4.1版本)和简书作竞品分析对象,主要依据有两个:

  • 本次竞品分析目的是对比功能流程,寻找优化方向;
  • 知乎的老对手果壳目前只做了一个资讯类app,针对知乎的“问答”和“写文章”功能,分别选择同类典型产品“百度知道”和“简书”作对比分析。

3.3 竞品对比

捕获1

1、功能体验分析

(1)提问(知乎VS百度知道)

相对于知乎,百度知道的“提问”入口直接放在一级菜单,同时只需用户编辑题目(标签与补充内容可不填)即可提交,该过程无需用户判断提交的问题是否有重复,问题生成后会自动生成标签,最快1s内可完成该流程。在功能支持方面,两者都支持图片和匿名,但与知乎邀请制不同,百度知道采用悬赏的方式来激励用户回答问题。从亲身体验的角度看,我觉得后者是相对高效的,试过在知乎提了一个问题,邀请了15人回答,晾了一个月没有答复,而今天百度知道给我的反馈是1分钟。可见,相比知乎,百度知道在提问便捷度和反馈速度方面略胜一筹。

捕获

但百度知道对“提问”过程的简省也带来了信息冗余的问题。用户只有在成功提交问题后才能看到“已有答案”的相关问题,假如用户重复提交一样的问题,那他就会有两条同样的提问记录。此外,百度知道的信息同步还不及时,问题得到解答时应同步更新提问记录的状态。

知乎

具体到“提问”页面,百度知道采用虚线对“题目”和“补充说明”进行分隔,同时“提交”和“取消”按钮彼此对称,逻辑清晰,整体风格也清爽干净。

(2)回答(知乎VS百度知道)

由于百度知道将“问答”入口放在首页的顶部二级菜单中,因此知乎需要点击两次才到达的页面在百度知道一步即达。进入“问答”页后,用户会看到默认有“推荐”“最新”“悬赏”三个tab的二级菜单。与知乎让用户根据自身擅长领域来选择问题不同,百度知道是让用户选择感兴趣的问题,它不强制要求用户提交感兴趣的标签,但用户提交之后会扩展二级菜单,如图所示,这样给用户推荐问题会更加灵活且有更好的针对性。此外,百度知道还为用户提供“未答问题搜索框”,方便快捷。

捕获1

从答案呈现方面看,尽管百度知道也允许用户点赞,但并没有像知乎一样采用点赞筛选机制,也不会对没有帮助的答案进行折叠。用户上知乎app搜问题只会得到一个最高质量的解答,而百度知道默认呈现所有答案,对用户来说,后者的选择更多但耗时也多。因此知乎会显得更高效和专业。

具体到回答撰写页面,百度知道直接罗列所有支持功能,不提供“禁止转载”也不能自动保存,但会默认呈现题目,解决用户不想放弃作答又想看回题目的需求。(题目包含问题过多怕疏漏/答案太长怕跑题..)

webwxgetmsgimg (10)

此外,从结构层次来看,百度知道把“提问”放在一级菜单、“回答”放在首页的二级菜单,而知乎直接将两者置于一处,显然层次更为清晰;从社交体验上讲,相比百度知道,知乎允许其他用户在答主的回答下展开讨论,也允许答主在撰写答案时@其他用户,用户互动渠道更多。

(3)写文章(知乎VS简书)

简书“写文章”的入口在一级菜单中,尽管简书提供字数统计和比知乎强大得多的排版编辑功能,其界面风格仍能保持简洁。从个人体验来讲,明显简书“写文章”更为人性化。希望知乎日后能对“写文章”的体验再做一些改进。

捕获

4、 商业模式

Image

知乎自今年4月起先后推出了值乎、原生广告、知乎Live、知乎书店,并支持了付费授权和专栏赞赏功能,商业化加速,知乎正谋求从内容社区升级为服务平台。当前知乎的商业变现仍是以广告和付费内容服务为主。

5、 总结

总体来看,多年来知乎一直紧紧围绕自身的产品定位,通过有效的用户管理和激励机制、用户自筛选和主页推送机制打造高质量和专业化的知识社区氛围。其产品的功能流程逻辑清晰,结构层次简单清楚,界面简单自然。但在提高“问答”的有效互动频率和“写文章”的体验方面还有可优化的空间。

在变现路上,如今的知乎已成功打造商业闭环,当用户在知乎书店读完一本电子书后,不仅能通过社区问答进一步就书中内容进行拓展讨论,更可以浏览作者的专栏文章,或者参与作者的知乎Live,通过“值乎”进行一对一的个性化咨询。也许在未来,知乎还可以考虑切入专业招聘领域。

参考资料:

1.艾瑞咨询《2016年中国移动社交行业系列研究报告-产品篇》

2.艾瑞咨询《中国知识付费行业发展白皮书2016-V5》

from:http://www.woshipm.com/pmd/502718.html

机器学习算法 Python&R 速查表

原文出处: Cheatsheet – Python & R codes for common Machine Learning Algorithms
在拿破仑•希尔的名著《思考与致富》中讲述了达比的故事:达比经过几年的时间快要挖掘到了金矿,却在离它三英尺的地方离开了!

现在,我不知道这个故事是否真实。但是,我肯定在我的周围有一些跟达比一样的人,这些人认为,不管遇到什么问题, 机器学习的目的就是执行以及使用2 – 3组算法。他们不去尝试更好的算法和技术,因为他们觉得太困难或耗费时间。

像达比一样,他们无疑是在到达最后一步的时候突然消失了!最后,他们放弃机器学习,说计算量非常大、非常困难或者认为自己的模型已经到达优化的临界点——真的是这样吗?

下面这些速查表能让这些“达比”成为机器学习的支持者。这是10个最常用的机器学习算法,这些算法使用了Python和R代码。考虑到机器学习在构建模型中的应用,这些速查表可以很好作为编码指南帮助你学好这些机器学习算法。Good Luck!

PDF版本1

from:http://colobu.com/2015/11/05/full-cheatsheet-machine-learning-algorithms

Node.js Resource

Stack Overflow Documentation

Tutorials

Developer Sites

Videos

Screencasts

Books

Courses

Blogs

Podcasts

JavaScript resources

Node.js Modules

Other

First, learn the core concepts of Node.js:

Then, you’re going to want to see what the community has to offer:

The gold standard for Node.js package management is NPM.

Finally, you’re going to want to know what some of the more popular packages are for various tasks:

Useful Tools for Every Project:

  • Underscore contains just about every core utility method you want.
  • Lo-Dash is a clone of Underscore that aims to be faster, more customizable, and has quite a few functions that underscore doesn’t have. Certain versions of it can be used as drop-in replacements of underscore.
  • TypeScript makes JavaScript considerably more bearable, while also keeping you out of trouble!
  • JSHint is a code-checking tools that’ll save you loads of time finding stupid errors. Find a plugin for your text editor that will automatically run it on your code.

Unit Testing:

  • Mocha is a popular test framework.
  • Vows is a fantastic take on asynchronous testing, albeit somewhat stale.
  • Expresso is a more traditional unit testing framework.
  • node-unit is another relatively traditional unit testing framework.
  • AVA is a new test runner with Babel built-in and runs tests concurrently.

Web Frameworks:

  • Express.js is by far the most popular framework.
  • Koa is a new web framework designed by the team behind Express.js, which aims to be a smaller, more expressive, and more robust foundation for web applications and APIs.
  • sails.js the most popular MVC framework for Node.js, and is based on express. It is designed to emulate the familiar MVC pattern of frameworks like Ruby on Rails, but with support for the requirements of modern apps: data-driven APIs with a scalable, service-oriented architecture.
  • Meteor bundles together jQuery, Handlebars, Node.js, WebSocket, MongoDB, and DDP and promotes convention over configuration without being a Ruby on Rails clone.
  • Tower (deprecated) is an abstraction of top of Express.js that aims to be a Ruby on Rails clone.
  • Geddy is another take on web frameworks.
  • RailwayJS is a Ruby on Rails inspired MVC web framework.
  • Sleek.js is a simple web framework, built upon Express.js.
  • Hapi is a configuration-centric framework with built-in support for input validation, caching, authentication, etc.
  • Trails is a modern web application framework. It builds on the pedigree of Rails and Grails to accelerate development by adhering to a straightforward, convention-based, API-driven design philosophy.
  • Danf is a full-stack OOP framework providing many features in order to produce a scalable, maintainable, testable and performant applications and allowing to code the same way on both the server (Node.js) and client (browser) sides.
  • Derbyjs is a reactive full-stack JavaScript framework. They are using patterns like reactive programming and isomorphic JavaScript for a long time.
  • Loopback.io is a powerful Node.js framework for creating APIs and easily connecting to backend data sources. It has a Angular.js SDK and provides SDKs for iOS and Android.

Web Framework Tools:

Networking:

  • Connect is the Rack or WSGI of the Node.js world.
  • Request is a very popular HTTP request library.
  • socket.io is handy for building WebSocket servers.

Command Line Interaction:

  • minimist just command line argument parsing.
  • Yargs is a powerful library for parsing command-line arguments.
  • Commander.js is a complete solution for building single-use command-line applications.
  • Vorpal.js is a framework for building mature, immersive command-line applications.
  • Chalk makes your CLI output pretty.

Work with streams:

Others:

Node lesson
Growth: 全栈增长工程师指南
refer:http://stackoverflow.com/questions/2353818/how-do-i-get-started-with-node-js