软件工程:小组开发过程技术(VS VSS UNIX C++)

        (注:这个东西是2007年写的,算是个缅怀,或是个吐槽。所有注都是本次发布新加的。

简介

        本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C++程序,实现在小组规模的初级开发过程。这不是TSPi或者CMM,这比CMM1级(初始级)还要低,可称之为CMM0。

目录

1 概述

2 责任和责任感

3 概念

3.1 配置和配置项

3.2 软件配置管理

3.3 基线

4 开发过程

5 松散开发的问题

6 测试和发布

7 基本开发结构

7.1 结构图

7.2 服务器

7.3 开发者环境

8 技术细节

8.1 版本控制VSS

8.2 开发工具VS(visual studio)

8.3 数据库工具TOAD

8.4 数据库结构检查

8.5 UNIX SHELL 脚本

8.6 维持单一版本

8.7 避免绝对依赖关系

8.8 记录变更历史

8.9 自动版本升级

8.10 版本标识和检测


1 概述

        CMM对于内地大多数软件公司来说,仅仅是老板用红包(当然少不了吃饭和旅游)兑换的一块牌子,而项目负责人和程序员仍然在无序开发的泥沼中挣扎、应付永远做不完的需求和BUG。
        我听过很多的言论,表达“软件文档是毫无意义的”这样的观点。我相信大多数程序员都对此心有戚戚焉,我个人的经验也同样在部分层面支持这个观点。
        软件工程错了吗?
        是的,软件工程错了,如果你只是想得到软件的好处。
        软件工程是一套标准和方法,标准和方法本身并不能带来任何利益,每个标准和方法都有适用的基础条件和成本付出,只有正确地实施才会获得好处。
        很多程序员都喜欢玩CS,有两款典型自动步枪(不能区分冲锋枪和自动步枪的请保持沉默),AK47(AK74)和M4(M16),这两种步枪孰优孰劣?简单地说,M4(M16)是高精尖武器(仅其塑料材质就可以吓退大多数仿制者),低后坐力、高精度,昂贵、复杂、精密、易损坏,只能由受过专业训练的士兵使用,并且需要后勤支持(看到美军在伊拉克把安全套套在枪口上以避免沙子进入导致卡壳吗?),AK47(AK74)则是简单武器,精度很差,廉价、耐用、无需维护,风沙海水都不怕,最适合沙漠、山区的恐怖分子使用。对恐怖分子而言,M16是毫无用处的塑料垃圾。
        好了,恐怖分子们,拿起AK,准备战斗。

2 责任和责任感

        每个人都有责任就是每个人都没有责任。
        管理者是承担管理责任的人,小组负责人是管理者,带徒弟的师傅也是管理者。
        甚至于,每个人都要管理自己的程序、文档、mp3和游戏,每个人都是管理者。当然,我们不会把希望寄托在每个人身上,因为——每个人都有责任就是每个人都没有责任。
        任何把希望寄托在人的自觉性上的人都不能成为合格的管理者。
        作为小组负责人,必须对全组负责。作为从零起步的开发小组,项目能否顺利进行完全取决于小组负责人的能力。
        下面列出对小组负责人的要求,其中有些要求对个人能力是一个巨大的考验。
        要掌握每个成员的技术能力,正确地分配任务。要能够估计成员完成任务的所需的时间。
        要了解完成任务所需的技术,知道从何处取得相关技术的资料。高级管理者并不需要成为每项技术的专家,越是低级管理者则越是要精通技术。
        要在心里正确估计进度,正确地估计代码质量。要估计测试和返工所需的时间。
        要把握总体设计,检查任何影响其它模块、其他人的设计和变更。
        要查看所有人的代码,要求代码风格尽量符合小组负责人的习惯。
        要有安全意识,主动发现并预防可能发生的意外事件。
        要了解下面章节所提到的概念和技术。

3 概念

3.1 配置和配置项

        “配置”是在技术文档中明确说明并最终组成软件产品的功能或物理属性。因此“配置”包括了即将受控的所有产品特性,其内容及相关文档,软件版本,变更文档,软件运行的支持数据,以及其他一切保证软件一致性的组成要素,相对与硬件类配置,软件产品的“配置”包括更多的内容并具有易变性。
        受控软件经常被划分为各类配置项(Configuraion items, CIs),这类划分是进行软件配置管理的基础和前提,CIs是逻辑上组成软件系统的各组成部分。比如一个软件产品包括几个程序模块,每个程序模块及其相关文档和支撑数据可能被命名为一个CI。一个系统包括的CIs的数目是一个与设计密切相关的问题。一个纯软件的CI通常也称之为软件配置项(CSCI)。
        现在所有的配置管理工具均提供对配置项的管理工具,包括(Check in和Check out机制的 )版本管理和版本标号功能。由于版本和标号管理比较繁琐,一般推荐使用配置管理工具,减少事务性工作。

3.2 软件配置管理

        软件配置管理是贯穿于整个软件过程中的保护性活动,它被设计来(1)标识变化,(2)控制变化,(3)保证变化被适当的发现,以及(4)向其他可能有兴趣的人员报告变化。

3.3 基线

        基线(baseline)是配置项的稳定版本,是进一步开发的基础。一般一条基线包含一组配置项,在所有包含的配置项确认通过后(测试或评审通过)基线形成,基线一般采用更高级别的变更保护。
        基线概念反过来解释就是一项工作所依赖的所有配置项。比如,一个新模块的开发依赖公共组件并需要与特定模块交互,那么新模块所依赖的基线至少要包括公共组件的特定版本、与特定模块交互的接口协议的特定版本(或者特定模块的特定版本)。
        一般开发过程中我们通过打标签的方式标识基线,并尽量避免复杂的的基线划分。

4 开发过程

        基本的开发过程分为设计、开发、测试、发布。发布是把软件和文档打包提供给客户的过程,该过程较简单,技术性不强,不多讨论。设计是难度最高的过程,通常只是在头脑里模拟完成,不会有成文的输出(我们偷懒省去了设计过程,至于更无法掌握的需求根本不必提及)。剩下的开发和测试是实际看得到的环节,通常我们制定项目计划只考虑开发和测试。
更现实一点说,多数的项目开发过程的开发和测试是混在一起的,开发人员在开发时自行测试自己的程序,没有独立的测试过程。
        作为项目开发过程化的第一步,要形成版本概念(与基线概念相关)。版本是妥善保存的,成为追溯的依据。经常发生这样的情况:新版本测试发现问题,需要用旧版本检查以确定问题是新版产生还是旧版原有的,然后需要对比版本以寻找问题所在。
        项目过程化的第二步,是要有独立的测试过程。独立的测试过程不一定要求专职的测试人员,开发人员可以互相测试。一定要在版本上测试,不能边改边测。发布的版本必须是测试通过的完整版本,不能是发现错误修改后只测试了出错点的版本(BUG修改经常在其他地方产生意想不到的错误)。
        以上两步是最基本的,是小组范围内能够自行掌握的。形成版本使过程控制成为可能,独立测试则显著提高产品质量。
        版本化原则上并不需要任何额外工具,在有版本控制工具以前可以做手工的存档。版本控制工具可以提供较好的版本管理,但不能偷懒把发布版本放在开发库里(尽管发布版本总是对应一个开发版,但管理上要求发布版本与开发版本脱离)。版本控制工具可以提供较好的过程管理,能够明确产品包含的有效源代码、文档,能够控制同一个文件的修改冲突,能够检查项目、文件所发生的变化,给小组负责人控制项目提供有力的支持。
        独立的测试过程给软件质量提供一个可信赖的过程保障,开发者自测的局限性非常大(这是心理学原因,不是靠工作态度可以解决),通常交换测试就可以发现大量简单错误。在有独立测试部门的情况下,一般开发组提交给测试组的代码已经是经过开发组内部测试的版本(否则BUG太多面子上不好受并且会影响奖金)。

5 松散开发的问题

        松散系统是由大量非紧密相关的部分组成的系统,各模块在大多数时候可以互不干扰地独立开发,但少数情况下需要修改公共部分。
        由于多数情况下各自开发不需要交互,长时间以后导致每个人对公共基础(一般主要是数据库)的掌握不足。每个开发者都可能根据自己的需要增加了一些表,不同的开发者可能重复开发了相似的功能,不同的开发者可能对同一个数据做出了不同的假定。
        在维护期对生产系统的BUG修复或特殊需求经常直接在生产系统上进行,因为问题经常与特定的环境和数据有关,很显然在生产系统上直接修改、测试是最快速的、最方便的方式。这种现象导致不兼容的特殊版本,对后续维护造成致命的障碍。管理者应该意识到这个问题。
        松散开发和维护方式实际上不是一种开发模式,而是一种混乱。
        在Windows环境下开发时很少所有人共享同一个数据库和同一套代码,然而在UNIX上却相当普遍。究其原因可能是因为UNIX上多数都是大系统,为每个人构建一套开发环境可能资源不允许,开发时经常麻烦管理员也不是很方便。
        短期内解决这个问题所投入的成本与带来的长远好处相比是否值得?从现实看多数人的答案是“否”。
        解决的办法有没有?当然有。但的确不是很省力的,一方面需要掌握多方面的技术,另一方面要投入人力资源进行控制。技术面和技术深度对内地从业者来说都是薄弱环节。若要加强控制就必须存在一个人对所有变更进行审查,确保所有变更都被统一记录以便其他人能够知晓。小组负责人应该亲自进行控制,小组负责人是唯一可能同时具有足够技术、权力、职责和责任心的人。
        本文所提及的技术细节都是在数年里逐渐解决的,解决之前觉得很麻烦,解决之后觉得不过如此(技术问题从来如此)。多数技术要求对管理都有很大的作用,是因为有管理需要才引入这些技术。
        应付同一个模块每天三次的紧急修改需求是不可能的,如果这样的事情发生,我们只能说质量已经失控。
        对于突发的故障的维护,可以采用紧急处理策略,直接生成一个特殊版本解决问题(毕竟生产系统的故障必须尽快解决),然后再将特殊版本的修改并入正式版本。在生产系统直接修改不并入正式版本会导致最后产品不可维护,这是要通过制度才能解决的问题。

6 测试和发布

        软件发布的版本必须是测试过的版本,中间不能有开发人员介入。作为管理者,不能信赖过程上不可靠的东西。
        软件发布应尽量完整发布,不得不频繁发布小模块的时候必须谨慎小心,避免差错。
        必须严格按照测试通过的顺序发布,必须严格按照发布顺序实施更新。
        小模块发布时小组负责人必须仔细检查变更细节以确保不会产生模块冲突。
        若与其他小组有关联则必须联合发布并且在代码中检查其它小组的模块的版本。
        每个小模块的开发者无权发布模块。发布必须经过小组负责人的认可。
        公共模块的修改必须在小组主要开发人员认可后进行,不可随意修改。

7 基本开发结构

注:由于年代关系,后续提及的软件可能已经过时,用同等功能的替代即可

7.1 结构图

7.2 服务器

        服务器是核心。这个服务器不是开发用的主机,是用来共享资源和版本管理的服务器。
        共享资源包括开发用的各种软件的副本、各种技术资料以及其他对团队有意义的东西。
        版本管理一般都采用VSS,需要把VSS数据库目录放在服务器上共享。使用CVS可能无法顺利完成所有需要的工作。
        需要一再强调的就是,只有入库的东西才被承认。声称代码写完了但是忘了入库的人一律扣发当月奖金并全组通报批评。

7.3 开发者环境

        每个开发者拥有自己的开发环境,以避免开发干扰,因此需要在UNIX主机和数据库建立独立的用户。如果不能做到,至少保证两个用户,一个用来开发一个用来测试。
        推荐开发者使用VS或其他集成开发环境。集成开发环境提供的辅助功能会极大地提高开发速度和代码质量。
        可以统一使用VS作为开发环境,配合FTP工具上传。如果全部统一用VS则还可以使用VS直接访问VSS。用VS直接访问VSS与手工访问VSS相比较少犯VSS操作错误。
        每个开发者使用独立的开发环境有助于使开发者明确认识到完成的代码必须入库。独立的测试环境也有助于开发者养成详细记录数据库变更的习惯。

8 技术细节

8.1 版本控制VSS

        版本控制通常使用VSS或者CVS。使用版本控制的目的在于限制代码的随意修改、追溯代码的修改过程。就概念而言,VSS更符合版本控制概念,使用者能够形成正确的版本控制观念。
        版本控制软件维护一个库存放代码,每个开发者将代码取回作本地开发,然后将代码放回,代码放回后其他开发者才能看到。
        每个人都必须正确掌握VSS的使用,培训是必要的。
        VSS默认配置为不允许多人签出,这正是我们需要的。每个人都需要设置对项目操作的递归选项,这样可以连同子目录一起操作。签入文件后应查看历史或比较文件以确认签入正确。
        熟练掌握目录比较和查看历史对每个人都很重要。

8.2 开发工具VS(visual studio)

        建立C++ Win32控制台项目,空项目。
        将项目文件添加到项目中,建立与实际目录结构一致的VS文件组织结构。
        如果有头文件需要配置搜索路径才能访问,则设置项目的“附加包含目录”。否则无法解析头文件,不能提供类型帮助。
        如果不使用VS整合的VSS访问则每个开发者都要重复这些工作。如果把项目文件放在VS的项目文件之下的子目录(此时VS项目文件存储代码文件的相对路径)则可以直接复制VS项目文件给别人用。
        如果使用VS整合的VSS访问则使用VS的添加到版本控制的功能将项目添加到VSS,其他人用VS的从版本控制打开项目即可。
        VS不提供FTP功能,需要同时打开一个FTP软件来上传源代码。如果愿意,可以对VS做二次开发来简化操作。
        VS提供的最大帮助是即时解析源代码提供变量、函数说明、类成员的信息等。VS提供的查找、替换、格式化功能也是很强大的。有经验的使用者可以写出一次编译通过的代码(呵呵,绝不是无BUG)。

8.3 数据库工具TOAD

        TOAD能提供数据库的脚本、数据脚本、数据库变更脚本,能做全用户的导入导出。
        导出的数据库结构脚本可以入库进行版本控制。可以用数据库脚本或数据库备份重建开发者环境。
        对数据库的变化应该提供变更脚本。
        所有用户共享一个库的风险是很大的,一个人的误操作就可能毁了一切。

8.4 数据库结构检查

        标准的数据库结构检查是查询数据库数据字典。数据库数据字典是一组视图,可以查询所有的表、列、约束、同名词、序列、过程等的详细信息。
        复杂的程序可能需要查询数据库结构来确定操作如何进行,这是完成一些自动维护任务所需要的。

8.5 UNIX SHELL 脚本

        编写复杂的脚本可以执行很多复杂任务。比如自动检测机型、判断主机资源状况、执行数据库脚本(可以配合复杂的sqlplus脚本)检查数据库结构、根据实际情况执行不同的编译过程或其它程序等等。
        整个项目保持为同一个软件包,用单一方式编译执行是很有价值的。脚本至少可以做到根据机型使用不同的配置文件、根据参数自动选择合适的优化开关、自动处理特殊的预编译宏、自动执行数据库检查脚本。
        Shell编程的关键是掌握返回码的处理和条件逻辑,这样就可以有机地把命令组织起来像个像样的程序。

8.6 维持单一版本

        不同厂商的UNIX环境有很多差异,尽可能选择通用的语法,避免编译问题。无法避免的可以用宏开关来处理。对宏开关要能用编译脚本自动处理,手工处理容易出错。
        有时不同用户会提出冲突的需求,优先选择通过配置实现,实在不方便的可以用开关实现,但最好不要用宏开关,用全局变量开关比较好。
        可以建立一个系统表记录用户信息,程序启动时初始化全局变量,程序根据全局变量决定特殊处理。

8.7 避免绝对依赖关系

        任何一个系统都应该避免对环境做过多的假定,不依赖特定的用户、目录、端口、系统Key之类的东西。当系统发生问题需要调试的时候,很可能需要在正在运行的系统的“旁边”建立测试系统,比如在另一个目录用不同版本的代码编译执行,或者希望程序将输出输出到一个临时位置。设计时考虑调试需要可以方便后期的工作。

8.8 记录变更历史

        项目必须有一个文件记录变更历史,由每个变更实施者填写。该文件可放置在项目根目录下。记录每个变更的时间、人员、原因、方案、变更的项目、相关影响等,特别是数据库的结构变化。每个变更顺序编号。
        小组负责人将随时检查变更历史。

8.9 自动版本升级

        软件升级应当简单,执行一个程序或脚本即可,不要让用户去执行琐碎的修改。
        对开发而言同步不同的开发环境也需要这样做。

8.10 版本标识和检测

        软件应标识自身,程序执行首先应显示版本信息。每个模块都有自己的标识。
        应检查数据库结构和软件的预期是否一致。不一致时程序必须拒绝执行。
        对相关模块版本也应同样检查。

(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/175141.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回文链表Java

我们可以采用双指针的办法进行,如下图: 如果链表长度为偶数,则直接从第二个指针的位置开始对链表进行反转;如果是奇数,则从第二指针的下一位进行链表反转 代码实现: public static void main(String[] args) {ListNode next4 new ListNode(1, null);ListNode next3 new Lis…

AssertionError: Torch not compiled with CUDA enabled

Pytorch和CUDA版本不兼容,运行python后(终端输入python回车)用以下代码测试 import torch print(torch.__version__) print(torch.cuda.is_available())返回False则说明目前的pytorch版本无法使用显卡,如下图所示 接着重装合适版…

实战 | SQL注入

一、资产搜集 我们都知道sql注入的传参有些是明文的,有些是经过编码或者加密的,所以我们搜索的时候不要仅限于inurl:.php?id1,可以额外的尝试搜搜1的base64编码值MQ,即可以搜索inurl:.php?idMQ,或者搜索1的md5加密值…

css实现圆形进度条

能用现成组件就用,实现不行再自己写,因为牵扯到上传文件,进度实时出不来,所以只能使用dom元素操作; 1.实现 效果: 上图是100%,如果需要根据百分比显示,我们需要看下代码里面left和…

Ubuntu20.04下安装MySQL8环境

Ubuntu20.04下安装MySQL8环境 1.下载MySQL客户端和服务器2.配置MySQL3.测试MySQL4.设置MySQL服务开机自启动5.修改root密码MySQL数据库基本使用启动MySQL数据库服务重启MySQL数据库服务停止MySQL数据库服务查看MySQL运行状态设置MySQL服务开机自启动停止MySQL服务开机自启动MyS…

读图数据库实战笔记04_路径与图变异

1. Groovy 1.1. Java编程语言的一个超集 1.2. Gremlin Console的一个特性是能和Groovy配合使用 1.2.1. Gremlin Console会自动地迭代结果 1.3. 从技术上说,Gremlin Console就是Groovy交互式解释器(read-eval-print loop,REPL)…

【广州华锐互动】城市水处理VR仿真实训平台

随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为我们带来了前所未有的沉浸式体验。在教育领域,VR技术的应用也日益广泛,为传统的教学模式带来了革命性的变革。本文将以城市水处理VR仿真实训…

[架构之路-246/创业之路-77]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 客户关系管理系统CRM

目录 前言: 一、企业信息化的结果:常见企业信息化软件 1.1 客户关系管理系统CRM 1.1.1 什么是客户关系管理系统 1.1.2 CRM总体架构 1.1.3 什么类型的企业需要CRM 1.1.4 创业公司在什么阶段需要CRM 1.1.5 研发型创业公司什么时候需要CRM 1.1.6 C…

3D RPG Course | Core 学习日记一:初识URP

前言 最近开始学习Unity中文课堂M_Studio(麦大)的3D RPG Course,学习一下3D RPG游戏核心功能的实现,第一课我们学习到的是地图场景的编辑,其中涉及到了URP渲染。 我们首先进入Unity资源商店把地图素材和人物素材导入好…

stable diffusion简介和原理

Stable Diffusion中文的意思是稳定扩散,本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型,它使用潜在扩散过程来生成图像,允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…

leetcode-二叉树

B树和B树的区别 B树,也即balance树,是一棵多路自平衡的搜索树。它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点。 B树内节点不存储数据,所有关键字都存储在叶子节点上。B树: B树: 二叉…

mac安装并使用wireshark

mac安装并使用wireshark 1 介绍 我们在日常开发过程中,遇到了棘手的问题时,免不了查看具体网络请求情况,这个时候就需要用到抓包工具。比较著名的抓包工具就属:wireshark、fildder。我这里主要介绍wireshark。 2 安装 以mac安装为…

前端开发必备技能!用简单CSS代码绘制三角形,提升用户体验

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、前…

Docker 容器服务的注册、发现及Docker安全

目录 Docker容器服务的注册和发现 1、什么是服务注册与发现? 2、什么是consul consul的部署 1、环境准备 2、部署consul服务器 1)建立 Consul 服务 2)设置代理,在后台启动 consul 服务端 3)查看集群信息 4&a…

图像视觉特效处理工具:Boris FX Optics 2024.0.1

BorisFX光效插件Optics首发2024版:3大新功能详解 2023年9月15日,全球领先的视觉后期软件开发公司BorisFX推出了旗下知名软件Boris FX Optics的全新2024版本,这款备受后期处理爱好者喜爱的Photoshop插件和独立程序再次升级,为您的…

Docker Consul概述及构建

Docker Consul概述及构建 一、Consul概述1.1、什么是Consul1.2、consul 容器服务更新与发现1.3、服务注册与发现的含义1.4、consul-template概述1.5、registrator的作用 二、consul部署2.1、环境配置2.2、在主节点上部署consul2.3 、配置容器服务自动加入nginx集群2.3.1、安装G…

Redis测试新手入门教程

在测试过程中,我们或多或少会接触到Redis,今天就把在小破站看到的三丰老师课程,把笔记整理了下,用来备忘,也希望能给大家带来亿点点收获。 主要分为两个部分: 一、缓存技术在后端架构中是如何应用的&#…

K8s集群

统一时间:ntpdate(都做) ntpdate -b ntp1.aliyun.com */1 * * * * /usr/sbin/ntpdate -b ntp1.aliyun.com systemctl status docker vi /etc/docker/daemon.json systemctl restart docker m: vim kubernetes.sh cat >> /etc/yum.repos.d/kubernetes.repo…

50元买来的iPhone手机刷机经验

前段时间,家里的iPad被家人误操作,导致iPad变成不可使用状态。自己折腾了半天,没有找到解决办法。没有办法,只好拿到手机维修店去修理,很快就修理好了.其实也很简单--就是对iPad进行了刷机操作。当然我也看到了刷机的方法。今天&a…

优化改进YOLOv5算法:加入SPD-Conv模块,让小目标无处遁形——(超详细)

1 SPD-Conv模块 论文:https://arxiv.org/pdf/2208.03641v1.pdf 摘要:卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而,当图像分辨率较低或物体较小时,它们的性能会灾难性下降。这是由于现有CNN常见的设计体系结构中有缺陷,即使用卷积…