2024-06-26 08:00:00
最近我偶然看到了王垠 Substack 上的《不要去医院验光》,当然因为没付费订阅我只能看到开头几段1。然后点上面的链接到了他博客上的「自然视力恢复法」。考虑到这两篇文章的危害,我觉得值得写一点东西给看我博客的人做一些参考。 王垠这个名字很多人都不陌生了,他从清华退学的时候我还在读博,当时还写了一篇文章来评论这件事,不过现在已经找不到了。我那时看他写的宣布退学的文章留下的印象是他是个很聪明但视野有些片面、想法有些偏激的年轻人,没想到他后来变得越来越极端和愤世嫉俗,成了阴谋论的传播者。他的聪明和在计算机方面的一些天分让他成为了一个 influencer,颇有一些追随他意见的人。而当他推广的看法超出计算机领域,有可能实际影响别人的生活时,就危险了。 首先验光之所以要散瞳,就是为了测量在肌肉彻底放松的状态下眼睛的度数,这样才能让眼睛在戴眼镜后也能尽量放松,不存在他说的「度数会验得比实际需要的度数大」。而且医生也往往会透过放大的瞳孔检查其他眼科疾病。散瞳并不像他说的一样是「故意的欺骗行为」。他在文章里说: 而且散瞳用的阿托品会麻痹肌肉,这种药物应该也是有毒物质。偶尔一次可能还好,经常往眼睛里滴这种东西,不知道是什么后果。 如果不知道的话,恐怕不应该凭想象说某种药物「应该」也是有毒物质。 他在自然视力恢复法一文中提倡的基本观点是,近视是由于眼球外部肌肉长期紧张导致眼球变形造成的,近视的人应该戴度数浅一些的眼镜或者不戴眼镜,这样可以逐步让眼睛恢复正常。他说: 近视产生的根本原因,是长时间紧张地看近距离的物体,而跟光线,遗传什么的都没有直接的关系。 现代医学广泛接受的结论是:遗传是近视最主要的风险因素。 王垠在文章里引用的主要依据是 William Bates 写的 Prefect Sight Without Glasses。这本书是 1920 年由作者自出版的,里面说的近视治疗方法被称为 Bates method。而 1929 年 FTC 就发出对他的投诉,指控他进行虚假或误导性的宣传。在这一百年里相关的临床试验都表明他在书里说的那些练习对治疗近视是无效的。确实有一些近视的人在不戴眼镜一段时间后报告说视力比原来有所提高,但这个现象有很合理的与主流医学相洽的解释。不戴眼镜一段时间后,因为看到的东西是模糊的,大脑会在处理视觉信号时进行补偿来适应光学上的失焦。这就好像你可以用 Photoshop 来提高照片的锐度,或者用计算机视觉模型来让原本有些模糊的图像变得看起来更清晰。但这种提升是有限的,也不是对近视的治疗,更不是提倡不戴眼镜或者降低度数的合理原因。 Bates 的书篇幅很长,我以其中一章为例来说明它有多边缘、荒谬和危险。第 17 章是 Vision Under Adverse Conditions a Benefit to the Eye,可以翻译为「不利条件下的视力:对眼睛的益处」。在这一章里,他说包括阳光在内的强光对眼睛都是无害的,所有的不适感都是暂时的,直视太阳不但不会对眼睛造成永久伤害,还能帮助恢复视力。 Bates 书里的图 47:一个 37 岁的妇女和一个 4 岁的儿童直视太阳而没有不适。(本文注:请勿尝试!) 他甚至还说有一部分患者如果是把阳光直接聚焦在眼睛上效果会更好。 Bates 书里的图 48:用放大镜把阳光聚焦到一个病人的眼睛上。(本文注:请勿尝试!) Bates 所在的年代抗生素还没发明,可以说现代医学还没开始,他的书和观点在后来广受主流医学界否定。引用他写的内容来给别人提供医学建议实在是非常不负责任。 总结一下,术业有专攻,健康相关的问题还是要听医生的,如果对一个医生有疑问就多问几个医生,不要受互联网上非专业人士(包括我在内)写的东西影响。也不要相信某个行业在全世界范围内联合起来秘密牟利这样的阴谋论。 伪科学竟然还要钱 🤷 ↩︎
2024-06-25 08:00:00
读博士的时候我们系每年春季都会有一两天让在读的博士生留出特定时段待在自己的办公室,因为一些接到耶鲁的 offer 但还没有做决定的学生会到学校参观,他们可以到系里走访在读的学生,通过提问交谈更全面地了解学校和院系来帮助他们做决定。有一次走进来一个头发已经有点白的人,我还以为是本校其他系的教授,而他告诉我他拿到了我们系的 offer,所以来看一看。他多年前毕业于一所知名法学院,在纽约已经是一位成功的律师,但是他后来对计算机更感兴趣,所以决定不再做律师而从头开始学计算机。和我面谈时他已经完成计算机科学的本科学业,并被几个学校的博士项目录取。我问他是不是希望做计算机犯罪之类与法学相关的领域,他说不是,就是想完全转行。我对这件事印象深刻,一直记得。在我学生时代的认知里,高考时的选择基本上决定了一生的方向,而这个人在人生到了一半的时候不是只改变了方向,而是回到一个新的起点重新开始。 今年我一位侄女高考,所以问了我一些关于学校和专业选择的问题。我的基本建议是优先考虑报一所好的学校,专业是其次,尽量和兴趣接近就行。因为学校决定了未来四年的学习环境,这是很难再改变的因素。而大学里通常所有课都是可以选的,想在另一个专业再拿个学位也不是不行。这是我在走过这条路后回过头来按理性的思维给的建议,但是我自己高考的时候却是反其道而行,所有志愿填的都是计算机相关专业,并且不服从调配。当时我们还是先提交志愿后参加高考,不确定性更高。那时自己的概念里大学专业就决定了未来的从业领域,所以即使被录取到差一些的学校也不想在专业方面做妥协。所幸没有考得太离谱,还是被按第一志愿录取了。 我曾经觉得自己在这方面很幸运,在中国的同龄人里较早开始接触计算机,从小就知道未来想做什么,所以在别人纠结专业的时候我完全不需要选择,而自己的兴趣也正好是发展很快、机会很多的领域。但是随着年龄和经历的增长,我越来越觉得因为过早地在某方面产生强烈兴趣而排除了其他可能性未必是一件好事。Nike 创始人 Phil Knight 在他的自传 Shoe Dog 里说: I feel sorry for the people that know exactly what they’re going to do from the time they are sophomores in high school. I think the process really needs to go through a time period before you really find what it is. 他所同情的大概就是我这类人。我在中学之后偏科是比较严重的,注意力都在计算机和英语上,到了最近这些年反倒因为对其他领域的好奇心而看了很多书来填补知识的欠缺。我比较后悔的一件事是在有时间有条件的学生时代没有更多地向广度扩展知识体系。 如果你关注 Charlie Munger 的文章或演讲,会知道他在很多场合强调过多学科思维的重要性。他认为具备多学科的基础知识和思维模式对于做正确的决策是至关重要的。只精于一门的人,一方面容易管中窥豹,拿着锤子就觉得什么都是钉子1,另一方面在某方面的资历越高,就越容易自信、越看不到自己的盲区、越可能在自己的称职范围之外做错误的决定。Liberal arts 教育对本科的定位是有所侧重的通识教育,所以很多美国大学都是先进入学校学习一段时间后再选专业。耶鲁的很多本科生到最后一年才选定专业,并且本专业的学分只需要占到毕业所需总学分的三分之一,所以拿双学位是很常见的事。在我们系即使是博士,前两年也要上各方面的课程,必须通过所有四个领域的综合考试2才能选择导师和具体的研究方向。我的导师在计算机科学的多个方向都有很高的成就,所以无论我选择在哪个方向深入下去,他都可以指导我。有一次我告诉他我对很多东西都挺感兴趣的,苦恼于如何决定博士论文的主题。他对我说「不用担心,大部分人的问题是专业化得太早,那并不是一件好事」。 很多父母都会努力让孩子「不要输在起跑线」上,就好像人生是一场赛跑。如果这么看的话,人生的轨迹就应该是线性的,每个阶段做的事情都应该是以上一个阶段为基础,不断积累,这样才能把到达终点时的某个指标最大化(可能是金钱、名望、或其他用来衡量人生的标尺)。以这样的人生观,本文开头的那个律师就不应该放弃已经有丰厚回报的事业到另一个领域从零开始。但是人生并不是一个比赛,往回看的时候充实感来自于在有限的人生里对多种可能性的探索,对大千世界的体验,以及对自己好奇心的满足。我很尊敬那些追随内心,不介意成为另类,在任何年龄都有勇气再次成为新手的人。 币圈和链圈大概有不少人属于这种类型。 ↩︎ 分别为:计算理论、程序设计语言、人工智能和科学计算。 ↩︎
2024-06-13 08:00:00
过去一两年有多位投资人朋友和我讨论过 AI 相关的创业机会。我的观点一直都是:大的机会基本上是巨头的,小公司没有特别好的机会。 当技术上的突破让小公司有机会颠覆大公司时,新技术最初的应用都在巨头看不上的新兴细分市场。随着这些市场快速扩大,小公司在成长起来后迅速地进入主流市场抢占原主导者的份额。随着原本不存在的个人电脑市场兴起的 Intel、Microsoft 等是最好的例子。近年来 AI 的发展在技术上有很大突破,但商业上的局面却没有给创业公司颠覆性的机会。一方面这是巨头们从一开始就重视的领域,投入很大;另一方面机器学习本身就需要大量的资源和数据,所以大公司或者他们投资的企业往往更有能力持续产出最好的成果。 另一个原因是新 AI 技术的应用往往是对现有场景和过程的改进或补充,没有创造出以前不存在的全新场景,所以对于已经掌握了用户关系的产品来说,后来者无法形成威胁。我喜欢举的例子是 Adobe 能在 Photoshop 中增加 AI 功能,Stable Diffusion 和 Midjourney 却不可能做出替代 Photoshop 的产品。在这种情况下,谁掌握了与消费者的直接关系,谁就掌握了市场。没有什么是比随身携带的手机和消费者关系更密切的,在可见的未来仍然如此。手机不仅仅是设备,还是包括应用和开发者在内的整个生态。Humane 和 Rabbit 之类的公司错误就在于试图做一个完全独立于手机但是又无法让用户不用手机的产品。Apple 的产品与消费者之间的密切关系决定了短期在技术上有没有走在最前面不是特别重要。OpenAI 做不出 iPhone 的替代品,更别说 iOS 的整个生态。但 Apple 可以把 OpenAI 的能力整合进自己的产品。如果 OpenAI 不愿意合作,还有 Claude 等众多选项,虽然不一定是最好,但差别也不大。 Apple 的设备会把一部分非个性化的请求发送给 ChatGPT。有一些媒体说与 Apple 的合作对 OpenAI 是利好,但是我认为 OpenAI 的收益是非常短期的。第一,Apple 与 OpenAI 的协议规定他们不能存储用户数据1;第二,Apple 在技术上也有措施避免 OpenAI 把同一用户的多次请求关联到一起。所以 OpenAI 得到的基本上仅限于财务收益,和用户之间建立不起有意义的关系。Apple 之所以在使用 ChatGPT 的时候明确告诉用户,一方面是为了透明,让用户知道信息发送到了哪里;另一方面恐怕也是要避免为 ChatGPT 引起的问题背锅。考虑到 Apple 走的从芯片到整机、到软件、到服务的垂直集成路线,以及 OpenAI 与 Microsoft 的密切关系,Apple 一定会在尽可能短的时间内用自己的方案替代 ChatGPT。可以说在战略上 OpenAI 是比较被动的,这是个他们无法拒绝的 offer。无论接不接受,他们自己的独立 C 端产品在 Apple 的平台上都不再有存在的意义,但自己赚这笔钱总比让竞争对手赚好。而且无论如何 Tim Cook 都会说「我们找了市面上最好的 partner 合作」,OpenAI 可不愿把这个背书给别人。
2024-06-03 08:00:00
我 2007 年至 2010 年在 Google 工作的时候,中国的同事们都说百度无良,欺骗用户,把广告显示得和原生搜索結果几乎一样、难以区分。Google 的搜索广告在 2013 年之前一直是通过背景色与原生结果明确区分的。 带背景色的 Google 广告 后来背景变得和原生结果一样,改为用彩色的标签来标识广告。无论在用背景色的时代,还是用标签的时代,Google 都做过很多试验来通过调整颜色提高转化率。从 2020 年起,Google 的广告变成这样了: 现在的 Google 广告 不但视觉上和原生广告完全融合,而且首屏已经被广告占满。这个结果可以说是必然的,不做任何试验就能知道广告样式越接近于原生结果,点击率必然越高。之前做的种种实验无非是 Google 创立之初的价值观和与之矛盾的商业模式相纠结的漫长而耗资巨大的过程。 很多人都读过 Google 的两位创始人在创立公司之前写的 PageRank 论文,但很少人会看附录。这篇论文的附录 A 是 Advertising and Mixed Motives: … The goals of the advertising business model do not always correspond to providing quality search to users. … It is clear that a search engine which was taking money for showing cellular phone ads would have difficulty justifying the page that our system returned to its paying advertisers.
2024-05-31 08:00:00
我一直很喜欢 Out of the Gobi1 的作者单伟建。他的三本书我都读过。他在文革时被流放到戈壁六年,失去了上中学的机会,但从没放弃学习。没有放弃对更好未来的追求。在文革结束后他抓住了机会到美国留学,在金融界取得了很高的成就,并创立了亚洲最大的私募基金集团 PAG。他在母校旧金山大学的一次演讲中说2,在任何领域取得成功,最重要的是三方面: 坚持终生学习。他本人的经历最能说明这一点。如果他在离开学校后没坚持学习就沒有后来的一切。 好的判断力(good judgement),他特别提到这比 Angela Duckworth 强调的毅力(grit)3更加重要。方向对了努力才有意义。没有人是生来就有好的判断力的,正确的决策要建立在知识的学习和积累上,所以这可以算上一条的补充。 运气。很多人把成功归功于自己的才能和努力,却没有意识到好运在其中的重要性。忽视了这一点就难以保持谦虚,难以不断学习。 不少很成功的人都公开谈过运气在自己经历中扮演的角色。Charlie Munger 在 2017 年的一次演讲4中说,大部人只要每天起来后都努力做事,有一些自律并且持续学习,最终都会发展得很不错。但是目标不能定得太高,像成为总统或者成为亿万富豪之类的事,运气的影响太大,成功的可能性太低。Warren Buffet 也在回答一个关于资本增值税的问题时说,「卵巢彩票」恐怕是影响一生最大的因素,而他和 Charlie Munger 都赢了卵巢彩票。5李光耀曾经在采访中说胚胎形成的时候已经决定了一个人特质的 70%,因为领袖是天生的而不是教出来的。6我不完全同意他关于个人特质的观点,但那一刻除了决定基因外,更重要的还决定了后天的成长环境,确实对人的命运起到了近乎决定性的作用。 我最早接触计算机从 DOS 用起,直到后来的 Windows 3.0/3.1、Windows 95。我中学时看了 Bill Gates 的传记和他本人写的《the Road Ahead》,他的故事也是最早让我产生创业梦想的原因。Bill Gates 的成功除了自己的天分和努力外,也离不开他出生的时代和家庭背影。他 13 岁的时候就读的湖滨中学由家长集资购买了一台可以访问通用电气西雅图分部的 PDP-10 小型机的终端。当时微处理器、Atari、Intel 都还不存在,他学编程的时候全美国没有几个同龄人能接触到计算机。他父亲是成功的律师,当时已经在做天使投资,她母亲虽然从没全职在商业公司任职,但是因为家族是很成功的银行家,在很多公司的董事会里。他童年时每天家里晚餐的客人不是 CEO 就是议员。后来他母亲与 IBM 董事长的社交关系也帮助他得到了 IBM 的合同7,这是微软起飞最重要的一步。在那之后微软的快速成功也很仰赖于合作伙伴的局限性和竞争对手的失误。微软一开始的重心在程序设计语言上,唯一的产品是 BASIC 的解释器,对操作系统并不重视。在与 IBM 合作的初期,他们推荐 IBM 去找开发 CP/M 操作系统的 Digital Research 合作。而 Digital Research 的 CEO 因为未知原因没有见 IBM 派去的代表,所以双方没有达成合作,微软只能另想办法。当时有一家当地硬件公司 Seattle Computer Products 克隆了 CP/M 用来测试 Intel 8086 处理器,这个操作系统叫 QDOS8。微软向他们购买了 QDOS,并雇它的作者来基于 QDOS 开发了 MS-DOS,而从它开始的操作系统成了微软帝国的根基。可以说微软的成功是非凡的天赋、正确的策略、和令人难以置信的好运合力作用的结果。
2024-04-09 08:00:00
我看书大部分时候是用 Kindle,偶尔也会从京东、多抓鱼,或者嘉里中心的现代书店买纸质原版书。新书的扉页背面基本都会盖这样一个章。 扉页背面的审查印章 我原本以为这基本是一个形式,获准进口的成年人类别的纸质书无论是什么内容都会在这一页上盖这个章。直到前几天在一本很厚的书中间的一页看到这个章以及被涂改液覆盖的脚注。 被审查涂改的页面 没想到我国内容审查的粒度竟然那么细。很多人都会问为什么中国的税率那么高,社会福利安全网却还比较差。从这件事的人工成本就能想见政府运行的成本有多高,应该说大家的税还是没有白交的… 从某个时候起,中国的任何互联网产品只要有任何形式的 UGC(包括头像昵称等),就会有很高的审核成本。这类产品早就不是小创业公司能做的了。 如果你好奇,这本书是 Behave,是一本讲人类行为的科普读物。涂改液覆盖的内容是: (11) Mao-induced Chinese famines, 1.4 million 排在人为灾难年化死亡人数的第 11 位。
2023-12-19 08:00:00
在 LeanCloud 被心动收购快三年的时候,我离开了心动和 TapTap。 Removed from LeanCloud GitHub organization 一段时间前我看到 Will Larson 写的 Deciding to leave your job,其中讲到决定是否离开时应该问自己的四个问题: Has your rate of learning significantly decreased? Are you consistently de-energized by your work? Can you authentically close candidates to join your team? Would it be more damaging to leave in six months than today? 这几个问题可以说贴切地描述了我当时的状态。我对于公司的管理风格和文化有比较强的看法,过去创业最重要的原因也是要实现自己的这些想法。所以如果在这些方面对所在的公司失去认同,就很难专注地把工作做好,很容易把注意力转移到个人自身的提高上。这或许可以算是我的缺点。所以应该说离开的决定在内心早就做了,只是一直没考虑确定具体时间,也一直没好意思提出。在国庆前正好我创业时的合伙人俊文也说准备离开,所以国庆后我就一起提出了。毕竟他离开就意味着很多工作要交接,组织结构也要调整,以其过几个月再调整第二次,不如一次到位。过去三年内外部环境都变了很多,我所负责的业务对现在的 TapTap 来说确实价值很有限,我们离开也好给公司需要做的一些改变让路。 之后我很快加入了 EMQ。这是一家做跨境支付的公司,国内还有一家做 IoT 的同名公司,所以很容易混淆。我在 10 多年前还在负责 AVOS 中国的时候就通过 Steve Chen 介绍认识了 EMQ 的创始人 Max,当时他还没创业。EMQ 和 LeanCloud 是同一年开始的,后来 Max 多次邀请过我加入,虽然时机都不太合适,但我一直关注着这家公司的发展。这次时机对双方来说都很合适,所以我就决定加入了。过去很多人都说我离钱比较远,那么这对我是个离钱近一些学习 financial services 的机会。
2023-05-17 08:00:00
「如何反转一个链表?」是一个在面试中被问滥的问题。我参与的面试中偶尔也有我们自己的面试官问。 如果你去别的公司面试被问到这个问题,要是给出的答案是(以 Python 为例): def reverse(l): l.reverse() return l 或者是: def reverse(l): return l[::-1] 肯定会被拒掉。面试官所预期的是你自己定义节点,再定义链表: class Node: def __init__(self, data): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None # 以下略,问 ChatGPT 就可以了。 不过既然是个被问滥的问题,如果遇到不妨尽量给出一个面试官没见过的答案。 比如,构造链表: def cons(h, t): return lambda f: f(h, t) 取头: def car(l): return l(lambda h, _: h) 取尾: def cdr(l): return l(lambda _, t: t) 反转: def reverse(l): rev = lambda l, r: rev(cdr(l), cons(car(l), r)) if l else r return rev(l, None) 以上就是完整答案。为了展示方便写个打印链表的函数:
2023-03-23 08:00:00
这是我一年前发在 TapTap 内部 Confluence 的一篇文章,经过一些修改后公开出来,希望对更多人有价值。 Google 的很多软件工程实践都在对外发布的各种 Tech Talk、CppCon 的演讲以及多本已出版的书里提到过(比如 Software Engineering at Google、Site Reliability Engineering 等),所以这篇文章的内容并不算新鲜事,只是贡献一些个人视角。另外我在 Google 工作已经是 10 多年前的事,现在可能已经变化很大,但我认为 2000~2010 年的时候是 Google 最有创造力、最高效、对人才的吸引力也最强的时候。 一点背景 有时言必谈前公司的人会有点让人讨厌,不过无论是之前创业,还是现在,讨论起工程方面的事情都很难避免提起 Google 是怎么做。Google 和所有公司一样,并不是所有方面都做得很好,比如产品能力以及饱受诟病的客户服务。但就是因为在 engineering 方面领先大部分公司很多,所以削弱了其他方面的弱点带来的影响。Google 取得成功的大部分产品基本都是在技术实现上大幅领先同时代的产品,从而实现用户体验上的领先,早期产品中最有代表性的是 Search、Maps 和 GMail。Google 的 engineering culture 也对包括 Facebook 等在内的大量硅谷公司以及国内包括字节这样的公司产生了深远影响。 我在 Google 的三年是在一个叫 Google Web Server(简称 GWS)的团队。这个项目可以说是 Google 历史最悠久的项目,从 Google 存在开始就有 GWS,到现在 20 多年,Google 的 HTTP header 里 server 还是 GWS,应该还是同一个项目、同一个 code base 和 binary。 GWS in Google’s HTTP header
2021-09-12 08:00:00
其实这是知乎上的回答。公司并购之后由于团队变大了很多,特别忙,所以博客和播客都断更了好久。 其实我们官网的公告已经把主要的前因后果介绍得比较清楚了,没有太多其它的新内容可说。 其它答案里说的大公司同类竞争之类倒不是主要原因。从我们创业开始,阿里、腾讯就陆续有过多次形态类似的产品尝试,后来字节也有相似的产品,但是都并没有很成功。选择不用 LeanCloud 的用户大部分是会用云主机等形态更底层的云服务的。所以本质上我们主要是和更传统的云服务竞争,而不是和形态相似的产品竞争。 LeanCloud 创业的几年中,各方面都有不少改进的空间,但是在资源有限的条件下,我觉得在国内环境能做的范围内,产品、团队和文化都还是有一些做得不错的地方,各方面被同行借鉴得也不少。但是我们在财务上并不成功,至少没有达到 venture-backed 的创业公司的增长期望。一方面团队创始人都是技术出身,公司一直都没有过在市场、BD、销售方面有资深经验的人才,虽然有一两次碰到比较合适的人,但都因为各种原因没有实现;另一方面也有行业发展的客观原因,做一些横向对比就能发现。Starbucks 前 CEO Howard Schultz 说过,公司文化等等很重要,但是一家公司在财务上能 deliver 是一切的基础,不然其他东西都是不可持续的。 LeanCloud 并不是第一次收到并购邀约。过去曾有 A 股上市公司,加密货币和区块链最火爆的时候也有这个领域的公司,不过都没推进到谈价格的阶段。因为两个前提要有保证:第一是产品的未来发展和对现有用户服务的连续性;第二是文化和管理上我们创始人自己和团队得愿意加入对方。 知道和使用 LeanCloud 的游戏公司数量很少,但是如我们的公告上说,这部分公司贡献了将近一半的收入。其实我们一直以来都很想拓展这个领域的客户,但是一直都没找到好办法。与 TapTap 的结合对 LeanCloud 来说是一个让我们的产品真正进入游戏行业的很好的机会。对所有现有用户来说,也意味着我们未来有充足的资源继续改进产品。 心动从做「天天打波利」开始就用 LeanCloud 的服务,一开始我和前 CTO 沈晟沟通得比较多,从去年开始聊并购后和两位创始人及其他高管都有交流。他们所期望的公司管理方式和文化和我们自己还是很一致的。创业的人大多有两方面的目标:一方面当然是财务上的;另一方面是创造一家符合自己自己理想的公司。只是很多人做着做着就忘了第二点了。我觉得心动/TapTap 是一家很难得的公司:两位创始人在坚持朝着自己的理想迈进,而同时财务上又能 deliver。其实因为财务上的空间比较大,心动和 TapTap 在管理和文化上在做一些比 LeanCloud 更加大胆的尝试,只是因为公司一直比较低调,所以在互联网圈子里大部分求职者对这家公司还缺乏了解。 LeanCloud 团队目前已经和原 TDS(TapTap Developer Services)团队合并,LeanCloud 的各项服务也已经引入 TDS,详情可以看我们两天前办的 TapTap 开发者沙龙的报道。现在 TDS 正在积极扩充团队,欢迎优秀人才加入,详情请见我们的招聘网站。
2021-02-13 08:00:00
这一期我们从 IPFS 项目及 Brave 浏览器的一些新尝试展开聊了 Web 的开放性相关的话题。 特别感谢 Kai Luo 为我们制作了片头片尾音乐。 如何收听 播客主页 有国外各大平台的链接 直接订阅 RSS 其它平台待更新 本期主播 Livid 王子亭 江宏 相关链接: IPFS IPNS ZeroNet Brave 浏览器
2020-12-28 08:00:00
在 small talk 的第二期我们聊了一下搭载苹果 M1 芯片的 Mac。我们回顾了各自使用 M1 Mac 的感受和遇到的问题,后半部分讨论未来可能的行业影响以及购买方面的建议。 欢迎留言给我们提出反馈以及以后希望听到的话题: 语音留言(你的留言可能会出现在以后的节目里) 文字留言:请在本帖下面发评论 如何收听 播客主页 有各大 Podcast 平台的链接 喜马拉雅 直接订阅 RSS 本期主播 Livid 王子亭 江宏 讨论中提到的相关链接 苹果正式发布 M1 芯片 在 M1 芯片 Mac 上使用 Homebrew Docker desktop for M1 Mac tech preview Why is Apple’s M1 chip so fast? 在 M1 Mac 上跑 3DMark 在 M1 Mac 上用 Rosetta 2 + CrossOver 玩 Resident Evil 3 M1 对 Resetta 2 的特殊支持 Mac 2002-2018 出货量 Nintendo Switch 出货量 OpenEmu:Mac 上的游戏机模拟器 Microsoft reportedly designing its own ARM-based chips for servers and Surface PCs Graviton: AWS 自研的 ARM 芯片 Ampere Computing:研制云计算 ARM 芯片的公司
2020-12-24 08:00:00
最近难过地得知 Stan Eisenstat 教授在 12 月 17 日去世,我在 2017 年回学校时还去找他聊了会儿天。这也让我想起几年前去世的 Paul Hudak。这两位教授虽然不是我正式的导师,但都对我影响很大,所以就想写一写我对他们的记忆。 Stan Eisenstat 我在去耶鲁上学之前就在 Joel Spolsky 的 Joel on Software 里读到过 Stan Eisenstat。他教的 CS323: Systems Programming and Computer Organization 在学生中是一门传奇性的课程。选课的人往往在那个学期会需要花大量时间熬夜甚至通宵来完成他布置的几个大作业,而在课程完成后都会觉得收获很多。进入耶鲁后我抓住机会申请做了这门课的助教。当年(1998 - 2002)我在国内接受的计算机科学本科教育说实话和美国好的大学比还有很大差距,直到后来国内大学有越来越多留学回来的人加入,这个差距才缩小,所以其实读博期间还要弥补一些知识面上的裂缝。给本科生课程做助教对于提升自己也是非常有益的。他在一个学期里会让学生完成几个大作业:实现一个 UNIX shell,一个 LZW 文件压缩/解压程序,重新实现 make 等等。每个项目 Stan 都会准备好一套测试,学生提交完后他跑一遍测试就能马上得出正确性的得分。他也准备了详尽的代码风格文档,所有的作业和考试都有正确性和风格两部分分数。到期末他会让助教自己设计一个期末项目给学生作为期末考,助教也要负责给这个项目写一套自动化测试来给学生提交的代码打分。所以每一届学生遇到的期末项目都不同,而每个助教也有自己的发挥空间,参与这个过程的每个人都很有收获。我现在还记得给学生出的题目是做一个支持用 telnet 登录的多线程 BBS 服务器,我写了一个 telnet 机器人来测试他们实现的各项功能。Stan 在耶鲁计算机科学系将近 50 年,这门课和他教的 CS223: Data Structures and Programming Techniques 一直都是计科系的核心编程课,无数学生在 Zoo(系里的机房)耗费了无数夜晚来完成这两门课的作业。 Paul Hudak 我对 Paul Hudak 也是在去耶鲁前就有很多了解。我本科的毕业设计是函数式语言的课题,所以找了一些 Haskell 的资料看。Paul 是 Haskell 的主要设计者,当时他正好出了一本新书。那时市面上还几乎没有正式出版的 Haskell 的书,国内更是完全没有。我给他发邮件问问题时提了一句很遗憾在中国买不到他的书。过了两周多就收到了他给我寄过来的书。后来进了耶鲁我选了另一位教授开的 functional programming 课,因为这方面基础薄弱学得比较差。后来 Paul 教这门课时我又去报名做助教,相当于自己也又学了一遍。虽然后来我没有选择在程序语言方面深入下去,但因为他的原因一直保持着对这个领域的兴趣和关注,所以当 Clojure 这样更具实用性的函数式语言出现时我很早接触并应用到实践中,后来创业时也选择它作为主要开发语言,使团队能在早期很高效地开发出产品。
2020-12-10 08:00:00
我们一直都想做一个中文播客节目,但是因为最初提出想法的人都比较腼腆,一直没有启动。最近我来推动开始了这件事。 播客名称叫 small talk,除了闲聊的意思外,也有个编程语言叫 Smalltalk,算是有些双关。这个播客的目的不在于宣传产品或公司,只是聊一些有趣的技术话题。会长期参与的除了我自己外还有 V2EX 的 Livid 以及我在 LeanCloud 的同事王子亭。我们也会邀请其它嘉宾来临时参与,欢迎在评论里留言建议以后的话题。 第一期的话题是聊聊每个人家里的私有云。为了快速发布,片头片尾音乐等细节就省略了,以后再慢慢迭代。目前发布在以下平台: 有人说没有 RSS,所以我把 RSS 挪到了第一个 Anchor(源) SoundCloud Spotify Apple Podcasts Pocket Casts Google Podcasts 喜马拉雅 或者可以直接播放: 其中提到的软件和网站有: 王子亭的 NAS 选项和配置 群晖 NextCloud(一套开源的同步盘解决方案) UniFi Cloud Key NUC(英特尔的迷你电脑) Visual Studio Live Share Grafana 和 SmokePing(监控图表工具) 树莓派(最好不要跑存储服务) ZFS RAID5 的数据重建真的很糟糕么? restic(支持加密、快照,备份到对象存储的备份工具) B2 Cloud Storage(低成本对象存储) Resilio Sync(端到端的文件同步工具) frp(内网穿透代理) ZeroTier(一个支持 P2P 模式的虚拟组网服务) Tailscale(一个好用的虚拟组网服务,基于 WireGuard) Nebula(Slack 的虚拟组网工具) Cryptomator(给网盘加上端对端加密) Announcing Amazon EC2 Mac instances for macOS 关于用 OS X 做 V2EX 的网站服务器
2020-11-23 08:00:00
很长时间之前我在公司内挖了个坑说要做个 Emacs 和 org-mode 的内部分享1。后来一直因为拖延症没有做。上周我和其他同事讨论准备做播客的事,就又想起这件事,周末花了点时间录成一个视频放在 YouTube: 这也是我做的第一个视频教程,看完别忘了点击订阅 😁。很快我们也会发布第一期播客,请关注。 忘了具体原因,大概是有一次受不了新同事在编辑器方面的品味。😏 ↩︎
2020-09-29 08:00:00
几年前一位 LeanCloud 的用户做了一个基于 LeanCloud 的评论系统叫 Valine。后来在中文独立博客,特别是用 Hexo、Jekyll 这样的静态博客框架的用户中很流行。但是最近一两年因为监管变严,无法自己备案域名的国内用户不得不迁移到国际节点。另外免费的开发版服务本意是用于开发测试,而不是需要持续运行的正式项目,所以用户们想了一些比较 hack 的办法来绕过开发版限制。大多数人都会直接 copy 网上搜到的教程,不做任何修改,这样也给 LeanCloud 带来了一些奇怪的问题。比如我们花了不少时间来分析为什么每天总是在同一时刻有大量用户的应用会开始运行定时任务。 我用业余时间断断续续做了一个叫 Remark Ninja 的评论系统,目前到了可以开放给其他人用的状态。我自己的博客、LeanCloud 的博客,以及一些自己发现 Remark Ninja 的第三方网站已经用了一段时间。由于我自己在前端基本只用 React,所以目前只提供了 React 组件。Gatsby 是一个基于 React 的功能强大灵活的静态网站框架,我个人很推荐。非 React 的网站可以在局部用 React,或者直接用 RESTful API。 除了博客以外,以 thread 方式组织评论的网站都可以使用这个服务。目前提供了以下功能: 基本的评论和管理功能 给站长的新评论提醒 给原评论者的新回复提醒 Markdown 支持 没有用 Google Analytics 之类收集用户数据的服务 计划中的功能: 垃圾评论过滤 由于前端水平有限,React 组件做得比较简陋,欢迎提 pull request。
2020-08-21 08:00:00
前段时间 Trump 的这个采访成为社交媒体焦点的时候,我正好在复习一些 neural network 的材料,于是想到可以用一些新的开源工具做一个识别 woman、man、cemara、TV 的完整应用试试。这个例子足够小,可以在很短时间完成,很适合用来说明如何做一个完整的深度学习应用。完成的应用部署在 https://trump-sim.jishuq.com (LeanCloud的一个云引擎实例上)。 做这个应用分为三步:先用一些图片完成模型的训练,然后把模型导出,做一个后端的 API 用来识别图片,再做一个前端用来上传图片和显示结果。 准备训练数据 Jupyter notebook 是个很流行的用来做数据分析和机器学习的交互式环境,它可以把 Markdown 文档和 Python 代码放在一个笔记本里,也可以以图表、图片等友好的方式显示代码的运行结果。这里也会用到 FastAI,它是一个基于 PyTorch,提供了很多网络和文件批量操作便捷接口的开源库。这篇文章就是在 Jupyter notebook 里写的,所以你可以直接 clone 这个 repo、安装依赖、启动 Jupyter notebook。 git clone https://github.com/hjiang/trump-sim-notebook pip install -r requirements.txt jupyter notebook 我们还会用到 Bing image search API 来获取做训练的图片,你需要自己注册并申请一个免费的 API KEY。当然,因为搜索到的图片是在很多第三方网站上的,所以你需要能无障碍地访问中国之外的网站。🤷♂️ 把你的 Bing image search API key 放在项目目录下的 .env 里,以免在代码里泄露出去: BING_SEARCH_API_KEY=XXXXXXXX.... 然后在 Python 里读进来 import os from dotenv import load_dotenv load_dotenv() key = os.
2020-05-24 08:00:00
最近看完了 Out of the Gobi: My Story of China and America,要是翻译成中文应该叫「走出戈壁:我的中国和美国故事」。作者单伟建上完小学后就因为文革下放到内蒙古生产建设兵团。文革后,没拿到小学毕业证的他进入了北京外经贸大学,之后在旧金山大学获得了 MBA,在 UC Berkeley 取得博士学位,后来在 University of Pennsylvania 任教。现在他是亚洲最大的私募基金之一 PAG Group 的主席和 CEO。这本书提到了很多在中国大陆比较敏感的话题,所以很可惜在目前回归个人崇拜和个人权威的环境下,应该短期内在中国见不到不经大量删减的中文版了,所以只能看 Kindle 版或者听 Audible 的有声书。 这本书讲述了作者前半生的历程:出生在北京一个大院,经历大跃进、大饥荒和文革初期,亲眼见到一些人被残酷地批斗致死,后来被下放到了内蒙古戈壁滩做了六年多徒劳无功的苦活。文革结束后他进入了外经贸大学并争取到了做访问学者的机会,后来在美国一流大学取得多个学位。 这本书里有很多动人的小故事,其中两处大概因为和我自己经历有些共鸣,最打动我。 第一是作者在戈壁滩的六年多里从没放弃学习,没有放弃对更好未来的追求,除了阅读能找到的一切书籍外,还让同被流放的前民航飞行员教他英语。他在去年 UC Berkeley 的一个演讲中说,他看到很多比他更有才华的人因为文革毁掉了一生,周围充满了悲观,但是他不断告诉自己:如果大环境一直很糟糕,自己要在戈壁待一辈子而没有出头之日,他没有谁可怨;但是如果将来发生变化,因为自己没有准备好而失去了改变命运的机会,他只能怪自己。所以他在逆境中也一直在为将来准备。 第二件事是他得到了亚洲基金会赞助到旧金山大学访问,他希望能参与该校的 MBA 课程并争取拿到学位但苦于没有学费。在想尽各种办法无果将要放弃时,他的导师给他带来了好消息:一个匿名捐助人愿意赞助他的学费。于是他成功地注册并开始了 MBA 课程。过了一段时间待他学业有小成之时,他导师告诉他那位匿名赞助人希望约他在旧金山的某个高档餐厅共进晚餐见一面。当导师夫妇身着正装出现在餐厅时,他才猛然意识到原来他们就是捐赠人。多年以后他以导师的名字命名捐赠的奖学金,以帮助更多人追求梦想。 我与作者很有共鸣,因为虽然时代不同,但是我 2002 年以当时所在的学校和背景到美国留学原本也是一件可能性很低的事(更不用说进入一所好学校),这个过程也得到了很多人的帮助,而在美国的 8 年也改变了我很多。我看完这本书后给远在 New Haven 正因为 COVID-19 疫情在家隔离的导师寄了一本作为生日礼物。 这本书在当下的环境有特别的意义。仇恨与冲突都是政客制造出来用来操纵民意、博取支持和所谓合法性的工具。普通人的生活本来离这些东西很远,却往往被煽动起来的狂热毁掉。只有国家走向开放,不同国家的人之间能自由交流,美好的事情才会发生。只愿我们的下一代还能有一个开放、和平的世界。
2020-05-22 08:00:00
最近我们决定正式开始每季度一周的全员远程工作,这是我发给公司的邮件: 大家好, 我们在疫情期间已经经历过比较长时间在家办公,以后一段时间,特别是冬季来临时,疫情可能出现反复,还可能出现类似的情况。因为这次疫情,全球的工作方式都可能出现永久性的改变。我们希望每个人都能在远程的条件下有高效工作、协作的习惯和能力,所以决定从 6 月开始试行每个季度全员在家办公一周的政策。除了让大家习惯于远程工作,让我们未来在招聘上有更大的灵活性外,也能满足一些同事兼顾家庭的需求。 具体的试行方案如下: 在 3 月、6 月、9 月、12 月的第二个工作周,全员远程办公。比如这次是从 6 月 8 日开始的那一周。 远程办公的时候和日常的要求没有差别,无法在正常时间工作的同事还是需要照常请假。 请大家保证工作的环境,不要跑到偏僻或网络不好的地方。每个人要为自己的安全负责,公司不为远程办公期间出现的包括交通事故在内的安全问题承担责任。 等试行一段时间后我们再根据结果和大家的反馈进行调整。 谢谢大家。 去年的时候我们就不定时地试验过远程工作周,今年因为疫情年后又进行了比较长时间的在家工作。根据过去的经验和内部的反馈,我们正式定下了周期性远程工作的方案,希望这是个成功的试验,未来能有更多大胆的改变。
2020-04-22 08:00:00
我家里的局域网除了电脑、iPad、电视、PS4 等常见设备外,最主要的额外配置是一个 Synology DS416slim NAS 和两个树莓派(Raspberry Pi)。 我的树莓派 3 和树莓派 4 大概两年多以前我为了把公司老笔记本上换下的一些 2.5 寸硬盘利用起来,买了一个二手的 DS416slim NAS 用来做局域网的共享存储。不过它只有 512M 内存,CPU 也很弱,除了做文件服务器外跑不了太多东西。后来我陆续增加了 Raspberry Pi 3B 和 Raspberry Pi 4B 用来支持其他服务。 Raspberry Pi 4 有 4G 内存和千兆网口,可以跑比较多东西。我用 Clash 配置分流规则并配合 iptables 把它作为局域网内其他设备的网关,除此外还运行着 Radarr、Sonarr 等服务,mount 了 NAS 用于数据存储。 Raspberry Pi 3 上运行的 pi-hole 是我想重点介绍的,它在国外的 Raspberry Pi 用户中很流行,但国内用户相对少。Pi-hole 是一个用于屏蔽广告和保护隐私的 DNS server,它会把用于提供广告、追踪效果、收集用户信息或存在恶意软件的域名屏蔽。很多人都已经用浏览器插件达到同样目的,但是因为 pi-hole 是在 DNS 层面屏蔽,所以对电视等各种联网的设备同样有效,更适用于家庭局域网。 Pi-hole 的界面 除了屏蔽域名外,pi-hole 也会把内网域名解析的统计数据可视化,让人更清楚地理解家里的网络活动,比如访问次数最多的域名以及被屏蔽次数最多的域名和设备。你知道你的智能电视即使在关机状态下也在不断发送请求吗?根据 pi-hole 统计的信息,我卸载了 Android TV 上某国内大厂旗下的视频应用,家里的请求数下降了 90% 以上。
2020-02-08 08:00:00
在我加入 Google 几个月后,北京奥运在全球的火炬传递活动开始了。很多人可能都对那段时间的事有印象:在几周前拉萨刚发生了暴乱,很多无辜的生命消失了,并且 CNN 等媒体使用了不实的图片进行了有偏见的报道;在巴黎,支持藏独的示威者多次粗野地干扰奥运火炬传递,还有人从坐在轮椅上的运动员手中把火炬夺走。巴黎的下一站就是旧金山,在湾区工作的中国人大多都请假去了旧金山以支持火炬传递,避免巴黎的事件重演。当天 Google 一个餐厅的菜单上出现了一个甜点叫 Free Tibet Goji Berry。由于中国员工大多都在旧金山,没什么人注意到。在第二天这个名称又再次出现在菜单上,我看到中国员工的邮件列表里有人发照片开始讨论这件事。Google 的人力资源副总裁 Laszlo Bock 后来写了一本书叫 Work Rules(中文名「重新定义团队」),其中提到这件事,中文版里是这么翻译的: 菜单贴出来后,一名谷歌人给埃里克1写了一封邮件,主要内容如下:“这是从今天的菜单中摘录的。如果公司不给出合理的解释或行动,我就辞职抗议。” 这名谷歌人将他的留言抄送了几个小范围的邮件列表,而后一位工程师又将邮件转发给全公司范围的邮件列表,作为杂事讨论。 后来这个话题创造了最快达到一百条回应的记录,成为第一条突破 1000 条回应的主题。有一名谷歌人数过,总共有 1300 多封关于这个主题的电子邮件。 他说的那个给 CEO 发邮件的谷歌人就是我。除了一些细节以及没有考虑事件背景外,他在书中对于这件事的描述基本是准确的。其实我在邮件中没有用「辞职抗议」这样的语言,而是说「我不愿意在这样一家公司工作」,不过意思差别不大。 当时 Bock 和参与讨论的很多人都对这件事的本质有一些误解。这件事本质并不是公司里有一些人对西藏持某种观点,而大部分中国员工对此持相反的观点,所以双方发生了矛盾。我在美国生活的八年里,有各种背景的朋友和熟人,包括美国人、中国人、欧洲人、也包括台湾人、香港人,政治上的差异从没有成为障碍,大家通常也并不热衷于政治。我之所以反对当时发生在 Google 的事,是因为它并不是针对某个政府的抗议行为,而是在当时特定背景下针对公司内部一部分员工的有些挑衅的行为。Google 之外的人不会知道这件事,会看到并注意到这个菜名的,主要是 Google 的中国员工。这位工作人员利用工作上得到的权力来向 Google 的员工单向地推广他的政治观点,这是不应该发生在工作环境中的,不是适用于言论自由的问题。 现在回过头看,我还是认为应该提出异议,但是会采用一种更成熟更职业的方式。 之所以说起这件往事,是希望避免有人看了我写的东西质疑我不爱国。我想我的爱国程度应该还是高于平均水平的吧,毕竟网上大部分声音很大很爱国的人士,实际上愿意为之付出的个人代价是很低的。 虽然爱国这个概念我们从小就被灌输,但是大部分人没有想过爱国爱的到底是什么。拿五四运动来说,习主席对它的定性是: 一场以先进青年知识分子为先锋、广大人民群众参加的彻底反帝反封建的伟大爱国革命运动 当时不但没有中华人民共和国,中国共产党都还没有成立,而五四运动反对的是当时执政的北洋军阀政府的外交政策。可见爱国不是爱政府,也不是爱特定政党,并且还有可能是反对政府。 那爱国爱的是什么,国家是什么呢? 国家和公司、家庭这样的集体名词一样,并不是物理世界客观存在的东西。它只是人意识中的一个概念、一个想法,只有很多人的意识中认同这样一个概念,并且对它的范围理解基本一致,这个国家才存在。很显然,爱一个概念是说不通的,所以爱国归根到底应该是爱认同属于一个国家范围的这群人,希望包括自己在内的这群人过得更好。一个人是否爱国,在于他的言行是否有利于他所属的这个国家人民的福祉,是超越任何政府或政党的。所以如果仅仅因为一个人批评政府而指责他不爱国是很荒谬的事。 政府和国家是两个完全不同的概念。政府是一个国家的人通过税收来维持的机构,它为这个国家提供立法、执法、行政等公共服务。政府本身是不产生收入的,上至主席总理下至窗口办事人员都要靠税收供养,政府的其它支出也来自于税收或者基于税收的收入(比如投资和借款)。一个国家在不同的历史阶段会因为内部或外部的各种原因建立不同的政府。很多人会有种错觉,似乎补贴之类的东西是政府给的恩惠,其实你从政府得到的所有东西本质上都来自于其他公民。 互联网上的争论都容易变成互相贴标签的辩论,导致观点越来越极端。有很多人盲目或者说本能地批评他认为不爱国的人,也有人认为所谓爱国主义都是骗人的宣传。客观地说,爱国主义是有必要的。上千万上亿人要能进行大规模的协作就必须有一种一致的集体认同感,这种认同感就逐渐形成了前面所说的国家概念。爱国指的是你的国家对你来说是独特的,你和这个国家之间有特别的关系和义务。同样地,你和工作的公司之间、和家庭之间、和朋友之间、和你自己都有特别的关系和义务。这些不同的义务之间有时会产生冲突,需要你去平衡和作出选择。人生本来就是复杂的,没有简单的总是正确的答案。如果有人告诉你「你的国家是至高无上的,国家利益高于一切,在任何冲突里都必须选择国家」,这不是爱国主义而是法西斯主义。法西斯主义把生命的意义简单化,把选择从个人手中拿走了。这也是它容易在经济发展不好的时候,容易在对现实失望和迷茫的群体中生根发芽的原因。 这篇文章说的都是再浅显不过的道理,没什么新意,不过因为过去一年里发生了一些影响很大的事,我还是认为值得说一说。如果本文的读者看后能留下一些印象,我觉得以下两点最重要: 第一,政府的权力是需要监督和制衡的。权力导致腐败,绝对的权力导致绝对的腐败,这个简单的道理是人性的一部分。监督和制衡来自于内部和外部的压力。对于一个健康的社会来说,内部的压力应该起主要作用。但是当一个国家缺乏有效的内部制衡机制来约束权力的时候,多一些外部压力往往对于普通人来说是好事。所以下次当你听到对政府的批评时,不管来自于哪里,在开始习惯性的辩护前应该先仔细想想这些批评造成的结果会是什么,对你我这样的普通人来说有利还是有弊。别忘了爱国归根到底是要维护和提高人的权利。 第二,当其他人在为一个群体争取更多权利时,即使你不属于那个群体,往往也会成为受益者。近处的例子没法说,我就举个远一点的例子。我们学历史都学过美国国会在 1882 年通过了排华法案(Chinese Exclusion Act),禁止中国人移民到美国,这也是美国第一个禁止特定族群任何成员移民的法案。这种基于种族的歧视性移民政策直到 1965 年因为民权运动才被基本完全废除(Immigration and Nationality Act)。虽然美国民权运动主要是由黑人发起的,但是惠及了所有当时在美国的华人,以及后来移民到美国的华人。 当时 Google 的 CEO,Eric Schmidt ↩︎
2020-01-02 08:00:00
2019 年已经过去了,我想分享几个我个人认为比较好的习惯。 远离微信朋友圈(和类似的产品) 其实这不算是今年开始的。我很早就把微信朋友圈功能关闭了,在更早的时候就已经不上微博了。在近几年我除了偶尔转发本公司的公众号文章外,几乎没有看过朋友圈。微信对我来说是个因为工作不得不用的 IM 工具,而朋友圈就和 /dev/null 一样是个 write-only 的地方。这样并没有使我错过任何有价值的信息。我订阅了 WSJ 和 Bloomberg 这样的『传统媒体』电子版,值得关注的事一般都能看得到比较深入和专业的报道。我的朋友圈里以投资人和创业者居多,所以被转来转去的内容最多的就是各种 PR 稿和软文。其实大部分人的朋友圈都是如此。除了公司以外,个人也是有做 PR 的需求的1,每个人发在社交媒体上的东西都是希望别人看到的自己,这一点机构和个体并没有太大区别,所以一个人最喜欢发到朋友圈的东西所反映的往往不是他拥有的,而是他缺乏的。虽然我本来就不是容易因为别人而产生焦虑感的人,不过自从关掉朋友圈之后仍然能感受到内心更加平静,少受他人影响。 在信息过剩的时代,过滤低价值信息和寻找想要的信息同样重要。很多人沉迷社交媒体,一有空就忍不住打开微信刷来刷去,因为人的天性是懒的,而被动地接受信息是件毫不费力的事。自动推荐的内容以及你的社交圈出现的内容让你的眼界局限于所处的圈子里,往往会加强既有的偏见。主动地思考自己不知道什么、需要知道什么、寻找高质量的内容是很重要的。 听有声书 这是今年开始的新习惯,我为此写了一篇单独的文章:怎样利用好路上的时间。我看书比较慢,所以对于传记、回忆录等不太需要停下来思考的书,用 Audible 的手机应用听比在 Kindle 上看要快一些。另外也可以把一些不能用眼睛看书的时间利用起来。 坚持培养与工作和 IT 技术无关的兴趣 我一直觉得培养和保持一些与日常工作差别很大的兴趣是很重要的,因为这会使身体和大脑的不同部分得到锻炼。 近年来新增的爱好里坚持时间最久花的时间最多的是小提琴,2019 年是第三年了。一开始从 YouTube 上的一个系列视频开始,后来订阅了 Red Desert Violin 和 the Violin Lab,再后来找了一位线下的老师。很多朋友听说我在 36 岁高龄开始学小提琴都比较惊讶,因为在大部分人眼中这些似乎是小孩子的事情。然而这可能是过去几年里带给我最多快乐的一件事。除了出差以外,我每天晚上都会花一些时间在上面。 我学小提琴有两个原因。第一,其实我刚上初中的时候就想过学小提琴。我父亲认为什么都是能自学的,所以听我说后就买了把琴(可能还是成人的)和一本书给我,结果可想而知。其实小提琴可以自学也不算错,我这一次开始也是根据视频教程自学,半年多后第一次和老师上课时他说我自学得还不错,没明显错误。只是小的时候没有互联网,没有自学的资源罢了。第二,音乐是个我本来所知很少的领域,所以一直有学一样乐器来补上这个缺口的想法。而既然要学就学一门比较难的,乐趣和成就感也会更多。 这一年也新学了一些东西,比如国际象棋,开始捡起了过去的一些爱好,比如绘画。不过这些都属于可以有空时做一下的事,不需要每天练习来保持,也就算不上习惯了。 比如这篇文章就是如此。我就只说了好习惯没有说坏习惯。 ↩︎
2019-10-30 08:00:00
前段时间的一个大新闻是估值最高的创业公司之一 WeWork 上市失败被投资人软银接盘控股,CEO Adam Neumann 离开。软银接盘 WeWork 并购买 Neumann 手中的股份时以 50 亿美元计算公司的估值1,而 1 月软银最近一轮投资时给出的估值是 470 亿美元,也就是说这家公司在几个月时间里估值降到了上一轮融资的 17%,也相当于四年前估值的一半。就在几个月前纽交所的主席和纳斯达克的 CEO 还上门拜访了 Neumann,他们都想争取让 WeWork 在自己的交易所上市。Neumann 向他们提出希望在交易所的餐厅禁用塑料杯和禁食肉类。纳斯达克甚至许诺为致力可持续发展的公司建立一个以 WeWork 命名的「We 50」指数。 这件事无论是看公司/创始人还是看投资人都有很多戏剧性的成分。 WeWork 的外部危机始于它提交的上市文件。这份文件公开的信息让很多投资人对 WeWork 的高额亏损开始担忧,并且很多关键信息没有清楚披露,使得媒体开始挖掘一些问题。首先是 WeWork 和创始人 Neumann 之间有大量的自我交易和利益冲突。比如 Neumann 先注册了 We 的商标,然后以 600 万美元卖给公司;他从公司直接借款或者用公司股份担保贷款数亿美元用于购买房产,再出租给 WeWork 作为办公场所;他提前行权用的 3 亿多美元也是从公司借的,也就是说用公司的钱给自己买了更多股份。Neumann 的很多亲戚都在公司担任高管,包括他妻子以及他们的表兄弟。WeWork 一向把自己的品牌和可持续发展、对环境友好联系在一起,所以她妻子作为首席品牌官坚持他们在上市过程中提交的文件都必须用再生纸打印,然而她对打印效果吹毛求疵,不断要求重新打印,浪费了大量纸张,以至于他们的打印服务商都拒绝合作,让他们另请高明。WeWork 在准备上市文件的时候,Neumann 在马尔代夫度假,因为不想中断度假,他让遇到问题的下属到马尔代夫见他。 New York 杂志的一篇长文里有一段对 Neumann 第一次见孙正义的描述。孙正义在 WeWork 总部见到 Neumann,说他只有 12 分钟参观公司。之后他邀请 Neumann 一起坐到他的车里,在 iPad 上给出了 44 亿美元的投资框架。孙正义让 Neumann 把 WeWork 做到他原计划的 10 倍大,并且告诉他要学习一点人生经验「疯狂比聪明更重要,WeWork 还不够疯狂」。他认为 WeWork 能值数千亿美元。Neumann 因为疯狂而得到了丰厚回报,后来确实越来越疯狂了,但很显然孙正义没有得到他想要的结果。
2019-09-10 08:00:00
这是为一个知乎问题的答案。 大学是系统性地学习基本原理的时候,没有必要追逐最新最流行的编程语言和开发框架,毕竟到了毕业工作的时候往往又有很多新的变化。把基本的知识体系掌握好会终身受用无穷。大学只是提供环境和条件,学习的方向和重点需要自己把握。下面这几方面对于本科生是尤其重要的。 计算机体系结构:这是理解计算机工作原理的基础,即使以后只做软件方面的工作,这方面的知识也是至关重要的。一方面软件运行在硬件上,理解计算机各部分的工作原理以及他们之间的通信机制对于代码优化和系统级的软件开发都是必须的;另一方面硬件只不过是石化的软件,软硬件不过是逻辑组合的不同实现方式而已。很多美国大学的这门课程都会让学生用代码把一台虚拟计算机实现出来,这确实是个好办法。 操作系统:所有做软件开发的人都需要对进程、线程、内存的管理有清楚的理解。操作系统为在计算机上运行多个应用程序提供基础,Docker 等这些现在流行的技术也无非是把操作系统提供的机制和工具进行了封装而已。 编译原理:编译原理让你理解程序在运行的时候具体在做什么。只有能把高级语言的每条语句在大脑中映射到 CPU、寄存器、内存里栈和堆的具体操作,才能写出高效、错误少的代码。每个计算机专业的学生都应该尝试自己实现一个语言。 一门系统编程语言(C/C++):C 语言仍然是最好的用来学习编程的语言。它在语言层面的概念比较少,容易比较快地把注意力从语法转到程序设计上。同时由于 C 在标准库里没有提供现成的容器,所以不可避免地需要学习如何实现基本的数据结构:不同类型的链表、队列、字典等,在实现这些结构的时候又不可避免地要熟悉指针操作和递归。虽然在日常软件开发中很少会需要自己实现这些容器,但是理解他们的实现和性能特点可以避免你用 Java 之类的语言时什么都用 Vector 来做。在熟悉 C 之后可以学一下 C++。C++ 之所以复杂,在于它将控制权交到了程序员手里。其他的主流面向对象语言里之所以没有 virtual function 等 C++ 特有的概念,是因为在语言层面已经帮程序员做了选择,虽然降低了语言复杂度,但是也导致不能总得到最好的性能。深入学习 C++ 可以让程序员了解面向对象特性的底层实现以及它们在编译时和运行时的开销,这对于使用其他语言也是很有帮助的。 算法、数据结构:如果你将来做系统软件开发,将会需要自己做一些算法的实现。即使是做应用软件开发,也需要在这方面有足够的知识来权衡不同的选择。虽然现代的高级语言大多提供了丰富的容器、算法函数、中间件等等,只有理解他们的性能特征和资源代价才能作出好的选择。 一门学科的知识体系就好像大脑中的一个架子,一开始搭建它的时候会感觉是个很慢的过程。但是如果你耐心地把它建立起来,再学习新的东西就会知道该把新吸收的知识放在什么位置,它和架子上现有的内容是如何联系的,在理解、记忆、应用上都会事半功倍。
2019-09-07 08:00:00
大部分人在上下班路上做得最多的事就是看手机。盯着手机屏幕的时间久了很影响视力,而且往往会养成走着路也在看手机的习惯,很危险。我最近几个月在上下班和出差的路上都在听 Audible 上的有声书,这是个能把路上的时间利用起来吸收有益的信息,又不用老看着屏幕的方式。 Audible 是 Amazon 旗下的公司,所以它的移动应用里可以听 Kindle 电子书的有声版,此外有一个专门为听者设计的 the Great Courses 系列是非常值得推荐的。这是请一些全球知名的学者录制的各个领域的系列讲座,每个讲座一般有几十集,大约半小时一集。以下是我过去这段时间听的几个: The Fall and Rise of China: 主讲人是 UCLA 的 Richard Baum 教授。他因为年轻时看了 Edgar Snow 写的 Red Star Over China 而对中国近现代史发生强烈的兴趣,此后他的博士论文和整个学术生涯都在研究中国。比较有意思的是他的博士论文及之后的很多学术成果都建立在他从台湾偷出去的国民党间谍从大陆获取的绝密档案上。除了开头简要介绍中国古代史外,主要内容覆盖了从鸦片战争前到 2009 年这两百年。他在文革结束后到了中国约五十次,待了相当长的时间,中文很好,和毛泽东之后的历任中国领导人都会见过,近距离见证了很多历史时刻。希拉里在竞选总统时请他做中国问题顾问,不过他因为不认同希拉里处理中国问题的方式很快辞职了。他作为一个有很高声誉的学者对历史的叙述可以说是很客观的,对于只学过中国教科书版本历史的人来说听一听他的讲座是很有价值的。 How to Listen to and Understand Great Music: 这个讲座介绍了从古希腊和罗马到现代的整个西方音乐史,包括每个时代一些有代表性的作曲家和作品,重点是巴洛克及之后我们现在所理解的西方器乐发展起来的这段时间。我听这个讲座主要和个人兴趣有关,所以不一定每个人都会喜欢。因为前一段时间正好看了讲绘画和建筑史的 The Story of Art,很容易和每个时代音乐上的变化对应上,对于欧洲社会的变迁会有更全面的了解。 Redefining Reality: The Intellectual Implications of Modern Science:这个讲座也可以看作是讲历史的,讲的是近现代的科学史,数学、相对论、量子力学、天文学、生物、医学、心理学、社会学、经济学等等各方面的重要成果都覆盖到了。是个全面了解近代科学各个领域发展的好方式。
2019-07-11 08:00:00
Educated 在去年出版后很快就出名了,Obama、Bill Gates 都推荐过,不过我最近才看完。这本书似乎还没有中文版,不过除了 Kindle 版外在国内也能买到纸质原版。 作者 Tara Westover 讲述了她从童年到博士毕业的故事,主题涵盖家庭、忠诚和教育。她出生在一个美国中部山区的摩门教家庭,父亲经营一个金属废品处理场,母亲给人接生和出售草药,有七个子女。他们相信世界末日即将降临,所以一直都在囤积各种东西以确保生活的自给自足。她父亲有精神分裂症,她从小也经常受一个哥哥欺凌虐待并且得不到父母的支持。由于父母相信阴谋论,不相信联邦政府,所以他们家人生病、受伤、生小孩从来不去医院,完全在家里靠草药解决问题。因为父亲认为学校教育是政府对人的洗脑,她在 17 岁前都没有接受过正式教育,一直在父亲的废品场做帮手。 因为过去经历的点点滴滴(比如小时候在一个后来也出去上学的哥哥的房间听他收集的唱片)使她对外面的世界产生了强烈的好奇和向往,在 16 岁时她决定靠自学尝试考大学。之后她被犹他州的 BYU(Brigham Young University)录取,并在期间得到了 Bill Gates 设立的奖学金而到剑桥学习。她最终在剑桥大学取得了历史学博士学位。由于观念与家庭格格不入,她在漫长的内心挣扎后与大部分家庭成员决裂不再往来。 这本书的震撼之处一方面来自于 Tara 的独特经历,另一方面来自于她写作的诚实。书中有大量她饱受兄长欺凌的描写,也讲述了很多尴尬的经历,比如她刚开始在 BYU 上课时由于说不知道大屠杀而被老师和同学误解为纳粹种族主义者。Tera 毫不介意向读者揭示她曾经有多幼稚和无知,这是大部分人难以做到的。 从作者的经历看,一方面可能学校教育不像很多人想的那么重要。毕竟一个在大学前都没有上过学的人也在剑桥得到了博士,并且他们家 7 个孩子里 3 个到外面求学的全都得到了博士学位,完全超出了「正常」家庭的教育水平。另一方面,学校教育又或许不像有的人想的那么没用,毕竟是大学给作者开启了全新的可能性,让她知道了原来除了从小她父亲作为事实教给她的东西外,原来世界上可以有那么多不同观点,可以通过研究和思考来形成自己独立的信念。Tara 曾在一个访谈中说,虽然她后来的价值观和父母越走越远,但是父亲从小教她的一个观念一直伴随着她:「你可以教会自己任何东西」。 教育包括「教」和「学」两面,前者只有通过后者才能起作用。一个对写作没有兴趣的人即使有一个得过诺贝尔文学奖的老师也成不了作家;对一个有强烈兴趣的人,给他一部优秀作品,他就能从中得到很大提高。很多家长对待子女教育时往往把注意力都放在「教」的因素上,孩子一定要上好的学校,要有好的老师。小孩从幼儿园开始就每个阶段都在为下一次考试和择校做准备。然而如果学习是受考试而不是兴趣和好奇心驱动,从小就在一种对「学」很焦虑的环境长大,在来自长辈和外部的压力失效之后是很难保持动力的。教育是自我发现的过程,我想无论是在考虑自己的持续教育还是考虑下一代的教育时都需要记住这个本质。 大部分人都不会有 Tara 那样的经历,但是每个人都有从小仰视父母到长大逐步形成自己独立观念的历程,Tara 的成长不过是这个过程的极端版本。相信每个人都能从这部回忆录得到启发。
2019-04-12 08:00:00
2019 年 2 月发布的 React 16.8 正式引入了 hook 的功能。它使得 function 组件也像 class 组件一样能维护状态,所有的组件都可以写成函数的形式,比起原有的以 class 的多个方法来维护组件生命周期的方式,简化了代码,也基本消除了因为 this 绑定的问题造成的难以发现的 bug。这篇文章就介绍一下最常用的 state hook,以及在这种新的方式下怎么与后端 API 通讯。 本文以一个管理任务的 Todo list 应用为例,可以增加新的任务,点击可以把任务标记为完成。部署好的效果可以在这里看到,代码在这个 GitHub repo。这个 demo 使用 LeanCloud 作为存储数据的后端,用的是一个 LeanCloud 开发版应用,所以可能遇到请求数超限的情况,建议在本地运行并替换进自己的 AppId 和 AppKey。 这个应用只有一个叫 App 的组件: function App() { const [inputValue, setInputValue] = useState(''); const [todos, setTodos] = useState(undefined); const [error, setError] = useState(''); 开头先定义了它使用的状态。useState 的参数是状态的初始值,它会返回一对结果:用来读取这个状态的一个只读引用,以及一个设置状态新值的函数。这里创建了三个状态: inputValue: 输入新任务的 <input> 元素的当前值 todos: 当前显示的任务。这里初始值设为 undefined 表示尚未加载,而 [] 则意味着已经加载过,但是为空。 error: 当前显示的状态信息 每次这个组件被重新渲染时,App() 这个函数都会被调用。每个 useState 只有第一次被调用时返回的状态是初始值,之后每次都会返回已经记住的当前值。这里有三个状态,React 是用调用 useState 的顺序来区分他们。可以理解为 App() 的所有状态存储在一个数组里,第一个 useState() 返回的是第一个状态,第二个 useState() 返回的是第二个状态,以此类推。所以使用 hook 必须保证这个组件函数每次运行中:
2019-01-15 08:00:00
去年 12 月看完了 Bad Blood,本来想写一篇推荐作为 2018 的最后一篇博客的。因为拖延症变成了 2019 的第一篇。 这本书的作者是两次获得普利策奖的华尔街日报记者 John Carreyrou,讲的是曾经红极一时硅谷创业公司 Theranos 和它的创始人 Elizabeth Holmes 的故事。 Elizabeth Holmes 创建 Theranos 的时候只有 19 岁,她号称发明了突破性的验血技术,只要在指尖取一滴血就能做上百种测试,给病人提供详尽的健康数据,并且宣称 Theranos 像苹果的产品一样精致小巧,可以放在病人家里随时使用,完全淘汰市面上那些庞然大物。在细心策划下,她得到了各大媒体的竞相报道和各种活动、展会的邀请。有些讽刺意味的是最早把聚光灯照到 Holmes 身上的主流媒体也是后来让她身败名裂的华尔街日报。和很多名人一样,她也在 TED 做了打动人心的演讲,并且受总统 Obama 邀请参加过白宫的晚宴。媒体太需要这样一个充满标签的故事了:斯坦福辍学生、硅谷首位成功的女创始人、女乔布斯,并且有个人故事 - 她从小特别怕抽血,所以要做这样一个产品,所以他们不会思考一个辍学本科生是不是真的能做整个医疗行业一直做不到的事。就好像前几年中国的媒体特别需要 90 后创业者的故事,福布斯们每年都热衷于 20 under 20,30 under 30,他们也不在乎一个本科学生是不是真能造火箭或者颠覆人工智能技术。 Elizabeth Holmes 这家公司顶峰时估值接近百亿美元,投资人里包括各大顶级 VC 和 Oracle 的 CEO Larry Ellison 等知名企业家,董事会包含了两位美国前国务卿(包括中国人民的老朋友基辛格)、两位前四星将军(包括美国前国防部长 Perry 和现在的国防部长 Mattis)、一位前参议员、一位前海军上将。代表 Holmes 和 Theranos 的律师 David Boies 是美国最知名的律师之一,曾在微软反垄断案中代表美国司法部,在 2000 年总统选举诉讼中代表戈尔,在去年好莱坞最大性侵案中为 Harvey Weinstein 辩护。她请的广告公司是创作了苹果 1984 和 Think Different 广告的 TBWA\Chiat\Day。可以说在各方面都占尽了最好的资源。
2018-10-23 08:00:00
LeanCloud 的团队起源于 LeanCloud 这个产品诞生前两三年,当时我刚离开 Google 回国不久。在 Google 内部用来做缺陷和任务管理的工具叫 Buganizer,有一些独特的功能,当时我觉得 Buganizer 比外界的 Jira 等同类工具好用很多,于是组建了一个四个人的小团队,准备做一个可以和 Jira 竞争的产品。 因为我很喜欢 Clojure 语言,所以团队的早期成员都是从当时刚出现的 Clojure 中国社区招募的。这个社区最初几年的聚会也大多是我们主办的。它是个很小众的语言,所以社区里比较容易找到技术不错又喜欢学习新东西的人,这正是一个小型技术团队所需要的。我们用大约三个月时间开发并发布了第一版,因为还没有收入,资金很有限,所以我开始寻找天使投资。在这个过程中我通过创新工场认识了 YouTube 的两位创始人 Chad Hurley 和 Steve Chen(陈士骏),他们当时离开 Google 创立了 AVOS Systems。Steve 很希望在中国成立一个子公司,他很快到了北京一趟,因为都是工程师出身,又都在 Google 好几年,我们有共同语言、聊得很投机。一方面由于受到名人光环的吸引,另一方面也希望向他们学习成功经验,我决定带着当时的团队加入 AVOS,后来我们就成了 AVOS 中国子公司。 AVOS 的 A 和 V 来自于 HTML tag 的两个尖括号,把 < 和 > 各旋转 90 度就成了 A 和 V 的形状。而 OS 指 operating system。 当时 Yahoo! 正计划关闭他们几年前收购的知名社交书签网站 Delicious, Chad 和 Steve 知道后让 AVOS 以很低的价格收购了 Delicious1,暂时挽救了这个在 Web 2.
2018-08-25 08:00:00
最近写了中国人学好英语的重要性。我想续一篇说说如何学好英语。写上一篇的起因是我想找几本工作相关的书送给一些同事的时候,发现国内出版的目标领域的中文书里实在挑不出值得推荐的,最近看过觉得好的英文书在国内也没有翻译出版。所以这一篇也算是写给各位同事看的。 本文说的方法比较适合于成年人,也就是没有英语考试的压力,只是为了自己的提高而学的人。另外这里主要说的是英语阅读,因为这是我认为最有价值的技能,而且因为可以日常持续使用,达到比较好的水平后容易保持。口语对于一般人来说在日常生活中没有经常使用的环境,难以达到并保持在高水平。 首先最重要的一点是尽可能学以致用,不要为学英语而学英语。你的目的是获取内容和信息,英语能力的提高是服务于这个目的的。学语言最难的是长期坚持,对成人尤其如此,因为没有学生时代的考试压力,如果是在一段时间内感受不到价值、没有成就感,许多人就容易放弃。所以我建议把你本来就有的阅读时间分配给英文的素材。当你工作上需要看某方面的资料的时候,就尝试找英文的来看;如果你喜欢看小说,那就从短篇的英文原版小说看起;如果你生活中有看新闻的习惯,那么就转向看英语新闻。这个方式对于在大学考过四六级的人应该是可以马上开始的,无非就是比正常的阅读慢一些,但只要能坚持下去,速度是会提升很快的,重要的是你在相对短的时间内就能感受到回报。如果你很长时间没有接触英语,过于生疏,那么先花两周到一个月的时间专门看看英语学习的书,重新熟悉语法和恢复基本词汇量也是可以的。如果原本基础比较弱,那么就得靠坚持和自律先纯粹地学习语言一段时间了,这是绕不过去的。 到哪里找看的东西呢?很多人都不知道,但这是最容易解决的问题。去美国亚马逊网站注册一个帐号。国内银行发行的支持 VISA/MasterCard/AMEX 的双币或外币信用卡应该都可以在 amazon.com 支付。因为你不会购买需要实际邮寄的货物,所以随便填一个搜到的美国地址就可以。然后按照喜好下载 Kindle 的移动/桌面应用,或者在中国亚马逊购买一个 Kindle 阅读器(注意不要买和国内一些电子书网站合作出的订制版,否则可能无法用美国亚马逊帐号登录),就可以在美国亚马逊买电子书看了。大部分的书都会有 Kindle 版,价格大多是 10 美元至小几十美元之间,比国内的纸质书贵不了多少,应该是大部分人可以承受的。如果你有看新闻的习惯的话,New York Times, Wall Street Journal, The Economist 都是质量很高,并且可以以不高的价格在线订阅电子版的刊物。我正在整理看过的 Kindle 电子书,会逐步把值得推荐的放到 blog 的荐书页面,如果你有兴趣可以关注那个页面的更新。 在内容选择上按照每个人的需求和兴趣选择最重要,因为这样最容易坚持下去。但普遍来说我觉得工作或兴趣相关领域的专业图书要优于小说和文学作品,小说和文学作品优于时事新闻。因为领域性的图书往往会更加注重使用逻辑性强、易懂、直白的语言来表达,阅读难度最低,并且学习到的东西也容易在短期得到应用、体现出价值。文学作品中抒情、修辞的成分比较多,不同作者的风格也千差万别,易懂通常不是高优先级的属性。时事新闻类的素材往往依赖的背景知识比较多,内容相对小说而言更枯燥,也会使用英语里的很多习惯用法,如果没有在美国生活过可能会没见过,所以阅读难度不低。 最后说一下阅读时的要点 - 不要以学生时代那种遇到生词就去查字典的方式阅读,因为目的不一样了。高频率的中断会让你的效率变得很低,影响对文章的理解,也容易产生沮丧的情绪。遇到生词的时候只要根据上下文能猜出大概意思,不影响对段落的理解,就应该继续往下看。当一个词在不同的上下文里遇到了多次后,你多半就已经猜出它的准确含义了。如果晚一点你发现它是个常用词,想弄清楚它的详细意义和发音,那到时再查字典也不迟。Kindle 支持长按一个单词查字典,还能把词自动记到生词本里,是很好的提高效率的工具。在阅读中自然地提高词汇量比专门学习大量单词是更容易长期坚持的。 我相信如果你能坚持这里所说的方法半年至一年,一定会觉得这是你做过的事里回报率最高的之一。
2018-08-23 08:00:00
如果现在我必须把过去学过的所有知识都忘记,只能保留一样技能,我会毫不犹豫地选择英语。因为我在初中以后的学习过程非常依赖英语,特别是英语阅读。 我上大学的时候,专业课老师选择教材时大多不是从质量出发,通常要么是自己写的教材,要么是本校出版的教材。在大一之后我基本就不再去上专业课,而是大部分时间在图书馆看影印版的英文教材自学1,每个学期结束前两周再去课堂对照一下老师勾的复习重点和自己学的内容,一方面防止自学的范围有缺漏,另一方面防止考试时中英文的说法对不上。这种学习方法的一个副作用是后来考 GRE 和 CS 专业 GRE 的时候相对比较容易。 对中国人来说,学好英语对生活不是必须,但是会让你在学任何其它东西的时候选择多很多,让你的知识体系更加完整,为你打开新的窗户。这有几点原因。 第一是中国的出版和媒体处于一个非常不自由和畸形的环境。好的英语阅读能力可以让你全面地了解历史和时事,避免因为信息的残缺而被蒙蔽。 第二是在很长的时间内,对大部分学科而言,一流的文献和出版物都是英文的。优秀的出版物很多不会被翻译成中文,或者是翻译的质量很差。这一点在信息技术这样高速发展的领域尤其明显。由于翻译是一件回报率很低的工作,很少有真正的行业专家愿意把时间花在翻译上2,这样就导致了做翻译的人往往对专业知识没有足够的理解而输出低质量的结果。比如最近我想买两本关于市场计划的书送给公司负责市场的同事,可是发现这方面的中文书实在没什么可买的。 第三是目前中国互联网和欧美互联网的文化差异很大。大天朝的局域网对于求知的人来说是很贫瘠的。无论你想了解什么领域或者学习什么技能,在 Google 上一搜都能找到很多高质量的、不同层面和类型的内容,并且大部分是开放和免费的;而在百度上用中文搜一搜,可以保证结果差得很远。如果你获取信息的范围是整个互联网的话,你会发现国内这两年火热的这些所谓知识付费产品绝大部分都是浪费钱和时间。所以如果你愿意为了知识付出时间、精力和钱的话,最高效的办法是尽量在学好英语上多投入一些。 续篇:如何学英语 清华大学出版社当时出了一套完整的国外知名计算机科学教科书影印版。 ↩︎ 如果你看到了这里,而且正好翻译过一本书,那你一定是少数专业知识丰富又愿意奉献时间在翻译上的专家之一。 ↩︎
2018-07-16 08:00:00
早在 Docker 正式发布几个月的时候,LeanCloud 就开始在生产环境大规模使用 Docker,在过去几年里 Docker 的技术栈支撑了我们主要的后端架构。这是一篇写给程序员的 Docker 和 Kubernetes 教程,目的是让熟悉技术的读者在尽可能短的时间内对 Docker 和 Kubernetes 有基本的了解,并通过实际部署、升级、回滚一个服务体验容器化生产环境的原理和好处。本文假设读者都是开发者,并熟悉 Mac/Linux 环境,所以就不介绍基础的技术概念了。命令行环境以 Mac 示例,在 Linux 下只要根据自己使用的发行版和包管理工具做调整即可。 Docker 速成 首先快速地介绍一下 Docker:作为示例,我们在本地启动 Docker 的守护进程,并在一个容器里运行简单的 HTTP 服务。先完成安装: $ brew cask install docker 上面的命令会从 Homebrew 安装 Docker for Mac,它包含 Docker 的后台进程和命令行工具。Docker 的后台进程以一个 Mac App 的形式安装在 /Applications 里,需要手动启动。启动 Docker 应用后,可以在 Terminal 里确认一下命令行工具的版本: $ docker --version Docker version 18.03.1-ce, build 9ee9f40 上面显示的 Docker 版本可能和我的不一样,但只要不是太老就好。我们建一个单独的目录来存放示例所需的文件。为了尽量简化例子,我们要部署的服务是用 Nginx 来 serve 一个简单的 HTML 文件 html/index.html。
2018-05-13 08:00:00
Bruce Schneier 的《应用密码学》(Applied Cryptography)是我的密码学启蒙书。我上本科的时候读过一遍影印版。读博士的时候导师说他有本出版社请他写书评时送的,听说我喜欢就送我了,所以又读了一遍。过了几年 Bruce Schneier 又写了一本书叫 Secrets & Lies。即使你没有兴趣看这本书,它的前言也值得一读。这里我只翻译一部分: 七年前我写了另一本书:《应用密码学》。我在其中描绘了一个数学的乌托邦:可以永远保守秘密的算法,以及能安全可靠地执行无监管的赌博、抗检测的认证、匿名货币等美妙的电子化交互的协议。在我眼中,密码学是带来平等的伟大技术;任何有廉价计算机的人都能拥有与最强大的政府同样的安全。在两年后写此书第二版时,我甚至说「仅靠法律保护自己是不够的,我们还需要靠数学保护自己。」 然而我错了。密码学做不到以上的任何一点。 这并不是因为 1994 年以后密码学变弱了;也不是因为书中的技术内容不再正确。而是因为密码学不存在于真空中。 密码学是数学的一个分支。和数学的其它部分一样,它是关于数字、等式、逻辑的。而对于你我来说在生活中能感受到的安全是关于人的:人知道的事、人之间的关系、人和机器的关系。信息安全是关于计算机的:复杂、不稳定、有缺陷的计算机。 数学是完美的;现实是主观的。数学是确定的;计算机是易怒的。数学是有逻辑的;人是不确定、易变和难以理解的。 《应用密码学》的错误在于我没有对上下文做任何讨论。我把密码学当作答案 ™ 来讲述。这是很幼稚的。 […] 一个同事曾和我说,世界上充满了《应用密码学》的读者设计的糟糕的安全系统。[…] 几年前我听过一句话,在这里稍微改动一下:如果你认为技术能解决安全问题,那么你既不懂安全也不懂技术。 有很多关于区块链的文章都说「区块链解决的核心问题是信任问题」,但是我没有看到有人回答了关键的问题:到底什么是信任?什么是所谓「信任问题」,它存不存在?什么算是「解决了信任问题」?事实上如果在 Google 上搜一下这句话,会找到大量的复制粘贴和人云亦云。Brice Schneier 书里那句话改一改也是适用的,如果有人认为技术能解决信任问题,那么他恐怕既不懂信任也不懂技术。 Ken Thompson 1984 年的图灵奖演讲 Reflections on Trusting Trust 很好地从技术的角度解释了信任的本质。读者不妨去看看原文,或者也可以参考我在 XcodeGhost 出现时写的一篇简介。细节在本文就不再复述了,简单地说,他演示了一个不仅通过源码分析无法发现,通过反编译二进制码分析也无法发现的攻击。他在演讲中说「关于一个程序里没有木马的保证到底有多可信呢?或许更重要的是信任开发软件的人。」他展示了除非你使用的整个软硬件栈都是自己制造和开发的,就得信任其他人。 信任是社会存在和运转的基础。我们把钱存在银行,相信需要的时候一定能从取款机取出来;我们每天上班,信任路上的司机不会开车撞我们;乘飞机旅行,信任飞行员技术够好不会坠机,信任其他旅客不是恐怖分子,也信任飞机制造商没有埋下安全隐患。我们经常会在美国电影上看到一个人对最亲密的人说「I trust you with my life.」,然而看起来我们其实每天都在以生命来信任陌生人。事实上我们信任的不是某个个体,而是整个社会系统。这个系统通过道德、价值观、经济体系、法律定义了规则,并让违反规则的人受到惩罚。这个系统保证了大部分司机会尽可能安全驾驶,机场会检查登机旅客,航空公司会严格地审查和培训飞行员。 技术在信任和安全方面扮演的角色就好像门锁。大部分人不偷不抢是因为他们想做被他人接受的社会成员,尽量不做不道德的事;剩下的人中 99% 以上的人是因为担心受到法律的制裁;只有极少数的人是因为打不开锁。所以你从不会听说一个城市通过投资制造更好的锁来降低犯罪率。假设给我两个选择,要么是生活在北京,但是没有门锁,要么生活在一个没有法律、道德约束的地方,但是可以装最好的锁。我一定会选择前者,我多半会丢失一些东西(取决于住什么小区),但如果选择后者肯定会没命。 好的技术是对社会的安全、信任机制的补充,它无法替代这些机制,更不能破坏这些机制。到目前为止,区块链已经实现的可以放在阳光下说的实际应用价值约等于零。当很多区块链公司在苦苦寻找应用场景来讲故事的时候,加密货币倒是成了 Silk Road、Dream Market 等黑产市场的主要交易媒介,最近几年知名的多次 ransomware 攻击也都是让受害者以比特币支付赎金。对于需要逃脱现有社会机制可能带来的惩罚和后果的人来说,加密货币发挥着很大作用,或者说是它真正完成货币功能的最主要场景,所以有很多人直接用黑产交易量来估算加密货币的合理市值。加密货币对现有社会机制的影响,以及它为什么群体带来最多的便利和价值,是值得更多思考的问题。 安全和信任是一个链条,它的强度是由其中最弱的一环决定的。历史上的安全事件几乎没有任何针对密码学算法和协议的攻击,即使是技术上的攻击也大多是针对具体软件实现,更多的是通过欺骗、引诱、胁迫等手段针对人的攻击。当密码被主动交给攻击者的时候,加密算法是用 128 位秘钥还是 2048 位密钥并没有什么差别。2007 年在比利时,有一个人靠个人魅力敲开了银行保险库偷走了接近三千万美元的钻石:他靠经常请大家吃巧克力得到了银行职员的好感和信任。要知道比利时人可不缺巧克力。 电影「猫鼠游戏」(Catch Me If You Can)的真实原型 Frank Abagnale 在 16 岁离家出走后使用过 8 个身份,在很长时间里成功地伪装成各种不同职业人士,包括民航飞行员、医生、政府官员、律师。在最终被抓住后他加入了 FBI 成为反欺诈专家。有一次他在 Google 做讲座,台下有人问他现在警察和 FBI 有很先进的监控和侦破技术,罪犯还有没有可能像他当年那样成功。他的回答是现在唾手可得的信息只会让那些事情简单百倍。有无数的案例说明在安全和信任的链条中,人的因素是最薄弱的一环,而人的问题往往不是靠技术能解决的。
2018-04-26 08:00:00
以下是我在自己的微信公众号 StartupJourney 发的最后一篇文章。 这个公众号从 2016 年 9 月后就没有更新过,其实这期间我有写文章,但是都只发在了知乎专栏和 blog 上。首先是因为微信后台的编辑器很难用,从 blog 把 Markdown 文本同步过来很麻烦。我一不是网红,二不开微店,也就不在乎微信的流量,没有动力来和这个编辑器做斗争。其次我一直挺讨厌微信这样一个从产品理念到运营方式都很封闭的系统,也就没有动力为这个 walled garden 添砖加瓦,在一个连外部链接都不允许的地方写东西。 微信对我是个因为工作原因不得不用的 IM 工具,我很少打开朋友圈(发工作广告时除外,惭愧)。最近收到邮件通知说长期不登录的公众号会被删除,所以就登录进来写最后一篇文章让这个公众号和各位订阅者告个别。 如果你有兴趣继续关注,欢迎关注我的知乎专栏,以及 LeanCloud 的技术专栏。所有我自己写的东西都会先发在我的 blog,上面有我维护的邮件列表,在每一篇文章的末尾,欢迎订阅。有一些之前散落各处的文章后续我也会找时间汇总到 blog。
2018-02-08 08:00:00
我先回答一些上一篇文章发布后看到的一些问题。我在第一篇文章里避免了对具体技术的讨论,因为加密货币和区块链是复杂和多面的问题,各种媒体经常把概念混淆,要解释清楚不容易,所以就先写一写对普通投资者有用的一些事实。 我收到的很多反馈其实也证明了这种混淆。有的人告诉我相信比特币的长期价格会越来越高,有的人告诉我区块链就像互联网早期、有很高的应用价值,等等。我上一篇文章里其实并没有涉及这些话题。反对意见中有一点和我的原文略有关系,就是不管泡沫如何,股票最终没有被放弃,电子技术没有被放弃,互联网也没有被放弃。不错,南海泡沫危机后一百多年其他公司又可以重新发新股了,但是危机发生时的那些公司大都消失了,那些投资它们的人也没有翻盘的机会。互联网是发展起来了,但是和 2000 年时那些倾家荡产的人没什么关系,对大部分人来说失去了的东西没有回来。相反很多在 .com bubble 里受损失的投资者后来很长时间都不敢再碰互联网公司股票,错过了这个行业高速发展的阶段。每一次这样的事件都会摧垮很多公司(还记得朗讯和北电吗),毁灭很多财富和投资者。活下来的公司在之后的很长时间里也很艰难,有很多走向衰败。 上一篇文章要警告的是抱着快速致富或者所谓跨越阶层的心态把自己输不起的财产投入进去的人。说到底各种加密币和 token 只不过是有着特定预期回报率和风险的 asset class。如果你做了充分的了解后认为它们应该是你投资组合的一部分,当然没问题。毕竟每个人对同样资产的回报率和风险评估不一样,偏好也不一样,否则金融市场就活跃不起来了。但是从我看到的反馈看,大部分人的了解很有限,并不属于这种情况。 我本想在这篇文章里把技术和应用方面都写完,结果写着写着发现内容太多,只能先说一部分技术话题了。加密货币和区块链是不同概念,我尽可能把两者分开讨论,但因为是加密货币让区块链概念产生和得到关注,目前也是区块链上最主要的应用。所以举例难免还是以主流加密货币所使用的区块链为主。 三分钟理解区块链 我用一点篇幅介绍一下基本概念。区块链英文是 blockchain,顾名思义就是由 block 组成的 chain。我不知道区块链的「区」是怎么来的,直译的话应该叫「块链」才对。每个 block 就是一些数据,对于比特币来说就是一些交易记录,然后有一个机制把这些 block 连成一个列表。普遍采用的办法是用一个哈希函数 H,把每个 block Bi的哈希值 H(Bi) 包含在下一个 block Bi+1 里。H 具有单向性,也就是知道 B 就很容易算出 H(B),但是反过来如果只知道 H(B) 的值很难构造出一个满足条件的 B。下面这个图表示了一个基本的区块链结构。 最简单的区块链 学过程序设计的人很容易看出它其实就是一个链表,只不过程序中用内存地址来标识一个节点,而区块链里用哈希值来标识一个块。这么做的结果是如果其中任何一块被修改了,很容易被检测出来,因为原来的哈希值在下一个块里。比如在上图中如果 B0 变了,H(B0) 就会变。而因为 H(B0) 是 B1 的一部分,所以导致 H(B1) 也要跟着变。如果有人要修改记录在这个链上的数据,就需要修改后面所有的块。 这个结构和它的原理对很多人来说并不陌生,它早在 1980 年就被发表了,以发明人的名字命名为 Merkle List。如果你是一位软件工程师,你多半用过 Git,它存储数据的方式就是基于 Merkle List(其实是更为通用的 DAG,不过原理一样). 现在说区块链大多是指在互联网上可以由很多人读取和写入的分布式的区块链,链上新的数据块会被广播到全网让所有人能看到。这就需要解决两个问题,第一是一致性,因为会有很多人同时往这个链上增加新的块,这样就会产生很多不同的分支,为了让所有的节点能看到一致的历史(达成共识),大部分区块链系统采用一个简单的策略,就是每个节点看到两个不同的分支时,就认为比较长的那一个是正确的分支,另一个分支上的数据需要重新打包成正确分支上的块。这样就带来了第二个问题,就是恶意的节点可以通过生成新块来在整个系统中保持多个长时间存活的分支。如果这是一个货币系统的话,恶意节点就可以把自己的钱多次消费(double spending)或者在很长时间后再把交易取消把自己的钱拿回来。解决的办法是给增加新块设定一个门槛。比特币(以及大部分区块链系统)的方案是在每个块里增加一个叫 nonce 的部分: 增加了 nonce 的区块链 当一个节点想把一个新块 B2 加到链上的时候,它需要为这个块的 nonce2 找到一个值使得这个块的哈希值 H(B2) 满足一定的条件(比如以特定数量的 0 开头)。前面说过 H 有单向性,所以找到一个满足条件的 nonce 值需要进行很多计算。这样一来假设整个区块链系统里的计算能力分布比较均匀,恶意的节点就不能随心所欲地增加新的块了。这个方式被叫做 Proof of Work(PoW)。按照区块链的设计,链上的数据不能被修改,新的数据只能增加到后面,所以也叫分布式账本。
2018-02-04 08:00:00
过去这几个月已经有很多朋友和我说,你们怎么不在区块链方面做点事呢,这很适合你们啊,然后把我批判一番。虽然我一直置身局外,但是后来觉得自己的博士论文主要就是关于分布式共识的,而现在很多人喜欢把这个词挂在嘴边,好像成了大家都懂的东西,要是我不花些时间研究一下加密货币和区块链也说不过去,有成为井底之蛙的风险。 几个月过去了,这个领域的热度在不断上升。就在我喝着咖啡写下这段话的时候,旁边一桌就是几个从大公司出来创业的人在谈论着区块链。我一直想找时间写篇文章把过去这段时间的所得总结一下,但是积累下来的内容越来越多,却找不到时间写一篇很长的文章。加上水平有限,也不能很好地把许多关系复杂的内容组织到一起,所以就分为几篇吧。第一篇是比较通俗,对普通人也比较重要的话题。技术层面的问题等下一篇再讨论吧。 对冲基金 Bridgewater 的创始人 Ray Dalio 在反思他早年犯过的错误时曾经说「我再次认识到了学习历史的价值。这次发生的事无非是历史的又一次重复而已。」那么我们就先看看历史吧。 很多批评者把比特币/加密货币的热潮和十七世纪荷兰的郁金香狂热相比,其实离我们更近的一些事更有可比性。 十八世纪的时候一家叫 South Sea Company 的公司在英国成立了。这家公司成立的原本目的是为了帮助政府重组国债,作为交换,政府赋予了它在南美洲进行海上贸易的独家权益(因此名称就叫南海公司)。而当时南美洲的航路都被正在与英国交战的西班牙控制着,这个公司的策划者们都明白,除非西班牙人脑子进水,否则根本没有与南美进行贸易的可能。然而在这家公司成立的对外 PR 里充满了对未来南美海上贸易带来的巨大财富的宣传,他们的总部在伦敦一个奢华的大 house 里以便对外塑造高大上的形象。因为国债可以直接置换这家公司的股票,有内部消息的人都提前购买大量国债,在南海公司成立的时候置换为价格翻倍的股票。 差不多在同时,在海峡对岸的法国,有个因杀人而流亡的英国人 John Law(他的姓似乎有点讽刺意味)成立了一家密西西比公司。他的目的是发行一种新的纸币来替代当时的传统货币(看来这个传统一直延续到了比特币推崇者那里)。虽然没有任何逻辑上的原因,密西西比的股价在市场宣传和投机者的推动下两年增长了 20 倍,在市值最高时超过了法国全国的金银总值的 80 倍。 密西西比公司股票不断突破新高的消息传回英国,英国人觉得怎么能让钱都被法国人赚了呢,于是股价也正在攀升的南海公司成了应对的答案。大股东们决定充分利用他们的名声和资源,南海公司宣布购买英国的所有国债。为了让相关的法案能够通过,他们给议员、贵族、皇亲送了很多新股的期权,把他们的利益和股价绑定。在此之前南海公司股价是 130 英镑,法案通过后增发新股时价格变成了 300 英镑。由于股票供不应求,很多投资者甚至发生了冲突。公司很快又以 400 和 550 英镑的价格发行了新股,为了降低投资门槛,还允许分期付款。股价最终超过了 1000 英镑。后来的作家描写南海公司的一个董事时说「他左手拿着圣经,右手拿着账本,尽量不让左手知道右手在做的事。」 由于大众对于股票的狂热,仅靠南海公司已经满足不了需求,于是投资者开始寻找其他自己能参与的新项目,而各种迎合这些投资需求的新股也应运而生。这些招股书描述的项目要么没有实际需求,要么根本无法实现。比如从西班牙进口英国本来就有的骡子、海水淡化、为私生子建医院、从铅里提取银、从黄瓜提取阳光、发射方形炮弹的武器、制造永动机等。共同的特点是他们都对投资人许诺了高额的回报。有一些比较「清醒」的项目推广者在圈到钱后就很快离开英国去了欧洲大陆,投资者再也没见过他们。 最终南海公司的董事和大股东们开始大量出售股票,消息传出后价格开始断崖式地大跌。政府官员用尽各种方法也没有能阻止市场信心的崩溃。同样密西西比公司的股价也开始暴跌,人们终于认识到发行新的货币并没有创造价值。英国政府为了保护民众通过了「泡沫法案」,之后的一百多年里英国的公司都被禁止发行股票。 南海公司的股价 类似的事情在现代还出现过很多次,比如上世纪 60 年代美国股市的「电子泡沫」(Tronics Boom)中,任何与「电子」或者「硅」概念沾边的股票马上就能身价倍增。世纪之交的 .com 泡沫导致的股灾大部分人都熟悉,就不再赘述了。从郁金香狂热开始,每一次都对所在国的经济造成很大冲击,需要很长时间恢复。 对于过去一段时间加密货币圈子里的事件比较熟悉的人恐怕看上面这些文字的时候都会有一种熟悉感。加密货币热和上面的事件有一些显著的共同点。 这些事件中都有一些民众并不了解的新事物来刺激他们对于新财富的向往,比如新大陆,比如电子技术和硅,比如互联网,又比如加密货币和区块链。在电子泡沫发生时,有一家卖鞋带(shoelace)卖了 40 年的公司,叫做 Shoelace, Inc.(好直接的名字)。它把自己的名字改为 Electronics and Silicon Furth-Burners 之后,股价马上翻了将近三倍。这个名字的精华还不在于同时包含了 Electronics 和 Silicon,而是有 furth-burners。因为没人知道这个词是什么意思,更增添了它的神秘感。所以长岛冰茶公司改名为「长区块链公司」,或者柯达宣布发行柯达币以后马上能股价翻倍也就毫不奇怪了。 另外在这些事件中,普通投资者都因为害怕错过发财的机会而对投资对象产生了盲目的信任,能忽略几乎所有警示风险的信号。电子泡沫发生时已经有 SEC 这样的监管机构,所以企业不能像南海公司那样完全把投资者蒙在鼓里了,很多招股书里都用大写字母印着类似这样的一段风险提示: WARNING: THIS COMPANY HAS NO ASSETS OR EARNINGS AND WILL BE UNABLE TO PAY DIVIDENDS IN THE FORESEEABLE FUTURE.
2017-11-23 08:00:00
在 IT 行业,性别的不均衡是个经常出现的话题。因为在这个领域从业的女性比例很低,所以有很多公益组织致力于提高女性在 IT 业的参与度。也有不少人认为整个行业对女性存在着一定程度的偏见和歧视,因为一些人认为女性从事技术工作的能力要弱于男性。 事实上,计算机这个行业的发展从一开始就是和女性密不可分的。Computer 这个词是在计算机出现之前很久就有的,指的是以计算为职业的人。因为女性通常比较细心,进行这样的工作时出错比较少,所以当时的 computer 大部分是女性。这些女性为很多科学上的关键发明发现和二战的胜利做出了重要贡献。二战期间科学家衡量所需计算能力的单位不是 megahertz,不是 teraflops, 而是 kilo-girls — 也就是相当于一千个女孩的算力。 现代程序员这个职业的鼻祖也是一位女性,并且她的时代比我们更熟悉的图灵、冯·诺伊曼等其他计算机领域的先驱早了一个世纪。她就是 Ada Lovelace. Ada Lovelace Ada 的父亲是英国著名诗人拜伦,其实她的原名是 Augusta Ada Byron,后来因为她丈夫继承了 Earl of Lovelace 的爵位,所以她以 Ada Lovelace 这个名字为人所知。拜伦在 Ada 几周大的时候就离开了英国,并且后来再也没有和她相见(虽然拜伦一直在桌上放着 Ada 的照片,并且在诗里写到她)。她的母亲为了不让她走上他父亲那样「疯狂」的文艺道路,让她从小就学习逻辑和数学,希望她能成为一个理性的人。她从小和外婆一起生活,虽然母亲照顾她不多,但是坚持要让她得到好的教育。那个时候英国的学校不对女性开放,不过富人家的女孩往往可以从私人教师那里得到好的教育。在 12 岁时她就很痴迷于研究怎么样让蒸汽驱动的机器像鸟一样飞行。 作为少有的出身上流社会、痴迷于科学、并受过很好教育的女孩,Ada 在当时英国科学界的社交圈是个活跃和受到欢迎的人,身边可谓群星闪耀。她和法拉第、狄更斯等知名人物都是朋友,她也以此为便来寻找各种学习机会。1833 年,她认识了剑桥大学的数学教授查尔斯·巴贝奇(Charles Babbage)并和他成为朋友。当时巴贝奇的头衔是:Lucasian Professor of Mathematics。在他之前,牛顿曾经拥有这个头衔,而它现在的主人是霍金。巴贝奇把 Ada 介绍给了德摩根定律和数学归纳法的发明者奧古斯塔斯·德摩根(Augustus De Morgan),德摩根成了她的数学老师。在给 Ada 母亲的信里,德摩根曾经说到她女儿在数学方面有出众的能力,有望成为第一流的数学家。法拉第也曾经说她是「科学界正在升起的新星」。 Ada 跟随德摩根学习微积分的笔记 巴贝奇知道 Ada 母女都对数学很有研究后,邀请她们参观他发明的差分机(difference engine)。因为人工计算经常出错,所以他想用一种手摇或者蒸汽驱动的机器来进行计算。Ada 马上被 Babbage 的发明吸引住了。事后她给巴贝奇写信要来了差分机的图纸,决定一定要弄明白它的工作原理。 巴贝奇不久后又设计出了叫分析机的机械式通用计算机。由于在当时没有得到英国政府的重视,缺少必要的资源,一直到巴贝奇辞世分析机都没有被实际制造出来。但它的设计逻辑非常先进,是一百多年后电子计算机的先驱。 巴贝奇请 Ada 帮忙翻译意大利工程师 Luigi Federico Menabrea 写的一篇关于分析机的论文。她除了把文章从法文翻译成英文外,补充了很多自己的批注和笔记,增加的部分有原文的三倍长。她的笔记和翻译一起发表在英国的一个科学期刊。Ada 的署名是 A.A.L.,也就是 Augusta Ada Lovelace 的缩写。在她的笔记里 Ada 描述了如何用程序来处理字母、符号、甚至音乐等其它信息,而不仅仅是数字。她还描述了分支、循环等在现代程序设计语言里常见的基本流程控制机制。也是在这篇笔记里,她发表了人类的第一个程序:计算伯努利数列,如果当时分析机实际存在,她的程序是可以正确运行的。
2016-09-11 08:00:00
9-11 9/11 的时候我在武汉大学,刚进入大四。每层楼的楼道里挂着两台电视,一大群学生们围在电视周围看着燃烧的双塔欢呼雀跃。我在武大 BBS 上发表了一点同情美国遇难者的言论,立刻被骂得体无完肤。 一年之后,那些为 9/11 欢呼的同学里有不少人和我一样到美国留学。 现在我已经回中国多年,而那些同学里有不少已经是美国人,或许还会去参加美国的选举。 我希望他们已经变了,也希望现在的中国大学生已经变了。 这篇文章原本发表在知乎。从知乎文章下面的评论看来,很多中国的年轻人和当年并没有什么变化。很遗憾。
2016-06-19 08:00:00
聊天工具除了用来传递消息之外,还可以帮我们完成一些重复琐碎的工作,比如让它去追踪一些数据变化,象下图中的 Trump 会告诉我们发表在知乎上的帖子又增加了多少新的读者关注。 Trump - 知乎数据 下面我就来介绍一下如何在 LeanEngine 上快速开发和部署一个像 Trump 这样的聊天机器人。因为我们团队使用的聊天工具是 BearyChat,所以就以 BearyChat 为例了。 首先,开始一个新的 Node.js 项目并把 RoLE 增加为依赖。RoLE 是 Robot on LeanEngine 的缩写,这是从我们自己的聊天室机器人抽象出来的一个库。不过因为已经有一个叫 role 的 NPM 包,所以包名就只能叫 role-model 了,也是个有趣的名字。用下面的命令把它加到你的项目里: npm install --save role-model 这个库只有一个顶层 API createRobotApp(): const role = require('role-model'); const app = role.createRobotApp({ chatService: 'bearychat', chatServiceOptions: { team: process.env.BEARYCHAT_TEAM, token: process.env.BEARYCHAT_TOKEN } }); 目前 chatService 参数暂时只支持 'bearychat',但支持其他聊天工具(包括微信服务号)是非常容易的,欢迎在 GitHub 提交 pull request。chatServiceOptions 是要传递给这个聊天工具的参数,对于 BearyChat 来说就是 team 和 token。为了避免 token 暴露在源代码中,我们从环境变量读取他的值。环境变量可以在云引擎的 web 控制台设置。
2016-06-09 08:00:00
昨天被一个知乎帖子刷屏,简单地说是一家公司取消了离职员工已经确权的期权,细节可以看原文,就不详述了:注册在开曼的公司,其期权究竟能不能买? - 职人社 - 知乎专栏。因为我们也遇到过怎样处理离职同事的期权的问题,另外看到评论里有很多错误的信息,所以在这里说一说。 一个持有创业公司期权的人行权购买股份可能有两方面的含义(原文说的是美元架构的公司,所以以此为例): 成为注册在开曼的公司的法律上的登记在案的股东。这确实至少存在几个问题: 按照中国现行的规定,返程投资需要通过外管局审批。如果按照规定执行,每个人都要聘请律师和代理在境外成立持股公司用来持有上述开曼公司的股份,并提交资料给外管局审批。这个过程本身会造成对个人来说不小的开支,如果审批没通过,或者公司最终没有好的退出,钱就白花了。另外境外的公司每年也有一定的维护费用。这本身是个门槛,如果公司在早期,不确定性太大,期权数量又不是很多,可能很多人也就放弃了。 按照我了解的情况,拟持有股份不多的员工去走这个流程在外管局审批通过的可能性很小。原因我也不清楚,不过如果每个公司的每个员工都去外管局提交申请,应该处理不过来吧。 准备在美国上市的公司要考虑 SEC 的规定。SEC 规定未上市公司的股东数不能超过 500,因为如果股东数太多实际就和上市公司差不多了,SEC 就要强制它上市以更高的标准进行信息披露并接受监管。另外即使不考虑法律法规,如果一个未上市的公司股东数量太多也没法管理。 第一点说了那么多,是为了把原文里提到的法律法规的问题说清楚,「但是」来了。持有创业公司股份的另外一方面意义是在将来股份具有流动性的时候(发生并购或上市),能够获得对应的收益。这是拿期权的员工所关注的意义。 我在原文的评论里说,这就是公司的决策问题,法律法规并不扮演主要角色,因为第一点和第二点并不是挂钩的。类似问题并不仅限于 VIE 架构的互联网公司。中国的很多境内传统企业也会在内部分配股份,用来作为分红和未来流动性分配的依据以激励员工。因为法律和管理上的原因,往往采取由少量创始人代持的方式,而不是在工商局登记成为正式股东。这些股份的意义和在各种情况下的处理方式主要还是取决于公司。 对于 VIE 架构的公司来说,如果董事会想减少股份稀释,要把离职员工的所有期权取消,那么第一点里说的法律法规就可以成为依据;如果董事会觉得离职员工应该得到已确权的期权所代表的未来收益,那么就有办法即能遵守第一点里说的法律法规,又能给员工回报。政府并不会规定当一家公司上市或出售的时候,它不能给已经离职的员工奖励,只要他依法纳税就可以了。所谓 VIE 架构,不就是因为互联网公司想要在中国从事对外资有限制的业务,而同时又需要接受美元投资而进行的创新吗。只是创新往往只发生在有需求的时候。 虽然上述的文章发出来之后一片声讨之声,但文中这个公司的处理方式并不是孤立的,有很多(不确定是不是大多数)公司采用的是同样的方式。其他愿意让离职员工行权的公司,可能大多是采用了类似于签代持协议的方式。从是否合法的角度来说,董事会怎么规定都是可以的,但是这是个很重要的问题,值得每个创始人仔细思考。 LeanCloud 第一次遇到有已确权期权的员工离职的时候,虽然当事同事的态度是「太麻烦就算了」,我们还是花了不少时间考虑如何在现有法律框架和公司管理的限制下妥善解决这个问题。后来我们花了三千多美元律师费请律师修订期权激励计划以及相应的董事会决议和文件,把这种情况的处理方式明确下来,确保离职员工可以享受到已确权期权的未来收益。并且我们延长了这位已离职同事的期权过期时间,以便他可以在董事会批准修订文件后再行权。我们希望保证期权对每个同事的现实意义。在我们的薪酬体系中,允许入职一段时间之内的同事选择永久性地把月薪降低 10% 换取期权增加 20%,并且有很大比例的同事做了这个选择,所以确保期权的价值尤为重要。在这个问题上的决策影响到的不只是离职员工。 甚至可以说这个问题上的决策影响到的不只是一家公司。在中国经常有创业公司的创始人抱怨说人才都被 BAT 抢了,创业公司又没有财力和大公司竞争。其实创业公司的期权不就是和大公司竞争吸引人才的最重要的武器吗?一方面大家都在抱怨遇到的候选人都忽略了期权的价值,另一方面很多公司又在用实际行动降低期权的价值,以至于很多求职者开始厌恶「创业公司」这个词,以至于其他公司要付出额外的努力来建立员工和求职者对期权的认可。 创业者们都喜欢说要改变世界,那么就从改变自己所处的这个小圈子开始吧。 很多人都看过 Ben Horowitz 的 The Hard Thing About Hard Things(创业维艰)。其中有一节的标题是「Being a good company is an end in itself.」(做一家好公司本身就是目标)。结尾时他说到从 Bill Campbell 身上学到的最打动他的东西: He was about building good companies. If you do nothing else, be like Bill and build a good company.
2016-05-01 08:00:00
Dijkstra 的全名叫 Edsger Wybe Dijkstra。大部分中国程序员如果能记住这个名字是因为学过计算最短路径的 Dijkstra 算法,然而大部分人都难以记住正确的拼写,因为他是荷兰人,名字不符合英语的发音规则。 Cannot remember his name. 他是几位影响力最大的计算科学的奠基人之一,也是少数同时从工程和理论的角度塑造这个新学科的人。他的根本性贡献覆盖了很多领域,包括:编译器、操作系统、分布式系统、程序设计、编程语言、程序验证、软件工程、图论等等。他的很多论文为后人开拓了整个新的研究领域。我们现在熟悉的一些标准概念,比如互斥、死锁、信号量等,都是 Dijkstra 发明和定义的。1994 年时有人对约 1000 名计算机科学家进行了问卷调查,选出了 38 篇这个领域最有影响力的论文,其中有五篇是 Dijkstra 写的。 Dijkstra 在鹿特丹长大。在高中毕业前他想在法学界发展,并且希望将来能在联合国做荷兰的代表。然而因为他毕业时数学、物理、化学、生物都是满分,老师和父母都劝他选择科学的道路,后来他选择学习理论物理。在大学期间,世界上最早的电子计算机出现了,他父亲让他到剑桥大学参加一个程序设计的课程。从这里开始,他的程序设计生涯开始了。一段时间以后他决定转向计算机程序设计,因为他认为相对于理论物理,程序设计对智力是更大的挑战。程序设计是最无情的,每一个一和零都容不得差错。 后来他在阿姆斯特丹的数学中心成为了一个兼职的程序员。他的工作是为一些正在被设计制造的计算机编写程序,也就是说他要用纸和笔把程序写出来,验证它们的正确性,和负责硬件的同事确认需要的指令是可以被实现的,并写出计算机的规范说明。他为并不存在的机器写了五年程序,因此他很习惯于不测试自己写的程序,因为无法测试。这意味着他必须通过推理说服自己程序是正确的,这种习惯可能是他后来经常强调通过程序结构保证正确性易于推理的原因。他曾经被后来出现的实时中断困扰了一阵子,因为中断随时可能发生,让证明程序的正确性变得复杂了很多。他的博士论文就是关于一个他写的实时中断处理程序。 在他决定成为一个程序员后,他尽快完成了学业,因为以他的话说,他在大学里不再受欢迎了:物理学家们觉得他是逃兵,而数学家们也看不起他和他做的事,因为在当时的数学文化里,你的课题必须和 ∞ 有关才会受尊重。那个时候程序设计没有成为一个职业,没有人能说出这个行业的基础知识体系是什么,而这些都会被 Dijkstra 改变。1957 年,他结婚的时候在申请的职业一栏写上了「程序员」,结果被政府拒绝,因为当时荷兰没有这个职业。 在一台新的叫 ARMAC 的计算机发布之前,Dijkstra 需要想出一个可以让不懂数学的媒体和公众理解的问题,以便向他们展示。有一天他和未婚妻在阿姆斯特丹购物,他们停下来在一家咖啡店的阳台上喝咖啡休息,他开始思考这个问题。他觉得可以让计算机演示如何计算荷兰两个城市间的最短路径,这样问题和答案都容易被人理解。于是他在 20 分钟内想出了高效计算最短路径的方法。Dijkstra 自己也没有想到这个 20 分钟的发明会成为他最著名的成就之一,并且会被以他的名字命名为 Dijkstra 算法。三年以后这个算法才首次发布,但当时的数学家们都不认为这能成为一个数学问题:两点之间的路径数量是有限的,其中必然有一条最短的,这算什么问题呢?在之后的几十年里,直到今天,这个算法被广泛应用在各个行业。Dijkstra 的眼科医生一直不知道他是做什么的,有一天突然问他:「是你发明了 GPS 导航的算法吗?」。一问之下,原来他读了 2000 年 11 月的科学美国人杂志,讲 GPS 的文章里说到了 Dijkstra。 Dijkstra’s Algorithm Dijkstra 后来在采访中说,他的最短路径算法之所以能如此简洁,是因为当时在咖啡店里没有纸和笔,这强迫他在思考时避免复杂度,尽可能追求简单。在他的访谈和文章中,经常能发现一个主题,就是资源的匮乏往往最能激发创造性。 Find You Dijkstra 第一次美国之行给他留下了深刻印象。在 1963 年时他已经小有名气,ACM 邀请他参加了一次在普林斯顿的会议,这也是他第一次和 Donald Knuth 会面。第一个演讲者是一个来自 IBM 的人,Dijkstra 发现他完全听不懂这个人讲的内容,也不理解写满了整个黑板的公式,而很多其他听众都积极提出问题并参与讨论。在茶歇的时候他对其他人表达了担忧,认为自己可能不适合参加这个会议,美国的参会者告诉他「哦,不必担心。其实大家都听不懂他说什么。但是这次会议是 IBM 赞助的,所以得让他们先上台,而且不能冷场。」Dijkstra 后来似乎一直对 IBM 不太感冒。IBM 的 System/360 大型机发布后,他花了一些时间阅读 360 的手册,他把这段时间描述为「我职业生涯中最黑暗的一周」。后来苏联决定建造和 360 完全兼容的计算机,Dijkstra 在一次会议上说「这是美国在冷战中最大的胜利」。
2016-04-15 08:00:00
大多数程序员都对「冯·诺伊曼」这个名字非常熟悉,因为他在计算机领域做出了非常多的贡献。现代计算机大都符合把指令和数据一起存储的概念结构,这个结构就被称为「冯·诺伊曼结构」;Knuth 在算法著作中认定冯·诺伊曼为归并排序的发明者;另外他还创立了细胞自动机这个子领域。但可能很多同行对他的其他方面并不熟悉,所以这篇文章想介绍一下冯·诺伊曼在计算领域之外的贡献和他的一些趣事。 和很多知名的科学家一样,他是个神童和天才,和他们不一样的是,很多人认为他是人类历史上最聪明的人之一。 他在六岁时就能心算两个八位数的除法,在八岁时能熟练运用微积分。十五岁时他师从著名匈牙利数学家 Gábor Szegő 学习高级微积分,当 Szegő 第一次与冯·诺伊曼会面时,被他的聪明震惊得哭了。(有史料记载的真事) 很多大家耳熟能详的知名数学家和科学家都给过冯·诺伊曼很高的评价,认为和他讨论时跟上他的思维是件很困难的事。但是也有人试图说明他有的时候也很傻。很多人都听说过这样一个数学题:两辆自行车从相距二十英里的两地相向而行,以十英里每小时的速度匀速行驶。有一只苍蝇从其中一辆车的前轮前沿出发,以十五英里的时速向另一辆车飞行,直到碰到另一辆车的前轮,然后掉头,如此往复直到被两辆车的前轮压扁。问最终这只苍蝇飞行的旅途一共是多少英里。这个问题有两种解法:慢的解法是计算苍蝇每次掉头前飞行的距离,把这些距离作为一个无限递减的序列求和;快的方法是意识到两辆车正好在一小时后相遇,而这正是苍蝇飞行的时长,所以苍蝇一共飞行了十五英里。一个人问冯·诺伊曼这道题时,他马上说出了答案。这个人失望地说「你肯定听说过这个问题了,所以知道诀窍。」冯·诺伊曼愕然地回答「这哪有什么诀窍?不就是无限序列求和吗?」 除了高超的数学天份,冯·诺伊曼还拥有照相机似的记忆力。Herman Goldstine 是著名的数学家和计算机科学家,他参与开发了第一台现代电子计算机 ENIAC。他在书里写到,他听说冯·诺伊曼有超强的记忆力,就想见识一下,于是他去问冯·诺伊曼《双城记》的开头是什么。冯·诺伊曼开始流畅地背诵《双城记》的第一章,直到十分钟后目瞪口呆的 Goldstine 让他停下来。从这段叙述看,他似乎也算是个喜欢炫技和碾压别人的人。 1929 年,冯·诺伊曼从欧洲搬家到了美国,在普林斯顿任教。由于在二战前有很多位大名鼎鼎的匈牙利科学家移民到美国,他们的英语口音很重让美国人很难听懂,而又表现出超人的智力水平,所以美国科学界幽默地把他们统称为「火星人」。另一位火星人尤金·维格纳在 1963 年的诺贝尔物理学奖获奖演说中被问到为什么匈牙利能在同一时代培育出那么多的天才。他的回答是「只有冯·诺伊曼是天才。」 冯·诺伊曼对于计算机科学、现代经济学(特别是博弈论)、量子力学这三个领域都是基础理论的奠基人之一,有这样的成就的人在人类历史上恐怕很难超过个位数。早在 DNA 的结构被发现之前,他就对自我复制的结构进行了数学分析。他的著作《量子力学的数学基础》顾名思义为量子力学建立了数学基础。他和尤金·维格纳一起提出了量子力学的冯·诺伊曼-维格纳解释,他们认为世界的状态可以被一个遵循薛定谔方程的波函数描述,是智慧生物的意识导致波函数坍缩,让状态从不确定变成确定。然而这个观点因为倾向唯心主义以及和一些宗教观点过于接近,没有得到主流物理学界接受。 鲜为人知的是,冯·诺伊曼在参与曼哈顿计划期间是选择用原子弹轰炸日本的哪两个城市的决策小组成员之一。他希望轰炸京都,然而意见被推翻了,因为京都比其他候选城市有更多的值得保护的文化遗产。二战后,很多核物理学家都转而反对核武器的研发和使用,冯·诺伊曼却一直坚定地支持发展核武器,也因为这件事他失去了很多朋友。 在认识他的人中,冯·诺伊曼是一个臭名昭著的坏司机,然而他还是非常喜欢开车,并且喜欢边看书边开车,导致了多起车祸,也多次因此被捕。在他为 IBM 做咨询期间,他的上司经常为他缴纳违章罚款。 和很多知名科学家一样,冯·诺伊曼在晚年回归天主教信仰。他曾在更早的时候对他的母亲说「上帝多半是存在的。如果是那样,很多事情都更容易解释。」他被诊断出癌症,并于 53 岁逝世。美国政府为了防止他在受药物影响神志的情况下泄漏军事机密,安排他在华盛顿特区的一所军队医院度过最后的日子。在病榻上他为耶鲁大学的 Silliman 系列讲座写了名为「计算机和大脑」的手稿。这份只有 96 页的手稿在他去世后被整理成一本书出版,他探讨了计算机和大脑的几点重要区别,并建议了将来的研究方向。
2016-02-01 08:00:00
这是对知乎上一个问题的回答:Parse 关了,国内的 LeanCloud 又何去何从? 这件事体现了在一个大公司中,一个产品的「成功」和「在它的组织内的成功」不一定是相同的。一个产品在它组织内的成功取决于这个组织的方向、优先级、以及体量。 New York Times 对 Parse 关闭事件的分析是比较全面的:Facebook 收购 Parse 的时候,它的股价正处于低于发行价的低点,作为从 Web 起家的公司,还没有什么有意义的移动广告收入,所以在非常急迫地寻找在移动平台的突破口。而 Parse 作为一个成功的移动开发平台,提供了一个获取新一代移动开发者和移动应用的机会。现在 Facebook 的移动广告收入已经占整体收入的 80% 以上,Parse 与核心业务似乎没有什么关系。如果云服务要成为一个对 Facebook 有意义的业务,那就要达到可以和 Amazon、Google 抗衡的量级。Parse 是 Facebook 唯一的云服务,要达到 AWS 和 Google 的级别,需要巨额的投资和大量的人力、时间投入。所以不如把这个服务关闭,把资源都放到自己做得最好的业务上去。 一个大公司把一个被认为比较成功的产品关掉并不少见,这样的情况都有一些共同点。因为 2007 到 2010 年底我正好在 Google,所以对 Google Reader 的历程比较熟悉。这几年里有个笑话,就是每一年管理层都会威胁解散 Reader 团队以便把他们分配到另一个产品,所以大家有时会打赌今年公司会想把 Reader 的人分到哪里。比如 08 年是 OpenSocial,09 年是 Buzz。到 2010 年公司终于决定让 Reader 进入维护模式,并把团队都调到 Google+。这并不是因为 Reader 不成功。恰恰相反,Reader 在那几年里是 Google 最成功的社交产品。但成功对于不同体量的公司在不同的上下文中意义是不同的。当时 Google 的核心业务正受到 Facebook、Twitter 的威胁,越来越多的人开始减少对搜索的依赖而从社交媒体上获取信息,对 Google 来说社交方面需要有能和 Facebook、Twitter 抗衡的产品,这不是 Reader 能做到的,于是就有了 Google+。而 Reader 作为 Google 最懂社交的团队很自然地被调到了 Google+。又过了两年 Reader 就被彻底关掉了。如果 Google Reader 是一家独立的公司,我想它很可能会远比后来的很多资讯类产品更加成功。可惜它处在一个尴尬的位置,一直得不到公司的资源支持,所以只能止步于一个 RSS 阅读器。
2015-11-27 08:00:00
一年多以前 LeanCloud 在自己的开放资源网站发布了薪酬和期权的计算方法,其中包含了每类职位各个级别的薪酬。 此后有不少朋友,特别是创业者问过我一些问题。 一直想写篇短文统一回答,并说说实践中的一些感受,但直到现在才克服拖延症。 过去这一年多没有对这套规则做实质性的调整。一个形式上的改变是把原来 senior 之类的级别名换成了 E0, E1, … 和 I0, I1, …,分别代表经验/能力(Experience)和贡献(Impact)的级别。 另外个别职位的基数也做了小幅调升。 以前关注过我们开放资源网站的人可能会注意到我们在薪酬公式后面增加了一个 adjustment 部分。 原因是我们以前为大家提供了一定的午餐和话费补贴,需要用发票报销。 这造成的问题是每个月每个人都要收集、整理发票,填报销单,财务同事还需要花更多时间处理,好处是每人可以省不到 200 元的税。 相对于每个人花费在这些事上的时间,节省下的费用是不值得的。 所以我们在月薪里给每个人增加了这个 adjustment 部分,比原来的报销额度高 400 元,同时取消了固定报销额度。 虽然公司的成本增加了,但大家都可以少花一些时间在琐碎的事情上。 我们设定透明薪酬制度的目的是消除薪酬倒挂、薪酬谈判等带来的不公平,同时促进团队里透明的文化。 在过去一年多里这两方面都取得了很好的效果,并且我们还发现它起到了一个过滤器的作用,帮助我们找到最合适的人,大部分新加入的同事都能比较容易地融入团队,进入高效的工作状态。 我们会把这个制度长期执行下去。 我就回答一下被问到过的问题吧: 「你们真的是按照这个方案执行的吗?」 我们当初对外公布薪酬方案,一方面是为了可以让要申请职位的人能提前了解,也为了在发 offer 的时候解释来由; 另一方面也是为了确保谁都不能违反制度,包括 CEO 在内。 标准执行的难度在于很多时候执行的人会遇到各种诱惑想要暂时绕开一次。 比如遇到一个很想招的人,他目前薪水比较高又不愿降薪,是不是可以例外一次呢? 例外造成的长期管理成本会远大于这个人满足短期需求带来的益处,所以不应该有例外。 一个不公开的标准是很难得到严格执行的,而公开的标准会驱使执行者排除例外。 「这样怎么挖人呢?」 一个很强的人在这个标准下自然能得到有竞争力的报酬,所以这个问题应该是指用高于标准很多的待遇去挖一个人。 我不理解这样做的目的所在,因为这是对现有团队的伤害,会带来长期的成本,得不偿失。 收入对于个人来说很重要,我们也力所能及地提供尽可能好的待遇,但是我们不希望新成员加入我们的最主要原因是收入,所以我们不靠高薪挖人。 「如果有一个很合适的人,他的期望值就是比用标准算出来的高一千块,难道你们就真不招了吗?」 其实反过来想一下,如果一个人因为月薪差了一千元就不选择这家公司了,你真的想为了让他加入而破例吗? 好的候选人不但能力上要合适,其他方面也要合适。 「你们公开薪酬标准,不怕其他公司来挖人吗?」 偶尔会出现有同事因为个人原因主动离职的情况,但是了解到的原因都不是因为其他公司来挖人。 一家公司需要除了薪酬之外有其他吸引人的地方。 其实无论薪酬是不是公开,大体的范围是可以估计的,愿意出高价挖人的公司总是可以那么做。 「这决定了 LeanCloud 只能是一家小公司。」 我的看法恰恰相反,我觉得规则比人更能 scale,希望 LeanCloud 的发展在将来能证明这一点。 很多公司在变大的过程中遇到很多问题,往往是因为靠人 case by case 决定的事情太多,缺乏规则,或者规则很容易被打破。 况且一家公司的大小不是由人数决定的,既有人很少的大公司,也有人很多的小公司。
2015-10-09 08:00:00
最近在开发者圈里讨论最多的莫过于 XCodeGhost。其实在 30 年前,更高明的手段就出现了。 1984 年的时候,UNIX 创造者之一 Ken Thompson 获得了 ACM 图灵奖。他的获奖演讲叫做 Reflections on Trusting Trust(反思对信任的信任)。 Portrait of Ken Thumpson 在这个稿子只有三页纸的演讲中他分三步描述了如何构造一个非常难以被发现的编译器后门。这后来被称为 the Ken Thompson Hack(KTH),有人说它是 the root password of all evil。 在第一步里,Thompson 展示了一个可以输出自己的源代码的 C 程序。这需要一定技巧,但很多人作为编程练习都做过。 在第二步里,Thompson 在 C 的编译器里增加了一段代码(后门),让它在检测到自己在编译 UNIX 的 login 命令时在输出里插入一个后门。这个后门会允许作者用特定密码以 root 身份登录系统。 在第三步里,Thompson 在第二步的编译器里使用第一步的方法加入另一段代码(后门生成器),使得这个编译器在检测到它在编译自己时自动把第二步的后门和第三步的后门生成器插入到输出里。 在得到一个第三步的编译器后,就可以把第二、三步新增的代码从源代码里删除,因为这个新的编译器在编译它自己原来「干净」的源代码时会自动把后门和后门生成器加上。很多语言的编译器都会使用「自举」的方式编译,也就是会用一个编译器的旧版本可执行文件来编译新版本的源码,所以这样一个高危的后门完全可以在一个开源项目里存在。通过阅读这个编译器的源码是无法发现这个后门的。 KTH 还可以被加强,让它更难被察觉。比如这个编译器可以污染它编译的调试器、反编译器等开发过程中使用的工具,使得即使程序员反编译这个编译器后看到的仍是干净的代码,除非他使用的是 KTH 注入前的版本。所以当这个带有 KTH 注入的编译器来自于官方渠道时,它的后门是几乎不会被发现的,而且会影响所有用户。 最近的 XcodeGhost 最多只能算是 the Ken Thompson Hack 的一个简化版本,没有试图隐藏自己,并且修改的不是编译器本身,而是 Xcode 附带的框架库。 Thompson 在演讲里的结论是:即使开源项目也无法保证安全。在不考虑硬件或 microcode 后门的情况下,只有当运行的每一个程序都完全是自己写的时才能确保安全。可是谁的电脑上能只运行自己写的程序呢?恐怕只有 Ken Thompson 和 Dennis Ritchie 能在用自己发明的语言写的操作系统上用自己写的编译器编译自己写的操作系统吧。
2015-05-04 08:00:00
这是我在 QCon 上「从工程师到创业者」演讲中前半部分的概要。作为一个创业到半路的工程师的一家之言,谨供正在创业的技术人参考。 工程师们都是创造者。通常来说,发明过新技术或者设计实现过复杂系统的人会认为自己已经把最困难的事情做了,把成果作为产品推向市场并赚到钱是相对容易的一步。事实并不是如此。Inc. 把 Quora 上众多公司创始人回答的创业失败原因做了总结,最常见的五个是: 没有与客户充分沟通 财务上的困难 团队和管理上的问题 缺乏长期计划 不懂市场推广 这些都和技术没有多少关系。当然这并不是说技术不重要,因为与技术、产品相关的问题往往最容易得到重视,所以失败多半是由于一些容易被忽视的原因。 有一些常见的问题是值得大多数创业的技术人注意的。 Know the Unknown There are known knowns. These are things we know that we know. There are known unknowns. That is to say, there are things that we know we don’t know. But there are also unknown unknowns. There are things we don’t know we don’t know. – Donald Rumsfeld 这句名言太经典,没有更贴切的小标题了。Joel Spolsky 90 年代初在微软做 program manager。老一代 Windows 程序员熟悉的 Visual Basic for Applications 就是他的 team 负责的。他说微软在全盛时期汇集了全球最优秀的软件人才,但那个时期从微软离职创业的人成功率出奇地低。原因是当时微软的管理做得非常出色,所以工程师在公司可以高效地工作,所有的绊脚石都被公司屏蔽掉了。大多数人自己创立公司后才发现,原来管理一家公司要面对那么多问题、处理那么多事情。技术人大多容易低估管理的难度,而且越是在优秀的公司工作往往越容易有这种倾向。
2015-02-17 08:00:00
上次在「为什么每个团队都需要 Code Review」中讲了 code review 在开发中的重要性。这次说一说怎么才能让 code review 有效发挥它的作用。 **使用方便的工具。**要在团队中成功推行 code review,有好的工具是很重要的。谁都不愿意在工作中加入繁琐的过程,所以如果要让人接受一个新的步骤,最好让它有尽可能好的体验。在我用过的开源 code review 工具中,Phabricator 是最完善的。Review Board 应该也是不错的选择,只是我很久没实际用了,不知道最新状态。GitHub 在支持 side-by-side diff 后,它的 pull request 也提供了很好的 code review 体验,唯一不足的是无法从机制上强制所有 commit 都经过 pull request 的过程。 **把简单的检查自动化。**有很多检查是可以自动化的,比如一些风格规范(缩进、空行、行尾空格、命名等),这类问题应该尽可能写脚本检查。一方面可以让负责 review 的工程师把更多注意力放在更高层面的问题上;另一方面,从接受 review 的人心理上说,由程序提出这些细节问题比让另一个人来挑刺要更容易接受些。当然,这并不是说人工 review 的时候应该忽略细节问题。 **控制每次 review 的代码量。**每次 review 包含 200 行左右代码是比较理想的,最多不要超过 400 行。因为如果代码太多,review 的人容易因为注意力分散而忽略一些问题,另外也可能让时间拖得过长。因此,开发的时候需要把大的改动分解成多个小的步骤,每完成一个步骤就提交一次 review。 **使用异步的工作流。**这和上一点是相关的,当你需要把一个改动分为相互依赖的多步时,不应该因为等待 review 而 block 住自己的工作。在当前分支等待 review 时,可以从这个点开一个新的分支继续开发,之后再把 review 完的分支 merge 进来。 **作者应该提供清晰的 commit note。**Code review 的重要作用之一是同事间的交流,每个 commit 的 commit note 很重要也很影响 review 的效率,应该包含这个改动的目的,以及实现方式的概述。如果使用的 review 系统支持对 review 本身的描述(如 GitHub 的 pull request),那么应该写清楚作者希望 reviewer 重点关注的问题。
2015-02-01 08:00:00
Measurement of Code Quality 不少开发团队和创业公司都在纠结是否要执行 code review,既希望改进代码质量,又担心带来的负担会拖慢项目进度。实时上,在软件开发中质量和效率往往并不是二选其一的关系。能产出高质量代码的团队通常效率也非常高。 在我作为工程师的职业经历中,自动化测试和 code review 可说是能同时提高代码质量和开发效率的两个最有效的手段。所谓 code review,和学术界的 peer review 类似。Peer review 是由同事或同行对一位作者的作品进行查阅并提出建议和问题,只有当所有提出的问题都得到满意的答案后,作品才能发表。对于 code review 来说,作品就是代码,发表就是把代码 commit 到官方代码库。 在 Code Complete 这本书中讲述了两个很有说服力的案例。在一项对同一个团队开发的很多个程序进行对比的研究中,没有经过 review 的程序平均每 100 行有 4.5 个错误,而经过 review 的程序平均每 100 行只有 0.82 个错误,也就是说 80% 的错误在 review 中被修正了。AT & T 的一个 200 多人的部门在开始执行 code review 后,开发效率提高了 14%,而错误减少了 90% 左右。 除了减少缺陷,避免在诊断错误上浪费时间,review 的过程还可以通过相互的督促保证代码有好的可读性、文档、风格,并同时检查测试覆盖率等开发过程中的规范,从而提高团队的协作效率。对于所有复杂的事情来说,总是越早发现问题,解决问题的成本越低。 对于经验不足或者刚开始一份新工作的人来说,通过 code review 可以得到更资深的人帮助,更快熟悉现有的规范和架构,在新的环境和团队中快速提升。 对于资深的工程师来说,让其他同事 review 代码,有利于在团队中传播经验、知识和好的实践。身边的同事水平提高会让自己的工作也更高效。并且谁都有需要休假的时候,无论是公司还是个人都不希望有太多工作因此而停滞,如果有平时就熟悉自己工作的同事,这个问题就很好解决。 像很多其他事情一样,code review 最难的就是迈出第一步。一旦开始,花在 review 过程的每一分钟都会很快被成倍地赚回来。如果你不在一个可以一下改变团队流程的位置上,那么至少可以和认同这件事的少数同事先开始实践,当价值开始体现的时候,相信其他人会乐于效仿。
2014-05-31 08:00:00
我出生后到十八岁前都是在昆明长大,一般每年寒暑假会随父母到建水和开远看望长辈和其他亲戚。建水和开远都是云南省红河哈尼族彝族自治州的小城。我十八岁上大学离开云南之后,回老家的频率就大大降低,而外公极少离开开远,所以我对他的记忆大部分来自于童年和少年时期。 我很小的时候,外公曾经在昆明带过我挺长一段时间。那个时候年纪太小,所以除了一些很模糊的画面,很难回忆起任何片段。关于那时所知的大部分都来自于父母的讲述,以及他带我到翠湖和圆通山玩耍时拍的照片。 我大约两岁时和外公、母亲在昆明 从开始记事起,每到寒暑假,我就会乘火车沿法国人占领云南时修建的寸轨铁路从昆明到开远。现在走高速只要三小时,那时候整个白天都得呆在火车上。不过在高原上乘火车,风景不断变化,沿途到站也有很多人到窗边兜售本地特产和食物,倒也不会觉得无聊。 外公是个平静、宽容和慈祥的人。我外婆脾气比较急躁,老家的晚辈要是在她面前做错什么事,免不了要挨一顿骂。外公在的时候最常出来打圆场「唉呀,你别骂啦,好好说…」。 小时候在老家时常坐在外公旁边,边和他说话边看他吸水烟。一小团烟草点燃了,呼噜呼噜被吸到了烟筒里,觉得很有意思,所以我和表弟常会偷偷用他的水烟筒体验一下。外公身体一直不错,只是最近几年年纪确实太大,之前他通常是自己做各种活计。帮他一起劈柴也是童年回老家时的一大乐事。 外公喜欢抽烟、喝茶、打麻将,最喜欢戏曲,尤其是京剧和黄梅戏。印象中我曾送过他黄梅戏的磁带。可惜家里小孩多,他看电视上的戏曲节目时,往往有不懂事的小辈要抢着看其它。不久前在北京路过长安大戏院,还想不知什么时候能带外公来这里看场戏,他一定会很高兴。可惜就像人生中的很多事一样,有机会的时候没有抓紧,就会永远错过、无法弥补。 外公过世前一天去理了发,交了后面一年的党费,晚上还看完了「海峡两岸」才睡,第二天早晨就过世了,没有明显病痛。 知道消息的时候我正离开北京去上海,等从上海回到云南开远老家,外公已经下葬了。一切都发生得太快,却又恍如隔世。 外公的生活直到最后一天都是平静、淡然、简单和自由的,应该是很多人都求而不得的吧。虽然没能与他告别,但隐约觉得他临终还是教给了我很重要的东西。 怀念。
2013-11-16 08:00:00
这其实是一段时间以前在「知乎」的一个回答,获得的赞同还算比较多,放在这里算是给自己的备份吧。 原问题是 对于卡内基梅隆大学计算机系删除基础课程中的面向对象编程课程,如何理解他们提到的 「面向对象编程既是反模块化的又是反并行的」? 下面是我的回答。 这个问题的根本在于 OOP 是基于状态的。每个对象都维护着自己的状态,暴露给外界的是一些可以改变对象状态的方法。一个对象的状态里可以有对其他对象的引用,一个对象的方法也可以调用其他对象的方法来改变其他对象的状态,所以这些状态还是关联的。很多人提到的线程安全与效率的取舍之类其实都是细枝末节,即使是有办法把所有方法都能高效地实现并且全都是线程安全的,只要状态存在,状态带来的问题就存在。在一个复杂的并发系统中,你调用 foo.bar(42),几个指令之后再调用 foo.bar(42),两次调用的结果很可能是不一样的,因为在这中间 foo 的状态可能已经改变了,或者 foo 引用的某个对象的状态可能改变了,不去看 bar() 的实现根本不知道结果依赖于什么。同样一段程序多次运行因为时序的不确定性可能结果也不一样。不管 OOP 也好,过去说的过程式编程也好,理论基础都是图灵机模型,而图灵机就是依靠对状态的记录和改变来进行运算的。图灵机里的纸带和状态寄存器用来记录状态,而读写头用来访问和改变状态。想象一下一个并行的图灵机(多个有独立状态寄存器和不同速度的读写头加上一条共享的纸带)就不难理解在这个模型下并发带来的复杂度。 而目前很多人因为并发的需求所崇尚的函数式编程是基于 Lambda Calculus 的计算模型。计算由层层嵌套的函数调用完成;每个函数调用的结果只依赖于函数和它的参数。如果 f(4, 5) = 10,那么无论你在什么时候调用 f(4, 5),它的结果都是 10。相对而言,这是一个比较干净,比较容易推理和确保正确性的模型。OOP 的程序通常有很多隐藏的数据依赖,函数式编程把这些数据依赖都明确化了。 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,它必须被模拟出来。目前为止被广泛使用的计算机还是基于图灵机模型,计算机的寄存器、缓存、内存就是用来记录状态的。要真正懂得程序设计,必须知道没有状态的函数是如何在充满状态的计算机上实现的,所以还是绕不开非函数式的编程。另外绝大部分的函数式程序设计语言都不是纯函数式的,出于实用性考虑都夹杂着其他语言的一些特点,并没有完全排斥状态。Haskell 号称纯函数式语言,用 Monad 来抽象状态,理论上可以自圆其说,但在实际使用中其实还是带来了很多不便(于是又发明了 Monad Transformer…)。 从某种程度上说,状态是绕不过去的,毕竟人感知到的宏观世界就是由各种各样有各自状态的对象构成。函数式编程可以帮我们避免很多用其他方式容易犯的错误,在很多情况下写出更高质量的程序,但并发带来的复杂度并不会从根本上消失。各种编程风格一定是互相影响推动程序设计语言的进化,没有绝对的好坏,从 C++ 和 Java 最新标准里引入的函数式方面的功能就很容易看出这一点。比较有意思的是,OOP 最早是在 LISP 里实现的,而 LISP 也被很多人看做函数式编程的起始。同样,好的程序员也会根据具体情况使用合适的编程风格。 OOP 不失为一种比较容易理解的在计算机程序里对现实世界的抽象,在很多场合的应用是非常成功的,至少我没发现以图形用户界面为中心的程序里有比 OOP 更行之有效的抽象方式。把 OOP 从程序员的教育中去掉过于片面和激进了。如果是从基础课程调整为选修课程则是可以理解的,我上本科时记得也是那样设置的。
2013-06-15 08:00:00
最近连续在不同的文章里看到「零和博弈」这个词,大都用来描述众人皆输的局面。比较具体的是在一个叫「拇指博客」的 iPhone 应用里看到的一篇讲最近的厦门公交车纵火案的文章: 在这场以生命为赌注的零和博弈中,所有人都是输家:陈水总和他的家人,无辜的死者,冷漠的看客,推诿的官员。 按这个应用自己的说法,他们选择的文章作者「涵盖中国时论、经济、文化圈最重要的意见领袖」,代表着中国互联网上最高水平的文字。 我高中的时候语文一直在及格线边缘徘徊,现在也不是博弈论专家,但至少知道用搜索引擎来弥补自己的无知。下面是 Wikipedia 和百度百科对零和博弈的解释: 零和博弈指参与博弈的各方,在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为零。 「一方的收益必然意味着另一方的损失」意味着有赢家就有输家,反之亦然。所谓所有人都是输家的零和博弈是不存在的。 这个词不是特例,只是线上线下媒体充斥的各种低级错误的一个具体实例。任何一个人都不可能熟悉所有领域的知识,但无论是对职业媒体人,还是喜欢在网上码文字的各种有名或无名的作者,在遇到没把握的概念时能够谦卑一点,搞清楚意思,不要卖弄一些听着高深但意思不对的词,这应该不是一个过高的期望。如果连文字上的低级错误都这么多,那这些文字组成的文章以及写这些文章的作者能给读者多少信心?
2013-02-14 08:00:00
最近在 Clojure 的邮件列表有很多关于自己所在公司不能使用自己喜欢的语言的抱怨,由此也引发了一些争论。类似的内容在很多相对非主流的语言或技术的用户社区都不难找到,例如 Erlang,Go 和 Haskell,不久以前可能 Node 甚至 Ruby 和 Python 都算是小众的。 有人把软件设计看做一门手艺,把程序员比作工匠,所以才会有 Software Craftsmanship 这样的运动。工匠非常重视自己使用的工具,有了顺手和习惯的工具才能事半功倍,这本是无可厚非的。但作为一个公司来说,为了避免技术上过度的碎片化和重用现有资源,无法避免会在这方面做出或多或少的限制。比如我在 Google 的时间里,在线上面对用户的产品只能使用 C++ 和 Java(YouTube 等收购的产品除外),Python 基本只用于内部工具。现在 Google 发布了 Go,可能选择多了一些。在这种情况下,喜欢使用一些小众技术或语言的程序员和公司之间的矛盾就产生了。 程序设计也是一门艺术。艺术的魅力一方面在于创作中可以有众多的选择,有众多的风格和流派,无所谓对错;另一方面也在于艺术家往往乐于接受挑战,在客观条件的限制下完成看似不可能的事情。比如在米粒这样非常不适合雕刻的介质上也能做出精美的微雕作品。学习 Clojure 的价值并不在于在工作中一定要用到这门语言,而是通过理解它解决问题的方法让自己成为更好的程序员,无论实际使用的是什么语言。如果喜欢函数式编程,那么在任何语言中都可以用它,不一定要强求使用一门函数式。事实上给一门语言打上「函数式」或者「面向对象」等标签都是人为的做法,很多时候本身就是存在争议的。 拿 C++ 做例子,大多数人会说它是面向对象的语言,但它的模版部分是一个真正的纯函数式语言。我曾做的一个项目是把 Google search 的 webserver 逻辑重写,用模版和 C++ 的静态类型系统来实现对后端 RPC 复杂数据依赖的管理,让没有相互依赖的 RPC 并行进行,而存在依赖的 RPC 以正确的顺序进行。现在还记得上线时的忐忑。这件事参考了 Haskell 用强大和完备的类型系统来加强程序正确性的做法,虽然在 Haskell 里会容易和自然很多,但肯定不可能为了这个优点把很大的 code base 重写。 同一时期我的另一位同事实现了一个非常高效的 C++ continuation API,和 Scheme 的 call/CC 一样好用,只是不知道后来有没有用在生产环境里。 学一门语言重要的是理解设计者解决问题的方法,这样也许客观条件限制你不能用它的语法,但你可以用类似的方法解决类似的问题。有句话说「当你只有一个锤子的时候,你看什么都觉得像钉子」。其实了解越多的语言、技术和工具,会越觉得没有必要执着于某一个选择。可以选择的时候就选择最适合的工具,没有选择的时候也能恰当利用手上的工具用合适的方法解决问题。大家要做 artist,不要做 zealot。
2013-01-11 08:00:00
去年 12 月 Newsweek 出版了最后一期纸质杂志,之后全部改为电子版。这件事引起了不小的震动。不久前我受邀参与了中国数字期刊协会组织的一次与媒体界朋友的交流。其实最近几年一直有很多关于传统报社、杂志社会被互联网杀死的论点,并且得到了比较广泛的支持。这个论点一般被表述为新媒体或者社交媒体会取代传统媒体。这里说一下我个人的看法。 很多人因为报纸、杂志存在的时间比较久而把他们叫做传统媒体。参考 Wikipedia 上的定义,新媒体是指在任何时候任何地方在任何电子设备上对内容的即时访问,并包括交互的用户反馈、参与以及围绕媒体内容的社区构建。而旧媒体或传统媒体自然是指在互联网和新媒体出现前的通讯与表达方式。由此可以看出,所谓旧媒体和新媒体的差别主要是传播渠道和访问方式的区别。而对于报纸和杂志来说,最宝贵的财富和最核心的竞争力是内容。 说新媒体会取代传统媒体本身没错,但这只是渠道的更替,并不意味着原有的内容生产者会被取代。好的报纸和杂志如果拥抱新的渠道、满足互联网用户在访问方式上的需求,在互联网逐渐成为主要的内容渠道后,仍然会具备很强的生命力和竞争力。因为他们具有很多难以被取代的优势:专业的制度和流程、媒体责任感、读者的信任感、能持续稳定地输出高质量内容。包括各类SNS在内的互联网产品优势主要在渠道上,这些渠道仍然需要高质量的内容才有价值。 当然,在互联网上用户的互动本身也会产生大量内容,但这些内容的质量一般来说比较低,大部分不具有广泛的传播价值。拿国内用户最多的SNS之一新浪微博来说,很多用户把它作为一个发现和过滤内容的工具,最终还是会点击链接到达专业媒体的网站。微博为这些以产出内容为主的媒体带去了大量流量,而不是消灭他们。如果没有好的第三方网站产生大量好的内容可供微博传播,相信微博的价值会低不少。 很多人会说除了正常的竞争外,互联网上出现的对版权的侵犯也会威胁内容的产出者。世界各国,包括中国在内,都在不断加强对版权的保护,社会对版权侵犯的容忍度越来越低,侵权事件也越来越少。这一点从中国在线视频行业的发展就很容易看出。中国的互联网生态系统在很快成熟,很多用户非常愿意为优秀的产品和内容付费。除了传统的付费订阅或购买外,掌握内容的媒体和其他互联网产品一样能利用网络带来的新机会和商业模式,如广告和增值服务等。 威胁报社、杂志社、出版商的,不是互联网,而是他们自己。出版行业需要接受和拥抱互联网带来的新渠道和消费方式,要能在线下传播也能在线上传播,能在线下经营品牌也能在线上经验品牌。互联网把整个世界的一切节奏都加快了。在飞快变化的环境中适者生存,会有一些出版物消失,但是杀死他们的不是互联网,而是能更好适应互联网的其他同行。到头来媒体就是媒体,不再会有新旧之分。这就像现在说的传统互联网和移动互联网一样,其实只是在某个发展阶段里人为的区分而已,最根本的东西是变化很小的。
2012-12-31 08:00:00
这篇文章原文叫「现实世界的 LISP - Clojure 语言初探」,发表于《程序员》杂志 2012 年的十二月刊。得到编辑的许可在一个月后贴出来。有网友说这篇文章写得太平淡规矩,没有那种让大家都去学 Clojure 的煽动性,不过那其实也不是我的目的。只希望对想初步了解这门语言的人有一些帮助。 我在学生时代最喜欢两门程序设计语言:Scheme 和 Haskell。Scheme 是人工智能课用来做作业和项目的语言,而 Haskell 是学习函数式程序设计时所用的语言。Scheme 的简洁灵活和 Haskell 的纯函数世界都给我留下了深刻印象,所以一直希望能用这样的语言做一些实际的事情。开始了解 Clojure 之后很欣喜地发现它结合了 LISP 和函数式语言的优点,同时又拥有 JVM 成熟的生态圈,是一门虽然年轻但立即可以在实际项目中应用的语言。不像其它一些新语言,由于库的缺乏,需要早期使用者自己动手实现很多细节功能。 Clojure 诞生于 2007 年,设计者是 Rich Hickey。由于它兼具 LISP 语言的高效、可扩展特性,同时又能利用 Java 的生态圈,在短时间内得到了相对广泛的传播,并在一些互联网公司得到应用。比如 Twitter 用来做实时数据处理的系统 Storm 就是用 Clojure 实现的。一些民间发起的开源项目,如 Incanter 等也在短时间内走向成熟并得到广泛应用。本文对这门语言做一个概括性的介绍,希望能让读者了解 Clojure 的特性,对它产生兴趣,并在合适的场景下使用这门高效的语言。 开始使用 Clojure 最快开始使用 Clojure 的方法是安装 Leiningen (http://leiningen.org/)。Leiningen 是 Clojure 的项目管理工具,它的作用类似于 Java 的 Maven。在 Linux 和 Mac 系统下只需要下载一个叫 lein 的 shell 脚本。在 Windows 系统有对应的 lein.bat 批处理脚本。
2012-12-17 08:00:00
从工作之后、到后来创业、再到现在主管 AVOS 的北京 Office,我看了不计其数的简历,也参与了不少面试。看到很多求职者都犯了很多相似的错误,于是总结出来,希望能对一些求职的人有一些正面的作用。 细节 不少简历里都有一些细节上的错误,比如错别字等。求职对于一个人来说是很重要的事,应该谨慎对待。而简历是敲门砖,虽然简单,但应该尽量做到无可挑剔。试问如果一个人对一件简单而对自己很重要的事情都马马虎虎,在工作上怎么让人放心呢? 我看到的最难以接受的错误是把自己日常工作的东西都写错,例如一个有两年 iOS 开发经验的人在简历的所有地方都把 Objective-C 写成了 Object C。一个连自己使用的语言都搞不清的人,怎么能说掌握了这门语言。 对求职信,也有很多值得注意的地方。有一些求职信是空白的,就只有一个附件,连申请什么职位也没写,给人的感觉就是此人懒到了极点,连求职都这样,可见其他事情也会很马虎。还有些求职信的信头 From: 里用的不是真名。我最近见到过的有诸如『aha61』、『94smart』、『不想长大』(不想长大?你确定想工作吗?)之类的,显得很不专业。当然,如果是阿里系的朋友,使用花名是可以理解的。 『精通』 请慎用『精通』二字。如果你在简历里说精通某个东西,那么最好有很大把握比面试官更熟悉它。我面试过的人里几乎所有精通 C++ 的人最终都被证实只是略懂 C++。在 Google 时还听说一个学生因为会写 Elisp 来定制 Emacs,于是简历里写精通 LISP。然后 HR 就安排了一个 LISP 的高手面试他,然后就没有然后了。 如果一份简历里有说到『精通XXX』,即使不在职位的需求之内,我在面试中也一定会问问那方面的问题,因为这样很容易考察一个人的学习能力和自我认知。 慎用、慎用。 面试 在面试中能不能正确回答出某个难题并不是特别重要,最重要的是展示出自己面对难题时的思路以及积极的态度。面试里通常会出现一些比较难而且多半不会在实际工作中出现的问题。面试官期待的是看到面试者能积极甚至是很兴奋的尝试以不同的思路分析和解决问题,比如把问题的规模变小、先考虑简单的特殊情况、或者从几个实例中去发现规律等。面试官也希望看到在给出一些提示后,面试者能被引导到正确的思路上。 所以遇到不能很快解决的难题可以大胆地说出想法,在一段时间没有进展之后可以向面试官要求提示,但是不要简单地说『我不知道』。没有任何公司会喜欢在困难面前轻易放弃的员工。
2009-03-13 08:00:00
I spend a lot of time in front of Emacs in a terminal window, and I share my configuration across all my computers. At work I have a large monitor, so I split the emacs frame into 3 side-by-side 80-column windows. At home I have a smaller screen with room only enough for two windows. Sometimes I just use the laptop display. To share the same configuration file, I use the following snippet: