zoco

阮一峰博客

2020-07-01


马克思理论认为,利率降至零时,共产主义的时机就会到来,因为零利率意味着资本家不再知道如何处理他们的钱,没有好的投资机会,此时唯一要做的就是重新分配资本。

马克思研究的是,无产者怎样才能在一个有产者主导的社会里面获得解放。可是我们看到,200年过去了,这个世界依然存在无产者和有产者的对立。互联网技术甚至加剧了这种趋势,有钱的人变得更有钱了,没钱的人更难获得翻身的机会。

让我坚持下来的一个动力,就是我想看看,技术到底会带给这个社会怎样的变革?如果技术没有办法解决社会阶层的分化(甚至带来固化),那么我可以做些什么?

公司发展到一定阶段,能力强的员工容易离职,因为他们对公司内愚蠢的行为的容忍度不高,他们也容易找到好工作,能力差的员工倾向于留着不走,他们也不太好找工作,年头久了,他们就变中高层了。这种现象叫"死海效应";好员工像死海的水一样蒸发掉,然后死海盐度就变得很高,正常生物不容易存活。

天才怎么来的?很多研究都显示,天才是后天因素造成的,而不是先天决定的。

2014年,爱沙尼亚的研究人员调查了163名优秀运动员。研究发现,优秀人才首先存在强烈的内在动机。他有很强的意愿和兴趣,投入所从事的事业。然后,他会自发地在这方面进行刻意练习。

研究还发现,内在动机与刻意练习有互相增强的作用。较高的初始内在动机,会带来更多的刻意练习;而较多的初始刻意练习,会使得内在动机增强。最终,内在动机和刻意练习两者都呈现螺旋式上升。如果你走在一条这样的道路上,往往就预示着这是一条正确道路,通向成功。

结合一万小时理论,如果刻意练习达到一万小时,就很可能使得自己变成一个优秀人才。你在所做的事情里面感受到明确的动机,动机成为你不断刻意练习的中心目标。练习之中,你通过反馈,逐步消除错误取得进步,结果进一步加强了动机。

沟通不是一件好事。

—- 亚马逊内部会议上,有人提议改善各个小组之间的沟通,贝佐斯做了上面的回答。他认为,随着人数的增加,点对点沟通的成本巨大,而且会导致混乱。他希望每个小组都尽量小,保证内部沟通有效。小组对外提供定义良好的接口,可以从接口上拿到所有信息,尽量消除直接沟通的必要。

很多人都说,当今社会趋向阶级固化,贫穷世袭。这种说法有根据吗?

纽约大学的社会学家就做了一次调查,企图给出实证数据。最近,他们公布了结果。

社会学家按照收入,把所有美国的职业分成100个等级。收入最高的职业为100分,收入最低的职业为1分。在这个体系里面,医生是93分,空姐是53分,擦鞋工是9分。

一共调查了2万多个人,结果发现,__子女的等级与父母的等级,呈现明显的正相关。__如果父母的职业在76分以上,子女的职业往往也是这个等级;如果父母的职业在25分以下,子女很可能也是如此。概率在50%以上。

调查报告写道:

“人们总说,美国是一块充满机会的大陆。事实并非如此,美国人的职业发展,最大的决定因素可能是父母。”

注意,这是美国的调查结果,那个地方号称有"美国梦",人们相信奋斗就能改变人生。如果在中国调查,我想正相关肯定更明显,父母因素的决定性将更大。一个表现就是,由于太缺乏改变人生的正常途径,才导致我们这里任何可能暴富的东西,都异乎寻常的流行,比如彩票、传销、互联网金融和加密货币。

几年前,亚马逊的老板贝佐斯来到我们的办公室,停留了90分钟,与我们讨论产品策略。离开之前,他回答了大家的问题。

他谈到,什么样的人大多数时候会有正确观点。出乎意料,他认为,如果一个人经常改变自己的看法,更可能得到正确的观点。今天的看法与昨天完全不同,这是很好的事情。坚持自己的看法,并不值得赞许。

世界变化太快,最聪明的人会不断修改自己对世界的理解,重新考虑那些有定见的问题。他们不断用新的信息、新的想法挑战自己的思维方式。这并不意味着,你认定自己的观点就是错的,而是说你应该把自己的观点视为暂时的。

Hacker News 上面,有人问:“新人进入软件行业,应该学什么?”

很多热心人提供建议。有人说:

“你应该好好学习一门语言。精通一门计算机语言,可以让年轻工程师脱颖而出。这不仅对日常工作很有帮助,也有利于以后学习其他语言。学习的东西包括:设计模式、调试、性能、生态系统、标准库等等。”

立刻有人提出相反的建议。

“我建议学习几种彼此非常不同的语言。例如 Java,Go 和 JavaScript。你要学到精通其中每一种语言,能够独立地从头搭建一个新项目,在该语言的生态系统中完成所有开发工作。”

有人举出几种必须掌握的工具。

学习 SQL,你将能够使用任何与数据库相关的软件。
学习 HTML,你将能够创建一个通用的用户界面。
学习 GIT,你将能够与他人分享您的工作。
学习 Unix shell,你将能够部署所有的东西。

不少人赞同这种说法。

“大多数职业(从医生到电工),多年的经验等同于多年的专业知识。但是在软件开发中,技术变化如此之快,你花费了大量时间学习技术和工具,一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节。最终,所有这些年,你确实积累了一些一般性的经验,但与具体实施相关的知识,你都不再掌握了。

唯一留下的是那些基本的东西,你应该专注于软件开发的核心知识和数学知识,您的这些技能会不断增长,而不是随着技术潮流的变化而消失。”

我最喜欢的是下面这个建议。

“不要让自己太忙碌。不过,说起来容易做起来难。

我们雇用新毕业的工程师时,会派给他们很多琐碎的工作,使他们饱和。他们会逐渐忘记大学里学到的课程,全部注意力都集中在手头的工作。很多人倾向于通过忙碌程度来评价自己,我相信这是一个死亡陷阱。”

19世纪时,美国社会有一个流行的现象。许多年轻人离乡背井,为了得到高薪,去遥远的西部矿场挖矿。在那里工作几年,就可以赚取足够的钱,回家娶一个老婆。矿场的生活是非常艰苦的,条件很差,这也是矿主支付高薪的原因,否则没人愿意来。

20世纪时,这种现象变成了石油行业。石油钻井平台通常都在偏远地区,有的还是在沙漠和海洋里。石油工人可以得到高工资,代价是恶劣的生活条件,以及远离家庭的孤独。

现在,这种现象变成了 IT 行业。年轻人为了高薪,来到湾区当程序员,同样过着艰苦的生活。我听说,旧金山的一间卧室里面,居然住了好几个大学毕业生,因为旧金山双居室公寓的租金是5500美元/月。有些谷歌的雇员也是合住,而且地理位置也不好,离交通干线很远。

很多人把湾区看成新时代的矿场。IT 行业的工资比其他行业高,那些外来的程序员,计划是省钱,忍受一段时间的恶劣生活,然后在30多岁退休,再去低成本城市工作并在那里开始家庭生活。

作者注意到一个现象,同一台机器,Java 线程最多只能建几千个,但是 Go 线程可以建数百万个。他研究后发现,这跟线程的内存占用有关,每个 Go 线程竟然只占用4KB。

在软件开发中,技术变化如此之快,你花费了大量时间学习技术和工具,一旦这些技术被取代,你的知识将变得毫无价值,因为它们大部分都是实施的细节。

我最近总是在想这段话,软件开发算不算是真正的知识?

如果它是一种真正的知识,那么理论上,我们学到的东西大部分应该不会过时,就好像微积分不会过时一样。可是实际上,我们都知道,软件开发技能有时效性,十年前学习的编程知识,十年后几乎肯定不能用于生产。那样的话,软件开发就不能算真正的知识,只是一种实施的细节。

公司旁边有一家税务所,每天都有很多人排队交税。如果你是第一次来交税,肯定搞不清楚怎么交,交税是一门学问,必须有人教你,要带哪些证件,要填哪些表,去哪些窗口排队等等。

__我现在认为,学习编程跟学习交税是一样的,都是学习实施的细节。一旦外部环境变了,原来的实施细节就没用了。__当代编程由于层层的抽象和封装,我们已经不必接触底层真正具有通用性的知识了。大部分时候,所谓编程就是在写某个抽象层的配置。比如,网页样式就是在写 CSS 配置,你很难说这到底是真正的知识,还是像《办税指南》那样的实施细节。

实施细节并不是知识,而是操作步骤。如果技术栈发生变更,实施细节就会毫无用处。但是,你又不能不学习它,不知道实施细节,就没法做出项目。我觉得,程序员应该要警惕,不要落入实施细节的陷阱,不要把全部精力花在实施细节上面,然后以为自己学到了真正的知识。对待各种语言和工具,正确的态度应该是"进得去,出得来",既要了解足够的细节,也要能够站在宏观的角度看待它,探寻底层到底是怎么实现的。

1968年,计算机学家梅尔文·E·康威发表了一篇著名论文,后来被称为康威定律(Conway’s law)。

“软件系统的架构,反映了公司的组织结构。”

这个定律说,公司的行政组织架构,会反映在软件产品之中。举例来说,如果四个小组一起写编译器,那么这个编译器内部一定会分成四个环节。很多实证研究,都证实了这个定律。

为什么这样?原因是大公司里面,主管的地位主要取决于他的团队规模和预算。团队越大、预算越多,主管在公司里面的地位就越高,这就是为什么主管都会争取尽可能大的团队和预算。问题在于,团队变得越来越大时,你不得不做出安排,让每个成员有事可做。因此,当团队的所有人都在做一个项目时,随着组织结构的膨胀,软件的架构不得不跟着膨胀,以容纳所有的人手。

根据康威定律,大公司的大型项目一定会有复杂架构,哪怕这种架构可能是不必要的。另一方面,许多程序员崇拜复杂性,认为软件越复杂,表示作者的能力越高。这导致了这样一种状况:大公司(比如阿里腾讯)由于组织架构复杂,会做出复杂软件,然后大家认定,软件必须那么复杂,为了向业内前进水平看齐,自己的软件也必须模仿他们的复杂性。这种想法是不对的,仅仅因为阿里腾讯那样做,并不意味着你也应该那样做,他们无法摆脱复杂性,并不意味着你也需要那种复杂性。

如今的程序员与上一代不一样。计算机科学是一个艰深的领域,但是如今成千上万的程序员,可能根本没有受过正式的计算机教育。

由于开发程序变得容易了,一个人可以在知道很少的情况下完成小型程序。但这也意味着,这个人可能永远也不会写大程序。这个行业里面,你只要学会5%的东西,可以完成简单的工作,就可以谋生了。

我是在上个世纪80年代学习编程的。现在的编程就有点像,一个赛车手将一个孩子抱在他的腿上,孩子说“好吧,我也可以开车。每个人都可以开车。你只需按下绿色按钮。”

当然,在我之前几代人以同样的方式看着我。20世纪40年代,你必须拥有电气工程学位才能看到或触摸电脑。在70年代和80年代初,你只要是科学或工程专业就可以了。

你想做一个什么样的程序员,完全取决于你真正想做的事情。如果您想制作网站,那么你不需要计算机科学学位。甚至不需要学位。如果你想制作一些前所未有的令人兴奋的精彩内容,如果你想在行业中做出微小的改变并稍微改变世界,那么你确实需要那个学位。

或者换一种方式看待它:如果你想建造狗屋,只需用锤子和钉子。如果你想成为一名设计和建造摩天大楼的建筑师,那么首先要获得建筑学位。但请不要明明在建造狗屋,你却称呼自己为建筑师。

长假回来时,我意识到,一群我不知道是谁的人,正在告诉我做一些我不关心的事情。我觉得是时候离开了。

– Gmail 创造者 Paul Buchheit 谈为什么离开谷歌

计算机科学家 Tim Bray 最近写了一篇博客,他觉得自己可能应该退休了。

他列出了下面几个理由。

1、好多个早晨,我想继续睡觉,而不是起床。

2、就算起床,我想做的第一件事,是去看新闻,而不是去工作。

3、夏天到了,我想待在自己的度假小屋。

4、工作时,我的强度依然很大,不比年青时差太多。但是,结束工作以后,我感到极累,有时候连说话的力气也没有。

5、我越来越想做一些自己感兴趣的东西。它们肯定不会带来钱,但我毫不在意。

我觉得,这几个特征也许可以作为测试标准,如果你也满足这几点,可能也到了应该考虑退休,去干一点其他事情的时候了。

说到退休,这个问题对于程序员尤其有现实意义。因为程序员的退休年龄要早于其他行业,可能早早就会满足上面特征。

为什么程序员退休比较早?原因很简单,程序员的工作强度大,技术更新快,几乎不可能像公务员那样,轻松悠闲得熬到六十几岁退休。程序员其实也是机器,而且是“被操得很猛”的机器。机器都有报废年限,一旦折旧完了,就要报废。使用强度越大,折旧越快,报废越早。普通汽车的折旧年限一般是十年,长途汽车的折旧年限就短得多。为什么很少看到高龄程序员,因为他们都被用到报废了。

年轻程序员应该对自己的人生有一个规划。你的编程技能具有经济价值的年限是很短的,不可能一直在第一线编程的。折旧差不多以后,你的人生角色就会发生变化,应该多想想下一步要做的事情。

我离开谷歌的部分原因,是因为我觉得自己没有足够的自主权,我想要更小更快的东西,而不是公司让我做的东西。

– 一位谷歌员工谈为什么辞职

GraphQL 的本质是程序员想对 JSON 使用 SQL。

– 推特@kellybyte

美国一个编程培训班的老板,写了一篇文章。他说自己很担忧。现在,那么多人学习编程,他的公司全靠培训赚钱,将来会不会程序员过剩?

培训班的目的,就是让那些没有受过四年计算机教育的人,经过四个月的培训,找到一份软件开发的工作。某种程度上,这种做法是可行的,大量的程序员就是通过这种模式生产出来。

但是,人工智能正变得越来越强,终有一天,简单代码都会由计算机自已生成,低级程序员的需求将会大量减少。另一方面,云服务的兴起,使得很多任务不需要自己编程,可以购买云服务,这也减少了程序员的需求。

同时,由于不断的抽象和封装,应用层的软件开发正变得越来越简单,如果只是简单地遵循在线教程,就能编写软件,或者将一系列API混合在一起,就能做出一个服务,有必要向开发人员支付高额薪水吗?毕竟开发过程是那么简单。

他认为,学习编程是值得的,它可以帮助你理解世界。但是,梦想仅仅学会软件开发,就能解决你的人生问题是不现实的。“只是能够编写一个安卓程序,不会为你赢得竞争优势,也没法在这个超级饱和的科技世界里,获得自己的一席之地。这个世界里,每个想法都已由十位企业家在你前面完成了。”

由于其他行业不景气,大量年轻人正在转向软件业就业。但是,程序员的淘汰也很厉害,上车的人多,下车的人也多。大家应该对这一点有清醒的认识。

前几天,我听一个广播节目。主持人问,现在很多人开网约车,这样能赚多少钱,能够赚到大钱吗?

这个问题很容易回答,答案就是不能。出租车司机的收入,主要由营业时间的长短决定。基本上,一天开12个小时,就是比开6个小时,收入高出一倍。每天只有24个小时,因此收入存在上限,不可能偏离平均水平很远。

出租车是“时间换收入”的典型行业,投入的时间越多,收入越高,在家休息就没收入。很多行业都属于“时间换收入”,所有此类行业都赚不到大钱。因为你能用来交换的时间是有限的,而且进入中年以后,你就拿不出更多的时间来交换。开出租车赚零花钱,或者作为短期过渡,这是没问题的,但作为终身职业是很糟糕的。

我觉得,越来越多的程序员正在落入这个陷井,用编码的时间换取收入。只有不停地做项目,才能拿到钱。项目做得越多,收入越高。这个项目开发完了,公司又让他去干下一个项目。 忙了好几年,项目完成了一大堆,但是自己什么也没留下,以后的收入还要取决于从零开始的新项目。这样的话,你跟出租车司机有何两样,哪一天你不写代码了,不是照样没收入。

那些赚到大钱的人,没有一个是靠时间换取收入的。他们要么通过积累资产致富,要么购买他人的时间,为自己创造财富。你应该警惕,不要落入“时间换取收入”的陷井,不要只顾着为别人生产代码,而要注意积累自己的资产,以及适时开展属于自己的业务。