2018 年终总结

晨练的体验

去年年中在三藩市区跑过五公里,年底又在伯克利跑了万米,今年轮到半程马拉松了。为了避免中途被救护车敲诈钱财,我预先找了健身教练破财免灾。第一次的训练结束之后,身体伤得不轻,有三四天时间腹部动弹不得,在床上无法坐起来,只能翻滚着下去。第二次训练也没好到哪里去,在回家的路上,因为腿已失去知觉,踩油门和刹车的力度都把握不住了,几分钟的路程还要胆战心惊地把车开回家。周一在公司被经理叫去谈话的时候,我不得不靠着椅子站立,因为“坐下之后就站不起来了”。这种残障人的生活状态,在训练三四次之后才渐渐好转。

跟欧洲哥相比,我的教练已经算非常仁慈了。欧洲哥是健身房里的人气教练,他大多数时间都在与各种女学员打交道。外表看上去,他是一个温文尔雅的绅士,但他的训练却格外严厉。欧洲哥有没有在工作,只需要听健身房里有没有凄凌的叫声就知道了。如果说人生中的不幸是颜值不够高,那么不幸中的万幸就是没有被欧洲哥盯上。



马拉松行进途中


跑半程马拉松的当日,我时不时地低头看手表来确认现在的速度。穿过了漫长的海岸线,经历了金门大桥半英里长的大上坡,在城市的宽阔街道间游走,当我满怀信心觉得两个小时之内肯定可以抵达终点的时候,腿脚忽然就开始不听使唤了。左腿的膝盖和右脚的脚踝,跑一步疼一下,使我不得不走着穿过终点线。没能一口气跑完全程,还是有些遗憾的。


夜校的体验

湾区的娱乐资源非常贫瘠,以至于我们组竟然想出了周六来公司打(xiu)球(bug)的活动。如果下班不是特别晚,我倒是诚心诚意地推荐在晚上报个什么课程。今年我一共上了两门课,分别是乒乓球和日本语。

上乒乓球课是因为晚上回家前和同事一起打球,发现自己与对方大概差了二十个段位。为了与同事对战时不至于让对方非常无聊,我决心认真学习这项国人技能。参加了两个月的培训班后,我发现乒乓球是一项非常依赖预判的运动。乒乓的球速很快,确定下一个动作,以怎样的方位和力量回球,在球刚刚离开对手的拍子时就需要想好了。依靠大脑的逻辑思维是来不及的,所有的动作都要演变成身体的本能反应才可以。这种本能反应,是建立在每小时上千个球,持续不断的训练之上的。为了把差距缩小到十九个段位,我还有漫长的路要走啊。

我找的这门 日语课程 真的很良心,三个月二十四小时收费不到三百,而且因为是超小班教学(可能因为没有多少学员),每个人一节课下来有很多次口语练习的机会。张口说话是很困难的事:如果只是心里想而不用嘴上说出来,例如轮到别人回答问题的时候,我往往能想出答案;但是轮到自己开口的时候,经常一下子就想不起来了!不过因为上课的同学都互相认识,老师也很鼓励大家,遇到这种场景还不至于特别尴尬,实在不行咱就拿英文说。



在豪华会议室上课


非常羡慕两位在苹果和甲骨文工作的同事,每年有公费去日本出差的机会。如果缺席了一两次课程,等下次他们回来的时候,就能拿到从日本带来的和果子——我们会一边分食一边讨论着岛国见闻。给我们上课的老太太非常的反传统。首先她不是一个注重妆容精致的人,每次上课都穿着松松垮垮的湾区限定免费服装,其次她在课堂上讨论的话题也时不时会跑偏。有次一个同学从日本回来,发生了类似于这样的对话:

师:你在日本的时候,去过女仆咖啡厅么?
生:女仆咖啡厅没有去过,但是去过女仆酒吧。
师:女仆酒吧?很新奇哎!有照片么?
生:因为太害羞了,没有拍照。
师:好可惜啊!女仆可以帮你做什么吗?按摩什么的?
生:我不清楚……

再比如,讲到日本少子化问题的时候,她会说:

似乎日本政府对付少子化问题的方法是大力发展机器人。虽然机器人在老年人的家中普及还需要一段时间,但是有些人已经嗅到了其他的商机,比如 prostitution 可以比人类更便宜……

这真的是太颠覆日本老太太在我心中的印象了 (>_<)


传道的体验

今年年初回国的时候,老师跟我说,国内的在线教育正处于一个高速发展的时期,无论是考试辅导还是职业培训,知识服务都有着巨大的需求。正巧友人 C 君在某医学院深造,想了解一下编程是怎么回事,因此我头脑一热决定开发一套零基础 Python 入门课程。

学习一门编程语言不是非常困难。和人类语言相比,编程语言的结构化更强,语法也更精炼。不过,如何用计算机的思维去描述现实世界的问题,是编程学习者很头疼的问题。

比如说判定一个字符串是否是回文,用计算机的思维去描述这件事,分这么几步:

  1. 判断输入的字符串是否为一个空串。
  2. 创建两个指针变量,分别指向字符串的头和尾。
  3. 开始一个循环过程,如果两个被指向的字符不相等,返回“假”,否则向中间移动两个指针的位置。
  4. 如果直到两个指针相遇,都没有发现不相等的字符,返回“真”。

一个熟练的程序员会觉得,判断回文这么简单的事情,完全没有必要拆成四步。但是可怜的友人 C 君,把第一步直接忽略,然后卡在了第二步——没有想到自己可以创建两个变量去追踪字符串的头和尾。没有想到可以创建新变量?这件事听起来似乎匪夷所思,但实际上又是在情理之中的。就像初中平面几何,如果老师没有讲过可以构造辅助线,你真的能想到这个题需要辅助线才能求解么?编程也是一样,初学者没有创建变量的意识,做过几次练习之后,才知道这种类型的问题可以通过构造指针变量求解。当判断回文的过程从四步缩减为一步的时候,就进入到了下一个层次的抽象。抽象的层次越高,能看到的世界就越广阔。关于程序员的打怪练级,大概就是这样一回事。



学习二十小时后的练习


除了要花很多时间解答奇奇怪怪的疑问,课程的编排也是让我伤透脑筋的地方。Python 编程涉及的基本概念很多,比如变量、数据类型、函数、关键字、缩进格式等等。不了解这些基本概念,就无法写出哪怕是非常基本的程序。我在课程刚开始的时候讲授了太多这些比较空虚的概念,却没有安排足量的练习,结果等到做 listdict 的有关习题时,C 君不得不经常回去翻阅基本概念和语法。自己懂编程,和把编程教给别人,果真是两件完全不同的事情啊。


考试的体验

十二月初,我参加了日本语能力测试四级水平考试。与其说是四级,不如说是倒数四级——就是非常入门的意思。考试在三藩市某大学举行,考场是文科学部的普通教室,这种教室可以由国内常见的中小学教室经过缩小与旋转的线性变换得到。教室前方是门,最后有一排窗户,两侧是墙壁,放置着七行五列椅子。椅子右侧的扶手延伸出去变成了小桌板,勉强可以乘下一张答题卡。学生之间的距离是如此的紧凑,以至于我一抬眼就能看到三份答案,但是因为不了解彼此的水平,也不敢贸然参考。

做到听力部分的时候,我本以为教室会统一放广播,但令人大吃一惊的是,老师拿来了史前文物——录音机。试音时重复的那几句「いい天気だから、散歩しましょう!」(因为天气很好,去散步吧!),瞬间把我的思绪带回了初中英语课堂。受限于磁带这种介质,索尼牌录音机并不会比步步高有更好的表现,每道题开始之前的“咚”的一声充斥着黏浊的质感,好像音叉消散不去的余音。这萧索的墙壁,破败的桌椅,再加上索尼录音机,简直是没落资本主义国家的完美写照了。

听力的每道大题前都有一道例题。其中一个例题,我本来想选第二项,但是紧接着就听到了「一番いい者は3番ですから、答えはこの様に描きます。」(因为第三项是最佳选项,请像这样标记答案。),当场心态崩溃。考试能不能低分飘过,全看听力能做对多少了。

最让人无法理解的是,作为一个只需要填机读卡的考试,理论上讲当天就应该能出成绩了。但是,监考老师说,请大家明年二月去网站查分,这效率让我怀疑日本是否真的发生过工业革命。想来想去,我觉得日本语能力测试除了考试费用低廉之外,真的没有什么优点了。


解谜的体验

程序员有两件不同的工作,一件是写 bug,一件是修 bug。经常会遇到的情况是,前人写完 bug 跑路了,后人不得不去修 bug。

修 bug 这件事和解谜非常类似。一开始拿到一个不透明的盒子,经过一些分析,然后跟别人解释这个盒子里有什么。如果拿到手的只有日志文件,用各类外部仪器测量就是主要的办法。把观察到的现象对照代码,重现执行链条,然后提出可能会出现问题的地方,再设计实验方案验证。如果能拿到手的是线上系统,那就可以使用一些交互式的手段了,比如晃动一下听声音,或者拿火烤一烤闻气味,实在不行把盒子炸开也是可以的,不过最后两种方式的成本就比较高了。

组里有个同事,最近半年和我一样,每天的工作就是玩解谜游戏。有一次他说,看了我的博客,觉得内容写得不错,但看不出我对什么样的技术真正感兴趣。我说自己也挺迷茫的,不像你现在就已经很明确自己要做什么了。然后他向我介绍了某高频交易基金通过用户态 TCP/IP 协议栈降低网络延迟的项目,又说,不要用战术上的勤奋去掩盖战略上的懒惰,修 bug 的时间长了就会忘记怎么写 bug,未来是属于写 bug 的,也是属于修 bug 的,但归根结底,还是属于写 bug 的。

是啊,我真的应该好好想一想,下一个要努力的方向了。