跳到主要内容

Web 应用交付优化

· 阅读需 6 分钟

两个黄金法则:最小化 1) 延迟 2) 负载

最小化延迟…

  • 减少 DNS 查询

    • 使用快速的 DNS 提供商,平均响应时间(cloud flare < DNS Made Easy < AWS Route 53 < GoDaddy < NameCheap)。注意:某些地区的结果可能有所不同
    • DNS 缓存。TTL 权衡 = 性能 <> 时效性
    • 减少第三方域名数量或使用快速 DNS 的服务(与 HTTP1 的域名分片优化冲突)
    • ==DNS 预取== <link rel="dns-prefetch" href="//www.example.com/" >
  • 重用 TCP 连接。

  • 最小化 HTTP 重定向数量

  • 使用 CDN

    • 例如,Netflix 开发自己的硬件并与本地 ISP 合作提供 CDN
  • 消除不必要的资源

  • 在客户端缓存资源

    1. HTTP 缓存头
      • cache-control 用于 max-age
        • 注意,对于 JS 文件:确保浏览器获取更改的简单方法是使用带有哈希的 output.filename 替换。Webpack 缓存
      • expires
        • 如果同时设置了 Expires 和 max-age,则 max-age 将优先。
    2. last-modified,ETag 头以验证自上次加载以来资源是否已更新
      • 基于时间的 Last-Modified 响应头(不常用,因为 nginx 和微服务)
      • 基于内容的 ETag(实体标签)
        • 当最后修改日期难以确定时,此标签非常有用。
        • 通过哈希生成
    3. 一个常见的错误是只设置上述两个中的一个
  • 在传输过程中压缩资产

    • 使用 JPEG、WebP 而不是 PNG
    • HTTP2 自动压缩头部
    • nginx gzipped

最小化负载…

  • 消除不必要的请求字节

    • 特别是对于 cookies
      • 尽管 HTTP 标准未规定头部/ cookie 的大小限制,但浏览器/服务器通常会强制执行…
        • cookies 的 4KB 限制
        • 头部的 8KB ~ 16 KB 限制
      • cookies 会在每个请求中附加
  • 并行处理请求和响应

    • 当浏览器被资源阻塞时,预加载扫描器会提前查看并提前调度下载:约 20% 的提升

应用协议特定优化

  • HTTP 1.x

    • 使用 HTTP keepalive 和 HTTP 管道化:在同一连接上并行调度多个请求,而无需以串行方式等待响应。
    • 浏览器只能打开有限数量的连接到特定域,因此…
      • 域名分片 = 更多来源 * 每个来源 6 个连接(DNS 查询可能引入更多延迟)
      • 打包资源以减少 HTTP 请求
      • 内联小资源
  • HTTP 2.X

    • 引入二进制帧层后,我们获得 每个来源一个连接,并支持多路复用/流优先级/流量控制/服务器推送,因此移除 1.x 优化…
      • 移除不必要的连接和图像拆分
      • 使用服务器推送:之前内联的资源可以被推送并缓存。

工具

参考文献

经济机器是怎样运行的?

· 阅读需 2 分钟

为什么会有经济周期

市场是由一个个交易组成的,在交易中,一个人的支出就是另外一个人的收入。

一个人可支配的支出包括“钱”和“信贷”。一个人的“收入”增加,有越好的偿还能力,“信贷”就可以增加,“支出”可以进一步增加。适度的“信贷”有助于提高生产率。

在经济增长曲线里

  1. 生产率是平缓上升的。
  2. 而借贷有周期。短期债务周期一般 5-8 年,由央行控制。
  3. 因为人们喜欢借钱不喜欢还钱,导致在长期内,债务增加的速度会超过收入,进而还形成长期债务周期。

Economic Cycles

债务和收入的比率叫债务负担。债务负担过重,达到长期债务的顶峰,经济进入去杠杆化时期(美国二三十年代大萧条、日本八十年代大萧条、2008 年全球金融危机)。

去杠杆化有四个手段:1 削减支出、2 减少债务、3 财富再分配、4 发行货币。

最后的建议

  1. 不要让债务的增长速度超过收入(太多的债务负担会把你压垮);
  2. 不要让收入的增长速度超过生产率(会让你失去竞争力,公司雇佣别人的性价比更高);
  3. 尽一切努力提高生产率(在长期内起最关键作用)。

SOLID 设计原则

· 阅读需 2 分钟

SOLID 是一组设计原则的首字母缩写,帮助软件工程师在项目中编写稳健的代码。

  1. S - 单一职责原则。一个模块应该只对一个角色负责,一个模块只是一个功能和数据结构的内聚集合。

  2. O - 开放/封闭原则。软件工件应该对扩展开放,但对修改封闭。

  3. L - 里氏替换原则。通过接口和实现、泛型、子类化和鸭子类型来简化代码的继承。

  4. I - 接口隔离原则。将单一的庞大接口分割成更小的接口,以解耦模块。

  5. D - 依赖倒置原则。源代码的依赖关系与控制流相反。我们架构图中最明显的组织原则。

    1. 事物应该是稳定的具体,或者是过时的抽象,而不是 ==具体和不稳定==。
    2. 因此使用 ==抽象工厂== 来创建不稳定的具体对象(管理不希望的依赖关系)。产生接口的接口
    3. DIP 违规无法完全消除。大多数系统至少会包含一个这样的具体组件——这个组件通常被称为主组件。

三种编程范式

· 阅读需 2 分钟

结构化编程 vs. 面向对象编程 vs. 函数式编程

  1. 结构化编程是一种对直接控制转移的约束。

    1. 可测试性:软件就像科学:科学不是通过证明陈述为真来工作的,而是通过证明陈述为假来工作的。结构化编程迫使我们递归地将程序分解为一组小的可证明函数。
  2. 面向对象编程是一种对间接控制转移的约束。

    1. 封装、继承、多态(指向函数的指针)并不是面向对象特有的。
    2. 但面向对象使多态的使用变得安全和方便。然后启用强大的==插件架构==与依赖反转
      1. 源代码依赖关系和控制流通常是相同的。然而,如果我们让它们都依赖于接口,依赖关系就会反转。
      2. 接口赋予独立部署的能力。例如,在部署Solidity智能合约时,导入和使用接口消耗的气体远远少于对整个实现进行操作。
  3. 函数式编程:不可变性。是一种对变量赋值的约束。

    1. 为什么重要?所有的竞争条件、死锁条件和并发更新问题都是由于可变变量造成的。
    2. ==事件溯源==是一种策略,我们存储事务,而不是状态。当需要状态时,我们只需从时间的开始应用所有事务。

将软件架构视为物理建筑

· 阅读需 2 分钟

什么是架构?

架构是软件系统的形状。将其视为物理建筑的全景。

  • 范式是砖块。
  • 设计原则是房间。
  • 组件是建筑。

它们共同服务于特定的目的,比如医院是为治愈病人而设,学校是为教育学生而设。

我们为什么需要架构?

行为与结构

每个软件系统为利益相关者提供两种不同的价值:行为和结构。软件开发人员负责确保这两种价值保持高水平。

::软件架构师由于其职位描述,更加关注系统的结构,而非其特性和功能。::

最终目标 - ==降低每个特性的人工资源成本==

架构服务于软件系统的整个生命周期,使其易于理解、开发、测试、部署和操作。 目标是最小化每个业务用例的人力资源成本。

知识工作者,如何进行真正放松的休息?

· 阅读需 3 分钟

为什么要休息?

  • 成长 = 压力 + 休息 如果人们承受过多压力但休息太少,他们就会感到疲惫。如果人们休息过多但压力太小,他们就无法成长。高效能者应该适当地分配压力和休息,以实现快速而可持续的成长。

什么是“真正放松”的意思?

知识工作者最宝贵的资源是==意志力和注意力==。真正放松的休息应该恢复这些资源。

如何进行真正放松的休息?

为了恢复意志力和注意力,指导原则是:

  1. 完全断开联系。远离互联网或任何消耗意志力和注意力的事物。
  2. 早且频繁地进行短暂休息。
  3. 走出办公室。中午进行任何与工作相关活动的员工在一天结束时被同事评为更疲惫。

放松的休息与不放松的休息

  1. 放松的休息:放松、打盹、散步、社交等。
  2. 不放松的休息:吃东西、认知(阅读新闻、查看电子邮件、玩视频游戏、观看视频等)。

系统解决方案

  • 短期

    1. 分散注意力并回到默认模式网络
      1. 在户外散步/跑步。
      2. 回归自然。
      3. 积极的建设性白日梦(PCD)
    2. 假装成别人来激励自己。
    3. 和朋友聊天。
    4. 喝一杯咖啡,然后立即小睡25分钟。
  • 中期

    1. 请几天假来充电,完全不工作。
  • 长期

    1. 冥想。
    2. 睡得好。良好的睡眠使技能和知识在大脑中“成长”。

怎样才能运气好?

· 阅读需 2 分钟

自证预言:相信自己运气好,自己的运气就会好,因为你会更愿意探索机会、接受挑战、坚持不懈;而不是想到了好的结果单纯的开心而已。

运气好的人有三个性格特征:

  1. 外向
  2. 开放
  3. 放松 (神经质程度低)

怎样制造好运气?

  1. 多参加一些新活动,体验一些新东西
  2. 要相信自己的直觉和兴趣
  3. 要乐观,踢球的时候,多抡几脚球,总有进的时候
  4. 善于在坏事中发现好事

好运气的本质是什么?

创造机会、发现机会、敢于行动

这跟正念(Mindfulness)有什么关系?

正念=跳出自己的主观视角,留意到周围事物的价值

佛学的观点

  • 我们反对“吸引力法则”,因为幻想好结果其实是一种“贪”。
  • 我们提倡系统化对待概率,这其实就是“色即是空”。
  • 我们鼓吹在例行的任务之外发现好运气,实际上是避免了“痴”。
  • 我们用全局思维破解正常化偏误,正是在实践“无我”。
  • 所以谁说佛学没用?你要真擅长佛学,像升官发财逢凶化吉之类的小事儿,根本就用不着求佛祖。

防抖、节流和请求动画帧

· 阅读需 1 分钟

这些是优化 UI 事件处理和使过渡更平滑的网页技术。

  • 防抖:将突发的事件(如按键)聚合为一个事件。
  • 节流:保证每 X 毫秒执行一次。比如每 200 毫秒检查一次滚动位置以触发 CSS 动画。
  • 请求动画帧:节流的替代方案。当你的函数重新计算并渲染屏幕上的元素时,你想要保证变化或动画的平滑。注意:不支持 IE9。

防抖和节流有什么区别?在这里尝试

为什么做出好的决策很难

· 阅读需 2 分钟

因为聚光灯效应:==Daniel Kahneman says “A remarkable aspect of your mental life is that you are rarely stumped,” and mistakenly believe “what you see is all there is.”== 人们总是只看到自己看到的和想看到的,很难跳出自己看自己,所以要经常问问自己,"为什么我会这么想"。

作者认为决策过程中有四大挑战,并提出了解决办法

  1. Narrow framing <> 拓宽选项
  2. Confirmation bias <> 用事实检验假设
  3. Short-term emotion <> 从远处看决策
  4. Over-confidence <> 为错误做准备

雷达里奥也说,Recognize that 1) the biggest threat to good decision making is harmful emotions, and 2) decision making is a two-step process (first learning and then deciding).

举例子讲述人们常常做出错误的决定

  • Career choices, for instance, are often abandoned or regretted. An American Bar Association survey found that 44% of lawyers would recommend that a young person not pursue a career in law.
  • A study of 20,000 executive searches found that 40% of senior-level hires “are pushed out, fail or quit within 18 months.”
  • More than half of teachers quit their jobs within four years.
  • One study of corporate mergers and acquisitions—some of the highest-stakes decisions executives make—showed that 83% failed to create any value for shareholders.

怎么办?用流程解决。==在决策中,流程比分析重要六倍。==

  • Because understanding our shortcomings is not enough to fix them.
  • 人们决策流程普遍过于简单
    • final decision maker to be both the challenger and the ultimate judge.
    • Franklin’s moral algebra
    • Pros-and-cons