群体化软件开发方法
何为闭源软件
定义
软件代码不对用户开放的一类软件,购买软件时只提供可运行软件或服务,没有提供源代码
以使用许可证(License)的方式授权用户使用软件
特点
无法获得源代码(无渠道)
无权使用源代码(合法性)
闭源软件只提供可执行代码,不提供源代码
闭源软件带来的问题
无法掌握软件内部实现情况(如是否存在恶意代码),难可信
无法修改和完善软件,影响了开发者的创新自由
何为开源软件
定义
一种源代码可以自由获取和传播的计算机软件,其拥有者通过开源许可证赋予被许可人对软件进行使用、修改和传播
开源软件的特点
源程序代码对外开放
自由使用、修改和传播
开源软件对源代码开放,并允许你修改和传播
开源软件的开发要求
任何人都可获得开源软件的代码
开源软件的种类
操作系统
- Linux、 Ubuntu、麒麟、鸿蒙、OpenEuler
数据库系统
- MySQL、PostgreSQL、MongoDB、Redis
开发平台
- Eclipse、Junit、SonarQube、Kubernetes
人工智能
- Tensorflow、Opencv、Caffe、Deeplearning4j
网络安全
- Nmap、curity Onion、Suricata、Bro
何为群体化软件开发方法
基本理念
基于团队的软件开发方法及其组织模式
基于团队软件开发的特点
- 开发团队边界封闭
- 域外人员无法参与
- 人员以及资源有限
- 项目的成果不共享
- 集中化的管理模式
- 关注生产而非创作
- 无法充分利用团队之外的力量,阻碍大众参与软件创作和生产
思想
依托互联网平台来吸引、汇聚、组织和管理互联网上的大规模软件开发人员,通过竞争、合作、协商等多种自主协同方式,让他们参与软件开发、分享软件开发知识和成果、贡献智慧和力量的一种新颖软件开发方法
特点
软件开发边界开放
互联网大众自由参与
利用海量的大众资源
共享源程序代码
兼顾软件创作和生产
依托互联网平台
群体化软件开发是一种基于社区的软件开发模式
软件创作
发挥软件工程师的智慧,结合创作者的爱好和兴趣,开展软件创作
如构思需求、开展设计、精雕代码等
开源软件项目的开发和组织模式
开放项目边界
大众参与开发
软件代码共享
由少数核心开发人员和大量互联网大众(外围)所组成的群体化开发
- 将软件创作和生产融合在一起,充分发挥大众的智慧和力量
- 互联网大众的作用
• 构思软件需求,增强软件功能-创作
• 发现软件问题,指出软件缺陷-创作
• 编写程序代码,提交开发成果-创作+生产
• 参与代码评审,评价贡献质量-生产
软件生产
任务分工,集中管理
计划驱动,有序开发
评审测试,保证质量
交流沟通,促进合作
软件开发是创作和生产的过程
大教堂与集市
大教堂(基于团队的闭源软件开发)
传统大型软件公司的开发模式就像艰难缓慢的大教堂建造工程,严密的组织和集中式结构
特点是封闭式建设、成本高、周期长、品质优
集市(基于群体的开源软件开发)
特点是开放式建设、成本低、周期短、品质平庸
并行、对等的扁平化开发,参与者大多来自于互联网上的志愿者,结构松散、来去自由
如何实现群体化软件开发
关键软件工程技术
基于社区的群体化组织
基于Issue的任务管理
基于Git的分布式版本管理
基于Pull/Request的分布式协同开发
基于群智的知识分享
基于社区的群体化软件项目组织
开发方式
- 依托开源社区来组织不同人员
• 开发人员
• 核心开发人员
• 开源软件项目的主要贡献者,主要职责
• 开源软件的核心贡献人员(如提供了最初的开源代码)
• 分析和评估外围开放大众所发现的软件缺陷和提出的软件需求,将其转化为生产性的软件开发计划
• 评审和分析开放大众所提交的程序代码,并将通过评审的代码融入到软件仓库之中
• 人数不多
• 几个到几十个不等
• 外围开发人员
• 开源软件项目的外围贡献者,主要职责
• 借助于互联网平台获得软件项目信息,结合个人的兴趣爱好、经验和技能,自发地为软件项目贡献自己的力量
• 提出需求建议、汇报代码缺陷、提交程序代码、评审代码质量等
• 数量会非常大
• 成百上千,甚至有几万人
- 开源软件社区将核心开发人员与外围开发人员有机地结合在一起,依托软件仓库进行分布式协同开发
• 开源软件社区
• 开源软件原则
• 自由进出社区
• 遵循社区规定
• 自愿开展工作
• 开放分享代码
传统软件开发的任务管理
软件项目团队管理者向团队成员指派开发任务
基于Issue的任务管理
开源软件的开发任务
不同于传统的开发任务分解方式
开发者群体自主提出,体现了群体创作思想
每个任务对应于一个Issue
开发任务的二类形式:修复软件缺陷、功能实现需求
创建Issue,提出软件开发任务
清晰地描述任务:需要包含任务的标题,内容,特征
提供必要的标签以补充说明任务的性质和特征:例如:缺陷或者要求,程序语言
任何人均可提出软件开发任务:代码缺陷 和 软件需求
讨论Issue,分析开发任务的意义和价值
指派Issue,安排人员来完成Issue
何为指派Issue
- 将Issue分配给相应人员加以解决
要考虑的因素
- 群体基于兴趣和特长来认领相关任务
- 结合开发者的开发技术和经验
- 考虑开发人员的能力和精力
Issue指派并非强制性
- 具有通知和推荐的性质
- 接受到任务指派的人员有权决定是否接受该指派,可自愿参加或拒绝指派
掌控Issue,掌握Issue解决的进展状况
辨别Issue的类别
- 代码缺陷,新增功能需求
- 给Issue打标签
确认Issue的有效性
- 缺陷是否客观存在
- 软件需求是否有意义
为Issue贴上适当标签
- 直观地展示其特征信息
- Bug表示缺陷修复任务,duplicate表示这是一个重复任务
跟踪Issue
跟踪和记录Issue的解决过程,掌握Issue解决状况
- 事件的发起者
- 发生的时间点
- 事件的内容等
重要的事件
- 提出
- 贴标签
- 指派负责人