敏捷实践经验分享,企业如何在敏捷开发中实施DoD
一、什么是DoD? 当你有两个或更多的人参与同一个事情的时候,我们的“团队”就产生了,这时我们最重要的事情,就是要设定和统一团队的期望值,在本文中,这就是“完成标准”。 一个迭代做完后,团队要进行验收,来决定本个迭代是否完成。但每个团队对于是否完成无法达成统一,有的认为编码完成,就表示任务完成了;有的认为还需要简单自测一下,确保功能可以正常使用;还有的认为需要把自动化用例写完并测试通过才算完成。 为了避免这个问题,在敏捷软件开发中,常用Definition of Done“完成的定义”来表示工作是否已完成,不同的活动有不同的完成定义。首先要知道,所有的DoD都不是一成不变的,在随着时间的推移、经验的积累、成员的变更、项目的变更,我们的DoD也会有很大的不同,所以,我们也需要定期地检查和改进。...阅读全文
敏捷开发的那些事
“敏捷”这个词近几年非常火,经常会有人问:“我们应该怎样开始做敏捷?”或者:“能不能来帮我们推一下敏捷?敏捷有很多实践,管理的、工程的都有,但敏捷绝非我们看到的站会、持续集成、TDD等那么简单,真正的敏捷体系是从理念到文化的一次变革。 敏捷作为一种快速应对需求变化的新兴软件开发模式,正受到越来越广泛的关注和应用。它强调快速验证,表现为快速上线、快速根据反馈迭代产品。 今天在这里给大家推荐一款敏捷项目管理平台—CORNERSTONE,那么,究竟是什么样的呢?让我们一起来体验吧~ CORNERSTONE 敏捷项目管理解决方案特点为全角色、全流程、支持中大型团队: 提供包含项目管理、产品、运营、研发、测试等各职能角色在内的完整解决方案。 为需求管理、迭代规划、进度跟踪等经典 Scrum 环节提供工...阅读全文
Jackson 快速入门 - 捏造的信仰
捏造的信仰 2.3k Jackson 快速入门 java jackson json 发布于 7月14日 本文是对 Jackson 的快速入门介绍,主要分为四部分: 基本使用 基础配置 自定义序列化/反序列化 对泛型的处理 上面这几个话题足以覆盖日常开发的场景了。限于篇幅所限,本文力求读者读完后能掌握 Jackson 在日常使用中的绝大部分场景,以及了解如何着手探索 Jackson 的深层定制。 基本使用 引入 Jackson 本文假设读者熟悉 Maven 的使用,那么只需要在项目中添加下面的依赖关系就可以了:
一文探讨堆外内存的监控与回收 | 徐靖峰
引子记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存(HeapByteBuffer)作为缓冲区,读写文件,逻辑可以说相当简单,但根据监控,却发现堆外内存(DirectByteBuffer)飙升,导致了 OutOfMemeory 的异常。 由这个线上问题,引出了这篇文章的主题,主要包括:FileChannel 源码分析,堆外内存监控,堆外内存回收。 问题分析 & 源码分析根据异常日志的定位,发现的确使用的是 HeapByteBuffer 来进行读写,但却导致堆外内存飙升,随即翻了 FileChannel 的源码,来一探究竟。 FileChannel 使用的是 IOUtil 进行...阅读全文
log4j.xml的实用例子 - guogangj
大多数讲log4j配置的教程用的都是log4j.properties文件,我觉得xml或许更好一点,在这里我提供一个我已经用于生产环境的log4j.xml的例子,先上代码,然后再解释:
JVM运行时内存数据区域
JVM运行时内存数据区域 2018-01-20 Tommy.Tesla JVM 虚拟机栈 方法区 Java堆 运行时常量池 1 讨论背景 周志明老师写的《深入理解Java虚拟机》应该很多程序员都读过,第二章中阐述了Java虚拟机在执行Java程序的过程中是如何管理内存的,以及这些内存是如何被划分成更细的逻辑区域的。如下图所示,按照书中的论述JVM运行时数据区域包含以下几个数据区[1]。 按照《Java虚拟机规范(Java SE 7版)》,各区域的功能简要介绍如下: 程序计数器:各线程私有。用于记录每个线程下一条待执行的字节码指令以及相关信息。这是唯一的不会抛出OOM异常的区域。 Java虚拟机栈:各线程私有。虚拟机栈由一个个的栈帧组成,每个栈帧包含了对应方法执行所需要的信息,具体包括:局部变...阅读全文
CORNERSTONE对话腾讯&华为敏捷专家
由[CORNERSTONE](https://www.cornerstone365.cn/)主办的“深圳敏捷狂欢大会”圆满落幕。此次活动集齐了敏捷领域的大咖与近百位敏捷研发爱好者到场,会上大家通过提问互动与敏捷大咖产生了精彩的思想碰撞,大家就敏捷开发如何落地及技术人员如何转型晋升这两个话题做了深度探讨. 以下为敏捷专家薛军和李林在敏捷狂欢大会上的演讲分享  为什么腾讯产品最好 2017年5月份,网上有一份关于移动APP月活跃度的排名数据,在这份排行榜中,前十四名里,腾讯的产品就占了七款。 这个耀眼的数据足以说明,腾讯的产品是有多受欢迎。 腾讯的产品为什么会那么好呢?其...阅读全文
一分钟让你学会PDCA循环项目管理模式
某家婴儿车公司的CEO接到了一个严重的产品质量问题投诉,句句在理,针针见血。CEO非常重视,紧急召开高阶主管会议,研究对策。讨论几小时后,各部门都有不少改进的提议,执行长也提出很多要求。最后执行长说:「不看广告看疗效,大家要立刻行动起来。散会。」 CEO对大家的态度都很满意。直到有一天,他问负责产品的副总裁:「上次开会时,我让你派人去德国考察一下他们的质量管理体系,你们去了吗?感觉怎么样?」 副总裁说:「啊?我正在忙质量改进的事,还没空想这件事,真要去考察啊?」 这么重要的事情,副总裁居然没放在心上。为什么会这样?是因为副总裁笨吗?是因为他缺乏执行力吗?都不是。因为这家公司缺少一种叫作「PDCA循环」的管理文化。  { //do send } @Async //有返回类型 public Future...阅读全文
TreeMap 实现原理
在用TreeMap之前我们要对TreeMap有个整体的认识。 1、TreeMap介绍 TreeMap是一个通过红黑树实现有序的key-value集合。 TreeMap继承AbstractMap,也即实现了Map,它是一个Map集合 TreeMap实现了NavigableMap接口,它支持一系列的导航方法, TreeMap实现了Cloneable接口,它可以被克隆 TreeMap introduction:A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided a...阅读全文
spring中的@Transactional注解使用注意点_徐靖峰的专栏
@Transactional可以说是spring中最常用的注解之一了,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,最典型的例子如下。 @Service public class StudentService { @Autowired StudentDao studentDao; @Transactional public void innerSave(int i) { Student student = new Student(); student.setName("test" + i); studentDao.save(student); //i=5 会出现异常 int a = 1 / (i...阅读全文
Apache Thrift系列详解(二)
前言 Thrift提供的网络服务模型:单线程、多线程、事件驱动,从另一个角度划分为:阻塞服务模型、非阻塞服务模型。 阻塞服务模型:TSimpleServer、TThreadPoolServer。 非阻塞服务模型:TNonblockingServer、THsHaServer和TThreadedSelectorServer。 TServer类的层次关系: 正文 TServer TServer定义了静态内部类Args,Args继承自抽象类AbstractServerArgs。AbstractServerArgs采用了建造者模式,向TServer提供各种工厂: 工厂属性 工厂类型 作用 ProcessorFactory TProcessorFactory 处理层工厂类,用于具体的TProcessor...阅读全文
并查集(Union-Find)算法介绍_网络_不忘初心,好好沉淀
本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。 更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。 原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。 关于动态连通性 我们看一张图来了解一下什么是动态连通性: 假设我们输入了一组整数对,即上图中的(4, 3) (3, 8)等等,每对整数代表这两个points/sites是连通的。那么随着数据的不断输入,整个图的连通性也会发生变化,从上图中可以很清晰的发现这一点。同时,对于已经处于连通状态的points/sites,直接忽略,比如...阅读全文
golang拾遗:为什么我们需要泛型 - apocelipes
从golang诞生起是否应该添加泛型支持就是一个热度未曾消减的议题。泛型的支持者们认为没有泛型的语言是不完整的,而泛型的反对者们则认为接口足以取代泛型,增加泛型只会徒增语言的复杂度。双方各执己见,争执不下,直到官方最终确定泛型是go2的发展路线中的重中之重。 今天我们就来看看为什么我们需要泛型,没有泛型时我们在做什么,泛型会带来哪些影响,泛型能拯救我们吗? 本文索引 没有泛型的世界 暴力穷举 依靠通用引用类型 动态类型语言的特例 动静结合 使用interface模拟泛型 interface会进行严格的类型检查 内置类型何去何从 性能陷阱 复合类型的迷思 最后也是最重要的 泛型带来的影响,以及拯救 彻底从没有泛型的泥沼中解放 泛型的代价 没有泛型的世界 泛型最常见也是最简单的需求就是创建一组操...阅读全文
为什么必须是final的呢?
一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话,那下面这种风格的代码对你来说应该不陌生: 1 2 3 4 5 6 7 8 9 public void tryUsingGuava() { final int expectedLength = 4; Iterables.filter(Lists.newArrayList("123", "1234"), new Predicate
使用 Checkstyle 检查代码风格
"一千个读者眼中有一千个哈姆雷特". "一千个开发者键盘之下, 可能有一千零一种代码风格". 背景 本文所有代码可以从 GitHub 获得. 每个开发者都会有自己喜欢的代码风格, 但当多个开发者需要协作开发一个项目的时候, 如何避免产生图中这样的"圣战"呢. Checkstyle 是一款能够帮助开发者编写遵循一定规范的 Java 代码的工具. 它默认支持 Google 的代码风格规范和 Sun 的代码风格规范, 这两种风格规范和大多数开发者平时使用的代码风格比较相近, 因此通常能够被大多数开发者接受. Checkstyle 也是高度可定制的, 可以根据自己/公司/组织的情况进行配置. 目标 通过本文, 你将了解到: 如何通过 Maven 插件, 在打包(或测试)期间自动检查代码风格; 如何配...阅读全文
Flink的窗口介绍
Flink的Watermark细节介绍一文中提到了Watermark其实主要就是解决Event Time + Window中的数据完整性问题的,本文作为那篇文章的补充,再介绍一下Window这个概念。关于这部分,我觉得官方文档已经介绍的非常详细了,如果你是Flink使用者,强烈建议好好读几遍。我这里就主要概括性的介绍一下,作为前面文章的补充,同时解决前文遗留的一个问题。What & Why什么是Window?为什么需要Window?流处理里面一般都是事件驱动的(Spark是微批),即每个事件来就会触发算子(Operator)进行计算,典型的比如map、flatmap、filter等,这些都是无状态的计算。有些时候需要在流处理里面进行有状态的计算,比如电商场景分析1分钟的访问人数、购买人数各是...阅读全文
超好用的自带火焰图的 Java 性能分析工具 Async
如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然。别慌,这里有一款低开销、自带火焰图、让你大呼好用的 Java 性能分析工具 - async-profiler。 最近 Arthas 性能分析工具上线了火焰图分析功能,Arthas 使用 async-profiler 生成 CPU/内存火焰图进行性能分析,弥补了之前内存分析的不足。在 Arthas 上使用还是比较方便的,使用方式可以看官方文档。这篇文章介绍 async-profiler 相关内容。 Arthas 火焰图官方文档:alibaba.github.io/arthas/prof… 如果你想了解更多 Arthas 信息,可以参考之前文章:Arthas - Java 线上问题定位处...阅读全文
华为敏捷项目管理实践分享
当前,企业面对的商业环境瞬息万变,移动、社交、物联网、云计算、大数据、AI等蓬勃发展。新技术突飞猛进的同时,新业务形态越来越复杂、需求变化越来越快、软件规模越来越大、交付周期越来越短、开发和维护成本越来越高,产品交付的风险急剧增加,传统研发模式无法适应快速变化的市场需求。 为了应对这些挑战,业界软件开发模式经历了持续的改进和变迁,从20世纪60年代作坊式开发,到80年代过程控制模型,到2001年敏捷、DevOps模式探索。 关于复杂业务治理的方法论,介绍一种多维度分析问题的方法:矩阵分析法。You should not be a if-else coder, should be a complexity conquer.——Frank这篇文章,是对之前我在《阿里高级技术专家方法论:如何写复杂业务代码?》说的“自上而下的结构化分解 + 自下而上的抽象建模”方法论的升级。因为在之前的方法...阅读全文
Mybatis处理动态占位符实现 - Griez
背景 最近做一个打招呼需求,打招呼的内容类似模板形式,但是模板中有动态占位符,比如: 老乡式打招呼 -> “你好,我也是 xxx 的,我们是老乡呀!”(老乡见老乡,少来这套,来了就是深圳人) 高学历牛逼式打招呼 -> “你好,我是 xxx 高材生,很高兴认识你!” (我心想,谁TM稀罕) 炫富式打招呼 -> “你好,我年薪 xxx,能和你交个朋友么?”(你是想做py交易吧) 模板就是这么简单,内容中的 xxx 是动态的,根据用户信息改变。看到这里的你是不是已经开始躁动了, String.replace()不就解决问题了么?是的,如果你是这么做的,那么恭喜你能快速完成任务! 我这人想的比较多,如果PM后面要把模板改成一个文案中有多个 xxx ,并且多个 xxx 位置顺序不确定的情况怎么办?想到...阅读全文
ICMP端口号问题_听闻的技术博客_51CTO博客
ICMP端口号的深思朋友面试的时候回来问我:小温,说一下ICMP的端口号是多少呢?当时我也懵了,我是这样回答的:ICMP是Internet控制报文协议,没有端口号吧?这个不太清楚啊。呵呵,一个常见的协议问题,很纠结:所以稍作总结:ICMP简介:ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP功能:从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性...阅读全文
Unicode与UTF-8/UTF-16/UTF-32的区别 - 刘宝成
Unicode与UTF-8/UTF-16/UTF-32的区别 Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。 因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符 是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在 UTF-8和ASCII中,“A”的编码都是0x41. UTF-16和UTF-32分别...阅读全文
Netty 中的 Future & Promise
Netty 源码中大量使用了异步编程,从代码实现角度看就是大量使用了线程池和 Future。熟悉 Java 5 的同学一定对 Future 不陌生。简单来说就是其代表了一个异步任务,任务将在未来某个时刻完成,而 Future 这个接口就是用来提供例如获取接口、查看任务状态等功能。Netty 扩展了 Java 5 引入的 Future 机制。从下面的类图我们可以看到相关类的关系:Netty 的 Future 接口需要注意的是,上面类图中有两个 Future,最上面的是 java.util.concurrent.Future,而其下面的则是 io.netty.util.concurrent.Future。JDK 的 Future 对象,该接口的方法如下:// 取消异步操作 boolean can...阅读全文
如何做好项目管理,避免“计划”和“执行”两张皮?
“凡事预则立,不预则废”,对于计划的重要性,古人早有名言。然而,现代生活压力过大,很多人忽略了计划的重要性,总以“计划永远赶不上变化”、“人生总是充满意外”等等借口来搪塞自己,认为“船到前头自然直”,做任何事情从不制定计划,糊里糊涂,想做就做,事情自然难以取得成功。 好的计划是成功的一半。任何事情,要取得成功,离不开一个科学合理的计划。在项目管理领域中,项目计划同样扮演者非常重要的角色。好的项目计划是项目实施的前提,贯穿整个项目活动,它能够帮助项目经理理清整个项目的脉络,确定项目实施成功所需要的步骤以及每个步骤的先后顺序,合理安排好人力、物力和财力,确保项目有条不紊地执行,并取得预期的目标。 何谓好的项目计划呢?关键在于制定的计划要科学合理。首先,不要为了计划而计划。项目计划的制定主要用于指...阅读全文
JDK动态代理与运行时织入字节码
blog.csdn.net/u010061691/…java jdk动态代理其实是动态生成字节码与反射机制的一个结合,说到反射机制很多人都用到过反射,只要得到对应类的Class对象即可,调用方法,获取成员变量等等,那么jdk的动态代理就是在程序运行的过程中,动态的将我们维护的检查性的代码,放在正常的业务代码之前,那么怎么调用我正常的业务代码呢,因为业务可能有很多种,也就是说可能会有不同的类,但是都要执行相同的检查性代码,如我们要取钱,或者是修改身份证,都必须验证通过才可以,这显然是两个类,一个是Money,一个是ID,所以我们在调用正常业务代码的时候,其实不知道我们调用的是谁的代码,这时候就用到反射,通过反射,动态的识别类型,然后再调用方法,如我们要取钱,那么传入的应该是一个Money的实例...阅读全文