Blog

让体系发生碰撞——浅谈一种可以更客观地分析问题的思维方式

  前一段时间有个问题很火,大意是说“大肠”和“装过*的碗”具有同样的属性,为什么人们会觉得洗净之后的前者是干净的,而后者是脏的。下面的回答从许多种角度分析了这个问题,其中有一个角度提到了“锚定效应”,对于大肠和碗我们有不同的锚定点(类似于参考基准),所以可以得到不同的结论。而这个问题,等于把两个锚定点放到了一起,从而引起了一定的认知混乱。
  一个锚定点,确定了一个事物的标准,也就决定了一套评判体系。一套体系自身是稳定的,可以快速给对象一个定位辅助人们的决策。而一旦把两套体系放到一起,它们会互相干扰发生碰撞,评判结果会被极大地干扰。由于锚定效应在生活中十分普遍,体系的碰撞也无处不在,典型的比如坏事做尽却偶尔行善恶人和老实本分偶尔作恶的好人会得到截然相反的社会评价——虽然大部分情况下人们并没有意识到这一点。
  从一个锚定点出发的评价体系是十分主观的,因为锚定点本身捉摸不定,可以是任意值。如果评价体系过于主观,我们在决策的时候很容易忽视重心,舍本逐末。比如因为有两块钱的公交存在,你就会觉得需要花十几块钱的出租车不划算,然而通常情况下出租车能为你省下大量的时间。而如果主动让体系发生碰撞,我们就可以从多种角度来分析问题,并且尽可能地去除主观因素的影响,更客观地分析问题的方方面面。
  让不同的体系发生碰撞,首先我们需要把不同的体系通过某种规则换算同一起跑线上。最常用的媒介要数金钱和时间了。以前玩手游的时候有一次手一抖浪费了30石头,瞬间觉得损失巨大。但是冷静下来把这30石头换算成现实金钱之后,这一块钱不到的损失也就根本不是什么大事。而地精有句话说得好——“时间就是金钱”,金钱和时间可以通过“时薪”这种东西来相互换算,可以得到一些更疯狂的结论——比如离办公地点远的地方虽然房租便宜,但是如果带上交通时间换算的金钱成本,很有可能比直接租附近的要贵得多。
  当然,这种通过换算的方式会丢失很多信息,现实中的决策绝非单一尺度可以左右的。因此这种思维方式更多地是提供一种相对客观的参考,防止我们在不知不觉中受到主观因素的干扰。该重视主观感受的时候还是要重视的,“千金难买爷高兴”。
  对于我个人来说,这种方式应对一些小的负面情绪很有效,因为它们通常是在极度主观的环境下让我觉得难受。除了上文提到的丢了30石头,还有昨天在没弄清楚情况就甩锅结果丢了人的窘境——如果我把它放到人生所有羞耻的事情里,简直不值一提。

结构美感——谈一种个人审美

很久没更新了,随便写一点。
一直以来很喜欢一些复杂而精妙的东西。复杂表现在零件多、内容丰富,而精妙表现在结构的条理性、设计的巧妙性。而其中我最为看重的,就是设计上的巧妙。
什么样的设计叫做巧妙呢?在我的理解中一个很重要的地方在于一个元件的多功能性。Engineer Guy 曾介绍过一种咖啡机的设计,为了节约成本,仅用一个加热元件同时起到加热液体和抬升液体的作用。这种复用十分巧妙,也十分戳中我的审美。
然而并不是说只要元件的复用就可以,这样软件领域到处都是“精妙设计”了。还需要考察的一点是实际作用与其本来作用的偏离性。除了上文所说的咖啡机,早期游戏机(我不确定是否是FC)中没有专门的图像处理模块或者说显卡,而声卡是有的。听说末期有些游戏会利用声卡来辅助图像的计算,这也是一种十分巧妙的复用,一种对功能潜能的压榨。
这种审美持续影响着我,而我的眼光也渐渐脱离传统的机械或者电子设备,开始关注一些艺术领域的东西。
含有情节的艺术形式(小说、话剧、电影等)中的“线索”则首先开始挑逗我的神经。我们知道线索往往贯穿一段很长的故事,并且多次出现,这本身已经是一种跨时空的材料复用了。而线索往往承担着更多的作用,比如作为读者理解文章核心思想的关键突破口,或者揭示故事中未明说的隐藏情节。我十分享受在各种故事中寻找线索(虽然做得并不怎么样)。
在写了这么长的铺垫之后,让我来谈谈今天最想讨论的部分——音乐的结构性如何完美地戳中我的审美。
音乐是一种十分抽象的艺术形式,就像是人类头脑中想法在另一维度上的投影。如果说音乐的情绪对应着人类感性的部分,那么音乐的结构性则昭示着理性的严谨。
先来看看大结构。你也许听说过“奏鸣曲式”这个词,或者你也许听过《赋格的艺术》这部不朽的作品。即使是未经训练的普通的人,我相信也能从中听出片段的重复或者说再现。这种重复即主题的重复,或者用更宽泛的说法——材料的重复。动机是音乐中十分重要的一个概念,主题(乐句)由动机发展而来,音乐由主题发展而来,动机和主题则都是材料。而运用这些材料的方法则正是通过各种变形让他们在作品中多次出现。更多的介绍和讨论可以参考我以前写的《浅谈游戏背景音乐》
拿起放大镜,音乐在细微结构处也表现了许多精妙性。音乐不是静态的,是随着时间一直在变化的,而变化的过程中,每个音符既与同时发声的其他音符相关联(和声性质),也与前后共同组成旋律线条的其他音符相关联(旋律性质)。这种多重性质已经展现了我上文所说的结构的精妙性。因此对我来说,仅仅只是分析别人的作品就已经很满足了。我从去年年底开始才摸到点门路,然后就像发现了宝藏一样,比如我曾因为布格缪勒25首练习曲中的一处平行六度转平行三度中间插入的减五度兴奋了半个多小时。
这种个人审美似乎极大地压低了我的音乐审美的要求,似乎随便一个片段就足以让我分析和享受很长时间。不过我觉得我现在还是在一个少见多怪的状态,或许见得多了审美提高了之后我会有更独到的见解,享受的阈值也会随之提高。

为什么我玩STG得不到快乐

三天前,我接触了Zeroranger,这是一款好游戏,我十分兴奋,也玩得十分开心。而今天,我从账户中彻底移除了这款游戏,在还没有通关的情况下。
因为在游戏的最后,我陷入了深深的自责、痛苦与绝望,对我而言继续玩下去已经得不到任何快乐了。在最后一次挑战最终关卡失败后,我为了不让自己陷入更加负面的状态,选择彻底离开这款游戏。
而那之后,我开始思考一件事情——为什么一直以来我玩STG都得不到快乐?
七年前,我第一次接触东方正作,之后也去玩了其他各种类似的弹幕纵版卷轴STG。虽然接触得很早,但是我并没有长期、集中或者刻意地练习过,水平似乎从来没有什么明显的长进,以东方正作为例,大概是在需要少许背板、少量失误(主要指抱B撞)的情况下可以通关N难度的水平。CAVE社的作品的话单币大概能到四面,当然大复活比较特殊,巅峰的一次A机一币通关。现在想来,那一次大概是玩STG以来最为高兴的的一次,毕竟多次神穿让结果超出了个人水平。
除了那一次意外,我对STG再也没有什么好的印象。能记起来的,只有无数次后悔、遗憾和功亏一篑。印象最深的一次大概是东方风神录。我在连续尝试了三次,每次都将更多的残机带入麻将山的情况下,仍然倒在神奈子的威严之下。当时气急败坏的我写了一篇文,批判麻将山难度太高,难度梯度陡峭。
为什么我玩STG一直得不到快乐,其中一个重要的原因是,单局游戏的流程太长了。这种长不仅体现在时间上,更是因为高度集中的注意力会消耗的更多的精力——我很少连续玩2h以上的stg。
而STG是一类十分讲究规划的游戏——游戏过程中你会有数个残机,每个残机带有数个Bomb(以下按惯例简称B),你最多总共可以使用的B数是你的资源,即是你的容错次数。而玩家要做的也就是在资源消耗完之前通关。这种仅以通关为目的的打法又称混关,正常的流程是,玩家需要通读全文,确认哪些地方是自己的难点,各需要用掉几个B,做好规划,避免失误。当然失误总是难免的,因此规划也得预留一些防止失误的B。然而这里有一个问题——如果你未能在MISS(包括MISS的决死时间)之前按下B,你就连带着剩余的B一起丢掉了这个残机,又称“抱B撞(弹)”,这种失误会让你一次失去多个资源,是必须要避免的情况。
因此,在正常的混关流程中,一旦抱B撞,几乎就等于失去了通关的希望,难度大大增加,这种情况除非你之后数次神穿(等于是该用B的地方没用,省下来一个),否则都可以直接重来——换言之,功亏一篑。对我而言,这种功亏一篑带来的挫败感极强,基本上碰到这种情况后,我会直接关闭游戏而不是重来——因为心情十分糟糕。这也是我没有大段的玩STG的时间的原因。当然东方正作里有一个例外,即采用了大量checkpoint,彻底改变了传统逻辑的东方绀珠传。每次只需要考虑一小段难点怎么过,可以无限尝试。这种模式十分没有压力,让我最终花费数小时通关了H难度。
我不知道是因为过于敏感还是怎样,这种“差一点成功”对我的打击巨大,让我陷入数小时的自责中无法自拔:“如果当时早一点按下B就好了”。而如果我先经历一次“差一点”,再去打下一次,成功了,我也没有任何的成就感——因为我觉得这是我应得的,甚至觉得没有一次就成功本身即是一种耻辱,而成功本身也就不值一提了。
在这种心态下,我渐渐地很少玩STG了。在过去的三年内,我只玩过怒首领蜂大复活,这是一款自动B的STG,因此不存在抱B撞,我只需要专注于躲避子弹即可。最新的东方正作我也只玩了只有前三面的试玩版,之后的正式版我已经没有勇气去面对了。
然后,时间来到了2018年10月8日,我购买了Zeroranger。这是一款制作十分精良的STG,除了一些小毛病以外我觉得处处的设计都值得打高分。一开始我也玩得很开心,因为难度开头的难度大概略低于我的水平,恰好能在游戏过程中略微收获一些成就感。然后,对我来说2-4的地狱来了,我重试了无数次,都难以击破这个boss,仿佛游戏的难度瞬间升高数个等级,再加上推荐的人却都表示这里并不难,我开始陷入自我怀疑。
中间休息了一天,而最后,在我的心情几乎到了低谷的时候,我终于发现了问题所在——武器3也就是蓄力武器的消弹能力远比我想象得要强大。我之前从来没有考虑过使用它,因为在我的概念里,消弹在STG里是禁忌的存在,因为破坏了弹幕的完成性,弹幕的威胁也就不复存在了。我原先听说过3能消弹,但我擅自以为只能抵消一个并且有很长的CD,所以一直没有考虑用,而是照旧按我的理解,底力硬扭。然而实际上,3可以抵消大量的子弹,并能够免死一次并提供数秒的无敌,虽然之后会过热,但是恢复也很快。发现这一点并没有让我很兴奋,相反,我很沮丧,因为这不是传统STG了,而认识到了这一点的我,也可以很轻松地过2-4。一直以来攀登的山峰轰然倒塌,而在山上本已经失落的我更因为失去目标而伤心到了极点。
我终于进入了最终战,这是一个近战STG,大概只要躲避弹幕并到达某个地点即可。虽然没有什么的难的,但我仿佛已经无心游戏,虽然带着五币化成的五残进入,还是失败了。之后,我陷入了彻底的绝望,从账户中移除了这款游戏,我再也不想见到它。
Zeroranger是一款好游戏,而我最终并未从中获得快乐,着实可惜。一来是我过于自大,自以为对STG足够了解,对这个并不是那么传统的STG中未知的部分进行擅自的脑补,二来是我太菜,无法顺利扭过2-4。如果我更强一点,或这个更菜一点,也就是从来没玩过STG,我想我应该都能很好地享受这款游戏。
结束之后,我一直在反思——为什么我从STG中获得不了多少快乐。挑战高难度的游戏的快乐多源于成功后的成就感,然而STG的成就感对我来说仿佛是遥不可及的东西——很多时候即使通关了,我也并没有享受到快乐,但如果失败了,那等待我的一定是懊悔和自责。这种不对称决定了我从一开始就无法好好地享受STG。
而这种不对称的原因,则是一种自大。我无法正确认识我的失误,我盲目地觉得自己是很强的,对自己抱有十分高的期望,因此一丁点的失误都会对我造成沉重的打击。这种变态式的苛求让我完全无法心平气和地进行游戏,练习基本功,慢慢地提升自己——因为STG的技术提升需要长期的练习,在某一次游戏过程中获得心流体验是不可能的。
虽然我失去了一款好游戏,但是我觉得还是十分值得的。这么多年来我第一次静下心来考虑这个问题,而之后我要做的,也就是放弃期待,承认自己能力的不足。当然这样的事情也不是一蹴而就的,我甚至觉得我需要强行给自己灌输“自己很菜”的心理暗示才能抵消掉潜意识中对自己的过高评价。
当然,我的抗压能力的匮乏也在玩STG的过程中体现得淋漓尽致。换个角度来说,玩STG也是一个锻炼抗压能力的办法也说不定。

一个小坑

这两天碰到了一个小坑,起因是接手了一个数据 pipeline,然后我需要加一点新的功能。
这个功能需要取原来的表 left join 另外一张表取一个字段,然后有一个 where 条件是需要判定时间段是否符合,即 date between start_date and end_date。然而不知道同事脑子里装的什么,原来的表是把日期按‘yyyyMMdd'的格式存成字符串。
说不出话,于是面向爆栈编程,看到两种转换方法:

cast(concat(substr(STR_DMY,1,4), '-', substr(STR_DMY,5,2), '-', substr(STR_DMY,7,2))as date

from_unixtime(unix_timestamp('20180901' , 'yyyyMMdd'))

这还用说么,当然是第二种优雅。随后是漫长的 map reduce 过程。由于两张表都巨大无比,一个2B条记录一个10M条记录,运行时间高达两个多小时。
好不容易跑完,发现一个问题——新做的表比原来的表记录要少。经过漫长的排查(毕竟运行时间巨长),我终于发现,有一部分uid的所有记录都丢失了。
查其时间段发现,大概长这样—— (2018-08-01,2018-09-01) (2018-09-02, 2099-01-01)。看起来没什么问题,然而那是对于使用date类型的正常人而言的。
from_unixtime(unix_timestamp('20180901' , 'yyyyMMdd')) 输出的类型是 datetime 而不是 date,这就导致了

from_unixtime(unix_timestamp('20180901' , 'yyyyMMdd')) between '2018-08-01' and '2018-09-01' 
from_unixtime(unix_timestamp('20180901' , 'yyyyMMdd')) between '2018-09-02' and '2099-01-01' 

全部返回false。
至此,破案。

这是个小坑,但是浪费了我挺长时间,算是留个纪念,也算我求你们——别特么用字符串存时间了!

再谈两种兴趣爱好

曾经我和别人讨论过这样一个问题:“烹饪、运动、园艺之类现实世界的兴趣爱好,是否要比数学、音乐、哲学等精神世界的兴趣爱好更具有生活感?”“具有生活感”可以理解成享受生活,然而当时的讨论并未达到一个较为明确的共识。

如今,我对这个问题有了新的认识和思考,简单分享一下:

首先,原问题试图将兴趣爱好分为两类——一类看起来与生活密切相关、更具体,而另一类看起来多活跃于精神世界、更抽象。这个分类我现在看来并不合理,因为这两个类别并不是完全独立、非此即彼的——尤其比如音乐,虽然音乐很抽象,但音乐活动是不能离开听觉体验的。当然,寻找一套二元的分类方法并不现实,这里我打算换一种分类方式:结果导向和过程导向。

拥有结果导向的兴趣爱好的人会希望在这方面不断地前进,往往有着更明确的目标。比如数学、哲学之类的理论,爱好者们会希望学习研究更多的东西,不断寻找新的知识、技能,不断地挑战自己。最终乐趣所在往往在于达成目标的成就感。这类爱好往往我们会用动词“学习”或者“练习”来描述,比如学习吉他,练习射箭等等。

而拥有过程导向的兴趣爱好的人更注重兴趣爱好活动中的过程体验。作为目标的结果往往是一种假想性质的方向,而并不会太多地影响人在该活动中获得的愉悦。这一类兴趣爱好往往不需要太多变数,每周或者每月去体验一次同样的事情也十分满足了。许多户外运动大多是过程导向的。这里我想举一个例子,前几天我跟别人提到过可以搞一个电动车,骑车一路到海边看海。然而他表示魔都的海根本没什么好看的,我当时这么回应:“你弄错了一件事情,骑车看海这件事情更重要的是骑车去看海的过程而不是看海的结果。”

然而有一点我想提起各位注意——过程导向和结果导向这个分类针对的是不同的人对待它们的兴趣爱好的具体态度,而不是脱离了行为人去描述兴趣爱好本身。比如登山,有些人享受的人户外运动的本身,只要是山都可以爬,一个月来个一两次就很满足——这是过程导向;而另外一些人对待登山这件事情要更认真,他们不断地挑战新的山峰,可能最终目标是珠穆朗玛——这就是结果导向。

现在,回到开头的问题来,我试图描述的两类兴趣爱好的区别应该这么说:“过程导向的兴趣爱好要比结果导向的兴趣爱好更有生活感”因为我理解的所谓生活感强调的是享受生活的过程——除非你想享受生活的结果也就是死亡。用这样一种标准去分类,我觉得这个结论还是十分显而易见的——不过说不定这个总结也太自然了以至于没有太大的参考价值了。