Java
文章平均质量分 86
张建飞(Frank)
What doesn't kill you make you stronger!
展开
-
深入浅出日志体系(logback最佳实践)
日志是影响研发效能的关键因素之一,没有好的日志规范、日志框架、日志系统、日志实践,就不可能有高的研发效率。本文我会介绍一些这些年,我积累的一些我认为比较好的日志实践。原创 2022-11-23 09:50:50 · 12174 阅读 · 2 评论 -
COLA 4.0:应用架构的最佳实践
前几天和几个饿了么的同学聊天,一听说他们还在使用COLA 1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽。COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有缺陷,不仅没帮到他们,反而坑了他们,实在抱歉。实际上,我在COLA 3.0迭代的时候,已经举起奥卡姆剃刀,砍掉了很多东西。然而还不够,主要体现在对架构的思考还不够透彻。因此,经过仔细反思,有了这一版最新的COLA 4.0,期望回归初心,让COLA真正成为应用架构的最佳实践,帮助广大的业务技术同学,脱离酱缸原创 2020-12-09 19:27:54 · 230711 阅读 · 236 评论 -
应用架构COLA3.0:让事情回归简单
最近,阿里云的同学告诉我,COLA作为应用架构,已经被选入阿里云的Java应用初始化的应用架构选项之一。This is really something,于是,在这个里程碑节点上,我开始回过头来,重新审视COLA一路走来的得与失。COLA作为一种架构思想无疑是成功的。但是作为框架,个人感觉有点鸡肋之嫌。 特别是在简洁性上做的不好,感觉做了不少画蛇添足的事情。试想一下,有些功能我作为作者都很少去使用,我实在想不到,它为什么还有存在的理由。基于上面的思考,我做了这一次COLA 2.0 到 COLA 3原创 2020-06-26 23:45:46 · 20161 阅读 · 12 评论 -
实现一个状态机引擎,教你看清DSL的本质
最近在一个项目中,因为涉及很多状态的流转,我们选择使用状态机引擎来表达状态流转。因为状态机DSL(Domain Specific Languages)带来的表达能力,相比较于if-else的代码,要更优雅更容易理解。另一方面,状态机很简单,不像流程引擎那么华而不实。一开始我们选用了一个开源的状态机引擎,但我觉得不好用,就自己写了一个能满足我们要求的简洁版状态机,这样比较KISS(Keep It ...原创 2020-03-20 18:53:54 · 45112 阅读 · 35 评论 -
关于面向接口编程,你真的弄懂了吗?
什么是接口(What)百度说:接口泛指实体把自己提供给外界的一种抽象化物,用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。人类与电脑等信息机器或人类与程序之间的接口称为UI(User Interface ,用户界面)。电脑等信息机器硬件组件间的接口叫硬件接口。电脑等信息机器软件组件间的接口叫软件接口。牛津字典说:Interface: A p...原创 2019-11-02 23:23:35 · 10506 阅读 · 7 评论 -
复杂性应对之道 - 领域建模
为什么要领域建模软件的世界里没有银弹,是用事务脚本还是领域模型没有对错之分,关键看是否合适。就像自营和平台哪个模式更好?答案是都很好,所以亚马逊可以有三方入住,阿里也可以有自建仓嘛。实际上,CQRS就是对事务脚本和领域模型两种模式的综合,因为对于Query和报表的场景,使用领域模型往往会把简单的事情弄复杂,此时完全可以用奥卡姆剃刀把领域层剃掉,直接访问Infrastructure。我个人也是坚...原创 2018-03-19 17:39:07 · 30735 阅读 · 25 评论 -
Synchronized和Lock该如何选择
本文将从Synchronized和Lock的线程状态和同步算法的比较为切入点,深入探讨Java的并发处理和锁的机制。线程状态BLOCKED vs WAITING我们使用jstack将JVM的线程stack打印出来的时候,如果采用的是Synchronized进行并发同步的话会看到如下的日志: 如果采用的是Lock进行并发同步的话,会看到如下的日志: 类似的如果是调用j...原创 2018-05-21 22:36:04 · 8684 阅读 · 7 评论 -
复杂度应对之道 - COLA应用架构
前言从业这么多年,接触过银行的应用,Apple的应用,eBay的应用和现在阿里的应用,虽然分属于不同的公司,使用了不同的架构,但有一个共同点就是都很复杂。导致复杂性的原因有很多,如果从架构的层面看,主要有两点,一个是架构设计过于复杂,层次太多能把人绕晕。另一个是根本就没架构,ServiceImpl作为上帝类包揽一切,一杆捅到DAO(就简单场景而言,这种Transaction Script也还凑合...原创 2019-01-04 17:04:44 · 53309 阅读 · 18 评论 -
《代码精进之路:从码农到工匠》
我有一个梦想,我写的代码,可以像诗一样优美。我有一个梦想,我做的设计,能恰到好处,既不过度,也无不足。这种带有一点洁癖的完美主义就像一把达摩克利斯之剑,时刻提醒我不能将就、不能妥协。完美主义的代价是在很长时间里持续的迷茫和焦虑。甚至一度,我对软件行业是失望的,怀疑在软件的世界里,到底还有没有优雅的代码和整洁的架构。如果有的话,为什么所有的业务代码都像一座座“屎山”,既不优雅也不整洁,既晦涩又...原创 2019-06-21 10:59:51 · 11573 阅读 · 10 评论 -
复杂业务代码要怎么写
了解我的人都知道,我一直在致力于应用架构和代码复杂度的治理。这两天在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,我有了一些新的思考,在此分享给大家。我相信,同样的方法论可以复制到大部分复杂业务场景。一个复杂业务的处理过程业务背景简单的介绍下业务背景,零售通是给线下小店供货的B2B模式,我们希望通过数字化重构传统供应链渠道,提升供应链效率,为新零售助力。...原创 2019-08-01 18:33:14 · 18601 阅读 · 18 评论 -
应用架构COLA 2.0
很多同学不止一次和我反馈,我们的系统很混乱,主要表现在:应用的层次结构混乱:不知道应用应该如何分层、应该包含哪些组件、组件之间的关系是什么;缺少规范的指导和约束:新加一段业务逻辑不知道放在什么地方(哪个类,哪个包)、应该起什么名字比较合适?解决这些问题,正是我创建COLA的初心之一——试图探索一套切实可行的应用架构规范,这个规范不是高高在上的纸上谈兵,而是可以复制、可以理解、可以落地、可...原创 2019-08-26 11:58:28 · 81239 阅读 · 25 评论 -
SOFA企业应用框架
前言从业这么多年,接触过银行的应用,Apple的应用,eBay的应用和现在阿里的应用,虽然分属于不同的公司,使用了不同的架构,但有一个共同点就是都很复杂。导致复杂性的原因有很多,如果从架构的层面看,主要有两点,一个是架构设计过于复杂,层次太多能把人绕晕。另一个是根本就没架构,ServiceImpl作为上帝类包揽一切,一杆捅到DAO(就简单场景而言,这种Transaction Script也还凑合,...原创 2018-02-08 10:37:29 · 28369 阅读 · 12 评论 -
Head First WebService with CXF
1. Download apache cxf : http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip Download Spring: http://www.springsource.org/download2. Server side: WEB-I原创 2008-11-27 11:49:00 · 1642 阅读 · 0 评论 -
Nested Class
1. Why Use Nested Classes?There are several compelling reasons for using nested classes, among them:It is a way of logically grouping classes that are only used in one place.It increases encapsulation.Nested classes can lead to more readable and maintainab原创 2010-07-30 16:23:00 · 923 阅读 · 0 评论 -
Java中float,double为什么会丢失精度。
Effective Java Item 48: Avoid float and double if exact answers are required 对于精确计算不提倡使用float,double,因为会丢失精度,这是为什么呢? 让我细细说来1. 什么是浮点数?表示一个数字如100.2,可以是Fixed point也就是100.2,也可以是Floating point(也就是科学计原创 2011-11-19 10:19:17 · 2067 阅读 · 0 评论 -
如何使用EnumSet实现基于bit field的enum set?
如果我们在使用有一个枚举类型时,每次会用到其一项或多项(也就是enum set)时,会怎么做呢?在Java没有引入EnumSet之前,有一种叫int enum pattern(assigning a different power of 2 to each constant)的做法,例如一个字体的style的枚举会写成public static final int STYLE_BOLD原创 2011-11-09 17:03:16 · 1168 阅读 · 0 评论 -
JavaOne2013 开发者大会
参加完JavaOne 2013开发者大会,把听的东西总结一下,基本上是介绍Java的最新发展情况,和对未来的展望。现在全球有9 million 的Java开发人员,Java语言除了在传统的Enterprise上发挥出色以外,在富客户端JavaFX也已经比Swing在性能上有很大提升,JME在嵌入式设备上也有长足进步。还有NetBean很好用,比eclipse好(是吗?持保留态度),anyway原创 2013-07-25 23:48:06 · 1231 阅读 · 0 评论 -
创建自己的taglib 并打包入jar
1. Create a TLD (tag library descriptor) file namedmy-tags.tld. For more information, see Creating a Tag Library Descriptor.例如: Raptor JSP Taglib 1.0 2.0 r http://ebay.co原创 2013-11-14 14:34:00 · 1075 阅读 · 0 评论 -
Struts2 中的设计模式
1. Command Pattern基本定义: 把Command(Request)封装成对象,把发出命令(Invoker)的责任和执行命令(Receiver)的责任分割开,委派给不同的对象。责任划分有什么好处?责任约单一,内聚性越高,可重用的可能性越大,试想下,如果服务员不仅要点菜,还要去做菜,会是什么情景。为什么把Invoker和Receiver解耦好处多?类之间原创 2012-07-03 15:09:51 · 5701 阅读 · 4 评论 -
Maven
Maven ArcheTypeArcheType is a Maven project templa原创 2014-07-19 15:22:06 · 1307 阅读 · 0 评论 -
我的面试库
算法题公司现在的面试对算法要求很高,不妨开个贴,整理一下,弄出几个自己很熟悉又很有代表性的算法题,免得每次都要重新准备。参考: http://blog.csdn.net/v_july_v/article/details/65434381. 有1000万条查询字符串记录,找出top 10 出现次数最多查询串。用Hash Table,详细:http://blog.csdn.ne原创 2013-08-26 23:07:11 · 2039 阅读 · 0 评论 -
Maven Archetype
1. 从project创建archetype在项目根目录下,运行 mvn generate:create-from-project 创建的archetype工程在app_folder/target/generated-sources/archetype 目录下,其中archetype-resources包含用来创建原型项目的文件,META-INF/maven/archetype-原创 2014-12-08 20:01:34 · 2067 阅读 · 0 评论 -
DB design from UML to SQL
Basic structures: classes and schemesThe UML classA UML class (ER term: entity) is any “thing” in the enterprise that is to be represented in our database. It could be a physical “thing” or simp原创 2008-09-22 11:36:00 · 1168 阅读 · 0 评论