小土刀

突围

其实不存在突围,如果从来不觉得被包围的话。


我们渴望自由,但是最大的不自由往往源自自身;我们渴望突破,但是最厚的隔膜往往就是我们自己。那些我们有的,我们经历过的,我们见到的听到的想到的,构成了我们的世界,也构成了我们的壁垒。没有太大压力的时候,这个被称为舒适区的地方是我们休憩的最佳场所,举手投足都有我的地盘我做主的感觉。可是一旦因为环境和形势的改变而压力骤增的时候,舒适区就成了包围圈,圈住了往日的灵气勇气志气。

还记得大一刚开始学写代码的时候,有一门课是上机考试,每道题只有两个可能,做对满分,错一点就是零分。印象很深刻的是第一题我就卡住了,怎么想怎么做不出来,焦虑值暴涨以致不能思考,后来去厕所洗了把脸冷静一下这才把题目做了出来。

题目本身是什么过了这么多年早已不记得,但是那种恐慌的感觉却一直难以忘怀。我曾经觉得心理不可能影响生理,直到那次在考场上,才真正体验到了纯粹因为心理而导致的生理反应。很不喜欢那种感觉,所以之后都尽量早些完成作业,考试前也尽可能准备充足,不给自己恐慌发作的机会。

但是最近形形色色的面试却总让我有机会重温那种被恐慌包围的感觉:被问到不熟悉的题目,或者熟悉的题目却突然在一个小细节上卡住。正所谓越是不想越是害怕的事情却往往会发生,痛定思痛,我意识到原先的策略其实更多是一种逃避,避免陷入某种境况,却没有办法在已经陷入某种包围的时候突围。

实话说,上次面试的表现着实让我自己都非常难过,丝毫没有表现出任何一点『专业』的感觉。没有先分析好需求就盲目开始写代码,导致中途思路混乱卡住,一步错步步错,最终导致超时。

不过话说回来,越早暴露问题,就能越早开始思考对策。很高兴的是,似乎找到了突围的方法,所以在这里记录一下,一是给自己一个交代,二是说不定能帮助到同在迷茫期的其他人。当然了,这里主要以刷面试题为例子来讲解。

按照知乎体的惯例,先说结论:

  1. 迷茫的时候从经典书籍(教材)中找到方向,因为大师们高屋建瓴的理解很可能是仙人指路
  2. 从头到尾翻看厉害的人的博客不仅可以开阔视野,更能从他人的变化中,看到自己可能的方向

起因是这样的,我特别反感死记硬背题海战术,但是为了找工作却不得不做。但是当我刷过了一两次之后,感觉遇到了瓶颈。就是遇到一个问题,我有大概的思路,但是真正实现起来,就会遇到各种各样的问题。如果只是针对一道题目记住对应的解法,那么一道题就只是一道题。可是变化千千万万,总不可能准备所有的题目,题海战术实际上是很没有效率的做法。

那么真正有效率的做法是什么,用社会主义好的话说就是,要面向未来。什么是面向未来,面向未来就是培养解决问题的能力,那么具体要怎么做呢?

  1. 发现问题的能力。通过解决各种各样的题目来增加自己的经验,了解不同情况下可能出现的各类问题,以及对应的解决方法。
  2. 解决问题的工具箱。通过阅读经典书籍,增加自己的知识储备,就好像有十八般武艺,可以根据不同的对手用不同的招式。如果只有一两招,难免会出现捉襟见肘的情况。
  3. 清晰思路的描述。有些问题可能稍微有些复杂,即使一开始想明白了,但是可能在专注细节的时候往往会迷失,所以要记录下来问题的整体思路,逐步细化,这样不仅能更有效率的解决问题,别人也更加容易理解自己的思路。

因为下周的面试主要是跟 python 相关的,所以顺藤摸瓜找了两个 python 博客,一个是『小明明』,另一个是『Vamei』。他们的文章基于特定的主题,一个是算法,另一个是 python/linux/protocol。虽然看起来跟刷题没啥关系,但是我却收获很多。

一来是从自我包围圈中跳了出来,好的程序员绝不是刷题刷出来的,而是思考和实践做出来的。刷题就像练剑,练的是已经了解的招式,让自己更熟练。但是思考和实践则是学习更高强的武功,完全是更高的境界。

但是话说回来,白板编程确实还有有一些技巧的。重中之重就是:先确认前条件/不变式/终止条件/边界条件,然后写出正确的代码

具体来说,是下面几步(参考 Lucida 的博客)

  • 在开头写出程序的大致框架
  • 通过注释的形式给出前条件/不变式/后条件
  • 使用实例数据验证自己的程序
  • 使用缩写
  • 至少留一行半行宽

如果不会做怎么办呢?

  • 至少先给出一个暴力解法
  • 寻找合适的数据结构(栈/队列/树/堆/图)
  • 寻找合适的算法(分治/回溯/动态规划/贪婪)
  • 从小的数据集开始尝试
  • 如果还是没有头绪,重新考虑目前条件,看是否有遗漏
  • 如果 3 分钟过后还没有思路,请求提示。经过提示给出答案总比没有答案好

下周正好有几个面试,就用这种全新的思路,来面对挑战吧。

捧个钱场?

热评文章