程序人生

其他

激荡二十年:HTTP API 的变迁

背后的编译器思维,就像日心说,是「少有人走的路」,(因为要写解析器或者编译器)开头异常艰难,但一旦成型,日后会越来越轻松,只需在不断拓展编译器的边界。2018:我的第二次
2022年9月27日
其他

用 Excalidraw 更好地记录和表达

四个方向键,分别对应左右上下对齐。一般而言,同时选择几个具有上下关系的图形,你想做的是左右对齐,绝对不会想做上下对齐(图形会都凑到一块),反之同理。如果你不小心搞乱了,没关系,可以用
2021年7月12日
其他

想象力,工程方法以及取舍

小时候看《少儿科学画报》,深深烙在我脑海中的一个故事是「不可能先生」。史蒂文森在矿山上做了很多年蒸汽机工程师,对马车拉煤的低效深有感触,于是萌生了把蒸汽机运用在交通运输上的想法。但这个想法遭遇到了无数不可能先生的冷嘲热讽,比如「蒸汽机车不可能比马车更快」,「蒸汽机车不安全」等。他做了很多实验,遭遇了无数次失败。但最终,他通过不懈努力证明了「用火车拉煤」是一件更安全更高效成本更低廉的事情。我们人类之所以成为世间万物的主宰,极其重要的一个能力是想象力
2021年6月21日
其他

客户端软件的轮回:更好还是更糟糕?

里,我的数据都(缓存)在客户端。在我没有网络的时候,即便我无法发送邮件或者提交任何事务,起码我可以浏览我正在处理的各种工作,并且处理之。当重新联网之后,该发的东西会自动发送出去。后来互联网进入到
2021年6月14日
其他

透过 Rust 探索系统的本原:泛型

}}从代码中,我们可以更加深刻地领会到上文所说的「参数化类型的好处是语言能够更具表达力,同时还保持了完整的静态类型安全」。它是个非常强大的工具。但这样给编译器出了一个难题:编译器在编译时如何得知
2021年5月3日
其他

透过 Rust 探索系统的本原:RAII

代码(也是很多语言处理资源的通用方式),调用者需要显式地释放锁。然而在整个过程中,可能出现错误,可能抛出异常,所以,释放锁的代码很可能没有执行,导致锁资源泄露。这是很多死锁问题出现的一大原因。而支持
2021年4月19日
其他

透过 Rust 探索系统的本原:编程语言

对我们做系统的启示:首先是把系统的运行规则清晰地定义出来,然后对其做类似从特殊化的定理到一般化的公理那样的推敲和抽象,找到满足系统运行的最小化的核心规则,最后用这些规则来限制系统的行为。
2021年4月12日
其他

透过 rust 探索系统的本原:并发篇

的服务器是消费者,它接受请求,返回处理的结果。连接两端的是一个消息通道(channel)。我们可以根据消息通道的两端的使用情况,将其进一步细分成几种访问模型:spsc:单生产者单消费者(Single
2021年3月15日
其他

从微秒到纳秒:关于性能的奇妙旅程

的写入速度,和之前计算的单线程写入速度相比,提升了一倍多。如果仅仅从效率的提升来看,似乎收益不成比例(2:8),但通过额外短短几十行代码就能达到这样的效果,而且可以处理多个
2021年3月8日
其他

胖客户端,瘦服务器?

question.回到这个小节最初的问题:为什么我们需要数据库?数据库是用来存储和查询状态,以及处理事务的,但在这个场景下,数据库只是被用来做全局存储以及(间接地)解决排序问题
2021年3月1日
其他

构建下一代 HTTP API - 总览

实现环节的代码自动生成的讨论,我们单开一文详细说。Testing如果你爱一个人,就让她写大量的单元测试,因为那是天堂;如果你恨一个人,就让他写大量的单元测试,因为那是地狱。-
2020年12月7日
其他

实验:程序君的私享会,先到先得

分钟的机会。打赏后,请把你的微信号通过悄悄话留给我,我会与你取得联系,协调交流的时间和交流的内容。如果内容不合适,我会把打赏金额原封不动退回,并取消预约。如果我们正式开始交流
2020年6月15日
其他

2020 活久见:欧美主流 app「熔断」了

史诗级的崩溃数量!真是活久见啊!也许工程师觉得只是金融制造业的兄弟们受罪,大多数互联网公司还歌舞升平,正义感爆棚,于是挥刀自宫一下?
2020年5月7日
自由知乎 自由微博
其他

用 noise 协议的思路来点对点加密文件?

s),后续的步骤就都无法得出。所以这个过程是安全的。接收方如何解密?如果你跟到了这一步,想必解密的流程你已经了然于胸:和传统的对称加密方式比较传统的对称加密方式(比如
2020年1月3日
其他

致敬时间的价值:一品十年

PDF,分成「技术篇」,「成长篇」和「杂谈篇」,算是对我过去六年人生的一个回顾和总结。感兴趣的同学,可以去github.com/tyrchen/book_next下载(记得给我
2019年12月31日
其他

# 如何安全地保存密码?

操作系统有开机密码(用户密码),各种应用有登录密码,甚至还有交易密码。形形色色的密码让用户头皮发麻,要么使用重复的不那么健壮的密码,要么不得不依赖于各种密码保存服务,比如
2019年12月23日
其他

Noise 框架:构建安全协议的蓝图

是几乎无法避免的。协商出来密钥之后,我们需要考虑使用什么样的对称加密算法和哈希算法,如何验证双方的身份,如何保证前向安全性(现在使用的密钥泄露不会导致过去使用的密钥泄露),如何在收发两个方向上
2019年12月11日
其他

10 分钟重新认识 GIT

提交(commit)就是根据更改的文件的信息生成新的树的过程,新树和老树共享相同的子树,只有变化的部分才会分叉。在漫长的操作之后,对象数据库中有无数棵树,这些树构成了一个默克尔图(merkle
2019年11月26日
其他

长日无痕(5): 天叔奇谈

(一)在孩子们的成长过程中,我大部分时候都是个甩手掌柜的角色。之前小宝的课业,无论钢琴滑冰舞蹈绘画,还是读书写作算术科学,都是妈妈在操心,更别说小贝。我白天忙工作,早上出门时孩子们还在酣睡,晚上回到家时已是夜幕降临,一家人等着我晚餐。饭前我例行公事似的抱抱孩子们,玩耍几分钟;饭后我就把自己关在书房,忙自己的工作,看自己的书,写自己的文章。孩儿们偶尔冲进来寻求我的关注,大多被我三言两语打发走。等孩子要休息了,我在床边陪着讲个睡前故事,或者一起算道数学题,反而成了一天之中陪孩子最长的时光。老婆体谅我忙不完的工作和闲事,恳求我一天能抽出半个小时陪孩子读书;我应承着,煞有介事做了几天后便故态复萌。后来她放宽了最低标准,要求我每周至少抽一天晚上花上半小时到一小时教小宝学
2019年11月14日
其他

Wireguard:简约之美

结果转成对称加密密钥的方法)得到这次握手的两个方向的对称加密的密钥。如果这个过程有丢包,比如接收方没有收到发送方的握手请求,或者发送方没有接收到握手回复,那么整个过程重来就好了。反正怎么着都是
2019年11月11日
其他

就酱,在波特兰跑完了人生第三个正式的马拉松

要是我六十好几,还能有这样的体格参加马拉松,让一个后生感慨「都难以望其项背」,多好!趁着又一个上坡,老爷爷们的速度下来了,我便超过他们,继续我自己的征途。也许是之前几个月训练的功效,也许是此次全马每
2019年10月10日
其他

所见所感所悟 - 读《非平面》

前几日,暑期将尽,老婆准备带孩子回国,问我有什么要捎过来的。我恰好想起朋友圈有好几个朋友先后推荐了《非平面》,于是在豆瓣上查了查,震惊于其是一本以漫画形式呈现的博士论文,忙不迭让她带本回来。书拿回来之后,当晚我就看完了一遍,通体舒畅,似醍醐灌顶,如露入心。恰逢有朋友来美国出差,我便又让其帮忙买了三本带过来,我好馈赠好友。随即,我给公司订了两本英文版,后又让国内的同事买几本中文的相互传阅。过了两日,我又将《非平面》读了一遍,还带着小宝读完了前两章。虽然老婆从图书馆借来了英文版,但我不爱看
2019年9月13日
其他

长日无痕(四)

天,或者说,四年又二百零五天。如果一个人的职业生涯有四十年,我的十分之一已然耗散在了这片土地。回头看,刚来时的五年计划,完成得还不错:一晃在硅谷已经呆了两年半。两年半,在四十年左右的职业生涯中,仅占
2019年7月25日
其他

沅有芷兮:类型系统的数学之美

type,或者说泛型,是让人又爱又恨的类型。它简化了代码,提升了抽象程度,但程序员为之付出的代价是陡升的学习曲线。抛开泛型的好坏不提,我们先看看泛型的数学意义是什么。还是以
2019年6月16日
其他

ArcBlock 一周年

Juniper,一方面为赴美工作铺垫,另一方面也是停下来反思和复盘。尽管看上去我又重新回到了通讯行业,但我清楚地知道,我的未来还在于互联网,我的下一次创业也必然在互联网而非通讯领域。于是在
2019年5月5日
其他

ABT network 部署记

十年漫漫程序人生,打过各种杂,也做过让我骄傲的软件;管理过数十人的团队,还带领一班兄弟姐妹创过业,目前在硅谷一家创业公司担任
2019年3月31日
其他

诚者,天之道也

居下位而不获于上,民不可得而治也。获于上有道:不信于友,弗获于上矣。信于友有道:事亲弗悦,弗信于友矣。悦亲有道:反身不诚,不悦于亲矣。诚身有道:不明乎善,不诚其身矣。是故诚者,天之道也;思诚者,人之道也。至诚而不动者,未之有也;不诚,未有能动者也。
2019年3月4日
其他

在程序中时间旅行

在这里,数据保存在叶子节点上,然后以数据的索引为基础构建出来一棵树。当整个结构的某些数据变更时,我们只需要产生新的数据,然后产生索引该数据和未改变数据的一棵新的树,从而在空间上避免
2018年11月5日
其他

区块链和数据库:致虚极,守静笃

这个起止就是一个「区块」。不仅如此,在一个物理时钟并不一致的分布式环境下,「区块」还承载着全局时钟的功能,滴答滴答将整个网络往前推进。「区块」的概念是如此重要,以至于它当仁不让地成为共识算法的基础
2018年10月31日
其他

如和在几十个 Repo 中游刃有余?

惠子谓庄子曰:「子言无用」。庄子曰:「知无用而始可与言用矣。天地非不广且大也,人之所用容足耳。然则削足而垫之,致黄泉,人尚有用乎?」惠子曰:「无用」。庄子曰:「然则无用之为用也亦明矣」。
2018年8月1日
其他

如何提高代码质量?

所以高质量的代码是让别的程序员容易理解,容易使用的代码。注意,这个层次的容易理解,是指结构,原理和接口上容易理解,而并非代码的细节容易理解。细节在产品这个层次,一定要隐藏起来。用户在打开浏览器,访问
2018年7月9日
其他

思考,问题和方法

这是他人指点迷津。我是因为换了新的环境,破而后立,往日的积累和思考有了实施的空间和对象,又加上自己在西雅图孑然一身,事情又多,于是就把时间都扑在工作上,想得多,做得更多,能力也就上来了
2018年7月2日
其他

Code is Law

来编译和部署流程,用开源代码合作的方式来进化流程,那么我们就能更快地演进,更快地自我迭代。而所有这一切,我们希望不仅仅工程师受益,整个公司都能受益;不仅仅工程师能发送
2018年5月16日
其他

欢迎来到区块链的世界

文化:和老冒一起讨论并且撰写公司的愿景,使命,价值观,以及做事的原则。我们上线了一个粗糙的内部网站:handbook.arcblock.io,公司的每个员工都能查看并且参与文化的制定(只需发一个
2018年5月7日
其他

告别 Tubi:我讲了三个故事

故事到此,其实才刚刚开始。就在他打破记录的一周后,一位澳大利亚的运动员,把他的记录进一步推进。之后又有别的运动员纷纷成功进入四分钟。自从他打破这个魔咒后,一年里有十几个运动员都完成了同样的事情。
2018年4月12日
其他

谈谈分布式系统

半年前,一个谁也没见过的日本浪人推出的理财产品突然在七侠镇火爆起来,据说买上点屯着,不出几月就能把同福客栈,甚至龙门镖局都盘下。我们家小六的七舅老爷,卖掉祖宅也嚷嚷着要
2018年3月3日
其他

比特币浅析

3118?一件事情如果我看不懂,要么是这事本身不靠谱,要么是我能力有限,没看透。但是如果靠谱的人做一件不靠谱的事情,那么可能是我错了,事情本身靠谱,我没看透而已。当我微软的同事,我所敬仰的大牛
2018年2月23日
其他

程序员的好日子什么时候才到头?

亿(见:https://www.thocp.net/companies/microsoft/microsoft_company.htm)。80年代的第四代程序员的数量,估计已经膨胀到了百万的量级。
2017年11月6日
其他

闲扯比特币套利交易系统的设计

之间做四则运算,之后可能需要更加复杂的操作。本来涂脂抹粉装个大家闺秀就是个权宜之计,结果一入前端深似海,从此变更永缠身。所以,不到万不得已,别自己做可视化。我试过几个比特币套利交易的开源代码,UI
2017年9月29日
其他

上帝说:要有一门面向未来的语言,于是有了 erlang

并不是一门新语言,简单介绍它的人不算少,我希望这篇文章能在深度上有所区别。写文章,雅俗共赏是件困难的事情:讲深了,初学者或者外行读着扫兴;说浅了,专家们会觉着浪费时间。所以,我会尽量做到深入浅出。
2017年4月13日
其他

谈谈边界(Boundary)

进一步地,若干类/模块聚合起来,提供某个服务,就形成了组件(component)。组件的表现形式往往是一个目录(或者子目录),它有自己的抽象接口(start
2017年3月10日
其他

Phoenix 1.3,迈向正确的道路

等打造前端。我们可能需要一个面向用户的前端,可能还要面向管理员的前端,每个独立的服务可能也需要它们各自的管理前端,我们还要有统计分析的前端,用户行为分析的前端等等。这些所有的前端基本都没有所谓的
2017年3月9日
其他

北美互联网哀鸿遍野 - 号称99.9%可用性的S3挂了

真的发生大规模宕机,而你又没有采取任何措施,天也不一定就塌下来了。此时此刻,你的投资人,你的客户,你的合作伙伴也许都忙着解决他们各自的宕机问题呢,hacker
2017年3月1日
其他

Let it crash: 因为误解,所以瞎说

有诸多好处,我们也不该毫无节制地使用它。孔子他老人家说:过犹不及。满汉全席天天吃也会恶心,再好的思想,不该用的时候还用,也会「樯橹灰飞烟灭」。
2017年2月3日
其他

如何用正确的姿势打开 TDD?

我对此更倾向于自顶向下。因为它往往和我思考的过程一致:我喜欢在一个大的设计完成,大方向确定后就开始自上而下开发,细节在开发的过程中逐步确定;当然有人也喜欢全部确定下来了再开始构建一个个
2017年1月23日
其他

Policy Engine 的前世今生

...这样的话,我们把匹配规则的工作变成了表达式执行的操作,效率一下子高了一个数量级。不过表达式执行的难点在于,如何用合适的工具将其转化成语法树,使之可以执行。我们知道,在
2017年1月6日
其他

rails, django, phoenix,你们错了

等打造前端。我们可能需要一个面向用户的前端,可能还要面向管理员的前端,每个独立的服务可能也需要它们各自的管理前端,我们还要有统计分析的前端,用户行为分析的前端等等。这些所有的前端基本都没有所谓的
2016年11月21日
其他

ZeroMQ及其模式

掮客起到在网络的两端双方互不认识的情况下,促成双方的交易。超市就是一个典型的掮客。顾客不必和所有的供应商一一打交道,每个供应商也不需要认识所有的顾客来促成交易
2016年10月14日
其他

代码命名:僧敲月下门

一个程序员的代码反映其能力,而一个程序员给代码命名的水准则反映其修为和内涵。一段程序,如果抛开字符串,标点符号和留白,剩下些什么东西?名字!比如说这段代码:
2016年9月26日
其他

长日无痕(三)

老婆问我北京有什么变化,我并不知如何作答。接我的朋友的车子开过机场高速,北四环,一路走来,和两年前并无二致。然而,跑在路上的车子更多了,道路更拥堵了,车主们的脾气也更差了。这是个无解的基本矛盾
2016年8月23日