为什么看这么多“没用的”东西

起点

我的起点已经比很多人低了。

大概三年前,大部分同学都在刷题、看书准备找工作的时候,我却是悠哉悠哉,并不在意,完全沉浸在自己当时的工作中。或许很多人会有和我一样的想法:看这些没用的东西干嘛?太功利了,我不屑。

刷题、看八股文,正真工作的时候却是基本用不上,完全是为了面试准备的,太功利了。

当时的我觉得实用主义至上。这可能是大学养成的习惯。大学之前,我可能会好好做题,一步一步打好基础。但是到大学就变了,如果你志不在绩点,可能就没这么多时间一步一步从基础做起,基础部分过过就行了。技术太多,却学不完,跟不上。甚至有一段时间觉得不过尔尔。技术什么的,用的时候学学也来得及,用不上的也没必要深究。

加之找工作面试的时候,除了笔试,基本没有八股文问题,也不会聊数据结构和算法,聊聊大学项目就好了,就更加深了我对刷题和八股文行为的偏见。

面试

鄙视刷题、八股文,这是错的,我现在是这么认为的。

刷题、背八股文不是为了面试,虽然这件事带来的好处可以帮助你更容易通过面试,但是它的目的不应该是为了通过面试。

年初,我陷入了很长时间的一段迷茫期。我迫切地想知道自己的技术程度。工作圈子太小,自认为在圈子里做的是不错的,但是圈子外呢?我难道需要被迫在现在的圈子呆一辈子吗? 我觉得是不可能的。加之当时对现在的小组也有一些不满,最终打算找个新工作试试,所以我尝试面试了两家公司。

面试第一家的时候毫无疑问的挂了。一上来面试都是八股文,非常反感。八股文面试完就是数据结构与算法,也是做不出来,只能说AC,但是不能做到最优解。

面试第二家的时候,初面通过了。初面基本就是聊项目,也会聊一些工作或者技术上的事情,没有问八股文和数据结构的问题。但是第一和第二面的时候挂了,反馈结构是数据结构和算法以及计算机基础只是扎实。

第二家面试失败之后我开始意识到有些地方我是有问题的。

内功

数据结构和算法以及计算机基础理论是一个程序员的内功

这是面试之后在某平台看到有文章说刷题这件事。我记得结论是这样的:

数据结构和算法代表的是你的内功,外功是你的代码水平,很多人外功都不差,但是内功参差不齐。

学习了这么多编程语言,比较擅长的也有这么一两门,经常会有这样一种想法:编程语言学起来很简单,从零基础到能够上手写代码一个星期也就差不多了。确实是这样,会再多编程语言,编程语言掌握得再好,可替代性都很强。你的周围都是程序员,从编程语言上超过你只是时间的问题了。对于这件事,我的想法是,需要熟练掌握一两门语言的大部分特性,其他语言了解就行了,待需要用时,花个几天时间熟悉熟悉也是来得及的。所以,会很多编程语言虽然可能代表你比其他程序员更热爱技术,更喜欢折腾,但是并不代表你比其他成员更优秀。时间是有限的,可以将学习其他编程语言的时间花在更必要的事情上。

对于编程语言的研究,我放慢了脚步,对于刷题这件事,不排斥了。最近leetcode有人说刷题多了很自闭,别人可能一下子就看出解法了,我却需要很久,我仔细想了这个问题,这样回复了:

我也有这种感觉,但是应该换个角度想想。

这有点像我们的科目考试。比如数学考几何吧,假设你没有系统学习过几何,只在某些地方零零散散看过一点几何的内容,让你去考试你可能也能做出来,并且也可能会发明一些神奇的解法。 但是让系统学习过几何的人来考试,他们就会有系统的方法和思想。很多我们这些半吊子觉得很神奇的想法,对他们来说就是普普通通,甚至是本能。

所以,还是需要系统学习一些数据结构和算法的知识,也要用大量的题目来巩固,这点和高中刷题很像。

刷题这件事情就和高中疯狂刷题一样,只是为了巩固数据结构与算法的知识,刷题是方法不是目的

大学之前十二年的学习,学到的知识真的都用上了吗?显然没有。这些知识对我的作用我认为有两个:一是让你考上了一个好大学,二是影响了你的世界观、思维方式。

学习数据结构和算法以及刷题这件事就和那十二年的学习一样,都能用上吗?不一定。但是这件事有两个作用:一是帮你找到好工作,二是影响作为程序员的你的思维方式和对事情谨慎的态度


年初,我写了几篇计算机理论基础相关的博客,目的很明确,补充自己在这方面的知识,直到最近从朋友那里知道了SICP这本书,网上关于SICP的一条言论很影响我,改变了我对学习计算机理论基础的看法,大概是这么说的:

SICP讲述的知识对于现代很多程序员可能很简单,但是很少有人会从这些知识点的角度去思考,仅仅是,书本告诉你了,你懂了,才觉得简单。SICP是一个程序员的内功。

SICP在编程语言上,这句话很启发我:

我们需要将自己看做语言的设计者,而不只是由他人设计的语言用户。

学习计算机理论基础也是这样,让我们有一定的能力、资格站在系统设计者的角度去思考编程这件事。说到这里,我想到的一句话就是:站得更高,看得更远。

仅仅站在代码编写者的角度去写代码,可能永远都是码农;站在语言设计者,系统设计者的角度去写代码,才能越站越高,越走越远。

总结

所以,我的总结如下:

  1. 不会数据结构的程序员就像不会高数的理工科生,可以干活,但是干不了大活;
  2. 刷题只是巩固数据结构和算法知识的方法;
  3. 学习理论是为了让你能站在更高的角度去思考和编写代码;