设计模式学习笔记 - 开源实战二(中):从Unix开源开发学习应对大型复杂项目开发

概述

项目越复杂、代码量越多、参与开发人员越多、开发维护时间越长,我们就要越重视代码质量。代码质量下降会导致项目研发困难重重,比如:开发效率低,找了很多人,天天加班也出活不多;线上 bug 频发,查找 bug 困难。

导致代码质量不高的原因有很多,比如:代码无注释,无文档,命名差,层次结构不清晰,调用关系混乱,到处 hard code,充斥着各种临时解决方案等等。

如何才能保证代码质量呢?

当然,首要的是团队技术素质过硬,能够适当地利用设计原则、思想、模式编写高质量代码。此外,还有一些外在的方法可循。

本章,就从研发管理和开发技巧的角度,来讲解下面对大型复杂项目的开发,如何长期保证代码质量,让代码长期可维护。


1.吹毛求疵般地执行编码规范

严格执行代码规范,可以使一个项目乃至整个公司的代码具有完全统一的风格,就像同一个人编写的。而且,命名良好的变量、函数、类和注释,也可以提高代码的可读性。编码规范不难掌握,关键是要严格执行在 Code Review 时,我们一定要严格要求,看到不符合规范的代码,一定要指出并要求修改。

但是,实际情况往往事与愿违。虽然大家都知道优秀的代码规范是怎么样的,但在具体写代码的过程中,执行得却不好。我觉得,这种情况产生的主要原因还是不够重视。很多人觉得,一个变量或函数命名成啥样,关系并不大。所以命名时不推敲,注释也不写,Code Review 时也是一幅事不关己的心态,觉得没有必要太抠细节。日积月累,项目代码就会变得越来越差。所以我这里还是要强调一下,细节决定成败,代码规范的严格执行极为关键。

2.编写高质量的单元测试

单元测试是最容易执行且对提高代码质量见效最快的方法之一。高质量的测试不仅仅要求测试覆盖率高,还要求测试的全面性,除了测试正常逻辑外,还要重点、全面地测试异常下的执行情况。毕竟代码出问题的地方大部分都发生在异常、边界条件下。

对于大型复杂醒目,集成测试、黑盒测试都很难测试全面,因为组合爆炸,穷举所有测试用例的成本很高,几乎是不可能的。单元测试就是很好的补充。它可以在类、函数这些细粒度的代码层面,保证代码运行无误。底层细粒度的代码 bug 少了,组合起来构建而成的整个系统的 bug 也就相应的减少了。

3.不流于形式的 Code Review

如果说,很多工程师对单元测试不怎么重视,那对 Code Review 就是不怎么接受。很多人都觉得 Code Review 不可能很好的执行,形式大于效果,纯粹是浪费时间。

是的,即便 Code Review 做的再流畅,也是要花时间的。所以,在业务开发任务繁重时,Code Review 往往会流于形式、虎头蛇尾,效果确实不怎么好。

但是,我们并不能因此就否定 Code Review 本身的价值。在 Google、Facebook 等外企中,Code Review 应用得非常成功,已经成为开发流程中不可或缺的一部分。所以,要想真正发挥 Code Review 的作用,关键还是要执行到位,不能流于形式

开发未动、文档先行

对于大部分工程师来说,编写技术文档是件让人 “反感” 的事情。一般来讲,在开发某个系统或者重要模块、功能之前,我们应该先写技术文档,然后,再发送给同事审查,在审查没有问题的情况下再开发。这样能够保证事先达成共识,开发出来的东西不至于走样。而且,当开发完成后,进行 Code Review 时,代码审查者通过阅读开发文档,也可以快速理解代码。

此外,对于团队和公司来讲,文档是重要的财富。对新人熟悉代码或任务的交接等,技术文档很有帮助。而且,作为一个规范化的技术团队,技术文档是一种摒弃作坊式开发和个人英雄主义的有效方法,是保证团队有效协作的途径

持续重构、重构、重构

我个人反对平时不注重代码质量,堆砌烂代码,实在维护不了就大刀阔斧的重构甚至重写。有时候,因为项目代码太多,重构很难做彻底,最后又搞出来一个四不像的怪物,这样就更麻烦。

优秀的代码或架构不是一开始就设计好的,就像优秀的公司或产品也都是迭代出来的。我们无法 100% 预见未来的需求,也没有足够的精力、时间、资源为遥远的未来买单。所以,随着系统的演进,重构是不可避免的

虽然我刚刚说不支持大刀阔斧、推倒重来式的大重构,但持续的小重构我还是比较提倡的。它也是时刻保证代码质量、防止代码腐化的有效手段。换句话说,不要等到问题堆得太多了再去解决,要时刻有人对代码的整体质量负责,平时没事就改改代码。千万不要觉得重构代码就是浪费时间,不务正业。

特别是一些业务开发团队,有时候为了快速完成一个业务需求,只追求速度,到处 hard code,在完全不考虑非功能性需求、代码质量的情况下,堆砌烂代码。实际上,这种情况还是比较常见的。不过没关系,等你有时间了,一定要记着重构,不然烂代码越堆越多,总有一天代码会变得无法维护。

6.对项目与团队进行拆分

我们知道,团队人比较少,比如十几个人时,代码量不多,不超过 10 万行,怎么开发、怎么管理都没问题,大家都比较了解彼此做的东西。即使代码质量太差了,我们大不了把它重写一遍。但是,对于一个大型项目来说,参与开发的人员会比较多,代码量很大,有几十万、甚至几百万行代码,有几十、甚至几百号人同时开发维护,那研发管理就变得极其重要。

面对大型复杂性项目,我们不仅仅需要对代码进行拆分,还需要对研发团队进行拆分。上篇文章我们讲到了一些代码拆分的方法,比如模块化、分层等。同理,我们也可以把大团队拆分成几个小团队。每个小团队对应负责一个小的项目(模块、微服务等),这样每个团队负责的项目包含的代码都不至于很多,也不至于出现代码质量太差无法维护的情况

总结

实际上,上面刚刚讲的 6 条方法论都没啥新奇的,网上也有很多的信息,最后谁做得好,关键在于执行和细节。

有人说,我们做了单元测试、Code Review 了,但到最后,项目还是一堆 bug,代码质量还是很差。这个时候,我们就要去思考一下,单元测试、Code Review 做的到底够不够好,从决策到执行再到考核是否形成了闭环。不能口号喊的 100 分,落实到执行只有 50 分,最后又没有很好的考核机制,好坏大家也都不知道。所以,切忌敏与言而讷与行。

此外,刚刚所讲的方法都治标不治本。软件开发过程中的问题往往千奇百怪。要想每个问题都能顺利解决,除了理论知识和经验之外,更重要的是具备分析问题、解决问题的能力。这也是为什么很多公司重视应届生招聘,希望从一开始招聘一些有潜力的员工。找到对的人、用对好的人,打造优秀的技术文化,才是一直保持卓越的根本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

扫描工具nmap

介绍 说到黑客,知识就是力量。您对目标系统或网络的了解越多,可用的选项就越多。因此,在进行任何利用尝试之前,必须进行适当的枚举。 假设我们获得了一个 IP(或多个 IP 地址)来执行安全审计。在我们做任何…

究竟该怎么寄快递才能安全无误的送到手中呢?

最近,小编上班了发现有同事在吐槽快递送到手中的时间很晚了,比预计的时间差了很多,并且产品也有不同程度的损坏。这就让我们很是恼火了,但是细细研究后才发现有一部分的原因竟然是我们的原因才导致的寄快递出现了很多纰漏。 首先…

使用JavaScript创建数组,并对其进行冒泡排序

JavaScript创建数组方式 字面量方式:使用方括号 [] 来创建数组,并在方括号内按顺序列出数组元素。 let arr [1, 2, 3, 4, 5]; Array() 构造函数方式:使用 new Array() 构造函数来创建数组,并传入数组元素作为参数。 let arr ne…

如何使用ChatGPT仿写一篇学术论文

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.仿写的目的 2.根据专业方向搜集合适的文献 3.总结想要仿写的文献 4.使用ChatGPT一步一步仿写 5.书籍介绍 AIPaperPass智能论文写作平台 深入地阅读和分析你研究领域的相关文…

汽车IVI中控开发入门及进阶(十六):carplay认证

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿

PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿 文章目录 PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿背景介绍P_TRIG: 扫描 RLO 的信号上升沿说明参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 P_TRIG 背景介绍 这是一…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象,分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点,主要成员是各类 Server,开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外,还…

实现Spring底层机制(阶段1—编写自己的Spring容器,扫描包,得到bean的Class对象)

环境搭建抛出问题 1.环境搭建 1.创建maven项目 2.导入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.ap…

代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

1049.最后一块石头的重量II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 有…

AI-数学-高中-39空间向量-2空间向量法(法向量)

原作者视频&#xff1a;【空间向量】【一数辞典】2空间向量法&#xff08;重要&#xff09;_哔哩哔哩_bilibili 法向量&#xff08;高中阶段所有与面的关系&#xff0c;都可以通过法向量去证明和解答&#xff09;&#xff1a; 是空间解析几何的一个概念&#xff0c;垂直于平面…

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址…

AI时代,操作系统交互的革命性变革

AI时代对操作系统交互的影响 对于2024年的智能手机厂商们来说&#xff0c;在冲击高端市场的路上有一场绝对输不起的硬仗&#xff0c;那就是AI大模型的落地之战。 OpenAI的ChatGPT引爆了全球AIGC&#xff08;生成式人工智能&#xff09;热潮&#xff0c;短短一年时间里&#xff…

新手小白,在数学建模的过程中应该怎么分工?

大家知道&#xff0c;数学建模竞赛是需要一个团队的三个人在三天或四天的时间内&#xff0c;完成模型建立&#xff0c;编程实现和论文写作的任务&#xff0c;对许多第一次参加建模或者建模经验比较欠缺的团队来说&#xff0c;是时间紧任务重的&#xff0c;那么怎么办呢&#xf…

Java学习笔记26(枚举和注解)

1.枚举和注解 1.1 枚举 ​ 1.枚举(enumeration) ​ 2.枚举是一组常量的集合 ​ 3.枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.枚举应用案例 ​ 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读 ​ 2.对枚举对象/属性使用final st…

C语言实现三子棋游戏(可以改变为四子棋或者多子棋版)

目录 游戏介绍 游戏框架 游戏基本逻辑的介绍 游戏具体功能实现 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 行和列&#xff1a; 对角线&#xff1a; 平局&#xff1a; 游戏继续&#xff1a; 游戏完整代码 test.c game.c game.h 游戏介绍 三子棋游戏或者…

浏览器不兼容的问题和通用解决方案

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我想和大家聊聊一个在我们日常上网过程中经常遇到的问题——浏览器不兼容。这个问题看似微小&#xff0c;但却常常让我们在浏览网页、使用在线应用时感到困扰。接下来&#xff0c;我将详细分析浏览器不兼容的原因&#xff0c;并…

[lesson48]同名覆盖引发的问题

同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象(<font color>兼容性)子类对象可以直接初始化父类对象父类指针可以直接指向子类对象父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时 子类…

30 消息队列

原理 操作系统可以通过页表映射在共享区创建一块共享内存&#xff0c;也可以申请一个队列。A进程和B进程可以向这个队列发送数据块&#xff0c;两个进程接收数据块来通信 函数 申请数据块 参数中的key来自于ftok函数 删除消息队列 同样消息队列也有数据结构管理&#xff…

数值分析复习:Richardson外推和Romberg算法

文章目录 Richardson外推Romberg&#xff08;龙贝格&#xff09;算法 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 本专栏&#xff1a;数值分析复习 的前置知识主要有&#xff1a;数学分析、高等代数、泛函分析 本节继续考虑数值积分问题 Richardson外推 命题&a…

解决在linux中执行tailscale up却不弹出验证网址【Tailscale】【Linux】

文章目录 问题解决提醒 问题 最近有远程办公需求&#xff0c;需要连接内网服务器&#xff0c;又不太想用todesk&#xff0c;于是找到一个安全免费可用的Tailscale Best VPN Service for Secure Networks&#xff0c;在windows中顺利注册账号后&#xff0c;登陆了我的windows …