《Java工程师修炼之道》GitBook上线:https://rowkey-books.gitbook.io/pragmatic-java-engineer/
[译]使用Groovy的AST Transformation实现DSL
最近在看一些java开源项目时,发现不少是用gradle做为项目构建工具的。之前虽然也用过gradle,但是却没怎么仔细留意build.gradle的语法是groovy的。但这次再怎么看也觉得里面的好多语法都和以前用过的groovy都联系不到一起。各种懵逼状态。。。后来阅读了这篇文章,算是解答了一些疑问:http://www.cnblogs.com/CloudTeng/p/3418072.html。但是对于下面这种写法,还是不知道是怎么回事:
task copyFile(type: Copy){
from 'xml'
into 'destination'
}
copyFile做为task名称竟然不是一个字符串,阅读了groovy的文档也没发现字符串可以省略引号的说明(php中引号倒是可以省略),此外一个方法后面跟一个参数然后这个参数又跟着一个括号,这又是什么语法。。。凭直觉觉得这里的copyFile应该是一个方法,但是这时候copyFile还没有定义啊。。。
带着以上疑问,去翻了一下groovy的官方文档,凭感觉觉得gradle是利用了groovy的ast trasnfomation,也就是抽象语法树转换(故名思议,也就是能够转换groovy的语法树从而创造自己的一套语法)。那么到底是不是这样呢?http://blog.csdn.net/zxhoo/article/details/29830529给出了解释并证明了这个结论。但是groovy的ast transformation到底是什么东西呢?国外有一篇博客给出了比较清晰明了的讲述:http://www.jroller.com/DhavalDalal/entry/a_case_for_using_groovy。以下即对此篇博文的翻译。
JDK自带工具之概览
在我们平常对java程序进行问题排查、性能调优时,如果没有合适的工具,很多时候会事倍功半,甚至无法继续进行下去。其实,jdk自身已经提供了很多强大的工具供我们使用。本文就对这些工具做一个概览性的描述。
笔者的开发环境是:OS X EI Captian 10.11.6
JDK版本:
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
JAVA_HOME/bin下的工具截图如下:
Java调优经验谈
BTrace原理浅析
之前在看agentzh的此篇博文动态追踪技术漫谈时,领会到了动态追踪技术的强大之处,也一直由于无法在不重启线上服务器的情况下排查线上问题在寻找Java中的动态追踪工具。在公司内部的JavaEE性能检测框架中,我们使用了asm做字节码注入来做线上性能的监测,沿着这个思路,如果要做到动态追踪应该是需要做字节码注入的,但是额外的一点是需要动态加载字节码替换掉原有的类的。此外,性能监测框架是需要耦合到业务应用中的,无法做到一个监测工具的灵活性。
后来听同事提到了BTrace这个工具,于是去尝试了一下。BTrace是SUN Kenai云计算开发平台下的一个开源项目,旨在为java提供安全可靠的动态跟踪分析工具。江南白衣的这篇文章http://calvin1978.blogcn.com/articles/btrace1.html做了比较详细的描述。
那么,BTrace这么神奇的功能是如何实现的呢?既然这是个开源的代码,那么直接从代码找原理。BTrace代码开源在https://github.com/btraceio/btrace。
推荐系统杂谈
推荐系统是近些年非常火的技术,不管是电商类软件还是新闻类app,都号称有精准的推荐系统能给你推送你最感兴趣的内容。现象级的资讯类app“今日头条”就得益于此成为了势头非常猛的一款产品。本文就针对推荐系统讲述一些相关概念和实践经验。
首先需要明确的就是推荐系统的目标,一般来说不外乎以下几个:
- 用户满意性:首当其冲的,推荐系统主要就是为了满足用户的需求,因此准确率是评判一个推荐系统好坏的最关键指标。
- 多样性:虽然推荐系统最主要还是满足用户的兴趣,但是也要兼顾内容的多样性,对于权重不同的兴趣都要做到兼顾。
- 新颖性:用户看到的内容是那些他们之前没有听说过的物品。简单的做法就是在推荐列表去掉用户之前有过行为的那些内容。
- 惊喜度:和新颖性类似,但新颖性只是用户没看到过的但是确实是和他行为是相关的,而惊喜度是用户既没有看过和他之前的行为也不相关,但用户看到后的确是喜欢的。
- 实时性:推荐系统要根据用户的上下文来实时更新推荐内容,用户的兴趣也是随着时间而改变的,需要实时更新。
- 推荐透明度:对于用户看到的最终结果,要让用户知道推荐此内容的原因。比如,“买过这本书的人同时也买过”、"你购买过的xx和此商品类似"。
- 覆盖率:挖掘长尾内容也是推荐系统很重要的目标。因此,推荐的内容覆盖到的内容越多越好。
谈谈互联网后端基础设施
本文更新于2018.09.14, 更新了后端基础设施框图,增加了负载均衡、Web服务器以及大数据存储和多维数据分析等部分
对于一个互联网企业,后端服务是必不可少的一个组成部分。抛开业务应用来说,往下的基础服务设施做到哪些才能够保证业务的稳定可靠、易维护、高可用呢?纵观整个互联网技术体系再结合公司的目前状况,个人认为必不可少或者非常关键的后端基础技术/设施如下图所示:
这里的后端基础设施主要指的是应用在线上稳定运行需要依赖的关键组件/服务等。开发或者搭建好以上的后端基础设施,一般情况下是能够支撑很长一段时间内的业务的。此外,对于一个完整的架构来说,还有很多应用感知不到的系统基础服务,如负载均衡、自动化部署、系统安全等,并没有包含在本文的描述范围内。
研发体系这点事
–本文于2016.08.23最新更新–
早在读研究生的时候,自己负责着实验室的项目,就一直在思索如何建立一套简单又高效的研发管理体系,能够在保证项目高质量顺利进行的同时还能够提升团队成员的技术level。后来在自己在校的几次小的创业中,也做过一些尝试。直到毕业后进入前东家,在几个项目的参与过程中,见到了大公司的研发管理是如何进行的。直至加入目前的公司,将研发体系梳理一遍,且学且抄且实践,对这一套东西算是有了一定的实践感悟。
对于一个研发管理体系,其核心是围绕着产品的整个生命周期来进行的。因此,根据一个产品的生命周期,可以把研发体系划分为几个关键的环节,如图所示:
更为具体的一个研发流程则如下图所示,标注了每一个环节的参与角色。
可知,即时沟通和技术提升虽然不属于研发流程中的某一个环节,但它们是贯穿整个研发体系不可或缺的一部分,有着不可替代的作用。此外,任务管理需要对任务做整个研发生命周期的管理,除了作为其中的一个关键环节,也是贯穿整个研发流程的。
[译]Java8 Top Tips
原文:https://dzone.com/articles/java-8-top-tips
本文包含了对于Java8的一些最佳实践,包括Stream和Lambda表达式的一些基础。
笔者已经使用Java8工作许多年,包括新的应用开发以及迁移旧的应用,感觉是时候总结Java8中一些有用东西的最佳实践。笔者个人不太喜欢“最佳实践”这个词,因为字面上传达了一种“one size fit all”的概念,当然,编码肯定不是这样的而是不同的场景有不同的解决方案。但是笔者觉得在如何使用Java 8让自己的生活变得更加容易上还是有一些特殊的经验值得分享的。
[译]StackOverflow: 你没见过的七个最好的Java答案
原文:https://dzone.com/articles/stackoverflow-7-of-the-best-java-answers-that-you
StackOverflow(后边简称so)发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。这篇文章是在我们审阅了so上最流行的Java问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。
Java后端工程师学习大纲
之前自己总结过的Java后端工程师技能树,其涵盖的技术点比较全面,并非一朝一夕能够全部覆盖到的。对于一些还没有入门或者刚刚入门的Java后端工程师,如果一下子需要学习如此多的知识,想必很多人会望而却步。
本文截取了技能树中的一些关键技能点,并辅以学习资料和书籍推荐,做为Java后端工程师的一个入门或者入职学习计划,基本上涵盖了一个合格的Java后端工程师必备的技能点,是一个相对完整的从基础到高级的修炼过程。当然,这只是一个大纲性指引的东西,也主要针对的是Java后端这个职位,并不会面面俱到,也不会很详细的讲述。毕竟其中每一个知识点深入下去都是可以成书的。另外,像数据结构、计算机网络等计算机科学基础知识,我认为是从事计算机专业的人必备的知识点,因此并不包括在内。如果要一个很全的知识点可以移步Java后端工程师技能树。
本大纲于2016.07.07最新更新^_^…