AlphaWang.com

Alpha's Programming Notes | 一个程序员的日常

Clean Code Summary

2019年在大团队内部组织了一个 Study Group,主要目的是一起学习、一起分享、一起成长;上个季度我们的一项重点是完成了《Clean Code》这本书的拆解和分享,本文是对其中最后一章的一个总结。其实最后一章是对全书的总结,随意本文也可以近似看成是对全书的总结吧。

原始总结请参考 https://github.com/AlphaWang/alpha-book-clean-code/tree/master/17_smells_heuristics

Redis Mind Map

最近梳理了下 Redis 知识图谱,画了个脑图,涵盖了 Redis 数据类型、持久化机制、主从、哨兵、集群、应用及运维;具体见下图:

Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

最近在研究分布式链路跟踪系统,Google Dapper 当然是必读的论文了,目前网上能搜到一些中文翻译版,然而读下来个人感觉略生硬;这里试着在前人的肩膀上重新翻译一遍这个论文,权当是个人的学习笔记,如果同时能给其他人带来好处那就更好了。

同时把译文放到了 github,如您发现翻译错误或者不通顺之处,恳请提交 github PR: https://github.com/AlphaWang/alpha-dapper-translation

摘要

现代互联网服务通常都是复杂的大规模分布式系统。这些系统由多个软件模块构成,这些软件模块可能由不同的团队开发、可能使用不同的编程语言实现、可能布在横跨多个数据中心的几千台服务器上。这种环境下就急需能帮助理解系统行为、能用于分析性能问题的工具。

本文将介绍 Dapper 这个在 Google 生产环境下的分布式系统跟踪服务的设计,并阐述它是如何满足在一个超大规模系统上达到低损耗(low overhead)、应用级透明(application-level transparency)、大范围部署(ubiquitous deployment)这三个需求的。Dapper 与其他一些跟踪系统的概念类似,尤其是 Magpie[3] 和X-Trace[12],但是我们进行了一些特定的设计,使得 Dapper 能成功应用在我们的环境上,例如我们使用了采样并将性能测量(instrumentation)限制在很小一部分公用库里。

JMM: Java Runtime Data Area

下图展示了JVM的主要结构: user icon

可以看出,JVM主要由以下几部分组成: - 类加载器子系统 - 运行时数据区(内存空间) - 执行引擎 - 本地方法接口

运行时数据区又分为: 1. 程序计数器 2. Java栈 3. 本地方法栈 4. 方法区 5. 堆

Google Guava: 2. Collections

Please ref to the demo code: git clone https://github.com/AlphaWang/guava-demo.git

The Guava library has its history rooted in working with collections, starting out as google-collections. The Google Collections Library has long since been abandoned, and all the functionality from the original library has been merged into Guava.

Google Guava: 1. Dealing With Null

Please ref to the demo code: git clone https://github.com/AlphaWang/guava-demo.git

Many of Guava’s utilities are designed to fail fast in the presence of null rather than allow nulls to be used.

com.alphawang.guava.ch1.optional.Test1_FailFast

1
2
3
4
5
6
7
8
  // Lists.newArrayList()
  public static <E> ArrayList<E> newArrayList(E... elements) {
    checkNotNull(elements);
    int capacity = computeArrayListCapacity(elements.length);
    ArrayList<E> list = new ArrayList<E>(capacity);
    Collections.addAll(list, elements);
    return list;
  }

Additionally, Guava provides a number of facilities both to make using null easier, when you must, and to help you avoid using null.

Is the Improvement of String.substring() in Java7 Really Reasonable?

String#substring()在Java6和Java7中的实现是不一样的。这是因为Java6的实现可能导致内存问题,所以Java7中为了改善这个问题修改了实现方式。那么Java7中的实现就真的合理吗?

首先让我们来猜测一下,Java是如何实现substring功能的。由于String是不可变的,可能我们会猜测实现机制如下图:

user icon

How String in Switch Works in Java 7

支持switch字符串是Java7增加的一个新特性,那么它的底层是如何实现的呢?我们来看一个switch String的例子,然后分析编译器是如何处理的。