---
title: 开源与创业
date: 2016-01-31
draft: false
summary: 从开源项目和创业实践的共通处出发，讨论技术人如何判断方向、配置资源和触达用户。
slug: opensource-and-startup
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/3937679751801218
tags:
- talk
topics:
- essays
- projects
type: post
---
本文是根据我在高可用架构群聚会上的演讲整理而成。从小一直是个讷于言的人，每次公开演讲都感觉会有紧张，不能完整的表达自己的想法，很羡慕演讲时能侃侃而谈的人。所以还是把自己的想法整理成文章表达出来。

个人在开源方面算是新手，16年初发布了一个开源项目，叫[go-commons-pool][1]，是一个golang的通用对象池，到现在快200个星。创业方面也算是新手，15年初开始作为技术合伙人创业做团队通讯协作工具。一年里做开发的同时兼职做点产品的工作，也做点运营的工作。感觉创业和开源二者的共通之处挺多，所以和大家分享一些感悟。前面各位讲的干货比较多，我这个项目技术上比较简单，所以我听从Tim的建议，多搀些鸡汤吧。 ：）

无论是创业还是开源，首先面临的第一个问题是做什么？要做什么的想法从哪儿来呢？无外乎以下两个途径：

1. 观察 观察周围的人，观察自己的生活和工作，观察大家的习惯，看哪儿还有改进的地方，看哪里有痛点。比如我这个pool的想法就是有人在群里提问，我搜索了下，发现golang确实没有通用好用的对象池。再比如有人发现打车这么难，站路边半天等不到，于是有了Uber。有人想在多个设备同步文件，于是有了Dropbox。有人发现工作中老在做重复工作，于是有了各种框架。
2. 借鉴 看看其他先进的地区，先进的领域，是否有可借鉴的，将先进地区或者领域的成果移植到落后地区或者新的领域。一直比较热门的Copy To China创业就是这种模式，通过先进地区的发展轨迹来预测落后地区的未来趋势。那天高可用群里indigo的分享，通过日本的经济社会的发展来预测中国的趋势也是这个道理。我做这个pool，其实也是分析了java社区的情况，觉得golang在以后服务器端大有作为，肯定需要一个健壮的对象池，用来做连接池等用途。

想好了做什么，下一步就是怎么做。这一步，貌似创业和开源差距比较大，但二者共通之处还是有的，其实做的关键点是评估以及安排『事』的资源投入。资源包括金钱和时间。如果前面想的事情太大，和实际的资源不匹配，结果可能就是创业黄了，或者开源项目创建了个仓库，写了个readme然后就没有然后了。这里面考验的是对事情的复杂度的评估能力和对资源的把控能力。

项目做出来之后呢？再下一步就是怎么让你的用户群知道了，也就是现在流行的说法叫『安利』。PingCAP的黄东旭刚才也提到了他们的营销方式和渠道。这步的核心是你要知道你的用户群的注意力一般在哪儿，如何以最小的成本触达你的用户。开源项目可能是通过各种开源社区或者技术人社区，自己的社交网络，技术会议等各种方式。

初步的用户触达完成，用户知道了你的项目，有部分人可能点了星，这部分人是潜在用户。另外一部分人fork了，估计是准备要使用或者做二次开发了。那如何维系当前的用户，并且吸引更多的用户呢？这就是这个阶段要考虑的。包括但不限于以下方面：

1. 完善文档，教用户如何使用。不要嫌弃用户『弱智』。
2. 响应用户的反馈，处理issue。创业产品的话就是要有客服体系了。

逐渐用户多了，然后形成社区，有了自己的品牌。这一步，像我做的这样的小工具达不到，但比如PingCAP的TiDB,像谢孟军的beego这种框架，都已经形成自己的社区和品牌了。

总结下这个过程中的关键点：

1. 点子没抽象好。其实所有工具和产品都是在做一种抽象，对用户需求的抽象。比如那个经典的例子，问用户需要什么，用户肯定说是要更快的马，而不是一辆汽车。汽车就是对用户出行需求的抽象。但如何做这种抽象呢？我总结了下有三个境界。  

	* DRY原则(Don't repeat yourself)，不要重复自己，最常见的是用在代码规范里，建议大家不要随意复制粘贴，而是要做一定抽象。但实际上，所有的语言的高级功能，面对对象，模块化，代码生成工具，各种框架，都是在解决这个问题。也就是说，如果你发现你在做许多重复劳动，说明这里就有可能抽象出个工具出来。
	* 不要重新发明轮子 这个原则貌似有争议，但我觉得争议是没搞清楚『发明』和『造』的区别。不要重复发明轮子，但你可以造新的轮子，或者改进已有的轮子。这个原则说的是不要重复别人已经完成的工作，不要闭门造车，要在前人的基础上做改进。一直觉得发明轮子的人是很伟大的，也很难的，历史地位可以和发明取火术有的一拼。有了轮子后，人类所使用的工具和动物所使用的工具才有了本质的区别。
	* 前面我们做到了不要重复自己，也做到了不要重复别人，第三个境界就是『不要让别人重复你』。将你的工具，框架，抽象分享出去，作为开源产品或者SaaS服务，让别人不再重复你已经完成的工作。  

1. 开发速度慢了，竞品出现，或者功能比竞品弱。
2. 推广没做好，大家不知道，结果被后来者超越了。
3. 做出来的东西没有实际需求 比如pool，有人觉得go里用channel模拟就很简单，没必要用个复杂的pool。比如许多Copy To China的项目，发现在中国的环境水土不服。
3. 开源后不维护，没了热情，用户反馈无响应，最后都流失了。好多僵尸开源项目都是这样了。

所以，我觉得想创业的工程师，可以先从开源做起，将开源做为创业的一次演习。体验一次从构想，开发，推广的整个流程，这样可以对创业过程中的关键点有些体验，可以评估自己的长处和短板。毕竟自己是工程师，开发的时间可以自己掌控，面向的用户也是工程师，所要解决的问题是自己熟悉的领域，需要传播的社区也是自己熟悉的社区，这种天时地利人和的情况下做项目还是遇到困难，可以想象下，如果换到一个自己不熟悉的领域，不熟悉的用户，不熟悉的社区，困难会有多大？

另外说一句关于技术人创业的观点。我觉得王安石一句诗非常好『春江水暖鸭先知』，我们一线的写代码的工程师是在水里的鸭子，江水变化我们肯定首先会感觉到，这方面是有优势的。如果你高升了，不写代码了，跑岸上去了，那可能就感觉不到江水变化了。

[1]:	https://github.com/jolestar/go-commons-pool
