左耳听风

成长

  • 如何利用技术变现
  • 如何面试
  • 如何选择新的技术
  • 如何学习
  • 如何管理自己的时间
  • 如何管理自己的老板和工作
  • 如何成为一个 Leader

管理

  • 人员招聘
  • 绩效考核
  • 提升士气
  • 解决冲突
  • 面对变化
  • 沟通说服
  • 项目管理
  • 任务排期
  • 会议
  • 远程管理

如何技术变现

  1. 程序员用手艺、技术养活自己,不依靠公司而活
  2. 提高工作效率,去研究那些难的,公司内外的核心技术
  3. 注重输出,输出技术、价值观,以帮助更多的人,提高自身影响力
  4. 关注市场需求、技术趋势
  5. 找到能够体现价值的地方
  6. 锻炼个人的动手能力
  7. 关注技术付费点 [挣钱|省钱]
  8. 找到有价值的信息源 [拒绝信息茧房,拒接大量无用信息]
  9. 输出观点和价值观
  10. 朋友圈很重要

数据安全

  1. 使用开源的框架必须实时关注其动态,特别是安全漏洞方面
  2. 任何公开的入口,都必须进行严格的安全检查
  3. 框架的选型十分重要,必须将安全考察进去

数据攻击手段

  • 利用程序框架或库的已知漏洞
  • 暴力破解密码
  • 代码注入
  • 利用程序日志不小心泄漏的信息
  • 社会工程学

数据管理问题

  • 只有一层安全
  • 弱密码
  • 向公网暴露了内部系统
  • 未及时对系统打安全补丁
  • 安全日志被泄漏
  • 保存了不必要保存的用户信息
  • 密码没有被合理地散列

技术领导力

  • 尊重技术,追求核心基础技术。
  • 追逐自动化的高效率的工具和技术,同时避免无效率的组织架构和管理。
  • 解放生产力,追逐人效的提高。
  • 开发抽象和高质量的可以重用的技术组件。
  • 坚持高于社会主流的技术标准和要求。

.

  • 帮人解决问题
  • 被人依赖

如何取得技术领导力

  • 能够发现问题
  • 能够提供解决问题的思路和方案, 并比较这些方案的优缺点
  • 能够做出正确的技术决定
  • 能够使用更加优雅、简单、容易的方式来解决问题
  • 能够提高代码或软件的扩展性、重用性、可维护性
  • 能够用正确的方式管理团队
  • 创新能力

  • 扎实的基础技术
  • 非同一般的学习能力
  • 坚持做正确的事
  • 不断得高对自己的要求标准

1. 基础知识

  1. C 语言
  2. 编程范式:有助于培养编程的抽象思维,提高编程效率,提高程序的结构合理性、可读性和可维护性,降低代码的冗余度,提高代码的运行效率。要学习编程范式,可以多了解各种程序设计语言的功能特性。
  3. 算法与数据结构
  4. 计算机系统原理:CPU 的体系结构(指令集 [CISC/RISC]、分支预测、缓存结构、总线、DMA、中断、陷阱、多任务、虚拟内存、虚拟化等),内存的原理与性能特点(SRAM、DRAM、DDR-SDRAM 等),磁盘的原理(机械硬盘 [盘面、磁头臂、磁头、启停区、寻道等]、固态硬盘 [页映射、块的合并与回收算法、TRIM 指令等]),GPU 的原理等。
  5. 操作系统原理与基础:进程、进程管理、线程、线程调度、多核的缓存一致性、信号量、物理内存管理、虚拟内存管理、内存分配、文件系统、磁盘管理等。
  6. 网络基础: OSI model, 物理层、数据链路层(错误重发机制)、网络层(路由机制)、传输层(连接保持机制)、会话层、表示层、应用层
  7. 数据库原理
  8. 分布式技术架构:负载均衡、DNS 解析、多子域名、无状态应用层、缓存层、数据库分片、容错和恢复机制、Paxos、Map/Reduce 操作、分布式 SQL 数据库一致性等。

2. 提升学习能力

  1. 筛选信息源
  2. 与大佬进行交流
  3. 举一反三的思考
  4. 不怕困难的态度
  5. 开放的心态

3. 正确的事情

  1. 提高效率
  2. 自动化
  3. 前沿技术
  4. 知识密集型
  5. 技术驱动

技术成熟度

  1. 有没有好的社区
  2. 有没有工业化标准
  3. 有没有杀手级应用
  4. 学习难度如何
  5. 有没有可以提高效率的开发框架
  6. 有没有大型技术公司做后盾
  7. 有没有解决软件开发中的痛点

如何做规划, 选择

  1. 客观审视自己
  2. 确定自己真正想要什么
  3. 长期主义
  4. 关注所得, 而非所失
  5. 避免从众

错误处理/资源释放/异常捕捉

  • C errno
    • 程序员一不小心就会忘记返回值的检查
    • 函数接口不干净, 正常值和错误值混淆在一起
  • C++ RAII (Resource Acquisition Is Initialization)
    • 资源清理
  • Go multiple return value r, err := some() 多返回值模式
  • Java try catch finally
  • JavaScript Promise

对于我们并不期望会发生的事, 可以使用异常捕捉; 对于我们觉得可能会发生的事, 使用返回值

错误处理范式

  • 统一分类的错误字典
  • 同类错误的定义最好是可扩展的
  • 定义错误的严重程度
  • 错误日志的输出最好使用错误码,而不是打印错误信息
  • 忽略错误最好有日志
  • 对于同一个地方不停的报错,最好不要都打印到日志中
  • 不要使用错误处理逻辑来处理业务逻辑
  • 对于同类的错误处理,采用相同的模式
  • 尽可能在错误发生的地方处理错误
  • 向上尽可能地返回原始的错误
  • 处理错误时,总要清理已分配的资源
  • 不推荐在循环体中处理错误
  • 不要把大量的代码都放在一个 try 语句中
  • 为你的错误定义清楚的文档以及每种错误的代码示例
  • 对于异步的方式,推荐使用 Promise 模式处理错误
  • 对于分布式系统,推荐使用 APM 相关软件

机器学习

基本方法论

  1. 要找到数据中的规律,你需要找到数据中的特征点。
  2. 把特征点抽象成数学中的向量,也就是所谓的坐标轴。一个复杂的学习可能会有成十上百的坐标轴。
  3. 抽象成数学向量后,就可以通过某种数学公式来表达这类数据(就像 y=ax+b 是直线的公式),这就是数据建模。

监督式学习

我们需要提供一组学习样本,包括相关的特征数据以及相应的标签。程序可以通过这组样本来学习相关的规律或是模式,然后通过得到的规律或模式来判断没有被打过标签的数据是什么样的数据。

  • 决策树
  • 朴素贝叶斯分类
  • 最小二乘法
  • 逻辑回归
  • 支持向量机
  • 集成方法

非监督式学习

数据是没有被标注过的,所以相关的机器学习算法需要找到这些数据中的共性。因为大量的数据是没有被标识过的,所以这种学习方式可以让大量未标识的数据能够更有价值。

  • 聚类算法
  • 主成分分析
  • 奇异值分解
  • 独立成分分析

recommend courses

  • 吴恩达教授 - coursera
  • 卡耐基梅隆 Tom Mitchell - 机器学习课程
  • 加利福尼亚理工学院 Yaser Abu-Mostafa Learning from Data
  • Machine Learning Recipes with Josh Gordon
  • Practical Machine Learning Tutorial with Python Introduction
  • Machine Learning - 101 (Medium)
  • Machine Learning for Humans (Medium)
  • i am trask

时间管理

  • 主动管理时间
  • 学会说不 不直接说不,有条件说是 积极主动的态度下对于不合理的事讨价还价
    • 当你面对做不到的需求时,你不要说这个需求做不到。尤其是,你不要马上说做不到,你要先想一下,这样让别人觉得你是想做的,但是,在认真思考过后,你觉得做不到,并且给出一个你觉得能做到的方案。
    • 当你面对过于复杂的需求时,你不要说不。你要反问一下,为什么要这样做?这样做的目的是什么?当了解完目的以后,你可以给出一个自己的方案,或是和对方讨论一个性价比更好的方案。
    • 当你面对时间完全不够的需求时,你也不要说不。既然对方把压力给你,你要想办法把这个压力还回去,或是让对方来和你一同分担这个压力。
  • 过滤掉与自己目标无关的事, 不要让那些无关的事控制自己

投资时间

  1. 花时间学习基础知识,花时间读文档
  2. 花时间在解放自己生产力的事情上
  3. 花时间在让自己成长的事情上
  4. 花时间在建立高效的环境上

规划时间

  1. 定义好优先级
  2. 最短作业优先
  3. 想清楚再做
  4. 关注长期利益规划

故障处理

系统恢复

出现故障时,最重要的不是 debug 故障,而是尽可能地减少故障的影响范围,并尽可能地修复问题.

恢复系统的手段:

  1. 重启和限流
  2. 回滚操作
  3. 降级操作
  4. 紧急更新 - 自动化系统

故障前的相关准备

  1. 以用户功能为索引的服务和资源的全视图
  2. 为视图中的各个服务指定关键指标,以及一套运维流程和工具,应急方案
  3. 设置故障的等级
    1. 1 级是全站不可用;
    2. 2 级是某功能不可用,且无替代方案;
    3. 3 级是某功能不可用,但有替代方案;
    4. 4 级是非功能性故障,或是用户不关心的故障。
  4. 故障演练
  5. 灰度发布系统

故障复盘

  1. 故障处理的整个过程
  2. 故障原因分析
  3. 至少五个为什么
    1. 为什么从故障发生到系统报警花了 27 分钟?为什么只发邮件,没有短信?
    2. 为什么花了 15 分钟,开发的同学才知道是慢 SQL 问题?
    3. 为什么监控系统没有监测到 Nginx 499 错误,以及 Nginx 的 upstream_response_time 和 request_time?
    4. 为什么在一开始按 DDoS 处理?
    5. 为什么要重启数据库?
    6. 为什么这个故障之前没有发生?因为以前没有上首页,最近上的。
    7. 为什么上首页时没有做性能测试?
    8. 为什么使用这个高危的 SQL 语句?
    9. 上线过程中为什么没有 DBA 评审?
  4. 故障后续整改计划

根除问题

  1. 举一反三,解决当下的故障
  2. 简化复杂、不合理的技术架构、流程和组织
  3. 全面改善和优化整个系统、组织

分布式系统

五个关键技术:

  • 全栈系统监控
  • 服务/资源调度
  • 流量调度
  • 状态/数据调度
  • 开发和运维的自动化

.

  1. 提高整体架构的吞吐量, 服务更多的流量
    1. 大流量处理, 通过集群分散压力
  2. 提高系统的稳定性, 让系统的可用性更高
    1. 故障隔离
    2. 降级流转

克服分布式带来的问题

  1. 分布式服务的架构需要分布式的团队架构
  2. 分布式服务查错复杂
  3. 开发人员做所有的事情
  4. 运维优先,崇尚简化和自动化
  5. 内外服务一致

提高架构性能

  • 缓存
  • 负载均衡
  • 异步调用
  • 数据镜像
  • 数据分区

提高架构稳定性

  • 服务拆分
  • 服务冗余
  • 限流降级
  • 高可用架构 冗余架构
  • 高可用运维 CI/CD

关键指标

.

全栈监控

监控系统的指责:

  • 全栈监控
  • 关联分析
  • 跨系统调用的串联
  • 实施报警和自动处理
  • 系统性能分析

三层监控:

  • 基础层:监控主机和底层资源。比如:CPU、内存、网络吞吐、硬盘 I/O、硬盘使用等。
  • 中间层:就是中间件层的监控。比如:Nginx、Redis、ActiveMQ、Kafka、MySQL、Tomcat 等。
  • 应用层:监控应用层的使用。比如:HTTP 访问的吞吐量、响应时间、返回码,调用链路分析,性能瓶颈,还包括用户端的监控。

.

一个优秀的监控系统:

  1. 服务调用链跟踪 APM
  2. 服务调用时长分布 Zipkin
  3. 服务的 TOP N 视图
  4. 数据库操作视图
  5. 服务资源跟踪 (CPU, MEM, I/O)

服务调度

  • 服务关键程度和服务的依赖关系 一张清晰明确的关系地图
    • 绝对不能出现循环依赖
  • 服务状态和生命周期的管理
  • 流量与数据调度
    • 服务流控 - 服务发现, 服务路由, 服务降级, 服务熔断
    • 流量控制 - 负载均衡, 流量分配, 流量控制, 异地灾备
    • 流量管理 - 协议转换, 请求校验, 数据缓存, 数据计算

Best of API Gateway

  • 高性能
  • 抗流量
  • 业务逻辑 - AWS Lambda
  • 服务化 - API Server rather than config-file

PAAS

六大特征:

  • 分布式
    • 多租户隔离
    • 服务编排
  • 服务化
    • 软件模块复用
    • 服务治理
    • 对外提供能力
  • 自动化部署
  • 高可用
  • DevOps 敏捷
  • 分层开放

.

Network Fallacies

  1. 网络是稳定的
  2. 网络传输的延迟是零
  3. 网络的带宽是无穷大
  4. 网络是安全的
  5. 网络的拓扑不会改变
  6. 只有一个系统管理员
  7. 传输数据的成本是零
  8. 整个网络是同构的

编程范式游记

泛型编程

[[C|C语言]]的特性

  1. C 语言是一个静态弱类型语言, 使用变量时需要声明变量类型, 类型间存在隐式转换
  2. 使用 struct 声明新的数据类型
  3. 使用 typedef 关键字来定义类型的别名
  4. 一个有结构化程序设计, 具有变量作用域, 递归功能的过程式语言
  5. 参数传递一般以值, 也可以传递指针
  6. 通过指针, 可以对内存进行低级控制
  7. 编译预处理更具弹性

C 语言的范型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}


void swap(void *a, void *b, size_t size) {
    char tmp[size];
    memcpy(tmp, y, size);
    memcpy(y, x, size);
    memcpy(x, tmp, size);
}

[[CPP]]的优势

  • 用引用来解决指针问题
  • 用 namespace 解决冲突
  • 通过 try-catch 解决检查返回值的问题
  • 用 class 来解决对象的创建, 复制, 销毁的问题
  • 通过重载操作符实现操作上的范型
  • 通过 template 和虚函数的多态以及运行时识别实现更高层次的范型和多态
  • 用 RAII, 智能指针解决 C 中资源释放的问题
  • STL 解决算法和数据结构的问题

类型系统

类型是对底层内存布局的一个抽象

  • 保障语言的安全性
  • 利于编译器的优化
  • 代码的可读性
  • 抽象化

范型的本质: 一系列标准化

Generic programming centers around the idea of abstracting from concrete, efficient algorithms to obtain generic algorithms that can be combined with different data representations to produce a wide variety of useful software.

函数式编程

相关技术:

  • first class function
  • tail recursion optimization
  • map reduce
  • pipeline
  • recursing
  • currying
  • higher order function

Decorator 模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def hello(fn):
    def wrapper():
        print("hello")
        fn()
        print("bye")
    return wrapper

@hello
def main():
    print("main function")

面向对象编程

  • 封装
  • 继承
  • 多态

编程本质和逻辑编程

Program = Logic + Control + Data Structure

解耦控制与逻辑

  • State Machine
    • 状态定义
    • 状态变迁条件
    • 状态的 action
  • DSL - Domain Specific Language
    • HTML, SQL, Unix Shell Script, AWK
  • 编程范式
    • 面向对象
    • 函数式编程
    • 逻辑推导式编程

弹力设计

Possible Downtime (Planned/Unplanned)

Problem Variety

  • network
  • performance
  • security
  • devops
  • management
  • hardware

Bulkheads 隔离设计

  • business isolation
  • tenant

Asynchronous

  • request / response 请求响应
    • 轮询
    • callback
  • subscription 直接订阅
  • broker 中间人订阅
    • HA
    • horizontal scale
    • persistent

event driven architecture

why async

  • 解耦服务间依赖
  • 服务隔离性
  • 更大吞吐量
  • 削峰

how to async

  • 高可用的中间件 broker
  • 服务消息追踪机制

Idempotency

  • 全局 ID
    • snowflake
      • reserved 0 (1bit)
      • 41bits milli-seconds
      • 10bits machine serial number
        • 5bits data center
        • 5bits machine id
      • 12bits sequence number under current milli-second
  • 处理流程
    • insert into ... values ... on DUPLICATE KEY UPDATE ...
      • 避免 ID 冲突
      • 节省一次查询逻辑
    • MVCC 版本号
    • 多次 POST 问题解决方案
      • 表单中隐藏并传递唯一 token
      • 后端成功后向前端返回 302 跳转,把用户的前端页跳转到 GET 请求,把刚刚 POST 的数据给展示出来。如果是 Web 上的最好还把之前的表单设置成过期,这样用户不能通过浏览器后退按钮来重新提交 Post/Redirect/Get

Stateless Stateful

Service becomes stateless, but introduces more complicated architecture and unpredictable network situations.

Stateful - Sticky Session, Consistent Hash, DHT

Compensating Transaction

  • ACID - Consistent
  • BASE - Available

Retry

Spring retry policy

  • NeverRetry
  • AlwaysRetry
  • SimpleRetry (static retry times, default 3)
  • TimeoutRetry
  • CircuitBreakerRetry
  • CompositeRetry

Spring Backoff

  • NoBackOff
  • FixBackOff
  • UniformRandomBackOff
  • ExponentialBackOff
  • ExponentialRandomBackOff (avoid multiple services caused DDoS)

Circuit Breaker

Netflix Hystrix

Throttle

  • 拒绝服务
  • 服务降级
  • 特权请求
  • 延时处理
  • 弹性伸缩

限流方式

  • 计数器
  • 队列算法
  • 漏斗算法
  • 令牌桶算法

Degradation

Microservices Requirements

管理设计

Distributed Lock

  • Lock Service Features
    • Safety
    • DeadLock Prevention
    • Resilient
  • Design
    • 需要给一个锁被释放的方式,以避免请求者不把锁还回来,导致死锁的问题。Redis 使用超时时间,ZooKeeper 可以依靠自身的 sessionTimeout 来删除节点。
    • 分布式锁服务应该是高可用的,而且是需要持久化的。
    • 非阻塞方式的锁服务
    • 锁的可重入性

Configuration Management Center

Sidecar

Service Mesh

A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.

Service Mesh 这个网格一定要是高可靠的,或者是出现了故障有 workaround 的方式。一种比较好的方式是,除了在本机有 Sidecar,我们还可以部署一下稍微集中一点的 Sidecar——比如为某个服务集群部署一个集中式的 Sidecar。一旦本机的有问题,可以走集中的。

Gateway

  • high performance
  • high availability
  • extensible

性能设计

Cache

  • cache aside
  • read/write through
  • write behind caching

ASYNC

当程序读写文件时,我们的操作系统并不会真正同步地去操作硬盘,而是把硬盘读写请求先在内存中 hold 上一小会儿(几十毫秒),然后,对这些读写请求做 merge 和 sort。

TCP 协议向网络发包的时候,会把数据先在缓冲区中进行囤积,当囤积到一定尺寸时(MTU),才向网络发送,这样可以最大化利用我们的网络带宽。而传输速度和性能也会变得很快。

  • event-dispatching
    • push
      • downstream status checking
      • failover
    • pull
      • time-visible-window
  • event-sourcing
  • transaction
    • tx-ticket

CQRS

Command Query Responsibility Segregation

  • sharding
    • tenant
    • data type
    • range
    • hash mod

References

Licensed under CC BY-NC-SA 4.0
Get Things Done
Built with Hugo
Theme Stack designed by Jimmy