Ryo's blog

标签 · Note

首页

关于

归档

Note

《五蠹》摘抄

一、背景看 《Clean Architecture》的时候,看到书里面介绍什么架构师,大致内容如下。 首先,软件架构师自身需要是程序员,并且必须一直坚持做一线程序员,绝对不要听从那些说应该让软件架构师从代码中解放出来以专心解决高阶问题的伪建议。不是这样的!软件架构师其实应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。也许软件架构师生产的代码量不是最多的,但是他们必须不停地承接编程任务。如果不亲身承受因系统设计而带来的麻烦,就体会不到设计不佳所带来的痛苦,接着就会逐渐迷失正确的设计方向。 然后就吐槽了下某些 PPT架构师 只会脱离业务去谈一些高大上的架构,完全都落不了地。然后某个博览群书的技术大佬推荐我看下《五蠹》说里面就有映射这种..

更多
Note

《人月神话》

什么是人月神话? 一个项目有10人/月的工作量,把人增加到100人,所以只用3天就能开发完,这就是人月神话。 一个谬误的思考方式是在估计和进度安排中使用的工作量单位:人月。成本的确随开发产品的人数和时间的不同,有着很大的变化,进度却不是如此。因此我认为用人月作为衡量一项工作的规模是一个危险和带有欺骗性的神话。它暗示着人员数量和时间是可以相互替换的。 一、焦油坑(The Tar Pit)史前史中,没有别的场景比巨兽在焦油坑中垂死挣扎的场面更令人震撼。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越是猛烈,焦油纠缠得越紧,没有任何猛兽足够强壮或具有足够的技巧,能够挣脱束缚,它们最后都沉到了坑底。 过去几十年的大型系统开发就犹如这样一个焦油坑,很多大型和强壮的动物在其中剧烈地挣扎。他们中大多数开发出了可运..

更多
Note

《原则:应对变化中的世界秩序》

一、大周期概述人类的生产率是驱动世界总财富、权力和生活水平逐步提高的最重要的力量。随着时间的推移,生产率稳步提高(生产率是人均产出,受人类的学习、积累和发明的驱动)。然而,不同群体的生产率增速有差异,其原因总是一样的:不同的教育质量、创造力、职业道德以及将想法转化为产出的经济体制。决策者需要理解这些原因,以使自己的国家获得可能实现的最佳结果。投资者和公司也需要理解这些原因,以便确定最佳的长期投资对象。 下图及下页图显示过去500年的人均产出[即实际GDP(国内生产总值)估值]和预期寿命。这可能是两种公认的福祉衡量方法(但数据可能并不精确)。你可以看到这些数据渐进的上行幅度相对于围绕趋势线的波动幅度。 与围绕趋势线的波动相比,这些上行趋势非常明显,这一事实表明,相对于其他任何事物,人类的创造力极其强大。从整体..

更多
Note

《非暴力沟通》

一、由衷的给予非暴力沟通帮助我们与他人和自己建立连结,使我们得以流露与生俱来的慈悲之心。它指引我们通过将注意力聚焦在观察、感受、需要和请求这四个要素,来重新构建表达和聆听的方式。 非暴力沟通培育深度倾听的能力,让我们带着尊重和同理心对待他人,并且发自内心地相互给予。用非暴力沟通的方式,有的人学会了爱自己,有的人在人际关系中创造了更深厚的连结,有的人在工作或政治领域中建立了更有效的关系。在世界各地,非暴力沟通还被用来调和各个层面的纠纷和冲突。 二、疏离生命的语言由衷的给予和接受,是人类天性所乐见的。然而我们习得了太多疏离生命的语言形式,导致我们的说话和行为方式给他人和自己带来伤害。其中的一种形式是道德评判,即认为那些不符合我们价值观的人是不对的、不好的。另一种形式是做比较,让人们难以升起对人对己的善意。疏离生..

更多
NoteDistribution

《Raft-分布式共识算法》

一、背景在分布式系统中,一致性算法至关重要。在所有一致性算法中,Paxos最负盛名,它由莱斯利·兰伯特(Leslie Lamport)于1990年提出,是一种基于消息传递的一致性算法,被认为是类似算法中最有效的。 Paxos算法虽然很有效,但复杂的原理使它实现起来非常困难,截止目前,实现Paxos算法的开源软件很少,比较出名的有Chubby、LibPaxos。此外,Zookeeper采用的 ZAB(Zookeeper Atomic Broadcast)协议也是基于Paxos算法实现的,不过ZAB对Paxos进行了很多改进与优化,两者的设计目标也存在差异——ZAB协议主要用于构建一个高可用的分布式数据主备系统,而Paxos 算法则是用于构建一个分布式的一致性状态机系统。 由于Paxos算法过于复杂、实现困难,..

更多
NoteGolang

DDD在Message服务的实践

一、背景我们message服务经过4年的迭代,项目的可维护性、代码的可读性、功能的可扩展性越来越差,经常改一个小功能牵一发而动全身,新来的同学对message服务不能快速上手,而且因为代码可读性不高,导致新同学修代码经常会出现bug。还有一部分原因是大多数人都是第一次用Golang,对项目的分层也没有一个统一的规范,导致最后成了一个四不像的框架。 然后我们今年的两个主要目标,一是项目的稳定性、二是为了支持KA私有划部署战略,我们需要合并微服务数量,降低运维和部署成本。 基于上背景,老板让我牵头对Message服务基于DDD做一次大规模重构,重构目标很明确: 对项目有个明确的分层,提高项目代码可读性、可维护性、可扩展性。降低新人上手成本。 升级RPC框架,合并Message相关服务,提高优化项目资源利用率。..

更多
Note

《黑客与画家》

第一章节:为什么书呆子不受欢迎首先这里“书呆子”指的“高智商”的人。 解开这个谜的关键是把问题换一种提法。为什么聪明的小孩没有让自己变得受欢迎?如果他们真的很聪明,为什么找不到受欢迎的诀窍呢?他们在标准化测试中表现得这么好,为什么就不能在这方面也大获成功呢? 有一种观点认为,其他小孩妒忌聪明学生,所以聪明的学生不可能受到欢迎。我倒希望这种解释是对的。回想起来,要是初中里真的有人妒忌我,那么他们一定费了很大力气才把这种妒忌隐藏得无法发现。而且,在任何情况下,如果聪明真的令他人妒忌,这反而会招来女生。因为女生喜欢被其他男生妒忌的男生。 在我就读过的学校,聪明根本就是无足轻重的一样东西。同学们既不看重它,也不唾弃它。如果别的事情都相同,那么大家还是愿意自己变得聪明一点,因为这总比做个笨人好。但是总的来说,智力在大..

更多
Note

《清醒思考的艺术》

1. 幸存偏误为什么你该去逛逛墓地 幸存偏误是指:由于日常生活中更容易看到成功、看不到失败,你会系统性地高估成功的希望。不了解现实的你(与雷托一样)对成功抱有一种幻想,认识不到成功的概率有多微弱。每位成功的作家背后都有100个作品卖不出去的作家,每个作品卖不出去的作家背后又有100个找不到出版社的作者,每个找不到出版社的作者背后又有数百个抽屉里沉睡着刚动笔的手稿的写作爱好者。而我们总是听到成功者的故事,认识不到作家的成功概率有多小。摄影师、企业家、艺术家、运动员、建筑师、诺贝尔奖得主、电视制作人和选美冠军的情况也是一样。媒体没兴趣去刨挖失败者的墓地,这事也不归他们负责。这意味着:要想缓解幸存偏误,你就得了解这些。 幸存偏误意味着:你系统性地高估了成功概率。解决办法:尽可能常去逛逛曾经大有希望的项目、投资和事..

更多
Note

《被讨厌的勇气》

引言提出论点:“人可以改变,而且人人都可以获得幸福。” 青年:世界是简单的,人生也是如此。假若这种命题中含有几分真理,那也是对于孩子的世界而言。孩子的世界没有劳动或纳税之类的现实义务,他们每天都在父母或社会的呵护下自由自在地生活,未来充满无限希望,自己也似乎无所不能。孩子们的眼睛被遮盖了,不必去面对丑恶的现实。的确,孩子眼中的世界呈现出简单的姿态。 但是,随着年龄的增长,世界便逐渐露出真面目。人们不得不接受“我只不过如此”之类的现实,原以为等候在人生路上的一切“可能”都会变成“不可能”。幸福的浪漫主义季节转瞬即逝,残酷的现实主义时代终将到来。 人一旦长大,就会被复杂的人际关系所困扰,被诸多的责任所牵绊。工作、家庭或者社会责任,一切都是。当然,孩提时代无法理解的歧视、战争或阶级之类的各种社会问题也会摆在你眼前..

更多
Note

《Clean Code》

什么是整洁代码 能通过所有测试; 没有重复代码; 体现系统中的全部设计理念; 包括尽量少的实体,比如类、方法、函数等。 童子军军规光把代码写好可不够。必须时时保持代码整洁。我们都见过代码随时间流逝而腐坏。我们应当更积极地阻止腐坏的发生。 让营地比你来时更干净。 有意义的命名名副其实名副其实说起来简单。我们想要强调,这事很严肃。选个好名字要花时间,但省下来的时间比花掉的多。注意命名,而且一旦发现有更好的名称,就换掉旧的。这么做,读你代码的人(包括你自己)都会更开心。 变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算是名副其实。 避免误导程序员必须避免留下掩藏代码本意的错误线索。应当避免使用与本意相悖的词。例如,hp、aix ..

更多
Note

《Clean Architecture》

零、概述软件架构设计是一件非常困难的事情,这通常需要大多数程序员所不具备的经验和技能。同时,也不是所有人都愿意花时间来学习和钻研这个方向。做一个好的软件架构师所需要的自律和专注程度可能会让大部分程序员始料未及,更别提软件架构师这个职业本身的社会认同感与人们投身其中的热情了。 采用好的软件架构可以大大节省软件项目构建与维护的人力成本。让每次变更都短小简单,易于实施,并且避免缺陷,用最小的成本,最大程度地满足功能性和灵活性的要求。 0.1 设计与架构究竟是什么?一直以来,设计(Design)与架构(Architecture)这两个概念让大多数人十分迷惑——什么是设计?什么是架构?二者究竟有什么区别? 本书的一个重要目标就是要清晰、明确地对二者进行定义。首先我要明确地说,二者没有任何区别。一丁点区别都没有! “架..

更多
NoteRedis

《Redis核心技术与实战》

数据结构Redis数据结构简单来说,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示: 全局哈希表 因为这个哈希表保存了所有的键值对,所以,我也把它称为全局哈希表。哈希表的最大好处很明显,就是让我们可以用 O(1) 的时间复杂度来快速查找到键值对——我们只需要计算键的哈希值,就可以知道它所对应的哈希桶位置,然后就可以访问相应的 entry 元素。 渐进式 rehash简单来说就是在第二步拷贝数据时,Redis 仍然正常处理客户端请求,每处理一个请求时,从哈希表 1 中的第一个索引位置开始,顺带着将这个索引位置上的所有 entries 拷贝到哈希表 2 中;等处理下一个请求时,再顺带拷贝哈希表 1 中的下一个索引位置的 entr..

更多
Note

DDD-领域驱动设计

一、DDD的基础概念1.1 什么是 DDD 2004 年埃里克·埃文斯(Eric Evans)发表了《领域驱动设计》(Domain-Driven Design –Tackling Complexity in the Heart of Software)这本书,从此领域驱动设计(Domain Driven Design,简称 DDD)诞生。DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。领域驱动设计,主要是用来指导如何解耦业务系统,划分业务模块,定义业务领域模型及其交互。领域驱动设计这个概念并不新颖,早在 2004 年就被提出了,到现在已经有十几年的历史了。不过,它被大众熟知,还是基于另一个概念的兴起,那就是微服务。不过,我个人觉得,领域驱动设计有点..

更多
NoteChip

《说透芯片》

基础知识晶体管想了解晶体管,你得先了解它的“前身”——电子管。电子管是中文翻译后的名称,英文原文其实是真空管。从这个名字,你可以想象,它其实是把参与工作的金属薄片,也就是电极,封装在一个真空的容器内,真空容器一般指的是玻璃瓶。 整个电子行业,并不是从芯片开始的,而是从电子管开始。电子管最鼎盛时期的代表作,就是世界上的第一台电子计算机。这台 1946 年诞生的电子计算机,占地 150 平方米,重达 30 吨,里面的电路使用了 17468 只电子管、7200 只电阻、10000 只电容、50 万条线。 这台计算机虽然运算速度不快,但基本具备了现代计算机的主要结构和功能,这也是电子管能达到的最高成就了。其实从上图你也可以看出来,电子管最大的缺点就是,真空容器对于电子产品来说体积太大了。 如果人类停留在电子管技术上..

更多
NoteMiddleware

K8S学习笔记

环境配置Docker File 编写#源镜像 FROM golang:latest # 容器环境变量添加,会覆盖默认的变量值 ENV GOPROXY=https://goproxy.cn,direct ENV GO111MODULE="on" ENV test="on" # 作者 LABEL author="fanlv" LABEL email="fanlvlgh@gmail.com" #设置工作目录 WORKDIR /go/src/gitee.com/fanlv/GolangDemo/GoTest/docker # 复制仓库源文件到容器里 COPY . . # 编译可执行二进制文件(一定要写这些编译参数,指定了可执行程序的运行平台,参考:https://www.jianshu.com/p/4b345a..

更多
Note

《四书五经入门》

一、前言儒家学说,简称儒学,它的核心内容是儒家思想,由春秋末期思想家孔子所创立。孔子在总结、概括和继承了夏、商、周三代传统文化的基础上形成了一个完整的思想体系,它的表现形式是一些道德行为准则。 在政治学上,主张仁政、行王道,通过礼来理顺君臣、官民和各种社会关系; 在伦理学上,以“仁”为核心,强调通过提高自身修养来实现人与人之间和谐相处; 在历史学上,注重编修历史,并于记叙中体现微言大义; 在经济学上,主张重义轻利、重官轻商、重本抑末; 在教育学上,格外强调道德培养的重要性。 并把“仁”作为最高道德准则……儒家学说的创立者以孔子和孟子为代表,其中的孔子被尊为一代宗师。后来的各代中虽各有发展,但都以孔子和孟子的思想为核心。 “四书五经”基本上都是由孔子与他的弟子及传袭者编纂完成,所体现的都是孔子所尊创的儒家..

更多
NoteMiddlewareETCD

《ETCD实战》

背景ectd 常见问题 etcd 基础 etcd 实践 etcd v2 功能 etcd v2 存在的问题 第一,etcd v2 不支持范围查询和分页。分页对于数据较多的场景是必不可少的。在 Kubernetes 中,在集群规模增大后,Pod、Event 等资源可能会出现数千个以上,但是 etcd v2 不支持分页,不支持范围查询,大包等 expensive request 会导致严重的性能乃至雪崩问题。 第二,etcd v2 不支持多 key 事务。在实际转账等业务场景中,往往我们需要在一个事务中同时更新多个 key。 然后是 Watch 机制可靠性问题。Kubernetes 项目严重依赖 etcd Watch 机制,然而 etcd v2 是内存型、不支持保存 key 历史版本的数据库,只在内存中使用滑动..

更多
Note

《设计模式》

前言什么是设计模式设计模式讲的是如何写出可扩展、可读、可维护的高质量代码,所以,它们跟平时的编码会有直接的关系,也会直接影响到你的开发能力。 为什么要学习设计模式 应对面试中的设计模式相关问题。 告别写被人吐槽的烂代码。我见过太多的烂代码,比如命名不规范、类设计不合理、分层不清晰、没有模块化概念、代码结构混乱、高度耦合等等。这样的代码维护起来非常费劲,添加或者修改一个功能,常常会牵一发而动全身,让你无从下手,恨不得将全部的代码删掉重写! 提高复杂代码的设计和开发能力。 让读源码、学框架事半功倍。 为你的职场发展做铺垫 如何评价代码质量的高低?仔细看前面罗列的所有代码质量评价标准,你会发现,有些词语过于笼统、抽象,比较偏向对于整体的描述,比如优雅、好、坏、整洁、清晰等;有些过于细节、偏重方法论,比如模块化、..

更多
Note

《30天自制操作系统》

30天自制操作系统启动区(boot sector)软盘第一个的扇区称为启动区。那么什么是扇区呢?计算机读写软盘的时候,并不是一个字节一个字节地读写的,而是以512字节为一个单位进行读写。因此,软盘的512字节就称为一个扇区。一张软盘的空间共有1440KB,也就是1474560字节,除以512得2880,这也就是说一张软盘共有2880个扇区。那为什么第一个扇区称为启动区呢?那是因为计算机首先从最初一个扇区开始读软盘,然后去检查这个扇区最后2个字节的内容。如果这最后2个字节不是0x55 AA,计算机会认为这张盘上没有所需的启动程序,就会报一个不能启动的错误。(也许有人会问为什么一定是0x55 AA呢?那是当初的设计者随便定的,笔者也没法解释)。如果计算机确认了第一个扇区的最后两个字节正好是0x55 AA,那它就..

更多
Note

《数据密集型应用系统设计》

数据密集型应用(data-intensive applications)正在通过使用这些技术进步来推动可能性的 边界。一个应用被称为数据密集型的,如果数据是其主要挑战(数据量,数据复杂度或数据变化速度)—— 与之相对的是计算密集型,即处理器速度是其瓶颈。 数据系统的基石可靠性、可扩展性、可维护性现今很多应用程序都是数据密集型(data-intensive)的,而非计算密集型(compute-intensive)的。因此CPU很少成为这类应用的瓶颈,更大的问题通常来自数据量、数据复杂性、以及数据的变更速度。 可靠性(Reliability)系统在困境(adversity)(硬件故障、软件故障、人为错误)中仍可正常工作(正确完成功 能,并能达到期望的性能水准)。 人们对于一个东西是否可靠,都有一个直观的想法。人..

更多
NoteArchitecture

《从0开始学架构》

架构设计理念架构设计理念,可以提炼为下面几个关键点: 架构是系统的顶层结构。 架构设计的主要目的是为了解决软件系统复杂度带来的问题。 架构设计需要遵循三个主要原则:合适原则、简单原则、演化原则。 架构设计首先要掌握业界已经成熟的各种架构模式,然后再进行优化、调整、创新。 框架设计需要考的因素/影响架构复杂性的几个因素 高性能, 衡量软件性能包括了响应时间、TPS、服务器资源利用率等客观指标,也可以是用户的主观感受。 高可用,高可用性就是技术实力的象征,高可用性就是竞争力。99.99%(俗称4个9)网站不可用时间=52.56分钟 可扩展性,设计具备良好可扩展性的系统,有两个基本条件:“正确预测变化、完美封装变化”。 低成本,语言选择、方案选择。 安全,功能安全XSS、CSRF等,架构安全、访问策略。 规模..

更多
NoteLinux

《Linux内核技术实战》

Page Cache什么是 Page Cache? 通过这张图片你可以清楚地看到,红色的地方就是 Page Cache,很明显,Page Cache 是内核管理的内存,也就是说,它属于内核不属于用户。 $ cat /proc/meminfo ... Buffers: 1224 kB Cached: 111472 kB SwapCached: 36364 kB Active: 6224232 kB Inactive: 979432 kB Active(anon): 6173036 kB Inactive(anon): 927932 kB Active(file): 51196 kB Inactive(..

更多
NoteLinux

《Linux性能优化实战》

CPU性能篇uptime 什么是平均负载?简单来说,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。这里我先解释下,可运行状态和不可中断状态这俩词儿。 所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。 不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。 比如,当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到..

更多
Note

《趣谈网络协议》

通信协议综述IP && MACIP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。既然是门牌号码,不能大家都一样,不然就会起冲突。比方说,假如大家都叫六单元 1001 号,那快递就找不到地方了。所以,有时候咱们的电脑弹出网络地址冲突,出现上不去网的情况,多半是 IP 地址冲突了。 下面这个表格,详细地展示了 A、B、C 三类地址所能包含的主机的数量。在后文中,我也会多次借助这个表格来讲解。 无类型域间选路(CIDR) 于是有了一个折中的方式叫作无类型域间选路,简称 CIDR。这种方式打破了原来设计的几类地址的做法,将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。从哪里分呢?你如果注意观察的话可以看到,10.100.122.2/24,这个 IP 地址中有..

更多
Note

《深入浅出计算机组成原理》

基础篇计算机的基本硬件组成 第一,广。组成原理中的概念非常多,每个概念的信息量也非常大。比如想要理解 CPU 中的算术逻辑单元(也就是 ALU)是怎么实现加法的,需要牵涉到如何把整数表示成二进制,还需要了解这些表示背后的电路、逻辑门、CPU 时钟、触发器等知识。 第二,深。组成原理中的很多概念,阐述开来就是计算机学科的另外一门核心课程。比如,计算机的指令是怎么从你写的 C、Java 这样的高级语言,变成计算机可以执行的机器码的?如果我们展开并深入讲解这个问题,就会变成《编译原理》这样一门核心课程。 第三,学不能致用。学东西是要拿来用的,但因为这门课本身的属性,很多人在学习时,常常沉溺于概念和理论中,无法和自己日常的开发工作联系起来,以此来解决工作中遇到的问题,所以,学习往往没有成就感,就很难有动力坚持下去。..

更多
NoteMiddlewareMySQL

《MySQL实战45讲》

binlog && redo log什么是 binlog binlog 是逻辑日志,记录的是这个语句的原始逻辑/变化,比如“给 ID=2 这一行的 c 字段加 1 ”。 binlog 是追加写,不会覆盖之前的数据,可以提供完整的数据归档的能力。 什么是 redo log redo log 是物理日志,记录的是“在某个数据页上做了什么修改”; redo log 提供 crash-safe 能力。 一般只有4G ,4个文件,循环复写。 binlog 和 redo log 不同点因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插..

更多