小站重新装修,欢迎到访。
分类 #生活

中国式开源的三宗罪

“月亮还是外国的圆”

这话放到IT行业,我感觉让人不好去否认。

IT技术发源自西方(没算盘什么事吧?!),根基也在西方。先不说各种各样的网络协议、有名无名的编程语言,即使比较优秀的框架或库什么的也都难觅中国智造。这有语言、文化、国情等多方面原因,不想吐槽过多,今天只想聊聊“中国式开源”。

这两年IT圈子不知怎么,突然一改只从开源社区索取,绝不向社区贡献的猥琐姿态,各种中国智造的开源项目如雨后春笋般出现。但笔者感觉这些项目大都是中国特色的,属于中国式的。什么是中国式开源?我觉得下面三个字概括的很好(出处不详):

晒 代 码

最近业余在看国外一个著名开源项目的源码。深感其社区之活跃,笔者读书那会虽然已经经常在sourceforge.net(日薄西山)爬来爬去,但对社区(community)这个概念理解并不深,毕竟那会太嫩,几百上千行代码写出来就敢自称框架,还厚颜无耻地扔到sourceforge.net给人看。扯远了。

前几日,由于工作需要,去看了国内一家互联网大厂开源的某项目(就不点名了,该项目自称用户很多)。两相比较,感慨万千,正好反映了我本文想表达的“三宗罪”。下面细数一下。

###代码品质###

我没有用代码质量这个词。因为代码质量直接让人联想到项目的源码写的好不好、格式工不工整、逻辑清不清晰、抽象优不优雅等,这些我不够格来评判。这里说品质,包括几方面。

首先是测试用例。有时候测试用例可以从侧面反映出某些类的用法,也可以暴露某些关键逻辑,这对于代码的学习者,还是比较关键的。可是我看的那个项目源码,一个用例都没有。

其次是代码内容。这里有个关键问题就是出自中国的开源项目,很多都是来自企业内部的改造,即把内部运行良好的项目,抽取适宜公开的部分包装而成。这就导致这些项目里有时会残留有这家企业的业务气息。导致不能很好的抽象大众化的需求。

###文档###

中国式文档也不得不让人吐槽。该大厂的这个开源项目,我翻遍网络,只觅得一份架构简介、安装说明,区区几页纸。不过好在有一些javadoc,可以生成源码的文档。但谈到前面所说的某国外项目,从README到如何为本项目贡献代码,从WIKI到tutorial,从ISSUES到maillist,一应俱全。甚至作者在采纳了你的patch,要把你加到contributor列表之前,都要先签一份agreement才行。不得不佩服老外的职业和专业精神。

至于为什么我们很难写出一份好文档,我觉得和国情有关,也和文化有关。中国人码农大都年轻,而且大都忙于糊口,公司也大都在压榨员工。很多时候大家都在赶工期。代码都写不完,何谈文档?虽然没有和老外共事过,也没出过国,但从很多老外的博客来看,很多人年龄都比较大,属于经验派,同时,生活压力也不会太大,爱好广泛,生活安逸。饱暖思淫欲,这话放到ITer身上,便是饱暖思代码,一个道理。

###社区活跃度###

上文谈到的国外的开源项目,社区活跃,contributor很多,项目的leader也经常出来和社区互动,言辞亲切。

我在阅读大厂的开源代码时,遇到一些不解的问题,由于文档太少,搜索引擎上关于此项目的讨论也不多,无奈便去微博@了一下几位该项目的开发者,至今杳无音讯。何故?项目主页不是说了有问题可以这么问的么。除此之外,我没看到如何能贡献patch,没看到邮件列表。

综上所述,我认为中国式开源就是在晒代码,虎头蛇尾般。有如小树成长为大树,开源项目亦是如此。好的开源项目,码农乐于参与,维护者做得好的话,肯定会朝着好的方向演进。但面对晒代码式的开源项目维护者,再好的项目都怕是让人望而却步。

临了,此文绝非对大厂的开发者不回答笔者问题的打击报复。实乃多年码农生涯积累下来的吐槽。希望中国码农少一些浮躁。多一些对技术的真挚追求。国内企业少一些压榨,多给码农一些时间和空间。码农从来不是企业的成本,而是企业难得的财富。

Hi,Pages

####缘起

自我的个人域名因为忘记续费被美帝可耻地抢注后,便再没心情维护我的博客,甚至最后Linode的每月19刀也竟然感觉是个累赘。

某次在有为同学感慨入职alipay之初的林林总总之后,聊起来是否该重新维护一个博客以记录成长之点滴,于是两人各自去寻安家之所。他去了oschina,我对国内的网络服务一直是实在不放心,便决定好好琢磨下Github Pages。

从Page Generation到Pelican,再到Jekyll。总算让我把这个博客整得有点样子了。最初使用Pelican是看到有博文写了使用说明,试了下也甚是简单,而且功能俱全,自带category、tag等功能,但无奈实在找不到合适的主题,终于放弃。

于是转投Jekyll旗下,不过Jekyll要实现category/tag的功能,是要借助第三方插件,但github官方出于安全考虑,居然把Jekyll的插件机制禁用了,无奈只能选择禁用pages的自动编译功能,这是后话。

####主题
一个好的博客,首先主题要说得过去,我最终fork了caarlos0的UP主题,主要是因为它实在是太简洁了,比较容易个性化定制。实际上我只对主题本身做了少许的几处调整。

####Sharing
UP主题只有Twitter的分享按钮,我用JiaThis的分享服务给替换掉了。

####Commenting
绝大多数类似Pages的静态网页服务,其评论功能都使用了Disqus的Commenting服务,不过某日在微博看到新秀moot之后,便决定拿moot替换掉Disqus。moot的slogan是Forums and commenting re-imagined,听起来煞是令人耳目一新,实际注册了用来,也确实是比较大的创新,其Path风格的api设计得很精巧。但其门槛很低,看一遍文档我就把moot装备上了。最难的地方应该是要用插件把post的file name取出来,作为comment的path的key部分,这让我学会了写Jekyll插件。

####Code highlight
作为技术博客,代码高亮肯定是必不可少的了,个人认为使用gist会很好,但最终还是选择内置的Pygments支持。

首先是安装:

1
$ pip install Pygments

其次要创建相关css文件,这个新手往往会忽略:

1
2
$ cd path/to/jekyll/project/folder
$ pygmentize -S default -f html > css/pygments.css

其中default是指样式名,可以用如下方式查看有哪些样式:

查看样式
1
2
3
>>> from pygments.styles import STYLE_MAP
>>> STYLE_MAP.keys()
['monokai', 'manni', 'rrt', 'perldoc', 'borland', 'colorful', 'default', 'murphy', 'vs', 'trac', 'tango', 'fruity', 'autumn', 'bw', 'emacs', 'vim', 'pastie', 'friendly', 'native']

最后只要把css文件引入,用liquid嵌入代码即可:

1
2
3
{% highlight java %}
code goes here~
{% endhighlight %}

####Category & Tag
这是博客必不可少的功能了,但Jekyll只能通过插件来实现,我不懂Ruby,所以只能fork去了。参照realjenius的代码,把category和tag页面生成。但比较麻烦的是修改UP的主题,把category和tag链接加进来,整个过程就是在写Liquid模板,很简单。

但是使用插件,也就意味着无法让github自动编译发布博客,必须在本地把md处理成html,然后push到github才能发布。所以我最终采用了三个git分支:

  • master分支,用来存放生成后的文件(默认在_site目录下),注意要加.nojekyll文件来禁止Pages的自动发布

  • gh-pages分支,仅仅是Github Pages的必须的标记分支

  • source分支,存放整站源码

发布的步骤大概是先在source分支下编写并push到origin:source,然后编译到_site下,切换到master分支,把_site下的文件覆盖过来,commit、push一路过来即可。

####结束
即便是这篇文章,也拖了好久。希望自己这次能在这个琐事缠身的年纪,坚持把这个博客维护下去。本文并未详细讲解使用Jekyll搭建Pages的过程,喜欢我这个主题的,可以fork我的代码。如果有其他疑问,也可以直接联系我。

PS:后来我又把评论切回Disqus了,moot太小众了- -||

1

博主是一个不是很聪明的码农。完美主义者,强迫症中期。这里会记录一些回忆和点滴,以博为镜。

武器库:

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-SA 3.0  授权发布。最后生成于 2017-02-20.