作者 | 席时鉴
大江东去浪淘尽。
Linus Torvalds创立的Linux无疑是开源史上最成功的例子之一。从1991年的一个个人项目开始,直到发展为现今的Linux帝国,Linus一直作为一名开发者活跃在第一线。colors.js和faker.js(在npm上月度下载量超3千万)的作者Marak Squires因为对“免费给福布斯500强工作”而忿忿不平,故意破坏了自己的项目,然后退出了开源开发。
为什么他们的结局如此不同?SpiderFoot的作者Steve Micallef在最近的一篇博客或许能给出一部分答案,他在文中给大家分享了他对于成功开源项目的理解和应该保持的思维模式。SpiderFoot是一个开源智能(OSINT)自动化工具,在很多信息安全相关的书和训练课程中都有提及,截至撰稿时在GitHub上有7.6k star。自2011年创立以来,Steve十几年如一日地活跃在开源社区,并成功地基于免费的开源软件推出了商业化版本SpiderFoot HX。
在这10年里,Steve总结了他吸取的10条经验教训,如下:
诚然,写开源软件是为了不图回报地把代码分享给所有人免费使用,但作为开发者,Steve不认为自己仅仅是在“用爱发电”。他的收获有:
见到用户的感激之情带来的成就感。多年以来,有上千的用户向他致谢说SpiderFoot对他们有多么大的帮助,就凭这一点就让他备受鼓舞。
自己编程水平的提高。在不断完善项目和解决用户问题的过程中,他学会了像一个好的工程师那样思考,这也帮到了他作为产品经理的正业。
结识了很多大牛。这个项目让他认识了一些优秀的同行程序员,在他的求职过程中也起了很多次作用。
提供了商业化项目SpiderFoot HX的商机。
除此之外,开发SpiderFoot还锻炼了他的自律能力,加强了时间管理能力,等等等等。
大家是不是都有这样的经历:我们有一个需求,去网上找到了一个开源的工具,结果发现最后一个commit是好几年前?大多数开源项目的失败都缘于开发者不想继续维护下去,因此如果我们能坚持不懈地贡献代码,可以说我们就已经成功一半了。
Steve开始写SpiderFoot的时候,过度关注了代码质量、单元测试和文档,但最终还是决定先把它写出来再说。事实证明,如果他要坚持做到十全十美再把成品交付给用户,发布时间就会晚很久,他的程序也就不会被这么多人使用了。最好的方式是先尽快做一个可用的版本拿出来;之后有的是时间优化,甚至还可以重写。
写开源软件没有一个确定的,“到此为止”的终点;因为技术在不断进步,代码有不断提升或重构的空间。并且随着项目的增大,用户的需求和遇到的问题也会越来越多。甚至可能还会出现竞品。
Steve给自己设立的目标有:
做出一个让自己自豪的创造性产品
不断磨炼自己的技术能力
维护SpiderFoot,使之成为行业内开源自动化工具的首选
成功地将项目商业化
这些目标是宽泛的,而不是“我要做出哪些功能”,因而他能保持持续开发的热情。
Steve本人有一个妻子、三个孩子,和一份全职工作。当别人听到这些时,总会很惊奇:“你是怎么有闲暇时间维护一个开源项目,还把它做成一个生意的呢?”他没有超能力,也不是天才,他只是在坚守以下几条:
如果有能够不被打扰的大块时间(比如清晨或晚上的几个小时),就用来编程。
尽可能不看电视,不刷手机(除了用社交媒体推广他的项目之外)。
如果没法编程,就把时间用来学习Python,为SpiderFoot查找新的信息源,研究同一领域内的其它程序等等。
让编程成为一个自发的习惯。
换句话说,用户只在乎我们的成品能不能用(参见第3条)。如果这一点能保证,那我们的单元测试有疏漏或是文档不清晰都不是大事。在10年中,Steve收到对SpiderFoot的代码风格或单元测试的抱怨次数扳着手指头就能数过来。当然,如果用户真的指出了问题,也不应该直接忽视他们。
虽然说如果我们的产品足够好,用户会主动帮我们推广,但是在项目伊始,还无人问津之时,做一些市场营销还是有必要的。首先要明白我们的用户都在什么平台上(推特?领英?抖音?),然后借助平台上有影响力的人(比如博主)来推广我们的项目。Steve说,大家会惊讶于他们对你们项目的接受程度,因为他们欣赏你们为帮助他人做出的努力。
另外,一个好的README文件也是不可或缺的。
保护我们在工作时间之外所做工作的知识产权法因国家/地区、雇主与雇主而异。当今大多数技术和技术友好型公司都应该会批准个人的副项目,但Steve Micallef提醒,应该在开始为开源项目贡献之前先弄清楚这件事情。
Steve说,这可能是最重要的一条,也是他自己花费最多时间才学会的一条。最初,他只为SpiderFoot写了文档,以为这就可以满足用户了。但他发现,如果要让项目成功,仅是文档远远不够。
社区的组建和发展指的是为用户提供论坛和资源,以便他们深入了解项目,与他人联系并在需要时获得/提供帮助。一个活跃、庞大的社区的作用是无可比拟的。
为了培育一个社区,可做的事情比如:
为用户提供文档、教程视频、博客文章等
与用户积极互动,解决他们的问题
利用Slack,Discord等平台创建群聊,便于用户相互提问回答
在会议上推介自己的项目
Steve认为,项目的开发是一件任重而道远的事(参见第4条),除非项目非常简单。如果我们在开发的过程中没有得到享受,我们最后很有可能会承受不住来自不断更新、铺天盖地的issue和pull request等等的压力。因此从最开始,开发者就应该以一种轻松的态度应对,不慌不忙地添加新功能,处理issue和pull request。就算这样使得开发的效率降低,但是我们不会有任何愧疚感,这才是做开源项目的真谛。
没人规定你必须合并每个pull request,响应每个issue或者做任何你不想做的事情,你也不需要给出理由。强逼着自己做任何事情只会慢慢磨灭你的热情,欲速则不达!
这是Steve Micallef对成为一名成功开源开发者的看法:持之以恒,目光长远,重视营销,确保项目合规,发展社区,注重结果,但享受开发的过程。各位小伙伴对于Steve给出的总结有什么看法?在大家自己使用或开发开源软件的过程中,有过哪些心得体会?大家认为该如何成为一名成功的开源开发者?欢迎在评论区中分享你的意见~。