物业公司的困境

题图:M50园区

当我看到保安的工资这么低,物业费又还算高的时候,第一反应和所有的业主一样,那钱一定是被物业公司给拿去了,甚至被物业公司的领导个人偷偷放在自己的口袋里了的说法也颇受听众欢迎。因为除此以外想不出什么合理的解释。而当我了解了以后,最没有想到的,竟然是物业管理公司面临着这么大的困境。一句话说,如此low的物业公司,居然演绎的是一个港资公司在大陆水土不服的故事。

虽然物业公司的管理,服务,硬件,财务状况等方方面面都是很低的水平,但这个公司是一家香港著名开发商的全资子公司,此物业的管理需要从香港总部做决策。有很多匪夷所思的,不适应现状的决定,导致了本地物业经理完全没有发挥余地,员工怨声载道,内部矛盾重重,业委会和业主极度不满的现状。

四班做二休二的保安排班

以保安为例,现在的保安个人低工资,和业主认为物业费不值这个价钱的矛盾,根结在于过时的保安 “四班做二休二”制度,就是小区共设有 6 个保安岗。保安两天工作,每天工作 12 个小时,然后休息两天,一个岗位需要四个人。六个 24 小时的岗位,总共聘请了 24 位保安。

这个制度的来源是基于 20 年前港资物业公司进入大陆,严格按照 1994 的劳动法规定【第三十六条 国家实行劳动者每日工作时间不超过八小时、平均每周工作时间不超过四十四小时的工时制度。】,也就是这个制度是为了保证一个保安一周平均工作时间不超过44小时。而每个岗位都是24小时需要在岗,一周需要 24 * 7 = 168 个小时的工作时间,所以需要四个人分摊,每个人工作 42 小时,刚刚好满足劳动法规定。所以每个人都是连上两个12小时班,再休息两天。

但这是不符合现在的社会现状的。为了在上海这样的大城市,尤其是最市中心的地带生存下去,延长工作时间换取加班工资是常态。正常的保安公司是 “两班做六休一制度”,也就是每个人一周工作六天,每天12个小时,共72小时,但加班部分按照劳动法规定给予加班工资。这样就多劳多得,通过辛勤的劳动换取更高的工资。

如果保安进行制度改革,从四班做二休二,改为两班做六休一,在完全一样的岗位设置的情况下,在完全一样的预算情况下,可以用14个人完成6个岗位的24小时工作,在小区安保投入预算不变的情况下,平均每人工资可以达到6480元。这个在保安行业一定是一个体面的工资,有人离职也容易招到新人加入。

强制休假制度

类似班次这样的制度,还有强制休假制度等。香港公司要求底层工作者在每年必须把法定的年假休完,也就是说进一步的增加了保安的个人闲置时间,同时减少了收入。

香港公司的初衷是好的,提供足够好的福利给到员工,包括限制工作时间和保证休假,但这和20年以后激烈的竞争,劳动者真实的诉求是背道而驰的。保安怨声载道,只能纷纷在外面偷着兼职,而上海公司却没有能力改变总部在 20 年前定下来的这个制度。

我们几个业主还好心的提议,要不然我们自愿给服务好的保安发放小费,刚刚提出来,港资公司的严谨的作风立刻挡在了面前:私自收业主的小费是明令禁止的。结果发现,任何的创新和变通都被20年前的细致入微,“深思熟虑” 的管理规范毫无变通可能的禁止。

汇报制度

类似保安制度的不合理,在一个这么30人左右的小的物业里面,还设有专职的人事一名,财务一名,文员一名,行政主管 一名 等等各类不和业主打交道的文员。每一个岗位都有长久的历史原因。比如,财务设置的原因是为了每天向总部结账,报告所有的明细,并且接受总部审计等等等等。这些都是在上海的员工无法改变的 “公司制度”。

跨国公司的窘境是不分大小的

在一个小小的物业公司身上,我居然看到了当年 eBay,Google 这些外企在中国水土不服的通病。每一项外人看起来匪夷所思的人员设置后面,都有一套用心良苦的制度设置。这些制度曾经帮助过企业成功,却又因为僵化而阻碍了进步。

制度里面,又缺少有能力打破这个制度的人。毕竟,能够在制度的淤泥中白衣飘飘的脱离其中,并且对其进行改变的人,凤毛菱角。就连 eBay 和 Google 里面月薪过十万的名校毕业生,这样的人都不多,又如何期待物业公司的执行的员工来做这件事情呢?死锁的结果,是这艘船上所有的乘客都知道它的归宿,却没有任何人有任何办法。这对于还在船上的人来说,非常残忍。

解决之道

这个困局,最终只有通过市场的力量才可以解决。只有从源头,就是从业委会层面,在全市场范围寻求物业公司,在成本服务等的要求下,从客户方反逼,香港公司在市场的压力下,才有可能有所改变。

在市场的力量下面,要么该港资物业公司在直面竞争的时候,被迫改进,从上到下的适应市场,成为一家更有竞争力的物业公司,要么有其他的物业公司进入,降低成本,提高劳动者报酬。无论哪一种,都将打破现在的多输局面。

也只有市场的力量才可以救保安,还有这个物业公司里面的员工。

AI会让我失业吗?

在写了一点 AI 领域的 Hello World 级别介绍 以后,周末么和成远,明月还有李享几个好朋友聊天。在静安寺的咖啡馆里,我们几个思维离开了地心引力,开始畅想美好或者恐怖的未来。大家探讨的第一问题就是,未来 AI 会让我失业吗?我说,那当然。大家失去现在的职业是肯定的事儿呀,但有什么担心的呢?

农业人口

人类历史上像 AI 一样的技术进步有很多,每次都导致大量的人类失业,但人们过得却越来越好。就拿最近的农业做个例子吧。

200年前,全球的人口超过一半是农业人口,中国这样的国家在 1949 年接近 90% 的人口是农业人口。 农民朴素的认知是,如果不面朝黄土背朝天的劳作,就会饿死。因为当时人类除了手工劳动以外没有什么更好的办法批量生产粮食。

然后随着农用机械基因技术等的普及,农民的生产效率不断提高,现在发达国家的农业从业人口平均已经低于3%,甚至很多欧洲国家都低到了 1% 以下。中国从事农业的人口也降低到了20%以下。

从这个角度来来看,我们能不能说全球 90% 以上的农业人口都失业了呢?是的。他们都失去了农民这个业。他们现在工作吗?八成还是工作的,但是找到了其他的工作。

我们会失去现在的工作吗?那是当然。我们还会有工作吗?那也是当然。

生产效率提高

我认为生产效率提高肯定是好事儿。随便进入一个公司,原来看起来乌央乌央的一屋子人才能做的事情,有了更好的技术,一下子全都不需要了。这对于人类作为整体是个好事儿,但对于这一屋子人来说,是不是一件好事儿呢?

不见得是坏事。从根本上讲,大家担心的不是“失业”,而是“失薪”。

如果有人告诉你,你的工作不用做了,但是薪水照发。我想大多数人都会开心的接受。

不工作,但是有钱拿,这其实是最近这几百年的社会的整体趋势。我们这些写字儿的人,这些拿着手机傻笑的人,其实都已经受益于生产力的不断上涨,否则还看什么手机,赶紧去种地去。

现在哪怕再微薄的失业保险和养老保险,都已经让人可以吃馒头管饱。只有馒头吃,虽然在现在的社会最低级的生活,但比起我们祖辈来说,已经超过了大多数地主的生活,至少不担心挨饿。这些福利都来自于生产力的提高。

关键是分配问题

所以技术取代人力不是问题,真正的问题是,谁将得到收益。如果一屋子的人都被机器代替了,如果不加干涉的话,立刻发生的时候就是,这一屋子的人的工资都不用发了,他们挨饿,而使用 AI 技术的公司省下了工资,获利。在 AI 把蛋糕做大的好事情里面,如果分配不改变,这个蛋糕的利润将由大公司独占,这可不是什么好事儿。(注二)

经济的链条

但继续思考,这样的情形不太会发生。

一家公司的利润因为使用了AI技术大幅增加的话,市场竞争不会允许这一家公司持续保持这种超高利润,会有新的公司进入,逼迫这家公司把最终产品降价,把因为技术进步获得的利润吐出来。

一旦产品因为生产率提升而大幅降价,获得同样的商品的价格就会降低,这个降下来的价格可以说是给所有的客户发了红包。这一屋子被裁员的人的工资就变相转移到了所有的客户的口袋里。

那么这些消费者会干什么呢?原来1000块钱才能买到的基本服务,现在扣除通货膨胀因素以后变成了可比的800块,那剩余的200块干什么?他们会存起来吗?不会,他们会消费。

消费什么呢?比如看直播是可能是一个好主意,还要打赏主播100快呢。这些主播是谁呢?说不定就是最早被裁员的那一屋子人中的一些,他们找到了新工作。生产率提升而导致的失去的工资,就这样流了回了自己的口袋里。他们失去了每天朝九晚五枯燥的生活,或许得到了更加轻松的工作。

劳动鄙视链

如果我们冷静的看这个世界,按照劳动的直接程度,只有农业从业者才是真正养活了人类的。人类作为一个物种,只要吃得饱,其实并不需要什么。而除了吃得饱的所有的一切需求,都是因为生产力提高了而产生的。

农民会对工人会说:“你们又不种粮食,就在那里按几个按钮,为什么挣得比我还多?你们那不叫劳动” 。

工人会对服务员说:“你们又不生产东西,就天天空调房里面,端个咖啡就能挣得比我还多?”

服务员甚至可以对网红说 “我至少还对社会做出点有形贡献,你们就在一个直播间里面唱唱歌跳跳舞,没有丝毫的贡献,为啥挣得比我多?”

至于大多数文职人员,尤其是CEO们,不就那个PPT写写说说吗?产生了什么呢?是不是我们都被那 3% 的农业人口养活了呢?

在这个假象的鄙视链里面,你有没有发现,其实我们从最需要付出劳动却没有什么创造力的工作中不断的升级,不断的进化到了需要大量的创造力,却不需要付出原来那么多劳动的工作?

那么原来那些需要劳动的工作哪里去了呢?都是由技术代替了,由不断提升的生产力代替了。

高级劳动

什么是高抽象劳动(不用搜索,这是我刚刚造出来的一个词)?

在模拟城市的电子游戏里面,决定哪一块应该开发农业,哪一块地应该开发工业,只需要鼠标一点就完成了,系统自然会派出农民和工人把这些劳动做完。这些相比汗滴禾下土的工作来说就是高抽象度的劳动。如果没有科技发展,我们只能由大量的人(比如几千人)从事低抽象度劳动,而几个人从事高抽象度劳动。

随着科技的发展,农民的工作被机器取代,而这些农民的一部分,升级成了更抽象的劳动,就如同打电子游戏一样指点一下江山,机器就帮你把田种了。现在连这种抽象工作,就计算机都可以做了,那么人类可以做更加抽象的工作。

人还是会工作的,只不过升级了。

AI 统治下的未来

AI 统治之下,低抽象度的工作悉数被取代,这个命运只是时间问题,而以前没有可能发生的高抽象度工作将会诞生。现在上一代人看不惯的网红经济,电竞产业,这些都是只有在低抽象度工作的生产力不断提升的前提下才有可能。你能想象在饥荒年代有网红经济吗?

未来我们的现有的工作都会被取代,就跟200年前的农民的工作会被取代一样,但不必担心,自然有更高级的工作诞生。我们现在看起来毫不创造价值的那些工作,很有可能都会成为主流。

综上所述,我对于 AI 的发展是抱有极大的乐观态度的。我们终将失去现有的工作,而这是我们拥有更好的工作和更高的社会福利的前提。

注一:我得出这个结论其实是违背科幻小说家Douglas Adam的科学三定律的。他说:“1)任何在我出生时已经有的科技都是稀松平常的世界本来秩序的一部分。2)任何在我15-35岁之间诞生的科技都是将会改变世界的革命性产物。3)任何在我35岁之后诞生的科技都是违反自然规律要遭天谴的。” 而我,已经超过35岁了。但只要经过一些努力,还可以像15岁一样,对科技保持乐观。

注二:政府需要关注的事情是,如果完全不加干预,在 AI 领域,有可能一家公司获得的巨大的优势在自由市场上也能够阻止其他厂家的进入。因为AI的核心是数据,当有了足够多的数据可以帮助他们改进算法和服务而获得更多的数据。这种近似于数据垄断的情形是需要被控制的。

答案公布:船是怎么起锚的

对于这个问题《船是怎么控制抛锚还是起锚呢?》,当教练跟我说了这一句话的时候我就豁然开朗了。

“ 把锚放入水中的时候,放进去的绳索要是水深的 5 – 7 倍 ”

哦。那就全懂了。

原来船锚不是垂直放下去的,而是拉着长长的线,以至于由于绳子的重力,到了最后基本上贴在海底,成为水平的状态了。

帆船的锚绳是麻绳,而靠近锚的那一段故意使用很重的铁链子,更加确保最后的一段是完全水平的放在海底。

如果是横向的拉锚的话,锚的尖尖的爪子,就会深深的扎入海底的沙石里面,拉力越大,埋得越深。有一些犁式的锚甚至会整个锚都埋入沙子中,只留铁链子在外面。

起锚的时候就容易了,慢慢的收锚绳,锚就从水平变成垂直。沙石对于垂直的锚就跟浮云一样,没有一点钩力,很轻松的就拉起来了。

当然这里也就顺便知道了另外一个冷知识,就是船的锚都在船头,而不是船尾。因为锚并不在船的下方,而有可能是很远的地方,而船被稳定的洋流/水流朝一个方向飘去,直到被锚钩住。

几个在船上才知道的冷知识

几年前在学帆船的时候发现了几个冷知识,很有趣,分享一下。

第一个是海里。既然已经有公里,英里,为啥还要有海里这么个计量单位?仅仅是因为历史原因不愿意改了吗?并不是。海里在导航上有天生的优势。

海里的定义是根据地球来定的。人们把地球的经度线上每一度的1/60,也就是一分,定为一海里。如果把地球当作一个西瓜,一切两半,那个刀口的边缘就是360度的一个圆。这个圆的每一度(Degree)的 1/60 是一分 (Minute),这一分在地球上的距离,就被定义为一海里。

在海上,一片茫茫,啥都啥都看不到。唯一能够导航的就是星星。各种导航最终都是一个角度问题,而角度直接就可以换算成海里。同时,时间在航海的维度也是一个角度问题,海里把时间,距离,星空等等方便的统一在了一起。

顺便了解了一下古代航海家是怎么导航的。

得知自己的纬度其实很容易。只要看一下北极星在哪里就可以。北极星在地面上的角度就是自己的纬度。如果你发现北极星在正头顶,你就是在北极无疑了。我在上海,那么北极星一定在地平面以上 31 度左右,亘古不变。

难的是经度。怎么知道自己的经度呢?太阳,星空,所有的东西每天都在变化一个周期,了解自己的经度在历史上都是难题。

后来最简单的方法就是借助时钟。在18世纪的时候,总算有了精确的表,这样大家就可以在出发前把表校准到格林威治时间。然后只需要观察当天太阳最高的时候自己手表的格林威治时间,通过这个时间就知道自己的经度了。也就是每往西经度的1度(也就是60海里),时间就会差15分钟。一个小时就是4度。

比如,如果当地正午的时候是格林威治时间的下午3点,你就知道自己在西经 12 度 (4 * 3)。

这也就是为什么那么多经典的瑞士手表都有航海款的原因,因为时间,就是位置。准确的时间就是航海时代的生命。

船的速度单位是节(Knot),一节等于 1海里/小时。叫节的原因还真的是因为绳结。在海上,水手有没有什么参照物,船上也没有速度表,水手只好把一块系着打好均匀的节的绳子的大木头扔到水里面去,然后数数记时间。过了一定的时间以后,看放下去的绳子上总共有多少个绳结,就知道自己的速度是多少节了。

有了海里还有节做单位,海上航行就很容易。

比如我现在在东经 120 度,我要到东经 125 度, 那就是5度的差异,换算到海里就是 300 海里 (60 * 5)。如果我现在船速是 15 节,需要 12 小时(300 / 12)。多容易!如果用公里的话,从经度换算到纬度虽然不困难,但很麻烦。

用海里,地球的周长就是 360 * 60 海里 = 21600 海里

说到这里不得不提另外一个冷知识,地球的周长用公里来衡量是40,000公里 (最小 39,940 公里,最大 40075 公里),这个数字不是巧合,因为最早的一公里是定位为北极到赤道的距离的万分之一为一公里。现代科技怎么都离不开我们在的这个球。

除了用海里,还有几个有趣的观察,比如东西方的差异。我发现在船上有个术语,叫 Shipshape。教练总会要求大家保持 shipshape,就是把所有的东西放到该放的地方,保持整洁。这个词如果在中文里面找到对应的话应该是“井井有条”。一个井田制的农耕文明对于整齐的定义和一个大航海时代的海洋文明在用词上面就很不一样。

另外一个观察,就是船上很少用左右,比如不叫左舷,右舷,而有专门的名字,面向船头的时候左边一侧叫做 Port,另外一侧叫做 Starboard。

这个用意是很明显的,因为在船上,尤其是紧急的情况,左右很容易搞混,因为会随着观察者的方向变化,而 Port, Starboard 永远不变。Port 用红色灯,Starboard侧用绿色灯,远远的就可以知道远处的船的航行方向。

说到这里又牵出来更多的一个冷知识,就是飞机在机场为什么都是从左侧上下客的。飞机两边都有门,但右边的门很少使用。这个也跟大航海时代有关。早期的船是拿船桨当舵在船尾控制方向的,而大多数船员都是惯用右手,所以右边就叫  steer board,现在叫做starboard了。而如果舵在右边,船从左边靠岸容易很多,而左边就叫做Port,上下货物用的一边。而飞机也沿用了这个传统,从port边上下飞机。

船上能够学的东西很多,但最有趣的就是了解一个航海文明的很多的思维方式。一艘船就像一片土地一样的在西方的文化的深处。

而我,脑子里面总是喜欢装满这些有趣却无用的知识。把这些知识吃进脑子里里面再传播出去让我觉得很快乐。有的人呢,就是这样,属于天生的喜好,被根植在基因里面的吧。

为什么说读代码像读小说?

来, 随手那一小段 anime.js 的代码。看其中最简单的一段:

 str: a => typeof a === 'string',

这一句,就看得出作者遣词造句的能力。

比如,他用了三等号,就是 === ,而不是双等号 == 。这两个相等运算在这里都是可以使用的,运行结果其实是一样的,但是三等号更加准确的表达了这里作者想意图,就是要“严格相等,不仅仅值要相等,类型也要相等”。

类似这些,随手可见。细小的地方,看起来赏心悦目。而很多不严谨的代码,计算机执行起来没有问题,但是用词不够准确,总有帮他改正确的冲动。

再比如箭头函数的定义,还有 const 的使用。这些都是 ES6 的新方法,把原来的复杂的函数定义变得更加简洁,而作者也就很快的把本来需要好几行的代码变成了简洁的一行。

另外一个值得注意的,是一种类似排比的写法。本来判断一个变量是什么类型是一个相当琐碎的事情,因为正如这个函数写的那样,不同的类型用了完全不同的方法(这也是JavaScript不够优美的地方),判断是不是 数组要用 Array.isArray( ),而判断是不是字符串则用了完全不同的方法。

而这一小段代码搜罗了各种需要判断的类型,然后封装在一个轻巧的小函数里面,一段原来需要写做这样的代码:

if(stringContains(Object.prototype.toString.call(a), 'Object')) dosomething();

变成了

if(is.obj(a)) dosomething;

并且统一了所有的类型的调用。

同时,他还用了三个字母的代码来代表各种不同的类型,这三个字母的命名方式和国际机场的三位字母代码有异曲同工之妙,让代码简洁,整齐。不知道是不是只有我,我看着从上到下整齐的那一竖排 a ,还有像军队一样的 => 就有种莫名的兴奋。

这段代码很像一个勤劳的家庭主妇,把家里孩子乱七八糟的玩具收纳到一个个抽屉里面,然后在上面贴上漂亮的标签,从此家里就一下子焕然一新。这样的小代码为什么不放进标准库里面呢?

这就是代码的美感。一种能够建立一个接口,把因为历史原因而产生的复杂性屏蔽起来,从而在自己的世界变得一切都井井有条,shipshape 。

这段代码函数的顺序也很有讲究,就在这几行里面,前面定义着,后面立马就是用起来:

const is = {arr: a => Array.isArray(a),obj: a => stringContains(Object.prototype.toString.call(a), 'Object'),pth: a => is.obj(a) && a.hasOwnProperty('totalLength'),svg: a => a instanceof SVGElement,inp: a => a instanceof HTMLInputElement,dom: a => a.nodeType || is.svg(a),str: a => typeof a === 'string',fnc: a => typeof a === 'function',und: a => typeof a === 'undefined',hex: a => /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a),rgb: a => /^rgb/.test(a),hsl: a => /^hsl/.test(a),col: a => (is.hex(a) || is.rgb(a) || is.hsl(a)),key: a => !defaultInstanceSettings.hasOwnProperty(a) && !defaultTweenSettings.hasOwnProperty(a) && a !== 'targets' && a !== 'keyframes'}

pth( ) 基于 obj( ) 的判断来定义,dom( ) 用到了 svg( ),而 col( ) 用了前面的 hex( )rgb( )hsl( ) 。。。。这样子一步步渐进,每一步都清晰的在前面一步的基础上再走一步,这个过程就好像东野圭吾的小说里面的一个悬念上叠加一个悬念,直到把这一整段代码看完了,才知道整体的构思。

这一段代码是我在看 anime.js 的时候随手拿来的,因为相对比较完整,但更精彩的是在整个架构的设计和组合上面。

作者用了最少的代码量把互联网上散落各处的缓动函数(easing function)等等功能都统一化以后放在自己的小工具箱里面。看得我眼花缭乱,深感功力很深。

除了《如何判断一段程序是否优美?》提到的短以外,每个函数如果很短也是优美的体现。以 anime.js 为例,里面大多数的函数体都是三行语句以内,甚至最多的都是一行,直接返回,就如同题图的那段一样。就是这样的每个函数只加一点点功能,然后不断的组合,就完成了复杂的功能。这个和我们一直喜欢的乐高是概念,就是用最小的相同的小块,不断的重复的构建出任何想要构建的结构出来。

看代码如小说

看代码,就像看一部小说,有好的,有差的。不幸的是,除了文笔特别差的小说,很多小说需要花时间看完结局,才知道是不是真的好看。代码在这一点也很类似。虽然看一小段就知道个大概,但如果真的想评估的,还是需要耐着性子看下去,看到最后才能有更准确的判断。

如果有人把代码像小说一样进行推荐就好了,可以让除了计算机以外的人类,也可以享受阅读代码的乐趣。

为什么要读代码呢?阅读代码最大的好处是学习。别人的遣词造句的方法,组织段落的方法,甚至函数命名的方法,都是可以直接借鉴,用在自己的代码里面的。

熟读唐诗三百首,不会吟诗也会吟。代码届也是同样的道理。建议希望写出优美的代码的同学,应该没事儿读几段优秀的代码,绝对比写代码的时间更划算

如何判断一段程序是否优美?

我喜欢的美好的东西,看似相隔很远,比如写文章学习西班牙语绘画,还有编程,却有着相同的本质 — 使用一种简练的最基本的元素构建一个世界。可以像文章一样被读懂,西班牙语一样被听懂,像绘画一样被人看到,像程序一样被执行。

Paul Graham 写过一本书《黑客与画家》,细致精确的描述了绘画和编程的相似之处,他把程序员画家作家建筑师作曲家的本质提炼出来,称之为 maker – 就是建造者。

我是一个从骨子里面喜欢建造的人。这就是我如此喜欢写作,喜欢学习语言,喜欢绘画,并且喜欢编程的本质。

对于今天问自己的这个问题:如何判断一段程序是否优美?在有可能想到的所有的指标中,我毫不犹豫的断言,就是看完成同样的工作,越短的代码,就是越美的

在我创业和架构程序的过程中,我曾经信奉 帕斯卡 的一句名言:“我亲爱的朋友,如果我有更多的时间,我就可以给你写更短的信 ”。几百年后马克吐温也说了类似的话:“我实在没有时间写一封短信,所以我写了封长信给你”。  

抽象,封装

对于程序更加如此。如果有时间,建构者总可以找出更好的抽象,更好的封装从而大幅度的减少代码的长度,并且代码会变得更加清新,更加美丽。

简单的例子,初级的程序员会用

print(0)print(1)print(2)print(3)....print(99)

一边加班写,一遍抱怨工作量大,而且还经常这里少了个数那里多了个数,把更多的时间花在修bug上,而高级一点的至少会用

for i in range(0, 100)  print(i)

代码量减少但是功能并没有减少。但大多数的程序员都停留在了会用判断( if .. else ),循环( for )为止,更加通用的封装,设计模式等都还远远没有进入大家的视野,所以写出来的代码好长好长,比写代码更痛苦的是看这些代码,味如嚼蜡。按我的经验,一般来说写出来的第一遍代码,如果花时间重构和改进,打磨好的代码一般可以减少到 一半 甚至 1/3 以下的代码量。体系规模越大,压缩的比例越大。

曾经听很多公司炫耀自己有几百万行的代码,其实作为有品位的程序员,对代码的长度是有洁癖的。我们曾经技术团队每天要发一个报表,把每个人写的代码长度排名的,代码量最大的一个需要停下来重构程序,直到把巨长的代码重构到第二名以后才可以继续开发新的功能。实验证明,这总是可行的。

眼界

同时代码的长度也基本上代表了一个程序员的眼界高低。在浩如烟海一般的程序库里面,通常已经有一些可以完成相同功能的函数,甚至是内置语法,使用这些语法,就可以用一个函数省去很多行代码。这就像会使用成语,典故的人写出来的文章,就是可以用少得多的字描绘出精准的多的意境。

语言也是函数

想到这里,我们随便举个英语学习的例子。不知道大家是否也和我注意到语言的函数嵌套性。look 是看的意思。如果词汇不够,说到“盯”这个意思,就只能一次一次的用 look fixedly 这两个词,而不会用 stare 这个难一点的词;而要表达出与惊讶的凝视,就只会用 stare in suprise ,而更优美的说法就是

 gaze 。。。。如果不知道 gaze ,就会写出这样的语句:I looked at him fixedly in suprise

每一个单词就是一个函数,是前面的简单的语义加上形容,组合,转意以后形成的一个新的概念,并且定义为新的函数。东施效颦,夜郎自大,名落孙山,掩耳盗铃 等等成语甚至把一个故事浓缩成了四个字。使用这个成语就可以省去几百字的过程描述。合理的使用这样的历史上定义过的函数的语言,是美的。

程序有着比语言容易得多的扩展性。现代语言如果想发展,有着巨大的惯性,现代要发明一个成语,不仅需要有人创造,而且要有巨大的力量(例子:这里是不是改成洪荒之力可以少一个字但是表达了形象的多的意境呢?)才能让整个社会都学会这个新函数。而程序里面自己可以随时定义新的函数,定义以后立刻就可以使用,所以制约程序员写更短的代码的,就只有程序员的思维能力和见识了。

之所以有此感触,就是因为今天读到了 anime.js 这个只有1000行代码的 JavaScript 动画库。它用了几行就实现了让我难以想象的复杂算法和功能。读起来如小说般引人入胜,甚至有的时候会心跳加快。深深的感慨,一个优美的程序就是这样可以用最短的语句表达尽量多的功能,同时体现出令人惊讶的美感。

中医科学吗?当然不科学了,人家是技术

我最近形成了一个自创的三分法世界观。有了这种三分法,我可以心平气和的和更多人聊天了。

我把世界分为:科学,技术,和文学三个范畴。


科学和技术



科学和技术的分别比较清晰。科学用系统化的,定量、实验的方法寻求世界运行的规律。而技术是为了达到一定目标的而发明的方法和工具。

技术为了达到目标而努力,而科学被好奇心引导,希望去了解背后的规律。我想过桥,所以造桥就是技术;我想有餐具,制陶就是技术。而科学并不保证发现立刻有什么用处,仅仅就是想研究。技术和科学,差不多是知其然和知其所以然之间的关系。

我们如果搞混了科学和技术的区别,把技术的活,用科学去衡量,就会吵架。


技术

一个危险的会导致立刻友尽,取关,互删等不良后果的话题是,【中医科学吗?】

当然不科学了,因为它是技术范畴呀。

在我的这个定义下,我发现中医还有烹饪就是典型的技术成分大一些,科学成分小一些。而且从这个维度,中医和烹饪简直像极了。


铁锅一口,加油到沸腾,加葱姜少许爆炒,可以提味。

这个食谱跟这个药方:


生姜,不拘多少,捣取汁,入铜锅内熬浓涂患处,觉热辣难当,即愈。

难道你不觉得形似,且神似吗?

从做出来好吃的饭,还有能够治一些病的角度,中医和烹饪都是技术。


技术,但不是科学

就拿这个食谱为例子分析一下:

铁锅一口,加油到沸腾,加葱姜少许爆炒,可以提味。

这个技术管用吗?请不要用科学不科学来解释,只说管用不管用,我的经验是,管用的。不加葱姜味道缺一点香味;没有爆炒,香味的确出不来。

它科学吗?

如果真的要用科学来解释,我们得先有化学,知道葱姜,油,铁锅等的化学成分,然后研究这些成分在高温下发生了什么化学反应,产生了什么新的物质。然后需要高度发达的医学,来理解这些物质是如何被舌头的味蕾感知的,被鼻子的嗅上皮细胞捕获的,还要研究脑神经科学,这些四面八方的刺激是如何形成香的感知的。更要研究心理学,到底香是一种什么样的感受?你感知到的香到底是8分香还是8.5分香?这种香在心理层面是又哪些维度组合而来的?

这一圈全研究明白了,估计要再过一个世纪,要创立很多新的学科,才有希望。但是!在这些还没有研究明白的时候,并不阻碍山洞里的原始人围着篝火,把不知某处采摘的胡椒放到刚打回来的羊肉上,并且享受一餐更鲜美的美食。

我们周围有太多的无法用科学解释但是有用的东西,越是日常的东西越难准确的较真的用科学解释。但这不阻碍我们使用这些技术。

东方曾经有着领先世界的技术成就,而在科学领域的发展就没有西方那么成体系。所以东方传统的很多东西,如果用“是不是科学”来衡量,都不怎么科学。但是从是不是有用的角度,八成是有些用的,否则既不科学,又没有实际用处,还传了这么多代,留着它干吗呢?


文学

接下来要进入的话题就更加危险了。我把既不能放进科学,也不能放进技术的部分,也就是只存在于人的意识之用的部分,都统统放入文学这个范畴。文学这个词不准确,但是很形象,大家就当作 “像文学一样的东西仅存于人的意识之中的” 来理解就行。


我作为一个硬核理工男,是很招人讨厌的那种,总想把一切都放进科学体系里面,希望用计量,逻辑来理解世界,结果总会把天聊死。自从我开始用文学角度去理解的时候,忽然间豁然开朗。我接触到的宗教呀,意念呀,甚至占星呀,一下子就进入了我的脑子,和我内心的那个理工男和平共处了。


数学就不是自然科学

为了和我一样的硬核的理工男感觉好一点,我先说明,数学,就不是科学。或者更准确的说,不属于自然科学,顶多算形式科学。而在我的划分里面直接就归了文学体系。

之所以能想明白数学不是自然科学,是从复数开始的。根号负一,我们都知道这是想象的一个数字,不存在于自然界。根号负一不存在我们都可以接受,1,2,3,4,5 这些数字难道就真的存在于自然界吗?

我看到桌子上有三个杯子。这三个杯子是存在的,但是 3 这个概念仅仅存在于人类的脑子和意识里面,并不存在于自然界。曾经看到一本书,说文明的进步一个很重要的标志就是把数字从表达中分离出来。以前甲骨文一个



字,代表的不是羊,而是

一只羊

的意思;我有三头羊,就需要

羊羊羊

来表示,字和自然界的物一一对应。直到很后来大家才发现,可以把羊抽象出来,把这样的东西都叫羊,而不仅仅是这一只;然后把三也给抽离出来,把这么多的东西都叫三,而不仅仅是羊。这样用三这个抽象的概念和羊这个抽象的概念纵横组合,才形成了现在的三只羊的概念。

如果连数学都是文学范畴(仅存在于人的思维中不存在于世界中),我们对于那些看似不存在的东西就有了极高的接受度。


小马过河

是文学。它是真的吗?不是真的。它科学吗?和科学没关系。它有用吗?有用。只要有用,拿是不是科学去衡量万物属于抬杠。

以占星为例,以前我觉得彻底不科学,但是如果有人用它来对内心的世界进行表达,计量,交流,并且对于未来的发展趋势进行分析,你就把它当作一个很好用的小马过河就好。不要那么较真是不是科学。


上课前要先搞清要上什么课

最终我发现了,人和人交流需要有基本语境的对齐。这就好比上课之前要先搞清楚自己走进的是什么课堂。

今天上的是历史课还是文学课?如果我以为是

历史课

,结果老师发了一本封神榜下来,而且开始跟我讲哪吒和姜子牙,我一定怀疑是不是我疯了就是老师疯了。我会问老师哪吒哪年哪月在哪里出生的?有没有出土文物可以证明哪吒生前在哪里活动?老师也一定觉得这个学生没法教了。

这个冲突如果不对现在是上什么课这个问题澄清之前,根本无法调和。而现实中,大家常常对这一点差异毫无感知,结果天就没法聊了。

如果告诉我现在上的是文学课,尤其是和一群诗人一起上课,我会放下我的科学与否的有色眼镜,用文学课的语境和他交流。即使一个人说他用 “位于右肩膀上的眼睛看到了绿色的太阳从西方的地平线上冉冉升起,天空中飘满了玻璃球馅儿的包子”, 我都不会生气的,因为我知道他正在他的意识世界里面构建一个世界,并且真心的希望表达那个世界,并且让我认识他的那个世界。而我,必然会心悦诚服的接受这一个只存在于他脑子里的那个世界。

希望这篇文章可以拯救一些你周围像我一样无可救药的喜欢跟人抬杠的理工男。