张铁蕾

其他

分布式领域最重要的一篇论文,到底讲了什么?

正在阅读本文的读者们,可能之前已经读过了我写的有关线性一致性、顺序一致性以及因果一致性的分析文章。这些一致性模型的关键在于,它们定义了一个系统在分布式环境下对于读写操作的某种排序规则。没错,分布式系统内的事件排序,涉及到最深层的本质问题。图灵奖得主Lamport在1978年发表的经典论文,《Time,
2021年4月15日
其他

条分缕析分布式:因果一致性和相对论时空

在上一篇文章《条分缕析分布式:浅析强弱一致性》中,我们重点讨论了顺序一致性、线性一致性和最终一致性这几个概念。本文我们将继续深入,详细探讨另一种一致性模型——因果一致性,并在这个过程中逐步逼近分布式系统最深层的事件排序的本质。沿着这个方向,如果我们走得稍微再远一点,就会触达我们所生活的这个宇宙的时空本质,以及因果律的本质(这才是真正有意思的地方,希望你能一口气读到最后)。回到现实,《Designing
2020年12月30日
其他

条分缕析分布式:浅析强弱一致性

当前这篇文章至少比计划拖后了两个月。在上一篇文章《条分缕析分布式:到底什么是一致性?》中,我们仔细辨析了「一致性」相关的几个容易混淆的概念。而在本文中,我们会沿着逐步深入的思路,跟大家继续讨论顺序一致性、线性一致性、最终一致性等几个概念。为了避免产生歧义,我们先明确一下这几个概念的英文表达:顺序一致性的英文是:sequential
2020年10月7日
其他

条分缕析分布式:到底什么是一致性?

凡是做服务器开发的技术同学,估计都对分布式系统以及相关的理论感兴趣。而对于分布式理论,大家讨论的最多的恐怕就是「分布式一致性」问题了。然而,不管是学术界还是业界的发展历史上,对于「一致性」这个概念的理解,始终充满了混乱。如果你问一个技术同学,到底什么是分布式一致性,估计会得到五花八门的答案。这其中比较常见的说法可能是这样的:一致性就是多个服务器节点中的数据保持一致(至少百度百科上差不多就是这么说的)。而如果再讨论得深入一点,可能就会谈到所谓的分布式一致性协议,比如Paxos之类的;还有CAP定理,也跟「一致性」有关。但是,「一致性」这个词是非常有迷惑性的。如果用英文来表达的话,跟「一致性」有关的至少有两个词:consistency和consensus。它们经常都被翻译成「一致性」,这进一步加剧了这个概念被滥用的程度。为了接下来讨论方便,我们先简单地澄清一下:网上通常提到的诸如Paxos之类的分布式一致性协议,其实是consensus这个词。它如果被翻译成「共识」,可能会更好一些。为了表达清晰,本文后面在讨论consensus问题的时候,尽量使用「共识」这个词。ACID或CAP里C,用的都是consistency这个词,但真实含义迥然不同。此外,还经常会听到人们关于「强一致性」的说法,而且这种说法通常都会牵涉到CAP定理或者「分布式事务」的概念。「强一致性」与CAP定理确实关系密切,但与「分布式事务」的关系却不知从何而来。下面,我们就对这些概念进行详细的解析。ACID中的一致性ACID是数据库事务的四个特性,分别是原子性
2020年6月28日
其他

由「精益创业」所想到的

前几天我做了一个内部分享,是关于「精益创业
2020年5月25日
其他

看得见的机器学习:零基础看懂神经网络

https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.kneighbors_graph.html[4]
2020年5月5日
其他

程序员眼中的「技术-艺术」光谱

当提到「艺术」这个词的时候,很多人头脑中首先浮现出来的,很可能是以梵高为代表的后印象派画作,也可能是文艺复兴时期米开朗基罗的雕像,或者是中国古代的诗词歌赋,甚至是玛雅文明的遗迹,诸如此类的东西。总之,我们平常所从事的技术工作——写代码、调试程序,这些都跟「艺术」毫不沾边。然而,「艺术」这个词也有大众化的一面,有时它的适用范围非常之广。比如,我们可以说:“烹饪是一门艺术”,“钓鱼是一门艺术”。这个时候,「艺术」一词的含义大致相当于技能、技巧或手艺。甚至我们还经常听到这样的说法:“说话是一门艺术”,“生活是一门艺术”。这下好了,这两个论断足以把我们周围的大多数人都归入到「艺术家」的范畴。「技术-艺术」光谱之所以「艺术」这个词会产生这么多不同的用法,根源在于「艺术」这一概念本身就没有特别明确的和公认的定义,它的边界非常模糊。在本文中,我们并不想讨论如何在不同的场景下对「艺术」下定义的问题,而是借用这个词来表达一种特定的含义:与「技术」相对的程度。在英语中,「艺术」是用「art」来表达的,它是与「technology」相对的一个概念。我们通过这一特定含义来思考技术与艺术的关系。首先我们来看一个跟技术密切相关的例子。在Stephen
2020年2月23日
其他

在技术和业务中保持平衡

如果时间退回到十多年以前,新兴互联网公司的技术人员几乎都是从「业务开发」开始自己的职业生涯的。然而到了今天,不知道你有没有发现,业务开发和纯技术的开发已经有了明显的分野。最开始,互联网业务的出现,让人们第一次从用户需求和用户体验的角度来设计产品。正是这种与传统生意的不同,造就了很多互联网早期的传奇故事。而互联网公司的技术人员,作为这些用户产品的真正实现者,他们的目标就是用技术来解决产品实现问题。也就是说,代码是直接服务于产品需求的(典型的业务开发)。在这个过程中,技术人员逢山开路,遇水架桥,遇到什么样的技术问题就解决什么样的技术问题。遇到存储问题,他们就调试和扩容数据库;遇到系统问题,他们就升级系统软件,做基本的运维工作;遇到架构问题,他们就设计技术架构,直接支撑业务。总之,对业务逻辑的开发和对技术问题的解决,这两件事是很难分开的。正是在这样的业务驱动的过程中,丰富的公用组件、技术体系或框架被设计出来,并逐渐从业务中抽离。搜索引擎产品,将信息检索(Information
2020年2月15日
其他

给普通人看的机器学习(一):优化理论

Programming)在数学上,它们都可以表示成从备选集合中选出最佳元素的过程[2]。我们接下来统一使用「优化」这个词汇。举一个简单的例子,假设我们有一个目标函数:f(x)
2020年1月19日
其他

卓越的人和普通的人到底区别在哪?你根本想不到是它

在某些时刻,比如企业招聘的时候,比如你给上小学的儿子讲数学题的时候,再比如,你花了半小时跟某人辩论,最后却发现他根本不讲逻辑的时候,难免会在头脑中形成这样的问题:到底人和人之间的区别是什么?到底是什么东西导致了这些区别?如果考察一下人的核心特质(或能力),下面这个清单很容易列出来:专业知识;逻辑思考力;持续学习能力;沟通和表达能力;决断能力;冒险精神;毅力;......这些能力都很重要,但哪个才是最重要的能力?到底是其中的哪一个导致了人与人的不同?这其实跟一个更宏大的课题有关。在这个世界上,大多数人碌碌无为,只有少数精英引领着这个世界前进。他们摘得诺贝尔奖的桂冠,他们写出不朽的作品,他们创造出伟大的科技公司,他们设计出家喻户晓的产品,深深地影响整个时代。他们是科学家、发明家、作家、企业家,以及各个专业领域的「大家」。总之,他们是「卓越的人」。于是,前面的问题就演变成了:普通的人和卓越的人到底区别在哪?在卓越的人身上,肯定具有某种不同凡响的能力和特质,是普通人所缺乏的。如果我们找到了它,是不是我们也能变得和他们一样卓越?我们回顾一下前面的「能力」列表。专业知识,对于在具体领域获得成就不可或缺,但它是具体的知识,不可能是我们探寻的那个本质的东西;持续学习能力、沟通能力、决断能力,等等,它们属于习惯和技巧,是辅助的能力;逻辑思考力则不太一样,它决定了思维模式的根本,是人的思维的底层操作系统。没错,我以前一直是这样认为的,逻辑思考力决定了人与人之间的不同。因为,做任何事都需要清晰的逻辑。一个缺乏逻辑思考力的人,几乎什么都做不好,甚至别人都不愿意跟他多说一句话,以免浪费时间。然而,最近我改变了自己的看法。不管是做研究,写小说,创企业,还是搞技术开发,能真正带来不同的那个东西,其实是想象力。想象力,是非常稀缺的一种特质;也只有想象力,才能让你的人生真正有质的飞跃。1991年,有一位名叫乔安娜的女人,在从曼彻斯特去伦敦的火车上突然冒出来一个念头,一个瘦弱的、戴着眼镜的黑发小巫师的形象闯进了她的脑海。于是,她的大脑好像决堤了一般,无数的念头与构思犹如奔腾的洪水。她连忙从包里掏出本子和笔,用潦草的字迹记下了这些想法,甚至由于太过兴奋紧张,她的手都有些颤抖。一个恢弘的魔法世界就这样在她脑中成形。这个女人就是《哈利·波特》的作者J·K·罗琳。在那之前,她根本没有发表过任何作品。依靠卓越的想象力,她创造了一个超过4亿5千万册销量的奇迹。平常我们经常会评论说,一个作家或写手,他的文笔如何如何。实际上呢,文笔属于我们前面讲过的「专业知识」的范畴,它对于一部成功的作品来说只能说是辅助。以写小说为例,一个不落窠臼的好故事,才是成功的关键,而这是想象力的功劳。有好故事,自然有好文笔;没有好故事,根本谈不上文笔如何。有可能你会认为,作家或艺术家才需要想象力,科学研究和做技术就不需要了吧。那是大错特错了。1974年,后来的图灵奖得主——帅气的Leslie
2020年1月12日
其他

科学精神与互联网A/B实验

我们先讲两个历史上真实发生过的小故事。第一个故事是关于黄热病。黄热病是一种严重的传染病,曾在1793年袭击美国费城。当时,费城有一位著名的人物,他叫本杰明·拉什[1]。拉什曾经签署过《独立宣言》,是美国的开国元勋之一。同时,他还是著名的教育家和出色的外科医生。在费城的黄热病爆发的时候,他坚信放血疗法可以治疗这种疾病。于是,他用手术刀或水蛭吸血的办法给病人放血。当拉什自己染上这种疾病的时候,他也采用同样的方法给自己治疗。第二个故事是关于坏血病。坏血病在历史上曾是严重威胁人类健康的一种疾病,尤其在远洋航行的水手中尤为严重。在18世纪,一位英国船长发现,在一些地中海国家的海军舰艇上服役的船员没有坏血病。他注意到,这些船员的食物配给中含有柑橘类(citrus)水果。于是,为了弄清真正的原因,这位船长将他的船员们随机分为两组:其中一组在日常饮食中加入酸橙(limes),而另外一组维持原来的食谱不变。结果通过对比发现,定期食用酸橙的一组船员,真的防止了坏血病的发生。后来,定期食用柑橘类水果就变成了英国水手必须遵循的一种规定。这种做法越来越普遍,以至于在后来的美国英语中产生了一个新的词汇——limeys[2],用来代指任何一个英国人。这个词翻译成中文称为「英国佬」。现在让我们来比较一下这两个故事有什么不同。在第一个故事中,本杰明·拉什坚信他的放血疗法可以治疗黄热病。实际上,他确实「治」好了一些病人。当然,也有一些病人死掉了。事情的解释就演变成这样:如果病人情况好转,那么就被作为放血疗法有效的证据;反之,如果病人死掉了,拉什就解释说是病情太严重,已经无药可救了。后来,有评论家指出,他的疗法甚至比疾病本身更加危险。而在第二个故事中,船长将船员分成了两组,进行了对照实验(controlled
2019年9月20日
其他

用统计学的观点看世界:从找不到东西说起

在家里,妻子总是埋怨我找不到东西。于是我辩称,很多东西并不是我放的,找不到很正常啊。每当这个时候,她总是一脸不屑地说,很多东西也不是她放的,但为什么她很快就能找到?我回想了一下,事实似乎真的如此。不管是孩子的日常衣物、水杯文具,还是常年不用的证照、文件之类,她总能快速地把它翻找出来。按她的说法,你自己“扒拉扒拉”不就找到了吗?根据我惯常的程序员思维,这种到处“扒拉扒拉”找东西的方式,属于最原始的遍历搜索,应该很低效才对啊。其实在房间里找东西,有点类似于在一大堆数据中查找你想要的那份数据,要想效率高,怎么着也得建个索引吧。但家里显然不存在这么一个「索引」。妻子找东西似乎是依靠着某种直觉的。这不太科学。直到有一天,我在维基百科上发现了一个统计学理论,才豁然开朗。这个理论叫做贝叶斯搜索理论
2019年8月3日
其他

漫谈业务与平台

情况3,平台需要做大的升级。由于改动成本比较高,平台自然要集中精力做最有价值的事情,从而不得不评估业务需求的优先级。如果控制不好就可能会出现挑肥拣瘦的现象,精力全部投入到看似「更好」的业务中去。
2019年1月15日
自由知乎 自由微博
其他

心流:写作、编程和修炼武功的共同法门

《射雕英雄传》里面有一段描写是这样的:当日轩辕台丐帮大会,郭靖和黄蓉被擒,性命危在旦夕。但就在这等危急关头,郭靖竟然由天上的北斗七星联想到天罡北斗阵,思考起武功来。金庸在书中是这样描述的:
2018年11月4日
其他

漫谈分布式系统、拜占庭将军问题与区块链

v(n)。只要每位将军收到的这些作战提议是完全相同的,他们再用同样的方法进行汇总,就很容易得到最终一致的作战计划。至于这个最终的作战计划是不是最好的,那就跟很多「人为」的因素有关了,我们不去管它。
2018年2月2日
其他

为什么有些技术书籍难以读懂?

最后我想说的是,如果你想入门某个领域,或者已经对某个领域有所了解但想要进行更深入的专研,你可能看了很多资料仍然不得其门而入,但是不要灰心,那多半不是你的能力有问题,而很可能是还没有找对学习的资料。
2017年10月16日
其他

做技术的「五比一」原则

前些日子看到了一篇文章,很有意思。不光内容有意思,而且很巧,是我个人很喜欢的一位「网红」写的文章,文章里又恰好提到了我更喜欢的一位作家。这篇文章的名字叫《分享刘慈欣的一段话》,作者是六神磊磊。
2017年8月20日
其他

程序员的武林秘籍

分层的概念——认知的基石技术的正宗与野路子知识的三个层次三个字节的历险那些让人睡不着觉的bug捍卫技术的尊严技术攻关:从零到精通马拉松式学习与技术人员的成长性蓄力十年,做一个成就
2017年7月22日
其他

分层的概念——认知的基石

我们的认知是建立在「概念」的基础上的,在此基础上「概念」之间形成「关系」,就构成了一个知识体系——一个知识的大网。而对于「概念」和它们之间的「关系」的把握,我们靠的是什么呢?没错,靠的是「逻辑」。
2017年7月6日
其他

朋友,你的时间够用吗?

不管是神话传说,还是演义故事,追求长生不死,一直都是文学作品中长盛不衰的主题。但现在,人类已经开始把这个目标当做现实的技术问题来加以解决了,甚至一些科技巨头已经投资了专门研究如何延长人的寿命的公司。
2017年6月16日
其他

三个字节的历险

古灵儿从床上爬起来,走到穿衣镜前。她缓缓地脱去身上的睡衣,扔在一边,镜中出现了她憔悴的面容、赤裸而日渐瘦弱的身体。一股巨大的悲伤感向她袭来,如汹涌的波涛一般。她再也控制不住自己,两行热泪夺眶而出。
2017年5月29日
其他

那些让人睡不着觉的bug,你有没有遭遇过?

我前面提到的那个CPU跑满的例子,就属于第一类。对这种问题,一方面,要仔细研究代码,另一方面,就是在问题出现之前做好充分的准备,记录下足够多的日志信息,这样才能在问题真正出现时「抓住」它。
2017年5月8日
其他

捍卫技术的尊严

只要你心中的格局不要被数据结构的繁琐限制住,也不要被各种技术框架禁锢住,对技术的理解总会对你做的事情有所助益。大的格局加上对技术的深度理解,能够让你在需要的时候真正做到拿得起,放得下。
2017年4月20日
其他

技术攻关:从零到精通

马拉松式学习与技术人员的成长性蓄力十年,做一个成就知识的三个层次论人生之转折技术的成长曲线互联网风雨十年,我所经历的技术变迁技术的正宗与野路子程序员的宇宙时间线基于Redis的分布式锁到底安全吗?
2017年4月4日
其他

马拉松式学习与技术人员的成长性

有长跑经验的人都知道,真正能在马拉松上取得好成绩的人,基本上都是匀速跑者。开始跑得多快并不关键,关键在于「后劲」足不足。我们的职业生涯也是一样,不管是程序员还是其他职业,这个道理都适用。
2017年3月22日
其他

蓄力十年,做一个成就

知识的三个层次论人生之转折技术的成长曲线互联网风雨十年,我所经历的技术变迁技术的正宗与野路子程序员的宇宙时间线光年之外的世界Redis为什么用跳表而不用平衡树?基于Redis的分布式锁到底安全吗?
2017年3月7日
其他

基于Redis的分布式锁到底安全吗(下)?

token都延迟了,它们几乎同时到达了文件服务器,而且保持了顺序。那么,我们新加入的判断逻辑,应该对两个请求都会放过,而放过之后它们几乎同时在操作文件,还是冲突了。既然Martin宣称fencing
2017年2月27日
其他

基于Redis的分布式锁到底安全吗(上)?

另外,借这里的机会给微爱发个招聘广告。诚聘iOS工程师,具体职位描述请长按识别下面的二维码查看。感兴趣的同学也可以联系李甫同学(微信号:merlot)了解情况,加好友请注明“微爱求职”。感谢关注!
2017年2月13日
其他

【故事】光年之外的世界

然而,驾车行驶的墨镜男子显然并没有减速的打算。他们的车子向挡在前面的车队直冲过去。他疯了吗?就在凌雨认为猛烈的撞击不可避免的时候,车子突然飞到了空中,轻盈地如同一只鸟儿。她竟然没有感觉到丝毫的震动。
2017年1月29日
其他

深度学习、信息论与统计学

现在假设又有一位叫Alice的同学,她也使用这份只有4个单词的词汇表,但是她不太喜欢狗,而是比较喜欢猫,因此她使用cat这个单词的频率比较高。Alice对于每个单词的使用频率如下图中的右图所示:
2017年1月11日
其他

知识的三个层次

对自己有用。比如,像Facebook的CEO马克·扎克伯格那样,自己在家里实现出一套人工智能系统,能控制家里的电器,还有T-Shirt大炮,免去了自己动手从衣柜拿衣服的麻烦。这样不也挺好吗?
2016年12月28日
其他

技术的成长曲线

郭靖从六岁开始,在蒙古大漠接受江南六怪传授武功,花了整整十年。后又得全真教掌教马钰传授内功一年有余,武功初入门径,获得了武学上第一个突破(熟手期)。处于这个阶段的郭靖,在武功上与同龄的杨康不相上下。
2016年11月28日
其他

Redis中的集合类型是怎么实现的?

特殊处理两个边界情况:当要查找的value比最后一个元素还要大或者比第一个元素还要小的时候。实际上,这两部分的特殊处理,在二分查找中并不是必须的,但它们在这里提供了特殊情况下快速失败的可能。
2016年11月23日
其他

互联网风雨十年,我所经历的技术变迁

和许多创业团队一样,我们也是基本从零开始自学iOS和Android编程的。至今我还记得,我的同事香农在花了很长时间之后终于解决了iPhone应用上的一个卡顿的性能问题之后,高兴得手舞足蹈的样子。
2016年11月11日
其他

小白的数据进阶之路(上)——从Shell脚本到MapReduce

转眼间一年时间过去了。小白发现,他们与上市目标的距离跟一年前同样遥远。更糟糕的是,公司之前融到的钱已经花得差不多了,而第二轮融资又迟迟没有结果,小白上个月的工资也被拖欠着没发。于是,他果断辞职。
2016年10月31日
其他

【科幻】象牙少女

他利用一种可逆的神经网络模型,生成了上万张美丽少女的头像,然后他从中一眼选中了现在的她。她的歌喉,以及她对舞蹈的控制能力,也都经过专门的设计和优化,从而远超常人。他还为她编织记忆,以及独特的个性。
2016年10月19日
其他

Redis为什么用跳表而不用平衡树?

p(C(k-1)+1)C(k)=1/p+C(k-1)C(k)=k/p这个结果的意思是,我们每爬升1个层级,需要在查找路径上走1/p步。而我们总共需要攀爬的层级数等于整个skiplist的总层数-1。
2016年10月10日
其他

【科普】从三体人列计算机到神经网络

在本文前面一节,我们已经对神经网络的训练过程进行了描述,但其中关键的一步还没有介绍,就是如何在这个过程中一步步调整权重和偏置参数的值呢?要讲清楚这个问题,我们就必须引入梯度下降算法(gradient
2016年9月23日
其他

论人生之转折

不管是结婚还是买房,一般人迟早都会面对,只是时间早晚的区别。然而,还有一类人生的转折事件,是完全靠个人主动去谋求的。它永远不会自己到来。比如创业,比如出国求学,比如转行去追求自己喜欢的事业。
2016年9月13日
其他

Android和iOS开发中的异步处理(四)——异步任务和队列

将关键的高频操作异步化,提升体验。比如前面提到的那个游戏连续操作的例子,再比如在微信朋友圈发照片或者评论别人,都不需要等待本次网络请求结束,就可以进行后续操作。这背后也隐藏着一个队列机制。
2016年9月3日
其他

程序员的那些反模式

不管是出于提升自身的目的,还是由于工作需要,我们都需要阅读一些优秀的开源源码。实际上,阅读开源的代码未必非要找一个完整的开源工程,从头到尾地去读。应该从日常工作需要的SDK源码入手,积少成多。
2016年8月29日
其他

编程世界的熵增原理

而生命体,尤其是智慧生命体(比如人类),却是典型的“低熵体”,能够维持自身和周围环境长期处于低熵的状态。可以想象,如果一所房子能够长期保持干净整洁,多半是因为它有一位热爱整洁且勤于家务的女主人。
2016年8月22日
其他

Android和iOS开发中的异步处理(一)——开篇(发布GitHub源码)

关于“Android和iOS开发中的异步处理”这个话题,我从今年上半年就开始构思,现在已经完成了三篇(原计划是共七篇)。中间断断续续修改至今,一直在寻求一个更恰当的表达方式,还没有正式对外发表过。
2016年8月17日
其他

iOS和Android开发中的异步处理(三)——执行多个异步任务

在HttpService这个接口定义中,请求参数request使用Generic类型T来定义。如果这个接口有一个实现,那么在实现代码中应该会根据实际传入的request的类型(它可以是任意Java
2016年8月17日
其他

Android和iOS开发中的异步处理(二)——异步任务的回调

这样做自然缺点也很明显:为每一个下载任务都创建一个下载器实例,这有违我们对于Downloader接口的设计初衷。这会创建大量多余的实例。特别是,当接口实例是个很重的大对象时,这样做会带来大量的开销。
2016年8月17日
其他

技术的正宗与野路子

(https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/index.html)
2016年8月10日
其他

Android端外推送到底有多烦?

4A等。Emui3.1上,Push广播基本不被限制,但个别型号机型存在问题,如:荣耀5x等。Emui4.0及以上,Push广播有较高概率被限制,不被限制的机型如:荣耀畅玩4C,荣耀畅玩4X,Mate
2016年8月6日
其他

【程序员脑洞故事】宇宙尽头的描述符(下)

“像历史上很多哲学家思考后的结果一样,我无法回答你这个问题。不过至少,我可以肯定地说,我们的这个世界跟以前相比,它的真实性并没有发生什么变化。我刚才说过,从程序的角度来解释,这只是一种比喻。
2016年8月1日
其他

【程序员脑洞故事】宇宙尽头的描述符(上)

“不可能是自杀。那样的话,王队的事怎么解释?王队说的那些数字又怎么解释?张翔,干我们这行的,就是要把看似不相关的各个细节串起来。串对了,真相就出来了。只要有一环对不上,那——嘿嘿——就是扯淡!”
2016年7月29日
其他

Redis内部数据结构详解(5)——quicklist

当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。
2016年7月22日