最近各家公司都发布了自己的 Personal Agent,这应该是我印象里,Agent 第一次以纯粹面向普通老百姓的 2C 形态落地。 从 openclaw 开始,我体验了各家个人 Agent 形态的产品,包括我自己为我自己写的,以及我自己为公司写的 Agent,我有一种感觉是,个人 Agent 其实是一个伪命题,或者说一个聊天形式的 Agent 并不是面向普罗大众的正确交互接口。下面是我认为的原因。
阅读全文之前写了一篇 《尽职编程:AI Coding 时代的个体产出差异的来源》 引发了大家很多讨论,但那篇文章只写了工作态度,没有太多可以指导工作实践的技巧。所以我打算再分享下一些更具实操性内容。 网上关于 AI Coding 最多的讨论都集中在工具和模型,但我认为这种讨论就如同过去人工编程讨论用什么 IDE 和语言一样,没有太大意义。我发现自己现在似乎从来不在乎用的工具和模型是什么,我用过 cursor,windsurf,devin,codex,claude code,没有太大的感觉他们有什么本质的差异。在今年 Opus 4.5 发布之后,我认为连模型的差异也越来越小了。我承认他们各自有各自的特点,但这就好比不同品牌的车一样,作为驾驶员…
阅读全文这一年多的时间以来,AI Coding 已经从一个新潮的编程方式变成了默认方式,每个人都用着近乎相似的模型,相似的设备,相似的 Agent,理论上所有人产出的代码水平也应该相似,但如果你在一线工作过,你会发现实际情况恰恰相反,大家的代码产出水平方差反而比以往更大。这是一个相当有意思的话题,但是我却发现在互联网上鲜有人讨论。
阅读全文我在 AI Coding 能力达到生产级水平后,先后在一家世界500强大公司和一家创业公司任职,有意思的是,我个人对待 AI Coding 的态度和实践在这两家公司截然不同。 在大公司的时候,由于我们在负责一个直接和商品定价有关系的重要系统,且系统已经历经了十几年的持续迭代,所以我对我自己和同事提交的每一行代码都要求极高,不管这行代码是不是 AI 写的,写代码的人必须要看过且看懂了每一行代码在做什么。如果有一个家伙提交了一大片根本无法人工审查的代码,我会对这个家伙非常生气,并认为这是对这个系统和其他同事的不尊重。在这家公司,AI Coding 对整体工作效率的提升其实微乎其微,三分之一的时间在开会对齐对需求的理解,三分之一的时间在处…
阅读全文学习一个技术最好的方式就是能够写一片文章把这个技术的原理解释清楚,本文记录了我在阅读 《Build a Large Language Model (From Scratch)》一书以及和 Claude Code 对话过程中的笔记,仅供参考。 术语解释 向量点积 定义:向量点积为标量 a = (a1, a2, a3) b = (b1, b2, b3) a · b = a1*b1 + a2*b2 + a3*b3 几何意义: a · b = |a| |b| cos(theta) 其中 theta 是两个向量的夹角。
阅读全文最近在做一个思想实验,如果你面前有一个按钮,按下就可以让 AI 从世界上消失,你是否会按下。身边很多朋友的答案都是会毫不犹豫的按下,即便有一些人还是那种最拥抱 AI 的人。 拥抱 AI 和厌恶 AI 可以同时在一个人身上发生,我自己就是这样的人。我厌恶 AI,是因为对昨日世界的怀念,我拥抱 AI,是因为今日世界无法回退,我没有不拥抱的选择。
阅读全文说来惭愧,我已经好几个月没有完全手写代码了,甚至像是把某个变量改一个名字这种活我都宁愿输入更多字符告诉 AI 来做而不是自己直接改了,因为我知道,哪怕是变量重命名这种简单的活,AI 也能做的比我仔细,它会检查所有用到这个变量的代码、相关的注释以及单元测试,然后一并都修改了,而我自己其实历史上就犯过不少忘记修改关联地方的错误。
阅读全文2025 年 12 月跨年之际,为了赶在假期作废之前销假,我报了国内稻草人的一个徒步团,前往尼泊尔安纳普尔那山区进行了为期四天的 Poon Hill 小环线徒步。 尼泊尔最有名的两条徒步线路分别为 EBC 和 ABC。就 EBC 而言,我目前的身体状态和高海拔徒步经验远不足以应对,ABC 相对简单一些,但是依然有高反的风险。由于我印象里自己似乎从未到达过海拔超过 3500 的地区,所以我对自己身体适应高原反应的能力完全没有认知,于是就退而求其次报名了最高登顶海拔 3800 米,最高过夜海拔 3200 米的 Poon Hill 小环线,以此作为我高海拔徒步的入门路线。
阅读全文
092025 年,股市经历了政治的风云变化,也经历了 AI 浪潮的大洗礼。我的整体投资组合也引来了巨大的变化。这一年,标普 500 的年回报是 16.35%,而我的投资组合的回报只有 4.0%,远远跑输了标普 500。
阅读全文
10到 12 月底,我就迈过了人生的第三十个年头,进入到奔四的阶段。听年长的人谈起过,人对时间流逝速度的感知是指数变快的。可能这也是为什么对我而言,抵达三十岁的路程是极为漫长和艰辛的。 这三十年里有近二十年的时间,我的人生是不受自己把控的。你无法决定自己应该看什么书,学习什么知识,交怎么样的朋友,尊敬怎么样的人,甚至连每天吃什么都无法决定。上帝给你随机分配了一个国籍,一个家庭,你的国家不管你认同与否强制把你塞进了一个社会制度,你的家庭又直接决定了你接近二十年的生活质量和初始品格。我的前二十年基本就是活在被权威压迫的氛围中,在我对世界的理解尚浅时,我被中国老师以严厉为美德,以恐惧为工具的教学方法所压迫,而最糟糕的是,我一开始甚至都没有认识…
阅读全文
11我正式 Onsite 的工作经历是从 2017 年 3 月加入即刻实习开始,到如今也已经度过 8 年多的时间。这 8 年时间,我先后任职了 4 家公司,从十几个人的天使轮公司,到一百多人的创业公司,再到五千多人的独角兽公司,最后到十几万人的超大型互联网公司。相伴着这段经历的,也是中国移动互联网快速发展的 8 年,我有过为了理想而自愿加班奋斗的经历,也有单纯为了工资勉强捏着鼻子工作的经历。社交媒体上对各种类型公司的吐槽和夸赞,我大体都有过亲身的体验,也更清楚自己每个阶段需要什么样的环境。恰好现在正式结束了第四家公司的工作,同时又即将到了三十岁的年纪,所以是时候回顾下我这 8 年的职业生涯,也供其他处于早于我的人生阶段的读者在迷茫公司选…
阅读全文从 2014 年上大一开始到现在,我的颈椎已经日均面对电脑超过 8 小时 11 年了,世间的物理器件应该很少有能工作超过 10 年之久的寿命,而我的颈椎也在差不多工作到第 10 年的时候出现了严重的问题。 其实早在四年前的时候,我的颈椎已经给了我警告。但那时候只是偶尔会出现僵硬疲劳的感受,通过每周的按摩差不多都能有所好转,如果专心于工作,其实并不能时刻感觉到不适。后来拍片发现了颈椎已经开始出现了生理性变直的问题,但是由于现代人有相当一部分都有相似的问题,所以我也并没有很在意。并且依然维持着每天十点多到晚上八九点钟的高强度工作节奏,更为糟糕的是,我在那时候还长期保持着趴睡的习惯,让我的颈椎曲度一天 24 小时都没有一个正常的状态。
阅读全文大约是在六七年前第一次听说熊野古道,后来又在任宁的播客 声音:时速三公里 里,对这条路线有了更加清晰的认识,暗暗把它加入了愿望清单。后来由于疫情的原因迟迟未能如愿,终于在今年 5 月,得以来到纪伊半岛踏上了这条古老的朝圣之路。 纪伊半岛毗邻京都,奈良和大阪,在日本历史上一直是重要的佛教圣地,众多高僧名士在此活动,他们往来半岛各处庙宇间的道路便逐渐成了现今的熊野古道。熊野古道分为多条路线,有大边路,小边路,中边路,伊势路等。我们此行选择的是住宿相对最容易预定,难度也适中的中边路。
阅读全文
14自从 2022 年 5 月 4 号抵达新加坡,已经近乎快满三年了。我来新加坡的旅程相当坎坷,具体过程记录在了《那一天,我决定踏出一步》 中。此后,我几乎没有在博客里记录过关于这个国家的任何评论,很大程度是因为我想要更加深入了解这个国家,才好更客观地评价,特别是拿这个国家与之前呆了二十几年的国家进行对比,这样才不失公平。三年过去了,我想是时候重新回顾下这段旅程,也为后来人做一些参考。
阅读全文我是在 2023 年 9 月 28 号去到的阿塞拜疆,而刚刚在一周多前的 9 月 19 日,阿塞拜疆刚刚针对被亲亚美尼亚势力实际控制的纳卡地区展开了所谓的“反恐行动”,控制了纳戈尔诺-卡拉巴赫(简称纳卡)地区。我在阿塞拜疆的旅程也被笼罩在阿塞拜疆与亚美尼亚的领土争端气氛中展开。
阅读全文
162024 年,是我大规模重构投资组合的一年,主要还是由于在新加坡的身份转变后,具备了投资新加坡房产的资格,从而让投资结构从简单的股债配比转向了更多元复杂并且加入了房贷这一杠杆的组合。 我的投资组合计算 我在思考投资组合的时候并非像部分人一样,只是把资产的一部分活钱作为投资资产然后仅计算这部分资产的涨跌。这种方式虽然计算上更加简单,但是实际上会出现股票账户翻倍,个人总资产却没啥波动的情况。所以我会把所有资产甚至是公司期权和公积金都算入投资组合中。
阅读全文
17重新思考 Go 系列:这个系列希望结合工作中在 Go 编程与性能优化中遇到过的问题,探讨 Go 在语言哲学、底层实现和现实需求三者之间关系与矛盾。 前言 过去一段时间,在大量的线上服务 case study 过程中,逐步深入了解了如今的业务 Go 进程是如何在一系列繁杂的基础设施之上运行的。有些表现在意料之中,也有一些出乎意料的发现。
阅读全文TMB - Tour du Mont Blanc 很多年前就听说勃朗峰周边有一条多日徒步线路,从霞慕尼出发,环绕勃朗峰徒步一整圈最后回到霞慕尼。但是由于很难请到这么长时间的假期,所以一直没能如愿。甚至四年前的时候还去到过霞慕尼,但是那时候只是把它作为一个景点,简单去了下南针峰从山顶观看勃朗峰。那时甚至都霞慕尼这个地方大头来头,也没来得及在当地住一晚细细品味它的户外氛围。
阅读全文
19特摩索斯(Termessos)位于土耳其南部城市安塔利亚的北面大约 30 公里,是一座起源神秘,消亡也神秘的深山古城。它第一次被历史提到是在公元前 333 年亚历山大大帝包围这座城市时,但即便是征服了希腊世界的亚历山大大帝也并未能成功征服特摩索斯。 特摩索斯建于海拔 1000 多米的山口位置,由于特殊的地理位置,加上完善的水利设施,所以即便被包围也只需要一小只军队便可守卫,这帮助这座城市在那个群雄逐鹿的希腊化时期和罗马帝国时期得以一直以独立城邦的状态存活下来。一直到公元 5 世纪的一场地震摧毁了这座城市的蓄水库,导致居民不得已陆续搬迁,最终荒废并被人们所遗忘。一直到 19 世纪,欧洲的探险家才重新发现了这座城市,但即便到今天,特摩索…
阅读全文
20重新思考 Go 系列:这个系列希望结合工作中在 Go 编程与性能优化中遇到过的问题,探讨 Go 在语言哲学、底层实现和现实需求三者之间关系与矛盾。 Go 语言是一门为实现 CSP 并发模型而设计的语言,这也是它区别于其他语言最大的特色。而为了实现这一点,Go 在语法上就内置了 chan 的数据结构来作为不同协程间通信的载体。
阅读全文重新思考 Go 系列:这个系列希望结合工作中在 Go 编程与性能优化中遇到过的问题,探讨 Go 在语言哲学、底层实现和现实需求三者之间关系与矛盾。 Go 在语法级别上提供了 Slice 类型作为对底层内存的一个「操作视图」: var sh []any // ==> internal struct of []any type SliceHeader struct { Data uintptr Len int Cap int } 编程者可以使用一些近似 Python 的语法来表达对底层内存边界的控制:
阅读全文四月与五月之交,我完成了人生中迄今为止最惊心动魄的一次冒险。与通常的冒险经历不同的是,一般的冒险人们总愿意在往后的岁月里反复回忆甚至加工,但我的这次冒险我希望此生永远的忘记,但我又明白,之所以我如此迫切地想要忘记,是因为这段经历将会不可逆地影响我一生。
阅读全文
232015 年 9 月 2 日,一位名叫艾兰的叙利亚难民儿童尸体在土耳其的海滩上被发现,并被拍下了一张影响深远的照片。 如果你在网络上尤其是中文网络上查阅这张照片的新闻时,会发现有相当一部分人在拿出各种“证据”试图证明它是摆拍的。 这张照片之所以牵动人心是因为它叙述了一个真实存在的现象是,叙利亚儿童正在因为逃难而失去生命。这个现象是真实存在的,你在这个海滩上站到深夜就能看到这个客观事实,但是具体到这个照片与这个事实是否是百分百匹配的,确实有很多可被质疑的空间,例如这个儿童有可能来自伊拉克,例如摄影师有可能把他换了一个姿势来拍摄。但是这些真的重要吗?或许对于历史学家来说,的确重要,但是对于一个普通民众来说,或许并没有那么重要,至少在此时…
阅读全文
24如果正在阅读这篇文章的你认为自己的价值观在这片土地上属于多数价值,被这块土地充分地实现,希望你不要继续阅读下去,也不要将它传播给任何你的朋友。我尊重你的价值观,但恐怕你不一定会尊重我的,为了你好也为了我好,请不要与我有任何交集。 我并不认为自己的价值观一定正确,但是我的价值观,是通过一点一滴的阅读,通过与不同人群的交流,亲眼所见亲耳所听构建出来的。我对它的自信源自于它一次次在苏格拉底,在耶稣,在马丁路德金,在苏轼,在鲁迅,在我身边所有优秀的朋友身上一次次被验证被歌颂,它不见得一定是全人类共同拥有和应该拥有的,但它表达了那部分我愿意与其共处的人类千百年来共同的价值诉求。
阅读全文过去并没有写年终总结的习惯,但是如今也正式奔三了,记忆力一年不如一年,时常忘记自己过去做过什么,有过什么想法。前段时间和很久不见的老朋友见面,意外地提起我 N 年前说过的一句话,而我却完全不记得自己当时竟有过这样的想法。恍忽间才意识到,即便彼时彼刻的我已然在我自己心中消失殆尽,却意外地变成了一段段碎片,分散存储在过去朋友的记忆中,成为一个个 Snapshots,成为了彼时彼刻的那个我存在过的证据。
阅读全文
26什么是连接 在物理世界并不存在连接这么一说,数据转换为光/电信号后,从一台机器发往另一台机器,中间设备通过信号解析出目的信息来确定如何转发包。我们日常所谓的「连接」纯粹是一个人为抽象的概念,目的是将传输进来的无状态数据通过某个固定字段作为标识,分类为不同有状态会话,从而方便在传输层去实现一些依赖状态的事情。
阅读全文何为序列 对于计算机而言,一切数据皆为二进制序列。但编程人员为了以人类可读可控的形式处理这些二进制数据,于是发明了数据类型和结构的概念,数据类型用以标注一段二进制数据的解析方式,数据结构用以标注多段(连续/不连续)二进制数据的组织方式。 例如以下程序结构体:
阅读全文
28微服务之间的 RPC 调用往往会使用到限流功能,但是很多时候我们都是用很简单的限流策略,亦或是工程师拍脑袋定一个限流值。 这篇文章主要讨论在 RPC 限流中,当前存在的问题和可能的解决思路。 为什么需要限流 避免连锁崩溃 一个服务即便进行过压测,但当真实运行到线上时,其收到的请求流量以及能够负载的流量是不固定的,如果服务自身没有一个自我保护机制,当流量超过预计的负载后,会将这部分负载传递给该服务的下游,造成连锁反应甚至雪崩。
阅读全文
29作为软件工程师,我们在谈论自己时,总会认为自己是所谓的高科技行业从业者,但是如果观察自己的日常工作,时常会觉得似乎和真正的科技也没有什么关系。所以究竟什么是科技?我们要如何来定义我们每天的工作? 我认为宏观意义上的科技可以被拆解成三个概念:科学(Science),技术(Technology)和工程(Engineering)。
阅读全文为什么需要通用对象池 在实际生产环境中,我们经常会遇到需要多线程共享同一堆对象的场景,例如常见的RPC、数据库连接池,大内存对象池,以及线程池等。这些池化对象的需求其实有很多重叠的地方,主要分以下几个方面: 基础设置: 最大容量 创建/校验/删除对象的回调方法 申请对象时,已满时是否阻塞 多重驱逐策略: 驱逐闲置对象 驱逐无效对象 预创建对象 为避免重复编码,所以设计了 Pond 这样一个能够支撑多种使用场景的通用对象池。另外,在 Pond 的基础上,还实现了 Goroutine 池库: Hive。
阅读全文最近在写一个编解码的功能时发现使用 Golang for-range 会存在很大的性能问题。 假设我们现在有一个 Data 类型表示一个数据包,我们从网络中获取到了 [1024]Data 个数据包,此时我们需要对其进行遍历操作。一般我们会使用 for-i++ 或者 for-range 两种方式遍历,如下代码: type Data [256]byte func BenchmarkForStruct(b *testing.B) { var items [1024]Data var result Data for i := 0; i < b.N; i++ { for k := 0; k < len(items); k++ {…
阅读全文最近遇到一个由于 Golang Interface 底层实现,引发的线上 panic 问题,虽然根源在于赋值操作没有保护起来,却意外地发现了关于 interface 的一些有意思的底层细节。 假设我们现在有以下定义: type Interface interface { Run() } type Implement struct { n int } func (i *Implement) Run() { fmt.Printf(i.n) } 对于使用者而言,一个变量无论是 Interface 类型或是 *Implement 类型,差别都不大。
阅读全文机器世界与真实世界的差异在于,机器世界的法律是约定能够做什么,而真实世界的法律是约定不能够做什么。编程是在一个有限中变化出无限,而生活是在无限中寻找到自己的有限。机器世界本身就是真实世界中的一个小小的有限。 人们总试图从一个无限的世界里去发寻规律,以其获得一条在有限领域能够稳定可靠的真理。无论是科学甚至玄学,概莫如是。
阅读全文背景 最近在实现一个随机负载均衡器的时候发现一个问题,在高并发的情况下,官方标准库 rand.Intn() 性能会急剧下降。翻了下实现以后才发现它内部居然是全局共享了同一个 globalRand 对象。 一段测试代码: func BenchmarkGlobalRand(b *testing.B) { b.RunParallel(func(pb *testing.PB) { for pb.Next() { rand.Intn(100) } }) } func BenchmarkCustomRand(b *testing.B) { b.RunParallel(func(pb *testing.PB) { rd := rand.New(r…
阅读全文边走边想 小时候在百度知道里提过一个问题,「人活着的意义是什么」。靠这个问题赚了一些百度积分,可并没能消除我当时的困惑。长大后在王兴的一个访谈里,看到他在大学同乡迎新会的时候问了学长们一样的问题,当时他姐刚好也在,为了打破尴尬不得不模糊地回答了一句: “这个问题,要边走边想。” Nothing But Yourself 在播客《阿米小酒馆 - 【op.23】两个写作者的困顿与坚定》 中听到复旦民间校训「自由而无用」的英文翻译原来是「nothing but yourself」,瞬间被这句话击中。
阅读全文
36文件系统是操作系统 IO 栈里非常重要的一个中间层,其存在的意义是为了让上层应用程序有一层更加符合人类直觉的抽象来进行文档的读写,而无需考虑底层存储上的细节。 本地文件系统 在讨论分布式文件系统前,我们先来回顾下本地文件系统的组成。 存储结构 在前面一张图里,我们能够看到文件系统直接和通用块层进行交互,无论底层存储介质是磁盘还是 SSD,都被该层抽象为 Block 的概念。文件系统在初始化时,会先在挂载的块存储上的第一个位置创建一个 Super Block:
阅读全文
37最近在玩动物森友会的时候时常会遇到一些迷之联机问题,在网上一番搜索,发现大家的答案都趋于用玄学来解释,于是便有了兴致想在原理上搞懂这些问题产生的根源以及动森这款游戏的一些联机设定背后的技术原因。 事先声明,本人并不从事游戏行业亦非主机游戏长期玩家,如有纰漏或其他角度的补充,欢迎在评论区告知。
阅读全文
38前段时间有一个小事情让我想到创业公司文化这件事情。 我目前就职在一家创业公司,我们有一个文化是有相当一部分同事会有一个「艺名」。艺名的产生有很多种场景。一种类似古代的「字」,是自己为摆脱原始名字的依赖,为自己取的代称,有着很强个人色彩,比如我的 Joway。还有一种是在公司发展过程中自然而然形成的「外号」,比如中国公司常见的X哥,通常还带着点共同记忆在里面。
阅读全文10月份的时候在伊朗自南向北,进行了为期 9 天的旅行。 之所以会想去伊朗,是因为在 2019 年发生了太多事情让我疲于不断修正自己的价值观,以至于我连基本的「明是非」能力也丧失殆尽。如同数学公式推导一样,我需要有一些基本的「公理」,以此来构建价值观的「定理」。而越是试图去理解这个世界,越是会发现似乎这个世界是不存在一个「普世」的「公理」。
阅读全文
40最近解决了一个 Node.JS 应用内存泄漏 Bug,顺便学会了用 Chrome DevTools 去看 heapdump 文件。这里做一些简单的记录。 如何「优雅地」获得 heapdump 文件 由于我们所有应用都是以容器部署的,所以要去获得某个容器内的文件,并拷贝到本地难度还是比较大,也非常麻烦。考虑到调试时或许会需要下载非常多次的 snapshot 文件,建议可以包下 heapdump 库,做成一个接口,把文件 dump 之后再传输给客户端,这样一劳永逸。
阅读全文
41本地内存缓存是一个在基础软件架构中非常常见的基础设施,也正因其过于常见,以至于平时很少去思考它是如何实现的。在尚未设计缓存系统前,完全没想到原来要需要考虑如此多复杂的事情。本文将由浅入深介绍如何设计一个现代的高性能内存缓存系统。 什么时候需要本地内存缓存 在大部分业务系统中,都会使用诸如 Redis、Memcached 等远程缓存,一方面可以避免自身进程内存占用过大而导致的 OOM 或 GC 问题,另一方面也可以实现多个进程共享同一份一致的缓存数据。但对于某些底层服务(例如数据库服务),远程缓存的网络延迟是不可接受的,这就势必需要引入本地内存缓存。
阅读全文
42在 Linux 中,所有外部资源都以文件形式作为一个抽象视图,并提供一套统一的接口给应用程序调用。本文将以宏观视角试图阐述 Linux 中关于文件 IO 的整个调用脉络。 VFS 在 Linux 中,所有 IO 都必须先经由 VFS 层进行转发。通过 VFS 将包括磁盘、网络 Socket、打印机、管道等资源全部封装成统一的接口。
阅读全文
43过去很长一段时间里,我对 SSD 的了解仅限于其和 HDD 的区别和一个标签化的「速度快」认知,至于其什么时候快,为什么快却鲜有了解。直到最近开始研究数据库时,发现数据库设计和存储发展和特性紧密联系,不可分割,于是才开始回过头关注起 SSD 的结构和原理,猛然发现之前关于 SSD 有许多非常错误的认识。
阅读全文
44四年前在知乎提过一个问题,「什么是真正的编程能力」,当时这个问题获得了许多业内前辈的热诚回答。时过境迁,前段时间和朋友谈起最初使用知乎的经历,这才又想起当年年少无知提的这个问题,多年以后去一一回顾当时大家的回答,对每句话都有了更为深刻的理解和感触。
阅读全文我刚参加工作不久,便发现了一个似乎通行于世的规律,即一个人的沉默程度与其年龄大小成正比。我曾向多位年纪稍大的同事咨询过这个现象,但得到的多是意味深长的一笑然后没有了下文。 王小波在《沉默的大多数》中引用过萧伯纳的一段话: 工业巨头安德谢夫老爷子见到了多年不见的儿子斯泰芬,问他对做什么有兴趣。这个年轻人在科学、文艺、法律等一切方面一无所长,但他说自己有一项长处:会明辨是非。老爷子把自己的儿子暴损了一通,说这件事难倒了一切科学家、政治家、哲学家,怎么你什么都不会,就会一个明辨是非?
阅读全文在谈论手机 App 或是网页时,我们总会谈到交互设计,但倘若涉及到面向专业用户的 CLI(Command-line interface)领域,很少有人会将它与用户交互相联系。甚至在很多人的大脑里,已经把 CLI 和「难用」画上了等号,更有甚者认为 CLI 的难用才体现了其 「专业性」。 与此同时,「RTFM」(Read The Fucking Manual) 作为一个梗在工程师群体广泛流传,也让许多作者对于其不好用的 CLI 有了一个天然的借口。
阅读全文警告: 本文有轻微剧透 2018年体验了几款围绕「选择」话题的作品,游戏《荒野大镖客:救赎 II》美剧《西部世界:第二季》和电影《黑镜:潘达斯奈基》。 这三款作品都在试图探讨人类自由意志的局限,探索自由选择的边界。 荒野大镖客:救赎 II 选择自由的前提是选项的自由 荒野大镖客通过海量的游戏脚本堆砌出了一个伴随玩家选择而衍生出不同路线的开放世界。每个游戏关卡玩家都有极高的自由度选择自己的行为从而影响游戏发展。听起来似乎非常自由,但在实际体验中,我们的自由仅限于在游戏规划好的脚本里去一次次命中不同的脚本条件,在游戏中后期你基本上已经摸清了所有脚本的范式,自此,你的选择将不再是探索未知,而是主动依靠选择不同的选项来推动游戏。这种选择和使…
阅读全文许多人都热衷于去说服和自己观点不同的人,但这种做法往往是徒劳的。我曾经说服过坚信中医的人不信中医,但是没几天我就会发现他居然还信星座。去改变的人观点其实是一件杯水车薪的事情,因为他们产生这种观点的背后有着一套完善的思维方式。只要这套思维方式不改变,你们永远会存在无数的观点冲突。江山易改,本性难移的"性"就是指的这套思维方式。但是改变一个人最彻底的方式,也是去改变他的思维方式。
阅读全文背景 情头(情侣头像)一般指成双成对的头像,可以是真人照片,也可以是卡通人物等图片。衍生出去还有闺密头像和基友头像等等。 社交媒体上有一个非常令人费解的现象是,如果你去即刻、豆瓣、百度贴吧、微博,会发现有大量的人在上面贴了一个头像,然后寻找和它匹配的另一半头像,例如这样: 市面上的情侣头像大多是一些社区里的大佬自己制作出来的,然后发到社区里,再慢慢流传开来。这种传播方式导致了很多情头在传播时候早就被拆散了。很多人可能只找到了其中一个,但是想要找到和它配对的另一半。 还有一个问题是,当你看到一个头像时,没有人能够确定这个头像是否在制作时候就有另外一半。 一些程序员朋友最早看到这个问题时,总会天真地想去搜索引擎里识图一下就行了。但这里有…
阅读全文
50背景 jike-io 是即刻基于 socket.io 构建的一个实时通信基础设施。目前客户端上的所有实时通信服务都是建立在其基础上,涵盖了私信、消息通知、用户反馈、活动页小游戏等诸多组件。 在目前即刻的实时通信设计里,我们的实时通信只是为了让服务端主动推送消息给客户端,客户端不会主动通过 websocket 发送消息。由于几乎我们所有需要发送消息的请求都会有一定业务逻辑在,而这个业务逻辑我们并不希望 websocket 连接层(jike-io)去处理,所以我们仍旧采用传统 HTTP 请求的方式去发送请求。至于之后是否需要推送消息给用户,由服务端调用 jike-io 的接口进行实现。
阅读全文