如何有效地学习开源项目的代码?
对于计算机专业的同学来说,网络上丰富的开源代码是一笔极为宝贵的财富。通过对开源代码的学习与钻研,大家能从中学到很多书本上、课堂上学习不到的实践知识。如何学习开源代码以及如何学好开源代码成为了大家经常关注的话题,岛主今天就这一话题谈一谈自己的看法。
一、为什么要学习开源项目的代码?
01、站在巨人的肩膀上看问题
大型项目的代码开源是一件十分有意义的事情。开源,也就是开放源代码,其本质是实现技术贡献。世界范围内的研究者均能看到该项目的源代码,这能让大家了解该项目当前的进展,包括采用的技术、已实现的功能和仍存在的缺点,从而不断改进、优化其性能。在计算机科学领域,有许多目前各位熟知的软件项目均得益于开源。
① Linux操作系统:起初是由芬兰赫尔辛基大学的年轻学生Linus Torvalds编写的。它是在GNU General Public License(GPL)的许可下开发出来的,其源代码可以被任何个人免费使用。现如今世界上有成百上千的公司基于这个内核开发出了自己的操作系统。
② MySQL数据库:MySQL是免费的,使得用户可以零成本地建立容量巨大的数据库或者网上交易系统。在来自MySQL网络社区的帮助信息足可以应付几乎所有的问题。
③ PHP编程语言:PHP是由Rasums Lerdorf创建的,起初PHP只是一个简单的程序。后来,其范围扩大到了访问数据库。PHP所有的源代码、文档都可以免费使用。就PHP本身而言,用户可以无限制地发布自己编写的程序。
02、提供交流学习的平台
将代码发布到社区中或上传到网络上供大家共同学习和交流,能在很大程度上发挥团体的作用,促进项目的性能越来越优秀、功能越来越完善。通过网络,大家能随时随获取网络上发布的开源项目,把其下载到本地进行学习与研究。在学习开源代码的过程中,各位会接触到不同项目所采用的架构以及相关领域经常使用的算法,不断增加自身知识储备、提升自身专业技能。尤其对于一些比较优秀的开源项目,能让学习者大开眼界。
同时,社区的出现为具有相同爱好的研究者提供了便利的交流平台。他们统一战线,不断解决项目中出现的一个又一个问题,并将自己的研究成果发布到社区中供大家学习和交流。
03、有益于优化和改善
开源意味着免费,用户在使用开源代码的过程中,不会产生任何的版权开销。随着开源软件的流行,给使用者带来了显而易见的利益。任何人都可以免费使用开源项目代码,并以此为内核开发出属于自己的东西。
与闭源技术相比,开源项目更有可能遭受黑客的攻击。但也正因为此,开源的代码也会有源源不断的开发者加入对其优化,发现开源项目中所存在的漏洞并对其进行优化,从而避免遭受攻击。商业模式的开源在很大程度上体现了开源精神的伟大之处。
二、如何有效学习开源项目的代码?
01、从基础学起、需理论联系实际
在学习某一领域知识的时候,岛主不建议大家一上来就找一些大型项目的开源代码进行学习,而应该注重“修炼内功”,从基础知识入手进行学习。在学习理论知识的过程中,还需要注意联系实际,尽可能找一些实例进行训练。在实际操作过程中可能会遇到各种各样的问题,只有真正动手解决问题,才会对该内容记忆深刻。
在学习完相关基础知识后,可以着手编写一些小型的程序,比如宿舍管理系统、小型电商系统等等。通过搭建一个完整的系统,自身的项目能力会得到很大的提升,编程能力也会得到很好的锻炼。
02、学习开源项目,需在代码中找答案
网上有很多开源的项目代码,大家在找开源代码的时候要注意甄别,一般来说获赞和评论较多的代码不会踩坑。在下载源代码之后,首先要能跑起来,编译通过、正常运行。有些开源代码下载到个人电脑上的运行过程并不是一帆风顺的,可能会遇到各种各样的问题。有些问题源于编程软件的版本不一致,也有一部分是因为其代码本身出错。因此,大家在学习的过程中应该带着问题学习,尽可能在代码里找答案。
即便是出于学习的目的,也是有很多侧重点的,比如代码风格、文档规范、数据接口、整体架构等等。对于某个语言的小白,找一个熟悉领域的开源项目来深入掌握这门语言,也是一个不错的主意。
03、深入理解代码,需整体把握
对于一些大型项目来说,其代码数量非常大。因此有些同学在学习的过程中往往会顾头不顾尾,无法整体把握代码的核心思想。针对这种情况,岛主建议大家在学习时可以借助程序流程图来梳理代码的逻辑结构。
首先应该找到代码的入口点。在最有可能运行到的地方设置断点或者抛出异常,这样就能够找到一个项目在正常运行时的入口点。然后从此入口点出发,逐步把握整个项目是如何启动起来。通过绘制整个程序的流程图,能让各位更加直接的理解程序的整体流程,而不会被代码所干扰,让程序员们能从总体上把握整个程序。同时,应尽可能的做出读书笔记或者添加注释,方便自己后续回顾,增加代码的可读性。
04、全面掌握思想,需动手实践
对于开源项目代码的学习过程,是一个从整体到细节的过程、是一个从表面到内核的过程、也是一个不断认清事物本质的过程。尝试理解一个系统的内部结构需要付出一定的努力。在整体上,应该把握该项目的组成部分、主要模块、函数之间的调用关系等等。同时,还从实际需要出发,动手实践去修改这个项目中的部分代码,然后看看是否能运行通过?会不会报错?若有报错,应该思考引起错误的原因并改正。
在对代码各模块的功能及实现过程有所了解的前提下,可以尝试修改代码中某个功能或者添加新功能。在实现之前先自己思考,不要参考网络上的解决方案。在此过程中若遇到无法解决的问题则可求助于社区或去网络上查找相关博文,对比自己的思想和其他博主思想的不同之处。
三、平时应该怎么做?
01 、参加各类比赛
对于在校的大学生来说,有很多机会能接触到不同类型的比赛,如物联网+、大创、Kaggle等等。这些竞赛大多数要求提交完整的项目及文档。通过参加这类竞赛,同学们能学习到很多领域内的新知识、掌握企业内常用的解决办法。在不断完善项目功能的过程中,大家可能会借鉴一些现有开源项目的实现过程,以实际解决问题的需求来带动开源代码的学习。把从其他项目中学习到的新知识应用到自己的项目中,能加深各位对知识的理解程度。
02、利用好课程设计
对于计算机专业的学生来说,学院会开设不同课程的课程设计,这对大家来说是锻炼项目能力的一大利好。这类课程一般是开放性的,大家可以结合自己的兴趣与实际应用前景去开发一款小型的项目。同学们将从确定开发项目主题开始,思考应实现的功能,需要如何去实现,直到最后提交一个完整的项目及开发文档。
这个过程的学习能极大程度上锻炼大家的学习能力、开发能力、团队合作能力等等。而在课程设计上开发出的优秀的项目,也可以作为亮点写在自己的简历上或者拿去参加比赛。
四、总结
开源代码对个人的发展、大家共同的进步有着举足轻重的作用。目前网络上开源项目代码层出不穷,如果大家在平时的学习中能充分利用好这一资源,不仅可以掌握优秀的编程方法、提高动手实践能力,还能激发编程灵感、打破思维局限性。希望大家能利用好这一资源,使自己的编程能力得到提升!
如何有效地学习开源项目的代码?相关推荐
- 《开源思索集》一如何更有效地学习开源项目的代码?
本节书摘来异步社区<开源思索集>一书中的第2章,第2.1节,作者: 庄表伟 责编: 杨海玲, 更多章节内容可以访问云栖社区"异步社区"公众号查看. 如何更有效地学习开源 ...
- 如何有效的学习开源代码
导读:对于开发者来说,社区里丰富的开源代码其实是笔极为宝贵的财富.如果能充分利用好开放源代码的资源,不仅可以掌握多种编程方法,提高实践能力,还能获得好的思想,激发编程灵感.开源代码怎么学以及怎样才能学 ...
- 如何学习开源项目及Ceph的浅析
摘要:开源技术的学习和采用确实存在着一定门槛,然而学习各种开源项目已经成为许多开发者不可回避的工作内容.那么,对于类似OpenStack的大型开源项目,开发者该如何着手,这里我们看章宇的分享. [编者 ...
- 给开源项目贡献代码_您可以为开源做出6种非代码贡献
给开源项目贡献代码 贡献开源! 履历表看起来很棒! 这是可喜的工作! 在您的整个职业生涯中,您可能听说过很多人做出过这些陈述或类似的陈述. 他们没有错-为开源做贡献是一个多方面的有益工作-但是,当软件 ...
- 转: 学习开源项目的若干建议(infoq)
转: http://www.infoq.com/cn/news/2014/04/learn-open-source 学习开源项目的若干建议 作者 崔康 发布于 2014年4月11日 | 注意:GTLC ...
- 5.42如何高效的学习开源项目
date comments categories tags permalink title 2020/4/18 true 软件架构 架构 开源项目 5.42 如何高效学习开源项目 工作当中会经常使用到 ...
- 如何高效地学习开源项目 |“华仔,放学别走”
你好,我是华仔.今天这期"特别放送",我想和你聊聊如何高效地学习开源项目,一方面澄清开源项目学习过程中的几个误区,另一方面谈谈我自己具体实践时的一套方法论. 得益于开源运动的蓬勃发 ...
- 【手把手指导】给开源项目贡献代码
很多新人学习了技术,但是没有地方施展. 问题不大,找几个开源项目来参加就可以了,需要开源项目磨练的可以联系学委. 本文重点讲解如何快速的给开源项目贡献代码. 首先你必要要有一个GitHub账号(或者G ...
- 学习开源项目Halo(1) - 初步了解与运行Halo
文章目录 学习开源项目Halo(1) - 初步了解与运行Halo 0.前言 1.Halo简介 2.Halo项目运行 3.Halo项目涉及到的技术栈 学习开源项目Halo(1) - 初步了解与运行Hal ...
最新文章
- 宝贝,来,讲讲spring事务有哪些坑?
- 二叉树最近公共祖先节点
- crtsiii型无砟轨道板_为什么高铁轨道不像普快列车轨道那样铺碎石?
- 云计算学习(2-4)云计算的案例
- 领导,你可以做得更好
- WeihanLi.Npoi 1.21.0 Released
- 阿里中间件开源组件:Sentinel 0.2.0正式发布
- 老年手机英文改中文_不服来战:“老年人才用9键!”
- stm32 hal 串口只可以接收到一包数据数据
- mybatis mysql 方言_mybatis-MyBatits执行效率问题
- python的前端框架_常见Python的Web开发框架
- 谷歌大牛Jeff Dean撰文:深度学习研究的黄金十年
- 数字图像处理基本知识
- 厂级监控系统镜像服务器,厂级监控信息系统(SIS).PDF
- caffe make runtest 错误
- vue如何做Seo优化
- 【Unity游戏开发】动画系统(二)2D动画
- html复选框,如何通过AJAX动态获取数据库的数据作为复选框显示在页面上
- sqlalchemy 踩过的坑
- golang 实现华容道