转载自:http://blog.csdn.net/bruce0532/article/details/7382673
由于不明原因,本文不是完整的。。。
其他某些部分:http://sbbs.me/view_article/50606ecb08158efb55000009
1. 开始之前¶
1.1. 这份文档的目标读者¶
软件开发初学者¶
这是一份面向软件开发初学者的文档,所谓初学者,可以定义为:学过的语言不超过2种,在已经学过的语言技能方面,能够完成课程上的大部分习题。从高校教育的通常情况来说,基本能够完成老师布置的最后的课程大作业。如果要说学得很出色,大概谈不上。要想进一步提高,也很困难。
对于大学毕业(正负1~2年)的同学们来说,他们很难接触到真正较为复杂的项目,即使参与到复杂的项目之中,也会是其中非常细枝末节的部分。他们渴望快速的提升自己的软件开发能力,而恰恰最缺乏提升自身能力的机会。
因此,本文希望能够介绍一种较为合理的方法,帮助各位"同学",以较为科学合理的方式,提高软件开发的实力。
开源软件的初次使用者¶
在软件开发这个领域,完全不接触开源项目,几乎是不可能的事情。在日常开发工作中,如何借助开源项目提高开发效率,减少重复劳动;如何从开源而受惠,而不是因开源而受害。也是一个很有意思的课题。本文也希望能够通过分享过来人的经验,帮助那些初次接触开源的朋友。
开源社区外徘徊的爱好者¶
想要成为开源社区的一份子,在享受开源带来的好处之后,也能够回馈一些帮助给开源社区?开源社区到底是怎么一回事?有很多人对于开源有着天然的好感,希望能够加入进来,能不能更快的融入开源社区,能不能为开源做出更多的贡献,甚至启动一个自己的开源项目,拉起一支队伍来做些了不起的事情。有这样想法的朋友,应该也不少,希望本文的介绍能够起到一定的帮助。
《由于这是一份开放式写作的文档,因此,当我写下这段话的时候,我并没有特别确定的把握。这份文档将只有以上三类目标用户。也许,它能够对更多的人产生价值......》
1.2. 基本条件¶
一台能够上网的电脑¶
如果我说,以上就是全部的基本条件,似乎的确是太不负责任了。但是,真的也就够了。假设你只是研究JavaScript的开源项目的话,装一个FireFox/Chrome这样的对开发者友好的浏览器,基本上就可以开始学习了。
再进一步,当然可以有更多的考究。比如:究竟是选择Windwos还是Linux/MacOS?Linux又应该选择什么发行版?等等等等,一旦深入,自然有无穷无尽的问题在等着你。
首选Ubuntu¶
首先解释为什么要选择Linux,因为开源软件,在很多情况下都是Linux的版本更加稳定可靠,在解决版本依赖问题的时候,也更加容易些。当然,在Windows下面,也有非常非常多靠谱的开源项目,因此选择Linux更多的是出于一种多多使用开源的偏好。
金庸先生的《神雕侠侣》中提到的寒玉床,可以用来解释这其中的奥妙。当你完全处在一个开源的环境,当你的各种操作都会接触到与开源相关的各种概念时,你就时时刻刻都在进步中,这样获得进步自然会更快一些。
再说为什么选择Ubuntu,这就更是个人偏好了,因为Ubuntu的易用性目前看来还是最好的。对于初学者来说,也更加友好一些。网络上的中文资源,也更多一些。
另外,网络上有一篇非常著名的文章叫做:《开发人员为何应该使用 Mac OS X 兼 OS X 小史 》,也写得非常有说服力,推荐阅读一下。
如果你真的喜欢Windows¶
必须承认,在Windows环境下,还是可以学习开源的。也有很多很多开源人,努力的在Windows平台下工作。很多环境的搭建工具,被一点一点的开发出来。比如:RubyInstaller;XAMPP;以及cygwin等等。(具体的名词这里不解释)
但是,很多时候,你会遭遇莫名其妙的报错,很多人会在某个深夜,突然抬头望天,破口大骂:“这个烂Windows!”不是没有道理的。
不会被阻隔的网络¶
是的,这篇文章如果有幸被翻译为英文,这一段话可以被完全删除。因为他们无法想象我们还会遇到这样的困难。而克服这种困难,对于学习软件开发,又是绝对必须的一种技能,所以......如果你真的发现目标网站无法访问,寻求帮助吧。(抱歉,无法在这份文档里提供帮助。不过,我留了email。)
Google在大多数时候,对于软件开发来说,都是更好的搜索引擎,所以,哪怕你费尽千辛万苦,也一定要用Google来搜索想要寻找的项目、文档和资料,必须的!
1.3. 你需要明确的一些事情¶
你真的想学习软件开发吗?¶
在正式开始学习之前,我实在是忍不住,我想一遍又一遍的询问你:你真的想吗?你真的想成为一个“码农”吗?你真的想掌握软件开发这门手艺,甚至以此来谋生吗?那么好,我得告诉你一些事实:
- 软件开发绝非你想象中的事少钱多责任轻的那种高薪白领。很多程序员会自称“码农”,就是因为这份职业非常的辛苦,而且做好不易。
- 另外,这是一份需要终生学习的行当,很多很多的其他领域,没有那么快的知识更新速度。但是软件开发这个领域,1~2年不接触技术最新的进展,你就OUT了。
- 还有,软件开发这个行当,真的未必那么好找工作。就业前景什么的,并非想那些传说的成功故事一样光明。
但是,真的有一些人,热爱这个行业,编程不但是他的工作,他的业余爱好也是Coding。
如果,你确信自己不仅仅是靠编程来维生,更是将编程作为自己最大的爱好,那么欢迎您,来到一个神奇而充满魅力的世界。这里有智慧、有乐趣、更有热心的朋友和充满前途的事业!
你真的适合软件开发吗?¶
虽然,软件开发并非像传说中的那样,是一个需要高智商的Nerd的行业。但是,他的确需要一些品质和能力,如果你发现自己并不具备,或者要很辛苦才能做到。那么,你不适合这个行当。
- 懒惰:有一句名言这么说:“懒惰是程序员的美德”,因为真正的程序员,一定痛恨反复做同一件事情,至少他们会写一个函数来替自己完成。如果发现代码里重复出现相同的段落,他们会无法抑制的想要消除这种重复。
- 条理:如果这是一个复杂的事情,那么我可以分成三个阶段来着手去做它。如果仔细想想,第一个阶段,还可以分为5个部分。在开始第一阶段之前,还有4个准备工作,必须首先考虑。
- 耐心:很多时候,程序里的麻烦会来找你,如何解决?解决“bug”需要洞察力,需要细心,而最需要的,则是耐心。有些时候,我会非常享受这种“破案”的过程。
- 好奇心:值得好奇的事情太多了,永远学不完的新技术;最近的进展和最佳实践。甚至其他行业和领域的究竟,我们都有充沛的好奇心,因为无论哪个行业,他们早晚都会来找到我们,帮他们编写代码的。
- 较真:很多事情,据说都差不多就可以了。但是,计算机是那么严格,快百分之一毫秒,也是快了。一个万分之一概率下会出的bug,还是bug。如果你不是一个足够较真的人,就会放过很多问题,而那些问题,往往就会酿成大祸。
OK,闲话少叙,咱们开始吧!¶
2. 开始¶
2.1. 学习软件开发的几条主要途径¶
一万小时的神话¶
前一阵子我在网上与人讨论一个一万小时的话题。有一本叫做《异类》的书中说到这样的观点:世上本没有绝对的天才。天才也需要超过1万小时的训练。人人都有可能成为顶级高手。具体可以参考一篇流传甚广的文章《怎样练习一万小时 》
在这种理论的基础上,有人提出了“一万小时编程训练”的概念,似乎经过一万小时以上的训练,普通人也有可能成为编程领域的“大师/高手”。但是,这个理论其实是一个貌似建立在统计学基础上的伪理论。
首先是范围,多大的一个范围,算是一个领域呢?编程是一个大的范围,编译器或者数据库编程是其中两个不同的领域。如果有人用一万小时专注于编译器的开发,他们对于数据库方面的编程,可能是一窍不通的。那么,这种人,算不算编程领域的大师呢?如果有人用一万小时专注于汇编语言的编程,那么对于新出现的面向对象的脚本语言,能够有多高的水平呢?
其次是训练,在一万小时的相关统计中,提到了舞蹈、音乐等众多需要反复练习的领域,而这种针对熟练程度的训练,真的是编程领域需要的吗?当然,我相信提高打字熟读,的确有助于提高代码编写的速度,但是这真的有助于提高编程的能力吗?要想在软件开发这个领域,讨论如何才算是训练了一万小时的编程,会非常困难。
最后是关于知识更新,在一个每天都在诞生新名词,新技术,新思路的领域,一个曾经埋头苦练一万小时的高手,在3年不接触最新知识以后,还能称之为高手吗?
总之,匆匆忙忙的接受了一万小时的概念,被激励得热血沸腾,打算下定决心奋力学习一万小时编程,通常不过是“励志书中毒”的症状而已。
软件开发的能力体系是怎样的?¶
在很多领域,我们都可以用一个金字塔模型,来描述该领域的能力体系,在软件开发领域,同样如此。
- 高
- 创造能力
- 中
- 逻辑能力
- 理解能力
- 低
- 基础知识
- 编程技能
- 领域知识
简单解释一下:
低的三项,属于知识类。基础知识包括计算机、数学、算法、逻辑等等知识,这些知识,通过认真的学习书本教材,基本能够掌握。
编程技能,往往是跟具体的语言相关的,当然,多学几门不同的语言,对于快速掌握一门新的语言,大有帮助。
领域知识,则是与工作的具体方向有关,比如针对多媒体领域的编程,自然要熟悉图形、图形、声音等等的相关领域知识。针对企业级应用的开发,对于管理制度、财务、成本、仓储的东西,总得搞清楚才行。
中与高的两项,属于超越编程局限的通用能力,不仅仅是软件开发上用得到,在各方面都非常需要这三类能力。逻辑能力,可以通过训练提高;理解能力,可以通过经验积累;而创造能力,的确比较难,有天赋的成分在其中。
有哪些途径,可以锻炼这些能力?¶
- 阅读与习题:找到一堆的经典教科书,狠狠的读,认真的把书里的习题都给做了,这样对于打下扎实的基础,将会有极大的帮助。
- 视频教程/ScreenCast:每次讲解一个主题,学习一下总会有收获,只是效率不高。
- PPT/Slide/PDF:这种属于某次技术会议上的演讲稿,如果能够配合视频看,效果还好些,否则通常会不知所与。
- Wiki:针对某个词条,某个特定的问题,会有相当清晰的解释,不过要看运气,有些词条的解释就非常粗略,甚至过时。
- Blog:在分享知识与经验的过程中,blog是很不错的载体,如果你能够找到的话。
- BBS:曾经是最主要的学习方式,很多人通过泡论坛来提高自己,不过说实话,效率很低,而且容易跑题。
- 问答社区(StackOverFlow/Quora):新兴的交流社区,在面临特定问题时,可以尝试搜索或提问。平时泡泡,努力回答别人的问题,也有助于自己的提高。
- 工作中的项目:当然,老板给你发工资,肯定希望你尽快完成,在压力之下,通常进步都会很快。只是这种进步也许是你无法选择的。
- QQ群:真的有人借助QQ群来学习吗?
- 开源项目/开源社区:当然,这个是最重要的,咱们下节详细说。
2.2. 为什么借助开源学习是最有效的¶
为什么要学习¶
学习有不同的目的:有人学习是因为兴趣或者好奇;有人是为了增加生存的技术,把学作为改变工作、生活状态的手段;当然,也有些人,学习是为了思想的交流,与周围的人交流,与远方的朋友交流,与过世的先哲交流。
静下心来,仔细想想自己为什么要学习很重要。如果学习的目的不明确,学习就缺少源动力。这种思考在学习之初是需要的,在学习过程中也同样是需要的。因为随着学习的进行,个人对学习的态度、感受也会发生变化,学习的目的也需要及时的调整。
一个善于学习的人,是能充分利用各种学习机会进行学习实践的人。有人七十多岁开始学画油画,也有人利用每天坐地铁的时间学会一门外语,甚至还有些人把微博、网络公开课作为学习的重要工具。只要学习目的明确了,学习就变成了一件有意义的事,因而才可能持久。
生物进化的几百万年,才使人类有了学习的能力,这种能力是区别与一般动物的。人类的学习是一个觉醒的过程,近百年人类文明高速演进,特别是互联网的出现,使学习的从原始的环境适应演进为主动的创造并迅速转为社会向上的推动力,或者破坏力。
源代码是最好的营养¶
知识是多样的,学习的目的不同,学的内容也不同。计算机的出现,使学的工具发生了根本的变化,而程序的灵魂,因此学习编程不仅仅是软件工程师的事,它应该成为每个社会成员的一个基本的技能。正如语言是人类交流的基本技术,编程是人与机器交流的基本技能。学会编程,可以使机器按照你的意志运行,使每个人按自己的兴趣整合信息资源,以利于更有效的学习。
软件是近百年发展最快的技术之一,特别是随着智能手机与平板电脑的普及,软件技术更是渗透到了我们生活的各个方面。学会编程,并不意味着要去要去建一个复杂的系统。其实写的个报表的计算公式或者做一个小动画可以是一种编程的体验。
软件编程需要的基本环境就是一台电脑,当然如果有互联网的接入则更利于交流与技术信息的查询。
使用Linux最大的好处是它本身就是一个软件开发的开放平台,你可以方便地下载各种开发工具,比如gnu c/c++,python或者其它。你应该学会使用apt-get, 这是一个Ubuntu下强大的软件包管理工具。
在网站kernel.org上,有各种版本的内核源代码,如果你想从根本上学习操作系统,也可以通过LFS快速地学习内核构建的过程。
源代码开放的最大的好处是我们不需要重复设计和制造轮子。每个人都可以在软件巨人的臂膀上构造自已的梦想代码天堂。
无论从美国的facebook 谷歌 苹果还是中国的华为成功的经验中我们可以看到,开源的代码以及开源的项目是当前众多商业公司的技术立足之根本。开源已经造就了无数商业神话。我们大部分人只知道苹果的酷,但很少有人在苹果的版权说明中,看有关开源项目的罗列。
微软的比尔盖茨以及苹果的乔布斯大家耳熟能详,但对软件产业最有影响力的人应该是出生于芬兰的李纽斯(Linus Torvalds)。谷歌正是采用linux为内核,才使android几乎在一夜之间串红并重创诺基亚。而李纽斯在软件界的影响力,堪比罗马教皇。
有一部电影叫源代码,也许对代码开源化的一个隐喻。如果你读到了关键的源代码,也许你真的可以改写历史。当然,李纽斯说得很好,开源应该是快乐的,“Just for fun”。我们不需要太多的使命感与焦虑,改变世界也许只是一个顺带的结果。
方向不对,努力白费¶
在中国,如果你想面朝大海,应该是一路向东。当然向西也是可以的,不过要多费些周折。技术的更新非常快,但如果把握了大势往往可以事半功倍。
举一个实际的例子:十多年前,PHP是一个相对冷门的编程工具。在很多场合,很多人都不好意思说自已是搞PHP开发的。而如今,PHP已经成为主流的开发工具,很多搞.net处于生计的考虑,不得不转向Java,或者PHP。
选择开发工具只是软件工匠们需要认真定夺的一个方面。其它如系统构架、测试方法、团队管理、决策者眼光等等,更是关系每个程序员未来的诸多要素。
开源的精神内涵使学习变得更加有意义¶
在商业极度发展的今天,人们对物质的无限追求使很多人忘记了生活的本质。人被异化为物的附属品,价值被虚拟的概念、标签重置。
互联网的出现,促进了人类相互之间的沟通。软件高速更新发展的自然需求和因团队协作所带来的有效性、高效性造就了一个全新的文化:开源文化。软件便与分享、开源代码便于扩展的特质,使以Linux操作系统为代表的开源项目迅速崛起。大批的软件工程师不仅通过开源项目找到的精神寄托、同道中人,而且还找到了与商业社会有效融合的模式与渠道,解决了事业与兴趣结合问题,实现了生活、学习、工作甚至社会公益有完美统一。
在开源精神的感召下,学习变得更加积极主动。在分享、贡献的核心价值体系下,人们能充分体会人心温情的另一面。与传统商业社会利用信息不对称在交易中图谋利益最大化不同,开源世界里的人们在创造、协作的过程中完成一个又一个不断成长的软件系统,这些系统有些使整个社会运行更有效、当然也有的在损坏甚至危及社会的安全。人类精神世界的两面性在开源世界里更直接、更激烈地表现出来,正在影响着现实的诸多方面。
开源社区是最好的学校¶
软件是构建虚拟世界的基础,而开源社区则是软件新技术产生、发展的主要场所,因而也是学习软件技术最好的学校。
当前最大的网络社区应该算游戏社区,这个社区的人大多是在消费社会资源。而开源社区则分化成两个阵营:一个是以创新、创造为目地的,创造社会价值;另一个则是以破坏、非法取得信息资源为目地,损毁社会资源与体系。
在开源社区里,有大量热心的程序员他们乐于分享自已对技术的理解、心得,他们通过各自的行动扩大自已的影响力,在协助别人的同时不断加深自己对技术的理解程度和实践能力。而新的社区加入者也可以在与社区互动的过程中找到自已技术与精社的导师(Mentor), 正如电影黑客帝国(Matrix)中尼欧(Neo)遇到摩菲(Morpheus)。
如果说我们生话的世界是上帝创造的,那么我们对面的这个数字的世界则是由程序员创造的。数字世界与现实世界不断地融合,使现实世界与虚拟世界的边界变得越来越模糊。在学校课堂里,陈旧的教学方法、过时的教学内容、有限的学习资源是无法与互联网上丰富的开源社区资源相比的。社区内部团队协作的自发性、自主性、可靠性也极大地提高了社区成员学习的效率,并使个体超常规成长成为可能。
在媒体上经常看到十、三四岁的少年创造一个个软件项目的奇迹,殊不知这与国外成熟的开源社区发展息息相关。如果国内开源社区渐渐发展起来了,我们有理由相信在不久的将来,我们的周围会出现众多皮尔斯·富里曼(Pierce Freeman)这样的天才少年。
移动互联网时代,学习是开放的更是开源的¶
随着智能手机、平板电脑的普及,学校以及教室的功能将被弱化,人们可以在各种公共场所组成形式多样的学习社区。而开源社区提供多种专业技术人员以及业余爱好者面对面交流的机会。有的地方还出现了包括软件、硬件开源的创客空间。大家在无线网络环境下快速组成学习社区,分享交流最新的技术,互相协助解决各种技术问题。发现的志同道合的朋友,有的技术团队在天使投资者的支持下,在学习的过程中还可以建立创业团队。
在企业的内部,根据企业的发展战略,也可以形成企业内部的开源社区,通过开源项目整合企业内部与外部的技术资源。开放的心态使企业以开源文化的发展为契机引领技术的潮流。
2.3. 选择一门语言¶
首先需要说明,这里所讨论的选择语言,并非工作中开发语言的选择,而是出于学习软件开发,提高软件开发能力的目的,讨论如何选择语言。
一些基本的判断依据¶
- 最好是跨平台/平台无关的语言。比如Java、Ruby、Python、PHP、JS这样的语言。.NET平台的众多语言,因为mono的存在,现在也算是跨平台的了。
- 这门语言所创建的开源项目,要足够多,可供选择。C/C++、Java、Python、PHP都可以非常好的满足这个条件,随着github平台的出现,Ruby的开源项目现在也越来越多的了。随着nodejs的兴起,JS的开源项目也呈现明显的上升趋势。
- 语言以及语法本身,要具备较好的可读性。这里我非常推崇Ruby,因为这门语言从创立之初,就是极端重视代码可读性的,整个Ruby社区的风格,也非常强调代码的简洁优雅。
- 相关的文档资料容易查找,这方面大多数流行语言都符合条件。C/C++、Java、PHP、C#、Python都已经极为丰富了。
- 最好身边有能够随时请教的这门语言的高手。有这一条,基本就足够了。
- 最好能够至少分别学习一门静态类型语言与一门动态类型语言。
推荐一些语言学习网站¶
- 《笨办法学语言》系列,详见下节的介绍。
- 《9个指导开发者快速编码/学习的网站推荐 》
- 当然,各个语言的官方网站,是必须常去的。
一些忠告¶
- 不要根据流行的编程语言排行榜,选择语言。
- 不要根据某某语言最容易找工作,薪酬水平最高,来选择语言。
- 不需要贪图掌握太多的语言,越是深入的学习一门语言A,越是能够快速的学习另一门语言B。A和B可以是任何两种语言。努力深入透彻的掌门目前正在使用的这门语言,深入、再深入。这些努力,在你以后要学习其他语言的时候,一定会有回报的。
推荐语言,这个列表,可以不断扩充,也欢迎大家补充自己的推荐语言与推荐理由¶
语言名称 | 主要开源项目 | 推荐理由 |
ruby | Ruby On Rails | 动态语言,简洁清新 |
java | Tomcat | 经典的面向对象静态语言,长盛不衰,优秀项目多如牛毛 |
2.4. 必须初步掌握的基本功¶
以下所讨论的基本功,其实是一个相当宽泛的概念。很难确切的定义一个门槛:不到某种程度,你就无法学习开源了。而是说,在掌握了一些必要的能力之后,再开始学习,会学得不那么幸苦。
计算机基础知识¶
计算机相关的基础知识,其实相当琐碎,很多人都是在日常的使用与开发过程中,逐步掌握的。在了解各种各样的零零碎碎的知识同时,对于各种知识及其相互关联,有一个整体上的把握,我称之为“地图思维”,是非常重要的。
简单来说,计算机相关的基础知识主要包括:基本操作与使用;计算机体系结构;网络基础知识;算法导论等等。
- 计算机操作与使用:会初步使用至少一种操作系统吧;会自己装一个虚拟机(VirtualBox什么的都可以);知道常见的文件格式如何打开;知道去哪里下载并安装相关的应用软件;诸如此类的知识。推荐一个网站:我爱电脑网 真心觉得不错,那些乱七八糟的广告可以略过。
- 计算机体系结构:这个方面,推荐一本教材:《深入理解计算机系统 》并附赠一篇书评《NB学校的NB课程的NB教材--CSAPP 》相信会对各种程度的同学,都非常有帮助。
- 网络基础知识:同样推荐一本教程:《计算机网络 》,并同样附赠一篇书评《我看过的最好的网络入门书 》
- 算法导论:说实话,我自己都没有正经的看过什么算法的书。不过因为看到一篇写得不错的译者推荐,因此对于《Algorithms 》一书有着相当浓厚的兴趣,也因此推荐给大家。《大家好,我是译者 》
至少掌握一门编程语言¶
听上去似乎是废话,如果连语言都没有掌握,怎么可能开始学习开源软件,看人家的源代码呢?不过,怎么才算掌握了一门语言呢?能够写出Hello World,自然是不算的。掌握这门语言的基本语法,肯定也是不够的。也许找一本某某语言的经典教材,然后把后面的习题都给做出来,的确算是一个简单的办法。不过,编程语言实在太多,相关的经典教材,就更是多不胜数。这里就不再一一推荐了。
不过特别想推荐一个《笨办法学语言》系列,目前有:Python、Ruby、C、Regex、SQL、CLI六种。引用我觉得最有道理的一段话:“不要复制粘贴。你必须手动将每个练习打出来。复制粘贴会让这些练习变得毫无意义。这些习题的目的是训练你的双手和大脑思维,让你有能力读代码、写代码、观察代码。如果你复制粘贴的话,那你就是在欺骗*自*己,而且这些练习的效果也将大打折扣。”
相关链接如下:
Learn code the hard way
《笨办法学 Python 》在线中文版
熟练掌握搜索引擎的使用¶
- 第一戒律:尽可能在Google,而不是Baidu搜索。对于软件开发而言,Google才是最佳武器。
- 不断的积累关键字:一个内容你搜索不到,只是因为你没有听说过那个关键字。比如,我想要找一个图像处理的开源项目,如果你知道“Computer Vision”是指计算机视觉,那么直接搜“Open Source Computer Vision”,OpenCV一定就会是第一个结果。如果你知道OpenCV,那么想要找一个2D图像转换成3D图像的技术,有没有开源实现,就可以试着搜“2D to 3D OpenCV”,也许就会更快的找到想要的内容。当你对某个领域完全没有了解时,可以先试着搜索一些周边词汇,看看相关的文档,然后了解行内人是用哪些关键词的,然后再去搜索,就会迅速的缩小范围。
- 搜索出错信息:当然,当你遇到错误时,直接把错误输出放到Google里去搜索,也说不定就会遇到和你有相同遭遇的同学,看看别人是怎么解决的。
- 尝试各种专业的、垂直的搜索引擎:比如StackOverFlow或者Quora这样的专业问答社区,koders 则是一个源代码搜索的引擎。google search里的Blog、Discussions里也有不少好东西。
- 到百度试试手气:毕竟人家也抓了不少网页了,说不定会有Google没抓到的呢?
英语不能太差¶
当然,这个更加是没底的事情,只是我自身英文也非常差,所以没资格教育别人,推荐余晟老师的一篇博客,供大家学习:《关于程序员学英语的经验 》
3. 选择一个开源项目¶
3.1. 到哪里寻找开源项目¶
开源基金会¶
大部分开源项目都来自于开源社区,而大部分开源社区背后都有基金会在运作,比较知名的有Apache基金会(专注于Java技术的开源软件),Linux基金会(专注于Linux系统的开源软件),Eclipse基金会(专注于基于Eclipse IDE的开源软件),Jboss基金会(专注于JAVA EE方面的开源项目)等。每个基金会都会有目前该基金会正在进行的项目列表,我们可以从其中寻找自己感兴趣的项目。
Apache:http://projects.apache.org/indexes/quick.html
Linux:http://www.linuxfoundation.org/programs
Eclipse:http://www.eclipse.org/projects/listofprojects.php
Jboss:http://www.jboss.org/projects
开源项目托管网站¶
另外,每个开源项目都需要有自己的管理平台,各大基金会的开源项目也不例外,因此,各个开源项目的托管网站是也是一个寻找开源软件的好去处。
目前在业界比较知名的项目托管网站主要有SalesForge,Google Code,GitHub,当然还有我们当前项目正在使用的TeamHost等等。
微博上的@OpenERP_Jeff 补充说: launchpad 是一个很重要的开源hosting网站,著名的开源项目有ubuntu、mysql和zope。项目计划、蓝图、代码库、bug管理、翻译都很完整。
服务提供商 | SVN | Git | Mercurial | 介绍 |
Google Code | 支持 | 支持 | 支持 | Google Code属于“富二代”,其在速度上,使用体验上都优于其他几个托管网站,尤其是其丰富的帮助文档,其中有很多还有对应的中文版。因此,对于初学者来说,比较容易上手,也可以获得一个很好的学习机会。当然,因为都是google.com的域名,所以时不时的会访问不了管理界面,原因大家懂的。另外,因为使用简单方便,相应的其在功能上就相对较弱一点。但是应付一般的项目还是绰绰有余。 |
Sourceforge | 支持 | 支持 | 支持 | SourceForge可以算是开源界的托管始祖,很多古老的,知名的开源项目都托管在它上面,其对开源界的贡献估计可以和Apache对Java界的贡献相提并论了。因此,其在功能上经过了长时间的考验,大家想要的功能都能找到。不过,因为强大,其上手难度也相对较高,而且全英文界面,对于英文较弱的同学来说也是一件很痛苦的事。 |
Github | 不支持 | 支持 | 不支持 | GitHub属于托管界的新贵,伴随着Git的蓬勃发展而发展。越来越多的开源软件使用Github托管。最近因Rails漏洞被Hacker黑了也让其处于媒体的风口浪尖。这个事件从一个侧面反映了其在业界的影响力。 |
维基百科有一个词条,列出了非常非常多的开源托管服务的比较:
Comparison of open source software hosting facilities
自由软件主机服务比较
技术社区¶
像ITeye,infoQ,OSChina,CSDN等国内知名的技术社区都非常关心开源软件的发展,在社区新闻,月刊等载体上都有最新的,流行的开源软件介绍。同时在社区,还有一个很大的好处,你会找到很多志同道合的朋友,这可是学习过程中的一大乐事。
各大科技公司的研究院¶
Google的BigTable论文,Amazon的Dynamo论文开启了目前火热的云计算时代,各大科技公司对技术领域的引领能力毋庸置疑,同时,很多公司也是开源运动的忠实支持者,像国外的Google,Facebook,Yahoo,国内的淘宝,百度,盛大,豆瓣等,连曾经的坚决反对者Microsoft也开始通过赞助Apache基金会扭转自己在开源界的形象。关注各大科技公司的研究院最新的开源软件可以了解目前整个业界的技术趋势,而且他们开源的软件的未来发展前景都比较看好,因此,是一个寻找开源软件的有效途径。
搜索引擎¶
如果您对某类技术特别感兴趣,或者遇到某个技术难题想找业界成熟的解决方案,搜索引擎(Google,Baidu,Bing)都是一个不错的工具,其在我们寻找开源软件的过程中也起同样的作用。通过一些关键词的罗列就能帮助我们找到感兴趣的开源项目。
博客和微博¶
关注各个领域大牛们的博客和微博,他们会紧跟技术节奏给我们推荐他们领域最新的开源软件,甚至会为我们讲解这些开源软件的底层实现原理,带领我们入门,这是多么高尚的行为啊。
关注各大科技公司的博客和微博,他们也会经常透露自己的开源计划,以及分析业界的一些开源软件在自己公司内部的应用,这对我们深入了解一个开源软件的技术价值有很大的帮助。
技术问答网站¶
这是最直接的一个方式,在知乎,StackOverflow,Quora等问答网站直接请人推荐几款开源软件,工程师的热情会让你受宠若惊的,很有可能向你推荐某个开源软件的就是这个开源软件的创始人。
维基百科¶
在维基百科上,有很多辛勤的人们,在整理着各种相关的资料,例如:
http://en.wikipedia.org/wiki/Open-source_software
http://en.wikipedia.org/wiki/List_of_open_source_software_packages
http://en.wikipedia.org/wiki/Comparison_of_open_source_software_hosting_facilities
等等,在其中搜索相关的词条,还能发现很多的宝藏。
3.2. 什么样的开源项目适合初学者¶
缘起¶
说实话,在当初列这个提纲的时候,我并没有想好如何写这一节。但是,开放地做事情,就常常会有奇妙的事情发生,佛家称之为“助缘”,各种对这件事情有帮助的缘分,都会在不经意间出现。
一位叫李军的朋友,给我发来邮件,信中写道:“我想是否我们能够通过沟通,然后你在对我有些了解,给我指出点建议,并且是详细的建议,我看学apache开源框架应该不错的 ,不知道我是否适合,谢谢。期待你的回复。”
在与他的往来邮件中,我也真的将这一节渐渐的想清楚了。另外,在与李军的讨论中,我还发现,需要开辟一个专门的章节,讨论:“学习开源项目,能够提升软件开发中的哪些能力。”
在此,我想对李军表示感谢,更希望有越来越多的朋友,参与到这个文档的讨论中来,相信它会变得越来越完善。
明确自己的目的¶
选择一个开源软件,首先要明确的,是自己的动力何在。是出于兴趣?还是出于工作需要?比如,有人对于搜索引擎特别感兴趣,想了解搜索引擎是怎么做出来的?那么首先可以考虑先寻找一些专业的书籍,来了解一些关键的知识点。如果对于某一领域的知识点,缺乏必要的了解,可能完全无法理解一个项目里的代码。在掌握初步的知识以后,自然可以去找Lucene、Sphinx来学习。
也可能是出于工作需要,比如平时是用PHP开发Web应用,已经在用某一个常见的PHP框架了,希望能够对这个框架有一个深入的学习了解,甚至希望横向的比较多个不同的PHP Web框架,这些都是非常清晰的目的。自然在学习的过程中,不太会迷失方向。
比较危险的一种,是听说某某项目很有名气,甚至是为了将来找工作比较容易,就贸然一头扎进某个项目中去了。这种学习目的,往往会选择到那种很庞大,也很成熟的项目,打开文件夹一看,成百上千的源文件,根本无法看完,一下子就蒙了,再就是颓了。心想自己大概不是学软件开发的料吧~~
优先选择能够独立运行的项目¶
开源的项目有很多种类,能够独立运行的项目,当然很多。但是也有不少项目,是其他开源项目的插件,类库,扩展包之类的东西,这些在一开始接触开源的时候,最好不要涉猎,因为理解他们,可能会需要理解他们背后的那个庞然大物,往往会遭遇很多难解的细节,一不小心,就进行不下去了。
当然,还有一类项目,他们虽然是独立运行,但是想要让他们独立运行成功,还得安装、配置很多其他的依赖项目,这个往往会让初学者特别绝望,搞了一个礼拜,居然这个项目都还没有运行起来。。。
所以,小的,能够独立运行的,不依赖于太多其他项目的开源项目,可以优先选择。
选择活跃的项目¶
项目的活跃程度,包括两个部分,一个是开发者提交新代码的频繁程度。另一个是在社区中对于这个项目的讨论热烈程度。提交代码越是活跃,提交的人越多,越能证明这个项目是很有价值的,也证明这个项目是值得你花精力去学习的。而项目在社区讨论的热烈程度,则能够确保当你遇到问题的时候,能够搜索到别人的答案,或者你自己提问以后,能够有人热心回答你。
当然,活跃程度都是相对的,如果你真的对一个项目感兴趣,可以直接试着给这个项目的作者发邮件,提问题。大多数开发者都会很高兴有人关注他的项目,也会通常会热心的回答你的问题的。
判断代码质量¶
并非所有的开源项目,都是高手写的,都值得你去学习。事实上,有很多垃圾开源项目,代码仔细一看,写得真是一塌糊涂。所以,试着阅读一下这个项目的代码。至于如何判断一个项目的代码质量,之前我在知乎回答过一个类似的问题《如何让自己写的代码易维护? 》。推荐各位朋友参考一下。
当然,更加推荐的,是阅读《Clean Code》一书,非常好的一本介绍如何提交代码质量的书。附一篇书评,可以一读:《写代码犹如写文章 》
选择合适的版本¶
最后,面对已经发展了多年的开源项目,最好不要选择最新的版本。如果你是在工作中要想使用这个项目,当然应该选择最新的稳定版,甚至测试版、beta版。但是如果是出于学习的目的,为了减少复杂度,快速的理解这个项目的核心结构与开发思想,选择第一个稳定版,是一个比较妥当的办法。
然后,在初步理解了第一个版本的代码之后,再不断的通过阅读changelogs,追踪最新的版本中的代码变更,体会作者修改代码的目的、手法与技巧。这样应该会有很大的收获。
3.3. 值得推荐给大家的开源项目¶
目录:
这是一份面向软件开发初学者的文档,所谓初学者,可以定义为:学过的语言不超过2种,在已经学过的语言技能方面,能够完成课程上的大部分习题。从高校教育 的通常情况来说,基本能够完成老师布置的最后的课程大作业。如果要说学得很出色,大概谈不上。要想进一步提高,也很困难。
对于大学毕业(正负1~2年)的同学们来说,他们很难接触到真正较为复杂的项目,即使参与到复杂的项目之中,也会是其中非常细枝末节的部分。他们渴望快速的提升自己的软件开发能力,而恰恰最缺乏提升自身能力的机会。
因此,本文希望能够介绍一种较为合理的方法,帮助各位"同学",以较为科学合理的方式,提高软件开发的实力。
这份文档本身也是一个开源项目,你可以参与这个文档的写作、维护。
以下是这份文档的目录
- 开始之前
- 这份文档的目标读者
- 基本条件
- 你需要明确的一些事情
- 开始
- 学习软件开发的几条主要途径
- 为什么借助开源学习是最有效的
- 选择一门语言
- 必须初步掌握的基本功
- 选择一个开源项目
- 到哪里去寻找开源项目
- 什么样的开源项目适合初学者
- 值得推荐给大家的开源项目
- Hello World
- 下载源代码的N种办法
- 让代码运行起来
- 可能遇到的困难
- 碰壁的过程,就是成长的过程
- 理解开源项目
- 基本结构的掌握
- 静态理解与动态理解
- 常用工具简介
- Debug与Log
- 主线与分支
- demo/example
- 单元测试
- 介绍文档
- 做点破坏活动
- 修改开源项目
- 尝试修改代码
- 提出一个小小的需求
- 如果不能搞定,试试看能不能乱来
- 寻求认可的艰难历程
- 为开源项目做贡献
- 提bug与建议
- 帮助完善文档
- 提交代码(功能代码与测试代码)
- 周边代码(demo/扩展/子项目)
- 外部宣传
- 其他各种杂务
- 成为组织的一员
- 交流圈
- 组织结构
- 开源项目的组织方式*
- 基本礼仪
- 自己发起一个开源项目
- 延伸阅读
转: http://www.teamhost.org/projects/learn-with-open-source/wiki/Wiki