软件工程师如何自学成才?
作者 |Radhika Morabia译者 |香槟超新星,责编 | 郭芮头图 | CSDN 下载自视觉中国出品 | CSDN(ID:CSDNnews)以下为译文:2020年真是多灾多...
作者 | Radhika Morabia
译者 | 香槟超新星,责编 | 郭芮
头图 | CSDN 下载自视觉中国
出品 | CSDN(ID:CSDNnews)
以下为译文:
2020年真是多灾多难。
我已经不再满足于自己以前制定的“2020年学习计划”了,因为这个计划中很多优先项的前提是我今年不必担心会被裁员。但现在的情况已经变了,对任何人来说都是如此。
在最近的这一段时间里,我唯一的重心就是为面试做准备和学习。对我这一行来说,这涉及3个领域的学习:算法,系统设计,以及实际的React / Node项目。
目前来说我在工作中做的React和Node实践已经够多了,而对系统设计的学习最好在快面试的时候再突击进行。因此,在未来的这一段时间,我将专注于在算法方面取得进步。
我有两个限制:一是我每天下班后只想学习1个小时,或者每周总时长少于8个小时。二是我只懂JavaScript,并且不想使用一种我还不熟练的语言来写代码(例如Java)。
因此,假设你已经做过一些编程练习题,并且也有一搭没一搭地完成过一些简单的LeetCode题,并且对如何解决这些问题已经有点熟悉了,并且假设你没有科班CS背景,那么要如何才能有所突破,如何实现从“两数之和(Two Sum)” 到 “二叉搜索树(Binary Search Trees)”的飞跃呢 ?
下面是我的方法。
课程表
学习算法分为好几步。如果你过于草率地一头扎进某项课程,就容易迷失这个课程跟你已有知识的联系。而如果你只是闷头练习,却不参考外部资料,你可能甚至会不知道那些问题考察的知识点是什么。在某些节点之间平衡这两者是至关重要的。
我现在确定自己已经做了足够多的数组和字符串操作问题,而且急需针对我所存在的知识空缺的指导和结构性认知。我需要基础知识。
方法有好几种,但是在失败了很多次以后,我觉得自己需要一个非常具体的反馈回路。
首先,要阅读了解新概念。可以通过阅读材料也可以通过看视频。这一步应该注重实用,且包含尽可能少的词汇量。有图示的话会很好。这一阶段,编程题例子只会让你感到困惑。
然后,我需要沉浸其中。给我一道题。让我失败。让我完整做完,却对它一知半解。
最后,我需要对问题本身进行回顾,而不是概念。我不仅需要去看正确的解决方案,而且还要去看正确的解决方案的过程是怎样的。
这样重复很多次之后,规律就开始显现了。请注意,不是做每一个新题都要阅读新的概念。“练习——回顾”循环进行的次数应该更多。
据我所知,InterviewCake能提供最好的反馈回路。还有其他一些的服务可以处理“问题——回顾”过程,但对我而言,最困难的部分是如何获得循序渐进的课程列表,能够补充我所缺乏的基本知识。由于Covid19疫情,它目前的价格为29美元,所以尽管我还不能说是真正推荐它,但我至少推荐你先看看它。
InterviewCake处理“阅读——问题”的过程。它能够一定程度地处理“回顾”的部分,但我认为只看它不够,还需要补充材料。
除了InterviewCake,我还有一些其他事情要做:
阅读:William Fiset的Easy to Advanced Data Structures。Chris在关于自己算法学习的一篇很棒的博文中推荐了此方法(链接:https://chrisdoescoding.com/posts/5/)。在InterviewCake上有阅读材料,在YouTube上还能找到讲解视频,这一点非常好。
问题:LeetCode。还能说什么呢?我对此还没有做任何具体的事情,只是按照InterviewCake上已经学过的内容来进行联系。
回顾:LeetCode的一个优点在于它很流行,所以我可以在YouTube上找到问题的答案。这些讲解视频往往要求具备Java和Python的基本能力。我相信是值得花一个周末在这两种语言上,以便学会将其翻译成JavaScript的。
通过YouTube来进行回顾可能是最关键的一步。解决“两数之和”的问题的确很有趣,但如何真正的做好“两数之和”?如何进行优化?你还缺什么?模式匹配会随着时间的推移而建立,但仅仅会做题是不够的。你必须知道什么才是正确的答案,才能在下一次的时候做对。请教导师或者参考别人的解决方案,以及参考别人是如何做到的,只有这样才能逐渐进步。
流程
我有一份工作要做。我无法把全部精力都放到这上面。我将尽力每天都做一道题,这可能需要一定的事前阅读,且必定需要事后回顾。
我本想间隔一段时间就重复一遍这些编程题,来达到每遍都更好的效果,但后来发现LeetCode上的题已经足够多了,所以不需要进行重复。
所以,举个栗子说:
我登录进InterviewCake,然后看看我课程列表上的下一项是什么。如果有相关的阅读材料,我就进行阅读。同时我还将检查一下“数据结构”播放列表,看是否有与该主题相关的视频可以观看。
然后,我将解决课程的课后习题。如果习题做完了,我将前往LeetCode,并找一些这个领域的题目练习。
我将做完这道题,保存好自己的答案,然后前往YouTube或InterviewCake的答案区进行回顾总结。我会记下我漏掉的内容,以及优化后的解决方案。
明天,我将重复这个过程。
我是如何解决问题的?
算法不仅仅意味着重复点击LeetCode提交按钮,而是一个过程。下面要讲的这个过程大部分是我从Chris在关于自己算法学习的一篇很棒的博文中借鉴的,但我真的很喜欢这部分。
养成写问题日志的习惯
我认为,这是能“搞懂算法”的人与那些说自己永远都无法理解算法的人的区别之所在。把你解决了的每个问题都记下来,并做好笔记。
这些笔记中的内容是能很自然地想到的——题目,类别,对于能解决该问题的模式的注释,多次解决该问题时你所拥有的一系列解决方案,回顾的时候做的笔记。
如果你想在纸上写(我也想),那还应附加一个电子日志,其中包含你的解决方案,易于复制粘贴。LeetCode本身会保存所有你提交过的内容,但对我来说有点乱。
这应该是一本相当正式的书,与演草本不同,这不是让你放飞自我发散思维的地方。
解决问题
下面的内容复制自Chris的文章
解决问题包含以下几个步骤:
阅读问题,了解输入内容以及题目期望的输出内容。
考虑一下这个问题属于哪个类别。
考虑使用哪种数据结构最好。
考虑我解决这个问题的实际方法。
考虑是否有更快的方法能解决此问题(如果有,请返回步骤3)。
将解决方案手写到白板或笔记本上。
重新阅读刚刚编写的答案,看看它是否可以通过编译,以及是否可以真正解决问题。如果可以解决问题,再接着修复完所有的bug。
将解决方案逐字复制到LeetCode编辑器中。
我认为这很棒。我尤其喜欢那些告诉我具体要怎么思考的部分。我经常听到这些建议,但不确定自己要寻找什么。实际上我在演草本上会写下这些问题的提示。
这一点很重要,所以在深入研究代码之前,我甚至会记录“这是一个数组操作问题,我大概应该使用对象解决这道题…”。
其次,在把答案输入LeetCode之前,先在纸上或白板上写下来是很重要的。不要屈服于一时的便利。即使你在面试会被允许使用代码编辑器,也不一定会在那个环境中感到舒适,因此你应该拥有手写代码的能力,而无需依赖编辑器提供的任何便利(比如console.log!)。
如果你第一次的解决方案失败了,那也没关系。我给自己留有在LeetCode中进行调试的余地,然后再尝试找到解决问题的方法。我希望这种情况的发生频率会随着我的不断练习而下降。
为自己计时(并注意到这一点)也很重要。在一开始,花更多的时间来解决一道问题是没关系,但是随着时间的推进,请尽量在30分钟以内提交自己的第一版答案。
不要试图一次就把所有事都做到完美。刚开始,能把题目做出来就很好了。然后,争取一次提交就通过。再然后,争取提交优化后的版本。再然后,争取提交优化后的版本,一次通过,且用时不超过30分钟。
你会变得更出色,并取得突破的。
回顾
要记住,仅仅做出题来是不够的。更优的解决方案还有很多。做出题来并不是重点。
自学的人会把“两数之和”视为LeetCode上的第一题,在用了复杂度为O(n ^ 2)的方法做出了题目之后,便心安理得地认为自己做得挺不错。两数之和是有最佳解决方案的。你必须知道这一点才能继续。
我认为重复这一步很重要,尽管有些课程可以提前教给你这些技巧,但对我来说,在尝试过这些技巧之后再进行反思效果会更好。在YouTube上观看竞争者们的视频是我回顾自己方案的最佳方式。
......
差不多就这些了。我将在每周的6天里,每天都做一道题目。
通过坚持不懈的练习,以及知道该从何处获得能填补“你不知道自己不知道的是什么”空白的知识,我相信任何自学成才的工程师都能够在几个月的时间里在算法方面达到合格的程度。当我学成之时,会回来汇报的。
原文:https://dev.to/rmorabia/the-self-taught-engineer-s-algorithm-study-plan-472a
作者简介:Radhika Morabia,OpenTable软件工程师,专注于JavaScript。
本文为 CSDN 翻译,转载请注明来源出处。
更多精彩推荐
☞一文浓缩 60 年,程序员不可不知的开源秘史!
☞CSDN总部落户长沙,共建中国开发者产业中心城市!
☞AI 修复 100 年前晚清影像喜提热搜,有穿越内味儿了!
☞CycleGan人脸转为漫画脸,牛掰的知识又增加了!| 附代码
☞触发死锁怎么办?MySQL 的死锁系列:锁的类型以及加锁原理了解一下!
☞带血的战士| 吴忌寒传
你点的每个“在看”,我都认真当成了喜欢
更多推荐
所有评论(0)