深度优先,还是 广度优先?

2021-03-20 Views 思考 观点

“深度优先”和“广度优先”是遍历树/图中的算法名词,本文借用这两个概念,来表达对学习方法的个人看法。

前两天参加一场面试,面到后面是对方小组 leader 来跟我聊。技术问题一个没问,刚听我讲完基本履历就开始发表人生建议:

“你觉得你的职业选择和方向是对还是错?”、“我先说说我的看法,你别生气”、“我觉得你的选择完全都是错的”、“你要先在一个领域达到一定高度,比如三年,然后再考虑更多的方向”、“你看看你那些去了大厂的同学,现在是不是优秀得多了”、“你看看你过去这些经历,烂团队、烂产品”、“我说他们烂你没意见吧?不烂也不会死”、“这些项目你都不用讲了,我也不想听”……

议论刚发完也没想听听我反馈,实际上我还没反应过来,面试就结束了。他强烈的个人价值观输出加上面试情境下双方不对等的交流地位,一时之间带给我很大的冲击,一直到晚上睡觉前我都还有点耿耿于怀,感觉有点像小时候跟人吵架输了之后觉得自己没发挥好,心底里酝酿着自己一条一条的反驳陈词。

不过这种反思也带给我一个更加深刻地认识自己的机会,冷静下来想想:我要的是什么?我选择的真的是我想要的吗?

其实我的部分观念和那位面试官的观点或者说普遍意义上的技术观念还是一致的,比如说从事某项技术必须要先达到一定深度才能考虑更多的发展方向,不同的是每个人对于深度的理解是不一样的。

我上学时候语文课本里讲到诸葛亮年轻时和友人游学,“众人皆务于精熟,而亮独观其大略”,这句话一直影响着我,工作后看了阮一峰老师的书和博客(这里主要指阮博士的《未来世界的幸存者》 和《前方的路》两本书,以及每周的科技爱好者周刊), 越发让我对很多技术的细节保持谨慎的态度。

十年前如果你身为一名诺基亚的塞班系统软件开发工程师,很难说周围的人不羡慕你:高薪的工作、垄断性质的全球巨头企业,本行业巨大的技术门槛——转行干这个得经历长时间的学习和培训。但是短短几年间,行业突变,那些钻研多年无比娴熟的技术再也无用武之地,自己要和应届生一样从头去学新技术开始求职。

新的技术是层出不穷的,尤其我所在的前端领域。如果花费大量的时间执着于API的细节,那编程这件事就变得毫无乐趣可言。但是面试和开发工作又需要对技术的熟悉,所以二者之间的平衡是一个需要把握的状态。既要对常用的重要的技术比较熟悉,又不能吹毛求疵,不强求脱离文档手写代码。我不追求背下成篇成篇的API细节,那样就和熟记每一个PS快捷键的路边打印店小哥一样,把一份原本充满创造新的工作变成了流水线作业。

面对技术的不断迭代,我觉得更重要的是不断提升技术背后的通用能力,不管是前端后端、什么语言框架,技术发展来去,还是那群大佬,还是那些程序设计思想,只是体现的具体形式不一样了,这些能力具体来说至少有:

  • 抽象能力(建模能力):对一个实际的的问题,能否迅速理解其内在的逻辑关系,并且在代码层面描述出来,进而使用合适的工具解决。于后端就是数据库设计、UML 类图,前端则是页面模块拆解、组件化;
  • 解构能力:面对复杂的具体情境,能否在逻辑上做拓扑变换,将复杂/陌生问题转换为简单/已知问题的组合;
  • 算法能力:本专业的核心能力,不多说了,同时和上面两个能力有部分重合;
  • 编程能力:包含对常用语言、工具的熟悉,这点放在最后是因为不同的场景下有不同的最优解,不应该执著于一项具体的技术栈;

回到开头的问题,做技术,是应该在一个方向上不断深入呢?还是“博览群书”?其实这两者是相辅相成的,很多技术的本质是相通的。当你在某个方向足够深入,其实已经通过这一门技术掌握了上面说到的几门通用能力,再去尝试其它方向的技术,往往也能“一法通,万法通”;另一方面,如果选择优先拓宽自己的技术广度,往往能在不同技术的学习过程中对比发现以上几门通用能力在不同技术栈中的体现。好比对语言有深刻理解的,往往是做专门研究的语言学家,或者是同时通晓几门语言的人。所以是“深度优先”还是“广度优先”,我觉得没有定论,每一个技术人都有自己的技术追求,有的人更喜欢不断深入一项技术,有的人则享受遇到每一项具体问题都能拿出对应的最适合的技术工具来解决。只要结果都是导向通用能力的提高,大可选择自己喜欢的过程。

赏 支付宝扫码打赏 微信打赏

△