今天我们来说说,一个代码模块的代码是如何一步步腐化变质,到最后程序员都不愿意去维护它,然后要么重构,要么废弃换新模块的? 代码是有一定的周期的,这个没有错。 为什么有的代码跑上几十年任然好用,而现在互联网公司的很多代码,每年都要做好几次重构?一个成立2年的互联网公司,做一个支付系统,可以做了4-5代,每次重构,这样的代价有多大? 不符合以上标准都可以称之为代码腐化,形象的理解就是一个苹果,从内部开始烂了,烂到原本应该负责内部代码的程序员拒绝去维护了。 突然产品提出了某一个Job的图片有特别,要求显示10张图片,就对抽象的图片部分做了if-else的处理……无用代码,废弃的接口没有标明 代码腐化的原因 没有代码会是init commit的时候就开始腐化的 有必要经常深入解决腐化问题的代码,必然是业务需求很多,经常要变更的代码。不要等到它已经腐化到代码生命周期都快走到头了,才想起来去维护清理它,要经常维修一下,才能更好的让它发挥作用,是吧?
前言 任何人类的设计都会腐化,软件系统也不例外 腐化之谜 随着系统的规模增长和复杂度膨胀,系统会慢慢腐化。 ? 于是改一个很简单的下单地址,就会牵动整个交易系统十几处的改动。 如何解决这种腐化之谜呢? 参考计算机系统架构: 一个复杂的计算机系统架构包括:软件系统元素,元素之间的联系,元素本身有自己特有属性。 于是我们可以在架构角度参考计算机系统架构的实现。 架构建模 ? 业务是否重要且有很高的预期 是否可以让运营和PM介入 遵循迭代式的开放方法 领域模型好坏的标准: 模型反映了对于问题的抽象,抽象没有统一的标准 模型是迭代演进的,需要持续集成,改进 通用语言,领域模型和代码目标意图一致
为分析这个问题, 我们会从 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,进而报错防止数据进一步恶化。
为分析这个问题, 我们会从 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,进而报错防止数据进一步恶化。
,一旦出现故障,需要及时告警并及时处理等 虽然每一位架构师可能都清楚架构边界的重要性,事实却是一个边界清晰的软件架构,往往会随着时间的推移,慢慢变得混乱,最后变成让人迷路的依赖网: 如此,也就产生了代码的腐化 02 代码评审 频繁开展代码评审是避免代码腐化的最有效武器。然而,总是有许多团队和个人推说没有时间,而不开展代码评审。 这里所说的代码评审,可以有三种形式: 融入到CI/CD流水线的代码静态扫描 团队定期召开的内部代码评审(可以是每天或每周) 以提交流程方式运作的代码评审 如下图所示,是我为某客户制订的代码评审流程: 因此,我们需要将测试代码与产品代码等同视之,也需要纳入到代码评审的范围,并做到及时重构,持续不断的提升其代码质量。 结论 回归到Twitter的问题。 次之,如果在提交代码(包括测试和运维代码)时,能启动代码评审的流程,通过引入更多评审者,也许就能通过更多双慧眼及时发现问题。
在长期运转的项目中,架构的腐化是怎么产生的?为什么常见的面向对象技术无法解决这类问题?如何延缓架构的腐化? 本文将尝试解释这一切,并提出相应的解决方案。 本地构建超过5分钟的时候就变得难以忍受;大多数情况下你希望这个反馈时间越短越好。项目的初期往往会运行所有的步骤:编译所有代码,运行所有测试。随着项目周期的变长,代码的增多,时间会越来越长。 将独立的模块放入独立的进程 上面的解决方案核心原则只有一条:始终将核心代码库控制在团队可以理解的范围内。如果运转良好,能够很大程度上解决架构因为代码规模变大而腐化的问题。 如果不这么做,动辄上百万千万行的代码堆在一个系统中,随着时间的推移,开发者逐渐对代码失控,架构的腐化是迟早的事情。 针对每个应用,开发者能够在更小的代码内采用自己熟悉的技术方案,从而减少架构腐化的可能。 结语 没有糟糕的架构,变化使之 我访问过很多团队。
在长期运转的项目中,架构的腐化是怎么产生的?为什么常见的面向对象技术无法解决这类问题?如何延缓架构的腐化? 本文将尝试解释这一切,并提出相应的解决方案。 本地构建超过5分钟的时候就变得难以忍受;大多数情况下你希望这个反馈时间越短越好。项目的初期往往会运行所有的步骤:编译所有代码,运行所有测试。随着项目周期的变长,代码的增多,时间会越来越长。 将独立的模块放入独立的进程 上面的解决方案核心原则只有一条:始终将核心代码库控制在团队可以理解的范围内。如果运转良好,能够很大程度上解决架构因为代码规模变大而腐化的问题。 如果不这么做,动辄上百万千万行的代码堆在一个系统中,随着时间的推移,开发者逐渐对代码失控,架构的腐化是迟早的事情。 针对每个应用,开发者能够在更小的代码内采用自己熟悉的技术方案,从而减少架构腐化的可能。 结语 没有糟糕的架构,变化使之 我访问过很多团队。
代码执行漏洞 代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。 当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑到用户是否能控制这个字符串,将造成代码注入漏洞。 狭义的代码注入通常指将可执行代码注入到当前页面中,如php的eval函数,可以将字符串代表的代码作为php代码执行,当前用户能够控制这段字符串时,将产生代码注入漏洞 常见函数 eval和assert 回调函数 动态执行函数 preg_replace函数 1.eval()、assert()将输入的字符串参数作为PHP程序代码来执行 2.回调函数mixed call_user_ func ( callable count]]) $pattern正则匹配的内容 $replacement用于替换的字符串或字符串数组 $subject要进行搜索和替换的字符串或字符串数组 $pattern存在/e模式修正符修饰 允许代码执行
public static String toMD5(String plainText){ StringBuffer buf = new StringBuffer(""); try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(plainText.getBytes()); byte b[] = md.digest()
Python代码找bug(5) 上期的代码设计需求: 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 代码如下: ? 请大家仔细阅读代码,找出其中的bug! 正确答案:共有3个bug。(对答案时间,看看答对了几个?) (1)input()方法的返回值是字符串,需要强制类型转换才能参与计算。 代码如下: ? 大家注意到没有?这个代码很有意思! 循环语句肯定是要用到的,如果使用累计求和的办法是可以直接获得第N次落地时球经过了多少米的,累计折半(除以2)计算也可以直接得到最后反弹的高度的。 好了,问题是这段漂亮的代码也还是有些瑕疵的,bug在哪呢? 找出来,发到留言里,明天对答案。 提醒:惯例所有代码都是基于Pythpn3 的哦。
在长期运转的项目中,架构的腐化是怎么产生的?为什么常见的面向对象技术无法解决这类问题?如何延缓架构的腐化? 本文将尝试解释这一切,并提出相应的解决方案。 本地构建超过5分钟的时候就变得难以忍受;大多数情况下你希望这个反馈时间越短越好。项目的初期往往会运行所有的步骤:编译所有代码,运行所有测试。随着项目周期的变长,代码的增多,时间会越来越长。 将独立的模块放入独立的进程 上面的解决方案核心原则只有一条:始终将核心代码库控制在团队可以理解的范围内。如果运转良好,能够很大程度上解决架构因为代码规模变大而腐化的问题。 如果不这么做,动辄上百万千万行的代码堆在一个系统中,随着时间的推移,开发者逐渐对代码失控,架构的腐化是迟早的事情。 针对每个应用,开发者能够在更小的代码内采用自己熟悉的技术方案,从而减少架构腐化的可能。 结语 没有糟糕的架构,变化使之 我访问过很多团队。
PyQt5是Qt的Python绑定库,既有Qt的强大,又有Python语言的简洁,要实现一个实际场景的GUI程序的时候,确实非常实用而且代码量不是太多。 这里我总结了最近写一个界面时用到的代码片段,希望以后用到的时候能及时拾起来,也希望能帮助到别人。 此外我将这个内容也放到GitHub上,有兴趣的同学可以收藏下。 安装 目前PyQt主要是4和5版本,因为两者不兼容,因此官方建议使用PyQt5, 这里以Python3 为例进行说明。 PyQt5通过pip3来安装,同时别忘了需要安装SIP,这是将Python代码转换为C或C++代码的工具。 pip3 install PyQt5 SIP 安装好后可以使用下面这个代码片段测试安装是否成功,如果可以正常运行说明安装已经成功: import sys from PyQt5 import QtCore
所以,我在写第一遍的时候,只用了5行代码,就成功抓取了全部所需的信息,当时的感觉就是很爽,觉得爬虫不过如此啊,自信心爆棚。 reportTime=2017-12-31&pageNum=%s' % (str(i)))[3] 5 tb.to_csv(r'1.csv', mode='a', encoding='utf_8_ sig', hea 3000+ 上市公司的信息,安安静静地躺在 Excel 中 ▌不断完善 有了上面的信心后,我开始继续完善代码,因为5行代码太单薄,功能也太简单,大致从以下几个方面进行了完善: 增加异常处理 经过以上这几点的完善,代码量从原先的5行增加到了下面的几十行: 1import requests 2import pandas as pd 3from bs4 import BeautifulSoup 4from lxml import etree 5import time 6import pymysql 7from sqlalchemy import create_engine 8from
简单框架的搭建主要就是泛型T和抽象类(让子类去实现)的运用 抽取3中的代码,加载界面逻辑是一样的分别抽取到 BaseFragment和LoadingPage中。 FileUtils .getIconDir().getAbsolutePath(), 0.3f); } return bitmapUtils; }} UiUtils 添加这俩个方法,省略了代码的书写
试想,如果一个组件的代码还没加载完,就去渲染它,显然是不安全的。 所以,姑且狭义地认为组件代码已就绪的组件就是安全的,包括同步组件和已加载完的异步组件(React.lazy),例如: // 同步组件,安全 import OtherComponent from '. /AnotherComponent')); // ...等到AnotherComponent代码加载完成之后 // 已加载完的异步组件,安全 AnotherComponent Error Boundary 有个类似的东西是Error Boundary,也是 UI 层 try…catch 的一种,其安全的定义是组件代码执行没有 JavaScript Error: Error boundaries are AnotherComponent /> </Suspense> </MyErrorBoundary>
今天小颖给大家分享一个用CSS画的爱心,底下有代码和制作过程,希望对大家有所帮助。 第一步: 先画一个正方形。
我拿个简单的3列表格,上五行代码示例。 就跟我们在初中时候,班里男生各种与众不同的发型,全都让班主任剃成了5mm卡尺,军训头。教导主任根据发型,毫不费力就能知道,以前这个学生挺有个性的。 这样低频,置信度低的东西,他们的共性也被挖掘出来了。 交叉是有代价的,比如工地也有写代码的,但不是太多,交叉会让整个分布更加的长尾,对应着就更难学习了。 似乎,又带来了第一个问题,嗯没事,我们的频度统计把刺头又干掉了,美滋滋。
分享5个有趣的 JavaScript 代码 作者:matrix 被围观: 1,377 次 发布时间:2011-08-13 分类:Wordpress 兼容并蓄 | 无评论 » 这是一个创建于 以下代码拷贝到地址栏回车即可运行,赶紧试试吧。 1. 网页射击游戏 这个游戏可以在任何网页里面玩,把下面代码粘贴到地址栏回车,按空格键进行射击,W键可前进,A、D键或者方向键可改变射击方向。 让图片飞起来 只要把下面的代码贴到浏览器的地址栏里然后按Enter键,当前网页的所有图片都将动起来。 javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; var DI 把下面的代码贴到地址栏,按Enter键(貌似只有IE有效果)。
前言 我们以前的几个例子中都是直接使用设计器来制作的表单视图,实际在开发中经常会遇到使用代码来动态的添加控件到视图中。 ? 一般步骤是: 1.生成一个控件,比如new Button。 4.将收集到的值存储或其他处理 下面是生成表单的操作 for(int i = 0; i< 5 ; i++) { TableRow row = new TableRow(this _pnlContent.addView(row,layoutParams2); } _pnlContent.setColumnStretchable(1,true); 上面的代码演示了创建多个 toString(), et1.getText() )); } Toast.makeText(getApplicationContext(), sb.toString(), 0).show(); 如上面的代码显示 row.addView(editText); row.addView(btnRemove); tablleLayout.addView(row,layoutParams2); 全文完,代码下载
java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; /** * 该类将通过MD5对用户所输入的密码进行加密 * * @author gulf * @version 1.0 */ public class MD5Encrypt { /** * 该方法实现MD5加密 * @param password * @return * @throws NoSuchAlgorithmException */ public static byte[] encryptByMD5(String password //生成12位的随机值 random.nextBytes(salt); MessageDigest messageDigest = MessageDigest.getInstance("MD5" System.arraycopy(encryptPassword, 0, salt, 0, 12); MessageDigest messageDigest = MessageDigest.getInstance("MD5"