提交 7ef0c81c 编写于 作者: Re_-Life's avatar Re_-Life

Initial commit

上级
文件已添加
MIT License
Copyright (c) 2022 CSDN 技术社区
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# this is a level 1 title
the brown fox jumps over a lazy dog.
## this is a level 2 title
the brown fox jumps over that lazy dog again.
## let me add a new title
new title.
\ No newline at end of file
## 北航 《开源软件开发导论》课程资料仓库
本仓库是 CSDN 和 北航合作的《开源软件开发导论》课程资料仓库
### 如何参与贡献
- 贡献方式
请 fork 本仓库,根据 LICENSE 和 README.md 的规定,给本仓库的各种资料提供修改和改进。
提交 merge-request 等待审核合并。
你也可以给本仓库提 issue,和我们讨论本仓库可以改进的地方。
此差异已折叠。
## 开源软件开发导论 - 资料
### 黑客文化和黑客的介绍
我们提到了黑客(hacker)文化兴起: 黑客的精神是:分享所有信息,鼓励探索,不喜欢权威和秘密,理性分析。Playful cleverness。
先来说说Ken Thompson,他被叫做Unix之父,从Unix 操作系统诞生的过程中,我们既能看见许多开发项目常见的弊病,同时也能看到,很多后来看起来伟大的创新,它的起步其实是很卑微弱小的,但是持续的热情、持续改进和由此获得的洞察力,能解决很多别人看起来巨大的问题。
在讲Ken的故事之前呢,我想先来问你一个问题:如果你是一个不错的程序员,也写过一些不错的程序,现在上级给你一个任务,让你带领团队开发一个操作系统,要求是这样的,第一希望它是业界领先的,第二希望它的预计生命周期在五十年以上,第三预期有上亿的各种设备会使用这个操作系统,第四还希望你顺便设计出一个计算机语言,适用范围甚至比这个操作系统还要广。
面对这样一个任务,你会怎么办?
很多人会说:我会先收集需求,考察目前的各种先进操作系统,然后好好组织专家,进行多轮讨论,逐步细化设计,等等。
哦对了,因为我还要同时设计出一个计算机语言来,所以还需要同时组织另外的一批专家,进行另外的一套调研、讨论和设计......
麻省理工学院,在上个世纪六十年代,就接下了类似这样的的工作,他们当时已经有一个早期的操作系统,但现在要做一个更好的。他们把这个系统叫做 Multics ,也就是Multiplexed Information and Computing Service的简称,翻译过来就是多路复用信息和计算服务。
但是Multics 这个项目,最后陷入了一个典型的“第二版本综合征”。
什么意思呢?就是你开发软件,做了第一版,大家用了一下觉得,哎,挺有新意的啊,不错!但同时,又觉得还有很多可以改进的地方。
你的团队受到了鼓舞,觉得应该在第二版里面,把在第一版没有实现的各种设计都做到完美,同时又要解决现在大家在业务上碰到的问题,满足所有人的期望,还要为将来出现的问题做准备。
当年,麻省理工学院主导设计Multics 这个系统时,请了两家著名公司来帮忙,一家是GE(美国通用电气公司),负责设计全新硬件,另一家是贝尔实验室,负责操作系统设计。
这三家在全球科技界都是声名显赫,而且牛人云集,但它们分布在美国的三个地方,当时的通讯又没有现在这么发达,所以想要要合作打造一个全新的计算机+操作系统,难度可想而知。当时参加项目的一个工程师说,这个项目就像是在“同时爬好多颗树”,或者像我们谚语说的,是“鹰搏二兔”。
Ken 当时也参加了这个项目,但是正如 Ken 自己的评价,这个项目最后虽然勉强完成了,但“过度设计,过度建造,什么都过度。结果近乎不可用。”
设计之前想得太多,导致这个项目最后太过复杂,项目投入很大,又让它最后太贵,而两者加在一起,最后导致用户很少。
Ken 作为这个项目的参与者,最后却说:“它搞出来的东西我自己都不想用”。
其实这个项目立项的初衷本来很好,有强大的技术支持,研发的资金也有保障,但为什么所有这些有利的条件加在一起,仍然做不出一个好产品呢?
对所有开发人员来说,这都是一个值得思考的问题。我觉得我们想要做出一个好的项目,有一个基本的前提,就是你在做之前,自己先想一想,我们开发的是面向消费者的产品,那如果你现在不是开发者,而是一个消费者,这样的产品,你自己会用么?
这次不太成功的尝试之后,贝尔实验室退出了Multics 项目。这时Ken 还是想写一个好的操作系统,只是管理层被这次失败伤透了心,不想给任何预算了。
换成一般人,缺乏外部条件,领导不支持,可能就此就放弃了。但Ken 没有,他找到了一台已经有些过时闲置的 DEC PDP-7 计算机。你可能想象不到,这台计算机只有 16KB 的内存,16KB是个什么概念,只是现在主流台式机电脑内存的一百万分之一。
Ken觉得,既然领导不给预算,那就将就着先用这个吧。 他先是为这个电脑写了一个太空旅行游戏,让用户可以漫游太阳系,探访各个行星。然后,又写了一个磁盘调度算法来控制这个电脑的古怪的磁盘驱动器。
下一步,怎么来测试这个算法呢? 需要写一个磁盘 I/O 程序,这样就能往磁盘上读写大量数据。
到这儿,离实现一个简单的操作系统只差三个模块了:
- 一个是用来创建代码的编辑器
- 一个是把代码编译为 PDP-7 汇编语言的汇编器
- 还有一个能运行命令的环境,用行话叫 “操作系统的外壳” (Shell)
这个时候,Ken的妻子正好带着一岁大的孩子离开了三星期,他就利用这三周的时间,把上面提到的三个模块都写出来了。
三个模块完成后,一个小型的操作系统就做出来了,这就是 Unix 的最初版本。他们最初起 Unix这个名字,也是对 Multics 的一个玩笑,因为 Multi- 是多的意思, Uni-(Unix)是单独的意思。
对了,除了这个操作系统,Ken也确实发明了一个 B 语言,这个语言后来演化为 C 语言, 成为现代 IT 产业应用最广泛的语言之一,也是后来很多语言发展的源头。
后来,随着 Unix 的兴旺发展,Unix 社区的成员都有一些共性,比如大家都是都是用命令行,各种参数都记得,喜欢用各种工具的组合等等。在使用这个系统的过程中,大家的共性,就被总结成了一个成文的 Unix 设计哲学。
例如:简单就是美。这一点,你比较一下 COBOL 和 C 语言的 Hello World 的程序,就能发现不同。
Unix 的另一个设计哲学就是:只做一件事,把它做好。
这个特点,在Ken 身上体现得十分明显。
Ken曾经说过自己对于计算机为什么这么熟悉,他说自己从小喜欢鼓捣电器,去加州大学伯克利分校读电子工程的时候,因为他已经玩了 10 年的电器,所以很轻松地学完了电子学的课程。
后来,他迷上了电脑(大型机)。就经常在午夜时分进到学校的机房,一待就是一晚上。他非常享受这样的过程,因为在第二天早上 8 点之前,这就一直是他一个人的计算机。那时的他很快乐,他自己说 “我毫无雄心壮志,是一个没有目标的工作狂”。 我认为,把计算机玩的精通,这个也是非常了不起的雄心壮志。
### 心流时刻
大家一定都听说过“心流”的概念。当我们进入心流时刻,就可以全身心投入工作而忘记了时间的流逝,在这种状态下,人会有一种幸福感,工作的开展就像水流一样自然。
并不是所有工作都需要进入心流的状态才能变得高产,但对于设计,开发,写作这样的创造性劳动,心流是必须的。 它的首要的条件就是“不被打扰”。一旦被打扰后,我们需要一个缓慢的过程来再次进入心流,也许今天就再也回不到这样的高效率状态了。
这个心流时刻,未必就是在家上班,在新冠疫情开始之后的两年多来,很多公司尝试着让员工在家上班,但是有员工反映,在家上班效率很低,为什么低呢?一个重要原因是:有家人,特别是小孩打扰。小孩可不管你在上班,他就是要找你。
同样的,如果你作为领导,让员工来上班,但是又不断随意打扰他们,不就是和小孩一样了么?这些像小孩子一样的领导,没注意到 ‘大人’ 正在写代码呢,什么小事都要直接问,而且非得马上要结果。
注意我们在上面的话中,有意无意把领导和小孩等同起来,因为他们幼稚地认为,跟你讲几句话,有什么大不了的,而且我的需求那么紧急!这种幼稚的打扰对于工程师的劳动生产率是一个巨大的折磨。
有一个公式可以定义员工上班的效率: E = 不被打断的小时数 / 全部工作的小时数
例如,你上班 8 小时,如果你不被打断的小时数量只有 1 个小时,那么, 你的 E 值只有 1/8 = 0.125
我们前面讲 Ken Thompson 用三周完成 Unix 雏形的工作的时候,是这么描述他的工作状态的:
“每27-28小时才睡一次,每次睡 6 个小时,每次睡到自然醒。工作状态非常好,比被孩子哭闹吵醒要强多了”
这么看来,Ken的E等于多少呢? 应该是 100% 吧?注意到,他是在家里写程序,没有上班,开组会,也没有被产品经理叫过去询问怎么填一个PPT 的某个数字,或者被同事打扰,等等。
那如果他的小孩也在家里,你觉得他的 E 会是多少呢? 同样,在大学里,你的学习效率是多少?
E = 不被打断的小时数 / 全部学习的小时数
### 总结
你从 Ken Thompson 的故事中获得了什么呢?
专注,心流,做自己想做的事情,Playful cleverness?
### 注解
这篇文章作者:邹欣
曾发表于 《湛庐书单课:给技术人的职场突围课》
这是关于 open-source-booklet-20220829.pdf 的说明。
文件来自于: https://github.com/oscar-open-source-book/booklet-2022 遵守 CC0 版权协议
\ No newline at end of file
## 开源软件开发导论 - 资料
### 开源协议使用常见问题
**问题1**
如果一个网站的源码是使用GPL协议的,用它的源码部署网站运营赚钱,会违反协议么?
**讨论**
1. `GPL`协议全文:https://www.gnu.org/licenses/gpl-3.0.en.html 。GPL并不限制赚钱,赚不赚钱不是判断的标准,不是重点。GPL既不限制赚钱,也不限制分发,也没有要求面向公众开源,而是要求说如果你对源码有改动,分发的时候要把改动的代码一起提供给客户,并且不能禁止你的客户把源码再给别人。如果你的客户拿到了你改动的代码,关在家里研究,却不愿意分享给别人,那你和你的客户都没有违背GPL协议。
2. 针对`GPL`在网络服务端使用的问题。有一个新的协议:`AGPL``AGPL`的全称为:GNU Affero General Public License,是`GPL`的一个补充,在GPL的基础上加了一些限制。`AGPL`这个协议的制定是为了避免一个`GPL`/`LGPL`协议中的漏洞,称之为Web Service Loopwhole,这主要是由于`GPL`是针对传统的软件分发模式的商业模式(以微软为代表)。如果你使用的`GPL`的代码作为基础完成你自己的软件,如果你要分发你的软件,你的软件必须也是`GPL`的。随着以Google为代表的软件作为服务的互联网公司的兴起,它们的“不分发软件,为客户提供网络服务”的商业模式就不受GPL协议的约束,所以Google公司在构筑他的搜索引擎的时候可以随心所欲的拿现有的GPL协议的开源代码,无需开源他的修改成果。`AGPL`协议就是为了防止这种情况出现,在GPL协议的基础上加了一个约束。`AGPL`协议:http://www.freeoa.net/development/design/detail-intro-agpl-agreement_2012.html
3. 看上去,`AGPL`还是有模糊的地方,MongoDB在`AGPL`的基础上明确对云厂商做了限制,有更严格的`SSPL`协议。`SSPL`协议:https://www.mongodb.com/licensing/server-side-public-license
4. 另一个后续是MariaDB提出了一个延迟开源的`BSL`协议。该协议的介绍请见:https://blog.csdn.net/chupai9888/article/details/100682823
\ No newline at end of file
## 课程简介:
《开源软件开发导论》课程是一门面向软件工程、计算机科学与技术等专业的高年级本科生的专业课程。课程的目的是通过系统地讲授开源软件的发展历史与现状、基本思想与概念、开发方法与关键技术、支撑工具与系统平台以及相关科研工作,同时结合基于互联网开源软件平台的课程实践环节,使学生掌握开源软件开发的理论知识与实践技能,具备进行开源软件开发和开展相关研究的能力。
This course is designed for senior undergraduate students majoring in software engineering and computer science and technology. The main objectives of this course are: introduction to the history and current status, the basic ideas and concepts, development methods and key technologies, supporting tools and platform, and related research of open source software; course project practice based on Internet open source software platforms; enabling students to master the theoretical knowledge and practical skills for open source software development; prepare the students for future research and engineering work in this field.
## 课程计划
- 1.  开源软件背景知识(2学时)
- 2.  开源软件开发的基本概念与实例剖析(6学时)
- 3.  开源软件开发方法与支撑工具(6学时)
- 4.  开源软件开发实践(10学时)
- 5.  开源软件研究(2学时)
- 6.  开源的发展趋势与未来展望(2学时)
- 7.  个人实践报告,项目实践总结报告(4学时)
## 教学方法与考核
【教学方法】本课程采用课堂教学、团队实践和研讨并重、结合课外学习和实践的教学方法。由于这门课程是讲开源软件的,绝大部分课程资料和学生的作业都已公开的形式展现出来。
【考核】平时成绩 50%,项目实践成绩 50%
## 课程安排
- 课次1: 课程介绍,开源背景介绍,第一次作业布置
- 课次2: 介绍开源软件开发的基本概念,包括开源平台、开源社区、开源项目、开源生态和开源协议等
- 课次3: 开源软件开发的实例剖析 (1)
- 课次4: 开源软件开发的实例剖析 (2)
- 课次5: 开源软件开发的实例剖析 (3)
- 课次6: 开源软件开发方法与支撑工具(1)
- 课次7: 开源软件开发方法与支撑工具(2)
- 课次8: 开源软件开发方法与支撑工具(3)
- 课次9: 开源软件开发实践(1)
- 课次10: 开源研究
- 课次11: 开源软件开发实践(2)
- 课次12: 开源软件开发实践(3)
- 课次13: 开源软件开发实践(4)
- 课次14: 开源软件开发实践(5)
- 课次15: 开源的趋势与未来展望
- 课次16: 项目报告(1):个人实践报告,项目实践报告
- 课次17: 项目报告(2):实践报告总结
## 这门课的老师
- 孙海龙: http://shi.buaa.edu.cn/sunhailong/zh_CN/index.htm
- 高翔:http://soft.buaa.edu.cn/info/1124/6921.htm
- 邹欣:https://edu.csdn.net/me/softwareteacher
## 关于这门课的教学方法
Learning by Doing (做中学),通过实践来学习。
工欲善其事,必先利其器,在这门课中,我们需要一些工具:
- git,markdown,linux:请看这个在线课程: https://edu.csdn.net/skill/gml
- 常用的编程环境,可以从简单的 VS Code 开始
- 开一个 CSDN 账号,我们的教案都放在这里 https://gitcode.net/csdn/intro-ossd
其中,目录 plan 是放教学的内容; 目录 PlayGround 是让同学们尝试各种 git 的协作操作,例如 git merge,等。
## 参考项目
大家可以从这些项目中选择一个或者几个项目参与:
- 开源的技能树:https://gitcode.net/csdn/skill_tree_opensource (构建一个覆盖开源软件开发知识和技能的结构化的知识图谱 + 练习题)
- 开源的 CSDN 可视化项目: https://gitcode.net/csdn/csdn-datav (一个基于海量 CSDN 数据的大数据可视化项目,由 CSDN 的技术人员和社区开源爱好者一起合作开发)
- 开源的笔记项目: https://gitcode.net/weixin_45873510/okidoki (一个帮助用户做笔记和事项管理的开源小软件,由北航学生开发了第一版,作为 北航计算机学院软件工程课程的项目之一)
- 大家还可以参加一些企业的开源项目,只要事先得到老师的批准,并且工作量和工作质量得到企业和老师的认可,这也可以算为是课程的开源部分。
详细的参考项目介绍可以看本目录下的 project.md 文件。
\ No newline at end of file
## 开源软件开发导论 课程
北航 2022 秋季学期
课次1
### 课程内容
1. 本课程的介绍: 老师,课程概况,如何适应在线课程和实地课程,如何参加开源实践
2. 在课堂上收集同学们的问卷调查,了解同学们的技术能力,对课程的期望
3. 各种软件开发的流程介绍 (取决于学生的程度,可长可短)
4. 介绍开源软件基本概念、发展历史
### 学生作业
一些准备工作:
1. 建立自己的 CSDN 账户,尝试写简单的博客
2. 完成 CS入门技能树 https://edu.csdn.net/skill/gml 你会在 gitcode.net 上创建一个自己项目。 你还可以克隆我们课程的项目: https://gitcode.net/csdn/intro-ossd
3. 第 0 个作业,一个超级简单的 “作业”:https://bbs.csdn.net/topics/607938213 这个作业没有分数,就是让大家练手。
4. 课后练习:请快速通关简单的 Git/Markdown/Linux 技能树: https://edu.csdn.net/skill/gml
5. 第一个作业,阅读并提问
5.1 阅读 “2022 中国开源发展蓝皮书” (自己可以搜索最新版本),
5.2 参加开源项目,听起来很简单,不就是大家都参加项目并提交代码吗? 请看下面的资料,了解参加开源项目的各种体验:
http://t.csdn.cn/aJjfw 20 年开源经历的程序员的故事
http://t.csdn.cn/Epv3j 参与开源,从给 RocketMQ 提 issue 开始
http://t.csdn.cn/ihAJj 吴峰光的开源经历:一个补丁迭代了 16 个版本。
http://t.csdn.cn/JzNOQ 跨组织,跨地域的开源协作
http://t.csdn.cn/ycKTQ 开源社区为何禁止某用户提交代码?
http://t.csdn.cn/7z2PQ http://t.csdn.cn/0zqQ7 失败的项目和开源的关系
还有很多和开源相关的书籍可以阅读:https://gitcode.net/csdn/intro-ossd/-/blob/master/chapters/open-source-booklet-20220829.pdf
作业的内容:
你既然来学习 ”开源软件开发“ 这个课程,那么你一定对这个领域有不少疑问。 上这门课的所有学生的疑问一定是不一样的,那么,你把你的疑问讲得越清楚,就越能帮助老师、助教、业界专家、甚至其他同学了解你的疑问,和你讨论并试图解答。
写一篇博客,在自己的 CSDN 博客账号下发表,描述自己目前还不知道答案的五个具体问题。
注意:是 “还不知道答案” 的问题。 请不要写很宏大的问题,如 “开源的意义“, ”怎么让开源项目成功” 。 而是一个具体的问题。
#### 一个模板可以是这样:
我看了这一段文字 【引用文字】,有这个问题 【提出问题,描述问题】。
我查了资料,有这些说法 【引用说法】
你提问题的原因,是因为自己的假设和书中的不同而提问,还是不懂书中的术语,还是对推理过程有疑问,还是书中的描述和你的经验 (直接经验或间接经验) 矛盾?根据我的实践,我得到这些经验 【描述自己的经验】。
但是我还是不太懂,我的困惑是 【说明困惑】。
或者是,我反对这段文字中作者的观点 (提出作者的观点,自己的观点,二者差别,以及你的理由)。
大学生应该能写出自己的思考, 而不是摘抄书本内容。
关于如何提问,也有很多人给了建议,这是其中的一个,他的原作者大家可能有所耳闻:
http://tieba.github.io/common/howtoask.html
### 怎么交作业
很简单,看这里: https://bbs.csdn.net/topics/607938212
注意:参考资料中的观点是作者在不同的历史时期发出的,未必适合于现在的开源生态,也未必正确。
## 开源软件开发导论 课程
北航 2022 秋季学期
课次3: 开源软件开发的实例剖析 (1)
### 开源软件开发的实例剖析
1. TDengine 的开源之路 -- TDengine 团队
2. CSDN 数据可视化的开源介绍
3. 本课程的开源项目简介
4. 使用 git & gitcode 的现场答疑
### 学生作业
1. 组成小团队(3-4 人),决定做什么样的开源项目
## 开源软件开发导论 课程
北航 2022 秋季学期
课次4: 开源软件开发的实例剖析 (2)
### 开源软件开发的实例剖析
1. 《在开源社区如何合作 - W3C 的标准化过程》 -- 鲍捷(文因互联 CEO)
2. CSDN 的开源项目简介 - C笔记
3. 北航的开源项目简介 :https://gitcode.net/weixin_45873510/okidoki (北航同学来介绍)
### 学生作业
1. 组成小团队(3-4 人),最终决定做什么样的开源项目 (本周末)
## 开源软件开发导论 课程
北航 2022 秋季学期
课次4: 开源软件开发的实例剖析 (3)
### 开源软件开发的实例剖析
1. iView 的开源之路 -- 梁灏
2. 技能树开源项目介绍 -- CSDN 工程师
3. 学生小组上台描述他们的开源项目
### 学生作业
1. 学生团队发布他们的项目计划(在 gitcode.net 开始项目)
## 课程简介:
请看 https://gitcode.net/csdn/intro-ossd/-/blob/master/plan/0.md
## 参考项目
大家可以从这些项目中选择一个或者几个项目参与:
- 开源的技能树:https://gitcode.net/csdn/skill_tree_opensource (构建一个覆盖开源软件开发知识和技能的结构化的知识图谱 + 练习题)
- 开源的 CSDN 可视化项目: https://gitcode.net/csdn/csdn-datav (一个基于海量 CSDN 数据的大数据可视化项目,由 CSDN 的技术人员和社区开源爱好者一起合作开发)
- 开源的笔记项目: https://gitcode.net/weixin_45873510/okidoki (一个帮助用户做笔记和事项管理的开源小软件,由北航学生开发了第一版,作为 北航计算机学院软件工程课程的项目之一)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册