个人在开源方面算是新手,2016年初发布了一个开源项目,叫go-commons-pool,是一个golang的通用对象池,到现在快200个星。创业方面也算是新手,2015年初开始作为技术合伙人创业做团队通讯协作工具。一年里做开发的同时兼职做点产品的工作,也做点运营的工作。感觉创业和开源二者的共通之处挺多,所以和大家分享一些感悟。前面各位讲的干货比较多,我这个项目技术上比较简单,所以我听从Tim的建议,多搀些鸡汤吧!:)
无论是创业还是开源,首先面临的***个问题是做什么?要做什么的想法从哪儿来呢?无外乎以下两个途径:
1.观察
观察周围的人,观察自己的生活和工作,观察大家的习惯,看哪儿还有改进的地方,看哪里有痛点。比如我这个pool的想法就是有人在群里提问,我搜索了下,发现golang确实没有通用好用的对象池。再比如有人发现打车这么难,站路边半天等不到,于是有了Uber。有人想在多个设备同步文件,于是有了 Dropbox。有人发现工作中老在做重复工作,于是有了各种框架。
2.借鉴
看看其他先进的地区,先进的领域,是否有可借鉴的,将先进地区或者领域的成果移植到落后地区或者新的领域。一直比较热门的Copy To China创业就是这种模式,通过先进地区的发展轨迹来预测落后地区的未来趋势。那天高可用群里indigo的分享,通过日本的经济社会的发展来预测中国的趋势也是这个道理。我做这个pool,其实也是分析了Java社区的情况,觉得golang在以后服务器端大有作为,肯定需要一个健壮的对象池,用来做连接池等用途。
想好了做什么,下一步就是怎么做。这一步,貌似创业和开源差距比较大,但二者共通之处还是有的,其实做的关键点是评估以及安排“事”的资源投入。资源包括金钱和时间。如果前面想的事情太大,和实际的资源不匹配,结果可能就是创业黄了,或者开源项目创建了个仓库,写了个readme,然后就没有然后了。这里面考验的是对事情的复杂度的评估能力和对资源的把控能力。
项目做出来之后呢?再下一步就是怎么让你的用户群知道了,也就是现在流行的说法叫“安利”。PingCAP的黄东旭刚才也提到了他们的营销方式和渠道。这步的核心是你要知道你的用户群的注意力一般在哪儿,如何以最小的成本触达你的用户。开源项目可能是通过各种开源社区或者技术人社区,自己的社交网络,技术会议等各种方式。
初步的用户触达完成,用户知道了你的项目,有部分人可能点了星,这部分人是潜在用户。另外一部分人fork了,估计是准备要使用或者做二次开发了。那如何维系当前的用户,并且吸引更多的用户呢?这就是这个阶段要考虑的。包括但不限于以下方面:
1.完善文档,教用户如何使用。不要嫌弃用户“***”。
2.响应用户的反馈,处理issue。创业产品的话就是要有客服体系了。
逐渐用户多了,然后形成社区,有了自己的品牌。这一步,像我做的这样的小工具达不到,但比如PingCAP的TiDB;像谢孟军的beego这种框架,都已经形成自己的社区和品牌了。
总结下这个过程中的关键点:
1.点子没抽象好。其实所有工具和产品都是在做一种抽象,对用户需求的抽象。比如那个经典的例子,问用户需要什么,用户肯定说是要更快的马,而不是一辆汽车。汽车就是对用户出行需求的抽象。但如何做这种抽象呢?我总结了下有三个境界。
(1)DRY原则(Don’t repeat yourself),不要重复自己,最常见的是用在代码规范里,建议大家不要随意复制粘贴,而是要做一定抽象。但实际上,所有的语言的高级功能,面对对象,模块化,代码生成工具,各种框架,都是在解决这个问题。也就是说,如果你发现你在做许多重复劳动,说明这里就有可能抽象出个工具出来。
(2)不要重新发明轮子。这个原则貌似有争议,但我觉得争议是没搞清楚“发明”和“造”的区别。不要重复发明轮子,但你可以造新的轮子,或者改进已有的轮子。这个原则说的是不要重复别人已经完成的工作,不要闭门造车,要在前人的基础上做改进。一直觉得发明轮子的人是很伟大的,也很难的,历史地位可以和发明取火术有的一拼。有了轮子后,人类所使用的工具和动物所使用的工具才有了本质的区别。
(3)前面我们做到了不要重复自己,也做到了不要重复别人,第三个境界就是“不要让别人重复你”。将你的工具,框架,抽象分享出去,作为开源产品或者SaaS服务,让别人不再重复你已经完成的工作。
2.开发速度慢了,竞品出现,或者功能比竞品弱。
3.推广没做好,大家不知道,结果被后来者超越了。
4.做出来的东西没有实际需求,比如pool,有人觉得go里用channel模拟就很简单,没必要用个复杂的pool。比如许多Copy To China的项目,发现在中国的环境,水土不服。
5.开源后不维护,没了热情,用户反馈无响应,***都流失了。好多僵尸开源项目都是这样了。
所以,我觉得想创业的工程师,可以先从开源做起,将开源做为创业的一次演习。体验一次从构想,开发,推广的整个流程,这样可以对创业过程中的关键点有些体验,可以评估自己的长处和短板。毕竟自己是工程师,开发的时间可以自己掌控,面向的用户也是工程师,所要解决的问题是自己熟悉的领域,需要传播的社区也是自己熟悉的社区,这种天时地利人和的情况下做项目还是遇到困难,可以想象下,如果换到一个自己不熟悉的领域,不熟悉的用户,不熟悉的社区,困难会有多大?
另外说一句关于技术人创业的观点。我觉得王安石一句诗非常好“春江水暖鸭先知”,我们一线的写代码的工程师是在水里的鸭子,江水变化我们肯定首先会感觉到,这方面是有优势的。如果你高升了,不写代码了,跑岸上去了,那可能就感觉不到江水变化了。