软件工程:小组开发过程技术(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 版本标识和检测
软件应标识自身,程序执行首先应显示版本信息。每个模块都有自己的标识。
应检查数据库结构和软件的预期是否一致。不一致时程序必须拒绝执行。
对相关模块版本也应同样检查。
(这里是结束)
相关文章:

软件工程:小组开发过程技术(VS VSS UNIX C++)
(注:这个东西是2007年写的,算是个缅怀,或是个吐槽。所有注都是本次发布新加的。) 简介 本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C程序,实现在小组规模的初级开发过程。这不…...

算法----从字符串中移除星号
题目 给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题…...

JVS低代码表单引擎助你打造高效表单设计流程
在日常的设计表单过程中,常常会有需要录入一大段文字的场景,例如评论、留言、产品介绍、内容说明等场景,那么简单的文本框组件就不满足了,这里JVS提供了 两种描述类型的组件,多行文本框和富文本组件,如下图…...

运行项目报错error in ./node_modules/marked/lib/marked.umd.js
今天跑项目时发现一个报错,问题出在marked这个包,然后翻看package.json里面也没有这个包,全局搜索项目也没有这个包相关的信息,可它就是报错,索性直接把它给卸载发现还是报错 报错原因:包的版本太高 解决…...

内置对象和方法、前端基础之BOM和DOM
内置对象和方法 RegExp对象 // 定义正则表达式两种方式 var reg1 new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); var reg2 /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;// 正则校验数据 reg1.test(jason666) reg2.test(jason666)/*第一个注意事项,正则表达式中不能有…...

内网穿透配置-Cpolar-Ngrok
文章目录 一、Cpolar1、cpolar软件的使用:(1)下载与安装(2)cpolar指定authtoken(3)获取临时域名(4)验证临时域名有效性 二、Ngrok1、配置内网穿透(1ÿ…...

Web前端自动化测试Cypress实践总结
本文主要首先主要介绍了什么是自动化测试,接着对常用的自动化测试框架进行了对比分析,最后,介绍了如果将自动化测试框架Cypress运用在项目中。 一、自动化测试概述 为了保障软件质量,并减少重复性的测试工作,自动化测…...

Nacos本地修改编译源码2.2.3
下载Nacos源码 由于github访问速度慢,所以在gitee上下载 git clone https://gitee.com/mirrors/Nacos.git切换2.2.3版本 git checkout 2.2.3或者直接下载2.2.3的源码 本地编译 源码导入idea,然后编译 mvn -Dmaven.test.skiptrue -Drat.skiptrue c…...

邦芒攻略:提升职场核心竞争力的7点建议
如何提高职场的核心竞争力,职场是由职场定位,以及竞争,合作,等各种关系构建起来的一个无形的圈子,职场一直以来竞争激烈,那么,该如何提高职场的核心竞争力? 1、首先要保持学习…...

Android 如何在Android studio中快速创建raw和assets文件夹
一 方案 1. 创建raw文件夹 切成project浏览模式——>找到res文件粘贴要放入raw文件夹下的文件。 当然此时raw文件还没有,直接在右侧输入框中出现的路径~\res后面加上\raw即可。 2. 创建assets文件夹 同理在main文件夹下粘贴要放入assets文件夹的文件࿰…...

功率放大器功能及用途介绍
功率放大器是一种用于将输入信号的电压放大到更高水平的电子设备。它在各个领域中发挥着重要作用,包括音频、通信、测量和控制等应用。下面Aigtek安泰电子将详细介绍功率放大器的功能及其主要用途。 图:ATA-3000系列功率放大器 功率放大器的功能介绍&…...

11.Linux系统:定时任务备份mysql数据库为文件并传输到其他服务器
1. 创建脚本 mysql_dumps.sh内容如下: #!/bin/bash # 查找名称为“mysql_mysql”的容器id CONTAINER_IDdocker ps -a | grep "mysql_mysql" | awk {print $1} | head -n 1 MYSQL_USERNAME"root" MYSQL_PASSWORD"root" FILENAME_SU…...

基于Python的豆瓣电影排行榜,可视化系统
1 简介 基于Python flask 的豆瓣电影数据获取,数据可视化系统,本系统朱亚奥包括了影视系统的爬虫与分析。影视是人们娱乐、放松心情的重要方式之一,因此对影视的分析具有重要的现实意义。通过采用Python编程语言,使用flask框架搭…...

Flink日志采集-ELK可视化实现
一、各组件版本 组件版本Flink1.16.1kafka2.0.0Logstash6.5.4Elasticseach6.3.1Kibana6.3.1 针对按照⽇志⽂件⼤⼩滚动⽣成⽂件的⽅式,可能因为某个错误的问题,需要看好多个⽇志⽂件,还有Flink on Yarn模式提交Flink任务,在任务执…...

iOS NSKeyedUnarchiver归档和读取
使用NSKeyedUnarchiver归档数据到本地,很多时候保存的并不是基础数据类型,更多是自己定义的Model。有时会碰到归档或者读取的内容跟自己保存的数据类型不匹配。 现在按照思路一步一步解决: 1.先保存文件 保存的数据的类型 #import <Fou…...

算法通关村第五关|青铜|基于链表实现队列
基于链表实现队列 public class LinkQueue {// front的next指向首部结点private Node front;// rear记录尾部结点private Node rear;private int size;public LinkQueue() {this.front new Node(0);this.rear new Node(0);}// 入队public void push(int value) {Node newNod…...

【Vue】使用v-model实现控制子组件显隐
v-model 可以实现双向绑定的效果,允许父组件控制子组件的显示/隐藏,同时允许子组件自己控制自身的显示/隐藏。以下是如何使用 v-model 实现这个需求: 在父组件中,你可以使用 v-model 来双向绑定一个变量,这个变量用于…...

一篇博客读懂顺序表 —— Sequence-List
目录 一、顺序表的初始定义 1.1新建头文件和源文件 1.2 SeqList.h 中的准备工作 二、顺序表的初始化与销毁 三、首尾插入元素 四、首尾删除元素 五、中间插入元素 六、中间删除元素 七、查找指定元素下标 八、源代码 一、顺序表的初始定义 1.1新建头文件和源文件 当我…...

OceanBase:02-单机部署(生产环境)
目录 一、部署规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录,修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、OBD命令行部署 1.修改配置文件(all-c…...

【嵌入式 C 常用算法 2 -- 变量值交换函数异或方式实现】
文章目录 变量值交换函数异或方式实现 变量值交换函数异或方式实现 在C语言中,可以使用异或运算符(^)来进行两个数的交换,而不需要使用额外的临时变量。这种交换方式的基础是异或运算的以下性质: 任何数和 0 做异或运…...

Hadoop HDFS(分布式文件系统)
一、Hadoop HDFS(分布式文件系统) 为什么要分布式存储数据 假设一个文件有100tb,我们就把文件划分为多个部分,放入到多个服务器 靠数量取胜,多台服务器组合,才能Hold住 数据量太大,单机存储能力有上限,需要…...

力扣1.两数之和
原题链接:1.两数之和 根据题意可以得出 需要找出数组nums内 有两个元素相加等于target的两个整数,并且返回这两个证书的下标。并且数组内有重复元素,但是返回的答案不能有重复元素出现 要记住的就是,需要判断元素是否出现过&…...

JTA分布式事务管理器
XA协议:是一种标准协议,允许事务管理器协调多个资源管理器,确保在分布式事务中的一致性和原子性。 JTA:是JavaEE规范中的一种,用于管理分布式事务的 API,提供了事务的控制和协调机制 Atomikos理解成JTA的实现 XA是JTA的基础(JT…...

晨控CK-GW08系列网关控制器与CODESYS软件MODBUSTCP通讯手册
晨控CK-GW08系列是一款支持标准工业通讯协议ModbusTCP的网关控制器,方便用户集成到PLC等控制系统中。系统还集成了8路读写接口,用户可通过通信接口使用Modbus TCP协议对8路读写接口所连接的读卡器进行相对独立的读写操作。 晨控CK-GW08系列网关控制器适用于本公司多…...

读书笔记——labuladong算法笔记
读书笔记——labuladong算法笔记 序言计算机算法世界观计算机算法方法论二叉树遍历广度遍历BFS二叉树的前中后序遍历回溯算法动态规划算法二分搜索算法 其他算法滑动窗口双指针Union-Find算法 序言 labuladong算法笔记是一本讲解算法题求解技巧的书。本次读书笔记为2023年8月第…...

Linux中阶教程:bash shell基础
文章目录 输入输出赋值和计算条件判断函数for 循环数组及其遍历其他控制语句 输入输出 echo表示打印字符串;read表示获取用户输入;$用于引用变量。 # test1.sh bash中用#进行单行注释 echo "input your name:" read user_name echo "h…...

Golang 编译原理
简介 Golang(Go语言)是一种开源的编程语言,由Google开发并于2009年首次发布。它具备高效、可靠的特性,被广泛应用于云计算、分布式系统、网络服务等领域。Golang的编译原理是理解和掌握这门语言的重要基础之一。本文将介绍Golang…...

基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别 计算机竞赛
文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...

计算机视觉基础——基于yolov5-face算法的车牌检测
文章目录 车牌检测算法检测实现1.环境布置2.数据处理2.1 CCPD数据集介绍2.1.1 ccpd2019及20202.1.2 文件名字解析 2.2数据集处理2.2.1 CCPD数据处理2.2.2 CPRD数据集处理 2.3 检测算法2.3.1 数据配置car_plate.yaml2.3.2 模型配置2.3.3 train.py2.3.4 训练结果 2.4 部署2.4.1 p…...

【好书推荐】AI时代架构师修炼之道:ChatGPT让架构师插上翅膀
目录 前言 ChatGPT对架构师工作的帮助 快速理解和分析需求 提供代码建议和解决方案 辅助系统设计和优化 提高团队协作效率 如何使用ChatGPT提高架构师工作效率 了解用户需求和分析问题 编码实践和问题解决 系统设计和优化建议 团队协作和沟通效率提升 知识管理和文…...