设计模式学习笔记 - 开源实战二(中):从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.mfbz.cn/a/566877.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手写基于redis-lua脚本实现分布式id生成器starter

手写基于redis-lua脚本实现分布式id生成器starter 文章目录 1.前言2.实现思路2.1lua脚本的特性2.2 了解三个redis命令2.3集群自增序列实现原理2.4三种实现思路2.4.1 实现思路一2.4.2 实现思路二2.4.3实现思路三 3.项目工程目录4.源码仓库地址5.依赖及使用配置5.1依赖5.2nacos配…

科研基础与工具(论文写作)

免责申明: 本文内容只是学习笔记,不代表个人观点,希望各位看官自行甄别 参考文献 科研基础与工具(YouTube) 学术写作句型 Academic Phrase bank 曼彻斯特大学维护的一个网站 写论文的时候,不不知道怎么…

机器学习基础-PR\ROC\F1

1 1 、ROC曲线2 、PC曲线3、F14 、正负样本不均衡时怎么选择 1 、ROC曲线 就是TPR 与FPR 曲线 如图,就是根据阈值不同,我们看我们的二分类器的结果,根据结果算出TPR(真阳性)与FPR(假阳性),最好的情况就是如图,我们的…

2024年三支一扶报名照上传要求很严格

2024年三支一扶报名照上传要求很严格

2024年最新版云开发cms开通步骤,开始开发微信小程序前的准备工作,认真看完奥!

小程序官方有改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的cms网页管理后台 一,技术选型和技术点 1,小程序前端 wxml css JavaScript MINA原生小程序框架 2,数据库 云开发 云数据库 云…

合合信息Embedding模型:引领中文文本向量化技术新高度

目录 🍅前言🍓赛事含金量🍓Embedding技术简介🍓Embedding在大模型中的价值🍓合合信息Embedding模型特点及优势🍓合合信息Embedding模型测试🍓技术突破🍓公司介绍 🍅总结 …

360在线翻译免费API

一、需求: 根据360在线翻译,获取免费API,并调用 二、主要步骤 1、请求 url url "https://fanyi.so.com/index/search" 2、传入信息 datas {"query": "桌子"} 3、请求头 headers {"pro": &…

Axure糖尿病健康管理APP原型 (知识科普/病友社区/远程医生会诊/购物商城/血糖监测/饮食监测)

作品概况 页面数量:共 50 页 源文件格式:rp格式,兼容 Axure RP 9/10,非程序软件无源代码 应用领域:医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图,设计规范内容清晰…

第54篇:创建Platform Designer系统

Q:本期我们开始使用Platform Designer工具创建带IP核的FPGA自定义硬件系统。 A:Platform Designer是集成在Quartus软件里的系统设计工具,名称随着Quartus的不断更新曾命名为SOPC Builder和Qsys。 使用Platform Designer可以添加Quartus已有自…

Aigtek高压放大器在电活性聚合物中的作用是什么

电活性聚合物是一类特殊类型的聚合物,其性质和形状可以受到外部电场的调控。这些聚合物在多个领域中有着广泛的应用,包括人工肌肉、电动液体透镜、柔性电子、生物医学传感器等。高压放大器在电活性聚合物的研究和应用中扮演着关键的角色,下面…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | Calendar Widget的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 显示类控件 | Calendar Widget的使用及说明 文章编号&am…

C#-使用Harmony库实现DLL文件反射调用

一. Harmony工作原理 利用C#运行时Runtime的反射机制,动态加载dll中的方法,字段,属性,实现对DLL方法的重写和代码注入。 二. Harmony下载及安装 1.下载Harmony_lib库lib.harmony.2.3.3.nupkg 霸王•吕布 / CSharpHarmonyLib GitCodehttps://gitcode.net/qq_35829452/csharph…

南京邮电大学数学实验A答案 | 《MATLAB数学实验》第三版课后习题答案

数学实验A 本仓库收集了2024年我在学习《数学实验A》课程期间完成的作业。课程使用的教材为《MATLAB数学实验》第三版,作者为胡良剑和孙晓君教授。 这个资源库的建立初衷是为了帮助南京邮电大学的同学们在学习过程中有一个参考的依据,减少一些无端浪费…

【网络编程】UDP实现回显服务器

一.网络编程的基本术语. 客户端 客户端是为用户提供本地服务的程序,通常位于用户设备上。也称为用户端,是相对于服务器而言的。它主要指安装在用户设备上的程序,这些程序能够与服务器进行通信,从而获取服务或者执行特定功能。在…

虚拟机中安装的CentOS7的桌面右上角没有网络图标解决方案

问题描述 今天在打开CentOS7后,发现右上角的网络图标不见了,然后命令行访问百度也不通。然后上网查了一些解决方法。 原因分析及解决方案: 上网查了许多解决方法,其中一种成功解决了我的问题;我的是配置文件的问题。…

双链向表专题

1.链表的分类 链表的种类非常多组合起来就有 2 2 8种 链表说明: 虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构: 单链表 和 双向带头循环链表 1. 无头单向⾮循环链表:结构简单,⼀般不会单独⽤来存数…

在linux系统中启动pycharm

1.找到pycharm的安装路径,一般在下载文件夹中 2.进入pycharm的安装路径,进入bin目录 3.右击,打开终端,输入./pycharm.sh

Linux系统中Nginx的使用

Nginx是一款开源的高性能、高可靠性的Web服务器和反向代理服务器。它在Linux系统中得到了广泛的应用,被用于构建高性能的Web应用和提供反向代理服务。下面将介绍Nginx在Linux系统中的使用以及一些常见的应用案例。 一、Nginx的安装和配置 安装Nginx 在Linux系统中…

2024深圳杯数学建模挑战赛B题:批量工件并行切割下料问题思路代码成品论文分析

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯数学建模挑战赛2024B题:批量工件并行切割下料问题 板材切割下料是工程机械领域重要…

hyperf 三十一 极简DB组件

一 安装及配置 composer require hyperf/db php bin/hyperf.php vendor:publish hyperf/db 默认配置 config/autoload/db.php 如下,数据库支持多库配置,默认为 default。 配置项类型默认值备注driverstring无数据库引擎 支持 pdo 和 mysqlhoststringl…
最新文章