ARTS

ARTS 是陈浩(网名左耳朵耗子)在极客时间专栏里发起的一个活动,目的是通过分享的方式来坚持学习。

每人每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。

本周内容

本周的 ARTS你将看到:

  1. 成对翻转链表.
  2. 一文看懂分布式系统设计?
  3. Golang 为什么不推荐加等操作?
  4. 代码能力到底是什么能力?

Algorithm

本周的算法题是非常常见的一道题目: 成对翻转链表 Swap Nodes in Pairs.

如果说翻转链表是面试第一常考题目的话, 这道题应该至少是面试前三常考题了. 链表类的题都有个特点, 就是很多时候看着贼简单, 但是一旦动手开始写就很容易把自己绕晕. 所以能画图尽量先画图吧, 在自己把自己绕晕之前.

func swapPairs(head *ListNode) *ListNode {
    shead := &ListNode{Next: head}
    s := shead
    for s.Next != nil && s.Next.Next != nil {
        a, b := s.Next, s.Next.Next
        s.Next, a.Next, b.Next = b, b.Next, a
        s = a
    }
    return shead.Next
}

Review 文章推荐

本周的英文文章是 Scalable Web Architecture and Distributed Systems.

文章以一个图片网站(image hosting)为例介绍了一个 web 服务如何从单点模式扩展为一个使用分布式架构的服务. 这更像是一篇分布式系统的科普文章, 扫盲向, 没有很深入的原理和实现论证. 主要从服务拆分, 冗余服务(横向扩展), 数据分片这些方面介绍如何对服务和数据进行拆分. 然后又针对拆分后的服务和数据介绍了提升性能的一些方式, 比如怎样在系统中加入缓存, 以及如何使用代理服务(proxy), 数据索引, 负载均衡和队列.

一句话总结, 文章很基础, 但对于传统意义上的"分布式"系统架构介绍来说算是非常详细了.

Tip 编程技巧

  1. time.Duration 是以 nano second 为单位的 int64 类型, 如果有直接解析底层数据的地方最好考虑下这个单位问题.
  2. Go 中的变量 i += 1 到底有什么问题?

    经常看到推荐使用 i++ 但是不推荐使用 i += 1 的说法, 但一直没找到具体的原因, 现在猜测很可能是代码风格原因而非性能.
    当然如果涉及到对 map 的下标表达式进行 ++ 或者 += 1 这样的操作, map 的 kv 对中的 v 不允许取地址, 而无法进行自加操作. 当然这是另外一个问题了.

  3. Go 中的 break 可以跳出 select, 但只会跳出最近的块.
  4. map 不能对值类型的元素做修改? 看这里

    这可能是因为通过 map[key] 得到的值不可取地址导致的.

    关于 map 的实现原理可以看这里.

    每个桶中的tophash是8个原因是 每一个tophash是8位,8个tophash就是64位,64位是64位机的最小寻址空间。
  5. sync.Map

    amortized constant time(摊还常量时间) O(1).

  6. 字面量不能取地址, 比如这种 int(3) 直接取地址会报错&int(3).

Share 灵光一闪

代码能力, 可能包含的方向:

  1. 类似结构化思维的结构化代码编写能力, 或者通俗一点, 就是熟练运用各种设计模式, 能对架构逻辑和业务逻辑进行抽象封装或者解耦;
  2. 复杂逻辑的梳理能力, 能用比较清晰的代码表达一个相对复杂的逻辑, 这需要提前想好业务逻辑的关键节点, 在心里预编写或者想好处理方式;

本周阅读列表

  1. kafka 中的零拷贝技术
  2. Go语言设计与实现 Map

澎湃哥
45 声望6 粉丝