V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
88250
V2EX  ›  程序员

开源经验谈

  •  
  •   88250 ·
    88250 · 2017-08-02 09:43:59 +08:00 · 2380 次点击
    这是一个创建于 2670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Bootstrap

    古话说得好:“万事开头难”。

    开头在本质上是解决 “ Bootstrapping ”,人们一直使用这个比喻来描述解决启动问题的方法,即一个人试图用自己的鞋带将自己拉起来。比如按下电脑开机按钮后初始化系统被广泛称作自举引导(简称 booting )。

    想做好一个开源项目,就先得规划一个好的启动方式。

    GitHub

    10 多年前做开源项目托管的话基本只有一个选择,那就是 SourceForge。 期间也有过一些其他大厂的项目托管服务,比如 Google Code,Sun/Oracle 的 Project Kenai,现在都停服了。目前 GitHub 已然是全球最大的开源项目托管服务商了,促成这样现状的最大原因有这几个方面吧:

    1. git 版本控制系统的流行,并做了一些更简单的工作流,比如 Pull Request
    2. 更好、更现代化的用户体验,比如 issue comments 的实时推送
    3. API 开放平台,构建第三方应用的生态系统
    4. 持续不断的改进,GitHub 隔三差五会有一些细节改进,并且桌面客户端工具也在不断演进

    目前 GitHub 是开源项目托管的不二之选。国内也有类 GitHub 的项目托管服务,比如码云Coding,希望它们越做越好 :+1:

    Repo

    建库是第一步,首先需要确定的是开个人项目还是组织项目,这两者有些许不同:

    • 个人项目:项目如果受欢迎一般来说人们都会浏览下作者主页并关注,有利于作者本人涨粉
    • 组织项目:如果一开始就规划了相关系列项目,建议选择组织类型

    第二步就是需要一个好的名字:

    • 和需求 /技术相关或者有些特定含义
    • 库名命名优先是全小写,如果需要分隔单词则使用 -,最后遵循开发语言、框架的约定
    • 如果项目是一个系列的,需要考虑好前缀,或者按前面说的走组织项目

    Init Commit

    初始提交尽量是核心功能可用的,这样能给别人一个好印象。并且必须写好 README,内容至少覆盖如下几个方面:

    • 项目介绍:该项目是什么,主要用于解决什么问题,这个部分主要阐述项目的动机
    • 功能特性:有哪些主要功能,独特的特性有哪些
    • 安装方式:如何安装,最好也介绍一下开发环境搭建
    • 技术依赖:该项目主要依赖哪些项目,这样能让别人大体上知道复杂度和上手难度
    • 开源协议:一定要让用户知道,非常重要

    除了 README,GitHub 还建议加入编码规范、贡献指南说明,这个可以后期慢慢加入。

    文本的介绍是一方面,另一方面是多媒体格式,如果能有使用视频是最好的,但至少项目的 logo 是要有的,一开始稍微丑一点没关系 :blush:,可以鼓励其他人参与贡献。

    Document

    项目托管服务商一般都提供了 wiki 服务,主要用于项目相关文档。直接使用 wiki 的最大好处是可以让其他人参与进来维护文档,比如有错别字时其他人可以很方便地帮忙修改。

    但直接使用 wiki 服务也有个致命的缺点,就是当项目要迁移托管商时就很麻烦,不同服务商支持的文档语法不尽相同,排版也比较麻烦。推荐的做法是项目的文档自己搭建一个站点来管理,虽然运维麻烦一些,但这样不存在迁移问题,并且自由度也更大一些。

    建议通过论坛系统来维护文档,这样方便用户进行提问,也促进了项目社区的发展。

    Issues

    Issue 最好先建立模板,让用户提问的时候有章可循。不过即使有模板,issue 描述不清晰还是很常见的,用户的系统环境千奇百怪,遇到奇葩的系统不工作其实也正常。

    关于 issue 你未来可能会面临如下情况:

    良好的 issue 交互情况:

    总之通过 issue 来追踪管理变更是很好的做法,发布版本时还可以根据 issues 生成 changelogs

    不过对于 issue 也有我觉得比较难处理的情况:

    总之,做开源很重要一点就是和参与者、用户保持交流,等项目用的人多了以后责任也会变大,所以不能太随意,尽量做到变更可追溯。

    回归本质

    总之,开始一个开源项目时最重要的一点就是要问自己:_为什么要做这个开源项目?_ 这个问题的答案将解释该项目的动机并且为项目设定了目标。

    开源项目成千上万,并且同质化严重,但总有一些开源项目能够脱颖而出,因为这些项目抓住了本质:

    1. 开发者自己是用户:开发者自己不用是发现不了问题的,特别是后期需求
    2. 做真正有用的事情:不一定要受众很广,但要有刚需,能够解决问题
    3. 长期投入精力情感:你投入的情感使它与众不同,保持细水长流

    以上都是我的经验之谈,如果你想更全面了解开源,请访问 GitHub 出品的 Open Source Guide

    本文作者

    https://github.com/88250,欢迎关注。

    13 条回复    2017-08-02 14:27:04 +08:00
    nieyujiang
        1
    nieyujiang  
       2017-08-02 09:53:08 +08:00
    hold 不住 233333
    Antidictator
        2
    Antidictator  
       2017-08-02 09:53:08 +08:00
    前排支持大 D
    88250
        3
    88250  
    OP
       2017-08-02 09:54:43 +08:00
    oott123
        4
    oott123  
       2017-08-02 09:54:45 +08:00 via Android   ❤️ 1
    宣泄个人情感的那个链接笑了,感谢楼主给我带来欢乐
    88250
        5
    88250  
    OP
       2017-08-02 09:56:37 +08:00
    @oott123 我是很认真的 :严肃脸:
    dreamwar
        6
    dreamwar  
       2017-08-02 10:14:14 +08:00
    哈哈哈哈
    justjavac 哈哈哈哈
    crossoverJie
        7
    crossoverJie  
       2017-08-02 13:29:25 +08:00
    justjavac 貌似在 V 站口碑不是很好啊
    chinvo
        8
    chinvo  
       2017-08-02 13:33:40 +08:00
    justjavac 的个人感情比较丰富(笑
    DrJoseph
        9
    DrJoseph  
       2017-08-02 13:55:16 +08:00
    支持 D 大,希望你无论遇到什么困难,都能克服并坚持下去
    designer
        10
    designer  
       2017-08-02 14:19:01 +08:00 via iPhone
    理想中的开源,大家都会参与。
    现实中的开源,可能要投入开发者和团队很大的时间和精力。需要工匠精神

    分享一个我和小伙伴的开源字体图标库: https://github.com/xiangsudian/caomei
    BoBoy
        11
    BoBoy  
       2017-08-02 14:20:25 +08:00 via iPhone
    大佬又发帖了,果然没白关注。
    88250
        12
    88250  
    OP
       2017-08-02 14:21:19 +08:00
    @DrJoseph 谢谢
    chinvo
        13
    chinvo  
       2017-08-02 14:27:04 +08:00
    issue 还有观光的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1257 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:08 · PVG 02:08 · LAX 10:08 · JFK 13:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.