借助开源项目 学习软件开发
1. 开始之前¶
1.1. 这份文档的目标读者¶
软件开发初学者¶
开源软件的初次使用者¶
开源社区外徘徊的爱好者¶
《由于这是一份开放式写作的文档,因此,当我写下这段话的时候,我并没有特别确定的把握。这份文档将只有以上三类目标用户。也许,它能够对更多的人产生价值......》
1.2. 基本条件¶
一台能够上网的电脑¶
首选Ubuntu¶
如果你真的喜欢Windows¶
不会被阻隔的网络¶
1.3. 你需要明确的一些事情¶
你真的想学习软件开发吗?¶
在正式开始学习之前,我实在是忍不住,我想一遍又一遍的询问你:你真的想吗?你真的想成为一个“码农”吗?你真的想掌握软件开发这门手艺,甚至以此来谋生吗?那么好,我得告诉你一些事实:
- 软件开发绝非你想象中的事少钱多责任轻的那种高薪白领。很多程序员会自称“码农”,就是因为这份职业非常的辛苦,而且做好不易。
- 另外,这是一份需要终生学习的行当,很多很多的其他领域,没有那么快的知识更新速度。但是软件开发这个领域,1~2年不接触技术最新的进展,你就OUT了。
- 还有,软件开发这个行当,真的未必那么好找工作。就业前景什么的,并非想那些传说的成功故事一样光明。
你真的适合软件开发吗?¶
虽然,软件开发并非像传说中的那样,是一个需要高智商的Nerd的行业。但是,他的确需要一些品质和能力,如果你发现自己并不具备,或者要很辛苦才能做到。那么,你不适合这个行当。
- 懒惰:有一句名言这么说:“懒惰是程序员的美德”,因为真正的程序员,一定痛恨反复做同一件事情,至少他们会写一个函数来替自己完成。如果发现代码里重复出现相同的段落,他们会无法抑制的想要消除这种重复。
- 条理:如果这是一个复杂的事情,那么我可以分成三个阶段来着手去做它。如果仔细想想,第一个阶段,还可以分为5个部分。在开始第一阶段之前,还有4个准备工作,必须首先考虑。
- 耐心:很多时候,程序里的麻烦会来找你,如何解决?解决“bug”需要洞察力,需要细心,而最需要的,则是耐心。有些时候,我会非常享受这种“破案”的过程。
- 好奇心:值得好奇的事情太多了,永远学不完的新技术;最近的进展和最佳实践。甚至其他行业和领域的究竟,我们都有充沛的好奇心,因为无论哪个行业,他们早晚都会来找到我们,帮他们编写代码的。
- 较真:很多事情,据说都差不多就可以了。但是,计算机是那么严格,快百分之一毫秒,也是快了。一个万分之一概率下会出的bug,还是bug。如果你不是一个足够较真的人,就会放过很多问题,而那些问题,往往就会酿成大祸。
OK,闲话少叙,咱们开始吧!¶
2. 开始¶
2.1. 学习软件开发的几条主要途径¶
一万小时的神话¶
在这种理论的基础上,有人提出了“一万小时编程训练”的概念,似乎经过一万小时以上的训练,普通人也有可能成为编程领域的“大师/高手”。但是,这个理论其实是一个貌似建立在统计学基础上的伪理论。
最后是关于知识更新,在一个每天都在诞生新名词,新技术,新思路的领域,一个曾经埋头苦练一万小时的高手,在3年不接触最新知识以后,还能称之为高手吗?
总之,匆匆忙忙的接受了一万小时的概念,被激励得热血沸腾,打算下定决心奋力学习一万小时编程,通常不过是“励志书中毒”的症状而已。
软件开发的能力体系是怎样的?¶
在很多领域,我们都可以用一个金字塔模型,来描述该领域的能力体系,在软件开发领域,同样如此。
- 高
- 创造能力
- 中
- 逻辑能力
- 理解能力
- 低
- 基础知识
- 编程技能
- 领域知识
简单解释一下:
低的三项,属于知识类。基础知识包括计算机、数学、算法、逻辑等等知识,这些知识,通过认真的学习书本教材,基本能够掌握。
编程技能,往往是跟具体的语言相关的,当然,多学几门不同的语言,对于快速掌握一门新的语言,大有帮助。
领域知识,则是与工作的具体方向有关,比如针对多媒体领域的编程,自然要熟悉图形、图形、声音等等的相关领域知识。针对企业级应用的开发,对于管理制度、财务、成本、仓储的东西,总得搞清楚才行。
中与高的两项,属于超越编程局限的通用能力,不仅仅是软件开发上用得到,在各方面都非常需要这三类能力。逻辑能力,可以通过训练提高;理解能力,可以通过经验积累;而创造能力,的确比较难,有天赋的成分在其中。
有哪些途径,可以锻炼这些能力?¶
- 阅读与习题:找到一堆的经典教科书,狠狠的读,认真的把书里的习题都给做了,这样对于打下扎实的基础,将会有极大的帮助。
- 视频教程/ScreenCast:每次讲解一个主题,学习一下总会有收获,只是效率不高。
- PPT/Slide/PDF:这种属于某次技术会议上的演讲稿,如果能够配合视频看,效果还好些,否则通常会不知所与。
- Wiki:针对某个词条,某个特定的问题,会有相当清晰的解释,不过要看运气,有些词条的解释就非常粗略,甚至过时。
- Blog:在分享知识与经验的过程中,blog是很不错的载体,如果你能够找到的话。
- BBS:曾经是最主要的学习方式,很多人通过泡论坛来提高自己,不过说实话,效率很低,而且容易跑题。
- 问答社区(StackOverFlow/Quora):新兴的交流社区,在面临特定问题时,可以尝试搜索或提问。平时泡泡,努力回答别人的问题,也有助于自己的提高。
- 工作中的项目:当然,老板给你发工资,肯定希望你尽快完成,在压力之下,通常进步都会很快。只是这种进步也许是你无法选择的。
- QQ群:真的有人借助QQ群来学习吗?
- 开源项目/开源社区:当然,这个是最重要的,咱们下节详细说。
2.2. 为什么借助开源学习是最有效的¶
为什么要学习¶
学习有不同的目的:有人学习是因为兴趣或者好奇;有人是为了增加生存的技术,把学作为改变工作、生活状态的手段;当然,也有些人,学习是为了思想的交流,与周围的人交流,与远方的朋友交流,与过世的先哲交流。
源代码是最好的营养¶
软件编程需要的基本环境就是一台电脑,当然如果有互联网的接入则更利于交流与技术信息的查询。
在网站kernel.org上,有各种版本的内核源代码,如果你想从根本上学习操作系统,也可以通过LFS快速地学习内核构建的过程。
源代码开放的最大的好处是我们不需要重复设计和制造轮子。每个人都可以在软件巨人的臂膀上构造自已的梦想代码天堂。
方向不对,努力白费¶
选择开发工具只是软件工匠们需要认真定夺的一个方面。其它如系统构架、测试方法、团队管理、决策者眼光等等,更是关系每个程序员未来的诸多要素。
开源的精神内涵使学习变得更加有意义¶
开源社区是最好的学校¶
移动互联网时代,学习是开放的更是开源的¶
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都已经极为丰富了。
- 最好身边有能够随时请教的这门语言的高手。有这一条,基本就足够了。
- 最好能够至少分别学习一门静态类型语言与一门动态类型语言。
推荐一些语言学习网站¶
一些忠告¶
- 不要根据流行的编程语言排行榜,选择语言。
- 不要根据某某语言最容易找工作,薪酬水平最高,来选择语言。
- 不需要贪图掌握太多的语言,越是深入的学习一门语言A,越是能够快速的学习另一门语言B。A和B可以是任何两种语言。努力深入透彻的掌门目前正在使用的这门语言,深入、再深入。这些努力,在你以后要学习其他语言的时候,一定会有回报的。
推荐语言,这个列表,可以不断扩充,也欢迎大家补充自己的推荐语言与推荐理由¶
语言名称 | 主要开源项目 | 推荐理由 |
ruby | Ruby On Rails | 动态语言,简洁清新 |
java | Tomcat | 经典的面向对象静态语言,长盛不衰,优秀项目多如牛毛 |
2.4. 必须初步掌握的基本功¶
以下所讨论的基本功,其实是一个相当宽泛的概念。很难确切的定义一个门槛:不到某种程度,你就无法学习开源了。而是说,在掌握了一些必要的能力之后,再开始学习,会学得不那么幸苦。
计算机基础知识¶
- 计算机操作与使用:会初步使用至少一种操作系统吧;会自己装一个虚拟机(VirtualBox什么的都可以);知道常见的文件格式如何打开;知道去哪里下载并安装相关的应用软件;诸如此类的知识。推荐一个网站:我爱电脑网 真心觉得不错,那些乱七八糟的广告可以略过。
- 计算机体系结构:这个方面,推荐一本教材:《深入理解计算机系统 》并附赠一篇书评《NB学校的NB课程的NB教材--CSAPP 》相信会对各种程度的同学,都非常有帮助。
- 网络基础知识:同样推荐一本教程:《计算机网络 》,并同样附赠一篇书评《我看过的最好的网络入门书 》
- 算法导论:说实话,我自己都没有正经的看过什么算法的书。不过因为看到一篇写得不错的译者推荐,因此对于《Algorithms 》一书有着相当浓厚的兴趣,也因此推荐给大家。《大家好,我是译者 》
至少掌握一门编程语言¶
熟练掌握搜索引擎的使用¶
- 第一戒律:尽可能在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. 到哪里寻找开源项目¶
开源基金会¶
开源项目托管网站¶
服务提供商 | 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
自由软件主机服务比较
技术社区¶
各大科技公司的研究院¶
搜索引擎¶
博客和微博¶
技术问答网站¶
这是最直接的一个方式,在知乎,StackOverflow,Quora等问答网站直接请人推荐几款开源软件,工程师的热情会让你受宠若惊的,很有可能向你推荐某个开源软件的就是这个开源软件的创始人。
维基百科¶
3.2. 什么样的开源项目适合初学者¶
缘起¶
明确自己的目的¶
优先选择能够独立运行的项目¶
选择活跃的项目¶
判断代码质量¶
当然,更加推荐的,是阅读《Clean Code》一书,非常好的一本介绍如何提交代码质量的书。附一篇书评,可以一读:《写代码犹如写文章 》
选择合适的版本¶
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
借助开源项目 学习软件开发相关推荐
- 借助开源项目学习软件开发_借助开源硬件,SparkFun继续创新
借助开源项目学习软件开发 当SparkFun Electronics创始人兼首席执行官Nathan Seidle在科罗拉多大学攻读工程专业时,他被教导:"真正的工程师想出了一个主意,并为该主 ...
- 读《借助开源项目,学习软件开发》总结
读<借助开源项目,学习软件开发>总结 GitBook文章源地址:文章源地址 一.前言 准备条件:(1)一台能上网的电脑(2)首选系统Ubuntu,其次Windows 二.开始 (1)软件开 ...
- 借助开源项目,学习软件开发 .
转载自:http://blog.csdn.net/bruce0532/article/details/7382673 由于不明原因,本文不是完整的... 其他某些部分:http://sbbs.me/v ...
- 借助开源项目,学习软件开发
1. 开始之前¶ 1.1. 这份文档的目标读者¶ 软件开发初学者¶ 这是一份面向软件开发初学者的文档,所谓初学者,可以定义为:学过的语言不超过2种,在已经学过的语言技能方面,能够完成课程上的大部分习题 ...
- 借助开源项目,学习软件开发——开始
借助开源项目,学习软件开发--开始 原文地址:点击打开链接 http://sbbs.me/view_article/506070b108158e166400001b 2. 开始 2.1. 学习软件开 ...
- GitHub开源项目 - Jeecg-Boot开始开发平台介绍
GitHub开源项目 - Jeecg-Boot开始开发平台介绍 Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis ...
- nbiot开发需要掌握什么_学习软件开发需要准备什么?
2020年,随着Internet的不断发展,现在Internet已经融入到每个人的生活中,所以在计算机行业的发展中,软件开发技术就显得非常重要,因为它是与我们的生活息息相关的,选择许多人想学习Java ...
- 开源项目学习系列--02.天天酷音TTKMusicplayer
开源项目学习系列--02.天天酷音TTKMusicplayer 1 简介 2 代码地址 3 基础知识 4 思路 5 代码分析 5.1 编译 5.2 参考 1 简介 天天酷音播放器,核心功能是采用基于 ...
- 关于IT8951 Tinydrm Driver开源项目学习的心得
关于IT8951 Tinydrm Driver开源项目学习的心得 项目名称: julbouln/tinydrm_it8951 项目链接:https://github.com/julbouln/tiny ...
- 精选CVPR开源项目学习资源汇总
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1.Cvpr2020 Code CVPR 2020 论文开源项目合集 https://github.c ...
最新文章
- zip压缩多个文件,解压时不包含目录层级
- XMPP文件传输协议笔记
- HarmonyOS应用开发——使用HUAWEI DevEco Studio创建第一个程序 HELLO WORLD!
- java接口常用_java的常用接口
- 【未解决】Reporting Services报表在浏览器中的显示
- SQL Server插入中文数据出现乱码问题
- 垂直居中及容器内图片垂直居中的CSS解决方法
- 深度学习入门|第5章 误差反向传播法(二)
- Android SlidingMenu 仿网易新闻客户端布局
- HDU 5183 Negative and Positive (NP)
- 吴恩达机器学习5——神经网络的学习
- Linux必学的60个命令【转载】
- 蓝牙怎么调声音大小_蓝牙耳机怎么调音量?
- 13个常用的Word快捷键,一看就会,你值得拥有!
- 解决安装MySQL后,Excel打开很慢的问题
- 微信小程序入门八头像上传
- 拼多多订单,商品详情,关键词API接口
- python居然可以画樱花
- jsp + servlet 通过a 标签下载文件
- 用于光波导耦合的倾斜光栅分析