高级开发必备技能:利用模式解决问题
回顾上一篇文章
简介
现实生活中的设计模式?
正面
系统思维
一个真实的例子
高效的厨师不需要大厨🤔
知识带来力量
进一步深入探讨
更多资源
这是否有帮助?
保持联系
导航你的软件开发职业通讯
让我们继续“软件开发职业生涯的各个阶段”系列!
我发现高级开发人员职业阶段是最有趣的阶段之一,因为高级开发人员可以拥有许多不同的技能组合和目标重点。
回顾上一篇文章
上次,我们讨论了如下主题:
- 谁是高级开发人员?
- 成为高级开发人员的指标是什么?
- 高级开发人员的一些特征
- 经验如何发挥作用
- 高级开发人员应该关注哪些技能范围
- 其他各种技巧
简介
我想深入探讨一下我上次提出的一个重要观点(措辞略有不同):
您必须具备的一项基本技能是将潜在问题视为一系列已在其他地方解决的模式。
如果您想成为一名高级开发人员,这一点至关重要。
高级开发人员不仅指头衔,还指技能和能力!
职业发展的很大一部分是学习更多的工具、技术和模式,让你能够解决更困难的问题并更有效地解决它们。
这将帮助您建立信任、声誉、尊重等,最终将带来更多的职业进步和选择。
现实生活中的设计模式?
我们来看一下经典的软件设计模式。
设计模式(通常)并非在软件开发过程中预先使用的东西。它们是专门为解决软件架构/结构、行为等方面可能遇到的特定问题而设计的。
适配器
例如,当您有两个或多个不同的接口需要相互通信或集成时,就会使用适配器模式。
在现实生活中,它的工作原理很像套筒扳手的适配器。
嗯...事实上是完全一样的!
这实际上是一个非常重要的观点:适配器模式不仅适用于代码/软件!
事实上,所有这些模式不仅仅适用于软件设计!
我们看到它在物理意义上被用在套筒扳手上,用在允许我们的手机与计算机通信的 USB 适配器上,等等。
正面
我们再来一张。
当您想要简化复杂的系统/界面时,可以使用外观模式。
例如,在某些网络应用程序中提交订单的过程可能涉及一系列复杂的步骤。
我们可以将这个过程“包装”成一个方法调用,这将为客户端提供一种非常简单的方式来执行该过程。
就像亚马逊或 eBay 一样,他们可能具有“一键购买”功能,可自动引导您完成购买所需的步骤。
这是一个外观。
这种模式也可以应用于更“现实世界”的情境,比如汽车。使用手动变速器需要知道如何使用离合器,如何用一只手同时换挡,以及如何在换挡时保持视线不离开路面等等。
然而,如今大多数汽车都会自动为您完成所有这些操作(我想这就是为什么它们被称为自动变速器? 😜)。
这是同一种模式,但应用于非面向软件的环境。
底层模式是关于简化客户与您的产品的交互方式 - 无论它应用于哪个领域(软件,汽车等)
系统思维
这种使用通用模式来解决不同领域和环境中的问题的想法有时被称为“系统思维”。
Scott Hanselman 最近也在博客中谈到了这个想法。
通过了解构建系统的基础知识和可用于解决问题的模式,您可以成为无论身在何处都能为企业带来价值的人!
PS 本文最初来自YourDevCareer.com,您可以在那里查看更多文章和资源,以帮助加速您的职业发展!
一个真实的例子
我最近参与的一次对话涉及在 .NET 中运行的遗留应用程序的一些性能问题。
我们讨论的问题之一是高负载下系统性能下降。
总体问题是系统没有足够的“工作者”来同时处理许多 HTTP 请求。
同事立即提供的解决方案是“我们需要另一台服务器,以便我们可以使用负载平衡。”
这个解决方案添加了一个新的节点/服务器,并在它们和客户端之间放置了一个中间人。有点像中介模式?
然而,我的回答是,最好的(也是最便宜的)解决方法是解决该系统中所有数据库 I/O 都是同步的事实。
如果我们使所有这些 I/O 操作异步,那么当数据库在后台工作时,这些线程将可用于处理任何新的 HTTP 请求。
该解决方案在低层次上使用未来/承诺模式。
但在更高层次上,它与您在烘焙食谱时使用的解决方案相同!
高效的厨师不需要大厨🤔
增加中间人和更多节点的解决方案,而不是提高现有工人的效率,就像在厨房里增加一名大厨,同时还雇佣另一个可以委派任务的人。
当一名工人盯着烤箱烘烤时,厨师会命令另一名工人制作糖霜。
听起来像你曾经去过的一些公司? 😂
然而,如果您现有的一名厨师已经工作效率很高,那么您可能实际上需要引入另一名员工甚至一名大厨来委派任务。
但是,如果那个工人的工作效率不高,那么您可能希望先让他/她尽可能高效,然后再雇用更多员工(就像使用异步 I/O 使您的线程更高效一样)。
希望这个例子和厨房类型的类比可以帮助您了解如何在技术和非技术环境中应用这些总体模式和技术。
知识带来力量
但在这种情况下,问题的一部分是了解问题的根本。
有时,即使我们知道了真正的问题,我们也可能没有意识到存在解决该问题的特定模式。
例如,我的同事知道数据库 I/O 是同步的。但他可能不知道还有更高效的方法。
在没有解决方案的情况下,思维过程必须上升到更高的层次并应用效率较低的解决方案。
学习设计和系统模式至关重要,至少要知道哪些问题有解决方案!
您不需要知道如何实现设计模式,但您最好知道它们解决了什么问题。
一旦你遇到这个问题,你就会记得,“哦,是的,我记得读过一个关于这个的模式......” 👌
进一步深入探讨
让我们看更多示例并看看适用哪些熟悉的模式。
例如:在餐厅点餐
排队:
当接受您的订单时,服务员可能会将您的订单放入队列中,因为厨师现在正忙于处理其他订单。
责任链/管道:
可能有一系列厨师需要查看订单,完成他们的部分,然后将其传递给下一个厨师,后者可以对其进行调味、装饰等。
主从:
厨师可能会根据下级厨师制作的各个菜肴组合成一顿完整的饭菜。
例如:银行交易
分类帐/仅附加/事件来源:
当银行处理账户交易时,他们永远不会删除以前的事件或交易。
例如,如果 PayPal 错误地向您支付了 100 美元,他们不会“抹去”这笔交易。他们会发出相应的反向交易(例如,从您那里收回 100 美元)。即使双方最初的金额相同,交易本身仍然保留。
这与大多数公司构建的典型 CRUD 类型的应用程序截然不同。这些应用程序通常仅存储系统的当前状态。
但是这种仅附加模式解决了系统中需要的问题:
- 能够审核系统上执行的所有操作
- 能够负责任地管理多个外部方之间的共享资源(如资金)
- 能够对系统中的趋势进行分析(因为您已经记录了系统中的每个事件)
- 能够在特定时间点查询系统
Sagas /分布式事务:
当您执行类似交互式电子转账的操作时(例如,我想将钱汇给我在另一家银行开户的母亲),会涉及到一个固有的整体“事务”(如数据库事务)。
除此之外,这跨越多个系统(您的银行、另一个外部人员的银行、其他第三方等)
如果你给你的母亲寄 100 美元,那么:
- 它已从您的帐户中“取出”(至少,您看不到它)。
- 你的母亲有 30 天(或其他时间)的时间来接受这笔钱。
- 如果她这么做了,那就太好了!
- 如果没有,那么您的银行必须采取某种补偿措施(例如,将钱存回您的账户。)
如果任何步骤失败,你都要确保钱能回到正确的地方。你肯定不想丢失数据!那就意味着钱财损失😯。
其中涉及一系列复杂的步骤,这些步骤并不与特定数据库甚至特定系统绑定,但需要成为一致的类似数据库的交易的一部分,以确保您的钱到达您的母亲手中或最终回到您的账户。
被称为分布式事务(即跨多个系统的事务),有一些特定的模式可以帮助处理这些类型的场景 - 例如saga 模式。
这相当先进,但如果你感兴趣的话值得研究。
更多资源
我希望您学到了一些新知识,可以帮助您思考以新的方式解决业务和技术问题!
要记住的重点是,你不需要知道如何实现这些模式,只需知道它们的存在以及它们能解决哪些问题即可。如果你能在设计系统时介入,说: “嘿,我记得之前有一个模式可以解决这个问题!让我找到它……”,那么你就能成为超级英雄了。
如果您想深入了解一些有关系统模式的更“高级”主题和领域,这里有一些我发现对我的职业生涯最有帮助的资源。
自由的:
书籍:
- 企业应用程序架构模式- 充满了小型实用技术和模式,可以在处理大型或复杂的代码库和系统时提供帮助。
- 构建微服务:设计细粒度系统- 可能是我读过的最好的分布式系统入门书。它不会对任何特定领域进行过于深入的探讨,但足够深入,让你能够学到大量关于如何设计和思考更复杂的系统和问题的知识。
- 企业集成模式:设计、构建和部署消息传递解决方案- 更深入地了解分布式系统的特定模式。重点介绍可用于可靠地构建复杂业务流程以及将独立系统与更高级的消息传递技术集成在一起的模式。
这是否有帮助?
如果您喜欢这个,请在 Twitter、Reddit 等上分享,以便更多开发人员可以从内容中受益👍。
保持联系
不要忘记通过以下方式与我联系:
您也可以通过我的网站www.jamesmichaelhickey.com找到我。
导航你的软件开发职业通讯
一封电子邮件简报,助您提升软件开发职业水平!您是否想过:
✔ 软件开发人员通常经历哪些阶段?
✔ 我如何知道自己处于哪个阶段?如何进入下一个阶段?
✔ 什么是技术领导者?如何成为技术领导者?
✔ 有人愿意陪伴我并解答我的疑问吗?
听起来很有趣?加入社区吧!
文章来源:https://dev.to/jamesmh/essential-senior-dev-skill-solving-problems-with-patterns-1jp5