《一意孤行》开源编程游戏汉化版

经过一段时间的工作(其实没花多少时间),我很高兴的跟大家介绍开源编程游戏 Untrusted 的汉化版:《一意孤行》正式发布了。

该游戏讲述了一个研究人工智能的教授 Dr. Eval。面对各种挑战,不断前行的故事。好玩的地方在于,每一关,都需要玩家修改不同的 JavaScript 代码来改变逻辑,让角色到达出口。通关这个游戏除了需要玩家有一定的编程知识之外,还要有丰富的想象力和创造力。同时,如果对人工智能的基本原理有所了解,也能让通关过程事半功倍。不过事实证明,代码民工干体力活也能通关的!:D

在线游戏

untrusted-1

untrusted-2

在线游戏

继续阅读

[翻译] channel 独木难支

原文在此。遗憾的是文章只提出了问题,并没明确提供如何解决这些问题。但无论如何,对于这种可以引起反思的文章,是不能放过的。另外,我得承认,似乎高层次的分布式系统的抽象,用函数式语言的范式来表述更容易一些(实现上其实未必)。

————翻译分隔线————

channel 独木难支
或者说为什么流水线作业没那么容易

勇敢和聪明的 Golang 并发模型

@kachayev 撰写

概述

Go 被设计用于更容易的构建并发系统,因此它有运行独立的计算的 goroutine 和用于它们之间通讯的 channel。我们之前都听过这个故事。所有的例子和指南看起来都挺好的:我们可以创建一个新的 channel,可以向这个 channel 发送数据,可以从 channel 读取,甚至还有漂亮和优雅的 select 语句(顺便提一下,为什么 21 世纪了我们还在用语句?),阻塞读和缓存……
A magical unicorn

主旨:99% 的情况下,我其实并不关心响应是由 channel 传递的,还是一只魔法独角兽从它的角上带来的。

继续阅读

[翻译]面向工程师的分布式系统理论

如果一个工程师说起话来像 PhD. 走起路来像 PhD. 干起活來像 PhD. 那他是什么?
他是一个懂理论的工程师……

原文在此
————翻译分隔线————

面向工程师的分布式系统理论

Gwen Shapira,系统工程师明星,现在是 Cloudera 的全职工程师,在 Twitter 上问了一个问题,引发了我的思考。

我以前可能这样回答“好吧,这里有 FLP 的论文,而这是 Paxor的论文,还有这是拜占庭将军的论文……”,并且我会列出一个长长的原材料的清单,如果你够快的话大概可以在六个月的时间里看一遍。但是,现在我觉得提供一大堆关于理论的论文对于学习分布式系统理论往往是错误的道路(除非你在读 PhD)。论文通常都很深奥,也很复杂,需要认真的学习,且便随着巨大成就的是丰富的经验,和相关的业务上下文。有什么是需要这样高等级的工程师专家的呢?

不幸的是,与此同时,缺少一个好的能够通向这些汇总材料的“桥梁”,提炼并融汇分布式系统理论中重要的结论和思路;而一些进行这些总结的材料的难度又过大。在思考的时候,我又想到另外一个问题:

分布式系统工程师应当学习什么样的分布式系统理论?

就这个例子来说,应当是没这么恐怖的、简单一些的理论。因此,我试着整理了一份我作为分布式系统工程师,每天的工作会应用到的一些基本概念的清单。我觉得这个清单应该足够支持分布式系统工程师设计新的系统。如果我漏掉了什么,务必告诉我!
继续阅读

[翻译]十条有用的 Go 技术

原文在此,实用总结。
————翻译分隔线————

十条有用的 Go 技术

这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指:
某个应用需要适配一个灵活的环境。你不希望每过 3 到 4 个月就不得不将它们全部重构一遍。添加新的特性应当很容易。许多人参与开发该应用,它应当可以被理解,且维护简单。许多人使用该应用,bug 应该容易被发现并且可以快速的修复。我用了很长的时间学到了这些事情。其中的一些很微小,但对于许多事情都会有影响。所有这些都仅仅是建议,具体情况具体对待,并且如果有帮助的话务必告诉我。随时留言:)

继续阅读

[翻译]冰激淋制造商和数据竞态

Dave 总是会给我们带来这种很浅显有趣,又意义深刻的文章。原文在此:Ice cream makers and data races

————翻译分隔线————

冰激淋制造商和数据竞态

Dave Cheney

这是一篇关于数据竞态的文章。本文的相关代码在 Github 上:github.com/davecheney/benandjerry

这个例子模拟了两个冰激淋制造商 Ben 和 Jerry 随机接待他们的客户。

继续阅读

[翻译]编译器(10)-编译到 C

原文在此

————翻译分隔线————

编译器(10)-编译到 C

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书
第六部分:标识符
第七部分:扫描
第八部分:抽象语法树
第九部分:解析

终于到最后一个步骤了!

我们的语言规格说明书如此简单,其实可以跳过 C 直接输出汇编。我有两个不这么做的原因。首先,移植性。在这个指引中,我无须编写任何特定架构的 C 代码。C 已经被移植到各种不同的系统中去了,因此可以让 C 编译器为我们做这个工作。

其次,对于许多程序员来说,汇编比起 C 来说要陌生得多。即使你从未使用 C 编写任何东西,它也比汇编要容易理解得多。 继续阅读

[翻译]编译器(9)-解析

原文在此
————翻译分隔线————

编译器(9)-解析

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书
第六部分:标识符
第七部分:扫描
第八部分:抽象语法树

长征已经走了很远。我们概览了扫描和抽象语法树的基本概念。现在终于可以向着解析前进。 继续阅读

[翻译]编译器(8)-抽象语法树

原文在此
————翻译分隔线————

编译器(8)-抽象语法树

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书
第六部分:标识符
第七部分:扫描

在构建解析器之前,首先应当谈谈如何处理目标数据。

需要用某种抽象数据类型来保存所有需要解析的数据。树形数据结构很好的满足了我们的需求。这个树描述了编程语言的语法结构,它被很恰当的叫做抽象语法树(AST)。 继续阅读

As Golang beyond PHP