闲话说抽象
在计算机领域,我最推崇的一句名言是:「软件开发中遇到的所有问题,都可以通过增加一层抽象而得以解决」(All problems in computer science can be solved by another level of indirection)。 这话不难理解。我举几个例子: 操作系统是裸机和应用程序之间的抽象。想想没有操作系统的时代,应用程序…
Rust、Elixir/Erlang、Python、Dart/Flutter、类型系统、编译器、元编程、重构、测试与软件工程之道。
在计算机领域,我最推崇的一句名言是:「软件开发中遇到的所有问题,都可以通过增加一层抽象而得以解决」(All problems in computer science can be solved by another level of indirection)。 这话不难理解。我举几个例子: 操作系统是裸机和应用程序之间的抽象。想想没有操作系统的时代,应用程序…
敏捷(agile)作为软件开发的一种模式,已经热了有好几年的时间。可很多人连敏捷宣言都不知道或者不理解,就开口闭口谈敏捷,何其谬哉! 敏捷宣言: 个体和互动 高于 流程和工具 工作的软件 高于 详尽的文档 客户合作 高于 合同谈判 响应变化 高于 遵循计划 也就是说,尽管右项有其价值, 我们更重视左项的价值。 不知道或者不理解这一宣言而去实施敏捷,就好像打仗…
我的第一门实用型的语言是Visual Basic。看了一段时间的windows编程,在各种句柄,消息循环以及繁复的MFC中迷失后,VB让我见识到了简单,直接了当,以及文档(MSDN)的重要性。学习的门槛是个大问题,有些语言(及其背后的框架)没有一定的基础最好不要碰。 当然,语言总是在发展,现在在dotnet框架下的VB已经失去了那种简单直接的美。 第一门语言…
程序君也年轻过,年轻的代价就是盲目追随。 从MS-DOS6.0开始,程序君就是微软的狂热拥趸。 这种狂热自win95走上高潮(有谁还记得win95光盘里带的Good Times的MV,请举手),历经《未来之路》,windows2000,最后在dotnet发布后到达顶峰。 那段时间,只要微软反对的,就是我反对的。 不喜欢Netscape Navigator,只…
编程思想是个宏大的主题,我不敢保证我能在短短的一两个小时里讲得全面而深入。推荐给大家一本好书『冒号课堂』,是国内为数不多的讲编程思想的经典之作。无奈这本书已经不再出版,只能在图书馆里一睹芳容(我几年前在国图和它偶遇)。 各种软件思想虽然层出不穷,但其本质是降低系统复杂度,减少重复,减少代码的变更。掌握了这个大方向,理解各种编程思想就容易多了。 下文所涉及的代…
请打开任何一个python解释器,在里面输入:import this。我所了解的任何一门其他语言都没有如此巧妙而又大张旗鼓地将其文化写入了语言本身。 这段文字值得好好消化。你一定会好奇,this究竟是什么?如果你对python的package机制有了解,那么,你就应该知道该从python的安装路径下找这个源码this.py,打开一看,一段格式熟悉,但乱七八糟…
一月份来硅谷出差,就想参加一下本地的 meetup。可惜当时出差时间短短一周,要和各路英雄 social,又要没日没夜干活,所以尽管自己对两三场技术活动垂涎三尺,但还是无缘参加。这次出差时间稍长,一落地,我想到的第一件事就是赶紧看看 meetup。然后,就发现了三个比较不错的活动:一个是昨天晚上的 Adam Cheyer 的 tech talk,一个是5/2…
未来的世界里,不会编程,虽不会决定你的生存能力,但会影响你的生存能力。 我们仔细想一想编程是什么?编程是通过构建一个系统,将一系列的输入,变成一系列的输出,通俗地说,就是给定一个问题,用计算机高效解决这个问题的能力。放到生活中一些的场景里: 老板给你一堆数据,你要从中筛查,组织出一个报表; 家里的数码资料越来越多,你想找拍摄于某地的一个视频; 工作中对着计算…
这两个概念几乎是大学网络课程的入门概念。Juniper上世纪末兴起的重要原因之一就是严格区分界定控制平面和数据平面,然后用ASIC实现数据平面。数据平面是指一个网络设备用于报文转发的模块,它的效率决定整个设备的效率,一般会由硬件完成。控制平面是指一个设备协议相关的部分,可以没有数据转发那么高效。 当你打开浏览器访问google时,互联网上面的网络设备就开始紧…
在我们自己的现状和想要达成的目标间,总是横亘着一条名为「先决条件」的大河,似乎除了花费巨大的精力游过这条大河外,别无他法。很不幸,大部分人还没能够接近目标,便被湍急的水流冲走了。然而,还是有少部分人似乎坐上了阿拉丁的魔毯,毫无迟滞地直达彼岸,好像学什么技术都不那么费劲。这是怎么回事? 学一门新的语言,或者新的技术,与其说是一种能力,不如说是一种方法。试问什么…
文档能力是一个工程师必不可少的基础能力,而高质量的文档往往伴随着高质量的图表。"A picture is worth a thousand words",复杂的概念,逻辑,想法往往能够用图表清晰而生动地表达。一张好的图表离不开制作人的大脑对思维的描述,但同样离不开制作人所使用的工具。好的工具,让同样的事情事半功倍。我是一个工具爱好者,即便手头上有一个称心的锤…
编程语言的用户是程序员,她们对语言的要求不外乎是:好用,没bug,能快速开发,容易写出高质量的代码,性能好,可伸缩,容易部署,生态圈完备,blablabla。所以编程语言这块广阔的市场的价值主张也主要围绕着这些需求展开。这个市场和其他赢者通吃的互联网市场来说,不太一样,第一的占有者也就是维持着不到20%的头部,长尾一路延伸到几百名开外。 最初编程语言围绕着性…
一个程序员,无论你人生的第一个hello world是从basic开始,c开始,抑或javascript开始,接下来了解的一个概念一定是「变量」(variable)。变量是可变的(mutable)。数学中永远不可能成立的 x = x + 1 在编程语言中有了新的内涵:赋值。一个变量的生命周期里,只要需要,其值随时改变。这改变可以是因迭代而发生,或者因状态变化…
在如今这个Lean/Agile横扫一切的年代,设计似乎有了被边缘化的倾向,做事的周期如此之快,似乎已容不下人们更多的思考。MVP(Minimal Viable Produce)在很多团队里演化成一个形而上的图腾,于是工程师们找到了一个完美的借口:我先做个MVP,设计的事,以后再说。 如果纯属个人玩票,有个点子,hack out还说得过去;但要严肃做一个项目,…
这段时间因着工作的关系,在代码里使用了 dynamodb。amazon 的 dynamodb 是个 key-value database,07年 amazon 就发布了一篇著名的 论文 讲 dynamodb,催生了开源界的一些产品,比如 cassandra 和 riak。dynamodb 的优点是显而易见的,比如: - scalability:得益于其基于 …
(一) 软件领域有个叫格林斯潘的哥们,估计大家都不怎么熟悉,但下面这句话写过代码可能没几个不知道: Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of hal…
(一) 在前几日的文章『软件随想录』里,我随性写了一句:「现在似乎已经不是lex/yacc 或 bison/flex的时代了。我亲眼看见一个同事在费力地用perl一行行解析某个系统的数据文件,却压根没想到写个BNF。BNF对他来说,不是一种选择。」 很多同学不解,问我:lex/yacc不是写编译器的么?我又不发明新的语言,它们对我有什么用? 从这个问题里,我…
过去三周,我在疯狂地使用 elixir,做了两个系统,一个是我上文提到的 policy engine,另一个是个尽可能通用的 activity stream / notification system。前者我花了一周,殚精竭虑,写下了 1600 行代码,production ready;后者我写了两周,1500行,是个可以进一步优化的 PoC(proof o…
用过 node.js 的同学都知道,它实现了 Observer 设计模式,做了一套类似于 Python 的 event listener,叫 EventEmitter。你可以创建(或者扩展)一个 EventEmitter,在需要触发事件的时候,emit 你想要的事件,然后在其他的代码中,监听这个事件进行处理。 EventEmitter 在做 library …
我们做系统,做设计,很多时候其实就是在明确边界。函数和函数要明确边界,模块和模块要明确边界,服务和服务要明确边界,应用和应用要明确边界。明确边界能让我们的代码逻辑严谨,条理清晰。边界之内,对于外部世界,是个黑盒,一切物质的非物质的交换都只能在边界上通过已知的接口(interface)完成;同时来自外部世界的 impure data 在这里被校验(valida…
最近写了些和函数式编程的文章,有读者和我讨论函数式编程和面向对象编程的优劣。二者都是很好的编程思想,都在着力解决代码重用的问题,也彼此吸收对方的优点,所以大可不必去分个高下。然而,相对于函数式编程来说,面向对象编程领域涉及的语言太多,受众广泛,因而门槛较低,产出的垃圾书(国内国外都有)也足够多,往往把读者带入错误的方向。 我面试过许多号称精通面向对象编程(比…
做拉条子是个苦力活,能把拉条子做好的程序员,写程序也不会差到哪里。 在做之前,你要么手边有本菜谱,要么心中有谱。你「看得见」,「闻得着」还未成形的美食:色泽如何,汤汁几成 —— 仿佛她们就在嘴边,向你招手;写程序前,你的谱就是你的设计,你清晰地知道 goals / non-goals,知道完工那一刻程序的模样。读菜谱是个苦力活,你要了解谱者的意图,知道所需的…
如果我纯粹为今天工作,明天我将完全无法工作。 -- 某子 程序员要面向未来编程。代码重构永远是程序员们无法回避的话题,当你的软件在编写的那一刻起,重构就不可避免。做一个系统,我们为什么要费劲地不断抽象,竭尽全力让自己的代码能够被重用,说白了就是让我们今日所付出的时间,让未来的我们能够更轻松地工作而已。 有位读者让我就 Martin Fowler 的『重构 -…
很久没有把我在 adRise 内部的演讲放出来了,一来最近我分享的频率低了(同事们也做了不少分享),二来有些分享是我们内部的系统,不方便放出来,但今天我跟团队分享的内容和内部系统无关,而是一个 framework,一个学习的 framework。 虽然标题是「如何学习一门新的语言」,slides 的所有内容也围绕着学习一门新的语言展开,但正如我最后放出的两个…
手机,计算机和电视这三块占据着人们生活的重要屏幕,一直是科技巨头们垂涎已久,妄图一统的战略要地。这个三屏合一,并非整合出一个屏幕来解决所有的生活工作娱乐的需求,而是三块屏幕能够互相配合,在最合适的屏幕上展示最有价值的内容。记得早在『未来之路』出版的年代,三屏合一就是一个热门的词汇,如今十多年过去了,巨头们仍然在这条路上徘徊和挣扎着。 然而,Apple TV …
做软件开发十数年,见识了形形色色的开发者,和各种各样的奇葩软件开发模式。本文跟你侃侃这些软件开发模式及其特点。 大巧在所不为,大智在所不虑。 -- 荀子 天论 IDD,也就是 IDE 驱动开发,几乎是初学者步入软件开发殿堂的必经之路。IDE 为开发者屏蔽了很多细节,并且几乎不用配置(相对于 vim / emacs / sublime)就可以使用代码自动补全,…
人类的智商从低幼逐渐走向成熟的标志之一就是认识和运用数字的能力。当我们三四岁的时候,数数虽然能够熟练地对一百以内的数字随心所欲地倒背如流,但数字对孩童时代的我们仅仅还是数字,即便刚数完了自己桌前有 12 粒葡萄,吃掉了一粒,我们还得费力地再数一遍才能确定是 11 粒(别问我为啥这都门清)。在这个年龄,数字离开了具体的事物,对我们而言便不再具有任何意义。 随着…
在「代码重构之道」里,我犯了个懒,讨论了什么情况下需要考虑重构,以及工具和方法来促进重构,但对如何重构代码本身,或者说:如何把烂代码转化成好代码,或者至少是合格的代码,没有太多提及。这篇文章谈一谈这个话题。 我们先给「合格的代码」做个定义: 满足项目所定义的 lint 规则 代码清晰简洁,没有反人类的逻辑或者刻意为之的 trick 尽可能控制副作用 代码的注…
夫鹄不日浴而白,乌不日黔而黑 -- 庄周 上面的这句话某种程度来说是不妥的,人性(这也是全体生物进化出的本能)趋利避害,如果不施加外力,很容易走向消极的一面。就拿读书这事来说,幼时父母的板子和棒棒糖,老师的教鞭和小红花,硬是在威逼利诱间引导我们从「咏鹅」一路背到了「从百草园到三味书屋」(否则可能是从「风魔小次郎」一路到「诛仙」)。如今一天工作完毕,心力交瘁,…
前一篇文章竟然被很多人批「干货太少」 —— 一看你们就没有看过 Rich 他老人家的 Hammock Driven Development(我很久前推荐过滴),这世界不缺代码,缺的是思想。你们要干货。好,咱们来点干货。正好之前有个读者在留言中诉苦,说看了之前的文章 谈谈抽象 不解馋,虽然学了 clojure 却总也厘不清 macro 的使用,跟着书上的例子可…
这周不放文章了,把我今天在 team 的讲座拿出来和大家分享。 今天讲的是 reactive programming —— 更确切地说,是 spreadsheet-like programming。说 reactive 容易和 FRP(functional reactive programming)混淆,而今日的主角 hoplon / meteor / mo…
之前我们谈论了 pipe 之美:一件复杂的事务性的工作,我们可以将其分解成一个个小的组件(或者处理步骤),用 pipe 将其串联起来。举个实际的栗子:作为一款带广告的视频播放软件,TubiTV 一个主要功能是在广告机会出现时,遍历符合要求的广告 vendor,向其发送广告请求,然后从响应中过滤合适的广告,最终播放给用户。这是每个视频播放软件的基本功能,其需求…
忽一日於驴上吟得:‘鸟宿池中树,僧敲月下门。’初欲著‘推’字,或欲著‘敲’字,炼之未定,遂于驴上作‘推’字手势,又作‘敲’字手势。 - 《鉴戒录·贾忤旨》 两句三年得,一吟双泪流。知音如不赏,归卧故山丘。 - 贾岛·《题诗后》 起名(或者遣词造句)并非一件容易的事,想想你家宝宝出生,你挠破头皮,绞尽脑汁,翻遍字典,抓破诗词古籍的便秘场景,你就该知道多痛苦了。…
一个多月前,facebook 将其开源了一年多的 GraphQL 标记为 production ready ( http://graphql.org/blog/production-ready/ ),几乎同一时间,github 开放了其 GraphQL API 的 early access ( https://developer.github.com/ear…
什么是技术债?通常意义上的技术债是指我们在开发产品或者功能过程中,快速(往往伴随着混乱和各种限制)地在时间和资源受限的情况下完成正常情况下无法完成的工作时引入的技术问题。这些问题可能会导致将来引入新的功能变得很困难,或者开发出来的功能很快到达容量上的瓶颈。这种由于时间和资源受限的情况下不得不牺牲质量引入的技术债是最主要的一种技术债。 第二种技术债是因为开发团…
写这个题目估计会招人骂。 这三个著名的 MVC(或者 MTV) framework,分别对应 Ruby,Python,Elixir 三种语言。说他们是这几门语言的顶梁柱毫不为过。很多人都是慕着 framework 的名而来,进而学了语言。典型的就是曾经大红大紫(现在也算是一线明星)的 rails:很多 rails 工程师最初只知 rails,写了 rails…
TDD(Test Driven Development)一直是程序界追求的一种开发境界。要想真正做到对项目有帮助的 TDD,并不是一件容易的事情。我见过不少团队做 TDD 流于形式,为了写测试例而写测试例,反而拖累了项目的进程,得不偿失,动摇了整个团队继续使用 TDD 的信心。如果你恰巧属于被 TDD 折磨到吐血,或者听到了大量 TDD 毫无意义影响项目进度…
严格意义上来说,我之于 erlang,也是个半吊子,到目前为止,还没有写过真正的在生产环境中使用的 erlang 代码。不过我倒是写了两千行在生产环境中使用的 elixir 代码,还有几千行将要被应用在生产环境中,所以自认为对 elixir 算是略懂一二。由于在 VM 层面和语言核心层面,elixir 和 erlang 一脉相承,所以我也对 let it c…
武林外传里秀才怼上姬无命是,来了一段关于「我是谁」的精彩演讲。 我是谁?我生从何来,死往何处,我为何要出现在这个世界上?我的出现对这个世界来说意味着什么,是世界选择了我还是我选择了世界?!我和宇宙之间有必然的联系吗?宇宙是否有尽头,时间是否有长短,过去的时间在那里消失,未来的时间又在何处停止,我在这一刻提出的问题还是还是你刚才听到的问题吗? 我们平时很少问自…
距离 1.2 发布已经有一年多,而 exlirconf 2016 McCord 宣布 1.3 的特性也已过去半年,phoenix 1.3 依旧犹抱琵琶半遮面,迟迟不肯现身。几天前,1.3 RC.0 悄然发布,我们终于可以一睹她的芳容。 因为程序人生的读者大多不是 elixir / phoenix 的用户,所以在这里小小普及一下。elixir 是在 erlan…
上文谈到了像读书一样阅读源码的重要性,今天谈谈如何阅读一份代码。我所谓的一份代码,其范围可能从几千行到数万行,有时甚至可多达数十万行。这些代码作为一个有机体,共同完成某些重要的功能。比如说几个著名的 full fledged web framework,祖师爷 rails,师叔 django 和小师妹 phoenix: 三者对比很有意思 - rails / …
程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。这种怪状,真要追究起来,怪不得程序员这个群体本身 —— 它是两个原因造成的: 我们所有的教育和培训都在强调怎么写代码,并没有教大家如何读代码 大多数工作场景都是一个萝卜一个坑…
今个谈谈 erlang。我之前谈过不少语言:elixir,javascript,golang。那些文章流于表面,更多是简单的介绍。这篇文章不同,因为 erlang 并不是一门新语言,简单介绍它的人不算少,我希望这篇文章能在深度上有所区别。写文章,雅俗共赏是件困难的事情:讲深了,初学者或者外行读着扫兴;说浅了,专家们会觉着浪费时间。所以,我会尽量做到深入浅出。…
在谈论一般意义的状态机时,我们先看看有限状态机,Finite State Machine,简称 FSM。 在计算理论(Theory of computation)中,FSM 是一切的基础,也是能力最为有限的机器。在其能力之上是 CFL(Context Free Language),然后是 Turing Machine。 FSM 解决一个输入序列,经过 FSM…
red lang 前两天发布 0.6.3 了。osx GUI 终于得到了支持。 这事,连 hacker news 上都没掀出多少波澜。帖子在近二百多顶后,就渐渐沉底,不知去向。 我第一次听说 red 大概是 2015 年。当时在 medium 上有一篇采访 Nenad Rakocevic 的帖子,谈了 red 的思想,red 对 rebol 的传承,以及其雄…
8月18号,facebook 发文进一步澄清了 react 的 license。这似乎是对 apache foundation 将 facebook 特有的 BSD + patents license 列入 category X 的一种辩解,可惜,社区并不太买账。 先讲讲 Category X 是什么。它是一个列出了那些不能在 apache project …
上周四至今,我大概有 50-70% 的时间在造一个轮子,一个叫 merlin 的工具。 事情的起源是这样的 —— 我们内部的一个重要服务,要升级到 elixir 1.5。之前这个服务的 ansible 部署代码大概是这样的:在目标机器上 clone 代码,编译,生成一个符合 systemd 的 release,更新 systemd 配置,重启服务。那位说了:…
工作中,我们常常要处理浩瀚如烟的日志。有时候,看日志是为了处理软件中的 bug,更多的时候,是为了从中获取有用的信息 —— 这信息可以用来做 behavior analysis,可以用来做 anomaly detection,甚至也可以做 data recovery。 这个周末两天,家里的活动不少,有一搭没一搭的,在做一个 log parser。这 log …
16 年我写过一篇文章,抽象的能力,没有读过的同学可以再看看。那文章算是一个引子,举了不少实战中对代码和对需求进行抽象的小李子。大家重点注意一下最后一个例子 —— feed parser 的抽象。feed 是好莱坞 studio 给我们提供的可供播放的短视频的清单,每家 studio 都有自己的 feed,结构上大同小异,细节上差别不小:格式上,有 xml …
今天谈谈我自己做研究的方法 —— 它跟随我多年,且一直在演进和完善中。我虽然没有读过 PhD(希望有生之年能够尝试一下),但我自认为这法子并不算差 —— 至少,它让我能够更加高效地进入一个新的领域,并且扎根于其中。如果你一直在读我的文章,好奇为何程序君涉猎范围这么广(就是这么爱给自己贴金),又扎得比较深(被自己帅哭了),那么,你可以仔细读读本文 —— 还是那…
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。 - 《道德经》 转眼间女儿到了学琴的年龄。我对乐器,纯是叶公好龙,家里摆着钢琴,小提琴,手风琴,自己却连五线谱也不识,所以无法督促丫头练习,于是这重担落在了老婆身上。老婆是个虎妈,严厉起来毫不含糊,说练不完琴不许吃饭,就不许吃饭,丫头撒泼打滚,哭天抢地,姥姥红着眼圈在旁劝阻都无济于事。这种时刻,我…
沃斯大神说过,程序 = 算法 + 数据结构。 程序君认为,等式的右边,数据结构的权重要大于算法。数据结构定义好,基本上,你所用的算法也就确定了,算法的时间复杂度也八九不离十。上周,我在 team 内部分享了一个关于数据结构的主题,在这里,也和诸位分享。 现代的编程语言,内置的数据结构越来越多,从 primitive 的类型:integer, float, b…
最大的收获自然是我和 Joe 老爷子访谈,它是无价的。我前些日子已经放了篇文章:joe。没看过的同学可以点进去看看。我希望我六十岁时,也能像老爷子一样,睿智,洞悉世事,和我聊天的人都有这样的感觉 —— 就跟 Frodo 憧憬未来时夸赞 Sam 那样:Tyr the thinker。 这次 Code Beam,我做了一个三十多分钟的演讲:Release, De…
(一) 那美克星上,悟空在经历了游走生死边缘的地狱般严苛的训练后,终于以二十倍界王拳的力量直面弗利萨。然而,实力差距过分悬殊,悟空唯有兵行险着 —— 集全部力量于一体,发出了超级龟波气功。这几乎是他最后的希望。可惜,全力一搏并没有什么效果,反而狠狠激怒了弗利萨。力量耗尽,悟空几乎动弹不得,像一只待宰的羔羊:那是他的至暗时刻,甚至是整部《龙珠》的至暗时刻。 同…
好的程序员从来不靠格子衫或者颜值吃饭,就像你家 C 罗明明可以靠脸,却非要用不断精进的身体和技术迷倒你。对伟大前锋来说,进球,以及一个能够迸发出进球能力的身体非常重要。 对靠谱程序员来说,代码质量,以及一颗能够洞悉高质量软件编写之道的大脑弥足珍贵。 本文从 产品,接口,指标,日志,代码清晰度,代码复杂度 等方面,谈谈如何提高代码质量。 好的产品经理未必是…
Paul Graham 在《黑客与画家》里谈到:程序员的职业是个完美的职业,因为它兼具 1) 可测量性 和 2) 可放大性。我们常常说一个「优秀」的程序员可以抵得上三五个,甚至数十个「平庸」的程序员。这话也对也不对。「优秀」和「平庸」都是相对的,所谓「汝之蜜糖,彼之砒霜」,Forrest Gump 放对了位置也不可谓不优秀。 确切地说,一个优秀的程序员应该能…
如果你以为本文是在讲 Ethereum,或者 Smart Contract,那我非常抱歉。本文将要讲述的是 Engineering practices 以及我对一些流程的思考和应用。 在展开新工作的第一天,我就试图将 bootcamp 和 BBL 的文化引入 Arcblock。两周后,我们的 bootcamp site 长这个样子: 请原谅这个简单的 UI …
Sindre Sorhus 是我一直 follow 并且仰慕的程序员。他的 github 日常是这个样子的: 很久以来我一直好奇 —— 究竟怎样的工作效率能够让一个人在一个月的时间里工作在几十个 repo 里,创造出好几百的 commits?是对编程的狂热?对代码掌握得游刃有余?还是对自动化的极致追求? 过去的三个月里,我畅游在 elixir,ansible…
软件项目为什么没有供应链管理呢?如果要为软件项目定义供应链,应该是什么样子呢?它会有什么安全风险?你还记得 leftpad 事件么?你经历过 event-stream 被黑客巧妙利用从而神不知鬼不觉盗窃你的资产的事件么?软件的供应链管理,或者说依赖管理,越来越变得重要起来。 最近伟创力被华为踢出其供应链的事情,想必大家的朋友圈都刷了屏。对于一家硬件公司来说,…
对大多数人而言,rust 最令人兴奋的是所有权的概念,零成本抽象的能力,以及通过合适的约束巧妙解决内存安全和线程安全两大难题的优雅 —— 记得看过一个统计,linux kernel 里面这两类 bug 占据了 1/2 强。也就是说,你只要学会了 rust,就躺着消弭了 50% 的难啃的让 kernel developer 都闻之变色的 bug。 但对我来说,…
今天 code review 时,见到这样一段代码: 为了方便阐述,我把变量名稍微做了调整,隐去不必要的细节。这段代码乍一看问题不大,传入的 inputvalue 被分成两部分,一部分是这次交易的佣金,计入了 balance2,一部分是剩下的部分,计入了 balance1。 仔细想想,这段代码有两个大的问题: 1. 不符合 Open-close Princi…
最近对 git 的底层实现异常迷恋,周末抽空用 rust 和 rocksdb 实现了一个乞丐版的 object store - 可以存储 blob,tree,commit 三种对象。之所以用 rocksdb,是因为我不太喜欢文件系统里的那些细碎的 git 对象,我也没太研究 packfile 是如何进行差分编码的,rocksdb 恰好解决了这两个不爽。本来想…
git stash 是程序员的至宝。老板 biangbiang 甩来一个 case,说这个要下班之前 hot fix,咋办,stash,切到 release 对应的分支,缝缝补补;产品 kuangkuang 砸来一个需求更新,说这个简单,小哥哥帮帮我先做了,咋办,stash 切一个新的 feature 分支,撸袖子干。如果没有 git stash,人生至少要…
自从去年 9 月以来,我每天晚上花差不多一个小时给闺女小宝上课。上课的内容很杂,从周一到周日,依次是:历史故事,数学,scratch,科学探索,纪录片,励志电影,以及几何。每每上完课后,我在朋友圈「炫耀」,朋友们都会鼓励我何不干脆把内容做成视频,独乐乐不如众乐乐。后来我做过一些尝试,然而直接录制我跟小宝上课的过程效果不太好,因为一来它太定制化了,二来时间太长…
对于一个喜欢追求新技术的人来说,flutter 火爆了一年多我却没有尝鲜,实在是说不过去。我之所以对 flutter 不感冒,源于我对 flutter 所使用的 dart 语言的无知 —— 我觉得既然市面上有 typescript 这样可以满足 flutter 需要的语言,为何要用 dart 这样一个行将就木的语言呢?但最近有个朋友给我展示了他用 flutt…
一个月前,如果我要为自己最看不上的三个半语言排个名,dart 恐怕会位列其中。dart 是 google 在 2011 年就推出的编程语言,目标是成为一个结构化的 web 编程语言,暗藏着取代人们天天用又天天骂的 javascript 的野心。记得大约 2014 年前后,我在 youtube 上看了 goto conference 的一个关于 dart 语言…
在上一篇文章「dart:失之东隅收之桑榆」里,我写了这样一句: dart 也许未来可以支持 WebAssembly(类似 golang,有没有意义再说);而 TypeScript 没有这种可能。 于是很多 TypeScript 的拥趸不开心了,为什么说我家宝宝不能支持 WebAssembly(下文称 WASM)?有人找出了证据:看,AssemblyScrip…
深度探讨大型软件系统的设计哲学,从"一个人能写完"的愿景出发,阐述如何通过黑盒设计、风险隔离、显式契约等原则,构建持久、可扩展、可并行的软件架构,实现从复杂到简单的设计智慧。
深度解析 Kevlin Henney 关于编程语言演进的洞察,探讨为什么在技术飞速发展的今天,编程语言却展现出惊人的稳定性。从 ALGOL 68 的革新到 AI 时代的保守效应,揭示语言进化背后的社会因素与技术惯性。
Git 统治了版本控制二十年,但它的暂存区、脆弱的 rebase、动辄阻断的合并冲突,正在成为 AI 时代的绊脚石。jj 从底层重构了版本控制的心智模型,而且完全兼容 Git。这篇文章带你看清它为什么值得关注。