Press "Enter" to skip to content

在软件工程中高质量工作

在软件工程组织中工作时,我们试图理解什么样的组织适合,什么样的不适合。例如,有些组织能够产出优质的软件,有些则不行。通常,我们需要一些敏捷方法,如Scrum,来使用干净的代码甚至是TDD,这样我们就能做得很好了。然而,事情需要更多的工作和清晰度。

要创建高质量的工程组织,我们需要以下五个支柱:

  1. 以客户为中心
  2. 优秀的软件设计
  3. 良好的代码质量
  4. 良好的工程文化和原则
  5. 品质至上的心态
  6. 快速反馈循环

构建优秀团队

但是,在所有这些之前,我们必须拥有一个优秀的团队。在他的书中,”理想的团队队员:如何识别和培养三个基本的美德”中,Patrick Lencioni(《团队五大功能失调》的作者)概述了理想团队队员的特征。根据Lencioni的观点,一个完美的团队队员体现了三个基本美德:

  1. 谦逊 – 能够将团队的利益置于个人的利益之上。谦逊的团队队员意识到自己的优点和缺点,欣赏他人的贡献,并愿意为团队的成就分享荣誉。
  2. 渴望 – 强烈的驱动和成功的渴望。渴望成功的团队队员自我激励,致力于工作,并始终寻找改进或为团队做更多贡献的方法。他们不需要持续的监督或鼓励,因为他们受到雄心和追求卓越的驱动。
  3. 人际智商 – 情商是理解和有效处理社交场合的能力。具有较高人际智商的团队队员能够与同事建立牢固的关系,理解他人,有效沟通,并构建有建设性解决冲突的能力。

Lencioni强调理想的团队队员必须平衡这三个美德。只在一个或两个方面表现出色的人可能需要帮助来为团队的成功做出贡献。例如,具有高度谦逊但渴望不高的人可能过于被动,而具有高度渴望但人际智商低的人可能在与他人交往中过于积极或粗暴。为了培养理想的团队队员,领导者应该努力认识和培养团队成员的这些美德,并创造一个重视和奖励这些品质的文化。

我们在面试中如何评估这些特质

🔹 我们在问题上尽量具体地针对目标行为

🔹 面试后与其他面试官进行评估

🔹 针对一个人的谦逊、渴望或人际智商的疑虑加以注意,并试图更好地理解。

在这篇文章中了解更多关于建立优秀团队的内容:打造高效团队

以客户为中心

我们必须始终关注客户。因为我们的目标是让客户满意,最终使我们的业务增长。我们可以使用敏捷的方法论,如Scrum、看板或SAFe,与客户定期合作。并不一定非要使用这些方法中的任何一个,但我们需要一些迭代开发流程。这个流程应该允许我们制作早期原型,实验,并为客户交付价值。

我们需要注意的事情是,客户通常对我们的技术栈、架构、干净的代码、框架等不感兴趣,而是对构建正确的产品感兴趣。作为工程师,我们希望做出正确的产品。所以我们需要一个计划,并在此基础上努力工作。

简单的设计

我们通常认为架构被过高评价,但简单的设计被低估。这意味着我们不应该立即采用复杂的架构,如微服务,而是要从简单的开始。我们希望拥有一个干净的设计,因为它与干净的代码相似,易于阅读和理解。

我们希望尝试通过解决方案并通过解决方案学习,而不是选择耀眼的架构模式并将其应用于每个项目。因此,我们应该从一个简单的设计文档(例如RFC形式)开始我们的设计工作,并征求团队的反馈。在这里,我们需要明确我们需要做出的权衡。

我们希望实现的期望架构应该是可测试的,基于我们的业务案例(例如六边形和干净的架构),并且为变化而设计

这里的问题是项目悖论,这意味着在项目中工作时,需要做出的关键决策数量减少,而对项目领域的了解增加。这意味着我们需要在我们对项目了解甚少的时候做出最重要的决策。

项目悖论
项目悖论

对我们而言,这意味着我们需要推迟决策,直到最佳时机,以便能够在项目中前进。

合适的架构

康威法则说:

“任何设计系统的组织最终都将产生一个与组织沟通结构相似的设计结构。”

换句话说,软件系统的结构常常受到构建团队内部的结构和沟通模式的影响。这可能会导致对问题的最优软件架构,因为团队可能会关注自己组织的需求,而不是系统的需求。这意味着具有小型分布式团队的组织将产生模块化的服务架构,而具有大型的就地团队的组织将产生单体化的架构。

我们希望创建的开发团队能够利用逆康威机动来鼓励理想的软件架构。我们希望在定义团队的组织结构时包括架构师、领导者和其他人。这样,我们就可以从一开始就有架构师参与团队,并给予人们时间来构建我们的系统。

我们可以使用的一种推荐架构类型是模块化单体架构。在这里,我们将系统分成可管理的模块,然后将它们组装成单体以进行单一部署。这样,如果需要,我们可以将独立模块后续拆分为服务。

在这里阅读更多关于模块化单体的内容:为什么你需要先构建模块化单体应用

持续部署

持续部署是一种软件开发实践,其中对代码库的更改会自动进行测试并部署到生产环境。这是从持续交付进一步发展的方法,持续交付是一种方法,其中代码更改在经过自动测试并准备好部署之后,需要人工的“触发”才能进行实际部署。

在持续部署中,通过生产流水线的所有阶段的每个更改都会自动发布给用户,无需人工干预。自然而然,这意味着您的开发团队对其自动化测试和基础设施有很高的信心。

我们希望在每次迭代结束时将我们的软件部署到生产环境中,或者至少部署到测试环境中,但与此同时,我们希望继续开发我们的功能。我们可以通过将发布与部署分离来实现这一点。这可以通过特性开关或蓝/绿部署等方式来实现。

当然,这包括拥有适当的CI/CD流程

DevOps流程
DevOps流程

解决技术债务

技术债务可能会给开发团队带来很多挫败感和倦怠感。软件工程师可能意识到技术债务的副作用。然而,他们经常需要向产品团队解释快速而简单的编码开发解决方案存在的风险。

因此,业务不断增加更多功能,而技术债务也在增加。我们通常会认为,技术债务不是一个技术问题。出于这个原因,每个软件开发团队都必须尽力防止技术债务的累积,以免产生最糟糕的情况,即项目停滞不前。

技术债务的主要问题在于代码是一个抽象的概念,所以很难向业务和管理层解释发生了什么。因此,公司可以轻易忽视他们看不到或理解不了的东西。因此,在这里,我们需要为公司和管理层明确地、形象化地展示我们的技术债务。

通常,在开发我们的软件系统期间,每个开发周期可用于新功能的容量会减少(上线时间增加),而复杂性会增加。因此,我们花费更多的时间来应对复杂性,而不是开发新功能

技术债务
技术债务

我们如何处理技术债务:

  1. 明确问题
  2. 明确产品的所有权
  3. 授权团队解决问题
  4. 不要请求对重构的许可
  5. 开发速度会变慢,但未来会更快

在这里阅读更多关于如何解决技术债务的内容:如何处理技术债

好代码

我们如何知道什么是好代码,什么是糟糕代码呢?Kent Beck在20世纪90年代末开发Extreme Programming时制定了他的四条简单设计原则。根据他的观点,好的代码

  1. 通过测试
  2. 展现意图
  3. 无重复
  4. 元素最少

因此,糟糕的代码很难理解,令人困惑。

问题是我们为什么会写糟糕的代码。当然,原因有很多(时间压力、已经糟糕的代码库、破窗理论等等)。但好的是,我们可以通过采用Bob Martin的”童子军规则”来解决这个问题。

“我们不能仅仅写好代码。代码在时间的考验下必须保持整洁……比你发现时的情况更加整洁。”

因此,每天你打开一个文件并写一些东西,做一点点的改进。例如,重命名一个变量,重构或提取一些逻辑,写一个测试等等。

我们也可以通过反向思考并在代码中寻找味道,然后进行重构来知道某些代码是糟糕的。有不同的**代码味道分类**,我们应该注意它们。

代码味道
代码味道

好的工程文化

当我们谈论生产高质量的软件时,我们通常只关注技术方面,但关键在于人。如果要使用最新的技术栈而使用它的人不自信,这就没有多大意义。因此,问题是如何建立一种积极的工程文化,使我们能够创建出色的软件。以下是我们应该知道的一些事情:

  • 具有心理安全感进行实验和接受失败(参考GoogleAristotle项目)。
  • 如果我们被卡住2小时,我们应该能够向其他人寻求帮助
  • 进行代码审查和结对编程
  • 岗位轮换和拓展角色
  • 持续学习
  • 知识分享会
  • 指导和辅导
  • 拥有扎实的专业技能,深入了解一个或多个领域的开发团队
  • 开发团队每天都感到快乐和兴奋。
  • 等等。
扎实的专家
扎实的专家

好的工程实践

除了良好的工程文化,我们还需要建立一些良好的工程实践。良好的工程实践是我们的工程师可以产生和如何产生的基础。

软件工程团队中的一些良好工程实践包括:

  • 有一个源代码控制(主要是GIT)
  • 所有关键级别进行测试(检查测试金字塔)
  • 使用干净的代码并与代码坏味道作斗争
  • 在适当的情况下使用设计模式
  • 实现0缺陷政策(在待办事项中不允许缺陷)
  • 进行测试驱动开发
  • 检查YAGNI、DRY、KISS和SOLID原则
  • 使用自动化代码分析
  • 进行代码审查
  • 在代码库中记录所有必要的文档

内容由GeekAI网页翻译服务自动翻译完成。 原文地址:https://newsletter.techworld-with-milan.com/p/high-quality-work-in-software-engineering

One Comment

发表回复