写点什么

模型驱动工程(MDE)实践调研

  • 2014-11-13
  • 本文字数:8434 字

    阅读完需:约 28 分钟

本文由《IEEE Software 杂志首发,现在由 InfoQ__ 和 IEEE Computer Society__ 联合向您呈现。

尽管过去十年间关于模型驱动工程(model-driven engineering,简称 MDE)的优缺点争论已经相当热烈,但目前,MDE 实践方面的全行业调研还很少。在一项新的研究课题里,我们调研了 450 名 MDE 实践者,并对超过 22 位进行了深度访谈。我们发现,尽管 MDE 的运用比人们普遍认为的更为广泛,但开发者很少通过它来生成整个系统;相反,他们只用 MDE 来开发系统中的关键部分。

对象管理组织(OMG)在 2001 年发布了模型驱动架构(model-driven architecture,MDA)规范第一版。MDA 强调模型在软件开发中作为首要制品的作用;尤其是,模型应该足够精确,以支持生命周期各阶段的自动模型转换。当然,这不是什么新的想法,但它确实唤起了该领域的复苏,并在模型驱动方法的支持者与反对者之间引起了激烈争论。 1.

许多年之后,现在关于模型驱动工程(MDE)是否是一个开发软件的好办法,仍未得到澄清(请参阅边栏《到底什么是 MDE?》)。有些公司称采用 MDE 取得了成功,而另一些则经历了惨痛的失败。我们需要对 MDE 实践进行一次全行业的独立调研,找出那些导致成功或失败的因素。虽然之前有一些关于建模在业界运用的调研,但它们只关注于建模中的某一个方面,比如 UML 的使用 2 或形式化方法等。3.

在本文中,我们将介绍一项关于 MDE 实践的最新调查研究,并分享从中获得的广泛经验。具体地,我们关注于揭示 MDE 的成功与失败因素。我们调查了 450 位 MDE 实践者,并对超过 22 位来自 9 个行业 17 家公司的实践者进行了深度访谈(有关细节请参阅边栏《调研方法》)。

这项调研显示,不同机构运用 MDE 的成熟度分布很广:就参与问卷调查的人数来看,处于早期调研阶段的人、首次 MDE 项目参与者、和有多年 MDE 经验的人,三者比例相当。我们的访谈对象,通常都是对 MDE 富有经验的人。在业界运用 MDE 的方式上,我们有一些意想不到的发现;我们还了解到许多企业为增加 MDE 胜算而采取的措施。

许多经验教训都表明了这样的事实,即:社会组织因素在决定成败上,至少具有与技术因素同等的重要程度。关于本项调研研究方法的详细介绍,我们已另行撰文。本文旨在为那些已经或正考虑采纳 MDE 的人,提供一些关键的经验信息。

MDE 运用广泛

有些人称 MDE 在软件工程里的运用机会很少,他们认为 MDE 只在一些利基市场(niche markets)里被专家们所使用。然而,我们的数据否定了这种观点。我们发现,某种形式的 MDE 被广泛运用于实践,跨越包括汽车、银行、打印机和 Web 应用在内的各种行业。比如,450 位问卷调查 4,5 对象在不同公司里担任不同的角色(36% 是开发者,37% 是项目经理),所在公司的开发者人数也具有良好的分布(52% 少于 100 人,19% 超过 1000 人)。我们的访谈环节也支持这一发现,并且证实 MDE 确实运用广泛,而且使用方式也多种多样:从“为整个应用领域定义精确模型”这一全行业都在做的事,到“针对单个公司的单个应用系列生成代码”这种很受限的、有限程度的 MDE 运用。

或许有些出乎意料,在我们的调研中,大部分 MDE 实践案例都遵循了领域特定模型(domain-specific modeling)的方法:那些成功运用 MDE 的公司,基本都创建或使用了为他们领域专门设计的语言,而不是采用像 UML 这样的通用语言。访谈数据显示,为细窄且拥有良好理解的领域开发小型的领域特定语言(domain-specific languages,DSLs)是常见现象。普遍看法认为,应该花费大量精力来开发那些覆盖着广泛领域且能捕获其中领域知识的模型。与之不同的是,在实际应用中,领域模型其实的是“快而粗糙的(quick and dirty)”;有时,最快只要两周就能开发出一个 DSLs(及相应的生成器)。迷你 DSL 的运用也很广泛,甚至是在单个项目里。但如何整合多个 DSLs 是一个明显的挑战。我们的调研对象倾向于结合 UML 来使用 DSL——在某些情况下,DSL 就是一个 UML 概要文件(profile)。不过无论在什么环境下,建模语言都需要相当多的定制,才能被运用于实践。

我们的研究发现还让我们相信,大部分成功的 MDE 实践都是从基层开始的。由高级管理层强行贯彻的 MDE 计划一般都是艰难的;一些访谈对象称,若开发者们不愿投入的话,那么自上而下的管理肯定是要失败的。所以,我们只看到寥寥几个用 MDE 生成整个系统的案例。成功的 MDE 实践者不是遵循重量级的自上而下的方法,而是在因地制宜地将它与其他方法灵活地结合起来使用。

代码生成不是采纳 MDE 的动力

让我们感到意外的是,我们的数据显示,代码生成并不是采纳 MDE 的关键动力。尽管人们经常认为 MDE(或至少模型驱动的开发)与代码生成关系紧密,而且代码生成能够带来诸如生产效率提高等好处。但事实上,生产效率的提高差异很大(差的降低 27%,高的提升 800%)。大部分公司的生产效率提高似乎介于 20% 到 30% 之间。6 令人意想不到的是,我们的数据表明,这种程度的生产效率提高并不足以成为采纳 MDE 的动力:MDE 带来的培训成本和大量组织上的变动,可以轻易抵消这百分之二三十的效率提升。不过,这并不意味着公司不该采纳 MDE。相反,我们的访谈结果一次又一次地表明,虽然那些公司在采用代码生成的方法,其实他们觉得 MDE 在其他方面的收益要比效果并不明显的效率提升来说更为重要。所以,从这个意义上说,代码生成转移了我们对 MDE 的注意力,而我们的调研结果表明,我们有必要对 MDE 的愿景、宣传口号和理解进行重新认识。

调研方法

我们综合了多种不同的研究方法,从广为传用的问卷调查法,到半结构化访谈法(对象是业界专业人士),还有现场观察法(研究 MDE 实践者如何工作)等等。问卷调查法是通过 SurveyMonkey 在线进行的,内容主要是封闭性问题,采用单项选择和李克特量表(Likert scales)等形式。我们在问卷的开始处强调了,我们的目标群体是有 MDE 实际工作经验的业界实践者。我们在软件工程邮件列表和 OMG 网站上对问卷调查活动进行了宣传。我们还进行了 22 个半结构化的深度访谈,大部分是通过电话完成的。大多数访谈对象对 MDE 的态度总体上是肯定的,不过我们也遇到小部分尝试过 MDE、但以失败告终的人。访谈时长为 45 到 60 分钟,提出的问题包括采用 MDE 的方法与动机,成功 / 失败的理由,以及获得的经验教训等等。访谈过程有录音和笔录;我们最后得到的关于 MDE 经验的文字记录超过 15 万字。有关研究方法的详细信息,我们已撰文另行发表。

参考文献

  1. J. Hutchinson et al., “Empirical Assessment of MDE in Industry,” Proc. 33rd Int’l Conf. Software Eng. (ICSE 2011), 2011, pp. 471–480.

MDE 的真正优势是整体性的

如果 MDE 的真正好处不是代码生成,那么是什么呢?我们发现,原来 MDE 的主要优势,是在记录好的软件架构方面提供了支持。大家都会同意,明确描述的软件架构是成功软件开发的关键之一。然而,软件工程师们缺少技能、技巧和时间来投身于架构定义这项工作,所以,尽管他们欣然接受架构定义的价值,但在实践中并没有去做。访谈对象们一致同意,MDE 使明确的架构定义变得更容易,尤其是在基层开展 MDE 的时候。在精确模型被逐渐引进组织内的过程中,开发者们会发现一些似曾相识的代码片段,于是他们将其抽象为一个 DSL,并为之编写生成器——这实际上是一个逐渐构建架构描述的过程。精确模型所要求的严格性,迫使开发者们进行显式的架构描述,只不过不强制他们采用重量级、冗长的架构定义过程罢了。

有一家公司,他们采用各种基于 XML 的 DSLs 来为某大型复杂系统种的许多部分生成代码。随着时间的推移,开发者们也开始意识到,他们实际上在以一种非标准的关注分离形式进行架构构建:他们发现自己不知不觉地在系统里寻找可自动生成的部分(较简单的部分)和需要有经验的开发者来编写的部分(复杂的部分)。这种关注分离的形式——把简单和复杂的部分加以区分——能够加深对系统架构的理解,而且是在 MDE 的实际演进方式(而不是管理指令)之下产生的。

成功需要商业驱动力

即便是那些认识到 MDE 优势的公司,他们采纳 MDE 也需要较采纳其他方法(如敏捷)更长的时间。我们的数据表明,这种惰性之所以存在,其中一个主要因素是 MDE 通常被宣传为一种更快更省的技术。但这并不足已成为公司冒险采纳它的理由;相反,他们采纳 MDE,是由于 MDE 促成了其他方案无可能实现的事。某全球知名打印机厂商就是一个例证。他们在十年前就开始有意识地采用 MDE 了。那时,软件是他们的瓶颈:当时普遍认为,软件是妨碍新款打印机上市的制约因素。不过,在 MDE 方面经过十年的努力之后,该公司称,现在软件已经不再是个问题了。换言之,MDE 令他们可以专注于他们早该专注的事——即制造打印机,而不是开发软件。这说明一个问题,我们该重新考虑 MDE 的宣传口号了:它不是一种让你做事更快的方法,而是一种让你可以从事新事物的手段。

MDE 心理学

除了以上这些关于 MDE 成功与失败的有趣发现,我们的数据还让我们对 MDE 的心理与组织方面有了更多了解。我们在其他软件工程子领域里观察到一个现象,即不同类型的开发人员(比如新近程序员与专家程序员)之间存在显著的个体差异。我们在 MDE 里也发现了相似的现象。7,8

首先,似乎软件架构师普遍对 MDE 反映良好。MDE 项目所使用的代码生成器,对架构规则、约束和模式等进行编码,而这些都是由软件架构师制定的。因此,MDE 赋予架构师更多的控制权,从而令他们可以在开发团队里容易地实施自己的设计决定。

其次,某些类型的开发人员可能会对 MDE 非常排斥,比如编程专家和编程爱好者。前者习惯于被请教有难度的技术问题,后者乐于(甚至是在业余时间)尝试各种新的编程技术。编程专家反感 MDE,还是出于控制权的因素:MDE 可能会降低他们在公司里的重要性。对于编程爱好者而言,他们觉得 MDE 将任务自动化,限制了他们的创造性。

我们发现管理层面也存在类似的问题。具体地说,似乎中层经理可能会成为采纳 MDE 的瓶颈。因为他们夹在高级经理与基层员工之间,他们通常承担很少的战略职责,因此未必会预见到 MDE 能带来什么。相反,他们的主要职责是跟踪进度和项目里程碑,他们自然会出于规避风险考虑而抵制新技术。

MDE 可能会给全球化软件开发带来根本性转变。众多公司称,他们通过 MDE 减少了离岸活动,因为现在他们可以把原本外包的近岸任务给自动化了。

关于是否人人都具备抽象思考能力这一问题,似乎不同公司有不同的看法。例如,有家公司觉得,采用 MDE 的主要瓶颈在于他们需要对数百名软件开发人员进行重新培训,其中许多人都无法转向抽象思考。与之形成对比的是另一家公司,他们称只有很少的程序员无法进行抽象思考(他们说是 3%,不过这个数字并不是经由科学的方法得到的)。尽管这一问题明显与公司的 MDE 成熟度有关,但结果仍然表明,我们对软件开发中抽象思维的理解还很有限——其他研究人员也有同样的发现 9

一些迹象表明,MDE 专家既要具备软件开发(及抽象)能力,又要对相关领域有着透彻的理解。由于大部分 MDE 工作都和领域十分相关,因此领域知识相当重要。因此,根据技能划分,把团队成员分为领域专家和 MDE 专家的团队,成功几率较低;但如果团队成员同时具备这两种技能的话,成功几率就会增加——也就是说,团队成员一个个都既能为领域开发元模型,又能为领域编写代码,还有对领域进行分析的能力。这有助于减少误解和加速进度。

组织性因素

正如其他软件工程方法一样,组织的架构和业务也与 MDE 成功与否之间也存在着值得注意的联系。

我们的数据明确表明,MDE(至少目前)并不适合所有类型的机构。有趣的是,那些面向特定领域的(如汽车、打印机接口、金融应用等)公司比开发通用软件的公司(如顾问咨询公司)更容易接受 MDE。前者已经雇佣了领域专家,这些领域专家可能已经创建过有关模型。尽管他们创建的模型也许只是个草图或具体一点的蓝图,或者他们可能只是用 PowerPoint 来非正式地描述模型,但正如几位访谈对象所说,把这些非正式模型转换为计算机可读的精确模型,比从零开始创建要轻松得多。

相比之下,写通用软件的开发者可能很难认识到模型的重要性,而且事实上,对于他们正在开发的软件来说,模型也许未必适合。一个很说服力的例子是,一家全球大型软件咨询公司意识到,尽管他们已经多次帮助来自特定领域的客户成功运用了 MDE,但他们仍然觉得这种成功不太可能在自己公司内部发生。MDE 似乎对机构评估个人与团队方面的一些假定存在异议。例如,有些架构师对我们说,有时,他们会人为地把模型搞复杂,因为他们的经理不明白简单模型更好的道理;相反,经理们会觉得简单的模型说明考虑得不够周全。公司雇佣新员工的方式也有悖于 MDE 的思路。在雇佣开发人员时,通常衡量的是他们熟悉什么技术,而不是他们对领域的理解程度。而 MDE 专家要有对一个或多个领域的深入理解,才能成功运用这项技术。

一些建议

我们的研究结果指出一些应当注意的具体指导原则。下面,我们就根据我们掌握的实证数据,提出成功实施 MDE 最重要的五点建议。

  • _ 保持紧而窄的领域。_ 与其他来源的结果一致,我们发现,MDE 在窄而紧的领域中,自动化软件工程任务的效果最好。不要试图对一个宽泛的领域(比方说金融应用)进行形式化描述,实践者应当编写小型、易维护的 DSLs 和代码生成器。然而,实践中常常需要多个 DSLs,这会带来了集成上的挑战。
  • 在关键路径上使用 __MDE_。_ 也许和人们想象中的不同,成功的 MDE 实践者认为,要在不允许失败的项目中尝试 MDE——不要试图在没有充足资源和最佳阵容的分支项目上试验 MDE。此外,应该增量式地引进 MDE,而且如果想成功的话,每一个增量都要给机构增加价值。
  • _ 当心增益被其他方面抵消。_ 公司也许不会意识到,通过代码生成获得的生产效率提升,会被其他方面抵消。有一个为政府信息系统执行验证代码的惨痛例子 10:一个案例分析显示,由现成商业生成器所生成的代码,由于代码可读性差、性能低下,导致代码认证成本增加了八倍。第二个例子是,一家公司强制要求使用某商业 MDE 工具,可是开发者们发现该工具无法适应他们的流程,于是自行篡改了这个工具,结果搞乱了自动生成的代码,因此想尽一切办法避免使用它。
  • 大部分项目在扩展时失败。在基层开展 MDE 时效果最好,不过会有这样一个转折点的到来:组织需要整合基层工作,从而实现组织级变迁。当然,这正是会出问题的地方。所以这一转变过程中,经理们要深思熟虑地进行资源分配。
  • 不要迷恋代码生成。MDE 经常被宣传为一种代码生成解决方案。然而,正如我们看到的,MDE 的真正好处并不在于代码生成。所以,公司最好更多地考虑 MDE 带来的整体性效益,而不是只盯着代码生成。

正如你所看到的,在运用 MDE 时,这几点建议需要小心判断;对实施进展进行充分评估,似乎是成功采纳 MDE 的另一个重要工作。

MDE 培训

我们的数据还显示出建模培训方式的影响。大学里的软件工程课通常是以自上而下的方式教学的:从创建需求模型开始,然后以迭代的方式逐步细化架构、设计、代码、测试等等。这种教学方式要求学生在理解具体细节之前,就对系统的抽象理解做出形式化描述,这给他们带来很大困难。

我们在研究中发现,按照这种自上而下的方式在全企业范围内引入 MDE 的做法充满困难。那些成功实施 MDE 的公司,都是从基层开始推行 MDE 的:小团队试用 MDE 的各个面面,让可重用资产在公司里得到认可,并最终实现 MDE 在整个企业的普及。这种工作方式表明,开发者觉得从基层对现有资产进行重构,要比从上层进行抽象,更容易掌握 MDE。这让我们注意到了 MDE 工作方式与教学方式上的不匹配。

另外,似乎 MDE 开发者既需要编译器开发能力,也需要抽象能力。不幸的是,这些能力要通过不同的计算机课程来学习,而这些课程之间的联系很少。然而,根据我们的证据,我们认为抽象能力与编译 / 优化技术应该整合起来,放在一起教授。这一想法将彻底改变软件工程的教授方式,并提高新一代开发人员的能力,使他们既有问题空间里的抽象能力,又有自动转换到业务空间的能力。11

我们所做的是首个针对 MDE 实践的全行业调研。它发掘出许多已经在 MDE 上取得巨大成功的公司,并揭示了他们成功的部分原因。它也发掘出一些曾经尝试 MDE、但最终放弃的公司。我们的许多发现是一般性的软件开发经验教训,与其他研究揭示的结果一致(例如在形式化方法的使用方面)。然而,无疑我们也有针对 MDE 的经验教训,比如那些与代码生成和抽象有关的。3 也许,最让人大开眼界的部分是我们认识到,最新建模技术与工具在支持软件开发活动方面的不足。在建模语言或工具方面,我们没有发现一致意见——在调研中,开发者们提到了超过 40 种“常用”建模语言和 100 种“常用”工具。有一项最近研究,调查了 50 位软件设计师,发现他们要么根本不用 UML,要么只是有选择性地、非正式地使用 UML。这些研究让我们注意到了建模方面的一些基本问题——设计者们如何进行抽象,工程师们如何用抽象概念来对系统进行分析,机构如何处理抽象概念——都没有很好地反映在当前的建模方法里。事实上,绝大多数建模方法(既包括工业界,也包括学术界的)在开发过程中都没有充分理解用户和机构的工作方式。例如,UML 2.0 对 UML 标准做了很大改动,但并没有如实反映实证软件建模或软件设计研究上的研究成果。最终,当前的建模方法,迫使开发者和机构按一种适应方法论本身(而不是让方法论适应人)的方式来工作。

最后,在结束本文之前,我们提倡采用联合的方法来开发建模方法,从而更好地反映开发者和机构处理抽象和复杂问题时的工作方式。我们相信,只有将软件建模、软件设计研究和组织研究(目前,他们已经在各自势力范围内经取得了瞩目的成绩,但尚未看到融合)三者结合起来,才能实现这一目标。工具和技术应该对开发者与机构的实践有充分的理解,而目前这方面的努力还不够——填补这一空缺或许能解决所有问题,并让建模获得比目前更广泛的接受。

作者简介

Jon Whittle是英国兰卡斯特大学(Lancaster University)计算与通信学院软件工程组主任。他的研究兴趣包括软件建模、实证软件工程和社会化计算。Whittle 获得爱丁堡大学人工智能博士学位。他的联系方式是: j.n.whittle@lancaster.ac.uk

John Hurchinson是英国兰卡斯特大学(Lancaster University)计算与通信学院高级研究助理。他的研究兴趣包括软件建模、软件过程评估和计算语言学。Hutchinson 获得兰卡斯特大学计算机科学博士学位。他的联系方式是: j.hutchinson@lancaster.ac.uk

Mark Rouncefield是英国兰卡斯特大学(Lancaster University)计算与通信学院高级讲师,前微软欧洲研究院研究员。他的研究兴趣包括工作、机构和人因方面的实证研究,以及交互式计算机系统设计。Rouncefield 获得兰卡斯特大学社会学博士学位。他的联系方式是:m.rouncefield@lancaster.ac.uk。

参考文献

  1. D.S. Frankel and J. Parodi, eds., The MDA Journal: Model-Driven Architecture Straight from the Masters, Meghan Kiffer, 2004.
  2. M. Petre, “UML in Practice,” Proc. 35th Int’l Conf. Software Eng. (ICSE 13), 2013, pp. 722–731.
  3. J. Woodcock et al., “Formal Methods: Practice and Experience,” ACM Computing Surveys, vol. 41, no. 4, 2009, pp. 1–36.
  4. J. Hutchinson et al., “Empirical Assessment of MDE in Industry,” Proc. 33rd Int’l Conf. Software Eng. (ICSE 11), 2011, pp. 471–480.
  5. J. Hutchinson, M. Rouncefi eld, and J. Whittle, “Model Driven Engineering Practices in Industry,” Proc. 33rd Int’l Conf. Software Eng. (ICSE 11), 2011, pp. 633–642.
  6. P. Mohagheghi and V. Dehlen, “Where Is the Proof?—A Review of Experiences from Applying MDE in Industry,” Proc. 4th European Conf. Model Driven Architecture Foundations and Applications, (ECMDA 08), 2008, pp. 432–443.
  7. E. Soloway and J.C. Spohrer, eds., Studying the Novice Programmer, Psychology Press, 1988.
  8. B. Curtis, “Fifteen Years of Psychology in Software Engineering: Individual Differences and Cognitive Science,” Proc. 7th Int’l Conf. Software Eng. (ICSE 84), 1984, pp. 97–106.
  9. J. Kramer, “Is Abstraction the Key to Computing?,” Comm. ACM, Apr. 2007, pp. 36–42.
  10. S. Kelly and J.-P. Tolvanen, DomainSpecifi c Modeling: Enabling Full Code Generation, Wiley, 2008.
  11. J. Whittle and J. Hutchinson, “Mismatches between Industry Practice and Teaching of Model-Driven Software Development,” Models in Software Eng., LNCS 7167, Springer, 2012, pp. 40–47.

本文最早刊载于《IEEE Software》杂志。《IEEE Software》杂志旨在构建一个属于软件行业前沿工作者与未来工作者的社区,传达可靠、实用、先进的软件开发信息,从而令工程师和管理者们掌握快速变化的技术变革。

查看英文原文: http://www.infoq.com/articles/the-state-of-practice-in-model-driven-engineering

2014-11-13 08:124761
用户头像

发布了 63 篇内容, 共 26.1 次阅读, 收获喜欢 11 次。

关注

评论 1 条评论

发布
用户头像
文中的模型驱动实践理念应该是错误的,主要原因是你的模型抽象对应的是软件开发的哪一个层级,是基于概念的,还是基于领域的。他们有着本质上的不同,也决定你的架构通用性。
2021-11-26 22:56
回复
没有更多了
发现更多内容

未来已来,运营商如何驱动区块链应用创新提速?

CECBC

人工智能解决方案 --- 智能运维(AIOps)

micklongen

人工智能 AIOPS 知识图谱 智能运维 数据工程

初始化 Ubuntu 工作环境

看山

ubuntu 10月月更

linux之awk使用技巧

入门小站

Linux

在线字符串哈希/散列工

入门小站

工具

分布式文件存储系统Minio实战

飞鸟

Minio 分布式文件存储

API网关Kong实战

飞鸟

kong api 网关 API Gateway

Spring 框架学习

风翱

spring 10月月更

Prometheus 基础查询(四)修饰符

耳东@Erdong

Prometheus 10月月更

【Flutter 专题】133 图解自定义 ACEWaterButton 水波纹按钮

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Minio环境搭建

飞鸟

Minio 分布式文件存储

linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码

程序员架构进阶

架构 ffmpeg 视频流 10月月更

【架构实战营作业】模块五——微博评论计算架构

聆息

博鳌亚洲论坛国际科技与创新论坛第二届大会区块链分论坛紧密筹备中

时空云

区块链 博鳌 亚洲论坛

WEB图像优化

devpoint

性能优化 image 图像格式 10月月更

【LeetCode】环形链表Java题解

Albert

算法 LeetCode 10月月更

Gas 机制是如何运作的

Rayjun

以太坊

官方线索|科大讯飞全球1024开发者节

xcbeyond

1024我在现场

5分钟搞懂Monorepo

俞凡

git 架构

趣说 Node.js 的事件循环

Regan Yue

node.js Regan Yue 10月月更

区块链将规则写入代码 重构市场新制度

CECBC

018云原生之基础架构

穿过生命散发芬芳

云原生 10月月更

Go 扇入 / 扇出

baiyutang

golang 10月月更

【产品】论增长黑客思维如何让B端产品爆发式增长

极光一号。

云原生 用户增长 b端产品经理 增长黑客

【设计模式】第四篇 - 简单工厂

Brave

设计模式 工厂模式 10月月更

微博评论高性能高可用计算架构设计

看,有只猪

👊 【Spring技术特性】带你看看那些可能你还不知道的特性技巧哦!

洛神灬殇

Java spring Spring特性 10月月更

CPU、指令集、微架构概念学习

轻口味

10月月更

Win11安装PyTorch

IT蜗壳-Tango

10月月更

Kafka 生产环境部署指南

Se7en

Linux system hardening: adding hidepid to /proc mount point

卓丁

Linux linux security proc hidepid

模型驱动工程(MDE)实践调研_架构_John Hutchinson_InfoQ精选文章