[杂谈]关于做开源项目与 side project

发布于:2019-10-26

杂谈

原文 关于做开源项目与 side project

大家好,我是Chris Wanstrath。

当Jeremy让我来做本次演讲的时候, 我非常爽快的答应了。 当然好了,这绝对没有问题, 然后我花了一些时间来思考,稍等,为什么呢?为什么邀请我?大家期待我去讲什么有趣的话题呢? 也许大家期待我讲一些关于Ruby的话题,或许是Ruby的未来,至少是未来的事物。这听起来很像是个主题演讲。

因此,为什么我不跳出Ruby未来这个话题,从另一个角度来来看Ruby的未来。在未来,Ruby将会变得非常流行。会有更多的实现方案。同时,也会有更多的程序员去使用它。更多的计算机会默认安装Ruby,更多的人去阅读和Ruby相关的博客。这听起来有点疯狂,但请相信我。 这就是我本次演讲的主题。

在未来的,会有更多的RubyGems,并且会有多RubyGems服务器。目前在撰写的新书,至少有一本,也可能是两本,我们甚至可以想象已经远超过三本。已经出版的书籍,将会发布新的版本,里面会增加更多的内容,更深入的探讨Ruby的新功能和细节。

更年轻的人将会选择Ruby,而当前这些Ruby使用者也随着时间流逝而变老。一些Ruby使用者养着猫或者狗。另外一些则不养任何宠物,一些人已经有了孩子。(这里有个常见的错误认知,在我的经验中,养孩子要比养宠物花费更多的钱和精力)。

很多网站将会使用Ruby,使用更新的Ruby On Rails和Merb。就像3.0和1.0一样的差距。一些有着奇怪名字的全新Web框架将被创建出来,并且被一些从没见过的人维护着。我们逐渐会发现,_why是一个非暴力的Joker,matz是很克制的Two Face,Nic模式是Penguin(他非常喜欢吃鱼),如果DHH是蝙蝠侠,那么我。。。我将是钢铁侠。

新的语言将出现,并且将变得流行。 很多人仍会继续鄙视Ruby,将其命名为“ Python版本的Perl”,或“ 适合书呆子的Java”,甚至上帝就不应该让它存在的“Web版本的Visual Basic”。(然而,从技术上讲,我认为这个角色应该是ASP的版本1到版本3)。

大学里面将会给那些继续获得本科学位的年轻人。绝大部分人会喝的烂醉,或者是经常处在宿醉的状态来上课,但是他们都渴望学的得新的知识。这个社会是行为驱动的,宏观环境不断的重塑我们,好吧,至少我们中的一部分人。

Proc. Lambda.

将会有更多的会议。 人们将在这些会议上发言,有时是关于Ruby,有时不是关于Ruby。 演讲者将是形形色色的人,大谈特谈Smalltalk的设计理念和光辉岁月。。。但是实际上他们基本上没写过任何Smalltalk/ 一些人会展示他们新实现的Ruby虚拟机的benchmarks,但是它们尚未开源或完全不是开源的,所以你也无法去尝试。

有人会提出全新的2.0版本,但是很快就风平浪静了。我们很快就随波逐流。测试将会被mock化,并且mock将会可测试的,那哪一个才是基础呢?

Ruby将会变快,但是很快它就会被超越,发布的新补丁会破坏兼容性,安全漏洞的处理方式也会很粗暴。但是大型网站依然会引来数十亿的访问者,小博客会如雨后春笋一样,有的会语惊四座然后变得平淡乏味,甚至无影无踪了。

最重要的是,Ruby将保持美丽。 至少,我们希望如此。这就是Ruby的未来。对我的主题是否有些感觉了? 让我们现在谈论过去。

约翰·冯·诺依曼是20世纪伟大的数学家之一。 他做的贡献有细胞自动机(cellular automata),集合论(set theory),函数分析(functional analysis),量子力学(quantum mechanics),遍历理论(ergodic theory),连续几何(continuous geometry),经济学和博弈论,计算机科学,数值分析,爆破流体力学(explosive hydrodynamics)和统计学(我知道其中的60%)。他还帮助发明了现代计算机。 我们现在正在使用的那些。

在1940年代,冯·诺依曼和一群才华横溢的天才聚在一起建造了计算机。 请注意,这不是第一台计算机。 事实上,“计算机”一词曾经用来描述计算数字。

查尔斯·巴贝奇设计计算机是受到人脑易于犯错的影响,当处理大量数字时,错误是常有的。 例如,威廉·香克斯花了15年的时间计算出707位数的Pi。可悲的是,他在第11年犯了一个错误。接下来的四年是 的计算完全是徒劳的,只有前527位数字是正确的。

因此,巴贝奇设想了一种可以执行精确指令并传递准确信息的机器。 如果机器可以做体力劳动,为什么不做脑力劳动呢?随着艾伦·图灵这样的人加入了项目,并提出了一些想法,最终生产出诸如ENIAC之类的机器,首台数字计算机。 ENIAC是一个突破,它和冯·诺依曼最初设想的架构在一些方面有很大的禅意:它将程序指令和用户数据都保存在RAM中。 在此之前冯·诺依曼的想法是,指令是可以修改的,指令与数据分开存储。

就像我说的那样,我们今天就是使用的体系(称为冯·诺依曼或存储程序体系结构) 。 当你在自己的系统中使用TextMate编写Ruby时,Ruby和TextMate都一起存储在RAM中。使用指令和数据一同保存到内存中的方案来实现一个简单的循环的例子,所有的分支指令都会修改为循环遍历。在ENIAC或其它早期的实现,这些翻译工作都是程序员手工实现的。(是的,首批程序员,都是女性)。 不管怎么说,在20世纪40年代下半叶,冯·诺伊曼和他的小团队聚集在高级研究所(IAS)中,并开始基于他的存储程序体系结构研究计算机。 公平地说,这也不完全是他的想法。 他也是站在巨人的肩膀上的结果。但是根据维基百科上的描述,在实现冯式计算机上面击败了冯·诺伊曼。但是谁会在意维基百科呢,因为冯式计算机已经深入到我们每个人身边。

制造冯式计算机的高级研究所(IAS)是由一些慈善家建立起来的,他们为这些科学家提供食宿,以支持他们继续进行研究,并且这个研究所就是一个离普林斯顿非常近的一个公寓,但是它并不隶属于普林斯顿,在那个时代,这个研究所中的首批成员,包括了爱因斯坦,冯·诺依曼等著名的科学家。因此,这个地方容纳了历史学家,科学家和工程师。 工程师们在地下室与冯·诺依曼一起建造冯式计算机,是不是很耳熟,知道今天这个地下室依然设计IAS的服务器中心。

在IAS中,建造冯式计算机作的这些人既是程序员又是工程师。 他们会自己焊接零件,对零件进行编程程序,并修复硬件和软件中的错误。 其实,他们通常很难区分硬件和软件错误。 代码是错误的还是机器是错误的? 这真的是一个噩梦。

他们使用了大约2300个Radio Shack真空管制作逻辑开关和内存。他们使用的材料是非常易损的,因此他们经常会开夜车到凌晨4,5点,为了保持清醒,他们经常喝大量加了糖的茶。在战争年代,糖是限额配给品,而他们使用了远超他们配给份额的糖,这让IAS中的历史学家和其他人感到非常不满。(听起来,像高中时我和我兄弟在Mountain Dew上的情景)。

当然,所有工程师都保留了笔记。做日志, 他们记录的内容绝大部分都是非常沮丧的失败,仅在后面的日子里面才有很多令人欣喜的巨大突破。他们的笔记被发送给全国各处的研究机构,这样才能让其他人复制他们的成果,使用冯式体系构建自己的计算机。

在最后,他们在1952年6月10日完成了这台计算机的建造,让这台机器可以真正的被投入使用。在其它的地方,也有使用的相似的计算机指令的机器完成了建造(尽管它们有着兼容的指令,但是你不能编写任何可移植的程序)。并且IAS的这台计算机,立刻肩负起了它应有的使命:协助制造氢弹。

第一枚氢弹于1952年11月1日引爆。这枚被称为"Ivy Mike”的氢弹在太平洋的Enewetak环礁上被引爆,它比投掷在长崎上的原子弹的威力要大450倍。

由此可见,数学家们建造了第一台现代计算机,用以帮助他们进行应用数学和流体力学的计算,他们可以说真正的黑客。他们做了一个前所未有的side project,可以说完全是杀鸡用牛刀了。(有趣的是,这也可以解释为什么每个人都认为一个非常棒的程序员需要非常精通数学,但我不能完全认同这个说法)。

时至今日,已经有很多高收益的Ruby项目了,这些项目都是从side projects逐步演化而来的,其中一些,甚至可以说是重量级的项目。当前Rubinius已经有5位全职员工了,但是它完全是由Evan Phoenix在2006年创建的Side Project发展而来的。他当时只是想建立自己的Ruby。Ruby on Rails本身也是一步步从Basecamp中分离出来的,也是37signals的一个Side Projects。那时Basecamp还只是一个设计公司,而David Hansson是一个合同员工。

没有人确切的知道_why是做什么的,但是Shoes会即便没有利益驱动,也会不断的发展。只是为了一件事,就是将GUI放近他们最喜欢的计算机语言中,因为我们都在其中获得了乐趣。Merb最初是一段非常简单的脚本,是Mongrel上的一个封装,为了能并发高效的上传文件。但是现在Engine Yard的开发人员已经将他们发展为一个框架了(我都不确定一个gist是否能容纳它所有内容了)。

我们应当拥有自己的Side Project。Side Project 可以扩宽视野,让我们身心愉悦,探索新的想法,学习新的技术,当然我们也无需为此感到有压力或负责。我们无需担心自己的老板,同事或者那些在Reddit大谈特谈的家伙们。我们只是想找些乐子,让我们放飞自我吧。

大学辍学后,我在一家PHP开发公司,从事卡车运输工作物流应用的开发。我们是独立卡车司机与KMart等大型公司之间的经纪人。 卡车司机会在我们的网站上注册,说他们将在5月3日到达特拉华州,并前往丹佛,然后获取沿其选定路线的货运信息。 然后他们可以通过我们对货物进行投标或承接运输任务。

它是一个非常复杂的应用,但是它缺少两样东西:版本控制和常量。因为这里没有版本控制,所以你可以想象像main2.php和compute_radius_of_from_shipment7.php这种文件四处都是,尽管版本0到版本6是同一个文件,但是它不可避免的出现在我们的项目中,这真的非常非常痛苦。没有常量,也没有配置,因此源代码是充满魔法数字。 如果想调整我们的任何一个算法,就必须找到进行计算的代码,手动更改一些数字,并希望这个数字是对的。

自然,我要做的第一件事就是使用Subversion(显然我一直是源代码管理的拥护者,但是直到把这个故事写到纸上才意识到。)我做的第二件事是开始将魔法数字提取到配置文件。 那时我使用了一个PHP非常常见的PHP解决方案,就是将这些魔法数字,提取到.ini文件中。 我所需要的这些PHP都默认支持,我非常确定的说PHP附带一个可以解析.ini的文件的库(它是全局命名空间中,添加了一些函数)。

它看起来还不错,但是当我看到rails时,我被YAML文件给震惊了。它是那么的清晰和强力,Ruby对YAML的解析使用了_why所编写的C语言扩展Syck,但是我对C扩展一无所知。不知道PHP如何加载C扩展,更不知道如何在我们的服务器上部署C扩展。因此我利用我的业余时间开始为PHP编写一个YAML解析器。为了致敬Syck,我将自己的解析器称为Spyc,意思是简单PHP的YAML类。它是我编写的第一个使用状态机的Parser,为了支持YAML的饮用和指针,我对YAML进行了两遍解析。这个解析器,并没有完全支持YAML的规范,但是它支持YAML中绝大部分东西,包括存储和加载以及一些非常有用的部分。在我们公司成功使用YAML文件之前,我就偷偷的将这个模块签入我们的代码仓库中。当然,我将我的代码放到了SourceForge上,当时在线源代码存储的王者。我的设计师朋友为我做了一个展示页面,在第一个月Spyc就获得了很大的成功,它被下载了70次,70次呀!

这非常重要(译者注:自己也有过同样的感觉,这是一种别人对自己工作的认同,自己真的解决了一些人的实际问题)。

在公司工作了9个月,在我反复思考我自己的未来时,我发现卡车业务并不是我职业规划上的正确选择。毕竟他们只是雇佣了我。因此我辞职了,并重新回到学校学习,这次我选择了计算机科学而非英语,这才是我未来的道路。

在这个夏天即将结束的时候,我的一位朋友,可以说是我的挚友,他长期浸淫在Digg和视频游戏中,但是离成为一个程序员还相差甚远,他问我,“嘿,你知道MySQL吗?”。“该死,” 我想,如果这次对放在现代的 一天,相当于说朋友问为什么在实施滚动升级时,Ruby网站总是宕机。“是的,我知道MySQL”,我回答道,“那么,你也知道PHP了?”我的挚友追问道。“是的”,回答的同时,我对这次谈话的走向感到了困惑。 “GameSpot在招聘,你应该去求职”,我的挚友回答了我的所有疑问。

啊,GameSpot。 他和我都喜欢玩电子游戏。 高中,我在当地的GameStop工作过,在大学里时,我在商场中的EBGames工作过。 我拥有所有现代的游戏机,包括Atari,NES,创世纪等等。Gamespot.com是我在高中和大学时经常访问的网站。 顺便说一下,请注意GameSpot和GameStop是不同的名字,这导致我的家人无休止的困惑,以为我已经搬到加利福尼亚去零售了。啊,美好的美国梦。

因此,当你使用Google搜索视频游戏时,GameSpot通常在结果中排名第一或第二。 我很清楚 GameFAQs.com(游戏中FAQs)和GameSpot是同一家公司在运作,也许我经常使用的网站都是这家公司的。 它的内容 基本上是通关演示,操作方法,指南和作弊条。 非常多的作弊条。

当时我并不知道旧金山在哪里,GameSpot在招聘什么水平的人,但是我申请了。我创建了全新的简历,通宵达旦的写了一份求职信。当我完成这封求职信的时候,它已经非常长了,看起了也非常有说服力。在其中我许诺第二天搬到加利福尼亚,除了吉他和Xbox,我将不带任何东西。 我的家人会想念我,但我已经决定准备离开,我渴望向世界展示我在本科阶段学习到的东西和我的能力。电话面试进行的非常顺利,他们很高兴我使用Mac和Ruby,毋庸置疑我得到了工作,当我一到达加利福尼亚,我就和父亲去找公寓。

我想我的工作经验并不是我得到这份工作的原因。我很确定我得到这份工作和自己的求职信有很大关系。我在货运公司短暂工作经历也聊胜于无。我真正展示给GameSpot最有价值的东西是Spyc,我的代码是开源的,并且在生产环境中使用过。他们可以下载,尝试或在线查看。不管他们是否认为它很好,但是他们已经深思熟虑。或许,只是因为我有一个网站和70个下载量。不管怎么说,我在GameSpot获得了职位,感谢我的开源的Side Project。我从这次就职活动中得到的经验是,我们不需要用代码赚钱,而是靠代码产生收益。 我没做从Spyc赚钱,但是我得益于Spyc。(还有本书中叫这个名字, 但这是一个不同的故事。)

这是不是很酷,我本来以为这次经历是独一无二的,但是它又发生了一次。当我在GameSpot工作的时候,我做了很多Ruby的Side Project。我有一个开源的Rails的tumble博客叫Ozimodo,一个非常简单的FTP服务器叫ftpd.rb(我用它来学习多线程)和一个命令行选项的DSL Parser叫Choice。当我在编写Choice的时候,我添加了完整的测试用例(我写这些东西是为了学习TDD)并且在Rubyforge上使用用RDoc生成一个页面。

当GameSpot的母公司CNET收购Chowhound时,他们决定在Rails中重写该网站。 他们从Wayfaring.com的带来两个Rails程序员,正在寻找另一个。 他们找到我。稍后我发现Wayfaring.com的那些人,看到我Rubyforge上的Gem和测试用例,他们认为我是一个真正的Ruby程序员,他们需要的是一个对这些东西感兴趣且非常有热情的人。因此他们用一大笔钱说服我到Chowhound工作,再次感谢我那些开源的Side Project。这发生在我身上两次,所以并不少见。开源会促使很多不可思议的事情发生,不单单是在经济上,而且在社交上。在Chowhound,我遇到了GitHub的共同创始人PJ Hyett,同时也是博客Err的博主。

所以开始一个Side Project吧,让人们知道在哪能找到你,让人们知道你能做什么。你现在有Side Project吗?如果没有,那是为什么?没有空闲时间?没有想法?我想我在两方面都能帮助你。

首先,时间问题。 我不知道你们中有多少人阅读RSS,但是我给你们的建议是(这是一个主题演讲),一个月内不要再使用它了。只要关掉它,从今天起,停止使用Google Reader或NetNewsWire或现在时下流行的产品。 这不值得浪费你的时间。那么你应该怎么做呢? 如果你使用Twitter,请尝试遵订阅你最喜欢的博客的作者。 在公共汽车上或者在洗手间阅读他们的推文。 每周检查一次Ruby Inside,并快速浏览下帖子。每个月访问一次像planetrubyonrails.com这类的新闻聚合器。让别人为你过滤内容,用你的时间做其它的事情。你不会做过任何重要的事情,像Googel App这样的运行引擎,或者Rubinius,或者今年Ruby Hoedow上重量级的演讲者。怎么会不呢 ?我愿意打赌你的RSS阅读器中的很多东西都是你已经知道或听说过的东西。以前,我个人每天要检查RSS多次, 单现在我不使用任何阅读器,从2008年1月开始就再也没有使用过。

我发现,程序员之间的另一个很花费时间的地方是阅读理论和过程的书籍。 诸如Smalltalk最佳实践模式之类的书,敏捷开发人员的实践,甚至我敢说Pragmatic Programmer的图书,不值得浪费你的时间。 相反,请听Rein的演讲,和朋友或同事交谈。让其他人帮你提供信息,然后再决定你需要什么。学习模式,惯用法和最佳实践的最佳方法是:阅读开源代码。 查看其他人的做法。 它是了解行业最近发展和最新技术的好方法,而且是完全免费的。(我真的希望有人在我购买并阅读《 Head Start Design Patterns》之前就告诉过我这些事情)

接下来使用Jerry Seinfield GTD方法。 每次在做Side Project的时候,就在日历上把这一天标记一个大X。最终,你会看到X组成了一条很漂亮的线。 缺少一个X会很不开心-因为它是你美丽的线条变得混乱。最终你会发现你的目标是保持连胜,即使你当天没有任何想法,这是克服惰性的最佳方案。好的,现在我们没有任何借口了。现在你有时间开始一个Side Project了,并且只需要坚持不懈,我们就有一本画满X的漂亮的台历了。至少,每个月,我们可以投入一个星期日来做事情。那如果没有任何想法该怎么办呢?

这实际上是简单的部分,因为你不需要一个好主意,只要开始做一些自己感兴趣的事情就好。例如使用Ruby的新框架,我听说Sinatra最近很潮,使用Shoes做一个GUI相关的东西。例如说学习JavaScript。 我还是很喜欢它的,真的。 如果你不知道var,with和delete这些关键字是什么,来本书,然后开始编写一些华丽的效果。或者下载Rhino和Johnson,编写一些服务器端的JS。JS是一种非常实用,但是误解很多的语言。花一些时间来掌握你的编辑器。 拿起TextMate书,然后深入到其中。写一个插件。 如果你已经拥有大量的Vim-fu,请尝试Emacs。 了解人们为什么喜欢它,然后使用其中的信息在Vim和Emacs的圣战中对抗他们。编写一个Web服务器,像 Cheat, Subtlety, Disqus或者TwitPic,或者编写让人方便编写博客,网站或编写代码的工具。做一个只做一件事情的简单网站,并且提供API让人们获取信息。

如果你一直想学习一种新语言,请开始学习它。但是,不要只是看书。 开始编写程序。如果学习Objective-C和Cocoa。 可以编写一个简单有用的Mac应用,然后免费分发出去。将代码发布到GitHub上,添加一个捐赠勋章,并接受捐赠,获取利润。用Lisp编写一个Rake,这是学习元编程的好方法以及使用新语言编写命令行脚本。 写一个RSS解析器或探索Erlang中的基础数据类型, 写一个简单的博客,并了解Haskell的Web框架。 在Io中使用OpenGL来编写拼字游戏,不要在意人们以前是否这么做。实际上,不必担心其他人怎么看待这个东西。 每当我做一个我认为别人真的会喜欢的项目,总会失败。每当我从事自己喜欢的项目时,它都会奏效。如果你坐在这间房间内,我想你和你周边人的品味都不会差。建立自己喜欢和他人也会喜欢的东西 (当然,不是所有人)。另外使用你喜欢的语言尝试一些困难,甚至可以说是不肯能实现的东西。不断探索边界。探索Ruby的边界,安装ImageMagick,重写所有的标准库,写一个Objective-C的绑定。有些东西简直是恶魔,不断折磨你,扩展你的大脑。

在你的小项目花费几个星期日,然后完成它,并不断强化。学习一种全新的语言,并使用新的语言写一些新的玩具。用全新的Web框架,创建新的华丽效果。给Rake添加并发功能。你对这个过程投入的越多,就会涌现更多具有创意的想法。10%的想法,来自于90%的函数,至少,这个过程对我有效。

毕竟,这就是GitHub的启动方式。 Tom和我平日都是全职工作,但我们周六会聚在一起,共进午餐,然后持续开发GitHub。最开始我们只想有一个简单且美观的工具来分享Git仓库,它将是我们更容易分享开源项目。现在我们有三个人都全职开发GitHub,GitHub现在有成千上万付费用户和数以万计的存储库。

但是罗马不是一日建成,它是一个过程。我并非一从高中毕业后,就拿起一本Ruby的书,然后认识Tome和PJ,接着就是开始GitHub的。在GitHub上线之前,按照时间顺序,我开发了Spyc, Ozimodo, my ozmm.org tumblelog, ftpd.rb, Choice, Err博客软件, acts_as_textiled, Cheat!, acts_as_cached, Mofo, Subtlety, cache_fu, Sexy Migrations, Gibberish, nginx_config_generator, fixture,scenarios builder, Sake, Ambition和Facebox。并且这还是我发布出来的。拥有越来越多的开源项目,我也感到维护开源项目的不易。如果你已经拥有自己喜欢的工作,这些事情也不会将你排除在外。也许你每天使用中,就有很多他人的Side Project。你也会在平日的工作中使用自己的Side Project。从Emacs的配置文件到Web服务器,这里有很多事情可以锻炼你的思维。

当我在编写Cheat的时候,我并不是打算离开Chowhound,我只是想要查找不常用命令更容易些。TwitPic和Twictures这类东西,与任何人的工作都没什么关系,只是想让互联网的生活更有趣些。 从经济角度来看Ruby on Rails,可能是赚钱的好想法,但是Shoes就很难说了。我的建议就是,现在就开始自己的Side Project,解决自己问题,要有创造力,分享出去或者敝帚自珍。Side Project比阅读RSS,比MobileMe更有用,比Reddit上的评论更有教育意义,甚至比听主题演讲更加有真实感。

谢谢大家的聆听。