程序员的技术水平突飞猛进-最快的方法是什么?

程序员的技术水平突飞猛进-最快的方法是什么?

我觉得最快的办法,是深度参与1到2个流量非常大的系统。

这不是唯一的办法,但是最快的。当然也不是每个人都能遇到这种机会。

你唯一能做的,是好好准备,争取去到一个比较有可能有这样项目的公司和部门。

我自己就是这么过来的。职业的前五年,待过的公司都相当一般,做的事情没有啥难度,接触不到高并发的场景。真的,几乎没什么实质性的成长。

我也不是不努力,是努力的方向和环境都不对。

后来想通了这件事,下了功夫准备,进了一家几亿用户规模的互联网公司。

进去之后,深度参与了C端商品系统的一次完整重构。32台机器,70万并发读请求,这是大促时的峰值数据。首页、搜索、商详页、购物车、下单、收藏夹、推荐,公司几乎所有面向用户的业务系统都依赖它,大促时商品域的流量在整个公司排第一。

在这种量级的系统里干活,和在小流量系统里完全是两个世界。小流量系统里干几年,你的思维方式会被限制在功能层面:这个接口能不能用、那个bug修了没有、需求文档里这个字段什么意思。到了70万并发的系统里,你想的事情完全不一样。缓存命中率够不够、GC停顿会不会拖慢响应、主从延迟会不会让C端用户读到旧数据、大促瞬间收藏夹涌入的流量要不要做隔离。

拿几个具体的技术决策来说。

  • 商品数据有好几个G,放不进JVM堆内存,硬放进去GC扛不住,所以我们得用堆外缓存,数据存在堆外的直接内存里,不参与GC扫描。
  • 运营频繁加字段,不可能每次都去DDL改表结构,所以用EAV模型,新增一个属性就是在表里加一行记录,不需要改表,不需要发版。
  • 十几个调用方需要的数据差异很大,首页只要名称和图片,商详页要全量信息,下单接口只要价格和库存,所以接口设计成Option模式,调用方通过传不同的枚举值按需取用,各取所需。

这些技术决策不是看书学来的,是被真实的业务压力逼出来的。你在小系统里干十年,也不会遇到这些问题,更不会去想这些方案。

深度参与这样的系统之后:

你真正体会到架构设计的作用了。

以前觉得架构设计就是画几张图、写写文档,走个流程。在大流量系统里你才明白,架构设计是从架构层面先确保系统的稳定性。

  • 缓存分几层
  • 每层承担什么职责
  • 读写怎么隔离
  • 流量怎么灰度切换
  • 降级策略怎么定
  • 主从延迟怎么兜底

这些架构层面的决策直接决定了系统在峰值流量下能不能扛住。架构没设计好,后面写再多代码也补不回来。

这种认知,只有在大流量系统里被打过、被压过,才能真正建立起来。

且你每行代码也都不能马虎。

注意,是每一行代码。

在这个量级下,每一种你认为不会出现的异常场景,都会出现。

超时、网络抖动、主从同步延迟、缓存击穿、消息重投递,你觉得概率极低的那些边界case,在70万并发下变成了日常。一个小疏忽,放在小系统里可能永远不会被触发,放在这个量级就是一次线上故障。小系统里一个接口响应慢了几百毫秒,用户感知不到,运维也不会告警。大流量系统里这几百毫秒乘以70万并发,线程池直接被打满,后面的请求全部排队超时,整条链路雪崩。

那份细心,那份对代码的敬畏,那份对技术的追求,都是在这种系统下一步一步磨出来的。

你可能会说,高并发不就是那几套固定的解决方案吗? 没有那么难,但是我想说的是,没有真正干过,永远都是只停留在:你有思路而已。

这是我想说的。

因此我才说大流量系统能让人快速成长?

但是呢,如我上面提到的,这种机会确实不是每个人都能遇到。大流量系统集中在互联网大厂和有相当规模的公司里,大多数公司的业务量到不了需要处理这些问题的程度。那怎么办?

我当年采用的超级笨的办法:

死扣JAVA基础技术。

因为只要有面试机会,我唯一能拿到比较好的分数,就只有这一条。毕竟我当时的履历实在太一般了。

当面试官觉得我基础还不错,可能会给机会。

当年我就是这么混入到大厂的。

纯属个人经历,仅供参考。