关于开源,回答牧川老师的一些疑问
因为前一篇文章《我们需要什么样的开源教育?》,我转发到了一个教育专家的群里,然后收到了牧川老师的一些提问,感觉很有认真回答的价值,所以思索一番之后,回答如下:
1. 开源(开放)的边界在哪里!它们怎么理解边界?
开源的边界,相当模糊,或者说:有多层次的边界。
- 你听说有一个开源软件不错,然后找到一个下载地址,然后安装、使用。你就成了这款开源软件的使用者(User)
- 不仅自己使用,也积极推荐他人使用,成为一个推动者(Promoter)
- 你在使用的过程中,遇到问题,想找人帮助,你有几个选择
- 找到相熟的朋友,寻求帮助,他给你解答,问题解决
- 找到某个论坛,或者加入一个相关的微信群、QQ群,在里面提问,然后得到解答
- 找到这款开源软件的官方论坛,或者问题列表(issue list),在那里公开提问,然后得到解答
- 订阅开源软件的邮件列表(mailist),然后发邮件提问,然后得到解答
- 除了寻求帮助,因为你获得了全部的源代码,也可以自己尝试解决
- 闷头解决,然后自己使用(此时与社区无关)
- 将自己的解决的过程,修改的代码,发到网络上,告诉其他人
- 直接将修改的代码,提交到开源软件的维护者那里,等待他的接纳,成为开源软件下一个版本的一部分
- 因为喜欢这款开源软件,而且在社区里和其他人的交流也很愉快,于是决定成为长期贡献者
- 不仅长期贡献代码,因为技术水平令人信赖,被邀请成为开源软件与社区的管理者之一
- 管理代码(Committer)
- 其他管理工作——社区运营(Community Operation)
除了自己默默解决问题,不再回馈到社区,以上的诸多行为,我们都会认为是开源社区的一部分(Contributor、User、Promoter)
所以,台湾著名的开源人年会,从2006年至今持续举办的,他们的大会缩写就是COSCUP(Conference for Open Source Coders、Users、Promoters) 其实,我个人认为,将Coders换成Contributors,会更加合适,因为不仅仅写代码是贡献,很多其他的工作也是贡献。 另外根据台湾COSCUP多届召集人Richard的解释,CUP三种角色,都是Contributor,所以不用单独列出来。(我觉得他的说法,更加合理)
至于边界的问题,我将其理解为:一群已经是开源人的人,他们如何看待一个新来的人,在什么情况下,会将他看成自己人? 这其中,依然会有关系上的差序格局,远近亲疏。最广义的自己人,是你至少是某一个开源社区的CUP之一,近一点的,你是我们这个社区的CUP之一。再近一些的,就会谈及礼物经济。一个人在社区里,做出的贡献越多,他的地位就会越高,我们会称之为核心贡献者。
2. 推动开源最主要的动力是什么?阻碍是什么?
推动开源,也有不同层面的动力,个人动力、企业动力和国家动力。国家动力太过于复杂了,可以先不谈。
个人动力,包括几部分。个人学习成长,解决难题的乐趣,以及因为社区贡献获得的声望。另外还有一个也许较为功利的动机,是在开源社区贡献卓著的大牛,通常也会有相当不错的职业生涯,会有大企业,高薪聘请。
企业动力,也分为几部分。首先是法律合规,因为有些开源软件的授权协议,会要求针对开源代码的修改,如果对外发布/销售,同样需要开源。其次是技术成本,因为开源软件的版本一直在向前更新,如果企业内部的修改不能反馈到社区里,就会在每次升级之后,再修改一次。再其次是战略诉求,或积极参与开源,或主动对外开源,则是为了满足影响或主导某一个技术领域的诉求。
至于阻碍,按照我的看法,本质上是“没有看清利弊”,无论个人或企业,在没有看清利弊的时候,都会做出错误的判断。认为没有必要,没有价值,为他人打工,喂养竞争对手等等。
3.开源教育会为教育(学)带来的最大启发(或冲击)是什么?
开源社区,在协作开发软件的过程中,的确形成一种独特的“教学”模式。可以简单的描述一下:
在开源社区里,新人要想要成为社区的贡献者,通常要经过一种Code Review的机制,这实际上是一种围绕代码的同行评议。所以,一个人的代码,在被评议的过程中,自然会反复修改,直到符合社区的要求为止。通常社区的要求包括:
- 不要一次提交一个非常大、非常复杂的功能,每次只改一小部分,这样能够降低评审者的心智压力,也能确保评审足够透彻
- 无论是代码,还是围绕代码的说明,都应该清晰、简洁、易懂、符合逻辑
- 作为新人,最好是先“修复错误”,再“增加新功能”
- 遵守社区的代码风格与质量规范
- 通过所有的测试,确保正确
在我看来,这样一种学习的过程,自然会使得新来者,能够边做边学,小步快跑,逐步的积累经验与成就感。一些好的开源社区,还会特别设计一些简单的入门任务,专门留给新手来做,以提升他们的成就感。
因为我不了解教育学的各种相关实践,所以也不知道,在教育和课程设计的领域,是否会有类似的“安排”,以班级协作、共建的方式,完成一个大的任务,通过这种方式,来完成教与学的过程?