作者归档:白宦成

关于白宦成

独立开发者, 自由职业者, 写作者

介绍一下 Read it!

介绍一下 Read it!

每年我都会给自己开一些新的坑,用于探索新的技术方向、新的领域。2024 年,我的新项目是 —— Read it!

Read it! 是一个用于分享我自己觉得不错的文章、网站的地方, 你可以在这里看到我日常浏览网页过程中发现的不错的网站、文章。

我会在分享链接的过程中,加上一些我自己的看法、总结。

如何使用 Read it!

  • 网页浏览: Read it! 是一个网站,所以你只需要打开浏览器,访问 readit.ixiqin.com,就可以看到我分享的网站。
  • RSS 订阅:作为一个古早 RSS 爱好者, 你可以直接在你的 RSS 里订阅 Read it! ,将 https://readit.ixiqin.com/rss/bookmarks/ 贴在你的 RSS 阅读器里,就可以查看到它。

为什么会有 Read it!

我是湾区日报的读者,也很喜欢湾区日报的形式。包括过去也尝试过用 WordPress 之类的系统来搭建类似的形态。但,繁琐的操作会消磨我分享的耐心。

最近又在整理书签,加上也开始进行一些大模型应用的开发,所以决定借助大模型来帮助我自己完成一些工作,就重新搞起了 Read it! 这个项目。

Read it! 目前的工作模式挺简单的,我找到觉得不错的文章,直接在 IM 里发给他,他会自动解析我的意图,并将解析出来的结果录入到系统当中,给大家看。想来这样的交互可以让这个项目活得更久一些~

流程说明

Read it! 会分享什么?

Read it! 可以理解为是我自己再看的各种文章,所以并不会局限领域、方向,只要是我自己看的觉得有收获的,我都会分享。后续会考虑提供分标签的订阅方式,这样你可以选择只订阅自己喜欢的文章。

CapRover 如何停止服务,并进行硬盘扩容/维护

CapRover 如何停止服务,并进行硬盘扩容/维护

在一开始使用 CapRover 时,我使用的是一个 10 GB 的数据盘,但在部署了诸多应用后,10GB 的数据盘已经无法满足我的需求,于是我就对其进行了扩容,扩容至 20GB。在完成扩容 & 重启后,仍需要执行 Linux 的扩容命令 resize2fs 来扩容硬盘。

但由于 CapRover 中运行的服务跑在这个数据盘上,并没有办法直接在这个数据盘上进行扩容(进程会持续读取文件),因此,需要先将 CapRover 上的服务暂停,暂停后进行扩容,并重新启动服务。

CapRover 底层是使用 Docker Swarm + Nginx 来进行的,因此,我们只需要使用 Docker Swarm 的命令,来停止服务运行即可。

1. 获取服务名称

首先,你需要先获取到当前所有在跑的服务,以便于稍后去暂停。执行 docker service ls 来获取到具体的服务名称。

2. 拼接所需的命令

在 Docker Swarm 当中,并没有直接的 Start or Stop 概念,而是通过将 Replica 设置为 0 来实现关闭的能力。这个命令可以通过 docker service scale 服务名=服务数 来实现。因此,你需要将对应的服务设置为 0 来解决这个问题。你可以先行把开启和停止的命令拼接好,从而实现快速的启动和关闭,尽可能的减少宕机时间。

如果是有多个服务,可以直接拼接在后面,从而实现一次关闭 / 开启多个服务。

# docker service scale service_name=1 service_name_2=0
# 停止命令
docker service scale srv-captain--blog-ixiqin-com=0 srv-captain--mysql-8-production-db=0 srv-captain--pgsql-16-production=0 srv-captain--redis-server-production=0
# 启动命令
docker service scale srv-captain--blog-ixiqin-com=1 srv-captain--mysql-8-production-db=1 srv-captain--pgsql-16-production=1 srv-captain--redis-server-production=1

3. 执行命令,扩容硬盘

你可以先执行停止命令,然后执行扩容命令。完成扩容后,重新启动,即可完成整体的扩容。

使用 CapRover WebHook 获得类 Vercel 部署体验

使用 CapRover WebHook 获得类 Vercel 部署体验

我在开发前端应用的时候,基本上使用的都是 Vercel ,究其原因,主要是以下几个点:

  1. Vercel 可以方便的与 Github 整合,提供简单易用的部署方式:写完代码,测试完成后推送到 Github ,就会自动部署到线上。对于小型项目来说,可以简化部署的流程。
  2. Vercel 提供了自定义域名和自动配置的 SSL,提供了简单的配置方式:在现在 SSL 成为标配的模式下,在 Vercel 你只需要把域名解析到 Vercel ,并在你的 Project 当中绑定域名,就会自动完成域名绑定和 SSL 申请和续期。
  3. Vercel 提供了 FaaS 环境:写应用的时候,很多时候不只有前端的需求,这个时候, Vercel 自身的提供的 FaaS 环境可以帮助你完成基本逻辑的编写。

但 Vercel 毕竟是以前端为主,且函数运行时长也有限制,对于一些比较重的场景下,Vercel 还是不太够用。刚好最近我把服务部署从传统的 LAMP 换成了 Docker Based PaaS,我使用的 CapRover 提供了类似的体验。

使用 Cap Rover 你能获得的体验:

  • 上传代码后,自动部署到 Production
  • 绑定域名后,自动配置 SSL 证书,且可以配置其他域名转发到主域名

具体操作步骤见下:

安装 CapRover

CapRover 的安装我就不再赘述,跟随官方的说明安装即可。

绑定根域名

当你登录 CapRover 时,CapRover 会让你绑定一个泛域名解析,你可以根据自己的需要,绑定一个二级或者三级域名,然后在 DNS 解析一个 * 到这个服务器上。这样后续部署的服务就会自动解析一个 服务名.你的域名 ,用于服务的初步访问(类似于 xxx.vercel.app)。

上传代码至 GitHub

在 Github 上创建一个代码仓库,并把你自己的项目部署上去。如果你有已经写好的 Dockerfile,可以一并上传上去。如果没有的话,则可以选择参考 CapRover 提供的 Sample App ,里面提供了常见语言的部署参考。

创建容器并配置环境

完成代码上传后,你可以进入到 CapRover 后台,创建一个新的 App。这里可以输入你喜欢的名字,方便后续查找即可。

创建完成后,点击下方列表中的应用名称,进入应用的配置页面,并切换至 Deployment 页面。

在这个页面,可以找到 Method 3 : Deploy From GitHub/ Bitbucket/Gitlab,填写你的仓库信息、分支名、用户名。密码你可以选择直接使用你的密码,也可以选择创建一个 Personal Access Token ,或者是在仓库里配置一个 Deploy SSH key 均可。

配置完成后,会自动给你生成一个 Webhook 地址,复制这个 Webhook 地址。

配置 Github 上的 WebHook

复制上方的 Webhook 地址,并进入到 Github 你的仓库 – Settings – webhooks 页面,新增一个 Webhook。

粘贴你刚刚复制的 URL,Content Type 选择 application JSON,并在下方选择触发部署的时机。

点击报错。

等待自动部署

接下来你就可以通过提交代码,来让其自动完成部署,从而享受类似于 Vercel 的推送即部署的体验~。

在你的 Github Actions 中添加一个 PostgreSQL 用于测试

在你的 Github Actions 中添加一个 PostgreSQL 用于测试

在开发应用的时候,我们会选择使用 PostgreSQL 作为数据库进行开发,但在 Github Actions 环境下,默认是没有 PostgreSQL 作为数据库后端的,这个时候如果你想要测试一些和数据库相关的逻辑,就不得不面临两个选择:

  1. 使用一个和生产环境无关的数据库,比如 SQLite。
  2. 在 Github Actions 当中添加一个 PostgreSQL。

前者是大多数常规的做法,大概率也不会出现什么问题(毕竟作为 CURD 仔,我们用的大部分时候都是一些 ORM,很少裸写 SQL),不过依然存在一些概率是你写了一些 PostgreSQL Only 的 Query 无法覆盖到测试。

另外就是本文的核心了:在你的 Github Actions 当中添加一个 PostgreSQL

Github Actions Service

想要实现这个效果,我们依赖了 Github Actions Service Containers 这个能力。

服务容器是 Docker 容器,以简便、可携带的方式托管您可能需要在工作流程中测试或操作应用程序的服务。 例如,您的工作流程可能必须运行需要访问数据库和内存缓存的集成测试。

您可以为工作流程中的每个作业配置服务容器。 GitHub 为工作流中配置的每个服务创建一个新的 Docker 容器,并在作业完成后销毁该服务容器。 作业中的步骤可与属于同一作业的所有服务容器通信。 但是,你不能在组合操作中创建和使用服务容器。

GitHub

你可以选择你需要运行测试的环境中,找到对应的 Job,并在 Job 下新增一个 services ,即可为你的 job 设定一个依赖的服务容器,它可能是数据库 、 缓存之类的。比如我这里用的就是 PostgreSQL。

我的 Github Actions 完整参考:

  • services 是我运行的服务容器。
  • steps 是我的真正的测试流程。
name: Django CI

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

env:
DEBUG: true
SECRET_KEY: django-insecure-github-actions
DB_NAME: postgres
DB_USER: postgres
DB_PASSWORD: postgres
DB_HOST: localhost
DB_PORT: 5432

jobs:
build:
runs-on: ubuntu-latest
services:
postgres:
image: postgres
env:
POSTGRES_PASSWORD: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432

strategy:
max-parallel: 4
matrix:
python-version: [3.12]

steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run Tests
run: |
python manage.py test
Thinking in Component Tree

Thinking in Component Tree

在开发前端应用的时候,我比较推荐在真正开始写代码之前试着画一画组件树 / 状态树。

在很多时候,可能你的设计师已经帮你做好了组件树,但在某些场景下,你的设计时并不会帮你拆解组件树,或者是你是直接和产品经理对接,他不会帮你拆解组件树。

这个时候,相比于写代码,我更推荐你先拆解组件树,在完成组件树之后,再开始你的 Coding。

Figma / Sketch 之类的软件提供的分组能力、图层的能力,可以帮助你将组件合理的拆解、分组、归类。当你完成树的建设之后,可以试试看将不同的模块拆解,每个模块是否可以独立正常的运转。如果不可以,则说明你的状态拆解的可能是有问题的。

当你完成拆解之后,只需要按照你拆解出来的树组织你的 Component 即可。

在 WordPress 的 Docker 镜像上加装 Redis 拓展,以支持 Redis 缓存

在 WordPress 的 Docker 镜像上加装 Redis 拓展,以支持 Redis 缓存

从 LAMP 到 Docker based PaaS 工具 当中,我提到我现在使用的是 Docker Based PaaS 产品来托管站点。本站目前其实就是跑在 Docker 上的。

使用默认的 WordPress 镜像时,我发现一个问题:没有支持 Redis 拓展!我使用 Redis 来缓存 Query,提升访问的性能。如果缺失了 Redis 拓展,就会减少一部分缓存的能力。于是开始研究如何在官方的 WordPress 镜像上加入 Redis 拓展。

根据 WordPress 镜像的官方说明,我们可以 docker-php-ext-* 命令来配置镜像,安装必要的拓展,来满足我们日常使用的需求,并给出了官方的参考。

不过,我在验证 Redis 拓展时,使用 docker-php-ext-* 命令没有配置成功,好在可以使用 pecl 来安装。于是,我便将 Dockerfile 修改成如下内容,来完成对于 Redis 拓展的安装。

FROM wordpress:latest
RUN pecl install -o -f redis && rm -rf /tmp/pear && docker-php-ext-enable redis

修改好 Dockerfile ,然后重新启动,一切都好了~

使用 idb-kayval 作为前端数据存储

使用 idb-kayval 作为前端数据存储

在前端留存一些状态,是在前端场景下提升性能的常规操作。最近我有一个场景需要在前端留存一个状态,借着这个机会,试了试 IndexedDB 来作为数据存储,拓展一下新的方向。

关于 Indexed DB

Chrome 在中提供了多种不同的存储,按下 F12 ,打开 DevTools ,找到应用 – 存储,你就会看到目前 Chrome 支持的多种存储方式。常用的主要就是本次存储空间(Local Storage)、会话存储空间(Session Storage)和 Indexed DB。这次我用的便是 Indexed DB。

开发使用建议

由于 Indexed DB 提供的 API 整体比较裸,在实际应用开发时,可能并不好用,你可以根据自己的需要,选择使用不同的第三方开发库来开发你的应用。在这篇文章中,我使用了 idb-keyval 来作为我的开发库。

用法

首先,使用 yarn add idb-keyval 来安装依赖,安装完成后,可以参考如下代码来在你的项目中引入 indexedDB.

import { set,get,keys } from 'idb-keyval';


// 下面演示了一个 get_books 函数,会将内容存储在 IndexedDB 的 your-keys 当中。
// 如果存在缓存,则直接使用缓存,不存在,则进行数据获取
function get_books(){
   // 使用 keys 获取当前 IndexedDB 当中的所有 Key,用于判断当前是否有缓存结果。
   const exists_keys = await keys();
   if(exists_keys.indexOf('your-keys') !== -1){
    console.log("use cached glossary")
    return await get('your-keys');
   }

   // fetch data
   let data = fetch_data();
   
   await set('your-keys',data)
   return data;
}

使用前后的效果

在性能上,使用 Indexed DB 之后,根据你的数据获取的难度,会有不同的性能提升。比如这里我不使用缓存,单次数据获取需要花费 800ms,借助于 Indexed DB,时间可以被控制在 10ms 以内,从而得到一个不错性能。

从 LAMP 到 Docker based PaaS 工具

从 LAMP 到 Docker based PaaS 工具

白宦成简史 当中,我写到过,我从 2013 年就开始写博客,至今已经 11 年有余。而我和互联网、编程的缘分,也从 2013 年开始。

在 2013 年的时候,我主要是使用 WordPress 建站(现在也还在用,比如本站)。所以,从哪个时候开始,我开始接触 LAMP、LNMP 这些个概念,并在过去的若干年里,使用了不少「一键安装包」来部署我的网站。

我用的一键安装包 / 控制面板不算少:LNMP.orgOneInStack(从它还是 LinuxEye 的时候开始用),LAMP.sh等一键配置包,AMHWDCPAppNodeWebminBTVestaCPVirtualmin等等一系列控制面板。

如果说这些工具有什么相同点,那便是都提供了十分方便的 LAMP / LNMP 的配置方式,让彼时不够专业的我、主要是用别人开发好的应用的我能够快速部署一个基于 MySQL + PHP 的应用,让它 Run 起来。

而随着时间的流逝,我已经不再是曾经的我了。我不再局限于使用别人写好的程序,我开始自己写;我不再局限于使用 PHP 来编写程序,我同样会使用 Python、Ruby、Golang 、Node.js 来编写应用程序;所有的这些,都告诉我,我需要在现有的框架和程序上去做很多额外的配置,比如,我需要在 LNMP 的基础之上,配置 NPM,以完成 Node.js 的构建;我需要在系统上配置 Docker ,以便于去运行某些需要复杂配置的环境。

曾经那些可以帮到我的程序已经不再能帮到我了,如今的他们,成了我的累赘。我开始需要为了他们去多做一些事情了。

如今的我,更需要的是一个能够基于 Docker 来运行的管理工具,能够帮助我完成不同环境的配置、管理的能力。我需要的是一个类似于 Heroku 的管理工具,能够让我把更多的精力放在把事做好上。

我试用了

最终,选择了 CapRover ,主要原因有几个:

  1. 支持基础的 Docker 管理功能:这样意味着我其实可以在网页端管理这些资源。
  2. 使用 Nginx ,并集成了 Let’s Encrypt:我的应用都希望有 HTTPs 的能力,所以默认集成了 Let’s Encrypt 可以帮助我解决不少的问题。我也不需要自己去维护一个 Traefik 来解决请求转发的问题(我没有使用 Rancher / Kubesphere 之类的容器管理平台也是这个原因)
  3. 提供了一些一键配置的 Sample:这意味着我把一些我常用的应用迁移过去的时候,可以抄袭一下其官方推荐的配置,可以降低我的使用门槛。
  4. 足够久远:CapRover 作为一个从 2017 年就开始运作的工具,代表着有足够多的 issue 可以供我参考 / 使用,可以减少我踩坑的概率。
  5. 提供了 CLI 来进行部署:对于一个经常需要部署的人来说,提供 CLI / Github Action 可以帮助我快速实现多种不同需求下的部署,帮助我来提升效率。

种种的这些,让我最终从过去的 LNMP,跳船到了 Docker Base PaaS 工具上。

《奔跑吧程序员:从零开始打造产品技术和团队》

《奔跑吧程序员:从零开始打造产品技术和团队》

评价

值得所有工程师来读一遍。

书摘

  • 因为在写代码的时候,结果都是非常确定性的,编译成就是成,不成就是报警。而现实的创业生活中,有太多的灰色地带,你分不清楚对错,这时候就特别需要有人能告诉你,他当时遇到这样的问题,是怎么做的。
  • 创业公司就是在极度不确定的条件下创造新产品或服务的人类组织。
  • 创业公司的目标在于快速增长。一家公司成立的时间短并不能让其本身成为创业公司,创业公司也未必要从事科技领域的工作,未必要接受风险投资基金或有某种“退出”的机制。创业公司唯一必不可少的东西就是增长,其他和创业相关的所有东西都是伴随着增长而来的。
  • 创业公司是一个暂时性的组织,目的在于寻找一种可重复、可扩展的商业模型。根据这一定义,创业公司既可以是一家新的企业,也可以是现有公司中的一个新部门或业务单元。
  • 科技创业公司”是具有下述特征的组织。
  • · 产品:技术。 · 环境:极度不确定。 · 目标:大幅增长。 · 运作模式:探索。
  • 要在科技创业公司中工作,甚至自己创立这样一家公司,我们应该考虑三个主要因素:更多的机会、更多的所有权以及更多的乐趣。
  • 我在大学毕业正决定去哪儿的时候得到了一条建议:你应该把硅谷当作一家大公司,其中有Facebook部门、Google部门和一大堆小型创业部门。有时候部门会发生重组而不再独立存在,但所有的人只要加入其他的团队就可以了。我觉得这是一个非常好的比喻,在这里人们会相当频繁地在不同的公司间流动。
  • 真正的风险并不是因加入了小型创业公司而失业——毕竟我们在大公司工作也没办法保证不失业——而是失去机会的风险。如果选择了在一家公司工作,实际上也就是选择不在其他许多的公司工作。在这个意义上,缺乏工作稳定性也许并不是一件坏事。如果同一份工作已经干了很久,我们很可能正在错失其他一些更好的机会。
  • 大部分的Web创业公司能否成功,几乎都完全取决于执行、有针对性的推广、销售、产品和技术。
  • 那是因为创造力的产生可以归结为三个阶段,这三个阶段都不过是不同形式的重新合成: (1)模仿; (2)转换; (3)合并。
  • 既是通才(在许多有价值的方面高度熟练——T的横),也是专才(在某个特定的学科中属于领域内最出色的——T的竖)。
  • 只有培养了足够的专业技能,才能进入所选学科的前沿领域。在这一不断探索的过程中,你会想出一些创业点子,例如Larry Page在图形理论、文献计量学和Web方面拥有足够的专业技能,从而推动了搜索技术的发展。Reid Hoffman之所以打造了LinkedIn,是因为他作为创业者和投资者,必须要成为建立人际关系网的专家,而在这一过程中,他认识到存在着通过互联网为专业人士建立人际关系网的机会。
  • 要成为一名通才,你必须定期搜寻新点子。有些人天生就对所有东西都有好奇心,会觉得这很容易做到。如果你不是这样的人,也许需要刻意努力跳出自己的舒适区,体验各种各样的文学著作、电影、旅行和活动。有一种实现的途径,就是写出一些“top 5”清单。例如,你可以做一张所有文学体裁的清单(如历史、心理学、科幻小说、数学、计算机科学、生物学,等等),试着阅读每一种体裁中最出名的5本书;或者列出学校所有科目(例如数学、物理、历史、生物、英语,等等),每一门科目都去上五门主题课程,如果没有时间的话,可以阅读这些主题最好的教科书。 这是一种让自己大范围接触新点子的有趣方法。每当我这么做时,都会震惊于人类知识看似不相关的领域竟有这么多重叠的地方。我发现《写作法宝》中的写作建议竟然和《代码大全》中编写整洁代码的建议有那么明显的相似之处。我从心理学图书《思考,快与慢》中学到了产品定价的宝贵知识,这些知识和我阅读所有商业或经济类图书所得到的收获一样多。我甚至发现将我女朋友关于20世纪40年代东欧共产主义崛起的论文研究用在解释当前硅谷的创业发展方式上也能有所洞察。
  • 什么样的环境可以激励人们产生新的点子呢?因人而异,但最常见的要素有这么一些: · 给自己充足的时间; · 记录点子日记; · 解决问题; · 放下工作; · 添加约束; · 寻找痛点; · 与他人交谈。
  • 要养成习惯,每天至少花20分钟做一些可以自我放松的事情,倾听自己的想法。可以是走路、洗个时间长点的澡、冥想、在吊床上躺一会儿、写写日记、画画、雕刻、做做木工或者放放音乐。不管怎么样,把点子日记放在边上,随时准备记下笔记。
  • 重要的是把问题写下来,即便你还不知道要如何解决。如果你一次次地看到问题出现,也许出现的场合略有差异,但每一次都可以简单地把想法记下来,然后你对这个问题的理解就会慢慢加深。
  • 学会鉴别和解决特别难解决的问题是一种宝贵的技能。Paul Graham在他的一篇文章中说道:“我们的周围存在着各种难办之事(schlep)”。“
  • Howard H. Aiken说过:“别担心人们偷走你的点子,如果你觉得自己的点子非常棒,还得让人们接受才行。”如果你不相信,不妨去http://www.hello-startup.net/resources/startup-ideas看看,了解一下别人的创业点子,看看有多少是你想“偷”去做成公司的。
  • 实际上,真正吸引竞争者的并不是点子,而是点子受到广泛关注。只有在你发布了产品,并且已经开始显露峥嵘的时候,别人才会想着去抄袭你,所以不用担心在早期讨论你的点子。另外,如果你担心有人偷听你的点子而想把它偷走并打败你,这样的点子很可能没有防御性,无法实施。虽然这里用了防御性这个词,但我想表达的是,一个出色的商业点子应该具备某种差异性,可以让你和竞争对手之间产生巨大的差距(阅读3.2.2节了解更多信息)。
  • 仅仅有点子还成不了业务,理解这一点同样重要。业务是由点子和执行力构成的。也许有人可以偷走你的点子,但偷走你的执行力就要困难得多。我们来更深入地看看点子和执行力之间的关系。
  • 这就是TripAdvisor的准则,Kaufer在那天午餐的时候解释了这个准则,后来也多次在公司的全体大会上做过解释。创业成功,无论在哪个层面上,归根到底都取决于速度。你必须更快地实现产品、更快地编写代码、更快地招聘,最重要的是,必须更快地学习。
  • 我喜欢用速度制胜这个词,因为它又短又好记,但是用频率制胜可能更为精确。这并不是说要像变魔术一样只用一半的时间去完成相同的工作量,而是说要安排好工作,尽快得到反馈。这是因为反馈回路短的系统通常总是胜过回路长的系统。
  • 在空战中,双方飞行员通常都是按照所谓的OOPA(observe, orient, plan, act,即观察、确定方向、制订计划、行动)的顺序进行操作,而液压助力能够让它的飞行员以稍微快一小点的速度完成OOPA的过程。
  • 博伊德确定赢得空战的主要决定因素并不是更好的OOPA,而是更快的OOPA。博伊德提出,迭代的速度会打败迭代的质量。 ——Roger Session
  • 对某些产品而言,即便最小的尝试方法也需要有相当优美的体验;对于其他一些产品,只要有骨架就足够了。某些情况下,你根本不需要实现产品,3.2节谈论这个问题。一般的规则是要遵循“完成比完美更好”原则。否则,就像Reid Hoffman所说的:“如果你第一次发布的时候没有感到尴尬,就是产品推出的时间太晚了。”即便如此,有少数领域并不是依靠速度制胜的。
  • 如何找到客户并与之对话呢?可以分解为以下三个连续的阶段。 第一步:验证问题 确保找出客户实际面临并且痛苦到愿意掏腰包去解决的问题。 第二步:验证MVP 实现潜在解决方案的最简可行产品(minimum viable product,MVP),让少量客户购买该产品进行验证。 第三步:验证产品 把MVP完善为完整的产品,让更多客户去购买,对可扩大化的商业模式进行验证。
  • 在思考问题的大小时,有三个方面需要考虑:频率、密度和痛苦程度。 · 频率:你所解决的问题经常发生吗? · 密度:有很多人都会面临这个问题吗? · 痛苦程度:该问题只是让人讨厌,还是绝对必须解决?
  • 考虑市场规模有一个好方法,就是考虑建立一家赚得10亿美元收入的公司的几种方法。 · 以1美元的价格销售10亿件产品:可口可乐(罐装汽水); · 以10美元的价格销售1亿件产品:强生(家用产品); · 以100美元的价格销售1000万件产品:暴雪(《魔兽争霸》); · 以1000美元的价格销售100万件产品:联想(笔记本电脑); · 以1万美元的价格销售10万件产品:丰田(汽车); · 以10万美元的价格销售1万件产品:Oracle(企业级软件); · 以100万美元的价格销售1000件产品:Countrywide(高端金融抵押公司)。 ——Balaji S. Srinivasan,斯坦福创业项目工程课程
  • 下面,我会列出评估市场规模的几种方法。 广告 许多广告公司都会提供一些广告目标分析工具,我们可以在不需要购买任何广告的情况下对市场进行研究(虽然购买广告是测试MVP的好方法,3.2节将详细讨论)。例如,我们可以用Google的AdWords Keyword Planner研究每个月有多少人搜索某些特定术语。我在对hello-startup.net做研究的时候,查阅了大概50组相关关键字(例如“创业点子”“代码评审工具”“净值计算器”),发现平均每月每个关键字都有超过1200万次的搜索。这给了我信心,“如何创业”确实是一个真正的问题。而其中的资源页面也可以帮助我雕琢语言,例如我发现人们也经常使用“商业点子”来代替“创业点子”。我还使用过其他几家公司的广告工具,发现Facebook上大约有1600万人对创业感兴趣,Twitter上有200万人对创业感兴趣,LinkedIn上则有1300万人把他们所在的行业列为创业领域。 竞争 如果已经有公司在解决你发现的问题,其实未必是坏事。甚至可以说,“你的想法并不唯一”才说明你发现了真正的问题。要寻找你都有哪些竞争者,可以使用前面介绍的广告工具,找到合适的关键词,试着在Google和一些移动应用商店中搜一搜(应该不难找到,否则他们的客户也就无法找到他们了,如果真的找不到的话你也就不用担心竞争了)。如要想了解某个特定的竞争者正在做什么,你可以试试用网站分析工具(例如comScore、Quantcast)和移动分析工具(例如App Annie、Xyo)去估算他们的流量。你也可以使用CruchBase或AngelList这样的网站,看看竞争者获得了多少投资以及背后是哪些投资者。
  • 社区 验证问题还有另一种好方法,就是看看社区中是不是已经有人在讨论这些问题了。你可以在聚会、会议、用户组和在线论坛等网站上搜索,估算一下这个问题影响了多少人。例如,在研究hello-startup.net的时候,我在meetup网站上看到有15 000个创业小组(400万成员)、3000个科技创业小组(100万成员)和2200个精益创业小组(650 000成员)。在lanyrd网站上,我发现有119个创业会议,并向其中的几个会议提交了申请,得以和这些社区中的人进行实际的交流。我也在subreddit上寻找有关创业的内容(大概涉及74 000名会员),在LinkedIn上寻找创业和创业者小组(大概涉及150 000名会员),在Quora上查找有关创业的主题(大概涉及800 000名关注者)。当然,我也在Hacker News上搜索(每天至少有120 000名独立用户阅读了有关创业的内容)。
  • 市场研究和报告 某些传统的研究方法也是值得尝试的。我们可以试着在网上搜索探讨你所关注主题的报纸、图书、期刊、课程、广播和博客。如果有必要,你也可以查阅美国证券交易委员会的备案文件或政府报告(例如查阅美国小企业管理局的相关报告)。我在研究hello-startup.net的时候,发现了数以百计的博客都在关注创业(例如Paul Graham的随笔、TechCrunch和OnStartups),还有几十本书(例如《创业者》《精益创业》和《创业者手册》)以及好几门课程
  • 例如斯坦福的“How to Start a Startup”以及Coursera的“Startup Engineering”)。 目前也有一些公司专门针对特定的行业收集相关数据并发布报告。其中有些数据是免费的,比如世界银行数据。另外,也可以花钱请Nielsen Media Research这样的公司为你进行市场研究,或者找AYTM那样的公司代表你向目标客户发送调查问卷。 产品数据 如果产品已经面世,我们可以收集到许多数据并进行分析,对产品新特性的影响进行评估。这方面内容将在第4章详细介绍。
  • 我们和客户交谈,目的是要尽可能地了解他们的日常生活,对下列问题做个决定。 · 对该客户而言,那是一个真正的问题吗? · 针对该问题,有什么可能的解决方案? · 该客户愿意支付多少钱去解决这个问题? 要回答这些问题,我们需要走出去和真正的客户交谈。但这样也有一个问题:直接询问客户需要什么,得到的答案一般都不太让人满意。有些客户根本就不知道他们自己想要什么。
  • 是否能够解决一个问题存在两个因素。 · 问题可以被解决。 · 问题可以被你解决。 第一个问题和市场实际情况有关。我们既要考虑前面所提到的市场规模、问题验证,也要核实解决该问题的技术是否已经存在,还要看解决方案从经济上是否足以建立起可盈利的商业模式。红杉资本是当今世上最成功的风险投资公司之一,它的合伙人会询问创始人们一个问题:“为什么是现在?”世界发生了什么变化,使得现在成为建立这家公司的最佳时间?你知道什么其他人所不知道的?为什么没有人在两年前建立这样的公司?为什么两年以后再建立这样的公司就太迟了?
  • 对于点子来说也是类似的:没有能预测哪些知识可以让你产生有用的点子,哪些知识不能的方法。最好的做法就是尽可能多学习一些东西,特别是你觉得有意思的主题。换句话说,“获得创业点子的方法就是不要去想创业点子”,而是把自己变成一个有创业点子的人。找到吸引你的主题,花大量的时间去思索,在点子日记上写下自己的想法并与他人分享。学会利用约束条件,寻找痛点,多出去走走,为你的潜意识提供大量时间处理所学到的东西。最终,便会萌发点子。 在此阶段,点子仍然是不成熟的。所以要注意,不要因为太快对这个点子下结论而扼杀了它,就像你无法预料哪些数学上的概念是重要的,你也同样无法预测哪些点子在未来会有更大的发展。回到1997年,Larry Page也不知道Google会是多么大的一个点子,那时他还想把公司以160万美元卖给Excite(今天Google的价值大约是4000亿美元)。我在这本书中采访的每一个程序员,都没有想过他们的创业公司会发展得那么大。Jessica Livingston在《创业者》一书中采访过的所有创始人都是如此,包括Max Levchin(Paypal)、Caterina Fake(Flickr)、Craig Newmark(Craigstlist)和Steve Wozniak(Apple)。
  • 在顾客看来,界面就是产品。 ——Jeff Raskin,《人本界面》
  • 从根本上说,设计就是如何去呈现信息,让他人可以理解并使用这些信息。人生中的许多次成功其实都取决于我们能够在多大程度上良好地交流,如果在大多数人的教育中加入一点设计方面的训练,结果将大为不同。
  • 其中有三个原则可以应用到设计中。 · 设计是一种可以学会的技能。 · 我们必须训练自己的眼睛有意识地识别出为什么有些设计能发挥作用,有些则不行。 · 设计的目的是把一些东西传递给用户。
  • 第三点,即设计的目标是为了与用户沟通,这意味着虽然“看起来漂亮”是设计的一个很有价值的因素,但是更为重要
  • 所有计算机用户的第一目标就是不要让自己觉得自己愚蠢。 ——Alan Cooper,The Inmates Are Running The Asylum
  • 解决的办法就是要认识到我们不能在工程或产品完工之后,才把“设计”加上去。设计就是产品,从产品开发的第一天起,它就应该是其中的一部分。以用户为中心的设计应该纳入我们的产品开发过程中,下面是它的五个基本原则: · 用户故事; · 人物角色; · 情感设计; · 简单; · 可用性测试。
  • 1. 用户故事 提前考虑设计并不意味着需要做出一份300页的详细规格说明书,而是在一心投入代码开发之前,先定义出用户故事。所谓用户故事,就是从用户的角度简短地描述你所做的东西。它应该回答下面三个问题。 · 用户是谁? · 他们要实现什么? · 他们为什么需要? 第一个问题“用户是谁”要求你要理解人,这可是出奇困难的事。
  • 作为程序员,当你在设计软件的时候,你的大脑其实一直都在“听着歌曲”。然而,你的用户却什么都没有听到,他们必须通过你所设计的用户界面(user interface,UI)去使用软件。你不能期待用户知道你所知道的,你也不能指望用户通过文档或教程来填补这一鸿沟。(正如Steve Krug所说的:“关于说明书你必须知道的最主要的一件事就是,没有人想读说明书。”)所以,想要做出成功产品的唯一选择就是做出出色的设计。
  • 最常见的设计错误就是把用户的目标(他们要实现的是什么)和任务(他们可以如何实现)混淆了。
  • 这里有另一种可以显著提升设计技能的快捷方法:不要再为“平均的人”设计产品。人平均下来就是不洋不土、不男不女,如果你为平均的每个人做设计,那么谁都不会喜欢你设计出的东西。 真正的平均用户被保存在日内瓦国际标准局的密不透气的地下室中。 ——Steve Krug,《点石成金》
  • 每个人都应该有名字、年龄、简历、工作经历和相关技能、信仰和目标,以及其他一些与你的业务相关的细节。为了让虚拟角色看起来更像真人,可以为每个角色添加一张照片(最好是在图片网站上找来的照片,而不是生活中某个熟人的照片)。为产品定义好人物角色之后,无论在用户故事中,还是在谈话中,都不用再去关注“平均用户”了。团队不用再去争论“平均用户”是更喜欢X功能还是Y功能,因为每个人对于什么是“平均”都会有不同的理解。相反,我们只需要讨论我们的人物角色是喜欢X还是Y就可以了。例如,hello-startup的“平均用户”想要一个计算程序来帮助自己对股票期权进行估值吗?这我也不知道。但麦克、莫妮卡或马赫什需要这样一个计算程序吗?我可以有根据地推测麦克和马赫什会觉得这样的工具是有用的。
  • 你关注的目标越广泛,错失靶心的必然性就越大。想让大量人口中50%的人满意你的产品,从而实现50%产品满意度的目标,这种做法是行不通的。我们只能挑选出50%的人,想方设法让他们100%满意,才能实现我们的目标。我们甚至可以瞄准市场中10%的人,让他们100%地心醉神迷,从而取得更大的成功。这听起来可能有点违背我们的直观感觉,但为单个用户进行设计是满足广大人群需求最有效的方式。 ——Alan Cooper,The Inmates Are Running The Asylum
  • 只要有可能,我们就应该把软件设计得像把你记在心上、考虑周到的人一样。要记住用户的参数设置,记住他们上次使用你的软件做了什么事情,记住他们过去搜索了什么东西,要尝试使用这些信息预测用户在以后会做什么事情。例如,大多数网页浏览器都会记住你过去输入的网址。Google的Chrome浏览器甚至更进一步,只要你一输入www.goo,它不仅会替你把网址补充为Google首页,而且如果该网址是你之前已经多次输入的,它还会在你点击回车之前就开始抓取网页,让网页加载得更快。Google对于密码的考虑也很周到,如果你最近修改过密码,而不小心还用老密码去登录,Google会提醒说“你的密码已经在12天前修改过”,而不是给你标准的“密码无效”的错误消息。
  • 要积极响应 好的设计会响应用户的需求。例如,Apple的笔记本电脑会检测房间中的光线强度,自动调整屏幕亮度和键盘背光。
  • “对错误的发生要宽容”这一点真的太重要了,我们不妨再多讨论一番。
  • 以下是一些经验法则,可以避免这种错误的发生。 · 提供帮助和指引,而不是错误消息。例如避免使用“错误”“失败”“问题”“无效”和“异常”这样的词,而是向用户解释程序希望获得的输入与用户的输入之间有什么差异。 · 在用户输入的同时进行检查(而不是在页面提交之后再进行),并分别给出肯定和否定两种反馈,给出的反馈应该在用户视线附近(而不是页面的顶部)。 · 永远不要把用户做好的东西弄丢。
  • 这种说法乍一看似乎很拗口。我们通常认为“简单”就是精简而没有多余的东西。如果从空白状态开始,只是随处添加几样东西,不就可以得到简单的设计吗?如果你写过文章或者复杂的代码,或者尝试设计过产品,就知道一开始的草稿往往都过于杂乱。我们要花大量的工作才能把这种杂乱削减成为简单的东西。
  • 简单其实就是一件我必须完成的事。我的产品必须完成的一件事是什么?我的设计必须向用户传达的一件事是什么?定期问问自己这几个问题,得到答案后亦可再次发问。我所设计的产品是否做了这样一件事?抑或我迷失在了细节的实现当中,产品最终做的是其他的事情。
  • 设计需要简单并不是因为简单更优美,而是因为人的记忆在同一时间只能处理少数几件事。如果设计中塞入太多东西,很快就会超出人的记忆局限,用户会觉得产品功能过多而无法使用。
  • 不要把可用性测试与焦点小组(focus groups)混为一谈。焦点小组的目标是了解人们如何看待某个点子或某种产品,而可用性测试的目标则是了解人们如何使用你的实际产品去完成特定的任务。虽然有一些公司可以帮助你开展正式的可用性研究,但一般都昂贵且费时,大多数创业公司都可以用更简单的方法去实现。下面列出了大概的步骤(读者可阅读《点石成金》一书了解更完整的介绍)。 (1)把少数用户(3~5个)带到你的办公室。 (2)准备好录像设备(例如安装在三脚架上的iPhone)。 (3)记录下用户使用你的产品执行一系列任务的过程。 (4)让团队成员观看录像。 (5)根据你们认识到的情况决定采取什么行动。 (6)每3~4周重复一次。 如果之前从未进行过可用性测试,你很快就知道第一次观察公司以外的人使用你的产品会是一种发人深省的体验。
  • 伟大的界面是写出来的。如果你认为每一个像素、每一个图标和每一种字体都很重要,那么你也要相信,每一个字母都很重要。
  • 你的大标题必须能够和目标人群的角色产生共鸣,不仅告诉他们你要做什么(“我们的软件可以实现XXX”),还要告诉用户为什么应该关注它(“我们的软件可以实现XXX,所以你可以成功地YYY”)。知道如何提炼出清晰的信息去介绍你的动因、你的使命,是各种事情成功的关键因素之一(
  • 如果你不想立马跳到代码中,可以先使用线框图或原型工具,比如Balsamiq、UXPin或者Justinmind。利用这样的工具,可以从UI元素库拖拽出一些元素进行摆放,组合成一份设计。
  • 创业时面临的第一个设计上的挑战,就是要实现产品最初的版本。即便你已经想出了出色的点子,也对真实的客户进行了验证,你也要耐住性子,把自己锁在房间里,花上一年时间去设计,才可能做出完美的产品。但是请记住,产品并不仅仅是一个点子,而是新的问题、新的想法和执行的不断循环。执行是昂贵的,所以你需要尽可能低成本、快速地向客户验证你遇到的每一个新问题和想法。最好的方法就是实现所谓的最简可行产品(minimum viable product),或者叫MVP。
  • MVP是“新产品的某一个版本,团队可以利用它以最小的付出去最大程度上、验证性地了解客户”。MVP的关键就是从中学习,其目的就是找到成本最低的方式去验证对真实客户的假设。
  • MVP的实现并不是一次性的行为。对某种东西而言,在找到可行的产品方案之前,极有可能需要实现多个MVP。但更为重要的是,MVP的构建不仅仅是在产品生命周期的早期所要做的一件事,它更多的是一种思考方式。不妨把它想成在玩纸牌游戏,每次都下一小点赌注,而不是一次就把房子全压上。不论你是在试验从未有人用过的新产品的点子,还是为已有大量用户的产品添加新的功能,都应该有使用MVP的习惯,我们可以把MVP的实现归纳为以下几点: (1)找出风险最大、最重要的设想; (2)把这种设想以一种可测试的假设描述出来; (3)构建一个最小的实验(一个MVP)去测试你的假设; (4)分析结果; (5)用新发现去重复第一个步骤。 不管对一个点子有多么自信,一定要努力找到最小、成本最低的测试方法,而且要随时保持项目规模小、可改进。Standish集团通过对50 000多个IT项目进行研究,发现有3/4的小项目(少于100万美元)可以成功地完成,只有1/10的大项目(大于1000万美元)能够按时且在预算内完成,而超过1/3的大项目是彻底失败的。
  • 不管对一个点子有多么自信,一定要努力找到最小、成本最低的测试方法,而且要随时保持项目规模小、可改进。Standish集团通过对50 000多个IT项目进行研究,发现有3/4的小项目(少于100万美元)可以成功地完成,只有1/10的大项目(大于1000万美元)能够按时且在预算内完成,而超过1/3的大项目是彻底失败的。
  • 展示页面 有一种比较容易实现、成本低、效果又出众的MVP,那就是做个简单网页,描述产品情况并在用户感兴趣的时候让他们提交某些信息,比如让用户提供email地址以便获得更多信息,或者让用户进行预订。总的思路就是向用户描述产品最理想的景象,看看它对用户有多大吸引力,哪怕产品尚不存在。如果你以最理想化的方式向用户描述了你的点子都无法说服一小部分人在你的邮件列表上注册,也许就需要再重新想想。例如,社交媒体管理应用Buffer开始时就用一个页面展示了有关产品的理念和价格细节,并提供了注册邮件获取更多信息的功能,如图3-36所示。他们获得了足够多的注册量,更重要的是,他们在价格选项上也获得了足够点击,令他们足以信心满满地去实现真正的产品。
  • 在Drew Houston开始构建DropBox之前,他想确认自己不会花多年心血却做出无人问津的产品。但即便实现一个用户可以在自己电脑上试用的简单原型,也要花很长的时间,因为想要存储所有的数据,就需要搭建起一个可靠的、高性能的在线服务系统。Houston选择的替代方法是建构一个简单得多的MVP:一个具有注册表单,还带有4分钟讲解视频的展示页面,如图3-37所示。
  • 无论最终要实现哪种类型的MVP,关键是确保自己实现的是简化但仍然可用的东西,而最好的方法就是关注自己产品的差异性。
  • 同样的道理也可以用在制作MVP上。对你的产品而言,什么是重要的问题?你在MVP中实际实现的又是什么?为什么会不一致?产品最重要的一点就是差异性:让产品和其他替代品区分开来的特性。人们通常把差异性称为“竞争优势”,但这个词听起来就像其他优势一样,不管超过多少,只要具备就足够了。
  • 因此,很重要的一点就是要问自己:我的产品有哪两三个地方是做得特别出色的?只要你找出了这样几个核心特性,就可以以此做出你的MVP,先忽略其他东西。
  • 让客户爱上你的产品,而不只是喜欢它,这是一个巨大的优势。让一个已经有少量用户爱上的产品变得有更多的用户爱上,比起让大量的用户从喜欢一个产品变成爱上一个产品,前者要容易得多。让一个用户从“喜欢”到“爱”,你要让他们大为心动才行。你需要让他们能大叫一声由衷地赞叹,想想最后一次有东西让你发出赞叹的感觉,很可能是有人超出你的预期,让你高兴不已,也可能是一些超乎寻常的东西。因为做出不同一般的东西本身就要花大量的时间,所以,如果你想让用户能够爱上你,比起让许多事情都差强人意,你应该让少数事情无与伦比。
  • 那么,我们怎么知道要把关注点放在哪些特性上呢?有一种方法,就是在做出产品之前,先写一篇宣布产品发布的博客,看看文章中有哪两到三个关键特性是你会重点宣传的,你会在插图中展示哪些特性,博客的标题会是什么。好的博客文章都是简短的,所以这样的训练可以帮助我们梳理出哪些特性真正能让产品充满诱惑力。这样的特性就是MVP必不可少的,其余的一切都是可选的。事实上,其余的一切不仅仅是可选的,大多数时候,甚至对产品是有害的。每一个额外的特性都会带来显著的成本(阅读3.1.2节了解更多信息),所以,除非该特性对取悦客户或者验证假设是绝对不可或缺的,否则就不应该放到MVP中。
  • 我们要对MVP确定一个目标,即便在很早的阶段,也要让客户购买你的解决方案。注意,这里强调了“购买”一词。许多人会告诉你他们“喜欢”一个点子,甚至也许想得到它。但是,喜欢某种东西和承诺会购买某种东西是大不相同的。购买一种新产品不仅仅要花费金钱,还要花费时间——他需要花时间去说服家人(如果是消费产品的话)或者同事(如果是企业产品的话),让他们相信产品是值得的;而且,还要花时间去安装和部署,花时间培训自己和别人去使用它,将来还得花时间去维护和更新。即便你的产品对某些用户是免费的(例如靠广告支持的网站或者免费增值服务),他还是要付出自己的时间,而时间因素也会让他们考虑一番。所以,不管你考虑采用什么样的定价策略,目标就是要让客户牢牢承诺会购买你的产品。
  • 也许影响创始人意识到能够在多大程度上关心用户的最大障碍,就是他们自己从来没有体验过这样的关心。他们对待客户服务的标准是依据他们自己作为客户的那些公司的标准来设定的,而那些通常都是些大公司。蒂姆·库克不会在你买了笔记本电脑之后给你寄一张手写的卡片——他做不到,但你可以。这就是小公司的好处:你可以提供大公司实现不了的服务。
  • 当你还是一家小型创业公司,仍然还在验证自己的点子时,做一些无法规模化的事情去获得早期的客户是你可以承担的方式。如果点子可行,后续可以通过自动化的方式,让这一过程变得更具扩展性;但如果点子不可行(大多数点子都是这样的结果),那么你也节省了大量的时间,因为你不需要为了错误的事情而做一大堆自动化工作。另外,这种方式可以让你直接接触业务的烦琐细节,你会成为领域的专家,而这一点在前面已经说过,它对于想出伟大的点子是至关重要的。
  • 另外,这种方式可以让你直接接触业务的烦琐细节,你会成为领域的专家,而这一点在前面已经说过,它对于想出伟大的点子是至关重要的。
  • 设计是一项重要的技能,因为用户界面就是产品。好在设计过程是迭代的:任何设计都可以递增式地改进,任何人也都可以递增式地提高自己的设计技能。而最好的做法就是去重用现有的设计、编写用户故事并为人物角色而设计。
  • 只要你手中拿着的是一件精雕细琢的产品,你就要记住,其实我们看到的是无数次试验和错误的迭代之后形成的结果。这其中包含了许多失误、原地打转、重新设计和妥协折中。这一路上,制造它的公司可能要为生存而苦苦挣扎,希望能够在倒闭之前找对路子。
  • 这就是创业公司总是处于“搜索模式”的含义所在。这是一场和时间的疯狂比赛,你要尽快找到值得解决的问题,找到值得实现的方案。而实现这一切的最佳方式并不是寄希望于尤里卡时刻,而是要利用迭代、试验的方法去实现。
  • 产品经理的工作就是要把两件简单的事情说清楚: · 我们正在进行什么比赛? · 我们怎么得分? 把这两件事情做对,就可以不经意间聚集一批在技术、运维、质量、设计和市场推广上具备天赋的杰出人才,在同一个方向上聚力前行。没有这两点,无论做多少优化和执行管理,都拯救不了你。
  • 并不是所有东西都可以测量,或者都应该被测量。对于每一种数据X,我们要问自己两个问题。 (1)如果我可以测量X,它至少会影响一个具体的决定吗? (2)该决定的价值超过测量X的成本吗? 如果这两个问题都无法回答“是的”,那么就不值得去测量X。话虽这么说,大部分人并不清楚能够以最小成本、付出最少努力去测量什么东西。《数据化决策》一书介绍了如何对各种各样的概念进行量化,包括一些看似模糊和不可测量的概念,比如产品质量、品牌认知、安全以及风险。
  • Andrew Chen在Quora上发表了一篇关于如何找出公司神奇数字的优秀教程,其中的第一步就是找出衡量公司成功的指标是什么。当成功指标增长的时候,你的业务也会取得成功;当指标下降的时候,你的业务会随之失败。这个指标对于每个公司而言有很大差别,但应该是相当明显的。比如Facebook和Twitter的大部分收益来自于广告,所以它们的成功指标和用户参与度结合得非常紧密(例如用户在过去28天的周期内会回到网站多少次);Slack是一个订购产品,所以它的成功可能和有百分之多少的用户会成为付费用户有紧密关系;Etsy是一家电商公司,所以它的成功指标可能和网站的交易数有紧密关系。
  • 一旦找到衡量成功的指标,第二个步骤就是判断用户的哪些行为与成功指标的增长是有关联的。抓取一部分有代表性的用户,把他们的全部数据(例如获取指标、激活指标等)放入一张巨大的表格中。如果幸运的话,把用户的活动指标和公司的成功指标放在一起绘制出图表之后,会发现它们之间有非常明显的相关性。例如,如果把Twitter用户的关注人数和他们连续登录的天数放在一起对比做图,可以得到图4-1所示的图表,临界点大概就在y轴的30~40。有时的结果并不会很明显,这就需要进行回归分析,找到理想的相关性。
  • 许多人,特别是专家,都相信自己只需要深入思考,就可以解决几乎所有问题。他们可以在纸上画出周密的产品点子、聪明的工程设计又或者是精美的图表和等式,然后等待成功的到来。只可惜,在大多数情况下,成功永远不会到来。那是因为我们所生活的世界无比复杂,通常我们面对的系统已经超出了任何个体的理解能力,比如自由市场经济、人的思想或者分布式计算机系统,影响这些系统的问题太过复杂,从单一原因入手无法得到解决。
  • 我们需要的是进化,而不是聪明的设计。这意味着不要有上帝情结,要承认自己并不知道正确答案是什么。
  • 应用迭代的方法论,而不是一开始就投入精力把整个产品做出来。 (1)做一个MVP。 (2)对其进行A/B测试。 (3)分析结果并做出下面三个决定中的一个。 a. 改善:测试得出的数字不错,足以证明我们能够进一步完善MVP,回到步骤1。 b. 发布:测试得出的数字非常好,并且产品已经完成,可以向所有人发布。 c. 放弃:测试得出的数字并不好,不足以证明应该继续工作,可以转到下一个点子上。
  • “开发设计的时候要坚定你在做正确的事,阅读数据的时候要提醒自己可能会出错。”
  • 如果我们生活在一个可以获得完美信息的世界里,那么最好的产品总能胜出,但我们生活的世界并非如此。
  • 我们以前讨论过,在公司成立的早期,做一些无法规模化的事情是最好不过的。让每个人都参与到客户服务中,对公司的扩大发展确有惊人的作用,因为这么做不仅可以让忠诚的客户传播你的产品,还可以让这些写代码的人也感受到使用产品的客户的痛苦,帮助你做出更好的产品。
  • 要计算病毒系数(K),需要用每N天的用户发送邀请数(I)去乘以这些邀请的平均转化率(C)。对于I而言,就是当前一个用户执行了多少次才吸引来新用户的某个动作,这种动作就好比在社交网络上发送一个邀请;对于C而言,就是邀请被接受的百分比是多少。 K=IxC 例如,假设你今天发布产品,有1000个人注册,通过查看指标发现,这1000个用户在注册后不久即发送了5000个邀请,或者平均下来每个用户会邀请5个新用户,即I=5。这些邀请在最开始的几天会获得许多点击,在大概一周左右就会降到0,所以你的循环时间就是N=7天。
  • 尽管调查和促销代码都不像在线跟踪一样精确,但我们的目标并不是为了得到完美的数据,仅仅是降低一些不确定性,只要能够测量出用户的来源以及是什么样的用户就行了。因为我们不仅仅要确定广告已经到达了受众,还要确定它到达的是不是正确的受众,这一点在电视和广告牌这样的广播式媒介上,通常需要一定的技巧去处理。
  • 集客式营销背后的关键理念就是不要尝试把东西卖给客户,而是尝试去教育他们。 教导客户,就可以和客户建立起传统市场营销策略所无法获得的纽带。通过杂志或网上横幅广告去购买人们的关注力是一方面,如果教育他们,赢得他们的忠诚,建立起完全不同的关系,他们就会更加信任你、更加尊重你。即便他们不用你的产品,仍然会成为你的粉丝。
  • 我之前提过,并不是最出色的产品胜出,而是客户认为最出色的产品胜出。客户如何看待你的公司——如果他们想到的是你的品牌,那么尝试对这种感知进行影响的行为就称为品牌化。
  • 只用了“think different”两个词,就能够让你准确地知道Apple是做什么的,以及你为什么应该关注它。精心制作出这样一条清晰、引人注目的广告词并不容易,但正所谓文案是产品设计最重要的因素(阅读3.1.3节了解更多信息),广告词也是市场推广的核心。产品的宣传口号就是一个很好的例子,它必须能够一下子抓住人们的注意力,让别人知道你的产品有什么不同,而且必须简洁明了。例如,我们看看最初iPod的口号。
  • Y Combinator的座右铭就是“做人们想要的东西”(make something people want)。这四个简单的单词可以表达出创立成功的创业公司必须了解的几乎一切。
  • 技术栈就是工具,它是实现产品的手段,不是产品的终结,也不是产品本身。不要因为某项技术听起来很酷或者很有趣就选择它,我们选择一种技术是因为它可以为我们所用。为此,应该在把选择技术栈的黄金法则记在心中。
  • 好的技术栈的扩展要快于需要进行的维护。
  • 我们先从需要在很早就做出的一个决定开始:如何为创业公司选择初始的技术栈?我可以只用一句话来回答:熟悉什么就用什么。
  • 当你违背了技术栈的黄金法则——当你发现人数的扩展快于技术的扩展——就是时候重新进行评估了。
  • 暂停所有的发展、在全新的技术栈上重写代码要冒巨大的风险。这种情况被称作“所有软件公司都可能犯的单一的、最糟糕的战略性错误”和“创业自杀”。如果你抛开旧代码,就等于抛开了多年的学习和修复的bug。
  • 一个残忍的事实是:当你的关键业务过程运行在内部情况不清楚(更别提修改)的不透明代码上时,你就失去了对业务的控制。你对供应商的需要超过了供应商对你的需要——因为这一巨大的不平衡,你只能付钱、付钱、再付钱。
  • 任何库复杂到一定的程度之后,都会包含一个临时的、不合规范的、充满程序错误的、运行速度很慢的、只有一半功能的全栈Web框架,这是向格林斯潘的编程第十定律致敬。该定律告诉我们,任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、不合规范的、充满程序错误的、运行速度很慢的、只有一半功能的Common Lisp实现。
  • 如果你正在使用Web框架去实现对业务至关重要的东西——不仅仅只是原型,最好的选择通常就是模块化的全栈框架。那样的话,你可以获得两个方面的好处:一是得到了一个文档完善、有社区支持的开源框架,默认功能就可以出色地处理用户的大部分需求;二是对于小部分特定的情况,也可以通过插入定制库的方法去满足要求。
  • Web框架很少成为应用程序可扩展性方面的瓶颈(阅读第7章了解更多信息)。所以通常来说,我们最好选择开发效率比较高,而不是处理请求比较快的框架。也就是说,如果你担心性能问题,就需要弄清楚你的应用程序是否有I/O或CPU、内存方面的限制。
  • 安全的实现是非常困难的。它是5.3.4节所列清单中的一项。
  • 我们应该使用内置了安全特性、开源且经过实际检验的框架。因为这不可能是后期再加入的功能,所以框架必须是默认安全的,使我们做不安全的事情也变得困难或不可能。我们要花时间去熟悉常见的Web安全实践方法——开源的Web应用安全项目(Open Web Application Security Project,OWASP)就是一个很好的开始。
  • 我们要花时间去熟悉常见的Web安全实践方法——开源的Web应用安全项目(Open Web Application Security Project,OWASP)就是一个很好的开始。
  • 即便是一个简单的类,从关系型数据库映射到内存中的表示也是很复杂的,这就是所谓的阻抗失配。许多对象关系映射(Object Relational Mapping,ORM)工具都是为了尝试解决这一问题而诞生的,比如ActiveRecord和Hibernate,但通常都会引起争论——有人责备这些工具会暴露抽象泄露(leaky abstractions)问题,还会引发一些性能问题。这并非个别ORM工具存在的问题,而是由于映射本身就是一个难题。所有你能想出的解决方案都会包含一些严重、痛苦的取舍。
  • 一个分布式系统不可能同时满足以下三点: · 一致性(所有节点能够同时访问同一份数据); · 可用性(保证每一个请求都会接收到成功或失败的响应); · 分区容忍性(系统一部分出现任意信息丢失或故障时,系统仍能继续工作)。 在一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)中,只能择其二。
  • 在一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)中,只能择其二。
  • 如果使用关系型数据库遇到了障碍,极有可能是因为我们的数据量和可用性方面的需求已经超出了单台服务器的能力范围。此时,我们要优先考虑找出可以扩展的最简单的解决方案。按照复杂程度,以下列出了最常见的一些选择: · 对数据存储格式和现有数据库的查询进行优化; · 在数据库之前设置缓存(例如内存缓存); · 建立主-从复制; · 对无关联的表进行垂直分区; · 对单张表进行水平分区; · 建立多主复制。 一般而言,我们要尽可能避免对数据进行分区,并坚持使用单点写入。
  • 所谓整洁的代码,是指代码专为人的理解而优化。记住,创业和人是密不可分的,所以对代码来说,最重要的并不是运行得多快或者使用什么样的算法,而是它对使用它的人有什么样的影响。编写整洁的代码并不是为了理想主义,也不是因为有些书上说你必须这么做(即便不是本书),更不是因为空格比制表符更优美,而是因为作为程序员,你要把大部分时间花在理解和维护代码上,这只是为了让自己方便。
  • 语法工具存在这么多个世纪并不是偶然,它们满足了读者的需求和潜意识的要求。 ——William Zinsser,《写作法宝》
  • 变量、函数或类的名称应该回答所有重要的问题。它应该告诉你它存在的原因、它是干什么的,以及如何使用。 ——Robert C. Martin,《整洁代码之道》
  • 我们一定要明智地选择用词,肯定有比temp、num和data这样不明确的术语更好的选择。而且相对数字符号,我们更应该选择单词,即不要用subtotal1 和subtotal2 这样的名称,而是选用能够清楚表示值的含义的词,比如subtotalWithShipping和subtotalWithShippingAndTax。一定要想出一个好的词,哪怕查词典也可以。
  • 好的命名应该能够揭示意图。计算机只会关心代码是干什么的,而人却会关心代码为什么要这么做。
  • 如果我在看一个由10名工程师写的文件,应该让我几乎无法区分哪部分是哪个人写的才对。对我来说,这就是整洁的代码,而达到这一目标的方法就是通过代码评审以及发布你的风格指南、模式和语言惯用语。只要你做到这一点,每个人都会变得更有生产效率,因为所有人都知道如何以相同的方式去编写代码。到了那个阶段,你们主要关注的就是在写什么,而不是怎么写的问题了。 ——Nick Dellamaggiore,LinkedIn和Coursera软件工程师
  • 清晰的错误消息是整洁代码的主要特征。我们可以抛出异常、把错误消息作为返回值的一部分,或者将错误记录在日志中——只要不是静静地发生失败就行了。由于BookParser是对业务数据进行处理,我们通常要让数据尽可能保持原样,所以如果遇到了任何类型的错误,就应该让整个转换过程明显地抛出失败信息。为此,我们可以把所有无用的try/catch块去掉,让异常可以向上传导给调用者:
  • 注意该函数的签名中并没有返回值(它是void函数),这是有副作用的函数的典型特征。没有了返回值,我们就很难把这个函数和其他函数组合起来,这些函数将不得不通过文件系统或共享的可变变量进行通信,这两种方式都会比使用参数和返回值更加复杂,也更容易出错。
  • 不可变数据要求你要在脑海中弄清楚多条时间轴,副作用函数则要求你要在脑海中弄清楚多条时间轴和多个可能的全局状态。把几个有副作用的函数组合起来可能会引起所有时间轴和状态相互间进行交互,导致复杂度呈现指数式增长。 我认为可重用性的缺乏存在于面向对象语言,而不是函数式语言,因为面向对象语言的问题是它们离不开各种隐性的环境。你要一根香蕉,但得到的却是一只拿着香蕉的大猩猩和整个丛林。
  • 在软件领域,两个模块相互之间的依赖程度称为耦合。如果无论什么时候更新一个模块,都不得不频繁地更新另一个模块,这些模块就是紧耦合的,这通常表明代码是脆弱而且难以维护的。
  • 整洁的代码应该遵循依赖反转原则: · 高级的模块不应该依赖于低级的模块,二者都应该依赖于抽象; · 抽象不应该依赖于细节,细节应该依赖于抽象。
  • 根据经验,我们更应该对一些有如下特征的库的具体实现进行注入抽象。 · 具有副作用。 · 在不同的环境中有不同的表现。
  • 整洁的代码应该有高内聚:所有的变量和方法都应该是有关联的,一切都应该在同一抽象层次上操作,每一部分都应该很好地相互配合。
  • 不要为糟糕的代码注释——重新写吧。 ——Brian W. Kernighan、P. J. Plauger,《编程格调》
  • 我有意把介绍注释的内容放到比较靠后的位置,因为代码本身应该告诉你需要知道的几乎一切。如果代码没有做到,在你费劲地编写任何注释之前,应该先对代码进行改进。
  • 构是改变代码结构而没有改变其外部行为的过程,这是一种只影响软件“非功能”方面的编码任务:从外部看,代码实现的功能并没有变化;但从内部看,我们已经改进了它的设计。 合理的重构是必不可少的,因为我们不可能一开始就能正确地设计。和论文的初稿一样,代码的初稿也会是凌乱、不完整、需要重写的。虽然我有意把BookParser的例子写得很难看,但任何代码实现的第一个版本总是存在问题的。随着继续编写代码,我们会更好地理解问题,而重构的本质就是回到代码中,根据这种新的理解去改进它。
  • 编程在很大程度上就是一门手艺。你会因为选择了正确的工具、努力工作并制作出精美的东西而获得深深的成就感。它的美不仅源于对用户而言漂亮的外观,还源于其精工细作的内部运作方式。优雅的解决方案会让程序员愉悦,丑陋的拼凑则会让程序员悲伤不已。而悲伤的程序员生产效率更低、表现欠佳,最终将会离开公司。
  • 在创业公司中,一切都在不断变化。如果你已经到了害怕修改代码的地步,就意味着你需要在编码实践上进行扩展,以适应增长的需要。应对不断增长的代码库和开发团队的最重要的四个编码实践是: · 自动化测试; · 代码分离; · 代码评审; · 文档。
  • 要为代码编写测试,我们要先回过头来问自己几个重要的问题:我要如何组织代码的结构才能对它进行测试?我的代码有什么依赖项?常见的使用场景是什么?会遇到什么特殊的情况?
  • 最为重要的是,TDD可以迫使我们从最终结果反过头来考虑问题,帮助我们确认自己正在编写正确的代码,而不是直接跳入编码工作中,迷失在实现的细节里。我们要关注自己正在做什么,而不是怎么去做,如果我们能通过快速反馈循环的方式去做,就可以得到更高质量的设计。正所谓速度制胜。
  • 保持小规模的评审。10行代码的修改是很容易评审的,但是1000行代码的评审几乎是不可能的。这就意味着我们应该鼓励开发人员进行小修改,增量式地提交,而这恰好也是减少bug、合并冲突和后期集成问题出现概率的好方法。
  • 注释的正确用法是弥补代码本身表达上的失败。注意我用的是“失败”一词,这也就意味着,使用注释总是面临着失败。但我们又必须使用注释,因为不可能一直在没有注释的情况下解决自我表达的问题,但是使用它们并不值得称赞。
  • 程序员容易痴迷于性能、大O符号和可扩展性,会赞美一些“网络级”和处理“大数据”的公司。但现实却是,对于大多数创业公司而言,这些都不是特别重要的问题。我们的时间更应该花在能提高开发团队效率的工具和实践上,而不是让服务器跑得更快。事实上,做一些不能扩展的事情是早期创业成功的一个重要因素(
  • 一般来说,考虑性能或软件开发的基本过程就是让它工作,让它正确、让它快速。这是几个连续的步骤,我们必须按顺序去实现。实现错误功能的软件,即便它非常有效率也没有什么价值,所以我们在担心性能问题之前,必须先担心正确性的问题。只有得到整洁、可靠的代码之后,性能调优才是我们应该开始考虑的事情。
  • 当你开始尝试在软件公司中引入过程方法的时候,总会听到这样的声音:“我只能在不赶时间的时候去使用好的方法。如果时间很赶,我就管不了那么多了”。我总喜欢把这个故事拿出来举例子,想告诉大家一个真正好的方法无论在什么尺度上都应该能够加快你的速度。一个好方法可以缩短你一小时、一天或一年的时间。
  • 敏捷需要安全。 ——Jay Kreps,Confluent联合创始人
  • 使命宣言清楚地表达了公司的目的。它应该解释公司为什么存在,公司是做什么的、为谁而做。我们应当把使命当作公司的指南——它是一个梦想、一个目标,它是你、你的员工和客户所向往的。
  • 不要把你的使命宣言和当前的战略或产品混淆起来。战略和产品是如何做和做什么的问题,而使命宣言则是为什么的问题。“
  • 客户不会愿意在使命陈述中看到关于股东价值、收益和利润这样的东西,因为这些只会让人们觉得公司是贪婪且不值得信赖的。同样也不会有员工愿意为了提高2.3%的利润率而将心血投入到项目中。当然,每家公司都是要赚钱的,但金钱并不是公司的目标,它只是让公司达成真正目标的资源。金钱就像氧气,它是维持生活所必不可少的,但并不是生活的目的。事实上,忽略金钱是想出一个好的使命陈述的最佳方式。
  • 这里隐含着一个出人意料的道理:有时,一个大胆、宏大的使命实现起来并不会比一个小一点的使命容易。任何创业都是艰难的,但如果这一事情的回报是完成一个宏大而重要的目标,可能更容易说服出色的人参与进来。为出色的人提供一个宏伟的挑战才能够让他们在职业中尽其所能。
  • 核心价值是你在组织中用来做出每一个决定的信条。核心价值并不需要去选择,因为它们在你的团队中即可发现。它们是你已赖以为生的主要价值,你对其深信不疑,它们对你至关重要,不管你加入什么公司或者做什么产品,都会坚持这些价值。
  • 设定目标 经理应当决定一些目标、为了实现这些目标需要完成什么工作,以及如何将这些目标传递给团队。 组织 经理应当对工作进行划分,并挑选人员从事这些工作。 激励和沟通 通过在薪水、人员安排和晋升方面的决定以及经常性的沟通,经理应当将人员凝聚成一个高效的团队。 评估 经理应当为每个人建立目标并评估他们迈向这些目标的进度,形成一种绩效评估方式。 助人成长
  • 经理应当帮助团队中的每一个人提升自己的能力。
  • Douglas McGregor在1960年《企业的人性面》一书中,讨论了一种普遍的观念,即一般的工人并不喜欢他们的工作,并极可能去避开它。对某些工作来说也许是这样,比如一些无聊的、重复的手工劳动。那种情况可能需要一直有管理人员的存在,用报酬(薪水、奖金)促使工人们工作,或者用惩罚(解雇、蒙羞)威胁他们。然而,这种方式在许多需要创造性的工作中并不适用,比如编程。许多人喜欢使用自己的创造力去制作东西,所以他们实际上是喜欢自己的工作的,而且会积极主动地寻找要解决的问题。而我们要做的就是为他们提供合适的环境,他们内在的驱动力将促使他们努力工作。
  • 这种方式在许多需要创造性的工作中并不适用,比如编程。许多人喜欢使用自己的创造力去制作东西,所以他们实际上是喜欢自己的工作的,而且会积极主动地寻找要解决的问题。而我们要做的就是为他们提供合适的环境,他们内在的驱动力将促使他们努力工作。
  • 那么要怎么办呢?答案就是内在激励因素——我们都具有的内部驱动力,能够让我们因为任务本身的利益而喜欢上一个任务。人天生就是爱玩而好奇的,我们经常会在一些困难的任务上投入大量的时间,即便没有人为此买单。如果你是程序员,你已经有所体验了。你是否曾经花了一个周末的时间去改动一个工作之外的项目?你是否曾在工作之余学习过一门新的编程语言或技术?你是否曾为解开朋友告诉你的一个逻辑谜题而无法入眠?你是否曾经向开源项目做过贡献?这些活动大部分都是受内在激励因素驱动的。
  • 如何才能促进内在激励呢?由于它是很自然的,我们无法从外部去驱动内在激励。我们能做的只是提供一种环境,有利于将人们已经具备的内在激励带动出来。为此,我们需要营造一种能最大程度放大自主权、专业能力和目标的环境。
  • 每个公司都想招聘到最出色的程序员,但是最好的公司都会紧紧抓住他们的程序员并在他们身上投入,让他们变得更加出色,这就形成了一种良性循环。这些员工会因为他们正在提升自己的技能和市场价值而高兴,公司也因为得到更出色、技术更精湛的员工而高兴。专业能力上的投入有许多方法,比如鼓励员工定期加入新的项目和团队,参加会议和演讲(能够在会议和演讲中有所表现则更好),组织公开论文、博客和图书阅读小组(能够自己写论文、博客和图书则更好),向开源项目做贡献(阅读第12章了解更多信息)。
  • 通过这种方法,我们得以用更加透明的方式代替模糊、不确定的员工评估过程。而且它也不仅仅提供外在的奖励(例如薪水),还提供了内在的奖励(比如公司投资你的专业技能),这是一种明显的交互。LinkedIn的全局方案高级副总裁Mike Gamson写过一篇博客,提到了一个很好的例子,这篇博客名为“My Promise to You(Our Employees)” 我们先从坏消息讲起。坏消息就是有一天你会离开LinkedIn。我知道你才进入公司就要考虑离开是很奇怪的,但我要让你关注这件事,这样我们才能最充分地利用我们一起在公司的时间,携手前行。我不清楚你打算在这里度过2年、5年、10年还是更长的时间,但我要确保无论你和我们一起在这段旅途上待多长时间,当你在20、30、40年后回首整个职业生涯的时候,你会觉得待在这儿的岁月是职业生涯中变化最大的。你在这里的这些年学到的最多、成长最快、接触到最多不可思议的人和最具创新性的想法。我希望你在这里的这些年能成为真正改变你职业轨迹的岁月。我希望你在Linkedln比在你们本可能选择的其他地方,获得生命中更多的成就。我向你承诺,我将致力于营造和培育能够让你改变职业轨迹的环境,为你提供接触各种思想、各种人员、各种体验的机会,满足你在生命中实现这一切所需的因素。当你在某天离开LinkedIn,我希望你能够真正地转变。我所期望得到的回报是你能允诺全身心投入到这个自我转变的机会中,投入到我们的公司和这个世界中,并用你的勇气和坚持去追寻这些机会。
  • 开发人员的理想办公室需要满足4个条件: (1)一个可以和他人一起工作的地方; (2)一个可以独处专注工作的地方; (3)一个可以放下工作的地方; (4)一种可以根据个人需要定制办公室的方法。 注意,前三项从本质上不应该属于同一个地方——这是现代办公室设计最经常被完全忽略的原则,这一点将在下一节介绍。
  • 仅仅因为存在会被打断的可能性,就会让这些开发人员不敢开始困难的项目。这也是为什么他们喜欢在深夜工作的原因,也是他们几乎不可能在隔间里写出出色软件的原因(除非在深夜)。 ——Paul Graham,Y Combinator联合创始人,硅谷创业教父,《黑客与画家》作者
  • 健康的公司文化鼓励员工去分享坏的消息。可以自由、公开讨论其问题的公司也可以快速地解决这些问题,而掩盖问题的公司则会打击员工参与的积极性。所以CEO的做法应当是:营造一种文化,奖励(而非惩罚)人们将问题公开,使得问题得以解决。
  • Twilio是一家API公司。我们有一个传统,要求每一名员工必须实现并演示一个应用,这个应用必须是用Twilio API实现的,为此可以得到有公司logo的外套和Kindle(这是一项不受限制的公司福利),适用于所有部门,包括技术、销售、财务和市场。 我们每个周三都有一次公司宴会,新员工会在宴会上演示他们的应用,而我们的CEO则会把外套给他们穿上,为他们“授爵”。当新员工展示他们所做的东西时,看到整个公司都为他们喝彩是很美妙的,不管他们做出来的东西多简单或多复杂。
  • 第一规则:在所有情况下采用你的出色判断
  • 这并不意味着完全不采取任何过程,但是“采用出色的判断”应该是默认的过程。对于特定的情况,只有在“出色的判断”被证明不够时,才有必要在此之上实施一些额外的步骤。
  • 这是一个有趣的证明。但在这次个名为“Optimizing for Happiness”的演讲中,有一个严肃的观点:公司应该是让人快乐的,而不是获得利润。换句话说,创业是与人密不可分的。为快乐而优化的创业公司可以产生一种良性循环:当员工感到快乐时,他们会让公司变得更加强大;当公司强大时,它又使员工更快乐。
  • 机会并不会像浮云一样飘走,它们会牢牢地与个人联系在一起。如果你在寻找一个机会,实际上是在寻找人;如果你在评估一个机会,实际上是在评估人;如果你尝试统筹资源去追逐一个机会,实际上是尝试得到他人的支持并参与其中。并不是公司给你提供工作,工作是人提供的。 ——Reid Hoffman、Ben Scanocha,《至关重要的关系》
  • 除了编程问题之外,大多数面试官还会问一些关于你自己的问题。 · 谈谈你自己。 · 你以前做过什么项目? · 你为什么要找一份新的工作? · 你为什么想来这里工作? · 你理想的工作是什么样的? · 你想在5年内做什么,10年内呢? · 你最大的优势是什么,最大的劣势呢? · 你最大的成就是什么? · 你曾经解决的最难处理的bug是什么? · 我应该再问些别的什么问题吗? 有些问题听起来可能很俗气,但是却经常出现。请加以练习!
  • 不要在面试完成之后还不了解以下问题的答案。 · 该角色的期望是什么? · 该职位能够取得什么样的成功? · 谁是我的经理? · 我将从事什么项目? · 技术栈是什么? · 工作时间怎么样?他们花多少时间在编程上,又花多少时间来开会? · 如何构建和发布代码? · 公司的使命和价值是什么? · 办公室怎么样? · 在这里工作,你最喜欢和最不喜欢什么? 几乎每一名面试官都会给你咨询的机会。
  • 工作机会最重要的就是其背后的人。你准备好每周花40个小时以上的时间和他们在一起吗?你能否从他们身上学到东西?他们对于你的职业成长是否有帮助?和他们在一起有趣吗?他们是否投入足够的精力并具有足够的才能让公司取得成功?你是不是觉得仅从几个小时的面试就要得出这样的判断是很困难的?
  • 现在你明白了股票的基本知识,那么是不是多点股权少点薪水也无妨?这个问题可以从三个角度去考虑。第一个角度是把你的股权和所在地区类似的开发人员和公司进行比较。有一种方法可以做到这一点,就是使用Wealthfront的在线薪水和股权计算器。另一种方法是查阅http://www.hello-startup.net/resources/equity/,上面有一张表格,根据工作角色、资历和员工数量,列出了在创业公司工作通常可以获得的股权数量。 第二个角度是把较低的薪水看作是对公司和你的职业的投资,看作是为了以后得到大回报的机会。这样的回报能有多大?谁都不知道。这其中有太多需要考虑的因素,所以你能做的只是进行大量的猜测和假设,得出很多种可能性。下面是一个评估风险和回报的公式(但是要牢牢记住,这只是一个简化的计算,不完全准确;另外,还要注意这个公式假设股票一兑现就被立即行使权利,而没有考虑纳税的因素)。 A = 工作薪水和公平市场薪水之间的差异 B = 你希望在该创业公司工作的年限 C = 行使股权的成本 D = 你拥有该公司的百分比数 E = 投资者的投入 F = 公司在成功退出时的价值   投入 = (AB)+C 回报 = D(F-E)
  • 假设公司提供给你的薪水是每年5万美元,这一职位的公平市场薪水是6.5万美元。意味着你每年“投资”A=6.5万美元–5万美元=1.5万美元,用于换取未来从股权中可能获得的回报。你预期在公司工作B=4年,这个年限通常足以兑现你所有的股票。提供给你的工作中,你以每股0.1美元的履约价格获得了10万股股票,所以要行使所有股份,必须花费C=10万股×每股0.1美元=1万美元。这意味着你在这家创业公司中的投入如下: A = 6.5万美元 –5万美元 = 1.5万美元 B = 4年 C = 10万股 × 每股0.1美元 = 1万美元   投入 = (1.5万美元 ×4) + 1万美元 = 7万美元 在你获得股票时,股票的总发行量是110万股,所以你行使的10万股代表了公司的0.9%。然而到你达到退出条件时,你的股份可能已经被稀释了,因为公司会建立新的期权池,引入新的员工或投资者。我们假设4年之后你的股票被稀释了50%,那么10万股最终代表了公司的0.45%,也就是D=0.0045。
  • 开始的时候,你可以对投资者做个大概的评估: E = 募集资金 × 优先系数 × 经验参数 当你获得工作机会时,需要了解公司过去从投资者那里筹集了多少资金、在未来计划筹集多少资金,以及涉及的优先权(现在通常是1倍)。
  • 我总是建议人们这样想问题:如果你打算为一家公司工作,你断定1万美元的薪水比起所获股票的上涨更值钱,那你就是在把宝贵的时间和精力压在错误的公司上——完全就是把赌注押在错误的地方。这是一种通常都可行的考虑公司的思维模式。
  • 提供给实习生和应届生的职位,特别是大公司提供的职位,通常都是标准化的。如果你刚刚进入这一行业,影响力很小,就不要期望在薪水和签约奖金方面有多少提高的余地。如果你已经在该行业工作了好几年,通常会有10%~20%的浮动空间。如果你是首席开发人员或者高级总经理,30%或更多的空间也是有可能的。注意,如果你希望在薪水上提高10%,你就应该要求提高15%。也许你会立马得到更大的数字,这当然很好,或者公司可能会向下还价为10%,这就是你在开始时想要得到的水平。
  • 我几乎没有听说过仅仅因为谈判就丢失了工作机会,如果这种情况真的发生了,无论如何也不要在这样的环境中工作。
  • 在面试的早期,即还远远未到确定录用的时候,许多招聘人员都会询问你之前的薪水。如果你告诉他们,他们就会把它当作录用你所需要付出的最少薪水,从而拉低了你的谈判能力。你应当礼貌地回绝,告诉招聘人员你更希望在正式讨论录用的时候再谈薪水的问题。
  • 招聘人员可能会声称他们需要了解你之前的薪水,这样才不会因为薪水的问题浪费你的时间。在面试的早期确定你的薪水在一个合适的范围是没什么问题的,但这不需要暴露你自己的薪水。反之,你应该反过来问招聘人员,他们为这份工作提供的薪水范围是多少,告诉他们你会愉快地告知这是否在你可接受的范围内。如果招聘人员继续追问,就要提醒他们你的薪水属于私人秘密信息——可没有法律要求你泄漏。
  • 有些招聘人员会让你原样接受当前的工作条件,因为你会在以后得到大量的加薪和奖金。他们并不是完全在说谎,但是你应该假设所有没有明确写在合同内的东西都不会发生,承诺一年后有可能发奖金还不如提前给你加薪的保障。一般而言,你最可能在加入公司之前提高薪水。一旦你进入公司一两年,获得更高薪水或更多股份的难度就要大很多。
  • 假设总是会有职位放开,假设他们已经投入数周或数月的时间来寻找你、对你进行面试并给你工作的机会,他们当然可以提供几个星期的时间让你考虑。如果你需要更多的时间,不妨告诉公司你不能匆忙做出这样一个重要的人生决定。
  • 大多数公司都不会根据你吸引人的个性和才智的估价来为你提供工作机会,他们会根据你的技能等级的平均水平给你提供工作机会。如果想获得更好的工作条件,你的目标就是让他们相信你比他们所想的水平更高。可以使用两种谈判策略。 第一种策略是把你能够摆上台面的技能、具备的经验拿出来讨论,并使用一些市场数据,让公司确信你不止值这么多。遗憾的是,除非你在行业中大名鼎鼎,否则这样的谈判战术是不会有多少效果的,因为它仅仅是你针对雇主观点的意见。这里你唯一的谈判优势就是说不,公司已经投入了许多时间和金钱去寻找你、联系你,对你进行电话面试,让你来到现场,对你进行面试和背景调查,决定雇用你并提供给你一个工作条件,所以你可以让大多数公司在薪水或奖金上给你一小点提升,仅仅因为他们不想让全部努力白白浪费。
  • 第二种,也是更有效的策略,是通过获得竞争性的职位,向公司证明你不止值这么多。 5. 竞争性职位 作为职位的候选人,你最大的谈判影响力是竞争性的工作机会。另一家公司的工作机会是你在市场上价值多少的硬数据的象征,无须让你的意见和雇主的意见去一决高下。如果多家公司争相要你,你看起来就更有价值,你也许会让他们进入争夺大战中。我最喜欢的谈判策略之一就是像这样交谈:“嗨,A公司,谢谢你提供了这个工作机会,我想在你们和B公司、C公司之间做出选择,B公司给我多提供了X的薪水,C公司则给我多提供了Y的股权。我对你们的工作更感兴趣,也喜欢和你们在一起工作,但是却很难牺牲那么大的收入,你们能让这一决定对我变得更容易些吗?”
  • 当你有多种选择的时候,你会发现使用一种最强大的手段会让谈判变得更加容易,那就是离开。这就是为什么我们总是应该同时面试多家公司。也是为什么面试工作的最好时机是你不需要工作的时候。如果你不顾一切地想要得到一份工作,就更可能接受任何正好能提供给你的工作。
  • 现在,在本章的结尾,你应该能够反过来,把自己放在创业公司创始人的角色里,写下你想要招聘到的人员的品质。下面列出了几个你可能会写下来的例子。
  • 人是公司最重要的部分。选择正确的人比选择正确的产品、市场推广策略、技术栈或者编程方法论更加重要。这意味着招聘是你要做的最重要的事情,同时也是最难的一件事情。你需要找到与公司文化相契合的人,他要具备合适的技能,对你从事的工作感兴趣,并且在合适的时间点可供你使用,愿意接受创业公司的薪水。而且你还需要不断重复地去找符合这些条件的人。
  • 对于创业公司招聘,最好的一条建议就是:别做这件事,或者至少先别做这件事。招聘更多的人意味着
  • 对于创业公司招聘,最好的一条建议就是:别做这件事,或者至少先别做这件事。招聘更多的人意味着资金消耗更快,企业经营更复杂,决策更缓慢,要花更多的时间去搜索、面试和培训。最好的创业公司就是用较少的资源做较多的事。创业公司应当以小规模为荣,通过小团队去完成尽可能多的事。这能教你学会如何保持专注、更好地权衡取舍,并培养追求高影响力和高效率的热情。事实上,招聘更多的人并不一定意味着你可以完成更多的事情。9.2节讨论过,沟通的开销会随团队规模平方增长,这也解释了为什么较大的公司不能像较小的公司那样快速转变。你应当尽可能保持小规模。
  • 那怎么才能知道何时开始招聘呢?我们要问的关键问题不是“如果我们招了人可以做什么”,而是“我们不招人的话无法做什么”。如果对业务至关重要的事在没有新员工的情况下无法完成,不管你们多么有创造性,都是时候开始招聘了。
  • 我们应当在创业伙伴身上寻找四种品质。第一,要找“敏思笃行”的人。要寻找你认识的那些不管有什么障碍都能克服的人。第二,要寻找具有互补技能的人。例如,如果你是程序员并善于开发产品,就要寻找能够处理好销售和市场推广,并善于发现客户的创业伙伴。第三,创业伙伴通常在年龄、经济状况和动机上应该是类似的。如果一个创始人寄希望于赚快钱,而另一个则对改变世界有长期的愿景,这是很难成功的。第四,也是最为重要的,就是你要找到能够信任的人。要建立信任,你必须了解合伙人的经历,所以也再次说明了为什么同事、同学和朋友是最合适的创业伙伴。
  • Chesky还问了应聘者“如果你剩下一年的生命,还会选择这份工作吗”,而且他只会录用回答“是”的应聘者。这是一个极端的例子,你可能不应该完全照搬(即便是Chesky,后来也把问题改成了十年),但是这个问题真正的意义才是我们要放在心上的:尽你所能,确保自己找到正确的早期员工。
  • 这里有一个重要的提醒:专才的反面并非是通才。不是任何方面的专家并不意味着你就擅长各个方面。真正的通才是那些多面手的人,你把一些新东西放在他们面前,他们就会把它带走并弄清楚它是如何工作的。他们拥有永不满足的好奇心,愿意对所有东西都稍做尝试。但你要是看看他们的简历,就会看到大量行业的经历(例如旅游、医药、社交网络、消费者、部署自动化、编程语言设计)以及职业角色(例如开发人员、技术主管、产品经理、设计师)。
  • 如果一个程序员解决这个问题所花的工作量要少一个数量级,那么这样的一个程序员可能胜过一个团队。通过做出更好的决定和提出更有创造性的解决方案,10倍能力的程序员也许可以避免埋头苦干好几个月。换句话说,我们并不是要编写更多的代码,而是要编写正确的代码。10倍能力的程序员实际上是10倍能力的决策制定者。
  • 这一切表明,超级明星程序员,就像超级明星运动员,是格外稀少的。如果你尝试根据只招聘“摇滚明星”的原则去制订自己的招聘策略,或者更糟的情况是,如果你的公司招摇过市,好像已经是一群“摇滚明星”,你就永远无法发展你的团队。开发人员在能力上也许会有巨大的差异,但是这一点不能掩盖下面这三个关键的事实: (1)开发人员的表现会根据不同的任务而有所不同; (2)开发人员可以逐步变得更好; (3)大多数软件都是由团队而不是由个人开发的。 第一个事实意味一个公司中10倍能力的开发人员在另一家公司中可能只是1倍能力甚至0.1倍能力的开发人员。文化、激情和使命才是至关重要的(阅读第9章了解更多信息)。第二个事实意味着建立成功创业公司的最好方法就是招聘到出色的开发人员,并为他们提供一个环境,使他们可以变得更好。有些人知道了10倍能力的开发人员的概念会觉得沮丧,因为他们认为自己永远不会做得那么出色,似乎伟大的开发人员是天生的,而不是后天的。但是在阅读了第12章之后,你就会发现许多证据表明,将精英和一般人区分开来的并不是天赋。而是实践练习。
  • 我们要在所有应聘者身上寻找的重要品质就是,他们应该是聪明并能把事情做好、能够很好地适应文化、有出色的沟通技能、能够友好相处的。
  • 当你考虑一个应聘者的时候,你是否能够和他愉快地交谈呢?如果公司中的某个子系统是他们负责的,他们能不能向新来的员工解释清楚系统是如何运转的?他们有没有维护博客?如果有的话,写出来的东西你能不能看得懂?他们能不能在会议上演讲?你能不能理解他们的代码?如果你们的角色调换过来,那名应聘者在面试你,他们会是公司的出色代表吗?
  • 你所制作的大部分内容不应该明显和招聘人员有关。例如,不要用招聘视频去打扰别人,大家应该知道我指的是什么:在一个快速平移的镜头下,出现了一个站在白板旁边或者打着乒乓球的人;在一首快节奏的背景轻音乐的伴奏下,出现了一个面试的场景,一名行政人员坐在中央,看着摄像头一侧的人,告诉他们所做的工作是多么有意义,接下来就是渐渐出现的公司logo。实际上,没有公司之外的任何人会喜欢看这种片子。
  • 特别是这则招聘公告并没有为潜在应聘者回答最为重要的问题:我究竟一开始为什么要申请这份工作?
  • 如果你打算使用求职榜,就要做一份出色的招聘公告,需要把它当作一则广告去考虑。你不仅要解释这份工作是什么,更重要的是解释为什么应聘者要申请这份工作。
  • 所以我的建议是要反过来采用寻找闪光点的方法。这些闪光点可能是从好学校获得的出色的GPA,可能是工作之余做过的很酷的项目,可能只是工作之余做过的很多小项目,也可能是他们在现在的雇主那里获得的奖励——我们应该只去看这些闪光点。 ——Gayle Laakmann Mcdowell,Careercup创始人、CEO
  • 所以,除非你绝对有把握,否则在招聘的时候请说“不”。
  • 每一名面试官从面试出来时要么得说“可以”,要么得说“不可以”,不允许说“也许吧”。只有一个“可以”而没有其他团队成员的同意,照样不行。只有获得所有面试官的“可以”的应聘者才会被录用。录用一个有问题的应聘者比错过一个出色的应聘者更糟糕,所以即便只有一个“不可以”通常也足以拒绝一个人。唯一的例外是如果有人过去曾经和那位应聘者亲密共事过,并强烈为他打包票。现实的工作经历当然比在人为的面试中得到的一个“不可以”更有说服力。
  • 不要把面试等同于质问。许多面试官会直接跳入到技术问题中,直接用智力题和编程难题去狂轰滥炸,甚至连招呼也不打。你在那儿不是要拷问应聘者知道多少,也不是要让应聘者承认自己是个糟糕的码农。他们不是你的敌人,面试本身就是有压力的,所以请善待他们。
  • 我们要把面试当作两个人之间有礼貌的交谈,介绍你自己,简短地谈谈你是做什么的以及想要填补的职位类型。询问应聘者他们是做什么的,是否需要水或者休息一下。之后,和任何愉快的对话一样,把话题转移到应聘者身上,尝试去了解他们。让他们告诉你一些与自己有关的事情,谈谈他们过去从事过的项目,描述他们希望在以后能从事的项目,了解他们为什么对你的公司感兴趣。
  • 每一名面试官都是公司的大使,所以我们要选择聪明的人。
  • 这种方法能测试我希望在数据科学家身上看到的四种关键品质:技术水平、数据创造力、沟通技能以及是否是结果驱动型的人”,她说。
  • 假设你考虑提供一个工作机会给Anna,下面是可以问Anna的证明人的一些问题。 · 你怎么认识Anna的?你们在一起工作过吗?有多长时间了? · 告诉我Anna的职业。她最出色的成就是什么? · Anna最大的优势是什么?她正致力于改进的是什么? · Anna在这份工作相关的技能方面有些什么样的经验? · 和Anna一起工作感觉如何?你想再次和她一起工作吗? · 为什么Anna要离开她当前的工作?她希望得到什么? · Anna是和你共事过的最出色的1%吗?最出色的10%呢? 如果证明人的核实通过了,就要尽可能快地给应聘者提供录用。不要超过一两天,才能让应聘者知道你对他们是感兴趣的,那时他们也还清晰记得你的公司。
  • 我和别人第一次交谈时会问:“你在寻求什么?你想要什么?”这不是我在推销Tindie,我只是在倾听他们。在交谈中谈得越多的人一般都越觉得这是一次更好的谈话,所以我会倾听——我是真正地倾听。在尝试销售之前,我会问“你想要什么”,因为如果你先去销售,然后再问,人们通常只会说一些你想听到的东西。
  • 机会是一个工作机会中最重要的部分。我们提供的职位应该是一个参与更大的使命的机会,是和了不起的人一起工作的机会,也是对事业有所发展、有更大的影响力、从头开始做一些东西的机会(阅读第9章,了解有关使命及文化的内容)。
  • 有一种工作只是工作,有一种工作却是你终生的追求。
  • 这种工作草木皆情,由你全情打造。这种工作会让你从来不妥协。这种工作也会让你甘愿牺牲周末。你可以在Apple找到这样的工作。在这里的人们不会闲庭信步,他们到这里击水三千。 他们希望自己的工作能有一些不同的东西。 一些重要的东西,一些不可能在其他地方得到的东西。 欢迎来到Apple。
  • 下面列出了一些可以提供的福利的思路: · 保险(健康、牙齿、视力和生命); · 假期(度假、节假日、病假); · 食物(免费早餐、午餐、晚餐、点心和饮料); · 薪酬(报销安家费,401K缴存比例,奖金); · 工作现场福利(日托、干洗、按摩、汽车修理); · 健康(报销健身会员费用、运动课程、运动队); · 日程(支持灵活的工作时间和在家办公); · 活动(提供远足团队、阅读小组和志愿者小组的资金); · 学习(提供图书、课程、举办演讲及参加会议的资金); · 通勤(列车月票、地铁月票、停车月票、班车); · 自主权(黑客马拉松、20%时间、孵化器); · 硬件(强大的笔记本电脑和台式机、大屏幕、平板电脑); · 工作环境(私人办公室、舒服的椅子、可带宠物)。
  • 生命中大多数事情的关键点是,平均质量和最佳质量之间的动态范围,最大也就是二比一。举个例子,如果你在纽约,最好的出租车也许能比普通的出租车快20%;在计算机领域,最好的PC也许比一般的PC好30%。从量级上看并没有那么大的差异,你很少能找到二比一的差距,无论选什么做比较。 但在我关注的领域——最初就是硬件设计——我注意到普通人实现的东西和最出色的人实现的东西之间的动态范围是50∶1或100∶1。还要考虑到,后者都是知道要追求精益求精的人。这就是我们的情况。你可以打造一支由追求A+的队员组成的团队,一小队A+的队员就可以远远超过由B和C的队员组成的庞大团队。这就是我们所要努力去实现的。
  • 这就是为什么世界上最出色的软件开发者和软件公司都有一个共同点:都在孜孜不倦地学习。Erlang编程语言之父Joe Armstrong说过,成为更出色的程序员的最佳方法就是“花20%的时间去学习——这是一种复利”。《
  • 人们会想出各种借口解释自己为什么不学习新的东西,最常见的借口是他们太忙了,但实际上忙只是一个结论——做事情的时间不是找出来的,而是创造出来的。每当你听到自己说“我没有时间学习”的时候,就要意识到你其实是在说“我宁可把其他事情放在学习前面”。错过太多的学习机会是一种短视的行为,特别是在快速变化的软件行业。在这样的行业中,打造成功职业或成功公司的唯一方法就是不断让自己变得更加出色。
  • 安迪·格鲁夫,《格鲁夫给经理人的第一课》
  • 在《优秀到不能被忽视》一书中,Cal Newport提出成功职业的秘密并不在于一直困扰你的“内心之所向”或者“激情”,而是精通“罕见而有价值的技能”。通过提供专门在公司学习的时间,你既可以让公司成为对潜在员工更有吸引力的工作场所,也可以提升每一个已经在这里工作的人的表现。
  • 根据《人件》一书的说法,一般的软件开发者连一本关于他工作主题的书都没有。作为一名程序员和作者,我发现这种情况是很让人害怕的。但是在某种意义上,这也意味着存在大量的机会。如果你是程序员,你可以定期花时间去阅读和研究,走在你的同事之前。 · 阅读文章、博客和图书。(阅读本书就是一个好的开始!) · 阅读学术论文。paperswelove是一个非常好的计算机科学学术论文知识库。 · 参加课程。Coursera和Khan学院都提供了许多免费、线上课程,涵盖了各种各样的主题,包括编程和创业。 · 参加演讲、聚会小组或者会议。请访问Meetup网站和Lanyrd网站。 · 阅读代码,特别是开源项目的代码。The Architecture of Open Source Applications提供了许多流行项目代码的指导讲解,包括Berkley DB、Eclipse、Git和nginx。 我已经发现了三种让我的研究时间变得更有效率的方法。第一,设立具体的、可测量的目标。例如,我为2015年设定的目标是阅读30本书(我用Goodreads来记录我的进度)。差不多每两周就要读一本书以上,所以如果两周过去了,还没有读完一本书,我就知道自己落后了。我还有一个目标,就是每年至少学一种主要的新技术,比如一种新的编程语言或数据库,我发现“七周七种”系列图书,比如《七周七语言》《七周七数据库》和《七周七并发模型》,都是实现这一目标很好的方法,因为这些书会向你介绍各种各样的技术,还会重点强调不同的编程范式,比如Ruby中的面向对象编程和Prolog中的声明式编程的对比,或者用MongoDB实现面向文档存储和HBase实现面向列的存储对比。 第二,记笔记。举例来说,我会对读过的每一本书进行总结,并把喜欢的文字保存在Goodreads。我会简单记下一些新的点子、问题,以及在阅读点子日记过程中产生的想法(阅读2.1.3节了解更多信息)。偶尔,我会把这些新想法发表到博客上。但是即便我把这些想法写在纸上立即丢掉,记笔记这样一个动作也可让我的学习成为更加主动的过程,帮助我更好地记住和理解这些新点子。 最后,也就是第三点,是要让你的朋友和同事也一起参与到学习过程中。在LinkedIn,我们成立了一个阅读小组,每几周就阅读一篇新的计算机科学论文,然后聚在一起讨论。在开始使用Scala的时候,我们也成立了一个学习小组,人员就是在Coursera上参加了“用Scala进行函数式编程”课程的那些人。有了别人的推动、可以在一起讨论问题和想法,你就更能坚持做一件事。
  • 最好的学习方法就是教。向别人解释一个话题,你自己就必须更深入地去理解它。每次我准备演讲、准备写博客或者像现在这样,写一本书的时候,我都会去了解比最初掌握的还要多的知识。花时间去分享知识是提升水平的一种最简单也是最有效率的方式。事实上,具有“资深”标记的工程师都是那些使周围的人更加出色的人,要达到这一目的唯一的方法就是教。
  • 我会给所有人的一条建议是,总是要考虑团队以及你可以做什么让周围的人更有效率。
  • 如果可以回到过去,我会告诉自己一件事,我会尝试进入到18岁、还在为成绩而困扰、茫无目标而被动的自己的身体里,告诉他学习编程也许是你今天可以学到的最伟大的技能之一了。编程的核心就是解决问题,毫不夸张地说,它能够在一定程度上改变世界。计算机科学的抽象理论是伟大的,但是超越理论的是几乎无限的理论实践应用领域,赶紧开始吧。
  • 我想告诉自己,即便认为自己已经实现了一些伟大的东西,也仍然要保持求知若渴。因为正是在我最饥渴的时候,才能克服最大的困难,实际学到和贡献出最多的东西。一旦认为自己都知道了,就会变得被动和缺少活力。 好多次去上班的时候,我都在想:“他们今天也许会把我解雇了。他们会发现我并没有那么出色。”如果那天过去了,我做了一些意想不到的漂亮东西,我就会想:“哇,真是个好日子,他们没有炒掉我,我做了这个很棒的东西,还行啊!” 所以,这就是我想告诉自己的。要保持求知若渴,永远不要自我满足。
  • 我真正认清楚的一件事情就是,你不能准备去创业,它是自然而然发生的,跟着它走就是了,然后一路去解决各种问题。读书仍然是很重要的(比如这一本),从经历中学习也很重要。但是最后,你还是得以你的方式去应对遇到的事情。
  • 巴顿将军说过一句非常好的话:“一个可以立即强力执行的计划,好过一个下星期才能出炉的完美计划。”
  • 不要低估创造力的威力。创造力比技术上的知识更加强大。谈论技术的人是很重要的,但你能够理解技术并不一定意味着你可以把它们用好。你可以不断学习技术,但只有当你具有了创造力,你才能够做出东西。创造力是一种需要彰显出来的能力,请练习、练习、再练习。
  • 我给大学时的我的建议是,要充分利用大学的环境,最大程度网罗各种机会,加入计算机俱乐部,参加实习,挑选一些兼职项目,学到课堂上学不到的知识。尽早关注如何建立自己的个人品牌,并在工作之后继续打造好这一品牌。噢,
  • 相信你内心的感觉,快速做出对人的决定。建立团队时,你有时会招聘到某些人,但你就是感觉这个人不合适。请尽快改掉这样的错误做法。短期来看,这样做会有些紧张,但长期来看,你会做得更好,你的生活也会更轻松一些。
Hexo 构建过程中报错 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed – JavaScript heap out of memory 如何处理?

Hexo 构建过程中报错 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed – JavaScript heap out of memory 如何处理?

最近在处理 Linux 中国的静态站点,在技术选项上,为了方便修改,选择了 Hexo 来建设。

数据从 Discuz 转换到 Markdown 已经处理好了,但在构建过程中遇到了一些问题,会报如下错误

☁  linux [main] ⚡  hexo g
INFO  Validating config
INFO  Start processing
INFO  Files loaded in 2.37 min

<--- Last few GCs --->

[4685:0x118008000]   188193 ms: Scavenge (reduce) 3974.1 (4131.6) -> 3974.1 (4131.6) MB, 1.96 / 0.00 ms  (average mu = 0.143, current mu = 0.117) allocation failure;
[4685:0x118008000]   188198 ms: Scavenge (reduce) 3977.5 (4135.0) -> 3977.5 (4135.0) MB, 1.88 / 0.00 ms  (average mu = 0.143, current mu = 0.117) allocation failure;
[4685:0x118008000]   188202 ms: Scavenge (reduce) 3981.0 (4138.5) -> 3981.0 (4138.5) MB, 1.79 / 0.00 ms  (average mu = 0.143, current mu = 0.117) allocation failure;


<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

 1: 0x104762660 node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 2: 0x1048dcc84 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 3: 0x1048dcc34 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 4: 0x104a82410 v8::internal::Heap::CallGCPrologueCallbacks(v8::GCType, v8::GCCallbackFlags, v8::internal::GCTracer::Scope::ScopeId) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 5: 0x104a84e98 v8::internal::Heap::ComputeMutatorUtilization(char const*, double, double) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 6: 0x104a84b80 v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 7: 0x104a83f08 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::internal::GarbageCollectionReason, char const*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 8: 0x104a829a4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)::$_6::operator()() const [/opt/homebrew/Cellar/node/21.5.0/bin/node]
 9: 0x104a8277c void heap::base::Stack::SetMarkerAndCallbackImpl<v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags)::$_6>(heap::base::Stack*, void*, void const*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
10: 0x104680028 PushAllRegistersAndIterateStack [/opt/homebrew/Cellar/node/21.5.0/bin/node]
11: 0x104a8122c v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
12: 0x104a7977c v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
13: 0x104a79f20 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
14: 0x104a61988 v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
15: 0x104a58874 v8::internal::MaybeHandle<v8::internal::SeqTwoByteString> v8::internal::FactoryBase<v8::internal::Factory>::NewRawStringWithMap<v8::internal::SeqTwoByteString>(int, v8::internal::Tagged<v8::internal::Map>, v8::internal::AllocationType) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
16: 0x104d74a6c v8::internal::Runtime_StringBuilderConcat(int, unsigned long*, v8::internal::Isolate*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
17: 0x104573954 Builtins_CEntry_Return1_ArgvOnStack_NoBuiltinExit [/opt/homebrew/Cellar/node/21.5.0/bin/node]
18: 0x1045e94c4 Builtins_RegExpReplace [/opt/homebrew/Cellar/node/21.5.0/bin/node]
19: 0x1045625ac Builtins_StringPrototypeReplace [/opt/homebrew/Cellar/node/21.5.0/bin/node]
20: 0x1044e8b84 Builtins_InterpreterEntryTrampoline [/opt/homebrew/Cellar/node/21.5.0/bin/node]
21: 0x1289db514
22: 0x1289dbae4
23: 0x128def07c
24: 0x1289db514
25: 0x128d2de58
26: 0x1289db514
27: 0x1289d9e20
28: 0x1288da1d8
29: 0x128de4df4
30: 0x1288ce2bc
31: 0x1288c99d8
32: 0x1288de57c
33: 0x1288de6d8
34: 0x1288d0654
35: 0x1044e68ac Builtins_JSEntryTrampoline [/opt/homebrew/Cellar/node/21.5.0/bin/node]
36: 0x1044e6594 Builtins_JSEntry [/opt/homebrew/Cellar/node/21.5.0/bin/node]
37: 0x1049fca88 v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
38: 0x1049fc480 v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
39: 0x1048f093c v8::Function::Call(v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
40: 0x104681110 node::InternalMakeCallback(node::Environment*, v8::Local<v8::Object>, v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*, node::async_context) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
41: 0x104681508 node::MakeCallback(v8::Isolate*, v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*, node::async_context) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
42: 0x1047001fc node::Environment::CheckImmediate(uv_check_s*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
43: 0x107d57ec8 uv__run_check [/opt/homebrew/Cellar/libuv/1.47.0/lib/libuv.1.dylib]
44: 0x107d52cc4 uv_run [/opt/homebrew/Cellar/libuv/1.47.0/lib/libuv.1.dylib]
45: 0x1046819dc node::SpinEventLoopInternal(node::Environment*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
46: 0x1047a9ad4 node::NodeMainInstance::Run(node::ExitCode*, node::Environment*) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
47: 0x1047a983c node::NodeMainInstance::Run() [/opt/homebrew/Cellar/node/21.5.0/bin/node]
48: 0x104722e80 node::Start(int, char**) [/opt/homebrew/Cellar/node/21.5.0/bin/node]
49: 0x187fb10e0 start [/usr/lib/dyld]
[1]    4685 abort      hexo g

这个报错中,最有价值的便是 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed – JavaScript heap out of memory

这个报错的意思是目前 JavaScript 使用的内存已经超出了可用范围,导致程序挂掉,而如果想要解决这个问题,只需要分配更多的内存给 Hexo 即可。

只需要在构建的命令前加入NODE_OPTIONS=--max-old-space-size=24576,就可以分配更多的内存给 Node.js 。这里的 24576 是 24GB 内存的含义,你可以根据你的需要来选择。

PS. Linux 中国的数据太多,以至于我用 Hexo 分配了 24GB 都不行。。我决定换 Hugo 了。。希望 Hugo 可以。。。

《非线性成长》书摘

《非线性成长》书摘

推荐语

  • 有璨总结的三条成长曲线——如何快速找到立足于世界的生存技能、如何提升自我的认知、看到更为广阔的世界;如何提升自我的心力去担负起更大的责任。一个人如果能够成功越过这三个阶段,必将获得非线性成长。这本书非常值得当下的年轻人学习。

自序

  • 在一个外部环境不确定性越来越强的时代,我们究竟该如何看待自己的职业成长和个人成长,又该如何获得更快的成长?
    这个问题又可以一拆为二,变成如下两个分支——
    (1)如何才能在变化越来越快的职业和商业环境中,在世俗层面获得更快速的成长,赢得更大的回报?
    (2)对于一个成年人来说,“成长”到底是什么?倘若外部环境始终在不断变化,则每一个人不断努力奋斗,在个人成长的每一个阶段将会面临的问题与所追求的答案又会是什么?
  • 结合过去十几年的所见所闻,我认为,一个成年人的“成长”,也许会经历如下几个阶段。
    第一个成长阶段是:如何在这个世界上生存,并学会依靠规则去赢得基本竞争。
  • 第二个成长阶段是:如何能够看到更大的世界。
  • 而第三个成长阶段则是:如何在看到更大的世界后担负起更大的责任,赢得更大的荣耀和认可,创造更大的社会价值。

前言

  • 围绕上述3个概念,还有3句话想要分享给你——
    (1)一个环境长期越稳定,线性法则在其中就越适用;相反,如果一个环境变化越快、越频繁,则非线性法则越容易在其中起主导作用。
    (2)对绝大多数人而言,我们当前所处的这个世界是复杂且充斥着“非线性”的,但“非线性”不等于无序。找到某些在非线性的世界中适用的基本规律和法则,对于你的成长至关重要。
    (3)即便世界的本质是非线性的,在每一个非线性系统内,也存在高度遵循线性法则的局部。任何个体或组织,本质上都需要线性法则和非线性法则交替发生作用,才能更好地驱动其发展与成长。

1.3 第三阶段(2009—2011年):互联网下的加速成长和运营职业生涯

  • 一个新的行业内获得一项扎实的新技能,需要满足两个条件——
    (1)你此前已经拥有某项具体的相关技能,且对之还算熟悉。
    (2)你需要把自己置身于用到该项新技能的真实环境中,进行大量实践练习,唯有这个过程才能把此前那项“相关技能”转化成为一项新技能。

02 非线性世界的真相与基本规律

  • 薇娅称,颇为不顺的电商生涯,是她创业以来最灰暗的日子。不断地自我怀疑,身体和心理状态都变得非常差,和老公也经常吵架,但这一段日子也是薇娅人生的一笔重要财富。她相信只要脚踏实地,尊重商业规则,做好产品,服务好用户,就一定会有收获。后来薇娅入驻淘宝直播,每天坚持直播,最终成为业内公认的“淘宝第一主播”,多次创下直播带货纪录。她说:“现在回过头来看,从线下实体店主,到天猫店主,再到如今的电商主播,很多东西都在改变,但当初支持我走过来的这套价值观到现在都没有改变。”

2.1 重塑自己的职业发展观

  • [插图]
  • 假设整个社会的社会基本结构与制度相对稳定(至少不至于每年或每2~3年都产生巨大变化和波动),但影响职场人士最多的商业环境注定持续剧烈变化,旧的模式、行业和企业都注定不断被颠覆,企业的平均寿命显著更短,各种职业岗位不断更迭和消亡,我们如何才能确保自己在整个社会分工与生产回报体系中拥有不可替代性和绝对竞争力,走到更高的位置?
    我的答案是:你创造商业价值的能力或是深刻理解商业逻辑的能力要变得更强。
  • 身为一个普通人,身处非常动荡和不确定的商业/职业环境下,要想在职业成长这个充满束缚的游戏下更好地通关,你的最佳选择是两种:要么,你依靠某种技能成为一个业内顶级的、位于Top 3%-Top 5%的专家;要么你努力让自己成为一个优秀的商业操盘手。

2.2 “S型曲线”与“第二曲线”出现的必然

  • 第一个阶段,称为积累摸索期。这个阶段的你,因为刚刚进入新的竞争环境,对这个环境的规则、基本情况等都还不熟悉,也没有做好准备在该环境下面对激烈的竞争,因此,需要花一些时间来摸索和试错,也需要在一些实践过程中不断修正自己的基本认知,检验自己在新环境下的实力和竞争力是否足够。
  • 然后就进入第二个阶段——快速成长期。
    在这一阶段里,你对于新竞争环境下的一些规则和情况已有较为充分的了解,也通过实践积累了一些微小的业绩,对自己的工作能力有了一些基本的自信。
    于是,接下来你必须做好准备,让自己不断到竞争更加激烈、压力更大的一线战场上,在竞争中不断赢得胜利,取得成绩——唯有成为一个在局部战场竞争中不断赢得胜利的人,你才能让自己进入快车道,获得足够快速的成长。
  • 正是这种背负压力和直面竞争的状态,以及从中取得成绩和获得肯定的欲望,激发我更大的潜力和战斗力,也让我变得更加自信和强大。
  • 最后一个阶段则是成熟衰退期。
    到了这一阶段后,你在某一竞争环境下可能有了不错的成绩,你的竞争力也获得了不少人的认可,于是,你可寻求的挑战在该环境下变得越来越少,你的成长速度开始逐渐放缓。
    如果把横轴当作时间,纵轴看作我们的个人价值,再把这3个阶段合在一起,就构成了典型的职业成长“S型曲线”。
  • 倘若你位于一个变化极大的行业内,身处一条职业成长赛道,花了超过3年时间仍然没能让自己进入快速成长的轨道中,那么无论原因是什么,对你而言都算不上是积极的。
  • 自2014年开始,易到的整体业务数据再也没能超过滴滴,差距反而被越拉越大。
    到2016年,易到已难以为继,作为中国互联网出行市场的开创者和先行者,最终一步步滑向了失败的终局。
    而滴滴依赖着自己强悍的战斗力和在“大出行”版图下一条接一条的成长曲线,成为中国互联网具备代表性的一家准巨头公司,估值达到数千亿美金,是移动互联网浪潮下创业成功的典范。
    以今天的眼光看,周航看清了“小战场”的情况,却没能看清“大战场”的战局,过早地让自己固守在一个特定竞争赛道中,进入“线性增长”的惯性轨迹,没能在“大战场”的战局及时开启“第二曲线”,这是易到失败的核心原因之一。对此,周航本人在《重新理解创业》一书中也有极为深刻的自省和深思。
    对于易到的失败,所有有过创业经历的人都会倍加感慨——很多时候,一个商业机会往往因为新技术、新商业逻辑的变化而出现,但这样的机会注定有其特定的时间窗口,若你没能把握住机会,则机会必然属于其他人。
    因此,如果你无法在特定时间内在大战场上通过无数条小“S型曲线”让自己持续走高,勾画出一条美丽的大“S型曲线”,则你必然会在这个机会面前失败,或者说,这一类成功的机会就已经不属于你了。
  • 以今天的眼光看,周航看清了“小战场”的情况,却没能看清“大战场”的战局,过早地让自己固守在一个特定竞争赛道中,进入“线性增长”的惯性轨迹,没能在“大战场”的战局及时开启“第二曲线”,这是易到失败的核心原因之一。对此,周航本人在《重新理解创业》一书中也有极为深刻的自省和深思。

2.3 头部效应——在每一段职业经历上跃迁的秘诀

  • 总而言之,头部效应就是你若在一个领域成为头部,就能够在该领域得到最高价值的回报,或是拥有该领域最高的势能。
  • 身为一个工作年限还不那么长的从业者,在单一一条职业竞争赛道中要想顺利通关,进入势能更高的职业轨道中的关键,在于你必须在当前赛道中努力成为Top 20%的“头部选手”。
    并且,在一个稍低势能的赛道中成为头部,价值远大于在一个高势能的赛道中当一个普通选手。
  • 第一条曲线上的A点是观察点。企业的发展处于这个点上时,应开始培育或实施一个新的计划,让自己可以逐渐过渡到新的成长曲线下。A点可能是一家企业抽出身来仔细考察自身的发展现状,并考虑建立新曲线的最佳时间点,不用太早,也不宜再晚。
  • A点,差不多恰好也是个人在上一条成长赛道中进入TOP 20%区间的时候。
    所以,当你在原有的成长曲线下成为Top 20%的头部选手,你需要思考、探寻和建立自己的“第二曲线”,在“第二曲线”上投入一些资源和时间,这样的节奏能够更好地让你应对成长的焦虑和适应环境的变化。甚至,你可能要允许在一定时间内,两条曲线同时存在。
    关于如何培育和探寻自己的“第二曲线”,我在《运营之光》一书中提到过的“ABZ法则”或可作为参考[5]。
    最后,我不妨把前面几节内容放到一起,围绕“第二曲线”和“头部效应”再做一些总结,以便你加深印象——
    (1)在每一段职业经历中,你的最佳成长路径是一条“S型曲线”。
    (2)对于个体的职业成长,“第二曲线”的出现是一种必然,且有可能你的职业成长需要跨越多条“第二曲线”。
    (3)在你的职业生涯中,从一条已经逐渐进入瓶颈的成长曲线中跨越“非连续性”的鸿沟,成功进入新的成长曲线中,需要两个基本前提——
  • 当你在原有的成长曲线下成为Top 20%的头部选手,你需要思考、探寻和建立自己的“第二曲线”,在“第二曲线”上投入一些资源和时间,这样的节奏能够更好地让你应对成长的焦虑和适应环境的变化。甚至,你可能要允许在一定时间内,两条曲线同时存在。
  • 最后,我不妨把前面几节内容放到一起,围绕“第二曲线”和“头部效应”再做一些总结,以便你加深印象——
    (1)在每一段职业经历中,你的最佳成长路径是一条“S型曲线”。
    (2)对于个体的职业成长,“第二曲线”的出现是一种必然,且有可能你的职业成长需要跨越多条“第二曲线”。
    (3)在你的职业生涯中,从一条已经逐渐进入瓶颈的成长曲线中跨越“非连续性”的鸿沟,成功进入新的成长曲线中,需要两个基本前提——

2.4 成长赛道、线性竞争和非线性竞争

  • 我对以上两个故事的思考是:一个人或组织要想追求成长和发展,需要持续在两个维度上有所提升和突破,一个是线性维度的提升(如增加自己某项技能的熟练程度),另一个则是非线性维度的提升(如升级自己的认知或升级自己的思维模式、组织系统、商业赛道等)
  • 那次课里,老师说了一句话:真正的国学,绝不提倡直接出世,而是提倡先充分入世,再从中思考和发现出世的可能性。真正的佛家信徒更倾向于认为,唯有先成功入世者,方可真正出世。
  • (1)竞争是分不同层次的,成长也是。
    (2)在同一个操作系统下,你的成长一定会遇到天花板和瓶颈,就像一条“S型曲线”一定会趋于平缓甚至下滑一样。
    (3)到底是打补丁还是升级操作系统,在成长过程中,这注定是个问题。如果你的硬件基础尚不过硬,直接就装最新最复杂的系统,反而会走火入魔。

2.5 两条“一级成长曲线”与N条“次级成长曲线”

  • 你在技能曲线或是商业认知/系统思考成长曲线下的成长,背后一定是由至少一段或很多段具体的职业经历综合构成的。
  • 从更加微观而具体的层面来说,你的职业生涯早期,必然注重技能的精进,你需要在一段又一段的工作经历中增补或提升自己的具体技能,并力求在每一段职业经历中都让自己成为“头部选手”。
  • 只要你让自己持续处于这种状态中不断上行,也许某一天,你会发现,自己似乎已经来到一个全新的成长阶段——你的“商业认知/系统思考成长曲线”已悄然开启。
    就像我的“商业认知/系统思考成长曲线”,正是在我的第4条“次级成长曲线”——也就是第一次创业的过程中,伴随我遇到的各种命题和挑战而悄然开启的(如图2-13)。
  • 要想在职业成长这个充满束缚的游戏下更好地通关,你的最佳选择是两种:要么,你依靠某种技能成为一个业内顶级的、位于Top 3%-Top 5%的专家;要么你努力让自己成为一个优秀的商业操盘手。
  • 只要身处一个快速变化和竞争激烈的环境中,无论是一个行业、一家公司、一个产品、一类竞争模式的发展,还是一个人在一个特定岗位或环境下的成长,都会遵循“S型曲线”的规律——要么,它们不会成功,其成长发展过程呈现出一种杂乱无序的状态;要么,它们的成功遵循某种特定的范式,经历早期的缓慢发展、中期的快速指数级成长以及后期的增速放缓甚至衰退。
    ——
    3 你个人职业成长的最优选择,很可能是需要在3年左右的时间窗口内,找到自己可依赖的“成功范式”,进入快速成长期,让自己在这段职业经历中画出一条美妙的“S型曲线”,而不是呈现出一种杂乱无序的状态。
    ——
    4 头部效应就是你若在一个领域成为头部,你就能够在该领域得到最高价值的回报,或是拥有该领域最高的势能。相反,如果你无法在一个特定领域内成为头部,则你的整体竞争力在该领域将大幅削弱。

3.1 职业生涯早期,如何应对“不知道自己适合做什么”

  • 第一,想要拥有一个让自己足够确信的答案,你得具备两个基本前提。(1)你已经有足够多的实践,尝试过很多事情,知道很多事情是如何发生的;(2)在你做过的很多尝试中,至少有1~2件事已经能够做到七八十分的水平,比大多数人做得好。
  • 第二,换一个视角来说,我认为一个人要明确职业方向,往往源于这样一种感受:你觉得某件事,可能是非你不可的,是你必须回答的命题或必须做好的事情。
    这样的命题或事情,一般来自两个方向:
    (1)你曾经在某个地方或某一类事上受过很严重的伤,并且经历了种种努力后走了出来。于是,由于你受的伤足够严重,你很自然地产生某种强烈的念想——希望更好地帮助其他人也从这样的伤痛中走出来。即“是什么拯救过你,你就用它来拯救这个世界”。
    (2)你发现自己身上具备某种天赋,让你在某件事上明显做得比绝大多数人都要出色,能够创造出一些独特的价值,还能获得很多人的认可。于是你认为不应该辜负你所拥有的天赋。

3.2 职业生涯早期,如何应对“转行难”

  • 一个人从A行业转行进入B行业,往往会面临两类主要障碍——一是新技能的习得,二是思维方式、认知的转变和升级。
    前者,比方你想要转行做在线推广,但从来没有做过任何跟在线推广相关的事,包括文案、渠道开拓、数据监测和分析等,啥也不会。
    而后者,则比方你和一个朋友同样拿到了一个货要卖,你可能只能想到老老实实找渠道、线下发传单、电话销售等形式,人家却能想到一大堆比如线上社群合作分销、众筹、大V朋友圈背书,甚至是货本身以超低价格出售,然后再通过其他方式盈利等稀奇古怪的玩法。
    而这两个障碍,对不同状态的同学来说,要关注和解决的优先级事实上是很不一样的。
    通常来讲,我的建议是——
    假如你的工作经验在2年以下,自身尚不具备某项过硬的业务技能(比如销售、文案、策划等都可以视作业务技能,而“过硬”的意思就是你能通过该技能带来显著的业务成果)的话,你应该重视“新技能的习得”大过“思维认知的升级”。
    而如果你已经有了好几年工作经验,具备某项非常过硬的业务技能,或者自己能够独立负责一项小业务(比如已经是某个线下店的店长,负责门店整体收入),那也许你应该重视“思维认知的升级”大过“新技能的习得”。
  • 直接说几个原则性的东西——
    (1)如果业务技能还不扎实,直接进行大量“思维认知升级”的学习,很可能是没什么用的。就像当我们无法在“做到”上到达一个新的高度和临界点之前,我们“知道”得越多,往往越痛苦。
    (2)要解决“技能习得”的问题,必须花大量的时间进行实践和训练,而不能仅仅看一堆东西。如果你是一个大学生,看了《运营之光》100遍,却连一段文案都没练习写过,相信我,这本书不会给你带来任何实质性的帮助。
    (3)要解决“思维认知升级”的问题,关键可能在于你要进入一个高质量、高段位的圈子中进行高强度、高密度的业务交流碰撞,而不是依靠“看书”“看干货”。
  • 通常靠谱的方式有几种:
    (1)自己尝试着刻意练习并依靠自我学习进行突破。比如试着做出个几千粉丝的微信公众号。
    (2)尝试着参与到一个能给你提供实践机会的组织或团队中,义务为其劳动,并获得指导和反馈。
    (3)参与某个能够给你提供大量真实实践机会和高质量反馈的课程。
    一般来说,上面的(1)只适合极度自律或自我学习能力超强、学习速度超快的人;(2)有时可遇不可求;至于(3),则更适合大多数人。

3.3 工作0~5年,面对多个职业机会如何选择

  • 针对这样的“两难纠结型”选择,我总结了一套“4+4”方法,帮助大家思考和判断。第一个“4”是拥有“4个基本认知”,第二个“4”是叩问自己“4个问题”。我们先从“4个基本认知”说起。
    基本认知1:如第2章中所说,一个人的职业成长,有两条“一级成长曲线”,分别是技能曲线和商业认知/系统思考成长曲线,唯有第一条技能曲线达到一定高度后,第二条商业认知/系统思考成长曲线才会开启。
    而对工作5年以内的从业者而言,可能要优先考虑技能曲线,以此为切入点进行思考,然后再重点考虑商业认知/系统思考层面的提升。
    基本认知2:一个人在职业成长中,要想最终进入通关状态,终极出口只有两种,一是成为一名顶级专家,二是成为一名优秀的商业操盘手。
    基本认知3:“头部效应”无处不在。无论是短期在一家公司特定岗位上的发展,还是长期形成自己在整个行业内的竞争力,如果无法成为“头部选手”,将无法获得更大的收益,也会面临掉队的风险。
    另外,如果你真的很难做到在当前赛道中成为头部、赢得竞争,也许可以考虑向回一步,先退回到次一级、难度更低的二线战场中,成为一个毋庸置疑的头部选手,再携带二线战场所获得的头部势能,重返原有的一线战场。
    基本认知4(这是之前没有提到过的认知):在一个商业组织里,可能存在4类不同的业务部门,在0~5年阶段里,你面临的任何一个具体的职业,都会是这4类部门中的某一个。
    这4类业务部门分别是——
    (1)成熟核心业务部门。
    (2)探索型业务部门。
    (3)成长型业务部门。
    (4)非核心业务部门。
  • 所谓成熟核心业务部门,指的是在一家比较成熟的公司和组织内,构成业务最强壁垒和行业竞争力的部门,也往往能够直接影响公司生死存亡的部门。
    典型比如——
    » 百度负责搜索产品和商业广告产品的部门是百度最核心的两个部门。
    » 腾讯内部与社交关系链、广告有关的部门,或者用户和收入规模极大的游戏工作室等都可能是腾讯的成熟核心业务部门。
    大家必须理解一点:如果一家商业组织能够健康地发展起来,形成规模,那么在它的核心业务分支下面必然存在一套高技术含量的、较为复杂的工作方法和模型。
    比如百度的商业产品的架构、流量收入模型,或者其搜索产品的搜索结果排序算法、搜索关键词匹配策略等,都会是百度这家公司非常核心、非常有竞争力的东西。假使你进入类似这样成熟公司的核心业务部门,学习和掌握了很多这样的复杂工作方法和模型,那你在行业内将具备更高的价值和竞争力。
    第二类业务部门是探索型业务部门。
    一般来说,创业公司,或者负责大公司里的探索型项目或全新产品线的,都属于探索型业务部门。
    在一个探索型业务部门里,巨大的机会和风险会并存——如果一个探索型项目获得成功并发展壮大,作为早期成员的你一定能从中获得巨大的收益,但与此同时它也存在非常大的不确定性,甚至有可能在探索过程中,产品方向、业务模式等反复变化,这是探索型业务部门的常态。
    行业内,我们看到的探索型项目成功和失败的例子都很多,例如微信就是探索型项目成功的巅峰代表——但你可能不知道的是,在2012年前后,腾讯内部至少有6~7个团队都在做一款类似微信的产品,只不过其他几个团队最终都失败了而已。
    第三类业务部门叫作成长型业务部门。
    成长型业务部门其实是探索型业务部门的下一个阶段。就是说:相比探索型项目而言,已经形成了产品模型和业务模式的基础,当前需要解决的问题是快速增长,更关注增长速度和效率。
    如果以一个创业公司来看,处于A轮到B轮融资阶段的创业公司,大抵近似于成长型业务部门的状态。
    如果以大厂来看,2017年上半年字节跳动旗下的西瓜视频、火山小视频,或者2017年下半年到2018年上半年的抖音,都是成长型业务部门的典型。
    第四类业务部门是非核心业务部门。
    这一类部门在一家商业组织内,通常不直接对核心业务目标负责,一般工作压力不大,也比较稳定。
    同时也意味着,如果一家公司遇到困难或危机,需要裁员,往往第一时间对这样的业务部门开刀。
    举个可能不恰当的例子,比如支付宝或腾讯的公益频道(这并不代表公益不重要或没有价值),或者某些行政等职能支持部门,就属于这一类非核心的业务部门。
  • 我认为,在实际进行判断时,你需要逐次通过“4个问题”来帮助自己决策。
    问题1——
    你是否真的追求远超于其他人的成长速度,并愿意为此承受更大的压力?在这样的预期之下,你的短期现实生活压力如何,能承受的最低收入预期大抵处于什么水平线?
    这里你必须理解,如果你想找一个收入很高、成长空间很大、有很好的领导带你、公司也很知名、工作机会稳定,其实可遇不可求,或者说,概率不高。
    所以,千万不要因为在网上看到有人找到了这样“完美”的工作机会,就以此为标准来要求自己。
    相反,你需要理性一点,做好准备:如果成长速度、空间、收入、公司品牌等几者不可兼得,你自己选择和判断的优先级到底是怎样的。
  • 问题2——
    你觉得自己是否具备极强的野蛮生长能力?
    我们该怎么判断一个人是否具备极强的野蛮生长能力?
    我的经验是,你可以思考:假设你接手了一个你从来没有做过的事情,只有一个模糊的目标,没有清晰的达成路径,也没有人系统地指导你,在这种情况下你是否能找到各种办法和途径去学习、借鉴、模仿,然后在推进这件事的过程中变得越来越好,越来越强大?
    假设答案是Yes,大概率你是一个野蛮生长能力很强的人。
    如果答案是No,可能你的野蛮生长能力就弱一些。
  • 你是否已经拥有一个明确的长板职业技能,或你是否已经有了明确的职业方向(例如什么行业、什么岗位等)?
    一般来说,如果某一项技能,你觉得自己比其他百分之七八十以上的人都要强,工作起来更高效,产出也更显著,它就可以被视作你的长板职业技能。
    假如你已经有这样明确的长板职业技能,你面对职业机会的选择和决策时,应该尽量围绕怎么进一步加强或者放大自己已有的长板来展开。
    道理很简单:把这一长板发挥到极致,你更有机会成为一个小领域的头部,从而为自己收获更多的红利。
  • 问题4——
    你更希望最终成为一个顶级专家,还是成为一个业务管理者和商业操盘手?在这个问题上你是否有明确的倾向?
  • 作为一个工作0~5年的人,面临很多职业机会时,为了做出更优、更适合自己的选择和判断,你可以逐次问自己这样几个问题——
    (1)你是否真的追求远超于其他人的成长速度,并愿意为此承受更大的压力?在这样的预期之下,你的短期现实生活压力如何,能承受的最低收入预期大抵处于什么水平线?
    (2)你觉得自己是否具备极强的野蛮生长能力?
    (3)你是否已经拥有一个明确的长板职业技能,或你是否已经有了明确的职业方向(例如什么行业、什么岗位等)?
    (4)你更希望最终成为一个顶级专家,还是成为一个业务管理者和商业操盘手?在这个问题上你是否有明确的倾向?
    在上述4个问题都有了更明确的答案后,你的选择可能会更加清晰。
  • 我认为这样的“黄金”职业机会可能有3种——
    (1)如果你能找到一个你特别信赖和认可,无论在视野、技能各方面都远胜过于你的人,他还愿意手把手带你,那这类机会值得你选择。
    (2)如果你有机会去一个很成熟、知名的商业组织,到它的核心业务部门中了解和学习其中非常有技术含量、非常复杂的一套工作方法和它的整个体系结构,这也是一个超级有价值的机会。
    (3)如果有机会加入一家已经走入正轨、开始高速成长的公司或业务部门(类似2018年的抖音),即便你自己啥也没想清楚,也极大概率可以获得这家公司或这个业务快速成长带来的红利。

3.4 如何超越那些早期职业起点远高于你的人

  • 第一种机会,是选择进入一个伴随着新技术、新模式而出现,短期发展还完全不确定、甚至有些混乱无序的全新行业里,只身承担各种不确定风险,去换取随着这个行业的快速发展和在行业内接触到更多高质量信息来源、先进的工作方法而为自己带来的成长加速度。

3.5 成为一个顶级专家或优秀商业操盘手的具体路径

  • 成为一个顶级专家的路径是比较明确清晰的。首先,你找到某项技能或称手艺,是你特别喜欢或擅长的,并且,你这项技能的学习能力,至少不比大多数人差。然后,你需要做的就是不断精进,让自己从一个新手一步步成为顶尖高手。
  • 首先第一关,你需要在该项技能上超过50%的人,成为中等以上水平——一般来说,只要你在某项技能上拥有属于自己的方法论,做出还不错的业绩,不输于行业平均水平就可以了。
    要想闯过这一关,你只需要投入大量时间,系统地研究和学习行业内的成熟高手,找到可遵循依赖的方法论,然后进行大量的刻意练习,巩固自己的技能就可以了。需要注意的是,在这一阶段,选择什么方法论不太重要。一个领域内方法论可能有很多流派,就像营销领域,讲定位的是一派,华与华方法可能又是一派;运营领域里,可能三节课的方法是一派,那些专门玩流量的又是一派,诸如此类。对一个新人来说,选择哪一派并不重要,重要的是,你选了一派自己认同的方法论后,最好能够深入地研究它、了解它,并充分实践、内化、吃透,让自己做出足以胜过大多数人的东西。特别忌讳的是看了一大堆不同流派的经验或者方法,但哪一派都理解得不透不深,也没有做太多实践和刻意练习,陷入“看了听了一大堆,却发现然并卵”的状态。
  • 一般来说,度过这个阶段最常见的方式有两种,要么你进入一家公司,有很多问题要解决,也有个有经验的前辈愿意认真带你;要么你找到了行业内的前辈或高手系统总结提炼后的课程、书籍或其他学习素材,你通过参加课程、研读书籍并付诸实践等方式让自己度过这一关。就像是在产品经理、运营、新媒体、营销等领域,三节课的课程已经比较体系化了,口碑也不错,可以把它作为一个你的选择。
  • 接下来,是第二关——你要在这个领域内超过80%以上的人。
  • 成为头部的20%需要什么?我的答案是:你需要一份被大部分人认可的代表作。如果你是做销售的,你需要拿下某个重要的客户;如果你是做设计的,你需要有一份能拿出手的作品案例;如果你是做裂变营销的,你需要做出来一个至少在小范围实现刷屏和显著增长的案例;如果你是写文案的,你需要写出一份赢得广泛传播或是售卖转化效果特别好的文案。
  • 再接下来,是第三关——从Top 20%跻身Top 10%。
    如果你已经依赖自己的代表作成为Top 20%的选手,要想继续往前走,你要想办法与这个领域大家公认的顶尖高手建立连接,与他们进行交流,并从他们身上学习大量经验和心得,让自己成长得更快,在继续前行的路上获得很多高手的赋能。
  • 再往上,成为Top 5%的选手,你就要通过不断地实践和创造,在整个行业内拥有更大影响力和更具有穿透力的代表性案例,无它。
  • 如果你想管理和操盘整个系统的运转,甚至重新定义和设计整个系统的结构,你得熟悉整个核心模块的逻辑、构成,知道它们是如何运转的。在一家公司内也是这样,要想成为一家公司的操盘者,你必须知晓这家公司所有的核心业务模块是如何运转的,有哪些关键节点,风险和机会往往来自哪里等。
  • 所以,一定要意识到,如果你的目标是成为一个商业操盘手,那你要选准一个行业,先从某个业务环节切入,在一家或多家同类公司通过轮岗、谋求新的职业机会等方式熟悉多个业务环节,慢慢成为一个业务模块的负责人,再然后,继续通过轮岗或参与重大项目等方式深度了解和熟悉多个业务模块的运转,进行更宏观和整体的思考,慢慢懂得如何经营一家公司。

3.6 如果在某个职业成长赛道中“失败”

  • 如果想在某个领域成为一名头部选手,一个人必须具备两个前提条件——
    (1)你已经具备某些在该领域获得成功的独特能力或经验。注意,“独特”是指你身上的某些能力或经验,或者你创造的价值,是有点“稀缺”的——这个世界上,稀缺的东西才更有价值。
    (2)你清晰地给自己定义了一个竞争赛道,在这个赛道充分发挥你的长板能力。
  • 只要你积累的经验和成果足够多,这些实践、经验和成果汇总到你身上后,必然凝结成为某些只属于你的独特优势和机会。你也必然伴随着实践和积累的增加找到某些你能干得比其他人更好的事情。
  • 经过漫长而深刻的思考,交了无数学费后,傅盛有了几个含金量特别高的答案——
    (1)与其竞争,不如不同。
    (2)在一个不断演化的世界中,一个人过去的成功和成就,一定有其局限,甚至可能成为其未来沉重的包袱。
    (3)在竞争特别充分的领域,更好的战术是:以点带面,单点爆破。赢得破局点,才更可能赢得整场战争。
  • 希望你在读完本章之后,脑海中属于自己的职业成长之路,越发清晰起来。
    1 如果你刚进入职场,又缺乏明确的职业方向,我对你最大的建议就是:不妨先聚焦在某一两件至少你不那么反感的事上,先不管不顾地努力让自己做到七八十分的水平,并在此期间尽量多尝试和接触一些新的工作内容,这样,你才能慢慢对自己形成更清晰的判断。
    ——
    2 如果既没有职业目标,也不清楚职业方向,可以先让自己大量补充一些通用能力的缺口,增加自己身上的多面手特质。类似写作、结构化表达、PPT、Excel、演讲、高效召开会议、活动组织与执行等,应该算得上横跨绝大部分职业的通用能力。
    ——
    3 珍惜和利用好职业生涯的前五六年,迅速完成一些基本积累,并谋求进入那些具备跃迁式成长机会的赛道中去打拼、努力和发展,而不是等到自己已经工作8~10年、陷入职业瓶颈和困境后再来感慨生活不易、人生艰难。
    ——
    4 如果你的目标是成为一个商业操盘手,那你要选准一个行业,先从某个业务环节切入,在一家或多家同类公司通过轮岗、谋求新的职业机会等方式熟悉多个业务环节,慢慢成为一个业务模块的负责人,再然后,继续通过轮岗或参与重大项目等方式深度了解和熟悉多个业务模块的运转,进行更宏观和整体的思考,慢慢懂得如何经营一家公司。

4.1 系统思考能力的价值与习得

  • 系统有大有小,但任何一个系统必然存在着——
    (1)该系统的特定功能和目标。
    (2)某种特定的系统结构。
    (3)诸多相互影响的系统要素。
    (4)系统运转中的各种约束规则。
  • 系统思考能力到底该如何提升?
    我的个人经验和建议是——
    首先,你在一个领域内要有足够丰富的实践,并能够熟练解决各类单点技能问题。
    如果你在一家互联网公司负责用户增长,却连基本的“转化率如何提升”“怎么写文案更能吸引用户”“用户留存率比较低该如何分析”都没有实践过,也完全不知道如何思考,那么当你拿到“如何为一款产品搭建一个增长体系”这样的命题时,注定是懵的。
    其次,在对应问题面前,你要能够看到并深刻理解一类已经被验证行之有效的系统模型,并用它理解和思考部分问题。
    好比在用户增长方向,AARRR模型就是一类非常经典、被无数公司使用并验证过的模型。你先充分理解它,并通过它思考如何为一款产品搭建增长体系。
    再次,你也需要在同一个领域或同一个问题下,看到更多相关的系统模型,或者是来自其他专家或高手理解的系统模型——在同一类问题面前,不同的高手有可能拥有完全不同的思考体系。
    在这一过程中,你还要不断深入去思考更多系统模型之间的关系、差异,以及背后的原因,只有这样,你的系统思考能力才能逐步提升。
    好比在用户增长领域,当你已经深刻理解AARRR模型,你应该看到更多类似RARRA、用户金字塔、RFM分层等相关模型,并不断结合各种案例思考它们之间的关系和差异,只有如此,你才能慢慢在脑海中形成类似的认知——
    » RARRA和AARRR是一类用户增长模型,本质上是因为一家公司的业务逻辑不同,决定了其适用增长模型的不同。
    » 任何一家公司,随着其用户行为的丰富和用户体量的增加,想要获得更大的增长,必然需要精细化运营,也就需要进行用户分层运营,而用户金字塔和RFM就是最常见的两类用户分层运营模型。
    在任何一个领域,你只有在以上过程中反复实践和自我修炼,才能获得系统思考能力的提升,全无捷径。

4.2 商业世界中的两种高质量思考习惯

  • 我们已经提到,任何一个系统都有如下分支构成——
    (1)特定的功能和目标;(2)特定的系统结构;(3)诸多互相影响的系统要素;(4)系统运转中的各种约束规则。
    若把“商业竞争”看作一个系统,它的目标就是让所有公司和个人在充分遵守各种商业竞争规则(即约束规则)的情况下,通过制定自己的竞争策略,合理执行并赢得竞争,获得收益。
  • 第一种思考习惯是:始终关注价值,而非具体问题的执行路径、难度和过往经验。
  • 不要把思考的焦点放在“这件事有多难被解决”上,而是以“这件事的背后有多大价值,到底值不值得我们投入足够的时间和精力去解决”为思考原点。
    只有这样,你才有机会去解决那些“价值更大”的问题,并从中获得更大的收益。
  • 2.降低成本,提高效率
    第二种思考习惯是:始终思考和关注现有工作流程及业务链条中效率可以提升2倍以上的可能性和机会。
  • 在我们的实际工作中,不是每个人都会关注那些“现有工作流程及业务链条中有机会把效率提升2倍以上”的事,相反,大部分人都在被动地等待接收命令。
  • 而对于形成了类似思考习惯的人,他们总会在工作中关注那些效率低下的事,也总会主动关注和思考是否有改善的可能。
    如果你总是带着这样的思考看待工作,一定会发现有很多效率低下的问题。
  • 第一,当你面临一件事要不要做,或者遇到某个问题很难被解决的时候,要优先关注“事情被解决后的价值有多大”,而非具体问题的执行路径、难度和过往经验。
    第二,要始终关注和思考现有工作流程和业务链条中各种效率可以提升2倍以上的可能性和机会。
    如果能把这样两个思考习惯从认知内化为自己条件反射式的习惯,并在实践中不断深化对它们的理解,我相信一定能够带给你巨大的收益和帮助。

4.3 商业环境中的“竞争策略三级思考法”

  • 我想至少给你一个足够简单的小工具,让你具备最简单的系统思维,并开始有意识地发现和遵循一些底层规律,思考得更加全面和长远,为自己制定更好的竞争策略。
    这个小工具,姑且叫“竞争策略三级思考法”,如图4-6。

    图4-6
    按照“底层逻辑—中层机制/规则—上层打法”的三级层次来描述这个系统的结构,也许没有那么严谨和完善,但对于初步建立系统思维的朋友而言,易于理解,也更能指导你的思考和实践。

4.4 如何向顶尖高手学习,提升制定策略的能力

  • 而用户运营方面,乐纯则遵循着一个“1-9-90”模型来开展所有工作。我觉得“1-9-90”模型几乎适用于所有的品牌。无论你做什么样的产品,你都会发现你的受众目标最终可以被分成1%、9%和90%这三个人群。
    简单而言,就是培养1%的“死忠粉”和重度参与者,让9%的人与你持续互动并深度认可你,然后寻找效率更高的方式服务好90%的人。
    一般来说,任何一个品牌在刚刚起步时,有可能大部分用户都是1%的“死忠粉”,但是到了一定体量之后会有一个非常稳定比例的分层,就是1%,9%,90%。
  • 最终,1%的人会跟你一起研发产品,创造很好的内容。9%的人会经常分享,你推了好的内容他会转发到朋友圈,买了你的东西他会去晒。但是真正为你贡献最多收入的用户还是90%,他们只是买买买,是你的品牌最终服务的用户。

4.5 如何预见未来,面对极度激烈的竞争环境做出高质量决策

  • 傅盛多次提到他相信两个非常重要的事——
    (1)只要把规律想清楚,至少创建一家价值一百亿美元的公司是可以用方法论和公式推演出来的。
    (2)一件事的成败,战略是否领先决定了80%。
  • 战略=(方向×10)×执行力
  • 对这个公式的基本解释是:执行力是战略的一部分,但好的战略,无须依赖好的执行力。
  • 傅盛给出了自己方法论中的一个核心组成部分。
    预测—破局点—倾尽全力,这是傅盛的战略制定三段论。
  • 一个较优的预测方向是:你能创造一个缺少竞争者的新市场,且这个新市场中你有很大的机会成为垂直领域的第一。预测完后,就用侦察兵模式进行快速验证,看看这个方向是不是真的往下一打井,很快就能出水。
  • 而傅盛认为,好的破局点,满足3个特征:极简、差异化和自增长。
  • 傅盛认为,对事的管理,本质上可以回归到3个词——目标、路径、资源。
  • 当对事物有了全面深刻的认知之后,目标应该足够简单,足够聚焦。
    简单意味着说出来所有人都很容易理解,能够迅速达成共识,只有这样的目标才易于向全员传递。比如,“完成一个品类的全面建设”不算是一个足够简单的目标,而“做一堂半年内超过30000人付费报名的爆款课程出来”更像一个比较简单的目标。
  • 聚焦则意味着一段时间内,目标是唯一的。目标如果无法聚焦,路径和资源也很难聚焦,很容易形成撕扯,举步维艰。一旦无法聚焦,一个人很容易做出一种“每个地方都买一点保险”的决定,但这往往是最糟糕的决定。
  • 找到一个明确、简单、聚焦的目标,接下来就是想清楚实现路径。
    目标和路径之间,互为因果。有了明确的目标,才能推出来路径,而在路径上的执行动作和资源投入全部到位,才能支撑目标的达成。
    围绕一个目标,路径的拆解要足够细致,要知道大目标由哪几个子目标组成,这些子目标之间有无先后依赖关系,以及每个子目标下的关键动作和手段是什么。
    所以,定目标时要做减法,有了目标想清楚实现路径时需要细致地做加法。
  • 总体而言,傅盛的观点是:让管理变得更有效率的方式就是减少管理的量,增加判断的量。他相信,有时候,执行难的本质往往是源于我们没有做出足够正确的决定。
  • 因而,一个优秀的管理者,要不断去假设:如果只花一半时间,事情能不能变得更好?然后再不断验证假设,在这一过程中找到更优解。
  • 对于前者,需要确保自己接触到的信息足够优质、有效;至于后者,假如你已经是一个管理者,尽量让自己在做思考、决策、对外获取有效信息的时间大于60%。
  • 时间的投入方面,如果你对自己所处的领域还不具备全面的认知和判断,就应当优先解决这一问题。如果你在自己所处的领域上获得了较为全面的认知,则需要定期了解行业动态,从一些不同领域的关键人处获取一些关键信息,让自己可以不断预见未来,做出更优质的假设和决策。
  • 傅盛的哲学是,越是身处绝路,越要不断向外看,获取更先进、更前沿、更具有差异化的认知。因为既然已是绝路,很可能内部已经无解。
  • 认知,几乎是人和人之间唯一的本质差别。技能的差别是可量化的,技能再累加,也就是熟练工种。而认知的差别是本质的,是不可量化的。
  • 但我觉得如果是放眼到所有人来看,这里还需要区分。
    第一,可能只有5%的人能进入“通过比拼认知来进行竞争”的状态,绝大部分人的执行能力之差,可能根本谈不上拼认知。甚至如果你的执行能力不到位,认知越升级,你可能越焦虑,因为你没有足够的能力消化和践行这些认知,于是认知就变得毫无意义。
    因此,对于95%的人来说,或许应该优先关注能力的提升。而对5%的人来说,的确如傅盛所言,比拼认知可能是第一位的。
    第二,认知往往意味着对一个复杂事物的全面理解。一个人的高质量认知,很可能来源于充分的实践。就像一个人如果没有在教育行业里认真做过2~3年营销、课程研发和服务,很难彻底理解教育这项业务的一些本质。
    第三,即便一个人进入认知升级的轨道,真正的升级也必须依赖“优质的信息输入和思考沉淀”、“不断面对和解决大量复杂问题,践行和验证新认知”二者的结合,缺一不可。
    综上,对于傅盛的认知升级论我想做一点补充——
    » 认知升级的前提是知行合一,如果你尚无法做到,必须优先补充行动能力。
    » 在未建立起较为全面、能够让你看到一些规律和未来的认知之前,优先补充和提升自己的实践能力及经验,并不断反思,之后再更多地关注先进优质的认知。

4.6 顶级高手进行复杂思考和决策背后的简单法则

  • 张小龙决定微信朋友圈不做硬广告、决定微信群的界面和按钮设计、决定微信小程序怎么做、微信公众号怎么做,很可能都来自“好产品不应该长期无效占用用户的时间”这样一个基本价值判断原则,并在一些商业法则之间综合考量进行的决策。
  • » 稳定的需求、稳定的解决方案、可预期的收益空间,才能支撑一个新行业或一个新模式的持续存在。
    » 产品价值=(新体验-旧体验)-换用成本。产品价值成立,一个产品才有发展壮大的可能。[4]
    » 任何一个商业组织或商业产品,必然存在追求更大收益回报的动力。商业能力不够强大的组织,将很可能被其他组织吞并。

4.7 通过系统思考“向外”寻求成长

  • 1 所谓“系统思考能力”,是一种整体性的思考方式,要求你从一个系统的目标、整体结构和各种系统要素中思考,最终寻找到一个围绕实现目标的最优解。
  • 2 商业世界中的两种高质量思考习惯:
    第一种思考习惯是:始终关注价值,而非具体问题的执行路径、难度和过往经验。
    第二种思考习惯是:始终思考和关注现有工作流程及业务链条中效率可以提升2倍以上的可能性和机会。
  • 3 商业环境中的“竞争策略三级思考法”:
    第一个问题——所在的行业/业务有哪些基本规律?
    第二个问题——你所处的平台/生态内有什么竞争规则/常见玩法?
    第三个问题——你面对怎样的竞争对手,有什么机会或优势?
  • 4 在商业环境中如何做管理:
    一是对事的管理,本质上可以回归到3个词——目标、路径、资源。
    二是对人的管理,要学会识别关键人,搞定关键人,赋能和授权给关键人。让管理变得更有效率的方式就是减少管理的量,增加判断的量。他相信,有时候,执行难的本质往往是源于我们没有做出足够正确的决定。
    三是对自己的管理,一是管理自己接收到的信息,二是管理好自己的时间。如果你已经是一个管理者,尽量让自己在做思考、决策、对外获取有效信息的时间大于60%以上。

5.1 解读所谓“心性成长曲线”

  • 在公司的经营和对外表达上,更应当克制,恪守“行胜于言”,在自己做得尚不足够好之前,减少妄言。

5.2 一个人的内在成长——打破边界和建立边界

  • 假如你认为自己“无所不能”,那你该如何选择,又该如何与团队内其他人共处?
  • 这些“不断打破边界,发现自己的可能性”,以及“不断建立边界,明确自己的使命和局限”的过程,也许正是一个人内在心性成长的过程。

5.3 心性成长曲线下的终极命题与3种修炼

  • 他还曾经有一句名言,那就是:“面对一件不满意的事情,有三种选择,一是忍耐,二是走掉,三是去改变它。”

5.4 我的心性曲线成长之路

  • 但是,打破边界这种事,并不是绝对真理。要知道,人性,有贪。假如一件事可以持续给你带来正反馈,慢慢地,你面对它的态度和立场就会倾向于变成一种无节制的索取。
  • 以往,我的世界里,一是得失成败,二是个人成长,三是目标使命,有且只有这三个维度,并倾向于认为,三维世界就是全部。而到了将近而立之年,看得多了,知道得也多了,开始发现更多以前看不到的东西,开始知道,三维也只不过是这个世界的一个局部而已。三维之上,还有众多维度等待着我去发现和体验。
  • 我相信,每一段重要或杂乱的经历,都会给自己留下诸多牵绊,只有认真完成了一些思考,才能与那些过去挥手作别,此后心无旁骛,既往不恋,纵情向前,重新启程。
    恰如苏格拉底所言:没有检视的人生不值得活。
    又恰如一句谚语:一个人或一个组织,只有充分理解了自己的过去,才更容易清晰地知道自己未来该向何处去。

6.1 应对不确定性的两种武器

  • 比如,在看待很多公司和产品的发展上他都会回归到这样几个基本问题上来——
    » 这是一类怎样的需求?是否刚需?用户决策成本是高是低?使用频次是高是低?
    » 核心产品或服务是否已经标准化?如果还没有,距离标准化还差什么?
    » 当前市场上供需两侧的情况是怎样的?市场格局最终是垄断型的还是松散型的?
    » 该类产品可能的壁垒在哪里?目前行业内的竞争态势是怎样的?
    有了这样一套规律和逻辑后,他开始运用这些逻辑进行实践,对大量市场和产品的发展进行预测,并不断与人交流,或在实践中获得反馈。在这个过程中,他发现自己对于很多问题判断的准确性逐步提升。
  • 其一,向外看,付诸理性思考,发现这个不确定世界中的局部基本规律,通过系统思考和专业主义,让很多事情变得可控,让自己拥有依赖一些基本规律对复杂系统推演和预估的能力。
  • 其二,向内看,回归内在的信仰、热爱和坚持,让自己成为一个即便身处复杂环境,仍可保持内心稳定的能量体。一旦内心足够坚定强大,能量充盈,你将在内心深处获取“无论外面风吹浪打,我自岿然不动”的稳定能量,从而天然拥有某种独特的确定性。
    无论是向外看还是向内看,本质上,都离不开理性和思考。这也正是个人可以对抗不确定性的根本。
  • 我猜,这也是为何帕斯卡会说:“人是有思想的芦苇,我们的全部尊严,就在于思想。”

6.2 以“系统思考+专业主义”应对不确定性

  • » 要学会用好各种模板。比如在三节课,我们有关于一个项目立项的模板、对一个复杂议题进行思考和讨论的模板、对一个岗位进行工作复盘的模板等。这些常见模板可以保证大部分团队成员很快在文档使用方面上手,提升协同效率。
    » 作为团队负责人,只要做好表率,比如自己先做一个完整清晰的文档同步给大家,让大家感受到通过文档进行信息同步的好处。大家只要尝到甜头,使用文档的动机就会迅速提升。
    如果“不会做”的障碍与“没有动机做”的障碍都解决了,剩下的,作为管理者只需要提要求并做好赏罚就好。
  • 在三节课,经过一小段时间的摸索后,我们总结出来一套行之有效的“远程协作业务管理三板斧”。它能够做到:让一个CEO或一个部门的负责人,一周只需要2~3次核心会议,就能做好整个团队的目标管理,并确保业务进展顺利。从而让中高层管理者把时间聚焦在重要的思考和决策上。

6.3 以“内在坚守和热爱”对抗不确定性

  • 美妙人生的关键在于你能迷上什么东西。