案例分享:硬件敏捷

news2024/11/18 1:28:57

“没有人能够在硬件领域推动以两周为单位的循环迭代!”当人们谈起敏捷方法在包含了硬件及软件产品开发时,第一反应都是类似的论调。然而,已经有一些团队,尝试将已有的可靠硬件开发理念与少量从敏捷软件中借鉴的新鲜思想结合,进而去应对甚至已经解决了进行硬件快速迭代的挑战。

敏捷运动的硬件根源

当今我们称之为测试驱动开发(TDD)的方法,其起源正是来自Ward Cunningham在嵌入式系统方面的研究工作,以及在此过程中与他的伙伴Kent Beck的协作过程。上世纪70年代,Ward在一家研究机构中任职,当时他正致力于找出一条测试新型硬件的切实可行的途径。对此他曾回忆到:“在那个时代,微处理器是件新鲜事物。而我得出了这样一个结论:必须让机器告诉我们,它正在做什么。如果我们打算信任机器传递给我们的信息,那么这部分内容必须是非常简单的……自此之后,这个理念在我所做的每一项工作中都留下了它的影子。”同样地,Kent的经验也折射出类似的本质。

我在某次早年的敏捷会议上与Ward结识。当时我十分好奇,是什么吸引了他,让他步入由Kent Beck倡导,后来称作“极限编程(XP)”的敏捷过程。Ward告诉我,在上世纪80年代,他与Kent Beck在Tektronix从事Smalltalk方面的工作时,发现如果将一些简单的实践经验结合在一起,就会将研发效能提高到令人惊艳的程度。

Ward介绍到,当新的产品理念推进到了特定节点时,就需要面对公司内部的官僚流程。为了避免陷入到相应流程带来的文书工作之中,他们两位首先确定一个新颖的产品构思,然后推动另一个团队采用它。接下来,他们重复这个过程,做好新产品构思的快速迭代,并展示足够的可行性,从而使得其他人也开始认识到这一产品构思的价值,并促使其顺利通过内部官僚体系的流程。

结对、简洁、测试优先(Test First)等后来演化为TDD的实践经验和概念就此诞生并发展。就这样,在硬件领域,基础的敏捷实践方法TDD便应运而生。

案例1: 在敏捷专用集成电路(ASIC)设计中引入敏捷软件中的TDD理念

受到软件开发中运用TDD的启发,Neil Johnson是一名硬件验证工程师,首先将其应用到对SoC(System on Chip)的验证工作中。

为了便于理解验证工程师的工作职责,我们可以观察下面的工作模型。在SoC开发过程中,验证工程师与电路设计师(Circuit Designer)并肩工作,采用类似裁缝和设计师之间的工作模式。这幅图片展示了在设计并制作一套全新的服装时所需的工作步骤。在最后一步里,只有裁缝完成了自己的工作,而且没有引入任何缺陷(Defects)的情况下,设计师才能够对设计方案进行问题修正。而如果裁缝使用了错误的织物,或是未能正确测量模特,那么设计师将不得不去应对这些由她的设计方案以外的缺陷所引出的问题。

图 1. 验证工程师的工作内容——与时尚设计的工作模型的类比。设计师画出服装的设计图并选择织物。接下来裁缝测量模特身材,在设计图的基础上打样并缝制服装。最后设计师查看模特服装穿着的效果,并对其设计进行“调试”。

图 2. 验证工程师与电路设计师协同工作时,需要做哪些事情。电路设计师首先使用 CAD 系统绘制电路,接下来明确标注组件数据。验证工程师编写测试代码,进行仿真设计并检查电路表现。最后电路设计师查看 SoC 电路表现,并对电路设计进行“调试”。

同样,电子工程师负责设计电路;而验证工程师负责编写测试代码,并对SoC承载的功能进行确认,从而完成设计的验证工作。因此,如果验证工程师编写的测试代码中出现了Bug,那么显然会对测试效果的可靠性造成影响。

如果验证阶段引入了新的Bug,那么整个工作流程中就不得不增加额外的循环来查错和修复(返工),这将极大地增加硬件开发的时间。因此,Neil希望弄清楚,如果在“编写测试代码”的阶段使用TDD,那么与过去相比,他的验证工作能够变得有多“干净”。当 Neil花费几周时间将TDD框架落实到位,然后又经过数周时间对TDD工作流进行了熟悉,他准备好了对采用TDD进行工作前后的情况进行评估和对比。

Neil对使用TDD前后的结果进行了基准测试,他发现当使用TDD的SVUnit框架时,他的测试代码只出现了1个Bug;而在使用传统SoC验证方法的时候,会出现15个Bug。确实,这个结果只是基于一个项目数据样本,但依旧展现了令人惊讶的提升——特别考虑到Neil本人就是一位经验丰富的验证工程师,这一研发效能的提升就更为明显。

案例2: 敏捷 IC 开发——每个Sprint阶段都产出可用硬件

德州仪器(Texas Instruments)德国分部的一位数字设计总监,对使用Scrum加速定制化IC(用于闪存和铁电存储器FRAM)的交付非常感兴趣。在当时,德州仪器的通常交付周期为12至36个月,对这种特殊用途的IC,其最短交付周期为18个月。但一个新客户对交付周期提出了更高的要求。德州仪器如何使用Scrum来加速IC开发呢?

在项目启动阶段,他们尝试寻找一位Scrum教练,但却根本找不到熟悉IC领域的人选。不过,他们依旧确信,至少可以将部分Scrum或敏捷实践引入到他们的硬件研发工作中。

最终,这支团队选择采用以下敏捷实践:

  • 跨职能团队

  • 4周迭代

  • 采用相对估算

  • 每周进行2至3次站会

  • 每个迭代周期都交付可用的硬件

  • 实施回顾

此时,关键的问题是,当芯片制造流程超过4周,而且并不在团队掌控之中的情况下,究竟如何在“每个迭代”将可用的硬件交付给客户?除此之外,上述的其它敏捷实践则能非常容易地运用到硬件工作中。

要想以增量方式工作,可以采用的一个方法,是交付经过编程的FPGA(现场可编程逻辑门阵列)——它们具有与完整IC内部的每个IP块非常相似的表现(一般来说,每个IP块的内部循环时间是6至12个月)。团队有能力逐个交付已经完成的FPGA,而且他们主动向客户建议采用这样的方法。不过,虽然这么做能够在一定程度上降低风险,但该外部客户依旧不希望不断被这些中间步骤打扰——他们只想看到完整的IC。

由于不能与外部客户进行共同迭代,数字设计团队找到了愿意配合的内部客户:团队可以向德州仪器内部的软件工程团队交付FPGA —— 其软件是在进行硅片制造前的最后一步。

接下来,数字设计团队开始逐月向软件工程团队交付其FPGA。通过使用可用硬件原型,而不是仅仅停留在设计阶段的方式,团队让Bug充分暴露。最终实现了“每个为期4周的Sprint完成一份可用硬件”的目标,尽管只是通过将FPGA硬件作为IP块原型的方式。由此,数字设计团队将循环开发时间从每个IP块“6至12个月”,降低为“每4周”。

那么,面向外部客户的交付周期时间是否也得到了优化?不幸的是,由于外部商业原因,这个项目在完成前就被终止了,因此我们无法通过数据来了解外部的交付周期被缩短了多少。

除了有效减少IP块的周期时间外,敏捷实践还带来了其它一些意义重大的好处。数字设计团队过去在工作流程中需要面对一套全新的平台,仅该平台极大增加了不确定性和复杂度。如果他们使用瀑布模型,意味着对前期工作规范化需要先投入为期12个月的精力。

领导数字设计团队的Tobias Leisgang发现,“规划扑克和相对大小估算,有助于工程师们快速找出沟通问题以及对范围的误解,同时也让整体工作更具有现实感,而不必经历为期数周的详细规划阶段。跨职能团队确保反馈回路得以缩短,我们不会遇到在制造出一块昂贵的硅片之后,测试工程师才发现模拟电路无法测试的情况。”

案例3: 基于原型电路板(PCB)的敏捷电子产品(Agile Electronics)

结合一些前期的规划,我们可以把迭代作为主要策略,特别是对于早期产品原型中的电路板和其它物理组件部分。施耐德电气(Schneider Electric)的一支跨职能团队开发了一套照明控制系统,他们在一个Sprint中,整合了3块电路板(PCB)和告警灯。

该团队的领导者Timo Punkka 4,介绍了他们的射频控制照明调光系统(RF-controlled light dimmer system)是如何在为期4周Sprint中演进的:

“开发团队由固件、电气、PCB布局和塑料方面的设计者组成。原型产品包括三块PCB板、一套电源、一套控制单元、一套UI以及射频转换器。在第一个迭代过程中,只有电源相关的PCB板就绪了,而其它两块PCB板则用通用原型板代替。在第二个迭代过程中,所有PCB板则均可用,到了Sprint结束的时候,用于塑料部分的快速原型也已到位。在Sprint回顾中,原型帮助我们体会到,如果我们选择了这一概念设计,那么产品外观的真实感受会是怎样。另外,固件提供了简单的开关功能。要想做到这一切,我们需要与原型制造商之间建立可靠的合作关系。在这个案例中,原型制造商同意,当按照先期约定的时间收到最终图稿后,就能够在次日交付制造好的硬件原型。

图 3. 为期 4 周的 Sprint 产出的调光系统原型。

这支团队使用负载弹簧连接器和磁铁,将每个模块连接到一起(类似Mac的电源连接器)以验证他们的想法。他们还试着将射频部分和天线构建在PCB尺寸的SD卡上。这两个实验,都涉及了大量的不确定性 ——最终这些硬件都能够运行,但没有人能够预先确保这一点。

对团队来说,这些实践的结果推动了实验的前进,结合其它一些敏捷实践的支持,使之成为一次具有前瞻性的尝试:

  • TDD确保他们能在早期就尝试测试并持续进行实验,而不会破坏早期设计决策。

  • 模块化让他们能够分离出需要进行更多实验的区域。

  • 仿真使得及早进行实验成为可能,从而规避了针对实际目标进行实验带来的高昂成本。

Timo观察到,“实验”或者说“涌现并逐步达成(Emergence)”,在敏捷思维中处于最核心的位置。它与“第一次就把事情做对”的思路截然相反。通过在一次Sprint中构建一份原型,让硬件、软件和需求能够以并行的步骤逐步实现。

案例4: 汽车行业的敏捷研发

Wikispeed项目为我们带来了一部可以合法上路的汽车,它由志愿者打造,且团队每周都会对它进行修订。现在,消费者们就可以购买Wikispeed汽车,而且它的百英里油耗为一加仑!面对“需要数年之久才能够将一部新车模型投放到市场”的传统理念,Wikispeed项目向其发起了挑战。Wikispeed汽车的研发仅仅耗时3个月,而且志愿者们持续构建和销售它。该项目的核心策略是模块化。得益于稳定的接口,他们每周都会修订8个模块中的一个或几个并进行快速集成。这要归功于他们采用的交错迭代的方法,它支持在每个模块中并行地进行实验和学习。

图 4. Wikispeed 汽车分解视图,展现了它的 8 个模块。

另一个关键策略是在材料类型和数量方面的简洁性:“XM(极限制造,eXtreme Manufacturing)的核心实践是只使用那些能够在不超过一周的时间里进行低成本迭代(重新制作)的材料,并确保在实际中采用的材料和工艺的类型都尽可能少,以快速积累丰富的经验。” 

Wikispeed团队的领导者是在西雅图工作的软件咨询顾问Joe Justice,这是一支由国际化志愿者组成的团队,他们使用敏捷技术来构建汽车。在2008年,Justice注意到Progressive Insurance X大奖的信息——这是一项奖金额度达到一千万美元的评选,旨在探寻是否有可能构建出油耗低至100MPG(英里/加仑)且符合道路安全规范要求的汽车。他参加了这一活动,并在博客上公布了自己的想法——于是一些读者加入了他的团队。

Joe感到非常吃惊:有如此多的人,愿意努力且免费地工作,只是为了构建一些以开源形式存在的东西,并且能够让所有人受益。目前,已经有23个国家中出现了Wikispeed商店。其汽车售价大约为两万五千美元;消费者也可以选择花费一万美元,从套件开始自己搭建它。

Joe从 Wikispeed团队中获得的第二个关键认知是人们的动机。他表示,与其他志愿者相比,Daniel Pink的思路在目标,精专,自主方面都更胜一筹。他们积极主动地相互学习,并保持对彼此的关注。

Wikispeed汽车由八个模块组成(引擎、车架、碳纤维车身等等)。得益于这些模块之间的松耦合关系,人们可以便捷地替换每一个部分。团队每周都会对八个模块中的一个或几个进行修正。并保证随时都有一部能够运转的Wikispeed汽车版本,同时还能够快速实现任何升级。那些已经拥有Wikispeed汽车的人们,则可以购入新的模块,并自己动手替换原来的对应部分,而无需拥有任何汽车领域的技术背景。

在Progressive Insurance X大奖的竞赛中,Wikispeed在核心组别获得了并列第十名的位置,将超过一百款来自全球各地、得到了企业和大学的充裕资金支持的汽车甩在了身后。

Wikispeed团队在运用“极限制造(XM)”过程中积累的经验,反映了这样一个现象:Joe Justice和团队中的许多志愿者都具有敏捷软件开发的背景,他们把这一方向的背景知识引入到了 XM 中。当被问起在制造和工程领域运用敏捷方法的过程中,学到了哪些东西时,Joe的回答是:

“当我开始与Jeff Sutherland一起进行共同教学的时候,我建议工程师们使用面向对象的架构、契约优先的设计以及测试驱动开发(TDD)。我所学到的第一个要点:Jeff告诉我,我需要在工程领域打造这些理念——对软件人士而言,这些都是显而易见的知识,但对工程师而言则必须经过“翻译“才能够掌握。”

对于进行极限制造(XM):

第一步,也即是第一个Sprint,将产品或服务划分为10个以内的松耦合模块。

第二步,明确面向对象架构、每个模块的输入输出、这些模块在物理上或通过数据如何互相联结、以及冷却等等方面的内容;但要注意,这个阶段应避免涉及任何模块内部的设计或架构。此时应只关注模块之间的接口。

第三步,通过以团队方式对每个模块进行版本搭建和重建,进行迭代;同时以增量的方式从实践中学习。一旦他们开始进行概念验证工作,就会在每个模块中增加“illities(对非功能性需求的功能响应)”,就像持久性、可承受性等等。

大部分工程师团队都会遇到这样一个经典问题:他们希望提前做好全部架构工作——所有的接口及“盒子”(box,接口背后的子系统)中的全部内在。然而,这将增加巨大的前置时间并造成大量浪费。

还有部分团队希望甩开架构直接投入到具体工作中。这种方式起步固然迅速,但很快就会放缓节奏。

人们很少采用优化的方式:预先进行架构设计,但只细化到接口层面,接下来停止架构工作,通过实践并构建“盒子”内部来学习。这似乎是产出可交付产品的最快方式,而且它能够保证持续的速度。

在一款复杂的物理产品中,最好综合运用一些迭代和并行方法。当工作性质中具有“探索部分”的时候,这一点尤为有用。以Wikispeed汽车为例,它的各个模块并行开发,错落添加各项变更,因此这些模块不会同时发生故障。这确保了团队每周都能够交付可用的软硬件。

总结

我们刚才已经见证了一些硬件开发过程中使用的经典技术:

  • 仿真或原型设计(IC开发领域与电子产品)

  • 模块化(电子产品与Wikispeed汽车)

  • 简洁性的成分(Wikispeed汽车)

我们还看到了一些直接从敏捷软件实践中借鉴的内容:

  • TDD(ASIC验证)

  • 短迭代(IC开发、电子产品、Wikispeed汽车)

  • 面向对象设计(Wikispeed汽车)

长期以来,硬件领域一直向着更具灵活性的方向不断前进。部分硬件现已支持非常迅捷的变更,取代提前进行完整规划,即可让良好设计逐步涌现成为可能。如果这种灵活性水平尚不存在,我们自然会结合使用模拟、模块化和预先规划。过早锁定设计,是极具风险的策略,而综合运用这些技术则能够减轻这些风险。

这里还引出了另一个强大的缓解策略——众包(Crowdsourcing,或者称之为:调动团队的集体智慧)能够在一些关键的敏捷实践中发挥作用,例如回顾、结对编程、每日站会、故事头脑风暴等等在任何一支运行良好的敏捷团队中,集体智慧都能够发挥强大的作用。

没错!要想在采用短迭代方式的同时,还保证每次迭代都能产出可用硬件,是一件困难的事情。不过,我们刚才讨论了一些有助于团队落实这一方式的策略:

  • 经典的硬件开发技术,例如仿真和模块化,能够极大提高灵活性和开发速度。

  • 可以将诸如TDD和短迭代等敏捷软件实践,引入硬件开发工作中,从而加速实验和学习的过程。

  • 有时候我们需要超越项目要求的范围(例如,在一个月内完成ASIC)去看问题,并满足客户(或是内部客户)更大的需求。激发团队智慧将帮助我们获得达成目标所需的创造力。

借助我们手中的这些“思维工具”,硬件绝对可以变得“敏捷”。

作者:Nancy Van Schooenderwoert

译者:Hendry Qi齐欢

审核:Jim Wang王军

作者介绍

Nancy Van Schooenderwoert

President and Principal Coach at Lean-Agile Partners, Inc.

Nancy Van Schooenderwoert是最早将敏捷方法应用于嵌入式系统开发的领军人物之一,她曾担任电子、固件和软件工程师、经理和顾问。她在苛求安全、高度监管的行业中引领了软件开发的敏捷变革活动,并教授现代敏捷方法,如Mob编程、敏捷硬件和精益开发方法。她曾在美国、英国和德国指导过敏捷团队。她是全球敏捷相关会议的定期演讲者。她是大波士顿地区首屈一指的敏捷用户组Agile New England的创始人和前任总裁。

致谢

本篇译文来自ShineScrum捷行译社的齐欢老师翻译,Jim老师审核,如有转载请联系ShineScrum捷行工作人员,未经许可不得私自转载。

Hendry Qi齐欢

生命科学领域研发工程师/大学讲师

专业认证:CSP-SM, A-CSM, CSM, PMP, PMI-PBA, PMI-ACP, CxCE和CAL E+T+O认证。

Jim Wang王军

国际Scrum联盟认证培训师CST、Path to CSP Educator、LCP、LeSS-friendly Scrum Trainer、MBA、敏捷软硬件开发专家

原文链接:https://www.infoq.com/articles/hardware-can-be-agile/

参考资料:

1. Johnson,Neil;测试驱动与硬件验证的新范式(TDD and A New Paradigm for Hardware Verification);Agile 2014 大会,可前往以下网址阅读:http://www.AgileSOC.com

2. Leisgang,Tobias;如何与足球队一道打篮球(How to Play Basketball With a Soccer Team,论文);Agile 2012 大会

3. Tobias Leisgang,德州仪器德国慕尼黑分公司系统工程经理;由作者进行采访。

4. Punkka,Timo:嵌入式敏捷(Embedded Agile,论文);发表于 2010 年嵌入式系统大会

5. http://wikispeed.org/category/wikispeed_shop_manufacturing/

6. Denning,Steve,Wikispeed:如何在三个月内开发一部 100MPG 汽车(Wikispeed: How a 100 mpg Car Was Developed in 3 Months);福布斯杂志 20125 月,可前往以下网址阅读 http://www.forbes.com/sites/stevedenning/2012/05/10/wikispeed-how-a-100-mpg-car-was-developed-in-3-months/ 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统日志- Journal and Rsyslog

Log文件 Rsyslog 的配置文件/etc/rsyslog.conf Rsyslog的旧的信息会在最前面,新的信息会在最下面。 tail -f /var/log/messages #可以动态监控日志信息logger 发送日志信息 logger -p user.notice #“内容” -p选项测试实验: 1.在/etc/rsyslog.d/文…

基于ThinkPHP框架开发的全套家政服务小程序源码(带调试视频)

家政服务小程序源码 在线派单 商家入驻 多城市带积分开源小程序 了解更多内容可私信我。 1、独立版 ThinkPHP框架 后端全开源; 2. 开发语言:PHP; 3. 数据库:MySQL; 4.小程序端:Uniapp; 5.…

Vuex基础概念用法(新手入门)

一.Vuex概念及解释 定义: vue全局状态管理器。有了Vuex在任意组件/页面都可以访问vuex数据,当数据更新的时候,引用vuex的组件视图会自动更新。也就是说Vuex实现数据全局共享,响应式更新。 1.state(存放状态) $store…

《flask》flask+mqtt联动快速上手

简介 本文旨在介绍如何快速上手联动flask mqtt,本文将会给出一个简单的demo,用于演示在如何通过访问flask接口来触发mqtt,并在flask运行的基础的上对mqtt进行订阅。 快速上手 因为有项目需求,所以需要flask mqtt进行联动&…

Docker网络中篇-docker网络的四种类型

通过上一篇学习,我们对docker网络有了初步的了解。本篇,咱们就来实战docker网络。 docker网络实战 实战docker网络,我们将从以下几个案例来讲解 1:birdge是什么? 2:host 3:none 4:container 实战网络类型如下: 在docker中,网络的配置是以json格式存在的,下面…

知识变现创业者必读——《知识变现实操手册》

现在越来越多人,正在跑步进入知识变现创业这个赛道。 为什么进入这个赛道,因为能赚钱钱啊,大部分人是受到了知识变现大咖们日入万元,月入十万,这些赚钱效益的刺激,匆忙进入的。 我问一句,你知识…

网络路由技术和协议

网络路由是网络通信的重要组成部分。路由可帮助您的网络组件从可用选项中选择最佳网络路径。这使得网络通信高效可靠。启用此功能的硬件组件称为路由器。监控和管理路由器是网络管理员日常工作中不可或缺的一部分。由于路由器可以决定网络连接和可用性的成败,因此了…

MATLAB-plot绘图函数

plot函数是MATLAB中最核心的二维绘图函数,它有多种语法格式可以实现多种功能。 plot函数的基本调用格式如下。 plot(y) 当y为向量时,是以y的分量为纵坐标、元素序号为横坐标,用直线依次连接数据点, 绘制曲线。若y为实矩阵&#…

【技术分享】如何实现功能完备性能优异的RTMP、RTSP播放器?

技术背景 这几年,我们对接了太多有RTSP或RTMP直播播放器诉求的开发者,他们当中除了寻求完整的解决方案的,还有些是技术探讨,希望能借鉴我们播放端的开发思路或功能特性,完善自己的产品。 忙里偷闲,今天我…

【GO】K8s 管理系统项目[API部分--Pv]

K8s 管理系统项目[API部分–Pv] 1. 接口实现 service/dataselector.go type pvCell corev1.PersistentVolumefunc(p pvCell) GetCreation() time.Time {return p.CreationTimestamp.Time }func(p pvCell) GetName() string {return p.Name }2. Pv功能 service/pv.go 2.1 获…

沙龙预告|2023 年展望 Web3 Crypto

全长 621 字,预计阅读 3 分钟 作者:MiX 起起落落的2022年即将结束,随着传统金融机构的采用和 Web3 创新的不断深入,加密领域已经成为全球资本和技术创新的重要组成部分。 总结2022,展望2023,这对每一位加…

【数据库与缓存保持一致性】

文章目录1. 方案1先更新数据库,再更新缓存先更新缓存,在更新数据库2. 方案2先更新数据库,在删缓存先删缓存,在更新数据库3. 方案3—如何保证两个操作都能执行成功?重试机制订阅 MySQL binlog1. 方案1 先更新数据库&am…

S7-1200PLC与组态王进行TCP通信的基本方法和步骤

S7-1200PLC与组态王进行TCP通信的基本方法和步骤 如下图所示,打开博途软件,新建一个项目,设置该PLC的IP地址为:192.168.1.102, 如下图所示,在OB1中编写一段简单的启保停程序, 如下图所示,打开Kingview组态王软件,点击文件—新建工程, 新建一个项目,如下图所示…

化工企业安全风险管控数字化解决方案

当前我国化工行业的基础能力缺失问题非常严重。由于一些共性技术的缺失,给以化工行业为代表的关键基础工业的产业安全带来诸多隐患。粗放式发展 带来的环保安全问题,不仅造成了巨大的资源浪费和社会成本的增加,同 时也使整个产业的发展环境恶…

SpringBoot+Vue前后端分离项目搭建

好久没写文章了!!! 企业级项目,开袋即食。扩展、修改起来非常方便 系统基本功能 用户管理:提供用户的相关配置,新增用户后,默认密码为:Pass_123角色管理:对权限与菜单…

基于注解的AOP之切入点表达式的语法和获取连接点的信息以及切入点表达式的重用

基于注解的AOP之切入点表达式的语法和获取连接点的信息以及切入点表达式的重用 1.切入点表达式的语法 ①作用 ②语法细节 用*号代替“权限修饰符”和“返回值”部分表示“权限修饰符”和“返回值”不限 在包名的部分,一个“*”号只能代表包的层次结构中的一层&…

Vue3+TS+Vant3——增删改input和通过双页面进行增删改操作

Vue3TSVant3——增删改input和通过双页面进行增删改操作 两种方案: 第一种点击添加按钮添加一项,缺点:页面过于臃肿,用户体验较差 第二种:分成两种页面进行添加等操作 先说一下第一种,我这里用到了va…

Linux下Qt程序用qBreakpad定位崩溃位置

目录1. 使用qBreakpad1.1. 下载1.2. 编译1.3. 使用2. 使用dump文件2.1. 编译breakpad2.2. 解析dmp文件生成sym文件2.3. 解析dmp可能遇到的问题问题一Qt程序的release版本交付给用户或者测试后,如果出现崩溃,很多时候都比较难重现,如果程序能自…

赛卓电子冲刺科创板上市:计划募资11亿元,股东包括尚颀资本等

12月28日,赛卓电子科技(上海)股份有限公司(下称“赛卓电子”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,赛卓电子计划募资11亿元,将用于车规级芯片研发及产业化项…

高级网络复习——防火墙,OSPF协议,rip协议,三层,DHCP中继知识题解(带答案)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 简答题 二.选择题 前言 本章讲解讲解防火墙,OSPF协…