演讲与笔记

《闪电式拓张》读书笔记

好久没写文章了。前几日倒是一直在酝酿着写一篇《业务逻辑的可配置化》来聊一聊如何从业务代码中抽身出来的事情,腹稿打了一大堆,临到坐在笔记本前却又把想的种种都忘到了爪哇国去。总归想写点什么,不如把上周看过的《闪电式拓张》总结下吧。

规模效应与网络效应

书中写到:

网络效应会产生正反馈循环,比如对于 AirBnb 来说,每增加一个房东,就让这项服务对每个爱彼迎房客来说更有价值一点,反之亦然;每增加一个微信用户,就让这项服务对其他所有微信用户来说更有价值一点。

网络效应确实是业务拓张的不二法宝,但并不是你作为一个互联网公司就能天然拥有的。从我这几年的所见所闻来看,不少创业公司别说网络效应了,连『规模效应』都做不到,也就是说还处在『小农经济』或者个体户水平罢了。

在第一次工业革命之前,其实英国早就有了蒸汽机,而瓦特只是改良,而不是发明了蒸汽机。那么为什么瓦特的改良比发明更加具有历史意义呢?因为瓦特实现了蒸汽机的规模化,他的蒸汽机不只是在英国的某个小镇得到应用,而是可以标准化地应用到全英国、全欧洲、乃至全世界。因为瓦特蒸汽机是一件标准化的工业品,所以他才可以规模化地拓张,才可以压低成本,获取超额利润。

对于初创企业来说,有没有可能实现规模效应,不是看你有没有用上最新的 hadoop, spark 乃至 flink 这些最潮最酷的工具,而是要看你的服务是否能够轻松拓展给更多地用户。这些工具是用来解决你因为闪电式拓张而产生的巨大流量的,工具是结果而不是原因。

能够实现规模化拓张是实现网络效应的前提条件,所谓规模化拓张,其实就是现在所说的『中台』罢了。如果你连规模化都做不到,就别想着直接从小农经济跳到网络效应了。

好消息是,你捕到了一条鲸鱼,坏消息是,你捕到的是一条鲸鱼!

商业模式创新

忽略了业务,甚至连业务是什么都不懂。而真正的天才公司和创始人他们往往也是商业奇才。
投资者想要的是10亿美元级别的项目。

利用现有网络的营销:

AirBnb 建立了一个系统,允许并鼓励房东将他们的房源交叉发布到规模大的多的 Craig’s List 上。房东被告知:将你的房源从 AirBnb 转发到 Craig’s List 上,会使你的月均收入增加 500 美元。并且只需要一键点击就可以了,Craig’s List 并没有公开的 API,所以实际上是 AirBnb 自己做了一个转发,这可以被称作是增长黑客了。

PayPal 的病毒式营销

每推荐一个客户,你将得到 10 美元,你的朋友也将得到 10 美元。

通常来说,消费者只关注价格以及购买商品带来的享受。这意味着出售低利润产品不一定比出售高利润产品更容易。初次之外,并非高端的客户才能创造高额的利润

阅读《Python hitchhiker》笔记

Package

A file modu.py in the directory pack/ is imported with the statement import pack.modu. This statement will look for an __init__.py file in pack, execute all of its top-level statements. Then it will look for a file named pack/modu.py and execute all of its top-level statements. After these operations, any variable, function, or class defined in modu.py is available in the pack.modu namespace.

A commonly seen issue is to add too much code to __init__.py files. When the project complexity grows, there may be sub-packages and sub-sub-packages in a deep directory structure. In this case, importing a single item from a sub-sub-package will require executing all __init__.pyfiles met while traversing the tree.

This and other issues led to the idea that using stateless functions is a better programming paradigm.
Another way to say the same thing is to suggest using functions and procedures with as few implicit contexts and side-effects as possible. A function’s implicit context is made up of any of the global variables or items in the persistence layer that are accessed from within the function. Side-effects are the changes that a function makes to its implicit context. If a function saves or deletes data in a global variable or in the persistence layer, it is said to have a side-effect.

Pure functions

• Pure functions are deterministic: given a fixed input, the output will always be the same.
• Pure functions are much easier to change or replace if they need to be refactored or optimized.
• Pure functions are easier to test with unit-tests: There is less need for complex context setup and data cleaning afterwards.
• Pure functions are easier to manipulate, decorate, and pass around.

However, it may be a good discipline to avoid assigning to a variable more than once, and it helps in grasping the concept of mutable and immutable types.

A LICENSE file should always be present and specify the license under which the software is made available to the public.
A TODO file or a TODO section in README should list the planned development for the code.
A CHANGELOG file or section in README should compile a short overview of the changes in the code base for the latest versions.
Project Publication
Depending on the project, your documentation might include some or all of the following components:
• An introduction should show a very short overview of what can be done with the product, using one or two extremely simplified use cases. This is the thirty-second pitch for your project.
• A tutorial should show some primary use cases in more detail. The reader will follow a step-by-step procedure to set-up a working prototype.
• An API reference is typically generated from the code (see docstrings). It will list all publicly available interfaces, parameters, and return values.
• Developer documentation is intended for potential contributors. This can include code convention and general design strategy of the project.

put project/ tests/ docs/ directory in side the project

短视频与机器学习

机器学习需要 Ground Truth
modality是什么意思…

# 浅度学习

## 短视频如何火

为什么: 大多数的短视频1天之后都销声匿迹了
数据集: 10个vine用户的follower广度优先, 获得十万种子用户

大V发布的(social), 声音很好(audio), 美感很好(visual), #hashtag选的好(text)

从以上四个方面抽取特征.

social 的影响最大

## 预测地理标签

1.2%才有地理标签, 预测是会议室/篮球场/公园等, 最重要的是visual feature

# 深度学习

## 声音相关

freesound 是一个免费的声音库. 从一个标签开始, 抽不同的标签的声音. 查找不同的声音

深度学习加迁移学习

alexnet-7是啥

## sequential and sparse

字典学习是啥?

什么事共空间?

# 未来

用户的兴趣是动态的, 但是推荐却是固定的.

无法搜索没有文字的视频 比如: 可以截一帧然后到google上搜索

用户的平台对应关系, 利用quora等, 用户自己关注了

ontology

Ø 短视频的评论也是文本信息啊
Ø Q: 短视频和长视频的分析区别
Ø A: follow等, 地理属性, 质量低

《算法设计与分析基础》笔记

http://blog.csdn.net/wangyunyun00/article/details/23464359

差值查找

折半查找这种查找方式,还是有改进空间的,并不一定是折半的!
mid = (low+high)/ 2, 即 mid = low + 1/2 * (high – low);
改进为 下面的计算机方案(不知道具体过程):
mid = low + (key – a[low]) / (a[high] – a[low]) * (high – low),
也就是将上述的比例参数1/2改进了,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次 数。

Andrew Ng 的公开课笔记

http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-1/

Andrew ng 课程的 python 解法

拟合曲线也是机器学习
ICA independent component analysis 用于解决鸡尾酒宴会问题(分离独立声源)

梯度下降法
两种
Batch
Random

搜索阅读笔记

# 文档评分

## 索引的类型(参数化索引和域zone索引)

对于每个文档来说,除了一个字符串作为正文之外,还有其他的metadata,比如一篇文章就会有 title publish_time author 等等。

其中 publish_time 这种是有取值范围的,我们称之为参数化索引。而对于title和author这种可以是任意的自有文本,因此我们也可以对它建立倒排。

在这里建立倒排有两种数据结构,目的都是把 term 和 zone 都标注到倒排上:

1. 把 term 和 zone 合起来作为新的term

“`
wiliam.abstrct -> [11], [122], [1441]
william.title -> [2], [4], [8]
william.author -> [2], [3], [5]
“`

2. 把 zone 和 docID 一起记录

“`
william -> [2.title, 2.author], [3.author], [4.title], …
“`

### 域加权评分

对每个域给定一个权重,然后使用每个域有没有出现相关关键词来求和评分

### 权重的设定

“`
1. 专家设定
2. 由人工标注,然后使用机器学习来评分
“`

APUE 阅读笔记

使用sysconf来动态地在运行时获取 INT_MAX 等常量地值

# IO

## 不带缓冲的IO

read write open close lseek 函数

## stdio

标准IO库是围绕stream来的,而read/write 等系统函数则是面向文件描述符。

### 缓冲

缓冲分为三种,全缓冲、行缓冲、不缓冲。标准错误是不带缓冲的,标准输入输出等终端设备是行缓冲的,其他是全缓冲的。可以使用 setvbuf 函数更改缓冲类型。使用fflush 函数强制写入。

### 文件操作

使用 fopen/freopen/fdopen 来打开文件,使用fclose关闭文件。使用fseek和ftell来定位文件。

### 字符IO

使用 getc/fgetc 读取单个文件,使用 putc/fputc 写入单个字符。注意其中getc 可以实现为宏,而fgetc往往实现为函数,这样方便传递指针,两个的功能是完全一样的。
另外还有函数 ungetc 用于回退一个字符到读取的文件中。ungetc 和 putc 的区别在于,一个是回退文件到读模式的文件中,一个是写入到写模式的文件中。

### 行IO
千万不要使用gets和puts函数!可能造成缓冲区溢出攻击。
fgets会读入n-1个字符(包括换行),同时把最后一个字符置为null。fputs把一个字符串写出到流中,不包括结尾的null,也不会额外输出换行。

### 二进制IO

使用fread和fwrite函数来实现直接从文件中读取一个结构等数据类型。

### 格式化IO

printf/dprintf/fprintf/snprintf 函数,注意不要使用sprintf函数,可能造成缓冲区溢出攻击。
还有v开头的函数组用来使用单个参数代替 vargs。使用scanf/fscanf/sscanf读取数据

## 临时文件

使用 tmpname/tmpfile 创建临时文件。使用 mkdtemp和mkstemp创建临时目录。不过尽量使用tmpfile和mkstemp,以避免文件被占用。

## 内存文件

使用fmemopen来在内存中创建一个临时文件。但是这样创建的文件会自动写入null,不适合于二进制文件。

可以使用另外两个函数用于创建内存文件,open_memstream 和 open_wmemstream。这两个函数创建的流只能是写打开,但是可以通过直接访问缓冲区来读取文件内容。非常适用于创建临时文件,提升性能。

# 文件与目录

## 概述

来自头文件 sys/stat.h 调用 stat 函数返回 struct stat 结构。
使用S_ISXXX(st.st_mode)宏来判断文件类型,是否是常规文件、目录等。
st_mode中还包含了rwx等权限,使用S_IRUSR, S_IRGRP 等宏测试。

## suid 和 sgid

在st_mode 中分别有两位代表了 st_uid 和 st_gid,分别表示当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID,可以使用 S_ISUID, S_ISGID 测试。另外可以使用 access 函数测试文件的实际用户ID

举个例子,比如/usr/bin/passwd程序允许任意用户更改自己的密码,但是/etc/passwd 这个文件又是root所有的,这时候因为/usr/bin/passwd程序设置了set_uid,普通用户运行passwd程序时就拥有了root权限,从而可以更改 /etc/passwd 文件

## 新文件的权限

新文件的 uid 设置为进程的有效uid。新文件的组ID可以是:

1. 进程的有效gid
2. 文件所在目录的gid。如果所在目录设置了 set_gid。

## 权限操作

### umask

使用umask来设定创建文件的默认权限。可以在shell 中使用umask 命令来设定。或者使用 umask 函数:
mode_t umask(mode_t cmask); 注意这个函数是为数不多不反悔错误码的函数。

### 更改文件属性

chmod 和 chown

## 黏着位

主要用于对目录操作,如果目录设置了黏着位,只有该文件的拥有者或者目录的拥有者才能够删除该文件,比如 /tmp 大家都可以写,但是不能删除别人的文件。

# 系统数据

# passwd 文件

/etc/passwd 保存了系统中的用户相关信息,虽然这个信息是纯文本的,但是需要使用系统函数来解析,而不是自己解析这个文件。

“`
#include struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char* name);
“`

如果需要遍历这个文件的话,使用 getpwdent/setpwent/endpwent 三个函数。ent是entry的缩写。getpwent获得下一个配置项,setpwent返回第一个配置项,endpwent关闭文件。

现代的操作系统,通常将真实的密码放在 /etc/shadow 文件中,从而避免密码破解。而使用数据结构 struct spwd 来存储相关信息。与之对应,可以使用 getspnam/getspent/setspent/endspent 函数来操作这个文件。

## group 文件

/etc/group 文件保存了系统中的组相关信息。在C中使用 struc group 来代表这个结构。可以使用类似的函数来访问这个文件:getgrpid getgrpnam getgrent/setgrent/endgrent

现代的unix操作系统中都包含了辅助组,可以使用以下这些函数来访问辅助组信息
getgroups/setgroups/initgroups

## 其他数据库文件

“`
/etc/hosts/ hostent | getnameinfo/getaddrinfo
/etc/networks netent | getnetbyname/getnetbyaddr
/etc/protocols protoent | getprotobyname/getprotobynumber
/etc/services servent | getservbyname/get servbyport
“`

## hostname

可以使用uname和gethostname/sethostname来操作相关数据

## 时间和日期

time函数返回当前时间戳。另一个多功能的函数是clock_gettime。可以使用clockid来制定不同的功能,当使用clock_gettime(CLOCK_REALTIME, tsp) 时,返回更高精度的时间。后一个参数是timespec类型的。

“`
struct timespec {
time_t tv_sec;
long tv_nsec;
}
“`

另外需要注意的是 gettimeofday 和 struct timeval 都已经废弃了,建议使用clock_gettime。另外相关的函数还有 clock_settime 和 clock_getres。可以使用gmtime和localtime来定义struct tm,注意在struct tm中没有时区信息。使用mktime可以从struct tm转换到time_t 或者 timespec。注意这里是从本地时间转换。mktime参考TZ变量

使用strftime和strftime_l来把struct tm 转换为人眼可读的字符串。不同的是,strtime只从TZ环境变量中读取时间信息。而strftime_l则可以通过参数指定。

# 进程管理

使用atexit可以注册在程序退出时运行的函数。

## C程序的内存布局

正文段text、全局常量data、未初始化数据段bss、堆、栈、命令行参数和环境变量。地址由低到高。使用malloc/calloc/realloc函数分配内存,使用free函数释放内存。堆从低地址向高地址增长,栈从高地址向低地址增长。

## 环境变量

使用全局常量environ访问所有的环境变量,但是当需要访问一个值的时候,使用getenv。使用setenv/putenv/unsetenv等函数更新环境变量。

## 非局部跳转

使用 setjmp 设定跳转的位置。在程序正常执行时,setjmp返回0,当发生错误时,调用longjmp,同时设置返回值,这时候会再次返回到setjmp的位置,返回值是刚刚设定的返回值。jmp_buf 一般设定为全局变量

## 资源控制

使用 getrlimit/setrlimit 两个函数

# 进程控制

## pid相关函数

“`
getpid/getppid/getuid/geteuid/getgid/getegid
“`

## 创建子进程

fork 创建新的进程,并把父进程的属性都复制一份给子进程,子进程随后可以执行相同的代码(比如web服务器),或者调用exec执行新的程序。

linux上还有更高级的clone 调用。

exec 使用文件名和参数列表作为参数,执行一个新的程序。还可以传递环境变量。其中execve是系统调用,而其他函数则是库函数。

可以使用setuid和setgid来改变进程的uid和gid,但是仅限于实际uid和文件的setuid。

system函数直接执行一个命令,并返回执行结果。需要注意的是,千万不要在setuid的程序中使用system函数,这样会导致system调用的命令权限过大。

通过nice函数可以调节进程的nice值,nice值越大,优先级月底

## 进程退出
在Unix上,exit是一个库函数,_exit是一个系统调用。所有父进程结束的进程,他们的父进程会变为init进程。父进程有义务处理子进程的现场,对于已经退出,但是父进程还没有处理的进程,称之为僵尸进程,而init进程总会回收他的子进程,避免造成僵尸进程。

进程退出后,系统会向父进程发送信号,父进程可以在这时候回收进程。可以使用wait/waitpid/waitid 来获取退出的进程的ID,从而进行相应的清理。其中waitid 应该是最好的,但是似乎比较新,文档不多

信号定义的头文件是 singal.h

restrict keyword

restrict says that the pointer is the only thing that accesses the underlying object. It eliminates the potential for pointer aliasing, enabling better optimization by the compiler.
For instance, suppose I have a machine with specialized instructions that can multiply vectors of numbers in memory, and I have the following code:

“`
void MultiplyArrays(int* dest, int* src1, int* src2, int n) {
for(int i = 0; i < n; i++) { dest[i] = src1[i]*src2[i]; } } ``` The compiler needs to properly handle if dest, src1, and src2 overlap, meaning it must do one multiplication at a time, from start to the end. By having restrict, the compiler is free to optimize this code to using the vector instructions. EDIT: Wikipedia has an entry on restrict, with another example, here.

学习 Startup Engineering

https://gist.github.com/dideler/5796745

Startups vs. Small Businesses:

* A startup is about growth and usually involves new technology and unproven business models.
* A small business, by contrast, does not have ambitions of world domination and is usually geared towards a particular geographical area or limited market where it has some degree of monopoly through virtue of sheer physical presence.

Shift per-unit costs into fixed costs (e.g. via software).
Costly up-front software development can pay off in the long run.

Pricing is important; to the extent that you are not constrained by competition, you really do want to charge the highest possible price at the beginning to get into the black as soon as possible.

1. Figure out the precise minimum scope of what you want to create
2. Calculate how much money is required to achieve that minimum goal

50 美元的定价是比较好

Measure growth rate per week, but only after you’ve launched. A good growth rate (during YC) is 5-7% a week. If you can hit 10% a week you’re doing exceptionally well. If you can only manage 1%, it’s a sign you haven’t yet figured out what you’re doing.
Focus on just hitting a growth rate every week. This focus reduces the otherwise bewilderingly multifarious problem of starting a startup to a single problem. Use that target growth rate to make all your decisions for you. Having to hit a growth number every week forces founders to act. Nine times out of ten, sitting around strategizing is just a form of procrastination.
Best thing to measure growth rate of is revenue for startups that charge initially, and active users for startups that do not.

Be aggressive when recruiting new users. Manually and individually recruit your initial users; go out to a coffee shop and have people try your product. Go door-to-door. Have people sign up for your beta in person. The numbers will seem small at first, but don’t be fooled by compound growth – it starts slow.

One advantage of being small: you can provide a level of service no big company can.

Sometimes the right unscalable trick is to focus on a deliberately narrow market. It’s always worth asking if there’s a subset of the market in which you can get a critical mass of users quickly.

TL;DR recruit users manually and give them an overwhelmingly good experience, and founders need to work hard

YN:我总是想着能够自动化地大规模招募用户,这是错的。在发展到一定阶段以后才需要。

TL;DR recruit users manually and give them an overwhelmingly good experience, and founders need to work hard

You want to find a small market to quickly create a monopoly, and then expand. You’ve found it when people depend on it even when it’s still a crappy incomplete product.

《结网》阅读笔记

1. Alan Key:热爱软件的人应该制造自己的硬件。
2. 不要自以为是,要通过 A/B 测来进行

> 比如有用户反馈糗百审核界面将“通过”按钮改成“笑了”按钮很不好,因为这样的话,感人的温情帖不容易就通过了。
3. 在美团之前,过期不退是团购行业的创收的商业模式之一,而美团提供了退款服务,做到了理念领先,没有放弃为用户创造价值的初衷。
4. 大多数时候,你想到的原创概念可能早就有其他人想到了,所以不要拘泥于非要有一个原创概念才能碾压别人。如果能找到已经存在的实现,通过研究它可以节省很多探索的时间。
5. 既有概念的转化:比如从博客简化一点就到了微博,再从微博降低门槛就得到了快手。
6. Web 2.0 公司的 7 种能力
1. 服务,而不是打包的软件
2. 控制独特的难以再造的数据源,并且用户越多内容越丰富
3. 把用户当做共同开发者来信任
4. 借力于集体智慧
5. 通过用户的自助服务来发挥长尾的力量
6. 超越单一设备层次的软件
7. 轻量级的用户界面、开发模式和商业模式

其实总结起来就是两个词:服务和UGC,而不是软件和PGC。
7. 通过差异化和低成本来实现创新价值,从而在蓝海中时间段内达到理性的用户规模或者足够高的竞争壁垒。
8. web 2.0 就是提供一个社区让用户来主动参与创作内容,而不是需要网站的运营者组织编辑团队来创作。下面的几个例子
1. QDB(bash.org)海外版糗事百科,只提供了一套内容体系来让用户提交内容
2. 作者自己的博客的友情链接:本来应该是由作者来维护的,但是作者选择让评论最多的五个人自动成为友情链接。
9. [商业模式画布](https://assets.strategyzer.com/assets/resources/the-business-model-canvas.pdf)
1. 哪些用户可以通过产品受益,他们是男是女,年龄多大,有多少人?
2. 这个产品为目标用户带来什么价值?
3. 产品所实现的价值如何传递给用户?
4. 如何建立和维护产品和用户之间的关系?
5. 能获得收入吗?
6. 核心资源哪些已经具备了,哪些还是欠缺的?
7. 需要完成什么关键业务才能达到里程碑?
8. 需要外部合作伙伴吗?
9. 上述问题的成本是?
10. 项目是否能够真正落地?
1. 可以使用“朋友测试法”。我身边的某个朋友是不是会成为用户?他为什么要使用这款产品?我的父母会不会使用这款产品?为什么?如果测试下来发现身边没有一个“真人”想要使用它,这个概念就有很大问题。
2. 可以使用“真实世界投射法”。把互联网中的概念投射到真实世界中普遍存在的事物上,通过已经被验证的真实世界案例来推断互联网产品的可行性。比如在 facebook 的 news feed 之前,要了解某个好友的动态需要到他的主页去看,现实世界中我们显然不想要去好友家里打听他的最新状况,而是不经意间就会听说,而news feed 显然满足了这个需求。
11. 产品是为用户提供价值的,如果能更好地为用户提供价值,那就要及早革命自己。比如新浪推出了新浪微博,直接去看新闻的人就少了,算是革掉自己的命。但是新浪新闻自身实际上还是没有意识到危机,最终被今日头条取而代之
12. 未来的行业划分
1. 不应该是 农业-工业-服务业,而因该是**制造业-服务业-体验页**。如果你为物品和有形的东西收费,那么你所从事的就是商品业,如果你为自己开展的活动收费,那么你从事的就是服务业,只有当你为消费者和你一起度过的时间收费的时候,你才算进入了体验业。——《体验经济》。比如网游、QQ会员等。
13. 互联网公司中的两种重要产品:
1. 现金牛:利润率超级高,占了公司总利润的很大比例,比如九城代理的魔兽世界
2. 平台产品:能通过自身的资源优势拉动其他产品的产品,比如QQ。
一款产品的用户规模时候会变得很大,最终成长为平台型产品,要看这款产品有没有满足用户的强需求和频发需求。
很多用户都是在注册这个流程中流失的,所以平台提供自己的账号体系是非常有必要的,比如 Google 的 Gmail 账号。
14. 获得投资,王潇总结的三大问题:
1. 产品概念是否 处于 趋势 上,是否 在 满足 强 需 求和 频 发 需求?
2. 是否 找到了 有效 的 突破口, 突破 之后 如何 建立 壁垒?
3. 团队 能力 与 产品 概念 是否 匹配?
突破口的作用在于让用户觉得产品有用,壁垒的作用在于让这种有用变得难以复制。App Store 里的大量应用,淘宝卖家服务市场里的大量应用,微信中沉淀的关系链,都是非常高的壁垒,竞争对手们很难复制一些功能来获得这些特殊的资源。
15. 使用焦点小组对用户进行概念测试
1. 焦点小组就是邀请6-9个人,具有代表性的用户对某一主题或观念进行深入讨论的方法。
2. 用户的历史行为比他们的当前意愿更有价值,因为用户不一定表达的是真实观点。
3. 其他的方法包括体验观察室(感觉不太现实),更重要的是 A/B试验。
最重要的意识是,网站做出重要觉得的时候,要依赖数据,而不能想当然,比如 picasa 的下载按钮试验。

## 产品经理的具体工作

### 产品设计文档

把概念变成图纸。YN:这算是产品经理的一项具体工作了,当然网页这个概念在移动互联网时代也应该改成应用。

需要三个图纸:网页(App)结构图、网页(App)线框图、网页(App)描述表

1. 网页(App)结构图。描述了整个网站或者应用的架构,确定了模块划分和网页(应用界面)的个数。(很多时候根绝这个确定url规则和title规则)。描述结构图应该使用MESE法则,相互独立,完全穷尽。**其中标注的优先级可以将项目进一步细分为几个阶段:phase1、phase2、phase3,这对网站的开发很有帮助,可以让项目成员知道,完成了phase1基本上网站就可用了。**

可以使用面向对象的方法来做产品规划,在实验过程中更容易达到用户人物的闭环,比如对于书的CRUD,基本满足了对用户买书的闭环。

考虑成本的时候,想着研发成本只占20%。剩下的问题是确认这80%的非研发成本都在哪里?YN: 为什么?

PS:消灭拖延的最好方法,就是把任务分解为连续的,在能力范围内的小任务。
[糗事百科的功能]
[糗事百科用户角色划分]
2. 网页(App)线框图。图片越抽象,读者理解起来就有越大的发挥空间。使用 balsamiq mockup 绘制线框图。
3. 网页描述表是包含了一份网页所需要战士的元素和他背后的逻辑,而不包含这些元素在页面中的布局。
1. 将产品经理的工作和交互设计师的工作区分开,茶品经理关注的是传递*什么*信息,交互设计师关注的是*怎样*传递信息。
2. 向研发团队说明信息背后的逻辑,方便他们实现。
描述表和线框图一起构成了一个网页的完整描述,有了这个研发才能评估开发量。
除此之外还有一些非功能需求,比如网页的加载延时等等,需要作为整体需求一并提交。

产品设计文档是伴随产品整个生命周期的链接概念和执行的重要工具,它帮助产品团队与研发团队和高层之间达成共识,进而明确研发计划并指导研发过程。

有以下几点需要注意:

1. 设计文档需要有 FAQ,当项目进行了很久之后,很可能没有人记得当初某个需求是如何确定的,这时候附加信息就能帮助团队找出最初的背景。
2. 应该使用 wiki 而不是 word 文档来记录产品开发文档,好处太多了,不再赘述。
3. 产品经理不应该对别人(尤其是研发人员)指手画脚。
4. 产品开发文档应该使用肯定的语言,不要提模糊的需求。
5. 不要过分关注文档而忽视了沟通
6. 文档的模板并不重要,关键是内容

## 用户体验

网络广告在产品认知中只能排名第二,排名第一的是朋友也在用。而用户体验决定口碑,口碑决定产品成败。

用户体验的三要素:别让我等、别让我想、别让我烦。

用户的耐心是非常有限的,他们对于速度的追求*超过了对于画面的追求*。实际上这是一个响应问题,而不是性能问题,比如程序打开时候的图标放大动画。而且如果牺牲完整性在可以容忍的范围内,就要牺牲完整性,而让性能更好。

如果万一出现了问题,要加强信息的披露和用户的沟通,争取用户的谅解和支持。

布什内尔:谁低估美国人的智商,谁就会发财。用户是懒得想的。

设备当前位置和目标位置的距离,距离越短,所用时间越短。面积越大,所用时间越短。尽量减少用户的操作时间。另外采用温柔的提示方法,不要弹出警告对话框。

对于一些用户会感到很烦的按钮,比如“注册”,可以替换成“继续”,让用户顺便创建一个账户,这样更好。

用户喜欢消灭数字,比如“豆邮(1)”,从头条的实践来看,这个小红点还是很管用的。但是不要让数字太大,这样用户直接放弃治疗了。

## 项目管理

项目经理对项目负责,产品经理对产品负责。

首先,产品经理提出产品概念,梳理好用户的任务。设计团队中的交互设计师会和产品经理一起设计表现层的信息展现和交互。有了线框图后,图形用户界面设计师开始设计形状、色彩、质感等视觉元素,确定产品在表现层的最终展现。同时,研发团队中的系统架构师会根据产品经理的产品设计文档,规划好业务逻辑层要做的事情并确认要存储哪些数据,也会确定表现层、业务逻辑层、数据持久层和辅助系统都要用到哪些技术,并且估算不同用户规模下需要的服务器数量和带宽;研发同事会按照系统架构师的规划领取自己的研发任务,这些研发任务完成后会被组合好安装到服务器上。图形用户界面设计师的工作和研发团队的工作会在表现层整合到一起,形成兼具视觉效果和特性的产品表现层。然后,测试团队通过测试确认产品是否符合产品设计文档,测试通过后通知产品经理进行最终的测试和体验。这一切完成之后,产品就可以发布和用户见面了。

常见的方案:从 app 开始,然后平移到 wap 页,然后在拓展到 web 和 iPad。原因是从一个精简的基础做加法容易,而从一个大而全的基础上割肉很难。

开发项目往往是由虚拟团队负责的,项目成员不是产品经理或者项目经理的直接下属,所以产品经理也没有恐吓他们的大棒,也触碰不到他们的评级和奖金。

世界语是指项目组所有成员通用的语言,世界语的教科书就是项目字典。项目字典并不是一份文档,它是项目经理在项目团队中所推广的一份虚拟文档,它存在于产品需求文档和日常的沟通中。首先,项目经理在日常的沟通中发现大家经常出现语言不通的地方,然后对这些地方进行更精确的命名以消除歧义,并且在日后的沟通中不断强化。

对于项目中的资源和实施环节,需要预先评估风险,然后考虑到如果发生了这样的情况,是否可以忍受,或者有什么补救的方法。

墨菲定律

1. 一项工作如果只有一个人负责,这个人肯定会休假或者离职
2. 人为没有技术难点的部分,都会成为技术难点或者是性能瓶颈

选用轻量级、对团队现有工作习惯入侵小的工具,可以事半功倍,太重的工具往往因为懒得启动而变成鸡肋,与团队工作习惯差异太大则难以有效执行。

《失控》:要想洞悉一个系统所蕴藏的涌现结构,最快捷、最直接也是唯一可靠的方法就是运行它。

读《数学之美》

1. 文字只是信息的载体,而非信息本身
2. 翻译之所以能够进行,是因为人类的语言本质上都是等价的
3. 信息的冗余是信息安全的保障
4. 自然语言是上下文相关文法,而人工语言往往是上下文无关文法。