Redis之父:我可不止是一只码农

2023-11-11

一年前我暂停了写代码后开始尝试写科幻小说时,以为这是两条完全不一样的路子。随着写的文字越来越多,不断的推倒重写那也是家常便饭了。我现在总算非常确定了,撸一个大系统和写一本小说本质上其实差不太多,它们之间那是非常相似的。【这里我们允许 Antirez 凡尔赛一把】

One year ago I paused my programming life and started writing a novel, with the illusion that my new activity was deeply different than the previous one. A river of words later, written but more often rewritten, I’m pretty sure of the contrary: programming big systems and writing novels have many common traits and similar processes.

最显而易见的共同之处,那就是这两种活都是在搬砖,一个是搬代码,一个是搬单词。代码当然不是用自然语言编写的,但是它同样也有自己的语法规则,这种规则一般只有程序员自己能懂,对外行人来说那就两眼一抹黑啦。

The most obvious parallel between the two activities is that in both of them you write something. Code is not prose written in a natural language, yet it has a set of fixed rules (a grammar), certain forms that most programmers will understand as natural and others that, while formally correct, will sound hard to grasp.

如果再深入一点,你会发现写小说跟写代码一样,都是在摆弄各种全局和局部变量,让它们在一起协作好。好的代码是由一系列精妙易读的语句组成【微观】,整体上不同的组件之间是尽可能正交解耦的,交互的边界非常清晰【宏观】。好的小说在微观和宏观这两个尺度上也是一样的,每个句子都要写的很漂亮,全局的层次结构和文章脉络同样也很关键。

There is, however, a much deeper connection between the two activities: a good program and a good novel are both the sum of local and global elements that work well. Good code must be composed of well written and readable single statements, but overall the different parts of the program must be orthogonal, designed in a coherent way, and have clean interactions. A good novel must also succeed in the same two scales of the micro and the macro. Sentences must be well written, but the overall structure and relationship between the parts is also crucial.

代码和小说之间还有一个不那么明显的相通之处,那就是你需要持续不断往前走以追究极致,它们并不是很轻松自然而然就写出来的。关于这一点,二十多年的代码生涯帮我很大,我知道我必须夜以继日的写,今天也许是写了 100 字,明天也许会写 2000 字,但是通常你不会一天下来一个字都不写的。当你想抱着一种创造性的心态来完成你的大作时,就会经常深切地感受到什么叫文思枯竭。但是也不完全相同,作为工程师如果一天不写代码会被认为是懒惰是懈怠。但是对于艺术家,这就不一样了,慵懒的心态是创作时必须的灵感之源。

A less structural link between programming and writing is in the drive you need when approaching one or the other: to succeed you need to make progresses, and to make progresses you have to be consistent. There is extensive agreement on the fact that programs and novels don’t write themselves, yet. Twenty years of writing code helped me immensely with this aspect; I knew that things happen only if you sit every day and write: one day one hundred words, the other day two thousands, but rare is the day I don’t put words on the page. And if you have written code that is not just a “filler” for a bigger system, but a creation of your own, you know that writer block also happens in programming. The only difference is that for most people you are an engineer, hence, if you don’t work, you are lazy. The same laziness, in the case of an artist, will assume the shape of a fascinating part of the creative process.

接下来我们重点谈谈不一样的地方。

The differences.

写小说和写代码最大的不同之处在于文字经过编辑校对定稿后就基本不会再修改了,也会有些时候作者在多年之后会对原作进行局部小修正然后再发布一个新版,但是这不多见,而且这通常也只是一锤子买卖。代码就不是这样的,它需要不断修改,需求源源不断到来,而且还经常是多人一起改。也正因此产生了两种不同的行为模式:程序员会觉得系统的初版无关紧要,反正时间总是要改进它。但是作家就不行,对于每一本小说他只有一次机会写出来,所以需要不断反复的推倒重写。说起来你可能不信,其中的每个句子、每个章节、对话都要重写两三次,有时候甚至要重写数十次。

I believe the most sharp difference between writing and programming is that, once written, edited and finalized, a novel remains immutable, mostly. There are several cases of writers returning on their novels after several years, publishing a bug fixed version of it, but this is rare and, even when happens, a one-shot process. Code evolves over time, is targeted by an endless stream of changes, often performed by multiple people. This simple fact has profound effects on the two processes: programmers often believe that the first version of a system can be quite imperfect; after all there will be time to make improvements. On the other hand writers know they have a single bullet for every novel, to the point that writing prose is mostly the act of rewriting. Rewriting sentences, whole chapters, dialogues that sound fake, sometimes two, three, or even ten times.

写代码还是需要向写小说学习一下的,学习作家对待小说原版的那种认真劲:在初创的过程中随心所欲、大刀阔斧、反复不断的修改内核,力求做到最优雅的设计。我认为系统最初的设计会非常影响后续的发展【好比性格决定命运】,平滑自然的演进才会慢慢诞生出一个漂亮完美的系统,即使是在多年之后,系统整体上已经面目全非,最初的版本只是其中的极小一部分。

I believe programming, in this regard, can learn something from writing: when writing the first core of a new system, when the original creator is still alone, isolated, able to do anything, she should pretend that this first core is her only bullet. During the genesis of the system she should rewrite this primitive kernel again and again, in order to find the best possible design. My hypothesis is that this initial design will greatly inform what will happen later: growing organically something that has a good initial structure will result in a better system, even after years of distance from the original creation, and even if the original core was just a tiny faction of the future mass the system would eventually assume.

最后再提一下我最近写的科幻小说,我估计大家会很感兴趣。自己检查了很多遍之后,总算把它发给了我的编辑,他叫 Giulio Mozzi,未来几周他会给我提一些修改意见。我会参考他的说明来重新进行一轮检查,期望未来一两个月能完成定稿。然后我就会发布这第一个意大利语版本,同时还会让我远在美国的翻译来搞定发表英文的版本。作家之路漫漫其修远兮,吾将上下而求索。

In case you are interested, a quick update about my sci-fi novel. After many self-reviews I sent the manuscript to my editor, Giulio Mozzi. He will send me the change proposals in a few weeks. I’ll start a new review process informed by his notes, and hopefully finalize the novel in one or two months. Then, finally, I’ll be ready to publish the Italian version. At the same time the finalized novel will be sent to my translator, in the US, and when she ends the translation the English version will be published as well. It’s a long journey, but one that I deeply enjoyed taking.

扫一扫关注【码洞】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis之父:我可不止是一只码农 的相关文章

  • 在 jTextfield 中禁用“粘贴”

    我有一个用 Swing awt 编写的应用程序 我想阻止用户将值粘贴到文本字段中 有没有办法在不使用动作监听器的情况下做到这一点 您可以使用 null 参数调用 setTransferHandler 如下所示 textComponent s
  • 对象数组的数组(二维数组)JNI

    我正在努力创建自定义对象类型 ShareStruct 的二维数组 jobjectArray ret jobjectArray ins jobjectArray outs jclass myClass env gt FindClass env
  • 使类只能从特定类实例化

    假设我有 3 节课class1 class2 and class3 我怎样才能拥有它class1只能通过实例化class2 class1 object new class1 但不是 class3 或任何其他类 我认为它应该与修饰符一起使用
  • 无法访问“不安全”java方法的java表达式语言

    我正在开发一个项目 让用户向服务器提交小 脚本 然后我将执行这些脚本 有很多脚本语言可以嵌入到Java程序中 例如mvel ognl uel clojure rhino javascript等 但是 据我所知 它们都允许脚本编写者调用Jav
  • 记录共享和映射的诊断上下文

    据我所知 其他人做了什么来解决 Commons Logging 项目 针对 NET 和 Java 不支持映射或嵌套诊断上下文这一事实 执行摘要 我们选择直接使用实现者日志框架 在我们的例子中为 log4j 长答案 您是否需要一个抽象日志框架
  • 可访问数据的 Java 约定。 (公共访问器和 Getter/命名)

    通过 Java API 您会看到大量冲突的命名和实践 这让我感到非常困惑 例如 The String http grepcode com file repository grepcode com java root jdk openjdk
  • 如何将 Java 地图转换为在 Scala 中使用?

    我正在开发一个 Scala 程序 该程序调用 Java 库中的函数 处理结果并生成 CSV 有问题的 Java 函数如下所示 Map
  • 用于层次结构树角色的 Spring Security / Java EE 解决方案

    我知道 Spring Security 非常适合标准角色和基于权限的授权 我不确定的是这种情况 系统中管理着 10 000 名员工 员工被组织成组织结构图 跨部门的谁向谁报告的树 其中一些员工是用户 这些用户仅被允许访问其职责范围内的员工
  • 正确签名的 JNLP 应用程序无法在 Java 7 中运行

    我有一个 JNLP 应用程序 由于证书过期需要更新 我有一个经过 CA 验证的新证书 我已将新证书导入到我的密钥库中 我已导入完整的证书链 我的构建文件对构建中的 jar 进行签名和时间戳
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j
  • 如何减去两个 XmlGregorianCalendar 对象来创建一个 Duration 对象?

    我想计算两个时间之间的差值XmlGregorianCalendar对象 从而创建一个Duration object 但我还没有找到执行减法的干净方法 你会怎么做 那应该是 DatatypeFactory newDuration xgc2 t
  • 删除 JFX 中选项卡后面的灰色背景

    So is there any way to remove the gray area behind the tab s 我尝试过用 CSS 来做到这一点 但没有找到方法 要设置 tabpane 标题的背景颜色 请在 CSS 文件中写入 t
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc
  • 让 Hibernate 和 SQL Server 与 VARCHAR 和 NVARCHAR 良好配合

    我目前正在大型数据库的某些表中启用 UTF 8 字符 这些表已经是 MS SQL 类型 NVARCHAR 此外 我还有几个使用 VARCHAR 的字段 Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题 例如 参见在 h
  • 如何使用自定义 JDK 构建 Jenkins 项目?

    我有一个常规的 Jenkins 实例 运行一些多分支管道 该实例在 JDK 11 上运行 因为 Jenkins 并不真正支持更高版本 没关系 但不好的是 我的所有管道似乎也都受到 Java 11 的限制 Jenkins 仅使用它自己也使用的
  • 为什么java.lang.Cloneable不重写java.lang.Object中的clone()方法?

    Java 规范java lang Cloneable接口将自身定义为表示扩展它的任何对象也实现了clone 休眠的方法java lang Object 具体来说 它说 一个类实现了Cloneable接口来指示java lang Object
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ

随机推荐

  • kubernetes资源控制器【一】- ReplicaSet控制器

    一 Pod控制器 Master的各组件中 API Server仅负责将资源存储于etcd中 并将其变动通知给各相关的客户端程序 如kubelet kube scheduler kube proxy和kube controller manag
  • id和instancetype的应用场景区别

    在 Objective C 中 id 是一个通用的指针类型 可以用来表示任何类型的对象 而instancetype是一个表示当前类类型的指针类型 通常用于方法的返回值类型 下面是它们的一些使用场景 使用id的情况 当你需要一个指向任何对象的
  • ubuntu 触摸板失灵解决

    ubuntu 触摸板失灵解决 Ubuntu 20 04 开机发现触摸板只能单击 经常漂移影响打字输入 操作 sudo modprobe r psmouse sudo modprobe psmouse 目的在于重新加载内核触摸板模块 重新加载
  • jquery ui 实现table的sortable功能以及过滤记录功能

    本人在工作中曾使用js实现过用鼠标拖动表格的行实现重新排序的功能 当时写了不少的js代码 最近发现jquery ui也能实现这个功能 而且很方便 真后悔当时不知道有这么个好东东 好 现在介绍下如何使用jquery ui来实现 引入的js文件
  • 邻结矩阵的创建

    图的邻结矩阵是储存图数据的一个手段 储存方式是用两个数组来表示圆 一个一维数组储存图中的顶点信息 一个二维数组 称为邻结矩阵 储存图中边或弧的信息 代码展示 include
  • Kotlin筑基

    Kotlin筑基 本文链接 核心思路 每个知识点都要和源码结合起来讲 文章目录 Kotlin筑基 编译时常量 基本类型 range 访问权修饰符 Unit Nothing 反引号 函数内联 函数引用 具名函数 判空和安全调用 断言操作 空合
  • ARM uboot 源码分析5 -启动第二阶段

    一 start armboot 解析6 1 console init f 1 console init f 是 console 控制台 的第一阶段初始化 f 表示是第一阶段初始化 r 表示第二阶段初始化 有时候初始化函数不能一次一起完成 中
  • 记录Android13权限适配和遇到的问题

    项目场景 修改 Android 13版本中需要修改以下2个权限
  • 后台退出功能开发

    代码开发 代码分析 我们看看后台首页 backend index html 退出按钮绑定的单击事件处理函数logout url employee logout 与 method post 告诉我们应该在雇员控制器EmployeeContro
  • div 固定不动,不随滚动条滚动且不闪动

  • 高并发场景下的 HttpClient 优化方案,QPS 大大提升!

    HttpClient优化思路 池化 长连接 httpclient和httpget复用 合理的配置参数 最大并发请求数 各种超时时间 重试次数 异步 多读源码 1 背景 我们有个业务 会调用其他部门提供的一个基于http的服务 日调用量在千万
  • C++11-14 第9讲 Alias Template(化名)

    template
  • 接口测试——PyTest自动化测试框架(八)

    1 PyTest介绍与安装 PyTest介绍 PyTest是python的一个第三方的单元测试库 自动识别测试模块和测试函数 支持非常丰富的断言 assert 语句 PyTest中的使用约束 测试文件的文件名必须以 test 或 test
  • Java项目 log4j2 配置日志写入指定文件

    一 背景 由于业务需要 需要将服务部分埋点日志写入指定文件 然后进行日志收集 进行数据分析统计 需要通过修改log4j2配置 引入对应logger打印日志实现 二 log4j2 xml配置
  • java 代理(静态代理、动态代理的不同实现)详解及示例

    文章目录 一 代理构成 1 代理介绍 2 应用场景介绍 二 静态代理 1 示例 1 售票服务 2 售票 3 代售点服务 4 静态代理实现 1 maven 依赖 2 实现 三 动态代理 1 InvocationHandler角色 2 Invo
  • 2023年高教社杯数学建模国赛C题详细版思路

    C 题 蔬菜类商品的自动定价与补货决策 2023年国赛如期而至 为了方便大家尽快确定选题 这里将对C题进行解题思路说明 以分析C题的主要难点 出题思路以及选择之后可能遇到的难点进行说明 方便大家尽快找到C题的解题思路 难度排序 B gt A
  • 常见的防火墙有哪几种类型

    防火墙对于游戏 金融 视频等等易受到攻击的行业来说 其部署是相当重要的 虽说不能百分百防御所有攻击 但在其中也起了很大的作用 防火墙是为加强网络安全防护能力在网络中部署的硬件设备 有多种部署方式 常见的主要有以下几种方式 1 桥模式 桥模式
  • STL之二级空间配置器及实现

    之前对于配置器的原理及一级配置器的介绍请看博文 这里写链接内容 下来我们直接介绍二级空间配置器 二级空间配置器 我们通过之前的学习 已经知道 如果所要申请的空间大于128字节 则直接交至一级空间配置器处理 如果小于128字节 则使用二级空间
  • 如何快速提高英飞凌单片机编译器 TASKING TriCore Eclipse IDE 编译速度

    1 前言 使用英飞凌单片机编译器 TASKING TriCore Eclipse IDE 开发编译时 想必感受最深刻的就是编译速度 那是非常慢了 如果是部分修改的源文件编译还好 不用等太久 而如果选择需要全部编译 那么这个时间就很长了 网上
  • Redis之父:我可不止是一只码农

    一年前我暂停了写代码后开始尝试写科幻小说时 以为这是两条完全不一样的路子 随着写的文字越来越多 不断的推倒重写那也是家常便饭了 我现在总算非常确定了 撸一个大系统和写一本小说本质上其实差不太多 它们之间那是非常相似的 这里我们允许 Anti