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

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四:为什么要顺应技术的生命周期?

简介:包含模块一 架构师的六大生存法则-法则四:为什么要顺应技术的生命周期?&法则四:架构设计中怎么判断和利用技术趋势?

2024-08-29 17:30:07

你好,我是郭东白。今天我们来讲架构师的第四条生存法则,那就是尊重技术的生命周期。

人类的各种活动都要遵循事物的客观生命周期。不论是农业社会种田打渔,还是资本社会投资创业,行动太早或太晚,都会颗粒无收。技术也一样,也有自己的生命周期。而我们作为架构师,如果看不清技术的生命周期,那么所设计的架构就没法儿向更有生命力的新技术借力,自己的职业生涯也会受限。

那么我先来完整描述一下这条法则:在架构设计的过程中,架构师会有一个相对确定的商业和技术选择空间。在这个选择的空间内,架构师做技术选型的时候,必须要考虑到所依赖的商业和技术模块的生命周期。这个时候,我们就需要看准技术趋势,选择已经有规模优势或者是即将有规模优势的技术,而不是选择接近衰老期的技术。

我们先来讲讲,为什么有的人能够看准一个技术的生命周期, 而有些人却做不到。找到了根因,也就知道自己该怎么改变了。

把握时机

你有没有见过有的人年复一年辛苦劳作,却一无所成。而有些人似乎没怎么使劲儿,却能飞黄腾达。似乎大风总是吹向这个猪。你嫉妒地牙痒痒,心想,难道风就不能停下来,摔死这头猪?

你有没有想过,人家可能是会玩滑翔伞御风而行的猪啊!一个新的商业周期开始,就像是大风骤起,可以把一个看似不怎么努力的御风之人推向成功。事实上,如果从商业维度看,把握好周期远远要比努力工作更重要。

就像很多人职业不幸,是在五年前甚至是十年前犯下了致命错误。他们每天都在忙碌,来去匆匆,甚至都没有机会仰望星空。但就在恍惚之间,斗转星移,错过了一个大的商业和技术生命周期。结果是不论怎么努力,永远都慢这个时代半拍。

我也一样。我和身边许多做技术的同学,多数时间都在看小尺度的问题,日常工作和注意力都放在需求实现、领域建模、平台重构、中间件升级之上,因此我的思考也被这些工作所主导,很少去思考五年、十年,甚至二十年的技术趋势。我们不关注,当然也谈不上如何利用技术周期了。

技术的生命周期就像是潮水。潮来,汹涌澎湃,绵绵不绝。潮去,风平浪静,滩涂尽显。人一生的黄金岁月中也就是几个浪头而已。就过去40年而言,真正大的技术浪头有个人电脑、互联网、移动互联网、AI,差不多是每十年一个。你要在这种技术大浪潮之上玩好冲浪,就必须看清楚浪头,准确把握好技术方向和入场时机。如果错过,再等新的一个技术周期,几年的黄金岁月就浪费了。

所以在接下来两节课,我会给你讲讲怎么看清楚并利用好技术的生命周期。另外,我需要特别说明一下,我不认为自己真正看准过这些趋势。事实上,我也没能借到浪头的最大势。

我分析原因,是因为存在着三个人性上的弱点:

  1. 自我麻痹,以繁忙的重复工作来代替深度思考;

  2. 畏惧变化,以最小化改变来维持自己的心理安全感;

  3. 路径依赖,以过去的成功经历来应对未来案例。

我可能比大多数人幸运一点的地方在于,我很早意识到了自己有这些弱点,所以无时无刻都在提醒自己,去抗拒这些弱点。

那么接下来,我们先认真分析一下这三个弱点。只有克服了这些弱点,才有机会看清楚技术的生命周期,把握住新技术。

让我们放弃思考的三大弱点

弱点一:自我麻痹

自我麻痹是指我们用各种方法让自己放弃思考和探索的欲望。

其实大多数互联网从业者都是精英,从小到大都是学霸,内心不太能接受自己不思进取。但是人类进化出了一个自我保护机制,让我们不去天天担心风险。以至于我们常常会忽视自己现处环境的风险,导致我们不能全力探寻新的出路。于是我们会让自己每天都忙起来,用勤奋来弥补内心的不安。

团队和公司也是一样。尤其是一个营收压力特别大的公司,整个公司都忙着加班改代码,生怕老板看不到我们的勤奋。这个时候,没有人敢去挑战长期技术战略,也没有人关注新的颠覆性技术。

出现这种现象的根源,就在于高层管理者和软件架构师。有的管理者有意无意地把工作繁忙等同于有产出,于是让团队持续做毫无目标的布朗运动。其实麻痹自己越久,就越是难以突破。越没有突破,就越是没有去突破的勇气。这种恶性循环,让团队乃至整个部门,一年到头都没有实质性的进步。

我们只有承认和面对现在的风险,才有勇气放弃麻痹自己的行为,把部分注意力从当前技术放到更新、更有颠覆性的技术上去。而不是被动地等着他人告知自己下一步需求。

弱点二:畏惧改变

在讲马斯洛模型的时候就提到了,心理安全感的需求导致我们会畏惧改变,这是我们与生俱来的本性。

举个实际工作中的例子。前段时间有位技术人员给我分享他稳定性治理的经验,他描述了如何通过一个独立的运维团队,把一组很烂的微服务运维到接近五个九。我很诧异,他们直到现在竟然还在使用独立于研发的运维团队,来保障公司核心系统的稳定性。

后来追问细节才知道,这家公司连续几任CTO都没做过互联网高可用架构。因为这个核心服务是公司营收路径上最重要的一环,所以连续几个CTO都不敢大兴土木,从根本上解决这个服务的稳定性问题,而是通过运维的方式先顶着。这一顶,就是4年多!

畏惧改变,让这个团队从CTO到架构师,再到一线主管,都丧失了稳定性治理的勇气。直到现在,这家公司还在沿用几年前自研的微服务框架,而没有引入当下常见的Spring Framework,也没采用Service Mesh。从头到尾都是一套年久失修的老系统, 离开的人越多,懂的人越少,就越没有人敢改动。现在,公司只能靠大量的全职运维团队来续命,以至于风险稍大的发布,还是要运维团队来做。

其实我们都一样,一旦赌注足够大,就会产生畏惧。我们率先放弃了改变的勇气,跟着就会放弃改变的欲望。得过且过,离新的技术趋势越来越远。

弱点三:路径依赖

所谓路径依赖,就是你被过去的成功所蒙蔽了,以为过去的成功可以复刻。当过去的成功路径成了你唯一的选择,那么你也不会关注,更不会去探索新的路径了。

这就是我们儿时学习的守株待兔的故事。其实细想一下,守株待兔这件事再自然不过了。我们的大脑本来就是被不同事件训练出来的。哪天一个史诗级的训练样本发过来,正常人的神经元哪能扛得住?

还是举一个技术的案例。几年前有个同学转岗到我团队。他之前在一个大部门里做基础架构,曾经做过合并部署,就是把几个相关的微服务部署在同一台虚拟机,甚至是把几个微服务合并成一个巨石服务,然后部署在同一个JVM上。

这么做其实是个反模式,虽然会减少网络开销,提升性能,降低计算成本。但实质上,这个过程是用长期的运维和人力成本来替换机器成本。要知道,机器成本和网络带宽,在今天还基本符合摩尔定律。所以通过不断增加人力、维护和迁移成本,去替换每两年就减半的计算成本,这么做是不理智的。事实上,更大的成本是机会成本,这种巨石服务会增加升级改造的难度。也就是说,会让一个企业,很难快速响应新机会和新的竞争。

不过在他之前遇到的场景下,这样做的确可以带来实实在在的短期回报,所以他在之前的团队得到了很大的认可,也因此得到了晋升。同时,他也为自己的成就感到自豪。毕竟合并部署的技术难度非常大,因为越是调用量大的核心服务,代码往往越是年久失修、依赖复杂,jar包冲突解决起来就越棘手。所以就像多少有点儿特长的技术人一样,他也是拿着锤子到处找钉子。只不过,他更像是拿着雷神之锤。

但我所在部门的BU的计算量,远远低于他之前的大部门,峰值流量还不到他们的百分之一。这么一来,虽然开发成本一点儿没少,但做合并部署的回报却远远小于他之前的工作场景。

而这个时候,Kubernetes已经开始暂露头角。Kubernetes Pod 加Docker Image 就已经可以非常完美地解决合并部署能解决的大多数问题了。但这位同学,因为有了之前的成功经验,根本没有去探索合并部署之外的解决路径。结果他的项目进行到一半,大家意识到K8s才是更合理的解决方案,所以他的项目也就草草收场了。

这就是路径依赖。如果我们被某个史诗级的训练样本冲击过,都会过度相信自己过去成功或失败的经验。这会让我们看不到其他的技术可能,更别说新的技术趋势了。

如何克服弱点去把握技术趋势?

关于影响我们思考的三个人性弱点,到这里就讲完了。那么该怎么克服弱点,去把握技术趋势呢?

如何克服人性的弱点?

先分享一下我的办法。仍然有必要重申的是,我并不觉得这些办法好在哪里,但有必要分享我在克服这些弱点上所做的努力,就算是抛砖引玉了。

首先,日常工作中我也经常会麻痹自己。不过我跳出这个状态的办法就是,每年会留出两次深度忏悔的时间。一次是在春节后,一次是在我生日之后,正好间隔半年左右。在这两个时间点,我会放下当前所有事情,回想过去半年是不是做错了什么,有没有获得什么本质上的能力提升。没有提升的话,我会很沮丧。不过我心比较大,过两天就又恢复正常了。

但是半年后,如果发现自己还是同样沮丧,那么我就会琢磨,是不是要逼迫自己找个更有压力、更能成长的事情和环境了。

这就到了第二点,克服内心的恐惧,迎接变化。这一点我天生要比很多人好。虽然在变化来临的那一刻还是会有很大的恐惧,但与此同时,我又无时无刻不在期待着变化。不止在工作中,生活中也是一样。随性的探索和意外的惊喜,总会带给我更大的乐趣。如果说我不恐惧变化,那完全是胡扯。但我会用对获取惊喜的期待,来压制内心的恐惧,这个办法对我一直很有效。

路径依赖最难破。我记性还不错,表达能力也比较强,而且我也经历过很多波折。但到了后来带团队时,就发现这些特性看起来是优点,其实会放大我的路径依赖。

比如面对一个相对来说经验没那么丰富,表达能力没那么强的同事。我能够及时召回重点案例或个人经历,然后把逻辑准确表述出来。这个时候,我会更容易说服周围同事,导致我的建议更占上风。

这个问题在我刚开始做CTO时变得非常严重。因为大多数参会者是我的下属或同事。他们可能不愿意反驳我,甚至哪怕是我错了,也不一定会纠正我。

我意识到这种情况之后,就开始刻意让自己更关注那些想法独特,或者是经常挑战我观点的人。比如下属反对我的话,如果我们各自的逻辑都很严谨,仅仅是假设有所不同。那么我表达观点之后,就会强迫我放弃自己的立场。

这么做,一来可以防止我有路径依赖,二来也是为了培养下属,让他们有足够的决策空间和犯错空间。这样一来,他们不犯错,我就有成长。他们犯了错,他们自己就有了成长。两全其美,何乐而不为?事实上,在这个过程中,我发现了非常多优秀的人才。我相信他们中间有很多人的思考和成就必然会超越我。

假设没有这些弱点阻碍你探索技术趋势,那么我们就可以试图通过热度曲线来比较客观地分析技术趋势了。

如何通过热度曲线看技术生命周期?

如下图所示,是热度曲线(Gartner Hype Curve)。它是对新技术流行趋势的一个比较不错的建模。我们身边大多数技术的发展,其实都基本符合这个曲线。

如图所示,横轴是时间,竖轴是流行热度。发明者Gartner把一个技术的周期大致分为五个阶段,分别是:

  1. 萌芽期 (Technology Trigger) :指的是技术被公开,媒体热度陡然上升,还没有成型的产品和商业应用场景。

  2. 至捧期 (Peak of Inflated Expectations) :指的是有了一些成功案例,当然也有失败案例,技术被吹捧到了极致。

  3. 低谷期(Trough of Disillusionment):这个时候,热度回归到理性,失败案例被放大。如果产品不能让早期受众满意,那么技术就会在这个阶段消亡。

  4. 灵感期(Slope of Enlightment):产品逐渐找准在行业的价值定位,二代三代产品出现,产品逐渐出现理智的商业用户和成功案例。

  5. 产出期(Plateau of Productivity):在这个阶段产品被主流市场认可和采用。

其实我们身边大多数的技术,都活不到产出期。其实能活到至捧期的技术,也寥寥无几。Docker是一个非常符合Gartner曲线的经典案例。你要是有兴趣,可以读一下Docker从发家到膨胀,再到被群起打压,最后到一个相对稳定的定位的过程。这对你理解热度曲线会有极大的裨益。

其实Gartner的热度曲线不完全是原创。法国著名社会学家Gabriel Tarde最先描述了创新传播的渗透过程,也就是S-Curve。它的竖轴是“prevalence”,指一个创新的渗透程度。就像马斯洛的理论一样,Gabriel Tarde的S-Curve理论同样也是一个基本的理论,可以用来解释很多与创新相关的现象的传播,包括现代企业的生命周期。未来课程里,我们还会再次深入讨论这条曲线。

不过不论是S-Curve还是Hype Curve,它们都有一些缺陷,那就是没有对竞争技术的干扰做建模,所以这两条曲线都没有描述创新的衰老期。可以说,在产出期之后,技术还有两个状态:

  1. 衰老期(Progressive Aging):以该技术为基础的产品,已经逐渐开始被下一代的新技术所替代,产品的市场范围和利润逐渐被蚕食。

  2. 退出期(Fade Out):产品已经完全退出主流市场,仅仅在一些场景契合度与替换成本都非常高的情况下,还在被维护和使用。

那么我们从这两条曲线的描述中能得到什么结论呢?

结论就是:所有的技术都像人类的生命一样,也有终结的一天。这是个自然规律。

怎么从架构师的角度理解这句话呢?一个老去的技术就让他老去,快死的架构不值得投入人力和时间去维护,更不用说去翻修或者是复用了

我们在前面在讲马斯洛模型的时候就提到过,围绕一个旧架构体系的人的利益,已经和这个架构深度绑定,这就导致这个架构就像一个生命体一样,已经有自己非常强大的力量去延续它的生命。

举个例子。某个大厂,几年间连续三次搭建国际化底层架构。每一次都彻彻底底地失败了。而且每次失败,都跟旧的架构体系有关。

搭建国际化体系的方法有两种。一种是改造国内的系统,也就是我们常说的国内技术出海;另一种是重新构建一套系统。

大厂的架构本来已经非常老化了,处于技术生命周期的衰老期。甚至第一次出海的时候还是巨石架构,核心服务一周只能发布两次。最多的时候有同学发布几十遍都不成功。而发布不成功再等一周的情况也非常常见。

但这还不是核心问题,全球像中国这么大的单一市场就只有美国,而大多数国内企业也出海的第一站又不是美国。那么把全球第一大单一市场的技术架构,搬到一个百万或者千万人口的国家来运营,就一下子水土不服了。

如果从交易体量来算,哪怕是最大的国家,也不到中国的百分之一。百分之一是什么概念呢?你可以换算一下,这个基本上等于在你们家里修了一个有20个蹲位的公共卫生间。哪怕你家有那个面积,但你能维护得过来吗?

虽然大厂里也有反对的声音,但每次反对的声音都被压制了。因为大家不是不知道自己的系统不合适出海,而是谁都想从这个饕餮大餐里分一杯羹。哪怕自己的技术再老,那也要老当益壮,为公司捐躯。

我曾经反复思考过,怎样才能避免让一个老的技术和架构侵入到新的体系里来?硅谷达人Guy Kawasaki曾总结苹果公司Macintosh的成功,他认为关键就在于“低调加物理隔离”。我觉得这也应该是这个问题的答案。那就是把这种新的项目和公司其他部门分割开来。参与的人少一些,时间给宽裕一些,尽量远离公司的核心业务和人群。

我们也可以运用之前在尊重人性这个法则里提到的用户思维,来引导团队放弃一个衰老的技术。因为曾经再伟大的技术,在用户的面前都是渺小的。为了更好的用户体验,一切都值得推倒重来

你可能会说,我们今天讲顺应技术的自然周期,老去的就让它老去。这个观点似乎太悲观了,难道我们就不能抓住一个技术萌芽和发展的机会吗?下节课,我们就来讨论一下这个问题。

小结

这节课我分享了自己如何克服弱点,来提升追逐新技术周期的能力和勇气。其中我特别想强调的是,当你把自己的思考尺度从三五个月扩大到五年或十年,那么这件事情的价值必然会很大。这个放大思考尺度的动作,会让你用不一样的视角来看待技术。

看一次看不懂,看两次看不懂,但是看多了,自然会看出门道来。从本质上讲,这是个算法训练的过程。当你老用一个小尺度的样本来训练自己的大脑,那么你的大脑就是一个非常优秀的小尺度决策机。但当你坚持用大尺度的样本来训练自己的大脑,那么你在大尺度问题上的决策质量,也必然会得到提升。

在这节课,我还介绍了Gartner的热度曲线所表达的新技术生命周期,以及热度曲线中缺少的衰老期和退出期。了解一个技术生命周期的最核心目的,就在于利用这个周期为我们的架构活动创造出最大的价值。

作为一个架构师,知天道不够,还是要顺天道,也就是说我们的架构要符合技术的自然周期。反之,为一个落后的架构注入新生就是不符合天道了。而想要抗拒这种行为,我们就要从用户思维出发。为了更好的用户体验,要舍得放弃任何曾经伟大过的技术。

思考题

三个作业,任选一个:

  1. 除了我分享的三个弱点外,你觉得还有其他弱点会影响我们看更大尺度上的规律吗?你是怎么克服这个弱点的呢?

  2. 你是如何看待当下比较流行热词呢,比如云原生、低代码、响应式编程、元宇宙,你怎么看这些技术的趋势?

  3. 你或者你周围人,有没有还在维护那些已经在业界垂死的技术?你认为其中的根因是什么呢?

如果今天这节课对你有帮助,欢迎你点击课程右上角的分享并赚钱按钮,把课程转发给你的同事或朋友,大家一起交流、进步。我们下节课再见!

相关文章:

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四:为什么要顺应技术的生命周期? 简介:包含模块一 架构师的六大生存法则-法则四:为什么要顺应技术的生命周期?&法则四:架构设计中怎么判断和利用技术趋势? 2024-08-29 17:30:07 你好&am…...

MSF(Metasploit Framework)

渗透测试中MSF是一个非常强大的工具&#xff0c;可以用来验证系统漏洞、执行攻击以及开发自定义的漏洞利用代码。以下是使用MSF进行渗透测试的基本步骤&#xff1a; 1.启动MSF 启动MSF控制台。 msfconsole2. 搜索漏洞 在MSF中搜索已知漏洞。 search <vulnerability nam…...

Python中的OpenCV详解

文章目录 Python中的OpenCV详解一、引言二、OpenCV基础操作1、OpenCV简介2、安装OpenCV3、图像读取与显示 三、图像处理技术1、边缘检测2、滤波技术 四、使用示例1、模板匹配 五、总结 Python中的OpenCV详解 一、引言 在当今数字化社会中&#xff0c;图像处理和计算机视觉技术…...

IMX6ULL开发板学习嵌入式技术过程中为了测试本地网络是否正常而常用的Ping命令

Windows ip&#xff1a;192.168.5.10 Ubuntu ip&#xff1a;192.168.5.11 开发板 ip&#xff1a;192.168.5.9 最常用的 最常用的两个是开发板和Ubuntu的互ping 开发板→Ubuntu ping 192.168.5.11Ubuntu→开发板 ping 192.168.5.9完整的如下 Windows→Ubuntu ping 192.16…...

Blue Ocean 在Jenkins上创建Pipeline使用详解

BlueOcean是Jenkins的一个插件,它提供了一套可视化操作界面来帮助用户创建、编辑Pipeline任务。以下是对BlueOcean中Pipeline操作的详细解释: 一、安装与启动BlueOcean 安装:在Jenkins的“系统管理”->“插件管理”->“可选插件”中搜索“BlueOcean”,然后点击“Ins…...

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块&#xff1f;模块是一个封装了特定功能的代码块&#xff0c;可以独立开发、测试和维护。模块通过导出&#xff08;export&#xff09;和导入&#xff08;import&#xff09;与其他模块通信&#xff0c;保持内部细节的封装。 前端 JavaScript 模块化是指…...

photoshop的2个形状-箭头

有时候用ps画一些教程类图文&#xff0c;需要用到箭头. 另外自己画了一个镂空的长方形和正方形 形状的路径一般在Custom Shapes文件夹内 例如 E:\photoshopCS4\Adobe Photoshop CS4\Presets\Custom Shapes...

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…...

AI知识-多模态(Multimodal)

摘要 本文将探讨多模态&#xff08;Multimodal&#xff09;的概念&#xff0c;包括其通俗理解、技术原理、应用场景&#xff0c;以及进行总结。我们将通过一个简要的介绍来了解多模态技术&#xff0c;并深入探讨其在人工智能和机器学习领域的重要性。 通俗理解 多模态&#x…...

代码随想录 leetcode-数据结构刷题笔记

文章目录 一、数组1.1 二分查找 1.1.1 二分查找 1.1.2 搜索插入位置1.1.3 排序数组中查找元素第一和最后一个位置1.1.4 x的平方根 1.1.5 有效的完全平方数 1.2 快慢指针 1.2.1 移除元素 1.2.2 删除有序数组中的重复项 1.2.3 移动0 1.2.4 比较含退格的字符串 1.2.5 有序数组的平…...

Oracle最佳实践-优化硬解析

前段时间参加oracle CAB&#xff0c;oracle高级服务部门做了一个数据库最佳实践的报告&#xff0c;其中就有一项就是解决未使用绑定变量但执行次数很多的SQL&#xff1b; 对于一个数据库来说如果不知道该如何优化&#xff0c;那么最简单最有效的优化就是减少硬解析&#xff0c;…...

Windows中将springboot项目运行到docker的容器中

0&#xff0c;先打包好项目&#xff0c;再启动docker 1&#xff0c;在Java项目根目录下创建一个名为Dockerfile的文件&#xff08;没有扩展名&#xff09;&#xff0c;并添加以下内容。 # 使用OpenJDK的基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app# 将项…...

30、使用ESP8266跟SG90舵机制作四足蜘蛛机器人

目录 1、简介 2、使用例子 3、代码解析 4、资源下载 正文 1、简介 本篇使用ESP8266跟SG90舵机制作四足蜘蛛机器人,使用的180度舵机有8个,需要一块16路舵机控制板,也可以使用小一点的控制板8路也够了。下面开始今天的教程,源码在文章末尾自行下载,力求大家都能看懂。…...

相比普通LED显示屏,强力巨彩软模组有哪些优势?

在科技技术的加持下&#xff0c;LED显示屏市场各类创新产品层出不穷&#xff0c;为市场带来了无限可能。其中&#xff0c;强力巨彩R系列H版&#xff08;软模组&#xff09;凭借其独特的技术优势&#xff0c;在行业内脱颖而出。那么&#xff0c;相比常规LED显示屏&#xff0c;强…...

部门操作和日志

PostMapping("/depts") public Result add(RequestBody Dept dept){System.out.println("添加部门: " dept);deptService.add(dept);return Result.success(); }Override public void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setU…...

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…...

python解题之寻找最大的葫芦

问题描述 问题描述 在一场经典的德州扑克游戏中&#xff0c;有一种牌型叫做“葫芦”。“葫芦”由五张牌组成&#xff0c;其中包括三张相同牌面值的牌 &#xfffd;a 和另外两张相同牌面值的牌 &#xfffd;b。如果两个人同时拥有“葫芦”&#xff0c;我们会优先比较牌 &#…...

iOS 环境搭建教程

本文档将详细介绍如何在 macOS 上搭建 iOS 开发环境&#xff0c;以便进行 React Native 开发。&#xff08;为了保证环境一致 全部在网络通畅的情况下运行&#xff09; 1. 安装 Homebrew Homebrew 是 macOS 的包管理工具&#xff0c;我们将通过它来安装开发所需的工具。 安装…...

制作容器镜像

容器基础镜像制作 由于项目使用麒麟操作系统&#xff0c;需要在麒麟桌面操作系统和服务器操作系统里编译代码&#xff0c;如果每次都在物理机和虚拟机里编译太不方便&#xff0c;也无法使用常用的 jenkins k8s 组成的 CI/CD 编译环境&#xff0c;如果基于整个ISO太大了&#…...

基于Python对xslxslx文件进行操作

利用python操作表格文件 读取xsl格式文件-源码 import xlrd# 读取xls文件中的工作对象 wb xlrd.open_workbook(示例文件/xxx物理学与信息技术学院.xls) print(wb)# 获取所有的工作表名称 sheet_names wb.sheet_names() # print(sheet_names)# 选择要读取的具体工作表对象 s…...

机器学习KNN算法全解析:从原理到实战

大家好&#xff01;今天我们来聊聊机器学习中的"懒人算法"——KNN&#xff08;K-Nearest Neighbors&#xff0c;K近邻&#xff09;算法。这个算法就像个"墙头草"&#xff0c;它不学习模型参数&#xff0c;而是直接根据邻居的"投票"来做决策&…...

Android第十二次面试-多线程和字符串算法总结

多线程的创建与常见使用方法 ​一、多线程创建方式​ ​1. 继承Thread类​ class MyThread extends Thread {Overridepublic void run() {// 线程执行逻辑System.out.println(Thread.currentThread().getName() " is running");} }// 使用 MyThread thread new …...

[AI绘画]sd学习记录(二)文生图参数进阶

目录 7.高分辨率修复&#xff1a;以小博大8.细化器&#xff08;Refiner&#xff09;&#xff1a;两模型接力9.随机数种子&#xff08;Seed&#xff09;&#xff1a;复现图片吧 本文接续https://blog.csdn.net/qq_23220445/article/details/148460878?spm1001.2014.3001.5501…...

北京大学肖臻老师《区块链技术与应用》公开课:12-BTC-比特币的匿名性

文章目录 1.比特币的匿名性不是真的匿名&#xff0c;相当于化名&#xff0c;现金是真的匿名&#xff0c; 2.如果银行用化名的话和比特币的匿名哪个匿名性更好&#xff1f; 银行匿名性比比特币好&#xff0c;因为比特币的区块链的账本是完全公开的&#xff0c;所有人都可以查&am…...

【AI智能体】Spring AI MCP 从使用到操作实战详解

目录 一、前言 二、MCP 介绍 2.1 什么是MCP 2.2 MCP 核心特点 2.3 MCP 核心价值 2.4 MCP 与Function Calling 区别 三、Spring AI MCP 架构介绍 3.1 整体架构 3.1.1 三层架构实现说明 3.2 服务端与客户端 3.2.1 MCP 服务端 3.2.1 MCP 客户端 3.3 MCP中SSE和STDIO区…...

Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS

Oracle 审计参数&#xff1a;AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS 一 AUDIT_TRAIL 参数 1.1 参数功能 AUDIT_TRAIL 是 Oracle 数据库中最核心的审计控制参数&#xff0c;决定审计记录的存储位置和记录方式。 1.2 参数取值及含义 取值说明适用场景NONE禁用数据库审计测试环…...

灰狼优化算法MATLAB实现,包含种群初始化和29种基准函数测试

灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;MATLAB实现&#xff0c;包含种群初始化和29种基准函数测试。代码包含详细注释和可视化模块&#xff1a; %% 灰狼优化算法主程序 (GWO.m) function GWO()clear; clc; close all;% 参数设置SearchAgents_no 30; …...

.NET 事件模式举例介绍

.NET 事件模式&#xff1a;实现对象间松耦合通信 在软件开发中&#xff0c;对象之间的通信是一个常见且重要的问题。.NET 框架提供了一种标准化的事件模式&#xff0c;用于解决对象间的通信问题&#xff0c;实现松耦合的交互方式。今天&#xff0c;我们就通过一个简单的例子来…...

阿里云ACP云计算备考笔记 (4)——企业应用服务

目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…...

Android 视图系统入门指南

1. View&#xff1a;界面的最小单位 本质&#xff1a;屏幕上的一个矩形区域&#xff0c;能显示内容或接收触摸。比喻&#xff1a;就像乐高积木&#xff0c;是组成界面的最小单位。常见子类&#xff1a; TextView&#xff08;文字积木&#xff09;、Button&#xff08;按钮积木…...