Git的设计太帅了!

Git是Linux之父Linus的又一力作,设计做得太帅了,不愧是世界级的产品,让人顶礼膜拜!

有以下几个特点:

功能设计紧凑、克制

软件系统的功能设计需要想清楚能做什么,同时,也要想清楚,不做什么。

往往想清楚不做什么更重要。

有经验的专家敢于确定哪些不做,不是草率鲁莽,而是思虑万全。

在经验和直觉基础的经过了审慎的考虑,确认了功能实现、性能、安全、并发不会有问题。

同时对取舍的缺点也洞若观火,判定无伤大雅。

分层设计,层次间协议清爽

内核、功能、交互 分层设计,层次间仅通过约定的协议通信。

越向内层,越注重简洁和稳定。

内核极其简单

Git的内核包括blob、tree、commit三类对象。

三类对象职责清晰,分层明确,对象之间的关联简单到不能再简单。

足够简单的同时,也稳固到不能再稳固。

blob存数据、tree存结构、commit存历史。

blob和tree之间通过hash key关联,作为唯一协议。

tree和blob或自己关联。

commit和tree关联,和blob不直接关联。

仅仅三个对象,太帅了!

如果换个身边的设计师,首先,能把微内核做到这么极致就是个挑战,仅仅做内核可能就有十几个概念出来了。什么sync、trans、log、audit都会出来。

能够确定不做什么更重要!

功能层仅仅同内核通过简约协议通信

HEAD、tag、branch几个引用对象,作为版本控制的业务领域概念,属于功能层,或称为业务层。

仅仅通过commit直接关联。

hash key作为引用指针算法,是唯一的协议,也是简单到不能再简单的协议,不需要协议说明手册,不需要接口说明,真的做到了一句话能说清楚。

世界级的对象命名

给对象起名字,是顶级重要的事情,直接影响到软件系统的设计质量,以及其后的开发质量、推广成本和维护成本。

blob、tree、commit几个名字起得太帅了!

可以叫file、dir、his,但这样和物理直接相关,抽象程度不够,抽象程度不够的代价会极其惨痛。

而且命名含义会引起混乱,最终没人能搞清楚这个软件是怎么回事。

如果换个人设计,会不会叫DataNode、StorageNode、DirectoryEntry、HistoryVersionEntry呢?

叫sjjd、mljd也有可能,拼音首字母,能看懂吗?

有效隔离关注点

现在的软件产品已经复杂很难把全部需要关注的事情同时放入人脑了。

在设计、开发软件的时候,必须有效隔离关注点,才能确保设计和开发的质量。

我们想象一下Git开发的过程:

实现blob的时候,仅仅思考文件怎样存储,怎样提取,磁盘数据如何管理就OK了,其他概念与它无关。

实现tree的时候,仅仅考虑blob的上层API和自己要实现的功能部分就可以了。

以此类推:Git通过良好的设计有效地分离了关注点,虽然在设计实现一个复杂的软件系统,但在做架构工作时,仅仅需要考虑模块的划分与通信协议,设计实现具体模块的时候,由于设定了良好的协议和功能规约,仅仅需要模块内的事情。

把庞大复杂的事情拆分成清爽简单的事情。开发人员仅仅做好了砖块,项目经理只是做好了运输组织,设计人员只是做好了现场施工,长城建成了!

平凡和伟大的关系就这样联系在一起了。

层次化、模块化、简约协议、高内聚、低耦合这些话一直挂在嘴边,分离关注点也是设计师的尝试,但有谁真正做好了呢?

状态的管理

想想一个文件系统(或版本控制系统)中文件和各种操作的状态如何处理?特别是通过网络互相访问的时候。

你是否开始在脑海里画复杂到更复杂的状态图,思考各种并发模型的处理效率、死锁的出现条件,各种原因失败后的处理机制,文本文件的冲突处理机制、二进制文件的冲突处理机制?

Git怎么处理的呢?

Git中blob、tree、commit几个核心对象创建后,永远不变!

想想,也应该这样啊。key是全球唯一码,必然这样的。

还是那句话,确定要做什么很简单,难在确定不做什么。永远不变,不考虑状态是Git核心层的决定。

有了核心层的决策后,也就指明了方向。

变化的职责由业务层来处理,业务层核心对象是三个指针,指针什么的,应对变化太自然了。

实现文件比对吗?也有高效的处理方案。而且感觉比cvs什么的更高效。

性能、分布式、并发的考虑

有哪个软件系统不需要考虑性能吗?

现在还有哪个软件不需要考虑分布式和并发吗?

做架构设计和核心层设计更是需要思虑万全,考虑到事情的方方面面,每一个细节都要考虑过,更何况性能、分布式和并发。

由于核心对象创建后永远不变,性能、分布式、并发的考虑忽然简单了。

而且通过网络共享文件,相同文件出现的概率越高(估计机率很小吧),存储的利用效率也就越高(理论上)。

综上所述,神级的设计,顶礼膜拜!

时间: 2024-10-16 08:02:04

Git的设计太帅了!的相关文章

git clone速度太慢,使用python3.x改host

在git clone 的时候,最心烦的莫过于速度太慢,gitee的还好,要是github的速度就太慢了. 网上的方法大都是改host,但是每隔一段时间,git的ip就会变动,于是自己写了个脚本,爬取global-ssl.fastly.net这个ip,然后修改掉host的原有ip 先看一下速度300k还是很不错的 首先,需要改变一下host的权限,一定要选中自己当前登录的用户,点击编辑->完全控制 github代码:https://github.com/HumorZhang/host 下载后,py

git clone速度太慢的解决办法

思路: git clone特别慢是因为github.global.ssl.fastly.net域名被限制了.只要找到这个域名对应的ip地址,然后在hosts文件中加上ip–>域名的映射,刷新DNS缓存便可. 实施方法: 1.在网站 https://www.ipaddress.com/ 分别搜索: github.global.ssl.fastly.net github.com 2.在hosts文件末尾添加两行(对应上面查到的ip) 151.101.185.194 github.global-ssl

mac git 拉代码太慢或是拉不下来,可能是这个原因

解决 sudo vi /private/etc/hosts 打开后就进入编辑器,可移动最后一行,按下键盘上的“o”键,会跳转到下一行的输入状态.这样就可以开始编辑hosts文件了 编辑好hosts文件,按下键盘“Esc”按键,输入“:wq”将会自动保存,就可以结束编辑器 151.101.76.249 github.global.ssl.fastly.net 192.30.253.112 github.com 原文地址:https://www.cnblogs.com/liszt-li/p/1148

蒋鑫:为什么 Git 比 SVN 好

在版本控制系统的选型上,是选择Git还是SVN? 对于开源项目来说这不算问题.使用Git极大地提高了开发效率.扩大了开源项目的参与度. 增强了版本控制系统的安全性,选择Git早已是大势所趋. 但对于企业用户来说这个决心不太好下.部分原因是出于对Git的误解,部分原因是尚不了解 Git到底能给项目管理带来什么好处.希望本文能对您项目的版本控制系统选型提供帮助. 对SVN的迷信和对Git的误解 误解1:SVN只能检出(checkout)一个版本(revision)的代码,而Git却可以脱库! 这个误

Git详解之六 Git工具(转)

Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控制所需的大多数日常命令和工作流程.你已经完成了跟踪和提交文件的基本任务,并且发挥了暂存区和轻量级的特性分支及合并的威力. 接下来你将领略到一些 Git 可以实现的非常强大的功能,这些功能你可能并不会在日常操作中使用,但在某些时候你也许会需要. 6.1  修订版本(Revision)选择 Git 允许你通过几种方法来指明特定的或者一定范围内的提交.了解它们并不是必需的,但是了解一下总没坏处. 单个修订版本 显然你可以使用给出的

Git教程1

Git Git简介 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有什么特点?简单来说就是:高端大气上档次! 那什么是版本控制系统? 如果你用Microsoft Word写过长篇大论,那你一定有这样的经历: 想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件"另存为--"一个新的Word文件,再接着改,改到一定程度,再"另存为--"一个新文件,这样一直改下去,最后你的Word文档变成了这样: 过了一周,你想找回被删

Git 教程 - Git 基本用法

Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库 mkdir project  # 创建项目目录 cd project  # 进入到项目目录 git init  # 初始化 git 仓库.此命令会在当前目录新建一个 .git 目录,用于存储 git 仓库的相关信息 初始化提交 touch README git add .  # 将当前目录添加到 git 仓库中, 使用 git add -A 则是添加所有改动的文档 git com

Git的简介,安装

简介 Git是目前世界上最先进的分布式版本控制系统,没有之一. Linus(Git开发者)一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器.中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆.

我痛恨 Git 的 10 个理由(转)

Git 是一个源代码版本控制系统,正在迅速成为开源项目的标准.它有一个强大的分布式模型,允许高级用户用分支来处理各种棘手的问题和改写历史记录.但是,要学习 Git 是需要付出更多的努力,让人不爽的命令行接口以及 Git 是如此的忽视它的使用者. 下面是我为什么如此痛恨 Git 的 10 个理由: 1. 复杂的信息模型 Git 的信息模型是很复杂的,而且你必须对他们都很了解.在这个方面上你看看 Subversion:有文件.工作目录.资源库.版本.分支和标签.你需要了解的就是这些东西,实际上,分支