开源程序员——从入门到蜕变

华为内源架构师庄表伟曾经组织写过一本书:《借助开源项目,学习软件开发》,可谓是开国内方法论之先河,非常值得一读。本文异曲同工,更像是对这本书以精炼的表达,从而阐述如何成为一名开源界的开发者、程序员,本文的每一段扩展开了也可以形成一本类似的书籍。正如文中所言,成为一名开源界的开发者有太多路径可走,本文只能作为指南用。当然无论如何,秘诀就是大量的练习,而保持耐心则是必备的基础。

Tue Feb 7, 2017 | 4700 Words | 大约需要阅读 10 分钟 | |

放眼望去,技术的世界真是太让人惊叹了!技术的本质是进化和组合的,犹如哪个我们生活的地球是由无数个乌龟承载的故事一样,当你去深入一项技术的时候,会发现下面还有另外一项支撑的技术,如此反复,仿佛无穷无尽。那么这就给现在的欲进入技术世界的人们带来很多迷茫和困惑:我该如何迈出自己的第一步?之后的第二十步又是什么样子?

不妨来开源的世界试试!

首先要明确的是开放源代码是开放的。这尽管看起来是蛮显而易见的一个事情,但是仍然有人常常会忘记开源是一种文化现象,很多人甚至认为开源是一家世界500强的公司。这是一种颇让人窘迫的情形。

要想成为一名开源程序员,和常见的职业生涯是有明显差异的,这里不需要什么面试,填写一大堆表格,然后有官僚的HR询问你的思想道德品质,你所需要做的只有一件事,那就是撰写代码,然后将它们分享出来。

就是这么简单,开源程序员!

不过,这只是我们要达到的最终目的,“千里之行,始于足下。” 我们得从头开始。本文就是来聊聊具体应该去怎么入门,并蜕变的建议。

技能图谱

你是否玩过 RPG(第一角色扮演)游戏?在这些游戏中,有一个常见的理念就是“技能图谱”,当你开始玩的时候,你只有最为基本的技能,随着时间和过关,等级逐渐提高,也会获得相应的高级技能。升级,获得新技能,如此反复。

成为一名程序员和打RPG游戏的这个过程极为类似,你获得最基本的技能(我们每个人都拥有,——译者注),然后不断的去练习它,直到它成为你的第二本能,然后获得新的技术集,如此反复,按照技能图谱的发展方向不断的精益求精。

在整个过程中,你还会发现不止一个技能图谱。尤其是开放源代码,有许许多多的入口,其中每个都有其自身独特的魅力和吸引人的地方。虽然如此,依然还是有一些经过历史积淀的、被无数前辈所实践过的技能是成为一个牛逼的程序员所必备的,精通它们是成功参与到开源中非常重要的一步。

脚本历练

使用类似 Linux 或 BSD 这样的 POSIX 系统,其中最大的一个好处就是,在你每次使用的时候,都是一次小小的编程练习之旅。如果你还对怎么开始撰写程序没有任何概念的话,尝试在 Linux 或 BSD 的命令行下工作是个不错的开始。比如找一些平日里会经常重复性的工作,然后尝试将它们给自动化了。这些均是比较简单的,比如批量的转换和调整图片的大小、定时检查邮件、又或者是想通过一键来启动5个常用的应用程序。其实无论是什么任务,你自己亲自去花时间去搞定他们,然后逐步的增加难度。

如果你能够开始在终端下做些事情了,说明已经可以运用脚本了。然后就可以学习诸如bashtash,按照系统所介绍的去撰写脚本,尝试理解系统是如何工作的。

系统管理

这里是一个重要的分水岭,在经历了熟练使用脚本之后,你可以继续往下走,或者成为一名程序开发者,或者是走另外一条完全不同的技能图谱:系统管理员。当然这两个职业生涯的图谱是有重叠的地方的:一名优秀的系统管理员是拥有编程经验的,可以熟练使用诸如Python、Perl等脚本语言来完成一些特殊的任务的;然而程序员的世界就只有代码!

程序员

开源是学习编程技能的绝佳之路,你可以参考他人写的代码,借鉴想法,以及使用的技巧,可以从他人所犯过的错误中吸取教训,也可以亮出自己的代码接受他人的批评和指正。如果你使用的是 Linux 或 BSD 操作系统,整个系统都是为你开放的,——凡是能够看到的,都有可取之处。

其实上述的话是你经常看到的描述,然而,现实的情况是你可能根本就不会去深入挖掘项目的源代码,而是幻想着突然有一天就拥有了无敌的编程技能。这是绝大多数人对于编程的误解,编程真的是蛮困难的技术,如果它不是很困难的话,那么就不会出现目前这样一种情况:优秀的程序员难求!

然而,编写程序也不是那么的遥不可及,只要努力,机会还是大大的有的。编写程序是有逻辑和结构的,所以还是要看你自己本身。或许开始的时候真的很难,但是只要你肯下功夫,越多练习和实践,就越能够接近它,进一步的理解它。

理解了如何控制和自动化计算机是一码事,但是知道如何编写其他人想要自动化的东西是你跨越到编程领域的关键点。

学习多门编程语言

所有的编程语言目的只有一个:让计算机计算点什么。其实选择语言完全在于你自身的思考:你所处的行业使用哪些主流的语言?哪门语言对于你更好入门?能为你提供更加充足的资料?哪门语言比较适合你的性格?

有研究证明,一个人在获得了各种语言复杂性的信息后,最后决定选择哪种语言作为第一次尝试的语言因素是:让自己感觉舒适。

另外一个选择语言的标准是取决于你自己的目标。先去看看做同类事情的人们正在使用的是什么语言,然后就去观摩他们是如何使用该语言的。如果你的目标是开发桌面工具的话,你可能会针对某种桌面环境选择 C 语言或者是 Vala 语言,也可能针对另外的一个桌面环境选择 C++ 语言。

其实,完全没有必要为自己选择哪门语言而纠结。语言也仅仅是语言而已。当你能够精通一门编程语言时,也就是能够对语言本身提出反馈和意见时,学习和使用另外的其它语言,也只是顺手拈来的事情。毕竟“编程语言”只是一组语法和规则的集合,精通了一门之后,再学习其它都是异曲同工。

但是,话是这么说的,你最终还是得选择一门语言。挑一门你自己有感觉、顺手的,又或者是最为吸引你的,又或者是你身边的同事和朋友在使用,又或者是你理解起来最容易的,这些都不重要,重要的是你首先要集中精力学习一门编程语言,直到精通它。

保持开放

无论你是一名刚入行学习程序开发,还是一名刚刚接触开源的资深开发者,要想进入开放源代码这个崭新的世界,你还需要学习一件事:是什么让开源之所以称之为“开放源代码”。

开源有时候也会被一些供应商所利用,成为他们营销方式的一种噱头,这些公司仅仅是开放了访问的API,或者是听取了其客户的意见,就敢说自己的是开源的。词语“开放”并非是一个商标,也并非是无人管辖的地带,也不是随时都可以使用的,相反,有很正式的定义,Debian Linux 创始人 Ian Murdock 在开放源代码倡议中是这样定义的:开放源代码的意义在于允许软件可以被自由的使用、修改、共享。且被开源组织正式的承认,并能够持续的保持“开放”。

为你的项目选择一种许可协议,那么现在你就是一名真正的开放源代码开发者了!恭喜你,开始慢慢的渐入佳境了。

参与社区

你随便挑一个开源界的人士问一下,”开源最重要的是什么?”,Ta的答案一定是人本身! 如果一个项目没有活跃的贡献,那是非常危险的征兆——项目可能面临失败。计算机软件需要用户、缺陷报告者、设计师、以及程序员!共同努力协作,方能打造出好用的软件。

如果你有意加入或融入到一个全球性的开源社区的话,你需要成为社区的一分子。而这通常意味着订阅邮件列表、加入IRC聊天频道、在论坛灌水、以及干一些基层的工作。任何一个成熟的社区,历经多年,已经见惯了社区边缘成员的来来去去,所以此时你要明白一件事:想要让社区的其他成员理解你之前,你需要证明三个月之后,你仍然在坚持,而不是早已转身去其他更加耀眼或流行的项目,然后再考虑改变世界的事情!道理就是:当你渴望获得大的成功时,请准备好长远的打算!

如果你只是临时帮忙搭把手,社区也是非常欢迎的。举个例子来说,如果你为项目提交一小的补丁,有时项目会欣然接受,有时会断然拒绝。如果是拒绝的补丁对于你本身来说蛮重要,那么你就需要自己去维护它,当然多数希望项目能够接受你的补丁,这样你就可以省下一部分精力来继续做其他更重要的事。

这是整个流程的其中一个部分。

到哪去找这些开源社区了呢?这取决于某个具体的项目。有一些项目,会专门设立社区经理,这个角色就是让大家能够齐心协力的工作,当然做这件工作要在大家均能看到的公共空间进行。然而,还有很多的项目不会专门设立这么一个职位,有的是依靠论坛,有的是通过邮件列表,也有的是基于缺陷跟踪列表。只要用心去寻找,总有一个社区适合你!

哦,对了,差点忘了说最重要的:代码!之所以被称之为开放“源代码”是有原因的,所以要珍惜这个难得的机会,请去阅读源代码!虽然在开始的时候,径直去阅读代码超过了你的认知水平,但是不要畏惧,即使不能理解代码中确切的涵义,但是也可以了解到诸如项目的组织方式,运气好的话,还能得到哪里需要帮忙的信息。代码是如何组织的?代码是否有注释?代码是否有统一整洁的风格?细细的阅读一些文档内容,如README、LICENSE 以及 COPYING 等文件。

请不要低估开放代码承诺的重要性。这才是你参与到项目中去的真实原因。所以用从每个角度去观察、思考,你可以学习到什么,该如何参与做贡献。

寻找一个好的社区犹如我们在相亲时寻找意中人,但是大多数的相亲都是重复、无聊的。但不能因为重复、无聊,就放弃去寻找,它会花费一些时间,尤其是在最初体验了一些社区之后,觉得都大同小异,随着阅历的丰富,你越会觉得司空见惯、波澜不惊。但终究会找到自己的归宿的,随着你坚持不懈的努力、保持兴趣,你一定能够找到和自己“臭味相投”的人,然后你就会一直在某个社区“定居”下来。所以,请保持足够的耐心,心目中的理想社区就自然而然的会出现。

行胜于言

成为一名开放源代码的程序员只有代码(“源代码”是开源的部分而已)和想法仅仅是迈出了一小步。要证明自己的实力,你还需要向大家展示你所做的工作,且要不辞劳苦,为项目花费大量时间,而且你的想法能够用程序实现并运行起来。

当然,要做到以上这些,你就得需要在项目多花一些额外精力,学习并理解诸如项目是如何接受提交的,哪个分支是稳定版,而哪个分支又是开发版?

几点实用的方法论: * 要熟悉项目及其开发的文化,并且要尊重和捍卫它们。 * 撰写补丁、修复 Bug、或者是提交一些小的功能。 * 当你的提交被拒绝时也不要气馁,并非是针对你个人,你的成果是被众人评估过的,开发团队考虑过之后才这么做的。 * 即使你的提交被接受了,也不要骄傲,也就仅仅是个接受而已,想被认可,仍要继续努力。 * 奋进如斯,加倍努力,进行一些创新的工作。

在开源的世界中没有什么排行榜,当然有些项目尝试去做这些表面的东西,其实并无实质意义。积极的参与、提交代码、贡献自己的想法,这些才是开源世界真正的“生存法则”。

持续精进

无论你在何种环境之下,编程终究是一项属于个人的持续改进和发展的技能。无论你是在解决问题的时候搜索新的方法、或者在优化代码的时候寻找不同的路径、又或者是学习一门新的语言、亦或者是从别人那些学习更好的处理问题的方法,你必须去努力的让自己成长!你自己越进步,对于所从事的项目也就好处多多。

无论是个人还是专业程度,都必须持续精进!这虽然是我们今天所谈到的事项中最后一个,但它其实是贯穿于整个入门过程。成为一名开源程序员并非是成为了公务员那样可以不学无术,它是一个不断提高、不断练习的过程,你需要学习、需要分享、还得持续不断的学习!你可能中途会被其它事情打断,但是,一定要记住,一旦回复了正常,就去继续重复这个过程:学习、分享、如此反复!

关于开源的过程就是:自由的开发,让程序中的每个字都有意义!所以作为开源程序员的你接下来要做的就是:找到自己的技能图谱、选择自己认为好用的工具、不断的进行练习、努力提高自己,之后就是去利用这些实现点什么!

关于作者

Seth Kenlon 是一名独立的多媒体艺术家、自由文化倡导者、同时也是一名Unix的Geek,他是基于 Slackware 开发的多媒体解决方案项目的维护者之一。

本文由作者Seth Kenlon 发表在Opensource.com上:How to get started as an open source programmer。经授权,在开源之道翻译共享。本文在Creative Commons BY-SA 4.0许可证下发布。欢迎转载!