拥抱变化—— 可扩展性杂谈

海康线扫相机平场矫正实战:从原理到精准成像 本文深入解析了海康线扫相机平场矫正的原理与实战操作。通过拆解暗场与明场矫正的物理意义,揭示了其消除系统噪声、补偿像素响应不均的核心机制。文章详细指导了在海康相机上进行平场矫正的标准化流程、关键参数设置(如行高、灰度值控制)及常见误区,并提供了针对高行频匹配、环境稳定性维护等进阶调优技巧与问题排查指南,旨在帮助用户实现从原理理解到精准成像的跨越。 阅读详情

拥抱变化—— 可扩展性杂谈

                                                                                      杨小华

作为软件开发人员最担心的就是变化,因为一旦变化,意味着自己的开发任务加重, 轻则修改代码,重则修改框架,如果不用做任何修改,则皆大欢喜,现实告诉我们,这是小概率事件,但比买彩票中大奖的概率还是大很多。于是各种讨论开始,开发人员开始讲述修改如何的大,进度如何紧张,架构师也在一旁不停的唠叨这个修改点的重要性,以及对整个系统带来的好处。

在业界曾经有一句很经典的话: “在软件开发领域中,唯一的不变就是变化 ” 。一旦变化,就有人遭殃,不是开发人员,就是设计师或架构师。无论谁遭殃,都不得不拥抱变化。

拥抱变化是极限编程( eXtreme Programming)里面一个非常重要的概念,代表了敏捷阵营对于变化的一种态度,那就是不拒绝,而且还主动求变。本文不想探讨敏捷方面的知识,如何去拥抱变化,而是想要探讨程序的可扩展性,如何在编码过程中,以最小的代价来应对程序未来的变化。

关于可扩展性, 其本身就是一个多方面的概念集合 。有人说程序的可扩展性必须建立在对未来需求的准确把握上,也有人说程序的可扩展性必须建立在能够对需求变化快速响应上。 不论 孰是孰非,其最终目的都是要求, 能在需求 发 生 变 化的 时 候以最小的代价去 应 付 变 化 。

可以从两个纬度对可扩展性进行讨论,一是设计可扩展性,二是编码可扩展性,前者从宏观上考虑,后者从微观上考虑,当然编码也是一种设计活动。本文重点论述编码的可扩展性,对于设计可扩展性,是一个系统性工程,由于作者还没有达到那个高度和境界,所以不敢瞎写,本文基本上不做介绍。

《 UNIX 编程艺术》一书中有一条关于扩展原则的描述:设计要着眼于未来,未来总比预想快。 关于设计可扩展性, 对于系统架构师或者系统工程师不仅仅要考虑在实现用户需求的基础上如何构建系统,还要考虑计算资源的可扩展、应用规模的可扩展,以及对技术换代的可扩展和性能等。

近期发生的干旱和水灾,每次都能找到人为的因素。本文开头提到的场景,如果进行代码回溯,也能找到一些人为的因素。如果当时的编码者在写代码时充分考虑了代码可扩展性,在一定条件下,可以达到用最小的代价去应对变化。如果当时只是为了完成任务,交差,后续的维护者可能面对的不是拥抱变化,而是拥抱痛苦!

场景一:在某嵌入式电信级设备整框分布式环境中,有 NEMI板(管理板), SWF板(业务板), STU板(业务板)和 LC板(业务板),每块板上都有 CPU,运行着各自的程序。目前的架构仅仅对 NEMI/SWF/STU板支持了 HA(High Available)功能,在 SWF卡上运行的某个业务,需要关注 SWF卡的主备倒换事件。 运行在 SWF卡上的程序可以收到来自 NEMI和 SWF卡的主备倒换事件,于是进行了如下编码:

可能开发人员在进行 if条件语句编码时,可能还考虑了另外一种写法:

 

在最初的需求中,上下两种写法都是合适的,但是不是都合理呢?如果一旦需求发生变更, SWF卡上的另外一个业务需要关注 STU板的倒换事件,那么 STU板的倒换事件也会被广播到 SWF卡上,最糟糕的是,这两个业务都订阅了倒换事件(通过消息里面的内容来判断是哪块板发生了倒换),那么上下两种写法的区别就体现出来了,一个能正确运行,而另外一个会把 STU的倒换事件当作 SWF的倒换事件。不难看出,下面一种写法更具有可扩展性,达到了以最小的代价去应对变化。正是这样小的修改,往往会被忽略,隐藏一个很深的 bug,导致花大量的时间去定位。

对于上述的场景,大家编码时常会碰到,觉得这样写也合适,那样写也合适。虽然在一定条件下都很合适,但不一定都合理,那么此时就需要从其他方面加以考虑,如可扩展性,可维护性,可测试性等方面,从而确定哪种写法更合理。

场景二:假定存在如下一个消息类,最初类中只有一个成员变量,消息类的定义和实现如下:

 

对于该消息长度,基类提供了两种接口,一个接口是 setPayloadLen (),另外一个接口是 setMsgLen (),该接口是更高一级的封装,为所传入参数减去基类消息的长度,最终结果还是消息的净荷长度。也许有人会说,基类就不应该提供两套函数,让人迷惑,出错在所难免。

由于场景变化或者需求变更,需要在该类中添加其他的成员变量,维护者可能是这个系统中的另外一个模块的开发者(自己所负责的模块中,构造函数里都是用消息总长度函数,默认其他开发者跟他一样),添加了成员变量和实现后,忘记修改消息的净荷长度,编译并运行,结果与预想的大相径庭,于是开始不停的打断点调试,不断的在怀疑消息是不是丢了,或者没有用修改的代码进行编译,总之,一切该怀疑的都在脑海中闪现了一遍。

或者,意识到要修改消息净荷长度,于是修改成:

 

如果只是一两个成员变量,还能忍受。需求一再变更,又增加了几个成员变量,继续修改, setPayloadLen()里面的代码会越来越长,只是代码写的难看而已。

如果类的实现者,在编写代码时,考虑一下可扩展性,采用消息的总长度函数,那么不论怎么添加成员变量,都不用修改消息长度,一劳永逸。如果确认这个消息不会被扩展,采用 setPayloadLen()也是合理的 。

通过以上两个例子可以发现,如果在编码时,充分考虑了编码可扩展性,即使需求发生变更,有时也可以达到事半功倍的效果。关键问题是如何识别出这样的场景,这个只能靠经验了,没有捷径可走!

 

把 sy-* 带进 ABAP CDS:ABAP 7.50 里的环境信息新姿势($session 与 @Environment.systemField 实战) 摘要:ABAP 7.50在CDS视图中引入两种获取环境信息的方式:1)直接使用$session会话变量读取用户、客户端和系统语言;2)通过@Environment.systemField注解参数,由Open SQL自动注入系统字段。$session方式简单但依赖Open SQL访问路径,非ABAP环境下可能失效;注解参数方案更工程化,依赖关系明确且支持测试。建议ABAP体系内优先使用$session,对外接口采用参数化方案。两种方式各有适用场景,正确选择可避免潜在风险。(148字) 阅读详情

相关推荐

Windows 11 IoT企业版LTSC 24H2/25H2中文版安装指南(含OEM激活教程)

本文详细介绍了Windows 11 IoT企业版LTSC 24H2/25H2中文版的安装与OEM激活全流程。从系统镜像准备、硬件兼容性检查到自动化安装配置,再到OEM激活方案(包括SLIC注入和数字许可证激活),为工业自动化、数字标牌等物联网设备提供稳定可靠的系统部署指南。

weixin_29198045的博客 8908

编写优质软件——代码可扩展性的几种实施方式

文章目录代码可扩展性的几种实施方式基于接口的设计插件架构状态机 代码可扩展性的几种实施方式 《ThePragmaticProgrammer》(Addison-Wesley,1999)一书的作者DaveThomas和AndyHunt曾经说过,所有编程工作都是维护的一种形式。一个类在首次键入几分钟后就会进入无限的维护循环。大多数时候,维护要求把现有代码库重构成模式或者更简洁的设计。然而,维护的能力具备...

Star_Inori的博客 2760

PADS导出PCB正反面丝印为CAD文件的方法

本文介绍如何将PADS绘制的pcb格式的PCB文件顶底层丝印及板框导出为CAD的dxf文件格式,并且将底层丝印进行镜像为正常视角

luguodeyo的博客 3296

程序如何实现可扩展性

参考借鉴ABP中提供的扩展性 持续更新.... 实现一: 定义一个接口 public interface IMessageWriter { string Write(); } 定义一个实现,这个实现是要被另外的一个实现类代替的: public class ConsoleMessageWriter : IMessageWriter, ITransientDependency { public string Write() { return "ConsoleMessa.

cnmeimei的博客 909

PaddleOCR实战:如何在CentOS 8.5上搭建高性能OCR识别环境

本文详细介绍了在CentOS 8.5系统上搭建高性能PaddleOCR识别环境的完整指南。从系统环境准备、PaddlePaddle框架部署到PaddleOCR的定制化安装与性能优化,提供了针对生产环境的解决方案,包括GPU/CPU环境配置、内核参数调优及常见问题排查,帮助用户实现高效OCR识别。

weixin_29223603的博客 350

N32G003学习——第九章 第三节1 串口 发送

经过第九章前2节的学习,基础打下之后,开始敲代码。

qq_34525008的博客 1034

提高C++性能的编程技术笔记:设计优化/可扩展性/系统体系结构相关+测试代码

1. 设计优化 我们可以粗略地将性能优化分为两种类型:编码优化和设计优化。编码优化定义为不需要完整理解要解决的问题或者应用程序的执行流程就能实施的优化。通过定义看出,编码优化用于局部代码,同时该过程不牵涉周围的代码。除了这些容易实现的优化之外,剩下的所有优化都可以归结为设计优化。这些优化是系统性的----它们依赖于其它组件甚至一些关联度很低的模块的代码。设计优化贯穿于所有代码。 设计灵活性:软...

网络资源是无限的 1486

黑科技已上线|Lazada数据分析软件,一键式搞定你的店铺!

工欲利其事,必先利其器。在lazada跨境电商的整个流程中,适当的使用一些工具,不仅能大大的简化工作流程,而且可以提高实施效率。Mengla专为lazada电商卖家行业精细化分析lazada数据分析软件都有哪些强大功能! 一、两大优势: 1.海量数据: 数据覆盖面积大;数据分析维度逛;精确算法抓取海量数据;亿万数据秒级响应多种数据来源; 2.技术成熟: 深耕SaaS大数据挖掘;提供一站式数据分析服务;拥有领先的采集技术和运算模型架构; 二、Lazada数据分析软件的功能: 1.各国站点一键分析: 马来西亚

Menglakeji的博客 1146

这不是忽悠:编码时要注意可扩展性

可以说,代码要具有可扩张性,其核心就是“高内聚,低耦合”的设计思想,这已经不只是一项优秀的程序员素质,可以说是初级程序员向高级程序员的重要标准。变成忽悠简直不可思议。 某些人把代码的可扩展性忽悠成对需求预测的精确性,指出对需求预测十分困难,因此代码就很难具有可扩展性。十分可笑,面面俱到的代码是扩展性最差的代码。 “程序的可扩展性必须建立在对未来需求的准确把握上”这句话本身就是大...

party 406

已经下载了WSL2但Docker依然显示版本过旧无法使用,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2908

Abaqus数据导出技巧:轻松处理大量XY数据

通过上述三种方法,我们可以解决Abaqus中大量XY数据导出的问题。无论是使用插件、编写Python脚本,还是利用Abaqus的内置报告功能,都可以帮助我们高效地处理数据。希望这篇博客能够帮助到你,提高你在Abaqus使用过程中的数据处理效率。

m0_62153576的博客 1916

设计要做到扩展性强还挺难的

从营销工具-【满减活动】谈代码设计扩展性

Sam_Deep_Thinking 3599

YOLO26优化:特征融合 | 一种新颖的多尺度特征融合iAFF,适配小目标检测

在YOLO26中如何使用:iAFF加入Neck替代Concat;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 270

代码质量之可扩展性

  可扩展性的动力——不断变化的用户需求 世界上不变的是变化,软件需求不会变化?不可能!一个系统是否拥抱变化是由它的可维护性和可扩展性决定的,软件环境的变化(可能是业务环境,运行环境)导致软件要进行改动才能满足人们对它的要求,这种系统本身适应变化的能力就是可扩展性。 可扩展性对系统的性能和复杂度都有影响,复杂度很高的项目很难维护,亦很难测试,我比较推崇可预见的、简单的扩展设计,愈简单愈好,...

我的java空间 579

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

一个小例子看编程的扩展性

当码农已经20多年了,从上大学开始,被人面试了无数次,也面试了很多人。从2005年以后,我就开始面试别人,发现很多程序员编程的时候,不会考虑编程的扩展性和执行效率。我自己出了一个简单的面试题,居然很多人没有给出我想要的答案,题目如下,如果你想测试你自己的能力,你也可以做一下,但千万不要看我下面的答案哟。 字符串 1.  A1,B1,C1,C2,B2,A2,D1,D2,D3 2.  E1,E2

huangyuncong的博客 3042

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

拥抱变化

调整心态,拥抱变化。

星云 662

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

拥抱变化-从技术开发者到团队领导者的转变

从技术开发者到团队领导者的转变 去拥抱变化 技术团队的team leader。实施开发已经不是自己最主要的工作,帮助团队成员成长,发现团队的问题,修正团队的方向,才是team leader最核心要做的事情。 从技术开发的角色转换到团队负责人的角色,最重要的转变是思维的转变。 作为一名技术开发人员,深入到业务底层,对逻辑斤斤计较,对代码严苛,对结果负责,这是非常优秀的品质。 转换到团队负责人,真正的技术开发工作只能是自己工作的一小部分,这个时候不得不承认即使你的技术能力再优秀,也要清楚自己是不可能完成所有

maybe的博客 403

研发周报:如何编写出拥抱变化的代码?

我们精心为您准备了 优快云研发频道一周最精彩的技术热点,以飨读者! 编写高效优质的代码一直是程序员所追求的目标之一,那么什么样的代码才叫优质呢?来看看这篇《如何编写出拥抱变化的代码?》;Warcraft之父为如何用肮脏的技巧解决StarCraft开发难题呢?在开发工具发面,可以关注下 20个优秀的前端框架以及十款最新开源的开发者工具/应用。有人说微博和微信就像楚汉之争,现在微博在迷失,微信在寻找

Rainman的专栏 1129

什么叫可扩展性?

一周工作日志:星期一,添加了新功能A星期二,添加了新功能B星期三,为添加新功能C对整个系统进行调整星期四,继续调整星期五,添加了新功能C一周绩效考核:本周实现了新功能A,B,C周三周四都白干了?很遗憾,这正是某些领导的逻辑。一个系统的架构就决定了在这个系统中到底能实现多少功能。这就好比地基深度和楼房层数的关系假设1米地基可以承载3层楼房领导叫我盖个4层的楼房,于是我就打了个2米的地基,快盖好了领导

duyanning 4480

如何提高代码的扩展性

如何提高代码的扩展性 如何提高代码的扩展性 一、架构的高可用?(不是本文的重点) 二、软件项目的变化(为什么要提高代码的可扩展性(背景)) 软件设计的唯一产出物—代码 面向对象的目的是模块化 三、什么是高内聚、低耦合 1、搞清楚模块是什么 例如:如果模块A直接操作了模块B的数据,这种操作模块与模块之间就为强耦合,甚至可以认为这种情况之下基本算没有分模块!如果A只是通过数据与B模块交互,这种我们称之为弱耦合!微服务独立的模块,方便去维护,或者写单元测试等等…如果木块之间的依赖非常严重,将会非常不易于维护。 四

qq_34871037的博客 1625

炉边夜话---多核多线程杂谈

炉边夜话---多核多线程杂谈(精简版)多核多线程已经成为当前一个时髦的话题,早在2005年C++大师Herb Sutter就说过免费的午餐已经结束,并发编程的时代已经来临。从接触第一个多线程项目以来,已经是第四个年头了,一直想把这几年的点点滴滴写成文章,让刚接触的人少走弯路,这便是我写这本书的初衷。很早就有了此想法,一是由于自己懒惰,二是业余时间比较少,三是才疏学浅不敢瞎写,所以一直未能成

极光 1万+

模仿的两端分别是山寨和微创新

模仿的两端分别是山寨和微创新                                                                                 --- 2012移动开发者大会参加有感2012移动开发者大会已经落幕,尘埃落定了。精彩的大会给我留下了深刻的印象,见到了仰慕已久的开复老师,小马哥,蒋总,这次算是见到真人了,当然还有很多技术大牛!这次能参加大会

极光 1万+

《多核程序设计技术》读书笔记一

《多核程序设计技术》读书笔记一1. 冯.诺伊曼体系结构的计算机和图灵机    冯·诺伊曼体系结构的计算机工作原理: 在计算机内部使用二进制、计算机采用五大模块:控制器、运算器、存储器、输入输出设备。 程序能够存储并自动执行。数据通过输入设备进入计算机存储器,在控制器的指挥下在运算器进行逻辑运算和算术运算处理,通过输出设备把结果告诉计算机用户。在这种结构中,程序就是按顺序存储在计算机存储器中

极光 1万+

铁路与多核多线程

铁路与多核多线程 杨小华   多核多线程已经成为当前一个时髦的话题,早在2005年C++大师Herb Sutter就说过免费的午餐已经结束,并发编程的时代已经来临。从接触第一个多线程项目以来,已经是第三个年头了,一直想把这几年的点点滴滴写成文章,让刚接触的人少走弯路,这便是我写这篇系列文章的初衷。    如何理解多核多线程这些概念呢?    在自然世界中,总有那么一些事物是类似

极光 1万+
上一篇: 炉边夜话---多核多线程杂谈
下一篇: 模仿的两端分别是山寨和微创新
normalnotebook
博客等级 码龄24年 647粉丝 38原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值