当前位置: 首页 > news >正文

【成为架构师课程系列】怎样进行概念架构(Conceptual Architecture)?

目录

前言

什么是概念架构

概念架构阶段的3个步骤

 初步设计

高层分割

分层式概念服务架构

Layer:逻辑层 

Tier: 物理层

按通用性分层

技术堆叠

考虑非功能需求

【禅与计算机程序设计艺术:更多阅读】


前言

胜兵先胜而后求战,败兵先站而后求胜。 -- 孙子,《孙子兵法 . 形篇》

人们常常使用战术,而忽略了战略。战略要求从大局上把握整个架构与设计......架构错误的代价非常高。 -- Stephane Faroult, 《SQL语言艺术》

架构新手和有经验的架构师的区别之一,在于是否懂得,并能有效的进行概念架构设计作为架构新手,尤其害怕碰到自己没有做过的系统:系统较大时,一点祭出“架构 = 模块 + 接口”的发布却不太奏效,架构新手就往往乱了阵脚。

有经验的架构师不会一上来就关注与如何定义“接口”,他们在大型架构设计的早期,比较注重识别重大需求特色需求高风险需求(抓重点关键问题),据此来设计概念架构。

另外,概念架构设计还是投标及售后工作的有力武器。金牌售前和普通售前的一个重要区别是,能否清晰的讲解概念架构,并借此说明 “客户关系的价值如何实现、担心的问题如何解决”

”Use Case驱动“的观点既有积极意义,也有不利影响。从积极的方面看,Use Case这种需求描述方式确实有助于分析模型,设计模型,实现模型和测试模型的建立.....但是从另一方面看,OOSE对Use Case的依赖程度超出了它的实际能力。 -- 邵伟忠, 《面向对象的系统设计》

顶级设计者在设计中并不是按部就班地采用自顶向下(或自底向上)的方法,而是着眼于权重更大的目标。这些目标通常是难点问题,设计者不能轻易地看出这些问题的解决方案。为了得到整个的设计方案,设计者必须先致力于难点的设计并消除其中的疑惑。 -- Robert L. Glass, 《软件工程的事实与谬误》

概念架构是大型系统架构设计成败的关键。

什么是概念架构

下面是宏伟的金门大桥,这么复杂的架构,桥梁架构师是怎么“开始设计”的呢?

 

答案是:概念架构(Conceptual Architecture)。下图展示了斜拉桥的概念架构示意图。由此图可以看出,概念架构高屋建瓴的给出高层解决方案:索塔负责承重,斜拉索吊起刚性梁。

 

下面,来看看软件行业(来自Dana Bredemeyer等专家)中概念架构的定义:

概念性架构界定系统的高层组件,以及它们之间的关系。概念性架构意在对系统进行适当分解,而不陷入细节。借此,可以与管理人员、市场人员、用户等非技术人员交流架构。概念性架构规定了每个组件的非正规约及架构图,但不涉及接口细节。(The Conceptual Architecture identifies the high-level components of the system, and the relatiooonships among them. Its purpose is to direct attention at an appropriate decomposition of the system without delving into details. Moreover, it proovides a useful vehicle for coommunicating the architecture to non-technical audiences, such as management, marketing, and users. It consists oof the Architecutre Diagram (without interface detail) and an informal component specification for each component.)

根据定义,我们注意到如下几点:

  • 概念架构满足“架构 = 组件 + 交互”的基本定义,只不过概念架构仅关注高层组件(high-level components)。
  • 概念架构对高层组件的“职责”进行笼统的界定(informal specification),并给出了高层组件之间的相互关系(Architecture Diagram)。
  • 概念架构不应涉及接口细节(withouot iinterface detaiil)。

概念架构阶段的3个步骤

概念架构设计分为3个步骤:

  1. 初步设计:基于关键功能,借助鲁棒图进行以发现职责为目的的初步设计。这一步并不总是需要,但对于架构师而言,是“新系统”就必须重视这一步。
  2. 高层分割:对系统这个黑盒子进行高层切分,例如切分复杂系统为多个二级系统,或者直接切分系统为具体子系统。
  3. 考虑非功能需求概念架构 ≠ 理想化架构,所以不仅要考虑功能,也必须考虑非功能。

 初步设计

好的开始是成功的一半。 -- 谚语

所谓鲁棒性分析时这样一种方法: 通过分析用例规约中的事件流,识别出实现用例规定的功能所需要的主要对象及其职责,形成以职责模型为主的初步设计 -- 温昱,《软件架构设计》

Conceptual Architecture阶段包含3个步骤:

  • 第1步,初步设计。
  • 第2步,高层分割。
  • 第3步,考虑非功能需求。

 

高层分割

复杂性是层次化的。 -- Frederick.P.Brooks,《人月神话》

分析与综合是思维方向相反的过程。一部是先分析后综合,没有分析就不能综合;没有综合的分析,也只有片面的分析。 -- 肖纪美,《梳理人、事、物的纠纷:问题分析方法》

“架构 = 模块 + 接口”的做法,其不足可概括为两点。

第一,忽视了多视图。“模块 + 接口”仅是逻辑架构设计视图的核心内容,而软件系统的架构设计还可能涉及开发视图、运行视图、物理视图、数据视图等多方面的考虑。

第二,忽略了概念架构设计。对规模较大的系统而言,都必须先根据重大风险(包含功能方面、质量方面、约束方面),有针对性的制定包括“高层分割”在内的设计决策,然后才是“模块 + 接口”一级的设计。

那么,如何对软件系统进行“高层分割”呢?这属于Conceptual Architecture阶段第2步的工作。

例子:PM系统的高层分割,采用了经典的4层架构方式。

 

分层式概念服务架构

人们常说,“分层式最流行的架构模式”。从字面上理解,这似乎意味着大家所进行的“分层”在思想层面上是一致的。但事实并非如此。在实践中,分层有不同的角度,并且互不矛盾。通常会总结为“3 + 1”流派。

  • Layer:逻辑层
  • Tier:物理层
  • 按通用性分层
  • 技术堆叠

Layer:逻辑层 

逻辑层(Layer)重视职责的划分,职责之间常常是上层使用下层的关系--但是根本不关心上层和下层是否“能分布”在不同机器上。

 

图片来源:Layered Business Architectures: Logical Structures

  • 图中的Services层对下层Domain Model部分的访问,是一种跨机器的远程访问吗?

答案是:不知道,也不关心。整个架构图中的箭头表示的是逻辑上服务使用关系,而对物理角度是否是跨机器的访问方式并不关心。

Layer分层 ≠ 按Tier分层。

  • 图中的User InterfaceServicesDomain ModelPersistent Data是通用性逐渐增加吗?(”通用性越大,所处层次就越靠下“是按通用性分层的常见方式。)

答案是:无法确定那一层更通用。例如,作为最下层的Persistent Data层本来支持硬盘,但后来要支持磁盘阵列,再后来要支持SAN(存储区域网络),这都要求存Persistent Data层要有针对性的进行改变。

Layer分层 ≠ 按通用性分层。

Tier: 物理层

物理层(Tier)指”能分布“在不同机器上的软件单元,不同的物理层之间必须有跨机器访问的能力--可以通过远程调用、或通讯协议等方式。

 

图片来源:Oracle Application Server Containers for J2EE

关于Tier这种分层方式, 最需要强调的是,几层(Tier)架构是看”能分布“的能力,不是看”实际部署情况“。

我们常说的Java EE应该是N-Layer的,因为从逻辑上来看,Java EE里面有表现层、业务逻辑层和数据持久层。从物理上而言,这3层可以在不同的Tier上(表现层在PC上,业务逻辑层在应用服务器上,数据持久层在数据库服务器上),也可以在一个Tier上,比如Martin说过,如果把数据库、应用服务器和浏览器都装在一台电脑上,那么3-layer就在1-tier上了。

这段话问题不小。

毕竟,”N-Tiers架构“的一大好处是可伸缩性--业务量小的时候将NTier都部署在同一台机器上 ,等业务量大的时候再为每个Tier单独安排一台或一组机器,这恰恰是"N-Tiers架构"的目标!所以,一个系统如果架构设计时是”4-Tiers架构“的,并且开发时也实现了这一点,那么把它们部署在同一台机器上并没有改变”4-Tiers架构“。最终,工程师的实际部署方案觉得了系统是几层(Tier)架构,这未免荒唐。

其实,总结出”3级“映射关系(而不是”两级“)就清楚了:

逻辑层Layer -> 物理层Tier -> 一台或一组计算机

关于按Tier分层 ,再看一例:微软的Azure虚拟网络系统,很明确的进行了不同的tier的划分,各层之间必然是能以进行跨机器方式的协议互相通讯的(只不过每个Tier的部署规模比较大罢了)。

图片来源:Azure中具有Apache Cassandra的Linux多層式架構 (N-tier) 應用程式

按通用性分层

严格来讲,按通用性分层是另一种Layer,但是,绝对有必要让它”独立门户“以引起实践者的足够重视。

按通用性分层式只:将通用性不同的部分划归不同的层,以此作为系统的总体切分方式。

一般而言,通用程度越大,所处层次就越靠下。

 

不同,嵌入式系统的分层架构有所不同:通用性最强的层位于中间,硬件相关的部分,以及应用特点部分分布位于下层和上层。

 

这种“中间通用、上下专用”的分层方式对可移植性关键的通信系统、控制系统、软件平台等情况都非常重要。

技术堆叠

技术堆叠不是独立的架构,而是基于分层架构(或其他架构模式)提供的进一步说明。

下面这个两个架构模式都是按Tier分层,并明确了各个技术点。

图片来源:I Love the Java Jive: J2EE for Oracle Technologists

图片来源:Category Archives: Day 15. Understanding J2EE Architecture

另一个例子,基本架构模式是基于通用性分层的,也加入技术堆叠的描述。

图片来源:Java SpringMVC

考虑非功能需求

架构不仅仅是系统功能需求的结果 -- Len Bass, 《软件架构实践(第二版)》

在我们当中,有不少人一厢情愿的认为:只要所开发出的系统完成了用户期待的功能,项目就算成功了,但这并不符合实际。 -- 温昱,《软件架构设计》

《软件架构设计》一书中指出,“其实任何作为复合整体的复杂事物,都有可能有架构,比如一本书”。“非功能目标的考虑”在ADMEMS方法中不是一个阶段,而是一个贯穿环节。

我们接下来讨论的重点是贯穿案例 -- PASS系统概念架构设计的第3步,考虑非功能需求。

概念架构 ≠ 理想化架构

  • 重大需求塑造概念架构。这里的 “重大需求”应涵盖功能需求、质量及约束3类需求中的关键部分
  • 概念架构是一个“架构设计阶段”,必须在细化架构设计阶段之前,针对重大需求、特色需求、高风险需求,形成稳定的高层架构设计成果
  • 如果只考虑“功能需求”来设计概念架构,将导致概念架构沦为“理想化架构”,这个脆弱的架构不久就会面临“大改”的压力,甚至直接导致投标等工作失败。


【禅与计算机程序设计艺术:更多阅读】

  1. 2023,程序员的出路在哪里?_禅与计算机程序设计艺术的博客-CSDN博客_程序员出路
  2. 写给新手程序员的一封信_禅与计算机程序设计艺术的博客-CSDN博客 
  3. 程序员职业生涯系列:关于技术能力的思考与总结_禅与计算机程序设计艺术的博客-CSDN博客
  4. 【思维模型】概率思维的价值:找到你的人生算法,实现阶级跃迁!_禅与计算机程序设计艺术的博客-CSDN博客
  5. 【企业架构设计实战】业务架构设计_禅与计算机程序设计艺术的博客-CSDN博客
  6. 【企业架构设计实战】技术架构设计指南_禅与计算机程序设计艺术的博客-CSDN博客
  7. 【企业架构设计实战】应用架构设计_禅与计算机程序设计艺术的博客-CSDN博客 
  8. 【企业架构设计实战】大数据架构最佳实践_禅与计算机程序设计艺术的博客-CSDN博客
  9. 软件架构师的10项重要技能_禅与计算机程序设计艺术的博客-CSDN博客
  10. 【计算机程序设计思想与方法】1 什么是计算?_禅与计算机程序设计艺术的博客-CSDN博客
  11. 【计算机程序设计思想与方法】2 什么是计算思维?_禅与计算机程序设计艺术的博客-CSDN博客
  12. 【架构师必知必会系列】系统架构设计需要知道的5大精要(5 System Design fundamentals)..._禅与计算机程序设计艺术的博客-CSDN博客
  13. 【成为架构师课程系列】架构师的核心能力地图_禅与计算机程序设计艺术的博客-CSDN博客
  14. 【成为架构师课程系列】一线架构师:6个经典困惑及其解法_禅与计算机程序设计艺术的博客-CSDN博客
  15.  【成为架构师课程系列】怎样进行高性能高可用的高并发系统的设计?_禅与计算机程序设计艺术的博客-CSDN博客
  16.  【成为架构师课程系列】高并发系统设计的三大目标:高性能、高可用、可扩展_禅与计算机程序设计艺术的博客-CSDN博客
  17.  【成为架构师课程系列】消息队列:秒杀时如何处理每秒上万次的下单请求?_禅与计算机程序设计艺术的博客-CSDN博客【成为架构师课程系列】架构分层:我们为什么一定要这么做?_禅与计算机程序设计艺术的博客-CSDN博客
  18.  【成为架构师课程系列】架构设计中的核心思维方法_禅与计算机程序设计艺术的博客-CSDN博客
  19. 【成为架构师课程系列】数据库优化方案 1:查询请求增加时,如何做主从分离?_禅与计算机程序设计艺术的博客-CSDN博客 
  20. 【成为架构师课程系列】数据库性能优化:写入数据量增加时,如何实现分库分表?如何保证分库分表后 ID 的全局唯一性?_禅与计算机程序设计艺术的博客-CSDN博客 【成为架构师课程系列】性能优化技术之“池化技术”:如何减少频繁创建数据库连接的性能损耗?_禅与计算机程序设计艺术的博客-CSDN博客
  21.  【成为架构师课程系列】高性能系统设计之分布式缓存_禅与计算机程序设计艺术的博客-CSDN博客
  22. 【成为架构师课程系列】NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?_禅与计算机程序设计艺术的博客-CSDN博客 
  23. 【成为架构师课程系列】大数据技术体系精华总结【值得收藏!】_禅与计算机程序设计艺术的博客-CSDN博客 
  24. 【软件架构思想系列】模块化与抽象_禅与计算机程序设计艺术的博客-CSDN博客 
  25. 【软件架构思想系列】从伟人《矛盾论》中悟到的软件架构思想真谛:“对象”即事物,“函数”即运动变化..._禅与计算机程序设计艺术的博客-CSDN博客 
  26.  【软件架构思想系列】分层架构_禅与计算机程序设计艺术的博客-CSDN博客
  27. 软件架构图和模式_禅与计算机程序设计艺术的博客-CSDN博客 
  28. 一切系统都是分布式的:Everything is distributed_禅与计算机程序设计艺术的博客-CSDN博客 
  29. 《人月神话》(The Mythical Man-Month)看清问题的本质:如果我们想解决问题,就必须试图先去理解它..._禅与计算机程序设计艺术的博客-CSDN博客 
  30. 【模型↔关系思考法】如何在一个全新的、陌生的领域快速成为专家?模仿 + 一万小时定律 + 创新..._禅与计算机程序设计艺术的博客-CSDN博客 
  31. BloomFilter 布隆过滤器思想原理和代码实现_禅与计算机程序设计艺术的博客-CSDN博客 
  32.  每个程序员都需要掌握的 7 项基本技能_禅与计算机程序设计艺术的博客-CSDN博客
  33. 我问 ChatGPT:怎样成为优秀的架构师?看它怎么回答的……_禅与计算机程序设计艺术的博客-CSDN博客 
  34. 彻底搞懂分布式系统服务注册与发现原理_禅与计算机程序设计艺术的博客-CSDN博客 
  35. Elasticsearch 架构设计及说明_禅与计算机程序设计艺术的博客-CSDN博客_elasticsearch 架构设计
  36. Elasticsearch 数据的读写流程,掌握到这个程度就够用了_禅与计算机程序设计艺术的博客-CSDN博客
  37. 【成为架构师课程系列】作为一名大数据架构师该掌握的技能清单:_禅与计算机程序设计艺术的博客-CSDN博客 ​​​​​​数据思维:开启数据认知素养之旅_禅与计算机程序设计艺术的博客-CSDN博客
  38. MySQL 体系架构简介_禅与计算机程序设计艺术的博客-CSDN博客
  39. 通用大数据架构体系介绍_禅与计算机程序设计艺术的博客-CSDN博客 
  40. HBase系统架构及数据结构_禅与计算机程序设计艺术的博客-CSDN博客
  41. HBase 架构原理-数据读取流程解析_禅与计算机程序设计艺术的博客-CSDN博客 
  42. HBase 架构详解及数据读写流程_禅与计算机程序设计艺术的博客-CSDN博客 
  43. HBase架构详解及读写流程_禅与计算机程序设计艺术的博客-CSDN博客 
  44. 【图文详解】HDFS 系统架构与文件数据读写流程_禅与计算机程序设计艺术的博客-CSDN博客 
  45. Apache Flink 实现原理:容错机制_禅与计算机程序设计艺术的博客-CSDN博客 
  46. Elasticsearch 索引原理_禅与计算机程序设计艺术的博客-CSDN博客
  47. Spark / Hive / ClickHouse 向量化查询执行原理分析(Vectorization Query Execution)_禅与计算机程序设计艺术的博客-CSDN博客 
  48. Hive常用DDL(数据定义语言)操作_禅与计算机程序设计艺术的博客-CSDN博客 
  49. MySQL 的执行计划 explain 详解_禅与计算机程序设计艺术的博客-CSDN博客
  50. MySQL 存储引擎 - InnoDB 实现原理介绍_禅与计算机程序设计艺术的博客-CSDN博客 
  51. 【史上最全】MySQL各种锁详解:一文搞懂MySQL的各种锁_禅与计算机程序设计艺术的博客-CSDN博客 
  52. 大数据存储引擎 NoSQL极简教程 An Introduction to Big Data: NoSQL_禅与计算机程序设计艺术的博客-CSDN博客 
  53. Redis 作者 Antirez 讲如何实现分布式锁?Redis 实现分布式锁天然的缺陷分析&Redis分布式锁的正确使用姿势!..._禅与计算机程序设计艺术的博客-CSDN博客 【架构师必知必会】常见的NoSQL数据库种类以及使用场景_禅与计算机程序设计艺术的博客-CSDN博客
  54. 【极简教程】Linux Shell 脚本编程_禅与计算机程序设计艺术的博客-CSDN博客 
  55. 业务驱动的企业级数据架构设计_禅与计算机程序设计艺术的博客-CSDN博客
  56. Hive 系统架构_禅与计算机程序设计艺术的博客-CSDN博客 
  57. 读多写少业务场景的缓存设计重构实战_禅与计算机程序设计艺术的博客-CSDN博客 
  58. 神奇的 Go 语言:Go 极简教程_禅与计算机程序设计艺术的博客-CSDN博客 
  59. 【精华文章】深入理解 Java 内存模型_禅与计算机程序设计艺术的博客-CSDN博客 
  60. 简洁代码的艺术【The Art of Clean Code】_禅与计算机程序设计艺术的博客-CSDN博客 
  61. 干净的代码——一种实用的方法_禅与计算机程序设计艺术的博客-CSDN博客 
  62. 清洁代码之道:一份实用关于如何编写和维护干净整洁的好代码的的方法 The Art Of Clean Code..._禅与计算机程序设计艺术的博客-CSDN博客 
  63. 更快地编写更好的代码:5 分钟阅读_禅与计算机程序设计艺术的博客-CSDN博客 
  64. ClickHouse 合并树表引擎 MergeTree 原理分析_禅与计算机程序设计艺术的博客-CSDN博客
  65. 【精华收藏】ClickHouse 系统架构、存储引擎、 查询引擎原理分析_禅与计算机程序设计艺术的博客-CSDN博客 ClickHouse 合并树表引擎 MergeTree 索引与数据存储方式_禅与计算机程序设计艺术的博客-CSDN博客
  66. 成为软件架构师需要什么?_禅与计算机程序设计艺术的博客-CSDN博客
  67. 产品经理(Product Manager)工作主要是做什么的?没想到产品经理也分这么多种类型!_禅与计算机程序设计艺术的博客-CSDN博客 
  68. 十年技术进阶路:让我明白了三件要事。关于如何做好技术 Team Leader?如何提升管理业务技术水平?(10000字长文)..._禅与计算机程序设计艺术的博客-CSDN博客
  69. 程序员技术练级攻略:Build Your Programming Technical Skills_禅与计算机程序设计艺术的博客-CSDN博客

相关文章:

【成为架构师课程系列】怎样进行概念架构(Conceptual Architecture)?

目录 前言 什么是概念架构 概念架构阶段的3个步骤 初步设计 高层分割 分层式概念服务架构 Layer:逻辑层 Tier: 物理层 按通用性分层 技术堆叠 考虑非功能需求 【禅与计算机程序设计艺术:更多阅读】 前言 胜兵先胜而后求战,败兵先站而后求胜。…...

PostgreSQL的下载安装教程(macOS、Windows)

postgresql是GIS服务端几乎不可避免要打交道的数据库。因为mysql的空间扩展真是不尽人意。所以想要学会GIS服务端知识,postgresql(下文简称pg)你是必须要会的。 首先要知道,pg是一个空间数据库,和普通数据库不同的是pg支持空间数据的存储与操作。这里所谓的空间数据一般指…...

98年的确实卷,公司新来的卷王,我们这帮老油条真干不过.....

都说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00后,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 …...

软件架构知识2-系统复杂度

架构设计的真正目的:是为了解决软件系统复杂度带来的问题,一个解决方案。 系统复杂度,如何入手: 1、通过熟悉和理解需求,识别系统复杂性所在的地方,然后针对这些复杂点进行架构设计。 2、架构设计并不是要…...

JavaSE学习day4_02 数组(超级重点)

3.数组 3.1什么是数组 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 3.2数组定义格式 3.2.1第一种(常用) 数据类型[] 数组名 示例: int[] arr; double[] arr; char[] arr; 3.2.2第二种(在…...

Theano教程:Python的内存管理

在写大型程序时候的一大挑战是如何保证最少的内存使用率。但是在Python中的内存管理是比较简单的。Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所占的内存就会被释放。理论上听起来很不错&am…...

Linux | Liunx安装Tomcat(Ubuntu版)

目录 一、下载并上传Tomcat压缩包到Ubuntu 1.1 下载并解压 1.2 执行 startup.sh 文件 二、验证Tomcat启动是否成功 2.1 查看启动日志 2.2 查看启动进程 三、Windows访问 Tomcat 服务 四、停止 Tomcat 服务 Tomcat是一款Web服务器,开发Web项目基本上都会用到…...

缓冲区浅析

缓冲区 程序运行输入数据时,从键盘的输入先存储到缓冲区,只有当缓冲区满或者输入回车时程序才会真正地从缓冲区读入数据 int main() {int a, b;cin >> a >> b;return 0; }in: 1 2\n 例如这里输入空格时程序没有输出,而是将空格…...

Day888.MySQL是怎么保证主备一致的 -MySQL实战

MySQL是怎么保证主备一致的 Hi,我是阿昌,今天学习记录的是关于MySQL是怎么保证主备一致的内容。 MySQL 能够成为现下最流行的开源数据库,binlog 功不可没。 在最开始,MySQL 是以容易学习和方便的高可用架构,被开发人…...

互联网舆情监测系统的发展阶段,TOOM互联网舆情监测系统有哪些?

互联网舆情监测系统是一种利用计算机技术对互联网上的大量信息进行实时监测、分析和评估的工具,旨在了解公众对某一事件、话题或品牌等的态度、情感倾向和影响力等。通过对社交媒体、论坛、新闻媒体等多个渠道的数据采集和处理,系统能够实现舆情事件的追…...

GIT命令操作大全

文章目录一、前言二、工作模块2.1 Workspace:工作区2.2 Index / Stage:暂存区2.3 Repository:本地仓库2.4Remote:远程仓库三、GIT基本配置四、GIT项目代码管理4.1 初始化git仓库4.2 提交到暂存区(stage)4.3 将暂存区的文件恢复到工…...

突破传统开发模式,亚马逊云科技助力中科院加速推动合成生物学

当数字技术成为整个社会运行的底座,生物科学也能借力云计算从诸多繁琐重复的工作中解放出来,专注于生物设计与创新。来看看亚马逊云科技如何与TIBCAS合作,推动合成生物学的发展。 明确核心需求,选择合作伙伴 TIBCAS选择与亚马逊…...

分享开放通达信l2接口的过程,开发之后怎么使用?

随着互联网的不断进步,信息技术的不断发展,通达信l2接口技术逐步成熟。那么,这些开放通达信l2接口开发的过程是怎么样的呢?期间又会遇到什么问题,开放之后又会怎么使用呢?这篇文章带你深入了解。 通达信l2接口不像一…...

33、基于51单片机老人防跌倒蜂鸣器报警系统加速度检测

背景技术 老年人出门由于身体不灵活、视力较差,容易发生跌倒,现用的老年人跌倒报警装置是通过无线对讲系统研发的,它外观精美,自动化程度高,有很强的专业性,但是,设计者忽略了一个问题&#xf…...

【项目】基于SpringBoot+Freemarker+Mybatis+MySQL+LayUI实现CRM智能办公系统

这里写目录标题CRM基本概念CRM分类模块功能描述项目代码application-dev.yml部分页面代码CRM基本概念 圈内存在这么一句话:“世上本来没有 CRM,大家的生意越来越难做了,才有了 CRM。” 在同质化竞争时代,顾客资产尤为重要&#x…...

手写识别字体的步骤是什么?怎么识别图片中的文字?

手写识别字体的步骤是什么?怎么识别图片中的文字? 1. 打开信风工具网,点击拍照按钮,选择拍图识字模式,对准需要识别的文件进行拍摄。在线工具地址: https://ocr.bytedance.zj.cn/image/ImageT…...

Mysql 存储过程

什么是存储过程? 存储过程是事先经过编译并存储在数据库的一段sql语句的集合 如何创建一个存储过程? create procedure 存储过程名称([参数列表]) beginsql语句; end#例 create procedure p1() beginselect * from t_goods;select * from t_user; end如…...

【LeetCode】每日一题(3)

目录 题目:1234. 替换子串得到平衡字符串 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:1234. 替换子串得到平衡…...

websocket学习

1.什么是websocket 1)首先websocket和http一样,是一种网络通信协议,来自HTML5的特性; 2)他可以使客户端和服务端进行双工通信,简单来说,就是双向通信:比如我们熟悉的http协议&…...

Java面试题及答案整理汇总(2023最新版)

前言 面试前还是很有必要针对性的刷一些题,很多朋友的实战能力很强,但是理论比较薄弱,面试前不做准备是很吃亏的。这里整理了很多面试常考的一些面试题,希望能帮助到你面试前的复习并且找到一个好的工作,也节省你在网…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

微服务通信安全:深入解析mTLS的原理与实践

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

手动给中文分词和 直接用神经网络RNN做有什么区别

手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动&#xff09…...

【题解-洛谷】P10480 可达性统计

题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...