浅谈unix之美
在『高效能程序员的七个习惯』里,我谈了 unix 的哲学。这里举个例子: 先解释一下,docker ps -a -q 列出了系统中所有container的id,docker rm 根据id删除某个container。但是我要删除所有的container怎么办?难道要我再做一个新的命令 docker rm-all,或者 docker rm --all? 两种方…
分布式系统、操作系统内核与调度器、网络与加密协议、Serverless 基础设施、云原生与区块链底层机制。
在『高效能程序员的七个习惯』里,我谈了 unix 的哲学。这里举个例子: 先解释一下,docker ps -a -q 列出了系统中所有container的id,docker rm 根据id删除某个container。但是我要删除所有的container怎么办?难道要我再做一个新的命令 docker rm-all,或者 docker rm --all? 两种方…
现在这个社会,数据库脱裤暴库事件,邮件泄露,信用卡信息泄漏,员工目录泄露等事件层出不穷,防不胜防。如果当你我的私人邮件成为监控者茶余饭后津津乐道的谈资,你我的身份信息,密码信息,银行卡成为骇客用来支付他们奢华生活的工具,你还会觉得信息安全还是和自己毫无关系么? 所以,即使一个人不从事安全领域相关的工作,也需要懂点安全知识。 首先,安全涵盖三个基本内容:可用性…
很多人看到这个标题的第一印象可能是 —— 这是要讲飞机上的黑匣子么?有点关系,但主要讲软件中的flight data recorder。不过我们先从黑匣子讲起。 Flight Data Recorder(FDR)用于记录飞机行驶过程中的各种关键数据,其规格如下: 电源:115V AC 或 28V DC 电源能力:30天不间断 使用期限:至多6年 包含水下定位…
今天去斯坦福的教室里听了个"EngX: The Digital Sensory System"的讲座,算是了却了自己一直的一个心愿:坐在斯坦福的教室里像模像样地听一堂课。建议大家如果有机会来硅谷出差,可以先看看event.stanford.edu,有没有中意的讲座。 整个讲座共分为三个环节:Seeing (computer vision), Touching…
在lean startup的框架里,测量(measure)是非常重要的一环,它承接着"build"和"learn",当系统的全部或者部分构建(build)出来后,我们需要找到合适的手段去测量这个系统,用以获取足够的信息,来为进一步的学习/反思(learn)提供数据。无法测量的软件功能,就像医生为普通感冒开出的药方,最终成效如何,天知道。 「天知道」不是一个工…
SOA是Service Oriented Architecture的缩写,希望你知道其大概意思。在上一篇文章「测量」中,我引用了Bezos的一段将Amazon的软件架构完全转换SOA的备忘录,它是如此关键,某种程度上可能改变了Amazon的命运(想想AWS)。 SOA是一种思想,而不是wikipedia上列举的一些「已经没落的」技术的合集(XML/HTTP/…
(最近两周项目忙得紧,一直没空写文章出来,请大家见谅) 两周前因为公司一次裁人,好几个人的活都被按在了我头上,这其中的一大部分是一系列REST API,撰写者号称基本完成,我测试了一下,发现尽管从功能的角度来说,这些API实现了spec的显式要求,但是从实际使用的角度,欠缺的东西太多(各种各样的隐式需求)。REST API是一个系统的backend和fron…
最近有个朋友让我帮忙看看他系统中的一个问题:他给了我一个用户名密码,让我ssh到他的某台服务器上。那是一台redis server,里面存放数据库查询的缓存和其他的一些业务逻辑。问题断断续续花了不少时间才定位出来,期间应我的要求,朋友又给了我其它两台服务器的用户名和密码。在这个过程中,这个朋友在网络安全意识上的淡薄,可能也是很多web/mobile app开…
== 软件性能调优:看数据,还是看概念? 很多人谈到性能,言必及 zero copy。我们看wikipeidia上的定义: "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory a…
一晃新的一年就过去了 1/24,程序君发现自己竟然还没有写上哪怕只言片语,未免让「程序人生」的读者感到失望。如果说之前说自己忙都是瞎忙,如今我是体会到了什么叫忙得连去上厕所的路上都要以 6km/h 的速度前进。不过忙归忙,公众号还是要更新的,今天先来一篇短文,答谢大家的苦苦等待。 系统监控和日志处理这块,有很多现成的工具。除了商业上比较成功的 new rel…
请听题:一个使用 rail(或者 django,或者 express,...)和 MySQL 做的 API 系统,最近流量从 6,000 RPM 激增至 20,000 RPM,整个系统的压力骤升,现在需要在应用层设计一套缓存方案来降低整个系统的负荷。要求是:缓存方案不能在 web 层(包括 proxy)做,也不能使用 framework 自带的,或者第三方的…
去年我写过一篇文章:撰写合格的 REST API。当时 Juniper 裁掉了我们在德州的一支团队,那支十多人的团队有一半的人手在之前的很长一段时间里,主要的工作就是做一套 REST API。我接手这个工作时发现那些API写的比较业余,没有考虑几个基础的HTTP/1.1 RFC(2616,7232,5988等等)的实现,于是我花了些时间重写,然后写下了那篇文…
两周前 rethinkdb 终于正式发布了 horizon,一套基于 rethinkdb 的后台应用:它让你只需要做一些基本的安全配置和 validation,就可以在前端操作 rethinkdb。是不是听起来耳熟?它也、比较像 meteor 使用的 minimongo,只不过实现的方式有些不同:minimongo 是 mongodb API 的一个子集;而…
刚刚这个国庆,对程序员来说,最糟心的事情莫过于 ZeroMQ 的作者 Pieter Hintjens 的安乐死。想必你的朋友圈也传过了那篇令人感怀的 A protocal for dying。如果你还没看,翻翻朋友圈,仔细读一读,然后收藏起来,一两年后再看上一看。可敬的 Pieter,临终前的 last words,也不放过自己搞 messaging 的本行…
今年又参加了在赌城举办的 aws re:invent。讲正题之前,先黑黑程序员。 拉斯维加斯是个释放成年人荷尔蒙的地方。各种花式赌法,无数妖艳的老虎机,美女,壮男,从老少咸宜的秀一路到R级的秀,甚至 private show,总有一款能够满足你。然而,程序员在拉斯维加斯的玩法是这个样子的: 晚上8点吃完晚饭特地打 Uber 回会场参加 keynote。。。U…
Never underestimate the bandwidth of a station wagon full of tapes hurtling down the highway. — Tanenbaum, Andrew S. (1989). Computer Networks. p. 57. 这是 CS 毕业生的老朋友(大家学 OS 的时候都看过他的…
Transformation 是本次 Werner Vogels keynote 的主题。为了契合这个主题,他还穿了印有汽车人标志的T恤上台演讲。这个 keynote 非常值得反复观摩 —— 整个 keynote 的表面上的核心是:我们如何通过 development,data,compute 上的革新来帮助客户成为 internet scale 时代的 t…
车险可能是这个世界最不合理的保险之一。如果你每天坐公交上下班,只是周末偶尔出去玩玩,一周开不了两百公里,一年开不了几十次的话,你还是需要支付和那些天天开车,一年开好几万公里的车主几乎相同的保险费用。这非常的不合理 —— 正常的风险评估下,如果其他因素变化不大(比如说驾驶技术),你是属于风险非常小的客户 —— 开的里程越小,次数越少,出事故的概率就越小。因而,…
作为一个 video streaming service,TubiTV 很重要的一项功能是保证影视剧按照合约上的要求在规定的时间(窗口期),规定的平台,以及规定的国家发布。比如 Terminator,合约上规定 7/1 10/30(我瞎编的窗口),在美国可以上线,只允许 appletv,iphone,roku,web 访问,那么,如果我们不能正确处理,让加拿…
美西太平洋时间早上 10 点(北京时间凌晨 2 点),AWS S3 开始出现异常。很多创业公司的技术人员发现他们的服务无法正常上传或者下载文件。有人在 hacker news 上问:Is S3 down? 然后迅速得到大伙的确认。 然而,AWS 自己的 status page (https://status.aws.amazon.com) 却后知后觉,放眼望…
最近一个月,我和一小撮不专业的美国银行从业人员就「我是不是清白地像于谦那样」(写石灰吟的于谦,不是有三大爱好的那位)反复拉锯,又赶上一大波功能上线和融资相关的事情,忙碌地无心在火车上干活,懒散了,便从周根霞退化成了岳根霞。公众号后台和微信里满满地不理解:刚置顶你丫,你丫就耍流氓(这话似乎几个月前听过)。后来苹果微信开撕,有些小伙伴恍然大悟,连忙安慰:叔,不哭…
遥想盖子当年,MS 红火了,谈笑间,640k 内存足矣。 - 程序君 现在已经不是从指缝中扣内存的时代了。bit 在主流的解释型语言中要么失了踪迹,要么被作为高(sha)级(bi)功能被雪藏起来,就像 .net 的 managed code 一样,被压抑得像个旷妇。 HTTP 这样的 string-based protocol 进一步助长了这种气焰,互联网世…
erlang/elixir 是那种你用得越多,就越喜欢的语嫣。 一个多月前,我在 erlang 哪篇文章里,写下了这篇文字: 在 erlang 的世界里,万事万物都是 process。process 就像原子一样,组成分子,细胞,组织,器官,最终构成一副机体(见我的文章:boundary)。那么,process 究竟是什么? 其实它和 OS 的 proces…
不记得是 08 还是 09 年那会,有网站被脱裤,数百万简单的用户密码被逆向出来。当时我还在 Juniper,公司 IT 发了篇文章建议创建并使用安全的密码。其中一个建议是:用一个句子 + 某些规则来生成密码。 这是个很好的方法,我照做了,然后就养成了习惯,一直到现在。 我来解释一下这种方法。首先你得挑一些你能记住的句子,比如说: 1. life is ab…
关于比特币套利交易的文章,坊间一搜一大堆,尤以 2014,2015 为甚。那时交易所间价差相当可观,套利的机会很多,躺着赚钱并非难事。如今,套利区间收窄,留在沙场上的估计只剩下大玩家,想要不费力气躺赢机会渺茫。最近帮朋友牵线寻找币圈量化交易的机会,本欲做个打酱油的中间人,事了拂衣去,安安静静做个三河市微胖界扛把子,谁料还是一时技痒,不小心昨夜搭进去六七个小时…
上周面试了一个来自俄罗斯的 android 工程师。很 geek,对 office 的 binary format(不是后来的 xml format)做过深入的逆向工程。他在 yandex 做过产品,而不是工程师 —— 拿他的原话说,就是 Yandex 对工程师要求太高,他试了三次都没成功,只能退而求其次做产品。当然,本文想讲的不是这个哥们,而是这哥们现在所…
在用了六年多 iPhone 后,程序君对 iOS 系统已经深深地审美疲劳,累觉不爱。 新出的 iPhone X 噱头不少,从功能上来看让人大失所望。正好,pixel 2 系列几乎同期推出,程序君便改换门庭,投入 Pixel 2 XL(以下简称 2XL)的怀抱。月初拿到了 2XL,天天机不离手,各种发朋友圈晒功能。朋友说,少得瑟,有那时间都能写篇文章了。想想也…
周日早上爬完香山回来,想起还和一位朋友约了咖啡,赶忙打开微信扫路边的一辆单车。摩拜的小程序提醒我开锁中,请勿关闭小程序。然而这开锁的进度在百分之零的位置停留若干分钟,毫无变化。等了许久,我怀疑网络不畅,于是关闭小程序又重新打开扫描,这下可好,小程序直接告诉我:「您上次用的车还未关锁,暂时不能在用其它车哦」。 这就傻逼了。我对着一辆明明没开锁却被认为已开锁的车…
scheduling 有很多很多可以谈论的地方,随便一个点就可以做一次讲座。这次我只是讲一个概述。 wikipedia 上是这么说的: In computing, scheduling is the method by which work specified by some means is assigned to resources that compl…
约莫十五年前,当我刚刚开始参加工作时,赶上 Linux 发布划时代的 2.6 内核。在这个大家都翘首期盼的内核版本中,最令人兴奋的便是 O(1) scheduler。本文来谈谈这个算法是如何实现的。不过,在详细讲解 O(1) scheduler 之前,我们先简单回顾一下让人诟病许久的 2.4 scheduler,了解其传承,同时以史为镜。 Linux 2.4…
最近从无趣的工作中发现了有趣的事情,工作和业余时间都扑了些精力上去,本待上周末最终的成果出来后再写文章的,无奈事情太多,代码还没写完,二月上旬已过,再不写文章春节就过去了,所以这次程序君先上车,再补票。 事情是这样的:两周前同事催促我升级我之前做的一个轮子 merlin - 见我去年的文章:停下来,歇口气,造轮子。 在那篇文章里我提到了为什么会有需要做这样一…
最近一个多月,谈论 blockchain 的人如此之多,以至于连菜头叔都写了篇文章「韭菜席地而坐」。我在朋友圈里转了这篇文章,评论说: 区块链是对此钻研的技术人,场内人士,以及为所有参与者提供服务的人的盛宴,因为他们对此深思熟虑,并且有金钱以外的付出。那些听风就是雨的参与者,仅仅花费时间在 telegram 里打听小道消息,盯盘讨论涨跌的人,都是韭菜,大小而…
居下位而不获于上,民不可得而治也。获于上有道:不信于友,弗获于上矣。信于友有道:事亲弗悦,弗信于友矣。悦亲有道:反身不诚,不悦于亲矣。诚身有道:不明乎善,不诚其身矣。是故诚者,天之道也;思诚者,人之道也。至诚而不动者,未之有也;不诚,未有能动者也。 - 孟子 这次 Code Beam,我演讲的题目是:Build a decentralized, public…
与比特币首次结缘大概是 2013 年我结束创业,回到 Juniper 时。有阵子,饭桌上我的同事东哥经常会眉飞色舞地谈起很多关于比特币和中本聪的轶事,还有他做量化交易的有趣经历,并常常劝我也看看这个主题 —— 即便那时我对此并没有太大的感觉。经历过一次如梦般的创业历程,我还在艰难适应朝九晚六的坐班身份,以及,谋划着未来肉身翻墙的事宜。我浅浅看了网上有关比特币…
在奉上有关「共识机制」的文章前,我们先来点甜点。 在两周前的 BBL 上,我给团队介绍了 bitcoin,相关的 slides 见 github.com/tyrchen/unchained。其中花了点时间谈论了 quantum computing 对 bitcoin 的威胁。上周 google 发布了 72 量子比特通用量子计算机,引发了大家的热议 —— 尤…
我是 AWS 的重度用户,重度到「饭可以一日不吃,AWS 不可一日不用」,每天我的例行工作就是「吃饭,睡觉,上 AWS」。纵观过去几年我在 Juniper 和 Tubi 的经验,我在 Arcblock 过去的一个月渐渐摸索出来一些使用 AWS 的最佳实践 —— 虽然这些实践的对象是 AWS,但也许对你使用其它云的姿势也有一些借鉴意义。 首先,使用云服务,我们…
前两周上线了 Cybermiles 的 supernode,因为 Cybermiles 主网使用了 Tendermint,于是上周便研究了一下 Tendermint,边学边写了个 slides 介绍 Tendermint。 Tendermint 是一个脱胎于 PBFT 的 consensus engine,并在此之上构建了一个 Appliation Bloc…
天之苍苍,其正色邪?其远而无所至极邪?其视下也,亦若是则已矣。 - 《逍遥游》 对程序员来说,数据是我们时刻都在打交道的东西。我们的代码如同一台机器,把进入的数据转换或者映射成出来的数据。数学上,不过是:y = f(x) 而已。数据就像庄子口中的鱼,在代码的作用下,一会化身为文件,在文件系统里「沉潜」,一会化身为变量,在内存中「浮动」,一会又扶摇直上,化身为…
如果说牛顿的经典物理是爱因斯坦相对论在低速环境下的一种体现的话,我们所熟知的数据库技术,可以认为是区块链技术在弱分布式环境下的一个特例。 「弱分布式」环境是我胡扯的一个词,你可以将其理解为节点数量极其有限,运行环境高度可控的一种分布式环境。一个数据库集群运行在同一数据中心,或者不同数据中心,只要是同一个管理者,那么这就是可控的运行环境。在可控的运行环境下,默…
Nor Time, nor Place, nor Chance, nor Death can bow. My least desires unto the least remove. - "The Time Traveler's Wife" 三年前,当我写下那篇青涩的『永恒不变的魅力』的文章时,我刚刚是 elixir 和 clojure 的入门者。我如饥似渴…
把数学的美妙绝伦传递给一个六岁的女孩儿并不是件容易的事情。我们可以轻而易举地心算出任何一个 100 以内的数乘以 3 的结果,也可以道出「乘法是加法的累进」这样的总结,但六岁的孩子并不理解其中的奥秘。前两天我老婆许是受了数独的启发,在白纸上画了十乘十的格子,给小宝演示 100 以内任意一个数乘三,乘七,乘十一的结果(因为除法是乘法的逆运算,你也可以理解为可以…
两天前,也就是 3 月 28 日,ABT network 正式发布。ABT network 以完全去中心化方式连接编织多条区块链形成的网络,以云节点和织链为网的方式重新定义了新一代区块链基础架构。本文谈谈 ABT network 诞生前发生的有趣经历。 为方便阅读,先简单介绍一下本文谈到的一些概念: ABT network:多条区块链形成的网路。 ABT c…
产品发布在即,同事遇到了一个 API 的性能问题和我探讨: 我们产品自带的 explorer 有个 GraphQL API,返回 N 个非空区块。这个 API 可以这么调用:从最新的区块起,跳过 N 个非空区块,返回接下来 M 个非空区块。 在 API 设计中,跳过 N 条数据(为了分页)而返回满足某种过滤条件的 M 个结果,是非常常见但并不太好实现的需求 …
(一) 23 年前,也就是 1995 年的 12 月 4 日,当 Brendan Eich 带领下的团队为 netscape navigator 添加了一门蹩脚的由 scheme 语言的思想,self 语言的面向对象模型(prototype)和 Java 语言的语法构成的「四不像」- javascript 后,谁也不曾预料,软件开发的沙箱时代就此悄然开启。 …
本文共 4300 字,普通阅读需要 10 分钟,精读需要 30 分钟。 最近团队内部的 BBL,我分享了 Wireguard。Wireguard(以下简称 WG)作为新一代的 VPN 的代表,可能很多做技术的同学都不陌生。和其它 VPN 技术一样,我们可以使用它在家庭网络和公司网络之间搭建一条安全的信道,由此可以访问「内网」的数据和应用。 在具体讲 WG 之…
Noise Protocol Framework(以下简称 Noise)是一个用于构建安全协议的框架。与 TLS,IPSec 这样的有完整实现的协议不同,Noise 更多像是一个蓝图,它为那些想创建自己的安全协议的开发者提供了一套模板。就好像元编程之于编程,Noise 是协议的元协议(meta-protocol)。 诸君也许会问:既然有了 TLS,我们为何还…
在之前介绍 noise 协议的时候,我写了这样一种应用方案: 此外,Noise 协议还可以用于加密文件 —— 只要我有你的公钥,我可以使用单向握手(7.4)加密某个文件(附带握手时发送的消息),然后传输到某个不安全的位置(比如网盘,FTP,IPFS,甚至区块链中),该文件只有拥有私钥的人才能解密。这种应用很有意思,因为它具备非对称加密的安全性,同时又具备对称…
如今的互联网生活,让每个人都离不开密码 — 操作系统有开机密码(用户密码),各种应用有登录密码,甚至还有交易密码。形形色色的密码让用户头皮发麻,要么使用重复的不那么健壮的密码,要么不得不依赖于各种密码保存服务,比如 1password。我常常在想,有没有一种方式,可以让所有的密码从一个主密码中派生出来,就像比特币 BIP44 钱包派生那样? 正巧,今早看了 …
世界上只有两件事是不可避免的,那就度是税收和死亡。 本杰明·富兰克林 在海外做移动端应用开发,有一家公司是几乎不可避免的:facebook(以下简称 FB)。它打造(并且几乎垄断)了从获客到获利(广告)的一条龙服务,使得你无法抵制那巨大的诱惑 —— 前提是你要在自己的 app 里装入 FB 的 SDK。 在 app 里装第三方的 SDK,享受很多「免费」的服…
我们从一个诡异的并发 Bug 出发,深入探索 Linux 内核内存模型的精妙设计。当多核处理器让内存访问变得不可预测,我们如何在性能与正确性之间找到平衡?这是一场关于事件、关系与因果的哲学思辨。
深度解析 James Lewis 在 GOTO 2024 的演讲,回顾微服务架构十年演进历程,探讨其九大核心特性、设计理念、以及在云原生时代的新挑战与反思。
深入探讨现代 CPU 的工作原理,从流水线架构、分支预测到乱序执行,通过实际案例和性能分析工具,揭示处理器如何通过精妙的设计实现高性能计算,帮助开发者写出更高效的代码。
当我们退回原点重新思考"计算"的本质,会发现多环境是个幻觉,K8s 是个过度抽象,而 Serverless 的冷启动和连接池风暴是自找的。这篇文章拆解一套基于 Baggage Header 路由、Pingora 智能网关、Firecracker 微虚拟机和 Rust Data Bus 的无环境架构,试图回答:Post-Kubernetes 时代的计算该长什么样。
这封邮件 SPF、DKIM、DMARC、ARC 四道认证全部通过,因为它真的就是 Robinhood 自己发出来的。攻击者没有伪造任何东西,他们让 Robinhood 替他们发了这封钓鱼邮件。
我们花了十年,把可观测性盖成一座漂亮的大厦,地基却是漂浮的字符串:字段名靠默契、基数靠运气、账单靠忍。这篇文章给出一个激进的方案,用 protobuf 给每一件被观测的事正名,把日志、指标、审计统一成一份带版本、带 owner、带保留策略的事件目录,旁边留一扇叫 ForensicEvent 的逃生舱兜住所有未知未知。AI 已经成为代码的主笔,schema-first 的最后一道阻力随之消失。是时候让 schema 重新成为可观测性大厦的