跳转至

代码与工程之外·16代码与工程之外【1】如何从面试八股文中学到真正的技93

从本质上来讲,八股文是果不是因。很多人靠着背跳过了应有的产生疑问、逐步理解方法思考、反复试错得出结论的阶段,而是直接强行记住了结论。从某种程度上讲,这是一种颠倒主次的行为。嗨大家好,我是瓦练成。本期视频的话题在具体技术之上,和大家聊聊如何从面试八股文中学习到真正的技术。

相信大家很多人都有看八股文来找工作的经历。在突击和面向短期的应试中,八股文确实是有很好的作用的,能够帮我们救急,快速应对面试。但我们大部分人看完后很可能并未完全理解八股文中包含的技术和知识,仅仅可能是背下来,或是仅有浮于表面的理解。此时如果有面试官多深入问一层,我们往往就不知道该怎么回答了。

八股文带来另一个显著问题,是很多人靠着背这些八股文应付到面试,成功进到工作岗位后,就把自己欠下来的这些债给忘了。而忘掉的这些债务会越积越大。为什么说靠八股文应付面试是个债呢?而是债都是要还的。依赖八股文进来的人,实际上大部分没有完全理解和搞懂那些内容,他们所获得的仅仅是一段持续时间很短的记忆和印象而已。一段时间后想必就会抛到脑后。没有真正充分的理解,总会在后来的某一天暴露出来,成为制约你后续发展的一个巨大绊脚石。比如你写出的某个bug导致的故障,比如因为你缺乏系统性理解,无法快速完成开发任务造成的长时间加班,比如你面对性能优化时的束手无策。

那么我们如何真正把八股文中所包含的技术和知识理解并学懂呢?以至于能够避免上述这些问题的发生呢?我们应该先了解八股文本身的特点,自从它的本质出发,尝试到了解决的方法。面试八股文一般有很明显的特点,较多铺陈结论,缺失上下文背景信息,高度凝练化。这既是他的优点,又是他的缺点。说他的优点是因为靠着高度凝练化,让我们准备面试回答的效率大大提高,并且能够短时间内覆盖足够广的知识范围,达到一个程序员的基本合格要求。说它是缺点,也是因为凝炼化意味着必然损失问题场景和上下文信息,必然损失对细节的理解和深究思考,让我们变成了纸上谈兵式的理论程序员。

从本质上来讲,八股文是果不是因。很多人靠着背跳过了应有的产生疑问、逐步理解方法思考、反复试错得出结论的阶段,而是直接强行记住了结论。从某种程度上讲,这是一种颠倒主次的行为。八股文中的每一条结论,其背后都有复杂和丰富的问题场景,以及对应的思考解决过程。这也是很多技术内容和知识的真正价值所在。很多时候我们都说结论并不重要,掌握为什么需要这个结论,这个结论是通过什么思路得来的才重要。因为有了后者,你才能解决教科书以外的大部分时候我们真正面临的问题。

比如你背的进程都有哪些状态,New ready waiting Running terminate,很简单的是吧,就五个词。但是你丢掉了这些背后的状态机设计思想和实现模式,操作系统应对多任务调度的解决思路,CPUIO密集型任务的潜在优化思路等等。比如你背了面向对象的四大特征,封装抽象集成多态也是简单的四个词,但你丢掉了软件工程演进几十年的血泪经验,推导出如何做出高扩展性、模块化工程项目的思路。很可能你只是会照本宣科的写个私有的变量,再搞个public的get set函数,这以为是很好的遵循了OOP最佳实践,但实际上这是一个很荒谬的事情。

比如你背了MYSQL里常见的几类并发事务问题,脏读、丢失修改、不可重复读、幻读对应的含义,但到了你自己写并发逻辑的时候,相同的错误你依然会再犯一遍,很可能是以一个或大或小的故障的形式。任何一条八股文的结论随便深究扩展下,就会让你露出马脚,你也会在日后的工作实践中遇到各种各样的问题,然后感叹原来自己欠的债这么多。记住做题家思维并不会给你在实际的工作中带来什么帮助。单靠八股文无法训练和培养真正的工程师思维能力。工程师最有价值的能力是解决问题的能力,不是背书的能力,也不是使用某个工具的能力,甚至可以不是技术能力。比如社会工程学不了解的话,可以搜搜看CRUD化页面,这些工作实际上门槛非常低,这个人都能干。

这几年的AI发展也证明这些事情,AI也能够很轻松的完成,那你的价值在哪呢?你需要证明和训练,你具备解决复杂问题的能力。你能解决的问题越复杂越有价值,你自身的价值也就更高。所以要培养真正解决问题的能力。如何培养?进入到一个问题的上下文,去切身参与和机会,看这个问题是如何被别人解决的,而如果是你,你会怎么解决。然后模仿和借鉴这些思路,运用到你自身的实践过程中去。这实际上是学习并实践前人解决问题的思路和理念的过程。

比如学习和使用REDIS的时候,要理解为什么会有REDIS哦,原来是为了解决传统数据库读写性能不足的问题,拖了个缓存来加速访问。缓存太常见的东西了,CPU内存有缓存,磁盘有缓存,网络连接也会做池化缓存,数据库前面也做了REDIS缓存。那么自己的应用或系统逻辑里,是不是也能加入缓存提高性能呢?实践验证一下。那缓存就是完美的吗?会不会带来其他的问题呢?你的前辈已经遇到过了缓存带来的雪崩、击穿、穿透各种各样的异常情况。除此之外还要再平衡下,你是否能够cover维护缓存和真实数据一致性带来的额外复杂度,所以某些场景下是不是不引入缓存会更好些呢?实践验证一下。

再往深看一看,REDIS在性能上受到过很多的赞赏,他自己具体使用了什么方法思路提高了性能?内存存数据哈希表OE的复杂度,空间换时间,top K算法机理渐入常见思路了,单线程IO多路复用,和node js nginx一样的解决思路,应付高IO低计算的场景。e pop秉承的思想一以贯之,集群化,哨兵主从复制rehash,其他的组件搞分布式是不是一样的思路呢?我自己的分布式组件能不能也用同样的思路,分布式带来的额外复杂性,能不能cover住?这些老生常谈的思想,有没有尝试在解决一个新的问题时,拥有性能这么好,除了做缓存,能不能做个消息队列,能不能当个分布式锁,这些场景下的适用范围有哪些等等。

在这个过程中,重点应该是要纲举目张、举一反三,并关联迁移实践运用到可能的实际场景中去。当然要产生这么多的关联,自身也得有一定的经验,但这些经验也是在对各个成熟解决方案和项目的思想设计的钻研了解中,从0到1一个个积累下来的。这样的了解思想的模式,也能让你脱离对某个工具单纯地掌握使用的层面。AI出现后,代码API和各种工具命令都能提问和自动补全,你自己背下来的重要性大大降低。对工具本身的使用一般并不重要,而是应该在面对一个问题时,选择出合适的工具,或是自己做一个工具,这才是真正无法被AI替代的能力。

这些都需要充分的思想学习积累,有了思想性的理解,你去使用改造工具排查问题,你都会有一个更宏观的视角,这样自然效率会更高。而要达到这样的层次,去理解工具背后的思想是必然要做的事情。很多的我们现在用起来耳熟能详的工具,都是这样被开发出来的。独立去体悟、去找到场景,实际上是很困难的。好在当下已经有很多优秀和用心的创作者,帮你补充了这些上下文,并试图激发你的思考,真正能驱动你去实践,帮你留下感性认知。你要善于发现这些优质内容,当然我可能也是其中之一,如果可以的话,请关注我哈哈。

所以回到我们这期视频的主题,如何从面试八股文学到真正的技术。在基于八股的表面内容之上,全面的去了解某会问题的来龙去脉,体悟问题解决的思路,然后有意识地运用这些思想和具体内容。八股文最好的地方在于它已经帮您列出了在工业界内普遍认为有价值问题的结论,所以通过八股文学习的重点不在于八股文本身,而在于八股文背后的问题和对应的思考过程。可以说每一条八股文结论的背后都是一个宝库,进行一定把握住。本期视频的文字版本可以在视频详情获取,我是瓦脸成,这会帮助你成为一个更出色的工程师,感谢收看。

颜色主题调整

评论区~