回顾了一些读者来信

从 2014 年开始写博客以来,因为不设评论区,我收到不少读者的 Email 来信。透过 Email, 来信的人比评论区直接评论要更严谨一些。来信中的大部分是请教问题,其它则是一些感谢的话。

几天前我购买了一块软木板挂在自己的房间,想到可以把一些有意思的读者来信打印出来钉到软木板上。于是在收件箱整理了 2014 年至今 5 年来收到的所有读者来信。

其中我发现一封 2015 年的已经被我淡忘的邮件:

这是一位在国外当老师的妈妈,特意来信想为她的儿子寻问关于编程的问题。当时我回信尽可能地写了很多浅薄的意见和经验分享,后来就再没有通信。这位母亲让我感动。

时隔几年再看来往的信件,无论是提到的这位母亲,还是其它特意发来感谢的读者,他们让我收获到的是,我写的文字确实帮助了一些人;五年来我坚持写独立博客是有意义的;这些来信让我意识到我活在世上还是有一点微不足道的贡献。所以我最开心的是看到来信里面提到的,我对读者的影响是什么。

对我来说,有没有活下去的勇气,取决于我在世界上有没有创造价值。这些读者来信是我写博客收获的最宝贵的财富。

所以这些人呢,不管是什么借口,最终选择了去做恶心的成年人社会中的一个恶心的人,最可气的是他们之后还产生了幻觉,说这就是“成熟”。于是又过来毒害年轻人,跟他们说,你看,我年轻的时候也像你这样,现在我这叫成熟,你这叫幼稚。

我现在看到很多我的同龄人变成这样,很多人都是我小时候的好朋友,也曾经充满了理想,充满了美好的这些东西,然后相信自己可以改变世界,最后却变成了这种恶心的人。

我回家吃饭心情好就敷衍一下,有时候心情不好就忍不住当场戳穿他们。我说:“你看你们这帮兔崽子,年轻时候我们在一块儿聊,都说要改变世界,现在你,你改变个屁了。”然后他们就有点不好意思,说:“哎呀,行了,老罗,咱们那时候不是幼稚吗?谁能改变世界?谁也改变不了世界。”我就跟他们说:“你别客气了,你已经改变这个世界了,因为你变成了一个恶心的人,这个世界多了一个恶心的人,因此它变得恶心了一点点。”

每一个生命来到世间,都注定改变世界,这是你的宿命,你别无选择。你要么把世界变得好一点,要么把世界变得坏一点。

你如果走进社会,为了生存或是为了什么不要脸的理由, 变成了一个恶心的成年人社会中的一员,那你就把这个世界变得恶心了一点点。 如果你一生耿直,刚正不阿,没做任何恶心的事情,没有做任何对别人造成伤害的事情,一辈子拼了老命勉强把老婆、孩子、老娘,把身边的这些人照顾好了,没有成名,没有发财,没有成就伟大的事业,一生正直,最后梗着脖子到了七八十岁死掉了,你这一生是不是没有改变世界?你还是改变世界了,你把这个世界变得美好了一点点。因为你,这个世界又多了一个好人。

—— 罗永浩


via Randy's Blog

Invalid media:
image
image
image
image
image
爱情是愿意为你放弃寻新鲜

昨天在回杭的飞机上看完《Newness》, 一部探讨开放性关系的电影。男女主角都喜欢新鲜感,最后因为约炮堕入爱河,但很快开始感到关系平淡和厌倦,于是尝试开放性关系. 各自一番经历后最终决定放弃自由,认真经营这段感情。

我很喜欢探讨这种两性哲学问题,因为我在看待两性关系中有些犬儒主义 —— 我不相信人性,不相信忠诚,世界上充满诱惑。更愿意相信大多数的婚姻是一场交易。

当两人初试开放性关系时,遇到一位专家在谈论「外遇」和「开放性关系」的成因,她说:
When I go to look for someone else, it’s not always because I wanna get away from you, it’s because I wanna get away from the person that I have myself become. And it’s not that I want to find somebody else, but I want to find another self.
当我开始想寻找另外一个人的时候,不是因为我想离开你,而是想逃离这个状态的我。我想寻找的不是另一个人,而是另一个我。
我想,这就是除了厌倦、诱惑之外,外遇的核心原因 —— 无法接受这个安定的自己。

有意思的是,在片中,男主角对开放性关系的底线,是只有自己可以令女主角高潮。所以每次女主角回家,他都会问女主角 Did you come (你高潮了吗)? 后来,女主角被一位成熟、事业有成的大叔深深吸引,她在他身上得到高潮后,男主角才感到他们的这段关系,已经彻底崩坏。

片尾,男女主角决定承受平淡、怨怼,回到对方身边。因为在各自经历过后,更加清楚彼此为何在一起。

或许最可靠稳固的关系就是双方愿意为对方失去那个原本的自己,而且是亲身经历告诉他们为何值得这样牺牲。

正如片中的两性专家所说,「开放性关系只是一个过程,千万不要把它作为你们的终点」。
Think of it not as the destination, but the layover.


via Randy's Blog

Invalid media: image
未来属于声明式编程

声明式编程 (Declarative Programming)是一种编程范式。现实世界中,我们大部分编码都是命令式的。

举个最常见的例子,对于用 JavaScript 来构建 UI, React 是声明式的。
// 普通的 DOM API 构建 UI

const div = document.createElement('div')
const p = document.createElement('p')
p.textContent = 'hello world'
const UI = div.append(p)
// React 构建 UI
const h = React.craeteElement
const UI = h('div', null, h('p', null, 'hello world'))

所有的 DSL (HTML, XML, SQL) 都是声明式的,你写出一条 SQL 语句,只是为了告诉数据库你要什么,然后数据库就会给你对应的数据,而不是通过数据库的 API 去取。
SELECT * FROM Products WHERE name='Alipay'

Apple 在今年 (2019 年) 也推出了 Swift UI, 在 WWDC 的 Swift UI 相关的 Session 里也多次提到声明式 UI 开发的威力

声明式编程的潜力在于:

解放人力成本,你只要「声明」你要做什么,具体怎么做,由运行时解决。

函数式编程就是声明式编程的一种,在函数式编程里的尾递归性能,就取决于运行时,而不是靠程序员去手动优化。React 里你只要描述你的 UI, 接下来状态变化后 UI 如何更新,是 React 在运行时帮你处理的,而不是靠程序员优化 diff 算法。

我们可以认为 Serverless (尤其是函数计算) 在运维领域获得了声明式的好处 —— 我们定义好了函数,我们只要告诉平台我们需要调用这个函数,那么如何进行计算资源分配、如何对代码做分布式部署,都不需要程序员考虑。

运行时帮你完成工作,除了可以节省人力成本外,还降低了程序员出错的概率 —— 因为写的代码越少,出错的概率就越小。人是最不可靠的,我们应该尽量把工作交给计算机。

「声明」是「描述」而不是真正「执行」

在纯函数式编程语言里面,一切都是声明式的,是纯 (Pure) 的,没有副作用(Side Effect)的。

Haskell 是一个纯函数式的语言,像在控制台输出文本这种方法(putStrLn)就是一种副作用。在 Haskell 里 putStrLn "Hello World" 本身不会真正地输出 “Hello World“, 而是返回一个 IO 类型,来说明他是一个副作用。但它如何被执行,取决于运行时。

Elm 和 Haskell 一样,副作用也只是返回一种类似 Haskell 中的 IO 类型。在 Elm 中叫做 Cmd.

以上说的这些,可能太过抽象。所以我用前端的同学们应该都知道的 redux-saga 对此作更具象的解释。也可以解答为什么我虽然不喜欢 Redux, 但认为 redux-saga 是一个的很不错的库。因为他利用 redux 的 middleware 机制和 generator 巧妙地实现了类似 Haskell 的 IO.

下面我将用 官方文档的例子 做解释。

比如,以下是一个有副作用的函数:
import { call } from 'redux-saga/effects'

function* fetchProducts() {
  const products = yield call(Api.fetch, '/products')
  // ...
}

显然,Api.fetch() 是副作用,它会发送网络请求。但是,在 redux-saga 里面,你不应该直接执行这个函数,而是使用 call 告诉 redux-saga —— 你要执行 Api.fetch , 参数为 /products.

所以,事实上这个函数没有被命令式地被执行,而是由 redux-saga 决定如何执行。

如果你在外部直接调用 fetchProducts(), 你会得到一个 Generator Iterator. 然后通过 next() 得到你 yield 的值。所以你可以这样去测试你的程序:
const iterator = fetchProducts()

// expects a call instruction
assert.deepEqual(
  iterator.next().value,
  call(Api.fetch, '/products'),
  "fetchProducts should yield an Effect call(Api.fetch, './products')"
)

也就是说,你要测试的是「你有没有告诉程序你要执行的副作用,以及执行的参数是什么」。和命令式编程不同,因为命令式的程序在你执行函数时会真实地执行这个 Api.fetch,你必须用测试框架里类似 mockFn 的手段去 mock 这个函数进行测试。

fetchProducts() 只有在 Redux 环境里,才会真正地执行副作用(在这里就是 Api.fetch 发送的网络请求)。

所以,声明式的编程是非常易于测试的

可视化编程是一种声明式编程

我们探索可视化编程,是因为我们一直期望通过拖拽就能完成开发,其实就是期望我们完成任务仅仅需要通过声明,而不是写命令式的代码。当然这是一种理想的状态。

DSL 是最常见的声明式编程形式。我一直在布道 GraphQL, 因为它把网络请求变得声明式了:
query {
 posts {
  id, title, content
  }
}

把网络请求变成声明式的好处有很多,其中一个就是它可以被放到各种各样的环境被执行。想象一下,我们可以打造一个可视化的应用搭建工具,在命令式编程的场景下,我们如果要做出如「点击按钮发送请求,得到响应后触发另一个 UI 更新」,就需要编写命令式的代码:
async function onClickButton() {
 // 手动发送请求
 const result = await fetch('/api')
 // 手动更新 UI
  table.dataSource = result
}

如果是 GraphQL, 我们可以把每一条 GraphQL 语句单独看作一个对象,他可以被任何组件触发,它的结果也可以被任何组件订阅。这样一来,在可视化的搭建工具里,程序员要做的是:

1. (声明式地)编写 GraphQL 查询语句
2. (声明式地)为组件(比如某个按钮)绑定 onClick 事件为触发某条查询语句
3. (声明式地)为组件(比如某个表格)绑定某条查询语句的响应值对应哪些组件的属性值

当然现实世界的应用不是那么简单,但已经是跨出了很大一步。

Conclusion

未来为什么属于声明式编程,因为我们在不断地努力提高开发效率,声明式编程显然是提效的最佳手段。React, Flutter, SwiftUI, GraphQL 的出现是最好的证明。最近听到内网太多人在提 Serverless, 我想说,提升开发效率,我们应该去想如何尽量让开发者声明式地编写代码,而不是只去想我们在 Serverless 上能做什么。

via Randy's Blog

Invalid media: image
井底之蛙的一片天空

有次和朋友提到移民的想法,他说,为什么不考虑日本呢?我的回答是,我对日本没有特别的情感。朋友说他正相反。然后他问道:难道你的童年没有看日本动画吗?

我的童年除了阅读,大部分信息的获取来源于电视机。我从电视机看过的日本动画不少 —— 在 CCTV 少儿频道看《四驱兄弟》,在 TVS (南方卫视) 看《哆啦 A 梦》,在华娱卫视《通灵王》、《军曹》,在本港台看《游戏王》,在翡翠台又看了不计其数的,就不一一列举。

我从这些动画片里感受不出日本文化,一是因为都是中文的配音,二是基本上我看的都是虚构类作品,无法从中了解到日本的文化生活。只有翡翠台偶尔播出一些配音的日本真人电视节目,让我了解到日本的街道和风景是如此模样,但仅此而已。

不过我却很能理解我的那位朋友,因为我对另一片土地 —— 香港 —— 有一样的感受。

电视机把我和香港的距离拉得很近。白天有「卡通片」,傍晚有儿童节目,每晚六点半,可以看《六点半新闻报道》,知道香港、国际在发生的事。7点半后,有《东张西望》看娱乐新闻。紧接下来就是八点档和九点档的电视剧。

我是看香港电视剧和电影、听「广东歌」长大的。聊起亚视的「柒事」,我们一样会大笑。现在不看电视,但还有 YouTube. 走在香港街头,我一个广东人,和香港人又有什么太大的区别呢。

最大的区别可能是,我很羡慕香港人。香港人可以有不同的政见,可以自由表达自己的观点,有权发声争取自己(或别人)应有的权利,可以大声对别人讲:「香港系有言论自由咖」!不用担心「讲错嘢」。而我不能。

香港不能失去这些。我愿意在这样的地方生活。香港是我的精神家园。

撇开身份认同,在政治上,香港回归早已经是国际社会公认的。我自己作为中国人,一直为中国有这样的香港感到庆幸。因为这代表中国人还能有另一种作为中国人的方式。

而我,很惭愧,虽同讲广东话,但在内地,也只不过是一只知道自己是井底之蛙的井底之蛙罢了。

王小波说「井底之蛙也拥有一片天空」,对我来说,这片天空就是香港。

衷心祝福香港。

via Randy's Blog
我想得到它,因为它是好的

王小波在《跳出手掌心》里有这么一段话,初读时使我似醍醐灌顶:
我上大學時,有一次我的數學教授在課堂上講到:我現在所教的數學,你們也許一生都用不到,但我還要教,因為這些知識是好的,應該讓你們知道。這位老師的胸襟之高遠,使我終生佩服。我還要說,像這樣的胸襟,在中國人文知識分子中間很少見到。
把「知识」换成「普世价值」,我认为道理同样成立:

我们追求普世价值,是因为普世价值是好的,是对的,只要你是人类,你就应该拥有他。如果有人不幸失去,那么就应该帮助他。

令人难过的是,由于一系列客观条件,一部分人无法对此感同身受。普世价值和民族无关,和国籍无关,它属于全人类。一旦能意识到一点,那么这些人就很容易能识破一些延用了近半个世纪的可笑的借口和谎言,他们的被害妄想症也理应会被治愈。

很遗憾,我得不到它,我本应该能为此不断地写,不断地写,但我不能。这让我难过了很多年,一直到现在。

愿不在意的人能一直不在意,以免遭受这种难过。

via Randy's Blog
人生是不断取舍的过程

如果问工作以来我悟出的最重要的观念是什么,那就是,人生是一个不断取舍的过程。

我们总是在作自己未来的规划和目标的时候说,我想要什么,而忽略了问自己一个问题,「我愿意为此舍弃点什么」。我们逃避了残酷的事实 —— 我们每天只有 24 小时,我们什么都想要,但这是不可能的。

意识到这一点,有利于我们做很多的决策,而且对很多让你感到可惜的事都释怀了。

有人总是会在年初列下自己的读书清单,但直到年底,发现自己一本都没有读完。这是很多人懊恼和焦虑的来源 —— 为什么我总是无法履行自己的规划?

过去我总会把原因归咎于没有做好时间管理,但后来我顿悟了,在列下读书清单时,并没有问自己这样的问题 —— 你愿意为读书带来的精神收益,而舍弃点什么?

如果你在制定任何规划时都这样问自己,那么,你就会在每一次决策前明确这一点:这件事于你而言到底有多重要?如果阅读于你而言比看美剧重要,你就要作出取舍:把你看美剧的时间,花在阅读上。

如果你认为做得到,那么就让它正式成为你的规划。如果你做不到,那么就不要让它成为你的规划。何必为自己制定一个无法完成的计划呢?它除了为你带来无意义的焦虑,无一用处。

宁愿看美剧而放弃阅读并不可耻,活得明白是最重要的。只要这是你权衡后作出的取舍,那么你就不会为此而感到焦虑。

我在《健身一年》里提到,一年前我下定决心开始健身,当时我问自己:我能为健身舍弃什么?

健身需要耗费每周四天每次 2 小时的时间,这些时间我可以用来写代码,做音乐,阅读。我愿意舍弃他们吗?

经过权衡后,我决定舍弃他们。于是我获得了一些健身的成果,同时我再也不为放弃了大量的阅读、写代码、做音乐的时间而焦虑。因为我早就知道,如果我想要获得健身的成果,这些是必须放弃的。

不必为「我没有时间 xxx」而感到可惜,因为你没时间做的事,不过是在为你更想做的事让路而已。(除非你把时间都花在偷懒上)

每个人有不同的活法,对待事件的优先级也不尽相同。只要认识到「吾生也有涯」的局限,你就可以从每一年底的「责怪自己没有做到什么」转变成「为自己做到了什么而感到高兴」。人生因此也变得简单得多 —— 你只要保证自己不是在虚度光阴即可。

就像即使我现在惧怕婚姻,若是将来某一天也选择了婚姻,那一定是比起婚姻让我失去的,我更想得到婚姻给我带来的。

via Randy's Blog
2018 年终总结


大人热爱数字。如果你跟他们说你认识了新朋友,他们从来不会问你重要的事情。他们从来不会说:“他的声音听起来怎么样?他最喜欢什么游戏?他收集蝴蝶吗?”

他们会问:“他多少岁?有多少个兄弟?他有多重?他父亲赚多少钱?”只有这样他们才会觉得他们了解了他。

如果你对大人说:“我看到一座漂亮红砖房,窗台上摆着几盆天竺葵,屋顶有许多鸽子……”那他们想象不出这座房子是什么样子的。你必须说:“我看到一座价值十万法郎的房子。”他们就会惊叫:“哇,多漂亮的房子啊!”

—— 《小王子》
2018 对我自己来说,是灰心的一年。这一年除了和往年一样的焦虑以外,也没有做成什么我认为了不起的事。很大的原因是我对技术失去了信心。

小时候,我最大的理想是「用技术改变世界」,但我早在我的 2017 年终总结 里提到:「技术并不是那么重要,它只不过是一种手段而已」。今年我更加确信这一点,我们做技术的人,永远只能间接地改变世界。一个可以改变人们生活方式的产品,技术虽是不可缺少的部份,但也不是起决定性作用的部分。

于我而言这是灾难性的信仰崩塌。

有时夜里我也会反思,是不是对自己的要求太高了,又或者是,我太想向别人证明自己,害怕自己变得平庸。而在今年,我意识到自己真的变得平庸了,所以我把他称为灰心的一年。

而今年最主要的心态变化,则是随着年龄的增长和财富的积累,我不免也会想到未来的现实生活。婚姻、家庭、置业,等等。我觉得这些东西不能带给我快乐,它们不是我想要的。但是为什么每一个人都要「善意」地提醒我,你应该这样,应该那样呢。我不买房,便错么?成年人的眼里,为什么都只有所谓的「保值」、「升值」呢。

我们总说大人们不关心孩子们快不快乐,只关心孩子们的成绩。原来大人们也不关心大人们快不快乐啊。

工作

今年除了支撑了几个业务的后台管理系统以外,主要在思考的东西是如何利用 GraphQL 帮助开发者更轻松地应对中后台管理系统的开发。

在内部做了很多基建以后我有一个感悟,我们做基建的初衷是提高开发者的效率,但是实际上,影响开发者效率的因素,很大程度是开发者本身。基建能做的很有限。举例来说,Redux 这么一个「简单」的库,却有很多人用不好。在项目里,很多可以简单实现的地方,由于编程水平、经验、对库/框架的了解程度等等条件的不足,开发者就把简单的问题复杂地解决了。

即使给人一台最好的单反,也不一定拍得出最好的照片——因为重点还是镜头背后的那颗脑袋。

所以在新的一年,我的目标是多输出一些理论层面的东西。

消费

2018 年依然是没有节制地消费,不过买的东西已经不多了(该买的都买过了)

把 Yamaha 的电子琴换成了 Korg Kross1
搬到了一个 43 平米的一房一厅
买了 TASCAM 录音笔
买了 Scarlett 2i2 音频介面 (用来录些 cover)

(不得不提欧德堡全脂牛奶是大概一周一箱...)

输出

今年尝试性地做了一集技术的短视频内容:《解读 The State of JavaScript 2018》

生活

2018 年我做了决定,我的生活不再是 80% 的 coding time 了,我把更多的时间,花在了别的地方——音乐、健身、读书。这是一个巨大的变化,因为在以前,代码几乎是我生活的全部。我意识到,如果我稍微放下一点点的代码时间,生活里还可以拥有更多有趣的东西。

健身

健身可以说是 2018 年唯一一件做成了的事情。我从 2018 年 1 月份开始健身,每周训练 3-4 天,控制饮食。直到现在刚好整整一年,达到了从 46kg 到 54 kg 的变化。

如果问我是怎么坚持下来的,我认为无论是坚持什么,都是:因为相信,所以咬着牙坚持试试,坚持了一段时间后,它就成了你的一种生活方式。当它成为了你的一种生活方式的时候,就无所谓坚持和不坚持了。就像你不会去问别人是怎么「坚持」看美剧的一样。

关于更多我健身的经验,我会在之后单独写一篇文章分享。

德州扑克

今年学会了德州扑克,和朋友打了很多场。我非常喜欢这个扑克游戏,他让我更了解我的牌友,更重要的是,在牌局里,我意识到了自己的缺点:冒进、喜欢承受高风险高回报、贪婪、充满侥幸心理。每次打完,通过回顾自己的打法,我更加了解我自己,我会反思:

是不是贪婪让我失去了我的筹码?
下一次我再遇到相同的情况时,我如何控制自己的欲望?
我应该付出多少的筹码,才是一次价值下注,才能击败我的对手?
面对失败时,我是否能做到及时止损,调整心态?
当我读到对方的牌有 80% 的概率是比我强的时候,我是否可以克服自己的侥幸心理而不去跟注?

德州扑克结合了运气、心理、概率、演技,它不仅是人与人之间的博弈,也能让你有不妥协于运气的机会——你拿一手烂牌,仍然能打好(当然,运气有时候也会打败你,本来在转牌时胜利在望,河牌却是别人的翻身之牌)。

我还转载排版了世界扑克巡回赛(WPT)总决赛冠军老邱的小传记 《赌士列传: 老邱传奇》。相信你可以通过这篇传记感受到德州扑克的魅力。

博客成绩

在这一年收到了挺多的读者来信,向我询问建议,我都尽量抽时间一一回复。还有一些文章收到的打赏留言里提到的因为我的文章而有所收获,让我知道我写的博客的确有他的价值所在。

关于 2019

希望把生活过得更有趣一些。

via Randy's Blog

Invalid media: image
我在学校学到的东西

今年身边的朋友陆陆续续毕业出来工作了,偶尔有机会的时候会聚在一起聊聊,然后谈到各自的就业情况。我发现有很多朋友还不知道自己想从事的职业是什么,因此也不知道自己未来会怎么样,先做着现在能做的。

因为我的经历特殊,有人也会对我开玩笑说真不知道读书有什么用,还不如早点出来工作。我知道以我朋友的受教育程度来说,这肯定只是玩笑,他们不可能是「读书无用论」者,所以我也会附和着笑。

虽然这只是句玩笑话,但是确实令我回顾了一下我从我的在校生涯中得到了什么东西。

我首先想到的是英语。我的小学是从一年级开始就有英语的课程,所以我接触英语的时间很早。我自认小学四年级以前我还是个很乖的学生,上课认真听讲,作业按时完成。所以我的语数英成绩都很不错。从小培养了「语感」,使得我一直以来可以低障碍地读写英文。这对我的编程学习、职业生涯都有很大的意义。懂英文让我可以亲自融入整个开源社区、技术社区,可以直接在 YouTube 听别人在 Conference 的 Talks, 吸取别人的思想。而不是等别人翻译过来。我认为能低障碍地读写英语是技术人成长很重要的条件。

尽管我对现阶段的英语教育方式仍然存疑,我还是认为在基础教育里,英语是必不可少的。

我的价值观和人生观,是我于在校生涯之中建立的。不过不要误会,这些都不是学校的课程直接赋予我的,而是学校这个「象牙塔」,让我可以有充分的时间去读书、学习和思考。我虽然在班上是「差生」,但我敢说我是最爱学习和读书的。这句话要是被我当年的老师看到,估计他要笑个半死,但这是事实,不可否认。我在学校不用供车供房工作赚钱,我可以把一整天的时间花在读书上,我在我读的所有书里懂得了我应该成为一个什么样的人、我应该努力让自己拥有什么样的品格才能算是一个「好人」。

另外,我很多技术书籍都是在学校读的,比如《JavaScript 高级程序设计》,我读了很多遍。不是我自己想读那么多遍,而是当时我带回学校的就只有这一本书,我一个月才回家一次。那一个月我只能天天都读他。这本书我每读一遍都有新的发现。

出来工作以后我还能像这样把一本好书读这么多遍又读这么认真吗?可以,但是很难了。

我高中的时候,最喜欢上语文课。语文课本选的文章其实挺好的,比如说有《棋王》,以及很多《古文观止》里面的文言散文。偶尔发个新试卷,我也很开心,因为一张语文试卷有两篇阅读理解。我高中读的很多书,都是在试卷里和练习册里发现的,新的练习册一发下来,我就把所有的阅读理解都看一遍,看到哪篇我觉得不错的,我就看是节选哪本书,然后就去图书馆借回来。另外,写作文大概是我在学校里唯一的思考输出的方式了,因此我很珍惜每次写作文的机会,我把自己的所思所想全写进文章,以至于每次都很低分,因为离题万里。我的语文老师对我很包容,他知道我想什么,我很感谢他。

有人会说,你把学校说得那么好,你自己怎么就辍学了呢。

我认为,一个人在结束学校生涯以前,必须先弄清楚两个问题。一个是,**在离开学校以后,你在社会上是以一个什么样的角色存在?**另一个是,**你是否已经为迎接这个角色做好了充分准备?**学校的意义就是给你时间想清楚问题一,然后给你条件完成问题二。

我在学校里,早已弄明白了这两个终极问题。我在社会上,将会以软件工程师的角色存在,并且我已经有能力胜任这个职位。往小的说,我能为我所在的公司创造价值,往大的说,我要为整个社区作出贡献。所以(在一所不怎么样的)大学对我来说已经不那么重要了,我希望早点投身社会创造价值。

很多人就是因为在学校的时候从来不思考这两个问题,所以是「光着身」离开学校的。你是想创造价值,还是想做着不喜欢的工作然后满足于 奶头乐 ,其实都由你自己决定。

以上,就是我在学校学到的东西。

延伸阅读

《科学的方法, 公正的态度,果断的决心》--- 竺可桢

via Randy's Blog
多研究些问题,少谈些框架

当我问应聘者「你有什么问题想问」的时候,大多数应聘者会问我前端应该怎么学。我每次都会很真诚地按照面试过程对他们的了解尝试给他们一些建议。从多次的交流当中,我倒是慢慢地了解到了前端领域里很多普遍的问题。

前端有很多不同的框架和库。 我上大一的时候,有一门课叫网页设计,前几个课时教 HTML, 又教一个课时 CSS, 再教一个课时 JavaScript. 然后是 jQuery. 当时我很气愤,学生连 DOM 是什么都还没搞清楚,就要他们用 jQuery,这不是误人子弟吗。我后来想明白,学校大概已经把 jQuery 看作是饭碗了。

把库和框架看作饭碗是无可厚非的, 我们不能苛刻地要求所有程序员都对软件开发抱有发自内心的热爱。但是急功近利地学习框架,绝对是举步维艰的。胡适说「多研究些问题,少谈些主义」,在编程上,我认为需要多研究些问题,少谈些框架。

框架是我们达到目的的便捷手段,我们使用 React, 更要知道为什么使用它?它的本质是什么?它解决了什么问题?所谓「格物致知」,不「格物」,如何「致知」呢?

via Randy's Blog
2017 年终总结

Preface

我的 2017 过得很平淡,可能是因为出来工作已经是第二年了。

今年比较特别的是身边的朋友都大四了,参加了一些毕业拍照。大家都陆陆续续地开始找工作,面试。偶尔在朋友圈看到朋友拿到 offer, 也会替他们感到开心。

有很多朋友开始请教我一些出来工作的经验,面试的技巧、offer 怎么选择、租房的经验等等。被问到这些问题的时候我也会很开心。因为以前上学的时候,学业成绩不好,我在班上除了搞搞笑,对身边的同学来说并没有多大的「用处」。

4 月份的时候上台拿了 16 年的优秀新人奖,但是 17 年整一年没有做出很出色的成绩。慢慢失落地发现在很多事情上,技术并不是那么重要,它只不过是一种手段而已。

在年底,和 @EGOIST 一起创办了 StickerOverflow. 成功地让国内的开发者能买到高质量的技术贴纸。

今年想得比较多的是应该如何用自己的能力去帮助更多的人。想过去做培训,想过回大学给以前班的人开个交流会,想过写书。最后都搁置了,因为我后来发现,「助人」有时是一件很一厢情愿的事。

除了技术外,这一年有很多新的尝试,上台唱歌纪念张国荣,参加了唱歌的比赛,做了一期音乐电台节目。在新的一年,还想尝试去经营一个音乐博客,让更多人发现被忽略的优秀粤语流行音乐和歌手。

新年计划

2018 年的计划是多写写代码,多玩玩音乐,读更多书,换一间大些的房子,买一辆车。

有次和朋友聊天,她说,你知道自己想要做什么,又能把它做到,还能靠它养活自己。你千万不能变得世俗啊,如果你也变得世俗,我会觉得这个世界,真的就是那样了。

via Randy's Blog

Invalid media:
image
image
高中时的地下刊物

一个月前一位初中朋友 Bunny 发了一篇 《年少的文字》,讲起了初中的我们搞地下刊物的事,让我想起了那段时间这本刊物的一些点滴。

这份刊物叫《新视觉》。当年要做这份刊物,是因为那段时间,我读了很多民国时期的文学作品,还读了李开复的那本《世界因你而不同》,使我开始对政治、教育有了不一样的看法。

当时的我认为文字只有背负了政治的责任,才能称得上文学。所以看不起很多「当代文学」。我对当代文学的定义是 —— 1990 年以后出现的文学。

班里一个女性朋友很喜欢郭敬明,我却对此嗤之以鼻。于是我给我朋友传教似地讲了很多诸如为什么我们需要关心政治、我们应该读些什么书、我们需要什么样的教育等等这样的话题。但是她不以为然,认为我越俎代疱。

我想,我应该做一份刊物,来传达我的理念。因为「不识字的上人的当,识字的的上印刷品的当」。

就这样,我拿了一沓我们学校标准的信签纸,开始做了起来。我把这份刊物叫做《新视觉》,是源于白话文运动时,陈独秀所创的《新青年》。我认为这份刊物的目标,是为了提倡新思想,以摘抄严肃文学作品的形式,启发班上的同学,应该从现在起,去寻找自己的目标,自己想要的是什么,未来想做的是什么。而不是把所有时间,都花在试卷和娱乐上。

为了传达这份理念,我在首期的《新视觉》的第一页,认真地誊写了 Robert Frost 那首诗 —— The Road Not Taken.

我现在已经记不清当时摘抄了哪些具体的文字了,只记得抄过王小波、李敖、韩寒、胡适等等。

这份全手写的刊物开始在班上互相传阅,并不是因为内容深刻,而是因为形式新鲜罢了。我为了这份刊物可以维持下去,「聘请」了上文提到的女同学作为编辑,也接受所有同学的来稿。

接受同学的来稿后,刊物渐渐成了班级的一部分,甚至每一期都会有人催我「出版」。当时的「出版」形式,则是收集来稿,用钉书机装钉成册。

同学的来稿很有意思,有人开始做起了小说连载。而我还是做一些摘抄,顺便构思一些虚构类的讽刺文章。同时 Bunny 开始把手写的刊物改革成了真正的印刷品——每周回家录入然后打印出来。

因为刊物带有媒体属性,班级上一些事件也会被刊登到里面去。例如校运会,我们做了一份校运会特刊,报道了校运会的情况、现场照片。

虽然刊物在班上火了,但我并不是太开心,因为这本刊物慢慢偏离了我的初衷。我向 Bunny 提出要做一本《新视觉》的子刊物,就叫做「16 度」(我们是 16 班),把小说连载、读者来信这些内容都放到里面,《新视觉》只做严肃文学。

于是 Bunny 开始打造《16 度》,而我继续负责《新视觉》。发展到后来,《16 度》其实有很多地方和《最小说》变得很相似,是同学们饭后的话题、减缓考试压力的地方。很多人在上面连载小说。不生产的内容的,也会来留言,说自己对某篇文章的读后感。而这份带有意识形态的《新视觉》很快就没有再连续出版下去了。

以上是我对这份刊物仅剩的几乎所有回忆,手写的稿早就在初中一次搬课室的过程中丢失了。谁会想到这些东西未来会被这样津津乐道呢。这确实是一个遗憾。

via Randy's Blog

Invalid media:
image
image
image
养猫随想

我是个很怕负责任并且不感性的人,养一只猫对我来说,是一种很大的责任。

传闻说猫的智商相当于 2~3 岁的小孩,所以我会把养她当作是在养我的小孩,每个月要花钱换猫砂,去超市要顺便买些罐头,偶尔也想去宠物店看看有什么好玩的玩具。养猫和养小孩的区别,我想大概就在于前者的过程中不需要担负教育的责任。教育很难。

我外甥女今年刚好是 3 岁,有时候我也觉得和猫很像:见到什么都要摸摸看,甚至打翻。

对于猫打翻东西,一般来说,主人都会生气。但是我想,3 岁的小孩打翻了东西,其实是监护人的责任。既然家里多了这个不懂事的小孩,易打翻的东西就不该让她碰到。出现事故,自己要先反思。

她不会完全信任我,她吃东西,我路过,她有时还是会立刻跑开。帮她滴清耳液的时候,她看到我拿着瓶子也会跑开。但有时候我觉得她也很信任我,每次回家,不管她的时候她都要一直叫,非要爬过来腿上让我摸才停。养猫有趣的地方就是这里,你要向一种时刻保持警惕的生物身上获得信任。

第一次带她去医院打疫苗,在医院里我和几个素味谋面的猫主人狗主人竟然可以自然地打成一片,互相交流育宠经验,然后让自己的宠物见一见对方的宠物。大家都像妈妈们互相交流育儿经验似的。

有时候在路上看到走过的流浪猫,会想要不要把它养了,让她有个伴。但是想想,我确实还没有做好二胎的准备。

前段时间发烧,在搞保险报销的时候,我想如果可以给宠物也买保险,我也会给她买一份。

养一只猫不容易,何况养一个人。所以养猫之后,有时我会留意街上怀孕的路人,想她们是不是做好了准备,去承担这份责任呢。这需要一份勇气和担当,还有深思熟虑。

鲁迅在《热风》里谈到孩子,他说,「中国的孩子,只要生,不管他好不好,只要多,不管他才不才。生他的人,不负教他的责任。虽然“人口众多”这一句话,很可以闭了眼睛自负,然而这许多人口,便只在尘土中辗转,小的时候,不把他当人,大了以后,也做不了人。」

因此我很怕,我没有准备好,没有想好要怎么做教育。我要先把猫照顾好,才有信心去养一个人。

以上。

via Randy's Blog

Invalid media:
image
image
image
image
image
做技术要自信

我很久以前就把博客的评论直接去掉了,原因是大多数评论毫无营养,如果我发技术类的文章,评论都是「围观」,「膜拜」之类的内容。偶尔有人会通过微博私信问我技术,开头都是很客气,称呼我「大神」,然后声称自己很「菜」。总的来说,就是把自己的地位拉得很底,误以为这是一种谦虚。

「大神」这类的称呼一开口,会把两个人的距离感拉得特别长,就像闰土叫了迅哥儿一声「老爷」。我没有觉得自己很厉害,反而是越学越自卑了。我总结了这些视我为「大神」的网友,不过是经验比我少一些, 或者思考的东西比我少一些而已。

于是我回想自己刚接触编程的时候,也很喜欢逛 BBS, 看一些版块上有些许知名度的网友,发自己的新作品,心里很是羡慕,觉得他们技术很强,是无法触及的。我只能静静地看着,不断地思考他们做出来的功能是怎么实现的,然后翻书找。实在找不到,也会回回贴,发发站内信,请教一下实现的思路,不过基本是没有人会回复我的,因为那时年轻,提问的方式很蠢。渐渐地,我的经验也因为自己做的 side project 日积月累了出来,慢慢地也成了一些人口中的「大神」。

如果说这其中的成长有什么秘诀,我认为是自信:遇到自己不懂的问题时,永远相信自己可以通过不断的学习和查阅资料得到解答,并使解决问题的经验成为自己的一部份。

妄自菲薄会让人变懒,认为自己永远达不到别人的高度而放弃努力。很多人因为不自信,开始依赖别人,把自己活成配角,又苦恼自己不成长。我通常会建议他读一读《提问的智慧》,学会自己先思考问题。我从前也很害怕问比我富有经验的开发者问题,因为我害怕自己的提问很蠢。因此每次提问前,会先梳理好问题梗概,我做了什么去解决这个问题,最后才小心翼翼地把问题发出去。其实往往在梳理问题的过程中,自己就把问题想通了。

所以做技术要自信,不要做伸手党,要多思考。开源不是所谓的「大神」才能参与的,你也可以参与,从读代码开始。每一个你眼中的「大神」都不是生下来就会编程,他们只是善于自己解决问题,并坚信自己能解决问题,最后成功解决问题。

via Randy's Blog
从 React 谈 Web UI 开发

此前我在 Twitter 上这样表达过对 React 的理解,但是 Twitter 篇幅有限,所以在这篇文章里,我要做更详尽的阐述。

我从前不喜欢 React, 是因为写 React 的 render function 不像写 template 一样方便,尤其是存在复杂的判断渲染的时候,Vue 的 template 一个 v-if 就搞定了。而在 React 里写,需要把这个判断写成 function, 然后条件判断 return 哪一个 view. 这是我最初对 React 的偏见所在之一。

然而经过自己的实践和思考,加上阅读一些文章,我发现以前的想法是错的。我在使用 React 的时候,没有做到 Thinking in React. 从而对 React 产生了不解和困惑。

有很多人把 React 当成框架来用,这是用不好 React 的根本原因。很少人认真思考 A JavaScript library for building User Interface 背后的含义,把 React 用得一团糟。

何谓 For Building User Interface? 意思就是,这个库仅仅是用于构建 UI 的,这是 React 本质要解决的问题。我甚至和很多人说,事实上 React 本身是不是 React 已经不重要了,重要的是我们写 UI 的思维。React 这个 library 本身仅仅是用来实现这个思维的手段。React 提供的,是优秀的 DOM diff 算法,和一套 Component system。换成代码来说,也就是:
(state) => View

这是 React building UI 的核心思想,所有的组件,就是接受 state, 返回一个 View. 这样看上去比较抽象,比如我们有一个 Clock 组件:
const Clock = (time) => `
&LTdiv id='clock'>
 &LTspan>It's now: &LT/span>
 &LTspan>${time}&LT/span>
&LT/div>
`

Clock 是一个 function, 接受一个 time 参数,返回的是一串 HTML String. 在程序里,我们可以给一个 Interval, 每秒传一个当前的 time, 得到一个新的 HTML String, 然后 apply 到某个 DOM 上。
const $app = document.getElementById('app')

setInterval(() => {
  $app.innerHTMl = Clock(Date.now())
}, 1000)

这样的实现是能达到目的的,但是问题在于,每次 innerHTML 时,整个 #app 的 DOM 树会被重新渲染。

我们都知道,DOM 更新的花费是昂贵的。整个 DOM 树,实际上只是一个 span 在不断变化,所以我们需要 DOM diff 算法来得知到底哪一个 DOM 节点才需要被更新,从而节省开销:
const Clock = ({time}) => (
  &LTdiv id='clock'>
    &LTspan>It's now: &LT/span>
    &LTspan>{time}&LT/span>
  &LT/div>
)

const $app = document.getElementById('app')

setInterval(() => {
  ReactDOM.render(&LTClock time={Date.now()} />, $app)
}, 1000)

在 React 里,把 props 传入,返回一个类似 HTML 的结构,然后 render 到指定的 DOM 节点上。这里 React 会算出哪个节点应该被更新:

我们这样手动去 setInterval 然后 render 未免有点傻,我们可以更改 state (也就是通常用到的 setState) 自动地让 React 随着 state 的改变而重新 render. 这里的 time 就是一个 state. 这叫做 Reactive.

Functional Programming 里有 Pure Function 的概念。Pure Function 之所以 Pure, 是因为不存在 side effect. 举个例子,我们写一个求和 function:
function add (a, b) {
  return a + b
}

这个求和函数就是一个 pure function. 因为函数内部没有对 input 做任何改变,并且返回一个新的值。我传 1 和 1,得到的永远是 2.

Pure Function 的好处是利于维护和测试。要测试一个 Pure Function, 仅仅是传不同的值,预言对应的返回值。

现在回头看 React 的 Component, 也可以算是一个 Pure Function——接收不同的 props, 然后 render 对应的 View. 上面 Clock 的例子,props 和返回的 View 是映射关系。

光是 state => View 还不够,在构建 UI 的时候,我们希望 state 改变的时候,立即 rerender 整个 View, 也就是我们经常用到的 setState().

这样就很容易理解为什么我说 React 仅仅是实现构建 UI 思想的手段,因为构建 UI 的思想总结起来就是:

1. State 是 Reactive 的 (比如 React 的 setState)
2. state => View (依靠 DOM diff)
3. View 组成 Component
4. 管理 state (依靠第三方的 state manager)

无论是 React 还是 Vue, 大抵都是这样的思想。Vue 1 还不完全是,Vue 2 就更接近了,只是后者写法既可以写得像 template, 又可以写直接写 vdom.

而开发者常常感到困难的地方实际上是上面的第 4 点——管理 state. 写 React 写得痛苦,大部分原因是用把 library 当成 framework 去用,把处理 state 的逻辑瞎写到 View 层中去,也就是所谓的 Dump Component.

改变 state 是 side effect, 我们应该把它从 View 层中分离出去。我多次提到,View 层真正要做的,仅仅是根据 state 返回对应的 View. state 的变化逻辑,应该在给 state manager 库去做,例如 Redux, Mobx. 下面我用 Mobx 作为例子:

https://jsbin.com/fumerup/edit?js,output

如果没有接触过 Mobx 不用慌张,只需要知道,Mobx 的 Observable 变化时,被 observer 包装的 React 组件会重新渲染。使用 state manager, 明显地分离了 View 和 side-effect:

测试这样的程序,首先为 side effect 的逻辑做测试,再为 View 做测试。View 的测试在这里就十分简单了,给他传一个 store 实例,借助 enzyme 之类的 testing utilities 预言不同的 action 得到的返回 View.

React 是 Reactive Programming 在 Web User Interface 上实现的手段,它只不过是一个库,提供了reactive render, component system 和降低开销的 DOM diff 算法. 把 React 换掉,只要不是手动操作 DOM, 其它的框架也不过大同小异。重要的是理解它背后的思想。说到底,前端开发在解决什么问题,用什么样的方式解决问题,在使用任何框架和库之前先把这两个问题思考明白,就不会认为前端难学了。

via Randy's Blog

Invalid media:
animation
animation
animation
image
2016 年终总结

博客篇

开篇讲讲这个博客这一年的「成绩」:

访问量

因为今年年中进行过博客迁移,从 github pages 迁到了阿里云,还换了整个 blog platform. 所以新旧博客的统计要结合起来看。

旧博客统计:

新博客统计:

总计: PV 49,406,UV 15,800

访问设备

iPhone 用户仍然排第一,第二是小米。

来源浏览器

文章排行

上半年一个 Vue 和 Webpack 系列访问量比较大。下半年给自己的博客定位不是单纯的技术博客,访问量比较大的是关于退学的两篇文章。

坚持做独立博客很难,坚持写博客更难。我没有开公众号,因为开公众号会让我感到有压力,更会让我「为了推送而写文章」。也是因为赞同陈皓的观点

技术篇

今年因为工作原因,把大部分的精力花在了 React 上,Vue 反倒没什么机会写了。写 React 的过程中对 Thinking in React 有了不同的看法。我从前不喜欢 JSX, 不喜欢 setState, 但是慢慢地开始思考 Functional Programming, Reactive Programming. 后来发现,React 是不是 React 已经不重要了,因为 React 只是实现它思想的手段,更重要的是在其背后的,UI Development 的观念 —— (state) => View。无论如何争论 Functional Programming,它的的确确改变了我对程序开发的想法,我开始追求 Pure Function,开始讲究函数的 side-effect. 我想下一年我还会对 FRP 做更深入的研究。关于这方面的感悟,我会单独写成文章。

比较快乐的是在一些项目里使用了 TypeScript. 自己也写了文章,录了视频, 来表达我对这个语言的看法。

这一年参加了两个 Talk, 一个是珠三角技术沙龙,讲的是 Vue 和 Native. 另一个是 Node 地下铁,讲了 TypeScript. 关于技术分享,我在知乎有一篇回答 讲了我对国内技术分享会议的看法。希望我自己在接下来的一年能有更大的长进,然后用自己的行动去告诉大家技术分享应该怎么做。

比较遗憾的是工作之后减少了写开源项目的时间,今年对开源社区最大的贡献就只有给一本TypeScript 书 贡献了些内容。

工作篇

从 3 月份入职,完成了一个项目的重构,帮助了一些还有些迷茫的朋友,用自己的热情感染了团队的技术氛围,是在这一年工作上让我自己感到满足的事情。

读书篇

Just for Fun: The Story of an Accidental Revolutionary

Linux 创始人 Linus 的自传,记录了 Linus 的少年时期和 Linux 的诞生,之中还夹杂一些对开放源代码的观念。读完以后很受鼓舞,能像 Linus 一样是我做软件开发的终极目标。

Soft Skills: The software developer's life manual

中文名叫《软技能:代码之外的生存指南》。我很不喜欢这类教别人做人的书,但是受人推荐,还是读完了。

书里有几个章节我印象比较深刻。比如谈到大公司、中等规模公司、创业公司之前的区别:
在大公司工作令人沮丧,因为他们感到他们个人的贡献无足轻重
为大公司工作的一个显而易见的事情就是成长机会
结合自身条件和自己喜欢的工作环境进行职业选择,是需要深思熟虑的事情。

书中还谈了个人品牌的打造,学历问题等等。都值得一读。

The Art of UNIX Programming

中文名是《UNIX 编程艺术》。万幸我用 macOS 也算是 UNIX 环境的重度用户,所以在读这本书的时候不会感到吃力。这本书实际上和 UNIX 源代码没有什么关系,讲的是 UNIX 下的程序(比如 grep),这些程序的设计哲学让我对软件有了新的思考。

编写复杂软件又不至于把自己搞混乱的方法是降低软件整体的复杂度。软件本身的复杂度不会因为实现方式和代码组织的优秀而降低,但是这能使整体复杂度降低。降低整体复杂度的方法是用清晰的接口把复杂的软件分解成若干个简单的模块

每把剃刀都自有其哲学,更何况是软件开发呢。即使是开发一个小函数,它的输入和输出也是需要讲究的。

Becomming Steve Jobs

我没有读《乔布斯传》,而是选了这本《成为乔布斯》,是听说这本传记记录的乔布斯要更真实。事实上通过很多途径都已经宏观上对乔布斯有了很大程度上的了解,所以读传记的时候已经没有对某些事件产生触动。反而触动我的是一些小细节上,比如书中提到乔布斯父亲的话:
对于一个橱柜来说,别人看不到的底面与表面的抛光一样重要;对于一辆雪佛兰汽车来说,别人看不到的刹车片和汽车的油漆一样重要。
容忍与自由

我求学时期读了很多民国作家的书,唯独胡适先生的书读得不多。今年读了这本文集,意犹未尽,还想读他的《中国的哲学》,但看来要等下一年了。

Elon Musk

硅谷「钢铁侠」Elon Musk 的传记。十分羡慕财富自由又有想法的人。

A brief history of humankind

推荐这本有趣的《人类简史》,看人类是如何从原始人进化过来的。

游戏篇

今年买了 PS4, 人生第一台游戏机。玩了几款大作,《最后的生还者》、《神秘海域》、《GTA5》、《看门狗》。印象较深的是《最后的生还者》,没有 PS4 的也建议视频通关。

下半年换了 Macbook Pro 也入了 Steam 的坑,Steam 的游戏和 PS4 比简直就是白菜价。沉迷了一段时间 Don't Starve. 通关了 Firewatch.

自我总结

这一年的成长比较横向,不仅仅在技术,还学习了音乐,健身等等。遗憾是改不掉一直以来喜欢「急」的缺点,急于完成事情,不多加考虑。甚至容易使自己在快要完成一件事情的时候,容易由于太急,最后烂尾,比如

via Randy's Blog

Invalid media:
image
image
image
image
image
image
我看牙医的经历

今年断断续续从 3 月到 11 月我都在牙诊接受牙齿修复,直到今天,修复已经完全做好了。在这个过程中我对牙科有了全新的认识,于是我希望通过分享我这一段经历,让更多人重视牙齿健康。
如果不想看长文,可以直接跳到本文末尾的 TLDR.
我的牙齿属于牙釉质发育不全,虽然从刚换牙的时候我就发现我的牙和别人不一样,但还是在今年 3 月初才准确知道的。那时我刚好智齿在发炎,去医院打算拔掉,一个医生看了我的牙,说你的牙齿烂得很厉害,釉质基本没了,要做牙冠保护,不然再过几年牙就没了。

听了以后我心情复杂,我说我还这么年轻啊。医生说,你的牙用 1 年等于正常人用 5 年的啊。

做牙冠的费用不少,我就回家跟家人说了一下情况,然后又去附近一家牙诊所咨询意见。牙诊所的牙医一看,问我是哪里人,因为他不确定这是釉质发育不全还是氟斑牙,而广东这边的水质一般不会出现氟斑牙的情况。我说我是广东中山的,于是他就基本确定是釉质发育不全了。

他再仔细看我牙齿的情况,最后说了一句:你还是去省口腔医院吧,你这些牙的磨损程度太高,咬合又低,我们这里的设备没有办法做到很高,你给钱我们也不做。

我开始感到情况似乎越来越悲观,后来我姐姐给我推荐了广州某口腔诊所的熊医生,于是我到了广州找他。

熊医生看了我的牙以后,说磨损的确挺严重,但是牙冠还是能做,只不过要做很多颗而已。他和另外几位医生会给我做一个方案。

到底什么是釉质发育不全,首先要清楚一只牙齿的结构:

这是我随手画的一张牙齿抽象图。一颗牙的最外层就是所说的釉质(也称「珐琅质」),而黄色这一层就是牙本质。牙釉质是牙齿最坚硬的部分,也是哺乳动物体内最坚硬的组织,用于咬碎食物,以及保护牙本质。他是不可再生的,所以蛀掉的牙一定不会自愈。牙本质是黄色的,而釉质是白色半透明的,因此正常人最自然的牙齿是偏黄色的。而当釉质被磨损越严重时,牙本质几乎被暴露,才会越来越显非正常的黄。

这是我在后来修复过程中做的下排牙模,可以明显看出,发育不全的釉质比较脆弱,两边的后牙磨损严重,甚至快要磨到底了。在咬合的时候,基本只能靠磨损出来的几个尖尖的点来咬食物。

熊医生给我的方案是,8 颗后牙做根管治疗然后做牙冠,顺便在做牙冠的过程中重整咬合。

为什么需要重整咬合呢?因为我的后牙几乎完全没有咬合。

这是修复前和修复后的侧面对比,可以看出修复前的后牙基本没咬合。

于是整个修复流程开始。而根管治疗是整个过程中最漫长和痛苦的步骤。即使在手术过程中会注射麻药,疼痛还是存在。

上面维基百科上的根管治疗流程图。简单来说,就是从牙齿中间钻开,然后人为把牙神经杀死。牙神经被杀死后,牙齿就不会再有感觉。一般来说,根管治疗都是用于治疗牙髓坏死或牙根感染。而我的情况是做牙冠需要磨一部分牙,如果不把牙神经杀死,磨牙磨到牙本质的疼痛是无法忍受的。

杀死牙神经后,还需要等待一个星期,然后填充药物,最后再补牙。

经过几乎两个月的时间,两边的根管治疗完全做好了。由于经济问题,我拖了很长时间才开始做牙冠。

做牙冠首先要把牙齿磨小一圈,留位置套上新牙冠。磨小以后,咬硅胶、做牙模,然后发给牙冠制造厂家做。这个过程大概需要一周,也就是说,我两边分开做,起码有两周时间需要单边咀嚼。

在修复右边时,有一段小插曲。我的右下智齿阻生并且已经萌出,影响到做牙冠的位置,所以要先把智齿拔掉。拔掉智齿的过程用了两分钟。

TLDR

在做牙齿修复的这段时间,我向牙医学习了很多关于牙齿的常识。虽然我的牙齿问题并非由于后天影响,但偶尔会看见一些人来做牙齿治疗,有很多都是没有太把问题当一回事,到问题严重才会来看牙医。都以为牙疼忍忍就过去了,然而等到再疼下去,等到把牙髓坏死的时候才来找医生,也就只能做根管治疗了。

也有很多人,蛀了牙也不补,最后疼了,有的人也不管,眼看整个牙都要蛀掉了,来看牙医,也就只能种牙了。

大多数人都不知道,补牙能够解决问题是有多幸福,然而大多数人都只会拖着。没有人想要花钱买难受,做根管治疗又贵又疼,真是心疼肉也疼。有好几次我在做根管的过程中都要疼得叫出来,但是又有什么办法呢,这是发育不良,没有办法改变。但是在读这篇文章的各位,你们都要比我幸运得多,你们天生就有一排好牙,希望你们不要浪费。在这里我有一些微小的建议:

如果你从没有洗过牙,打开团购 app, 找离你最近的牙诊所,预约一个洗牙,不贵,也不疼。然后坚持半年或一年洗一次。
把手动牙刷换成电动牙刷,有条件的话,帮你的父母也换上。然后上网找刷牙的视频,学会正确的刷牙方法。
如果你有牙已经蛀了,不要等,立刻去补。
如果你很穷,又不想遵循以上建议的话。呵呵。

via Randy's Blog

Invalid media:
image
image
image
image
image
image
你根本用不着退学

近一年来我收到过很多邮件,说看了我的经历和文章,也想退学了。大意都是「看了你的经历,我觉得我和你一样,所以我也想退学了」,要我给他们一些意见。

我的意见向来是都是劝回学校好好读书,好好拿个学位证,反对一切没有铺好后路的退学行为。直到越来越多这样的人来找我问这样的意见,我意识到我应该认真的写一写我对退学的看法。

选择退学代表放弃学位(也就是所谓的文凭),这是一个沉重的代价,因为学历很重要。

学历像是人的脸。对于样貌,大家都说,「长得好看没有用,内在美最重要」。乍听上去是这么一回事,但是如果长得不好看,茫茫人海里,会有多大的概率有人主动了解你的内在呢。不是说内在没有样貌有用,而是让人愿意了解内在的成本太高了,比有样貌的成本高得多,要付出的努力也要多得多。

很多人看不起别人整容,然而读书(Schooling)其实就是一种整容。谁都会有这种感觉:这个人读重点大学,实际上也没比我能力高多少,但是他处处受欢迎,拿到的 offer 也多。你觉得这样不公平,其实这公平得很。别人为了这个学历付出了多少的努力(不管这种努力在你眼里看来有没有「意义」),而你又为了做好不拿文凭的准备做过多少努力呢?

我不知道别的行业对文凭的重视程度,所以我拿我的本行——软件开发来说。如果打算放弃学位而提前从事软件开发行业,请先问自己一个问题:
你用什么来让别人相信你会写代码?
如果你没有学历,你就需要靠经验来证明自己的能力。

然而大多数来邮件求建议的朋友,大多没有什么经验,却又声称「和你的经历相似」、「和你一样」。其实我们完全不一样,我在退学前就已经写了 7 年代码。

不是说一定要有这么长时间的经验才能离开学校,而是 一定要已经拥有解决问题的能力的时候,才有资格考虑退学这件事。我常常拿我朋友 Drakeet 给身边的人做例子,他是大二退学的,退学时虽然写代码才两年,但是他当时的能力就已经足以独当一面了。

曾经有一位朋友的朋友问我关于退学的意见,他说觉得学历不重要。我问他你会做什么,他说「虽然我现在能力很弱,但是我学习能力强,想进一些大公司跟着大牛学习,等技术可以了,就可以弥补学历的缺陷。」到底是哪来的勇气让他认为大公司的大牛会因为「学习能力强」愿意让他跟着学习。

我不知道为什么那些还没有什么能力的人会认为学校不能教会他们什么,我想大多是人云亦云。他们往往把我退学的原因归咎于「大学教育的落后」(当然这确实是其中一个原因),然后拿我的例子来证明他们的观点,却没有认真思考过我为什么认为(我所在的)大学落后,那是因为学校在教的大多数内容我在好几年前已经滚瓜烂熟了。如果一个人连这些学校在教的基础知识都不会,又何来的底气声称「学校不能教会他们什么」。

当你有信心对老师说「你下来吧,让我来教」的时候,你才需要考虑退学这件事。

大学是一个很好的避风港,能有如此长的一段时间可以没有顾虑地学习自己想学的知识在一生中难能可贵。想研究 V8 内核就去研究,想了解机器学习就找机器学习相关的书慢慢读。

我知道很多打算退学的人心里都盘算着退学后在家自学一两年,然后出去找工作。我不看好这种规划,因为风险大,并且在家自学不见得比在学校自学好到哪里去。除非在这一两年里能在开源社区带来一些什么,否则到最后不会是你理想中的结果。

马克吐温说过一句话:"I have never let my schooling interfere with my education." 在上大学之前,我学习编程的时间很少。每周只能回家一次,用电脑的时间又不多。拿学杂费的找零买些书,上课看,晚修看,把草稿纸当成编辑器,周末回家用电脑实践。我想所有人的大学比那时的我自学条件要好得多,又有什么理由放弃这种条件呢。

希望所有打算退学的朋友能深思熟虑,退学不是一件好事也不是一件坏事,它只是一种选择,取决于哪种选择更适合自己的处境。

虽然我从来没有后悔自己做出的选择,但是我总会羡慕那些有机会读好学校、受好教育的朋友。我是个很爱学习的人,我也想在大学学编译原理,线性代数,概率论,但我这个人比较蠢,没有办法同时兼顾我喜欢的和我不喜欢的课程,又疲于应付功课,所以才会选择退出,然后付出比别人更大的努力,跑在别人的前面。

比我聪明的人很多,而这些人,根本用不着退学。

via Randy's Blog
离开大学这一年

写这篇文章是想说说退学一年后的一些想法。想看技术总结请移步。如果不想看这么多的文字,可以直接拉到最下面,看写在最后的内容。
一年可以发生很多事。

回想起来,大一的一整年我旷了很多课,待在宿舍看书和写代码,周末总是往广州市区跑,参加各种各样的社区活动和聚会。学院规定旷课 20 课时以上就要处分,我很不出意外地被处分了。

签处分的时候,辅导员告诉我,如果这个处分不撤销,是拿不到学位证的。如果想要撤销,要保证在大二整个学年不旷课,也不挂科。我说,那我是完全没戏了。

辅导员让我好好考虑一下。我表达出了离开学校的意愿,她说好好想想,暑假和家人商量出一个结果,开学再找她。

其实我已经想了很久。在学校的一年里,我过得极其难受。我必须浪费很多很多的时间,去上一些只是听上去很有意义的课程,和那些在课室里只会玩手机和睡觉的同学处在同一个课室里,连续待一个半小时。 而我最这个人痛恨的事情,就是别人浪费我的时间。

我父母是很传统和保守的人,我不敢在他们面前提关于离开学校的事情。于是在那个暑假,我度过了人生中最抑郁的两个月。

大二开学,辅导员知道我并没有和家人商量,就打给了我家人。本以为上了大学,就不会再有「打电话通知家人」的破事。

家里人和我想象中不一样,他们很冷静。周末回家,我说出了我的意愿,他们表示让我自己做决定。他们说,你是个成年人了,读大学是自己的事情,如果你要读,我们愿意继续花钱供你读,如果不想读,你自己要为一切后果负责。

于是,在一年前的今天,我回到了学校,找辅导员签下了休学一年的协议。辅导员问我会不会后悔,我说不会。她说那你要加油,希望你能成功。我很开心,因为她是笑着说的。我辅导员笑的时候很漂亮。

和学校没有任何关系以后,我租了一个算是能住的房子,正式开始了职业生涯。

我的第一份工作入职的是一家创业公司 (Kiwi Inc.),是暑假的时候就已经入职的。暑假前我在某群表示想在广州找一份能在暑期做的工作,李秉骏 很快就跟我联系。我从学校坐了趟车到他的公司,一番愉快地交流之后,工作就落定了。

我在 Kiwi Inc. 负责的是前端开发。因为整个开发团队只有我一个前端,而公司主要的产品又有很大的比重在前端,所以进去以后,我过得很充实,因为自己 do the things that matter. 团队因为人不多,大家都很融洽。

我后来听很多人对应届生的「忠告」,都说千万不要去创业公司,大多数创业公司都是坑人的。有条件的,都争取去去大厂,不要在创业公司浪费时间。

对此我保持不同的意见。我非常庆幸自己在创业公司待过(当然也是因为我待的公司不坑人)。在创业公司,我们可以自己选择用最好的工具,可以用 Slack, Trello 以及第三方的 PaaS 等等等等。正因为我们能自由地选择最好的工具,我们可以亲身感受和思考这些产品本身。这些产品优秀的地方会渐渐地成为自己做产品时对产品的品位和追求。并且在创业公司,我们没有无意义的会议,可以把时间用在干实事本身。关键是,我们每个人在公司里,都能感受到自己是极其重要的一员

在 Kiwi Inc. 写前端的过程,是我自己建立前端工程概念的过程。从开发到测试再到部署,从代码规范到构建,都希望把软件工程的思想带到前端中去。虽然现在看来习以为常,但是对于当时只做过自己的 side project 的我来说,这是极大的经验和收获。

在 Kiwi Inc. 待了半年后,出于对自己更高的要求,我离开了这个靠谱的创业团队。

崇尚工程师文化的我一直认为自己会和国内的大厂无缘,大厂不会选择我,我也不会选择大厂。然而我却在农历新年后通过了阿里巴巴移动事业群 (也就是 UC) 的面试。在 2016 年的 3 月加入了阿里。

大公司和创业公司不同,一个简单的问题会牵扯到不同的组,比如一个字段出了问题,要去追踪到底是架构组的问题还是算法组的问题。在大公司,每一个需求要有排期,版本上线要提测,要面对大量用户的反馈。

其实离开了学校开始工作,自己的时间就很少了。一本不厚的《设计模式》,原本可以花两三天粗略地读完,现在会有不知道什么时候才能读完的感觉。这种情况下,很容易使自己在选择读一本书前出现「读这本书对我的工作有实际帮助吗」这种错误的考量。

不够用的时间常常使我处于不安、烦躁和轻度抑郁中,因为我害怕被别人追上。每个认识我的人无论出于真心还是客套都会说我「年轻有为」,但是没有人知道这是一场看不到终点的长跑,我的特立独行让我必须跑得比别人快得多,才能弥补我们之间的差距(学历、智商等等)。这使我感到害怕,尤其是同龄人渐渐都出来实习工作的时候。但又没有任何办法。

工作以后有了稳定并且还不算少的收入,我能用来买自己喜欢的数码产品,也花了不少钱在自己的身体上 (比如健身和吃)。

我不存钱,我希望在我还年轻的时候,在我不需要供这个供那个的年龄,能没有顾虑地花钱让自己快乐。快乐太难又太容易错过了。就像小时候想有一台 Gameboy 但不得愿,现在即使可以没有压力地买下一台 PS4, 也不见得有多快乐。

写在最后

我有很多还在读书的朋友,我们出去聚会聊天的时候,我都会看得出他们的迷茫和无奈。这些迷茫和无奈可能很大程度上来源于教育体制的缺陷,但是,在这个时代,学习早已不仅仅只局限于学校,它在任何一个你可以掌控的角落。它在互联网、在每一本有价值的书籍上。如果学校没有满足你,就去这些地方找。珍惜时间,总有一天会找到它,并能让你过上你希望过上的日子。如果迷茫是出于你的懒惰,就请不要埋怨教育,也不要埋怨任何体制、任何人。

我还有很多已经在工作的朋友,尤其是和我一样在写着代码的朋友。我没有特别要说的,我想说,嘿,我来了。

via Randy's Blog
Back to Top