date: 2019-02-03 13:14:12
title: 图灵社区| 奔跑吧, 程序员: 从零开会打造产品/技术/团队
想法
- 如果要推荐一本类似 一次读完一百本商业经典 这样长青畅销书, 这本 奔跑吧, 程序员 绝对适合对 科技创业领域 感兴趣的读者.
- 想见恨晚: 2018所有的纠结和愤懑, 如果能早一点看到这本书, 至少可以扫掉一半!!!
书籍推荐:
- 进化: 从孤胆极客到高效团队
- 用户思维+: 好产品让用户为自己尖叫
- 学习敏捷: 构建高效团队
笔记
对,这就是想象世界和真实世界的差别。
第一,产品。怎样选择合适的点子,怎样把它打造成产品,怎样验证产品的有效性和价值。第二,技术。怎样选择技术栈,怎样设计架构,怎样交付。第三,团队。怎样组建和激励团队,怎样找到靠谱的创业团队,怎样持续学习。
创业圈流行一句玩笑:就缺一个程序员了。那我们程序员创业缺什么呢?
那个页面差不多花了“两个小时”才加载完
工作面临的主要问题与其说与技术有关,不如说本质上属于社会学的范畴。
创业与人密不可分
这就好比被铁链锁在柏拉图洞穴中的囚犯
有效的复杂系统一定是从有效的简单系统进化而来的。
伟大的公司是进化而来的
速度制胜
创业公司的目标在于快速增长
创业公司是一个暂时性的组织,目的在于寻找一种可重复、可扩展的商业模型
,创业公司的最后一个要素就是它们是按探索模式运作的
你应该把硅谷当作一家大公司,
停滞不前是在大公司工作的一个普遍问题
在小公司工作,通常会拥有更多的自主权
你会感到和公司的使命联系得更加紧密,更能提升你的使命感。
创业也可以让你更加具有掌控力
综上所述,自主权、掌控力和使命感是激励人的三个最强有力的因素
我还过考虑过把这本书命名为 How to Never Pay for a T-Shirt Again
换句话说,创业是一种 99.9% 都是困难、一点都不浪漫的工作。
创业就是牺牲
金手铐
追赶救护车的人
。在某种程度上,每个人都已经是创业者。亚当 • 斯密写道,每个人“在一定程度上都是商人”,你是在把自己的时间、知识和资源出售给他人,无论是他人的公司还是自己公司的客户
他们认为创造力和大多数超能力一样,具有二元对立的属性——要么拥有,要么没有。
在这一章,我希望能够让大家相信,创造力也是一种可以学习的技能。
Eureka
这一节更是如此,因为它的内容大部分借鉴 Everything is a Remix系列视频和《好点子都是偷来的》一书。
模仿、转换与合并已经深深地根植于每一个生物体当中。
最有效的一个策略就是努力成为一名 T 型人。
专才
通才
单词或语言是书写和交谈用的,在我的思考机制中似乎不发挥任何作用
事实上,我们对用潜意识阅读
的训练已经炉火纯青,你不用它甚至都不行了。
多重发现(multiple discovery)
那么,什么样的环境可以激励人们产生新的点子呢?因人而异,但最常见的要素有这么一些: 给自己充足的时间; 记录点子日记; 解决问题; 放下工作; 添加约束; 寻找痛点; 与他人交谈。
真正吸引竞争者的并不是点子,而是点子受到广泛关注。
虽然这里用了防御性这个词,但我想表达的是,一个出色的商业点子应该具备某种差异性,可以让你和竞争对手之间产生巨大的差距
。创业是成千上万次地重复“发现问题 - 想出点子解决问题 - 执行这些点子”的过程。
转型
快速失败
创业跑道
速度制胜
频率制胜
博伊德法则:迭代的速度会打败迭代的质量
无论是博伊德法则、速度制胜、敏捷还是精益,它们背后的基本理念都是:我们有一些设想是错误的。问题是,我们不知道哪些是错误的
完成比完美更好
如果你第一次发布的时候没有感到尴尬,就是产品推出的时间太晚了
客户开发
第一步:验证问题
第二步:验证 MVP
第三步:验证产品
下面,我会列出评估市场规模的几种方法。 广告
竞争
社区
市场研究和报告
产品数据
与真正的客户交谈
可行性
Gower 的数学知识图示,“有用”和“无用”的知识是无法区分开的
创造力并不是一种天赋,它只是一种行事方式。
他们所能确定的只是可以把事情做好——或者尝试去解决某些存在的问题。
在顾客看来,界面就是产品。
冰山的秘密
所以,这个秘密就是大多数人并不清楚这一点。
设计不仅仅是看上去的样子,还关乎它如何使用。
设计是迭代的
以用户为中心的设计
无论从哪方面来看,问题跟踪软件都比便利贴要好,只有最要紧的一个方面除外:帮助人实现目标。
以用户为中心的设计应该纳入我们的产品开发过程中,下面是它的五个基本原则: 用户故事; 人物角色; 情感设计; 简单; 可用性测试。
每个人都会对“一种产品如何工作”形成自己的概念模型。
有个老笑话说,“我用 Vim 两年了,主要因为我不知道怎么退出”
最常见的设计错误就是把用户的目标(他们要实现的是什么)和任务(他们可以如何实现)混淆了。
与此同时,苏联人使用的却是铅笔。
一些设计使得错误几乎不可能发生
除了要对错误的状态进行处理,还要确保设计能够处理空白状态
但现实中很多人关注的问题都属于棘手的问题——还没等真正理解问题之所在,就必须先找出解决方案。
焦点小组的目标是了解人们如何看待某个点子或某种产品,而可用性测试的目标则是了解人们如何使用你的实际产品去完成特定的任务
这些基本的视觉设计技能和技术分别是: 文案; 设计重用; 布局; 排版; 对比与重复; 颜色。
布局有一个要点就是亲密性,元素之间的亲近程度表明它们在逻辑上是否相关联。
布局的另一个关键因素是对齐。
行宽是指每一行的长度
行距是行与行之间的垂直间距
字型(typeface)就是字母的设计。
我们可以为某种字型应用不同的样式
字型和样式的某种特定组合就称为字体(font)
行为召唤(call to action,CTA)
最好的方法就是实现所谓的最简可行产品(minimum viable product),或者叫 MVP。
我们可以把 MVP 的实现归纳为以下几点: (1) 找出风险最大、最重要的设想; (2) 把这种设想以一种可测试的假设描述出来; (3) 构建一个最小的实验(一个 MVP)去测试你的假设; (4) 分析结果; (5) 用新发现去重复第一个步骤。
产品最重要的一点就是差异性:让产品和其他替代品区分开来的特性
竞争优势
在《创新的扩散》一书中,Everett Rogers 把客户分成了 5 种类型。
Steve Blank 把这样的客户称为早期传教士
用户界面就像讲笑话,如果非得解释清楚,就不那么好玩了。
有几种类型的指标是所有公司都需要跟踪的: 获取(acquisition); 激活(activation); 留存(retention); 推荐(referral); 收益(revenue); 神奇数字(the magic number)。
客户生命周期价值(customer lifetime value,CLV)
数据驱动开发
A/B 测试
对比测试或分桶测试
上帝情结(以为自己无所不能)
开发设计的时候要坚定你在做正确的事,阅读数据的时候要提醒自己可能会出错。
我们使用数据是为决策制定的过程提供信息,而不是替代这样的过程。
业公司最常见的 4 种营销渠道: 口口相传; 市场推广; 销售; 品牌化。
独到之处
引人注目
ow to Get Your Ideas to Spread
冷启动问题
网络效应
病毒系数(又称为病毒因子)
循环时间
让产品进入病毒式循环
直接营销
搜索引擎优化(search engine optimization,SEO)
集客营销
推播式营销
说服别人使用你的产品,就像影片《华尔街之狼》说的那样:试着卖给我这只钢笔
自动化销售
内部销售
外部销售
品牌化
“做人们想要的东西”(make something people want)。
营销就是如何让某种东西成为人们想要的。
应该在把选择技术栈的黄金法则记在心中。
好的技术栈的扩展要快于需要进行的维护。
技术栈的进化
一个能够立即实施的出色的技术栈,好过一个下周才能运用完美的技术栈 2。 2这句话是对巴顿将军的致敬。
暂停所有的发展、在全新的技术栈上重写代码要冒巨大的风险。这种情况被称作“所有软件公司都可能犯的单一的、最糟糕的战略性错误”和“创业自杀”
渐进主义
但并不是所有“小步骤”都是生而平等的,所以要警惕错误的渐进主义。
内部实现、购买商业产品,还是使用开源产品
要花大量时间,但开源和商业领域已经有很好的方案,那么作为创业公司,就永远不要自己去实现这些技术。下面列出了部分这样的技术。 安全:加密、密码存储、信用卡存储。 Web 技术:HTTP 服务器、服务器端和客户端框架。 数据系统:数据库、NoSQL 存储、缓存、消息队列。 软件分发:版本控制、构建系统、自动化部署。 计算机科学:基本数据结果(映射、列表、集)、排序算法。 处理通用数据格式的库:XML、HTML、CSV、JSON、URLs。 实用库:日期 / 时间操作、字符串操作、日志记录。 操作系统。 编程语言。
编程范式
面向对象编程 面向对象编程(object-oriented programming,OOP)尝
OOP 鼓励信息隐藏的方式有助于减少耦合
函数式编程语言尝试将世间万物用函数的求值来建模。和 OOP 编程不同,它着重限制了可变数据和副作用的使用。
动态类型语言
静态类型语言
自动内存管理
垃圾回收(garbage collection,GC),即定期运行收集器去扫描所有已分配的内存,对不再使用的内存进行回收。
适用问题
理论上来说,所有现代编程语言都是图灵完备的,所以它们都是等价的。在实践中,一些编程语言解决起某些类型的问题,比用其他语言更方便
全局解释器锁(Global Interpreter Lock,GIL)
虽然编程语言的性能很重要,但对于大多数创业公司来说,程序员的性能才是更大的瓶颈。
但是库和框架之间的区别是什么呢?通常的答案就是控制反转:
好莱坞原则
择库还是框架通常都不是问题,问题是选择最精简的框架还是选择全栈框架。
化 CRUD 应用程序(即在关系型数据库上执行基本的创建、读取、更新、删除操作的应用程序)
无逻辑(logic-less)模板
视图逻辑(view logic)
I/O限制
CPU、内存限制
要部署代码,我们必须先解决如何构建、配置和监控的问题。
因为这不可能是后期再加入的功能,所以框架必须是默认安全的
不要用纯文本存储密码。
SQL(Structured Query Language,结构化查询语言)
模式使得关系型数据库可以实施各种完整性约束
关系型数据库可以对任意一列创建索引,甚至还可以对多列创建复合索引,
许多文档数据库甚至还支持对文档内的字段进行索引,就是所谓的辅助索引
即便是一个简单的类,从关系型数据库映射到内存中的表示也是很复杂的,这就是所谓的阻抗失配。许多对象关系映射(Object Relational Mapping,ORM)工具都是为了尝试解决这一问题而诞生的
函数式关系映射程序(Function Relational Mapper,FRM)
垂直扩展
水平扩展
分布式系统
一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)中,只能择其二。
最终一致性
CAP 定理
复制(replication)
主 - 从复制和多主复制。
,使用多主复制的系统必须实现冲突解决策略
后写胜出
用户指定
热点
垂直分区和水平分区。
水平分区(又称为分片,sharding)
不同的分区(又称为片,shards)
分散聚集查询
。对分区策略的更改,即所谓的再平衡
代码是给人阅读的
开发人员时间分布
变量、函数或类的名称应该回答所有重要的问题。它应该告诉你它存在的原因、它是干什么的,以及如何使用。
计算机科学只有两件难事:缓存失效和命名
计算机科学只有两件难事:缓存失效、命名和差一错误
避免重复是实现整洁代码最根本的原则之一
不要重复自己(DRY)、单点真理、一次并且只有一次
特别当我们必须一次次地重复相同的过程,那么就需要实现一种自动化的过程;如果不只在一个地方有相同的逻辑,那么就需要实现抽象,以便共享单一的实现。
。重新发明轮子是最常见和不必要的重复,只要有可能,就应该使用开源库去代替
单一职责原则(single responsibility principle,SRP)
不可变变量
高阶函数,这是一种能够把其他函数作为参数的函数。
纯函数满足以下条件。 该函数是幂等的:给定相同的输入参数,函数总是返回精确的相同结果。 该函数没有副作用:函数不以任何方式依赖或修改外部世界的状态。副作用的例子包括改变全局变量、写入到硬盘、读取用户控制台的输入、通过网络接收数据。
在软件领域,两个模块相互之间的依赖程度称为耦合
整洁的代码应该遵循依赖反转原则: 高级的模块不应该依赖于低级的模块,二者都应该依赖于抽象; 抽象不应该依赖于细节,细节应该依赖于抽象。
NewsFeed类就是因违反依赖反转原则,从而导致紧耦合的四种常见方式的一个例子: 内部实现依赖性:User类; 系统依赖性:时间; 库依赖性:DB类; 全局变量:GlobalCache类。
不要为糟糕的代码注释——重新写吧。
代码进行了增量式地改进,每次只对内部实现细节做一点小改变,这就是所谓的重构
编程语言是对程序的思考,而不是表达你已经思考过的程序。