您的位置 首页 > 数码极客

【编译程序属于什么软件】软件工程师如何自学成才?

作者| Radhika Morabia

译者|香槟超新星,书篇|郭丽

头部地图|视觉中国下载的csdn

生产| csdn (id: csdn news)

以下是译文。

2020年真是多事之秋。

我已经不再满足于我以前制定的“2020年学习计划”。因为这个计划的很多优先事项都不用担心今年被解雇。但是现在的情况已经改变了,对谁都一样。

最近这段时间,我唯一的焦点是准备面试和学习。我的领域包括算法、系统设计和实际React/Node项目三个领域的学习。

目前我在工作中的React和Node实践已经足够了,但对系统设计的学习最好在快速面试中再次突击。(威廉莎士比亚,Northern Exposure(美国电视剧),工作)因此,在今后的这段时间里,我将集中精力在算法上取得进步。

我有两个限制。一个是我每天下班后想学习一个小时,或者一周总共不到8个小时。二是只知道JavaScript,不想用我还不熟悉的语言写代码(如Java)。

所以,假设你做了一些编程练习题,一起完成了一些简单的LeetCode题,对如何解决这些问题有点熟悉,如果你没有CS类背景,那么如何取得突破,如何实现从“两个数之和(Two Sum)”到“2”

下面是我的方法。

培训班

学习算法分为几个阶段。如果你太轻率地跳进某门课,很容易失去这门课与已有的知识的关系。而且,如果你只是郁闷的练习,不参考外部资料,你甚至不知道那些问题考察的知识点是什么。(威廉莎士比亚,《哈姆雷特》)在特定节点之间平衡这两个节点是很重要的。

我确信,现在我已经做了足够多的排列和字符串操作问题,迫切需要对我存在的知识空缺进行指导和结构性认识。我需要基础知识。

方法有很多,但多次失败后,我觉得需要一个非常具体的反馈回路。

首先,要阅读和理解新概念。你可以阅读资料或看视频。这个阶段要重视实用性,要包含尽可能少的词汇量。有画就好了。现阶段编程问题的例子只会让你困惑。

我需要沉浸其中。请问我一个问题。让我失败。我让你彻底结束,但对它的了解却是反其道而行之。是你,是你。

最后,我要检讨的不是概念,而是问题本身。我不仅需要看到正确的解决方法,还需要看到正确的解决方法是怎样的过程。

重复了这么多次后,规律开始出现了。请注意,不是每次问新问题都要读新概念。“练习——回顾”周期应该进行得更多。

据我所知,InterviewCake可以提供最好的反馈回路。还有其他服务可以处理“问题——复习”课程,但对我来说,最难的部分是如何获得能够弥补我缺乏的基本知识的循序渐进的课程列表。(约翰f肯尼迪,教育)由于Covid19传染病,现在的价格是29美元,我还不能说我真的推荐它,但至少我建议你先看看它。(大卫亚设)。

Interview包处理“读取——问题”过程。它可以在一定程度上处理“回顾”部分,但我认为仅仅这样是不够的,还需要补充材料。

除了InterviewCake,我还有工作要做。

阅读:William Fiset的Easy to Advanced Data Structures。Chris在关于自己算法学习的优秀博客中推荐了这个方法(链接:)。InterviewCake上有阅读资料,在YouTube上还可以找到解说视频,非常好。问题:LeetCode。我还能说什么?我还没有对此做具体的工作,只是根据在InterviewCake上已经学到的内容进行联系。回顾:LeetCode的优点之一是它很流行,所以可以在YouTube上找到问题的答案。这些解说视频经常需要Java和Python的基本功能。我相信为了学会把它翻译成JavaScript,周末用两种语言写是值得的。

通过YouTube进行审阅可能是最重要的步骤。解决“两个数字的总和”问题真的很有趣,但如何真正做好“两个数字的总和”?如何优化?你还缺什么?模式匹配是随着时间产生的,但仅仅解决问题是不够的。你要知道什么是正确的答案,才能下次做正确的事。只有向导师征求意见,参考别人的解决方案,或者参考别人怎么办,才能逐步发展。

程序

我有一件事要做。我不能把全部精力放在这里。我每天都会尽力解决一个问题,这可能是必要的。

要一定的事前阅读,且必定需要事后回顾。

我本想间隔一段时间就重复一遍这些编程题,来达到每遍都更好的效果,但后来发现LeetCode上的题已经足够多了,所以不需要进行重复。

所以,举个栗子说:

我登录进InterviewCake,然后看看我课程列表上的下一项是什么。如果有相关的阅读材料,我就进行阅读。同时我还将检查一下“数据结构”播放列表,看是否有与该主题相关的视频可以观看。

然后,我将解决课程的课后习题。如果习题做完了,我将前往LeetCode,并找一些这个领域的题目练习。

我将做完这道题,保存好自己的答案,然后前往YouTube或InterviewCake的答案区进行回顾总结。我会记下我漏掉的内容,以及优化后的解决方案。

明天,我将重复这个过程。

我是如何解决问题的?

算法不仅仅意味着重复点击LeetCode提交按钮,而是一个过程。下面要讲的这个过程大部分是我从Chris在关于自己算法学习的一篇很棒的博文中借鉴的,但我真的很喜欢这部分。

养成写问题日志的习惯

我认为,这是能“搞懂算法”的人与那些说自己永远都无法理解算法的人的区别之所在。把你解决了的每个问题都记下来,并做好笔记。

这些笔记中的内容是能很自然地想到的——题目,类别,对于能解决该问题的模式的注释,多次解决该问题时你所拥有的一系列解决方案,回顾的时候做的笔记。

如果你想在纸上写(我也想),那还应附加一个电子日志,其中包含你的解决方案,易于复制粘贴。LeetCode本身会保存所有你提交过的内容,但对我来说有点乱。

这应该是一本相当正式的书,与演草本不同,这不是让你放飞自我发散思维的地方。

解决问题

下面的内容复制自Chris的文章

解决问题包含以下几个步骤:

  • 阅读问题,了解输入内容以及题目期望的输出内容。

  • 考虑一下这个问题属于哪个类别。

  • 考虑使用哪种数据结构最好。

  • 考虑我解决这个问题的实际方法。

  • 考虑是否有更快的方法能解决此问题(如果有,请返回步骤3)。

  • 将解决方案手写到白板或笔记本上。

  • 重新阅读刚刚编写的答案,看看它是否可以通过编译,以及是否可以真正解决问题。如果可以解决问题,再接着修复完所有的bug。

  • 将解决方案逐字复制到LeetCode编辑器中。

我认为这很棒。我尤其喜欢那些告诉我具体要怎么思考的部分。我经常听到这些建议,但不确定自己要寻找什么。实际上我在演草本上会写下这些问题的提示。

这一点很重要,所以在深入研究代码之前,我甚至会记录“这是一个数组操作问题,我大概应该使用对象解决这道题…”。

其次,在把答案输入LeetCode之前,先在纸上或白板上写下来是很重要的。不要屈服于一时的便利。即使你在面试会被允许使用代码编辑器,也不一定会在那个环境中感到舒适,因此你应该拥有手写代码的能力,而无需依赖编辑器提供的任何便利(比如con!)。

如果你第一次的解决方案失败了,那也没关系。我给自己留有在LeetCode中进行调试的余地,然后再尝试找到解决问题的方法。我希望这种情况的发生频率会随着我的不断练习而下降。

为自己计时(并注意到这一点)也很重要。在一开始,花更多的时间来解决一道问题是没关系,但是随着时间的推进,请尽量在30分钟以内提交自己的第一版答案。

不要试图一次就把所有事都做到完美。刚开始,能把题目做出来就很好了。然后,争取一次提交就通过。再然后,争取提交优化后的版本。再然后,争取提交优化后的版本,一次通过,且用时不超过30分钟。

你会变得更出色,并取得突破的。

回顾

要记住,仅仅做出题来是不够的。更优的解决方案还有很多。做出题来并不是重点。

自学的人会把“两数之和”视为LeetCode上的第一题,在用了复杂度为O(n ^ 2)的方法做出了题目之后,便心安理得地认为自己做得挺不错。两数之和是有最佳解决方案的。你必须知道这一点才能继续。

我认为重复这一步很重要,尽管有些课程可以提前教给你这些技巧,但对我来说,在尝试过这些技巧之后再进行反思效果会更好。在YouTube上观看竞争者们的视频是我回顾自己方案的最佳方式。

......

差不多就这些了。我将在每周的6天里,每天都做一道题目。

通过坚持不懈的练习,以及知道该从何处获得能填补“你不知道自己不知道的是什么”空白的知识,我相信任何自学成才的工程师都能够在几个月的时间里在算法方面达到合格的程度。当我学成之时,会回来汇报的。

原文:

作者简介:Radhika Morabia,OpenTable软件工程师,专注于JavaScript。

本文为 CSDN 翻译,转载请注明来源出处。

☞一文浓缩 60 年,程序员不可不知的开源秘史!

☞CSDN总部落户长沙,共建中国开发者产业中心城市!

☞AI 修复 100 年前晚清影像喜提热搜,有穿越内味儿了!

☞CycleGan人脸转为漫画脸,牛掰的知识又增加了!| 附代码

☞触发死锁怎么办?MySQL 的死锁系列:锁的类型以及加锁原理了解一下!

☞带血的战士| 吴忌寒传

关于作者: luda

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐