阿里高级技术专家,计算机行业从业10年+,有丰富的互联网大型分布式系统研发经验,目前致力于阿里集团CRM和商家CRM系统的研发。
> You should not be a if-else coder, should be a complexity conquer. -Frank # 前言 这篇文章,是对之前我在[《一文教会你如何写复杂业务代码》](https://www.atatech.org/articles/146064)说的“自上而下的结构化分解 + 自下而上的抽象建模”方法论的升级。因为在之前的方法论中,我
了解我的人都知道,我一直在致力于应用架构和代码复杂度的治理。 这两天在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。针对该命题,我进行了比较细致的思考和研究。
# 单一职责 ## 功能单一 功能单一是SRP最基本要求,也就是你一个类的功能职责要单一,这样内聚性才高。 比如,下面这个参数类,是用来查询网站Buyer信息的,按照SRP,里面就应该放置查询相关的Field就好了。 ```java @Data public class BuyerInfoParam { // Required Param private L
# 什么时候需要领域建模 软件的世界里没有银弹,是用[事务脚本](https://martinfowler.com/eaaCatalog/transactionScript.html)还是[领域模型](https://martinfowler.com/eaaCatalog/domainModel.html)没有对错之分,关键看是否合适。就像自营和平台哪个模式更好?答案是都很好,所以亚马逊可以有三
Alibaba国际技术事业部2018实习生招聘 职位方向: 前端开发,java后端开发,测试工程师 部门描述: 国际技术事业部承载着阿里巴巴集团国际化战略使命,致力于通过特色的国际化技术体系,运用大数据与智能计算能力,打造安全高效的eWTP平台,用技术的力量拓展阿里集团国际化的商贸边界。
#前言 从业这么多年,接触过银行的应用,Apple的应用,eBay的应用和现在阿里的应用,虽然分属于不同的公司,使用了不同的架构,但有一个共同点就是都很复杂。导致复杂性的原因有很多,如果从架构的层面看,主要有两点,一个是架构设计过于复杂,层次太多能把人绕晕。另一个是根本就没架构,ServiceImpl作为上帝类包揽一切,一杆捅到DAO(就简单场景而言,这种[Transaction Script]
亲们(Dev),天天和PD,QA,PE打交道,有没有仔细想过你和他们的关系是怎样?你们各自own的部分有边界吗?你们应该怎样协同工作? PD是产品需求的owner,PE是线上环境的owner,QA是产品质量的owner,Dev呢? Dev是everything的owner(That's why Dev engineer is so Niubility)。 所以准确的说应该是De
最近网上掀起了关于阿里KPI的大讨论,特别是@左耳朵耗子的一篇微博更是一石激起千层浪,讨论内容我就不赘述了,有兴趣可以自己去看。 我的观点是KPI还是很有必要的,因为“平均主义大锅饭”我们dang已经实践过了,发现不好使。 而为了消除平均主义,我还没有发现一个可以取代KPI考核制度更好的方案。也许有
本文介绍了NIO和BIO的工作原理,并通过一组性能测试,对NIO和BIO的性能进行对比,为如何选择NIO和BIO提供理论和实践依据。 # 术语介绍 **BIO** -- Blocking IO 即阻塞式IO。 **NIO** -- Non-Blocking IO, 即非阻塞式IO或异步IO。 **性能** -- 所谓的性能是指服务器响应客户端的能力,对于服务器我们通常用并发客户连接数+
看过源码有段时间了,对logback中对判定是否记录一条日志记录的优化印象比较深刻,整理如下,希望对你有所帮助。 Java的logger框架有一个重要的层级(hierarchy)的概念,按约定,是通过小数点来区别父子关系的,也就是名字为“x.y”的logger是“x.y.z”logger的parent。 Hierachy的命名规则
大家好: 我是阿里巴巴B2B的应用架构师,现在大量招聘Java工程师,对自己技术有信心的兄弟姐妹,请联系我吧。 给我留言, 也可以把简历发到我邮箱:fulan.zjf@alibaba-inc.com。
观察者模式 Observer 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。 观察者模式的组成 抽象主题角色 - Subject:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的
1. 从project创建archetype 在项目根目录下,运行 mvn archetype:create-from-project 创建的archetype工程在app_folder/target/generated-sources/archetype 目录下,其中archetype-resources包含用来创建原型项目的文件,META-INF/maven/arch
http://lyp0909.blog.51cto.com/508999/546865/
完全参考手册 还有谁比Nexus的出品公司sonatype更了解Maven的呢?so 戳下面的连接看reference http://books.sonatype.com/mvnref-book/reference/index.html Maven ArcheType ArcheType is a Maven project templating toolkit -
软件作为一本新兴学科,只有短短几十年的历史,相比较于土木工程这样有悠久历史的工程学,说软件工程还处在嗷嗷待哺的婴儿期,或是幼儿期一点也不为过,要真正形成一套理论完善,又能在实践上运用成功的软件工程学,我相信还有很长的路要走。正因为如此,软件工程作为一本学科,其发展也是相当迅速的,从学校课本里的正统的符合CMMI流程的瀑布模型,到实际接受度更高的敏捷开发,各种工程学和方法论可以说是百家争鸣、
正在阅读《发现你的优势》,感觉其内容平平,无外乎就是一种积极心理学,强调注重强化自身优势,而不是一味的克服弱点... 正在觉得乏善可陈的时候,看到了一个亮点,即发现优势的第三个革命工具- 用来描述你自身才干的统一语言。 也就是书中对优势进行描述的34个标签,积极(Positivity),包容(Inclusiveness),完美(Maximizer)等等 那么为什么统一语言显得这么重
what is HTTPS HTTPS = HTTP + TSL Hypertext Transfer Protocol Secure (HTTPS) is acommunications protocol forsecure communication over a computer network, with especially wide deplo
性能测试 BIO -- Blocking IO 即阻塞式IO NIO -- Non-Blocking IO, 即非阻塞式IO或异步IO 性能 -- 所谓的性能是指服务器响应客户端的能力,对于服务器我们通常用并发客户连接数+系统响应时间来衡量服务器性能,例如,我们说这个服务器在10000个并发下响应时间是100ms,就是高性能,而另一个服务器在10个并发下响应时间是500
操作系统的IO控制 在整个IO控制方式的发展过程中,始终贯穿着这样一条宗旨:即尽量减少主机对IO控制的干预,把主机从繁杂的IO控制事务中解脱出来,以便更多地去完成数据处理任务。为了缓和高速CPU和IO设备低速间的矛盾,现代操作系统使用通道技术,SPOOLING技术,以及缓冲技术可以做到IO操作由特殊的IO处理器(通道)负责执行,只是在IO开始和结束时,调用CPU中断处理,从而使CPU资源
本文主要是从软件的质量属性的角度,来分析大型分布式系统通常采用的架构方法。 1. 性能 (Performance) 性能是指系统的响应能力,性能测试经常要使用基准测试(Benchmark Test). 提高性能的办法: 异步化 - 使用消息系统 和 batch处理 缓存 - 有多重缓存策略,本地缓存,分布式缓存同步,缓存服务器。 系统分割(水平和垂直分割)- 数据库读写
在现代网站架构中,scalability 已经不再是可有可无的质量属性,而是决定着网站的生死攸关,所以稍微上规模的站点都不会只有一个web server,让internet clients 直接与其交互,出于安全性和scale out的考量,一般都会在web server 和用户之间设置Reverse Proxy server 或者 Load-Balancer, 又或者是RP 和 LB 的
基本原理 Sony微单,已经买了一年了,但是每天只会用iAuto扫射,昨天闲在家,花了点时间琢磨了下。 终于搞懂了 ISO Sensitivity (感光度),Aperture (光圈),Shutter Speed(快门速度,也就是曝光时间)这三个最基本要素。 不过这还要得益于下面这三篇非常非常好的文章: ISO http://photographylife.com/what-i
this this 在面向对象语言中,指代调用上下文对象,在js中,也是一模一样的概念,所以不管这个this出现在什么地方,只要追踪到当前调用对象是什么,那么this是什么也就一目了然了。 先看一个简单示例 (function(){ console.log("Normal function being invoked by: "+ this); })(); 输出:
正在看一本书《Brilliant Psychology》,里面提供了智商和情商的测试,去测了下, 发现自己智商和情商都还可以 智商测试:http://www.iqtestexperts.com/iq-test/instructions.php My IQ is 118 130 and above: Gifted 115–130: High intellig
刚刚看到一篇文章,说是好的程序员生产力是普通程序员的几倍,甚至上百倍。 文章是一个台湾人写的:http://blog.vgod.tw/2009/12/18/divine-code-10/ 对里面关于“工具” 和 “自动化” 的描述,有了一些新的领悟,故记录于此。 公司总是在强调,完成本职工作,只是meet,如果想exceed some 或是 exceed most, 一定要有创
函数 函数是JavaScript中特殊的对象,对函数执行typeof运算会返回字符串"function",因为函数也是对象,他们可以拥有属性和方法。 静态方法 函数在JS中定义了类的名字,任何添加到函数的属性都是类字段和类方法(类比Java中类的static variable 和 static method),下面代码起到Java里面static method的效果: va
自主开发一套消息中间件系统。 需求: 1、保证能在大规模分布式环境下发送接收消息。 2、消息发送者(Producer)能够简单、容易的发送Event。 3、所有的Event都能被注册监听该Event的消息接收者(Consumer)处理至少一次。 思路:
JQuery Object 和 DOM的区别 HTML DOM 定义了访问和操作HTML文档的标准方法。其中 document 是DOM 树的根对象 ,在浏览器宿主环境中,可以通过JS操作HTML DOM,例如: document.getElementById("intro").innerHTML; 如果将DOM element alert 出来,其显示为 [object H
1. Create a TLD (tag library descriptor) file namedmy-tags.tld. For more information, see Creating a Tag Library Descriptor. 例如: <taglib> <display-name>Raptor JSP Taglib<
定义: 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统和用户的应用软件的中间。 中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行和开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件,中间件是一类软件,中间件不仅要实现互联,还要实现应用之间的互操作;中间件是基于分布式处理的软件,最突
想写这篇文章很久了,这是个大话题,不是一时半会就能说清楚的。 所以准备花个一星期整理资料,把思路理清楚,然后再在Team里做个sharing:) 其实RESTFul是架构风格,并不是实现规范,也不一定非要用HTTP,但鉴于HTTP的普世性和 SOA的实现基本都基于HTTP实现。 这句话只对了前一半, 实际上REST和HTTP是息息相关的,是一种Web架构,WWW是世界最大型的分布式应用,
最近对service的API设计,在team内有些讨论,主要集中在API是足够抽象、通用好呢, 还是具体、易用好? 其实这个是要折衷的,通用的好处是以后更改API的可能性小,但坏处是想要通用,里面的字段就不能定义太死,不定义死,极端的例子是全部用Name/Value Pair,最通用,但client面对这些NV,根本不知道怎么去设值,这样的API很明显是不友好,难用的,而一个好的API应
算法题 公司现在的面试对算法要求很高,不妨开个贴,整理一下,弄出几个自己很熟悉又很有代表性的算法题,免得每次都要重新准备。 参考: http://blog.csdn.net/v_july_v/article/details/6543438 1. 有1000万条查询字符串记录,找出top 10 出现次数最多查询串。 用Hash Table 统计查询字符串出现次数,时间复杂度是O(
刚刚在InfoQ上看到这边文章,还挺有意思http://www.infoq.com/cn/news/2013/08/architecture-scrum 猪、鸡是什么意思? http://en.wikipedia.org/wiki/The_Chicken_and_the_Pig The fable of the Chicken and the Pig is used to illus
网络安全水很深,零碎的也看了不少资料,但是总觉得很飘渺,可能是平时主要是做应用开发,而真正实践密码设计(cryptography)和安全设计(security)的机会比较少. 刚刚看了几篇文章 listed as following,有一些A-Ha moment,也能把我现有的关于web安全的知识窜起来,故记录在此: http://gdp.globus.org/gt4-tutorial
一切皆为框 div、h1 或 p 元素常常被称为块级元素(block element)。这意味着这些元素显示为一块内容,即“块框”。与之相反,span 和 strong 等元素称为“行内元素”(inline element),这是因为它们的内容显示在行中,即“行内框”。 块元素的盒子模型(box model of block element) 块级元素:块状元
查看端口占用 查看8080端口使用情况: C:\>netstat -aon|findstr "8080" 结果:TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 8148 查看进程: C:\>tasklist|findstr "8148" 结果:tomcat6.e
参加完JavaOne 2013开发者大会,把听的东西总结一下,基本上是介绍Java的最新发展情况,和对未来的展望。 现在全球有9 million 的Java开发人员,Java语言除了在传统的Enterprise上发挥出色以外,在富客户端JavaFX也已经比Swing在性能上有很大提升,JME在嵌入式设备上也有长足进步。还有NetBean很好用,比eclipse好(是吗?持保留态度),an
其实EditPlus GUI中是没有此功能的,但可以很简单的用Regex实现。 例子:需要在一列后面追加‘,’ 将 48902252012 49009112010 48697121017 48539350015 48554479018 变为 48902252012, 49009112010, 48697121017, 48539350015, 4855447901
写作的关键是什么? 句子,句子是组成文章的基本单元,没有表达清晰,结构完整的句子,就不可能有好的文章。 此篇主要记录在阅读中遇到的好句子,好句式,好句型,以方便回顾。 Only倒装 在句首的only如果后面跟了副词、介词短语或从句等状语,则主句用倒装结构。 Only when you fully archived that, should you go ahead and m
1. 基础知识 字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对 2.常用字符集 ASCII编码: 上个世
1. 连接点和连接线工具(Connectors and connection point) 选择“连接点”,按住Ctrl键,可以在图形上设置连接点。 选择“连接线”,visio会自动提示在两个连接点之间,建立连接。 对连接线的操作: 键盘的Shift同时用鼠标拖动,可以调节选中节点及其相关线的位置及角度; 键盘的Ctrl同时用鼠标拖动,可以调节选中节点的位置及角度。
栈 特性: LIFO public class StackApp { public static void main(String[] args) { Stack stack = new Stack(10); stack.push(10); stack.push(20); stack.push(40); stack.push(80); stack.
简单排序 冒泡排序 public class BubbleSort { public static void main(String[] args) { ArrayBub a = new ArrayBub(20); a.insert(14); a.insert(144); a.insert(142); a.insert(56); a.insert(23);
What exactly does it mean? The Bridge pattern is an application of the old advice, "prefer composition over inheritance".It be
Override VS. Overload Simple Polymorphism (Override) :the object whose method is called is decided run-time. multi- polymorphism (Overload):the object which method is called is decided u
敏捷方法的核心思想 敏捷方法是适应型(Adaptive),而非可预测型(Predictive)。与传统方法不同,敏捷方法拥抱变化,利用变化来发展,甚至改变自己,最后完善自己。也就是要用重构(Refactoring) 敏捷方法是以人为本(people-oriented),而非过程为本(process-oriented)。传统方法把开发者看作一个生产要素(分析员,测试员,程序员)
管道-过滤器风格:每个构建都有一组输入和输出,数据输入构建,经过内部处理,然后产生数据输出。 主程序-子程序:面向过程的架构,所有的计算构件作为子程序协作工作,并由一个主程序顺序的调用这些子程序,构件用共享存储区交换数据。 面向对象风格:面向对象架构风格的特征是将数据标识和基本操作封装在对象中。这种模式的构件是对象,对象维护自身表示的完整性,对象之间通过消息机制进行通信,对
结构化系统建模 1.数据流图 DFD(Data Flow Diagram) 数据流图由数据流(data flow),加工(process),文件(data store),源 / 宿(Source / Sink)四部分组成。 数据流是有一组固定成分的数据组成,表示数据的流向,用箭头表示。它可以从源、文件流向加工,也可以从加工流向文件和宿,还可以从一个加工流向另一个加工。 加