首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏程序你好

    程序的腐化原因及建议

    今天我们来说说,一个代码模块的代码是如何一步步腐化变质,到最后程序员都不愿意去维护它,然后要么重构,要么废弃换新模块的? 代码是有一定的周期的,这个没有错。 不符合以上标准都可以称之为代码腐化,形象的理解就是一个苹果,从内部开始烂了,烂到原本应该负责内部代码的程序员拒绝去维护了。 太复杂的抽象不能做方便的变更:一开始设计的Job系统,上面是2-3张图片,下面是动态生成的问题。代码层面对于此设计做了很细致的抽象。 突然产品提出了某一个Job的图片有特别,要求显示10张图片,就对抽象的图片部分做了if-else的处理……无用代码,废弃的接口没有标明 代码腐化的原因 没有代码会是init commit的时候就开始腐化的 有必要经常深入解决腐化问题的代码,必然是业务需求很多,经常要变更的代码。不要等到它已经腐化代码生命周期都快走到头了,才想起来去维护清理它,要经常维修一下,才能更好的让它发挥作用,是吧?

    1.9K30发布于 2018-07-20
  • 来自专栏服务端技术杂谈

    DDD应对运营活动系统腐化实践

    前言 任何人类的设计都会腐化,软件系统也不例外 腐化之谜 随着系统的规模增长和复杂度膨胀,系统会慢慢腐化。 ? 于是改一个很简单的下单地址,就会牵动整个交易系统十几处的改动。 如何解决这种腐化之谜呢? 参考计算机系统架构: 一个复杂的计算机系统架构包括:软件系统元素,元素之间的联系,元素本身有自己特有属性。 于是我们可以在架构角度参考计算机系统架构的实现。 架构建模 ? 业务是否重要且有很高的预期 是否可以让运营和PM介入 遵循迭代式的开放方法 领域模型好坏的标准: 模型反映了对于问题的抽象,抽象没有统一的标准 模型是迭代演进的,需要持续集成,改进 通用语言,领域模型和代码目标意图一致

    2K50发布于 2019-07-31
  • 来自专栏GreatSQL出品技术文章

    MySQL 8.0.29 instant DDL 数据腐化问题分析

    为分析这个问题, 我们会从 instant add/drop column 在 Innodb 的实现原理与细节方面来阐述这个数据腐化bug的具体原因。 数据腐化问题 由 instant add/drop column 引入了多个数据腐化问题,其中一个问题可以从: [PS-8292] MySQL 8.0.29 fails to perform crash 从代码上看,这个bug可能会造成数据的静默错误(数据完全错乱而且不报任何错误),而不仅仅是崩溃这一种现象。 为支持 instant add/drop column,redo log 记录的格式发生了变化,因为代码bug,导致在解析 redo log 做恢复的时候,得到的字段信息错误,导致数据腐化。 8.0.30的修复代码本身也是不能正确解析8.0.29产生的 redo log ,只是根据版本号检测出8.0.29 redo log,进而报错防止数据进一步恶化。

    62150编辑于 2023-08-11
  • 来自专栏MySQL修行 | 老叶茶馆

    MySQL 8.0.29 instant DDL 数据腐化问题分析

    为分析这个问题, 我们会从 instant add/drop column 在 Innodb 的实现原理与细节方面来阐述这个数据腐化bug的具体原因。 数据腐化问题 由 instant add/drop column 引入了多个数据腐化问题,其中一个问题可以从: [PS-8292] MySQL 8.0.29 fails to perform crash 从代码上看,这个bug可能会造成数据的静默错误(数据完全错乱而且不报任何错误),而不仅仅是崩溃这一种现象。 为支持 instant add/drop column,redo log 记录的格式发生了变化,因为代码bug,导致在解析 redo log 做恢复的时候,得到的字段信息错误,导致数据腐化。 8.0.30的修复代码本身也是不能正确解析8.0.29产生的 redo log ,只是根据版本号检测出8.0.29 redo log,进而报错防止数据进一步恶化。

    47630编辑于 2023-09-01
  • 来自专栏斑斓

    Twitter的问题说明再好的软件也会腐化

    ,一旦出现故障,需要及时告警并及时处理等 虽然每一位架构师可能都清楚架构边界的重要性,事实却是一个边界清晰的软件架构,往往会随着时间的推移,慢慢变得混乱,最后变成让人迷路的依赖网: 如此,也就产生了代码腐化 02 代码评审 频繁开展代码评审是避免代码腐化的最有效武器。然而,总是有许多团队和个人推说没有时间,而不开展代码评审。 这里所说的代码评审,可以有三种形式: 融入到CI/CD流水线的代码静态扫描 团队定期召开的内部代码评审(可以是每天或每周) 以提交流程方式运作的代码评审 如下图所示,是我为某客户制订的代码评审流程: 因此,我们需要将测试代码与产品代码等同视之,也需要纳入到代码评审的范围,并做到及时重构,持续不断的提升其代码质量。 结论 回归到Twitter的问题。 次之,如果在提交代码(包括测试和运维代码)时,能启动代码评审的流程,通过引入更多评审者,也许就能通过更多双慧眼及时发现问题。

    53620编辑于 2023-03-23
  • 来自专栏Java架构

    架构的演进, 阿里资深Java工程师表述架构的腐化之谜

    阶段3 更多的功能、更多的成员加入了。构建时间又变长了。随着加载代码的增多,IDE也慢了下来;交流也多了起来——不是所有人能够了解所有代码了。 最简单的处理办法是,检查代码库的提交记录,例如最近3个月之内某个模块就没有人提交过,那么这个模块基本上就可以拿出来形成二进制依赖了。 将独立的模块放入独立的进程 上面的解决方案核心原则只有一条:始终将核心代码库控制在团队可以理解的范围内。如果运转良好,能够很大程度上解决架构因为代码规模变大而腐化的问题。 如果不这么做,动辄上百万千万行的代码堆在一个系统中,随着时间的推移,开发者逐渐对代码失控,架构的腐化是迟早的事情。 针对每个应用,开发者能够在更小的代码内采用自己熟悉的技术方案,从而减少架构腐化的可能。 结语 没有糟糕的架构,变化使之 我访问过很多团队。

    99450发布于 2018-06-14
  • 来自专栏全栈程序员必看

    代码缓存(3

    2、CodeBuffer CodeBuffer类似于IO里面的BufferedReader等用来临时缓存生成的汇编代码,CodeBuffer用来缓存汇编代码的内存通常是BufferBlob中content CodeCache就是用于缓存不同类型的生成的汇编代码,如热点方法编译后的代码,各种运行时的调用入口Stub等,所有的汇编代码在CodeCache中都是以CodeBlob及其子类的形式存在的。 通常CodeBlob会对应一个CodeBuffer,负责生成汇编代码的生成器会通过CodeBuffer将汇编代码写入到CodeBlob中。 _limit) pointer refers to the first unused (resp. unallocated) byte. 3、CodeCache::initialize() 在CodeCache :设置代码缓存的大小; -XX:+UseCodeCacheFlushing:当代码缓存满了的时候,让JVM换出一部分缓存以容纳新编译的代码

    68220发布于 2021-04-07
  • 来自专栏Java架构

    架构的演进,阿里资深Java工程师表述架构的腐化之谜

    阶段3 更多的功能、更多的成员加入了。构建时间又变长了。随着加载代码的增多,IDE也慢了下来;交流也多了起来——不是所有人能够了解所有代码了。 最简单的处理办法是,检查代码库的提交记录,例如最近3个月之内某个模块就没有人提交过,那么这个模块基本上就可以拿出来形成二进制依赖了。 将独立的模块放入独立的进程 上面的解决方案核心原则只有一条:始终将核心代码库控制在团队可以理解的范围内。如果运转良好,能够很大程度上解决架构因为代码规模变大而腐化的问题。 如果不这么做,动辄上百万千万行的代码堆在一个系统中,随着时间的推移,开发者逐渐对代码失控,架构的腐化是迟早的事情。 针对每个应用,开发者能够在更小的代码内采用自己熟悉的技术方案,从而减少架构腐化的可能。 结语 没有糟糕的架构,变化使之 我访问过很多团队。

    1.3K100发布于 2018-05-05
  • 来自专栏JAVA技术zhai

    架构的演进,阿里资深Java工程师表述架构的腐化之谜

    阶段3 更多的功能、更多的成员加入了。构建时间又变长了。随着加载代码的增多,IDE也慢了下来;交流也多了起来——不是所有人能够了解所有代码了。 最简单的处理办法是,检查代码库的提交记录,例如最近3个月之内某个模块就没有人提交过,那么这个模块基本上就可以拿出来形成二进制依赖了。 将独立的模块放入独立的进程 上面的解决方案核心原则只有一条:始终将核心代码库控制在团队可以理解的范围内。如果运转良好,能够很大程度上解决架构因为代码规模变大而腐化的问题。 如果不这么做,动辄上百万千万行的代码堆在一个系统中,随着时间的推移,开发者逐渐对代码失控,架构的腐化是迟早的事情。 针对每个应用,开发者能够在更小的代码内采用自己熟悉的技术方案,从而减少架构腐化的可能。 结语 没有糟糕的架构,变化使之 我访问过很多团队。

    1.6K120发布于 2018-05-07
  • 来自专栏九彩拼盘的叨叨叨

    代码质量第 3 层 - 可读的代码

    比如: fetchData1(data1 => fetchData2(data2 => fetchData3(data3 => fetchData4(data4 => fetchData6(data6 => fetchData7(data7 => done(data1, data2, data3, 如: fetchData1(data1 => fetchData2(data2 => fetchData3(data3 => done(data1, data2, data3) 比如,判断一个值是否是: 1 到 100 之间,能被 3 和 5 整除的偶数。 Wrapper5( Wrapper4( Wrapper3( Wrapper2( Wrapper1(Comp) ) ) ) ) React

    76010编辑于 2021-12-03
  • 来自专栏【腾讯云开发者】

    代码质量第3层-可读的代码

    比如: fetchData1(data1 => fetchData2(data2 => fetchData3(data3 => fetchData4(data4 => fetchData6(data6 => fetchData7(data7 => done(data1, data2, data3, 如: fetchData1(data1 => fetchData2(data2 => fetchData3(data3 => done(data1, data2, data3 比如,判断一个值是否是: 1到100之间,能被3和5整除的偶数。 (num) && num % 2 === 0const isBetween = num => num > 1 && num < 100const isDivisible = num => num % 3

    42920编辑于 2022-01-14
  • 来自专栏《云荐大咖》

    代码质量第 3 层 - 可读的代码

    比如: fetchData1(data1 => fetchData2(data2 => fetchData3(data3 => fetchData4(data4 => fetchData6(data6 => fetchData7(data7 => done(data1, data2, data3, 如: fetchData1(data1 => fetchData2(data2 => fetchData3(data3 => done(data1, data2, data3) 比如,判断一个值是否是: 1 到 100 之间,能被 3 和 5 整除的偶数。 j : k) 3.函数调用嵌套 执行多个函数调用,每个函数输出是下个函数的输入,会造成很深的嵌套。如: // 模拟炒蛋的过程:买蛋 -> 打蛋 -> 炒蛋 -> 上桌。

    1.2K60编辑于 2022-01-12
  • 来自专栏高渡号外

    Python代码找bug(3

    Python代码找bug(3) 上期的代码设计需求: 企业发放的奖金根据利润提成。 发放标准是利润: (1)低于或等于10万元时,奖金可提10%; (2)10万-20万时,高于10万元的部分,可提成7.5%; (3)20万-40万时,高于20万元的部分,可提成5%; (4)40万-60 万时,高于40万元的部分,可提成3%; (5)60万-100万时,高于60万元的部分,可提成1.5%, (6)高于100万时,超过100万元的部分按1%提成, 要求:从键盘输入当月利润,即可计算出应发放奖金总数 (3)If语句后面的条件如果是一个独立的逻辑(判断)运算,无需括号,其二,,其三, (4)If语句的末尾应该有冒号哦,忘性真大。 (5)嘿嘿,if语句后面的{...}是什么鬼? 提醒:惯例所有代码都是基于Pythpn3 的哦。

    97020发布于 2020-09-22
  • 来自专栏生信技能树学习打卡

    Day 3 R语言代码

    #行名,列名,两者合一,加列/行名dim()colnames()rownames()#加列名即为对向量进行赋值;修改单个列名,取子集即可m <- matrix(1:12,nrow = 3);mcolnames (m) <- c("a","b","c","d") colnames(m)[1] <- "hello";m#融合函数merge(test1,test3,by.x = "name",by.y = "NAME gene",1:4), change = rep(c("up","down"),each = 2), score = c(5,3,

    22800编辑于 2024-03-07
  • 来自专栏奝-大周

    代码审计day3

    代码审计Sql注入漏洞 注入类型:数字型、字符型,这两种都包括以下几种注入 post注入、cookie注入、宽字节注入、二次注入、盲注、base64注入、探索注入 数字型:当输入的参数为整型时,则可认为是数字型注入

    35820发布于 2020-08-19
  • 来自专栏Eliauk的小窝

    3、策略模式所需代码

    return fileName.substring(dotIndex + 1).toLowerCase(); } return ""; } } 3、 @Override boolean exist(PathUpLoadMessage message) { return Boolean.FALSE; } } 3

    62730编辑于 2023-10-30
  • 来自专栏IT码农

    写Laravel测试代码(3)

    这里举一个简单例子,AccountController::class调用Connector::class, Connector::class 会调用第三方 json api来读取数据,代码如下: <? $path); return \GuzzleHttp\json_decode($response); } } 代码很简单,但是场景却经常会遇到,关键是如何mock数据而不是发送真实 其实很简单,只需运用Mockery库mock请求代码,从本地读取fixtures数据。 至于mock部分的代码想咋写就咋写。 同时,上面代码里还需要注意一点是,由于Connector::class是AccountController::class 的 hard dependency,别忘了加上 overload, 代码里已经添加链接

    95731发布于 2019-09-03
  • 来自专栏TakinTalks稳定性社区

    去哪儿如何实现故障率降低65%?技术+管理的数字化度量体系实践

    指标级别:根据指标对度量对象的直接影响和表明状态的关系,对指标进行重要等级的划分,分为P1、P2和P3三个级别。例如,P1级别的指标是直接影响和直接表明度量对象状态的指标。 2.1 防腐化治理的背景 2022年去哪儿落地了一个公司级的代码瘦身项目,我们做到了代码精简50%,应用精简50%。 然而,如果后期不继续进行干预,随着功能的迭代和人员的更替,应用数量和代码量还会增加,系统会逐渐腐化。如果我们不能保持代码瘦身成果,那么我们之前花费的精力就会完全白费。 比如无用代码变多,无效配置多,代码覆盖率低,发布依赖太多,内外部调用不合理……这些都是系统腐化的表现。但看起来,这些更像是一个系统复杂度的度量。 在具体的详情中,还能看到它的代码行数等具体数据,这些数据为我们提供了一个参考。 3)应用腐化治理面板 在应用腐化治理面板中,我们主要针对的是应用的治理。这个过程主要针对的是静态复杂度的部分。

    66510编辑于 2023-12-12
  • pcl安装后测试代码3

    测试环境: vs2019 pcl==1.12.1 代码: #include<iostream> #include <thread> #include <pcl/common/common_headers.h > #include <pcl/features/normal_3d.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h 创建和设置可视化窗口 std::string strWinName = "<em>3</em>D Viewer", strWinTitle = "Point Cloud Viewer"; int scnWidth = { 6,0,0 }; // camera at X-axis double foc[3] = { 0,0,0 }; // viewpoint at orgin double up[ 3] = { 0,0,1 }; // up is Z-axis viewer->setCameraPosition(pos[0], pos[1], pos[2], foc[0], foc[1]

    30210编辑于 2025-07-20
  • 来自专栏项勇

    策略代码拆解3-adx

    代码片段4 //ADX // inputs ADX_options = input.string('MASANAKAMURA', title='  ADX Option', options=['CLASSIC

    78540编辑于 2023-03-24
领券