我想了很长一段时间:仅仅知道计算机科学的基础知识就能帮助我成为一名更好的开发人员吗?它能给开发商带来价值吗?
如果你也问自己这些问题,而且你(还)不想把时间投入到学习计算机科学上,这里是我的经历。在这篇文章中,我将首先回答以下几个问题:
我是否学到了一些有用的东西,可以转移到我作为开发人员的日常工作中?
我从这个奇妙的资源清单开始:自学计算机科学。它基本上是关于如何作为一名软件工程师学习计算机科学的指导方针,而不会花很多钱试图进入麻省理工学院。
这是一个简单但重要的问题:我们为什么要这样做?
对于每个需要大量动力的项目,我都会首先尝试定义适当的目标:
通过了解一些核心概念,能够更快地学习一门新语言/新技术,您可以将其应用于每种语言/技术。
提高了我对较低抽象级别的理解。更好地理解“它是如何在幕后工作的”可以提高我的理解,从而提高我解决错误或设计算法的效率。
我认为,理解背后的概念是发展领域创新的关键。
了解该行业的历史:为什么我们会有今天,我们可以做些什么来改善计算世界?
我对试图阅读每一本关于计算机科学的书不感兴趣。它至少应该给我一些理解的感觉。
这就是为什么我的学习计划把重点放在记忆保留、理解和建立关于我所学知识的快速参考上,以便能够很容易地回来。
我每周学习大约2到3个小时,这取决于我的优先事项。我不想做太多的事情,对计算机科学感到疲惫和厌倦。对我来说,最重要的是定期学习,不管有多少时间。这应该是我喜欢做的事情。
在学习新材料的同时,我以思维导图的形式对其进行了总结。这有两个好处:写作可以帮助我记住所学的内容,当我需要的时候,我可以很容易地回忆起一些关键的概念。
我的学习时间分为两类:新学习(书中的新篇章,看新的视频课程,做例子和练习)。
我称之为“知识库召回”它主要是针对我前一周读过/看过的新材料做(更多)练习,阅读我的思维导图,并努力记住我在里面写了什么。
关于这些练习,我尽量不要花在每个练习上超过30分钟。我们的目标是努力足够记住这个概念,但又不能过多地感到焦头烂额。这是一个微妙的平衡。
我试着重新做一些我第一次做不到的练习,在不同的尝试几天(甚至几周)之后,看看我的理解力是否有所提高。
我试图通过做尽可能多的练习,并在审查思维导图的同时问自己问题,来应用一些积极的学习原则。
从一周到下一周重温我所学的东西对提高我的记忆力和理解力是非常非常有益的。
以下是我在这(几乎)100个小时的计算机科学研究中按时间顺序准确完成的工作。
这篇题为“自学计算机科学”的文章明确指出,我应该“大致”遵循他们提出的学习顺序,从编程领域开始。
这本书被许多人认为是每个开发人员都应该阅读的圣经。它是免费的,你可以在这里找到最好的epub和PDF版本。
这些视频可以在这里找到。课程的注释在这里。如果你搜索一些来自伯克利的考试样本,可以在这里找到。
这些是对这本书的一个很好的补充:与这本书形成对比的是,概念的解释并没有问你太多关于数学的问题。如果你想学习SiCp,但你的数学背景不够扎实,只需按照这门课程学习即可。我的笔记和练习在这里。
本书的开头对于真正理解函数式编程和递归的根源非常有趣。
它以非常精确的方式定义了程序员每天使用的很多术语。完美到在技术讨论中更精确。
书中关于递归的整个讨论对我轻松编写它们有相当大的帮助。这是一个我一直在纠结的话题。现在我可以轻而易举地通过递归来解决任何我想要解决的问题。
这本书不是给讨厌数学的人看的。它是为麻省理工学院的学生写的,他们已经有了相当多的数学知识。如果没有这方面的先验知识,练习有时可能会相当困难和令人沮丧。
这是另一个问题的原因:我在练习上花了太多的时间。我可以解决大多数问题,但在某些情况下需要几个小时。
从那时起,我决定不会在这些练习上花费超过30分钟的时间,以保持较低的挫折感,同时又不放弃这样做的巨大好处。
我越读SICP,我就越觉得练习很难,特别是因为它涉及到一些我不知道的数学概念。因此,我决定继续前进,开始学习数学这门学科。
自学计算机科学建议你阅读LászlóLovász的讲稿,这里以PS文档的形式免费提供。我在这里把它转换成PDF,是给那些不知道什么是PS文档的人看的。我也不知道。
然而,我选择了另一种主要的学习资源,显然更适合初学者:肯尼思·H·罗森(Kenneth H.Rosen)的“离散数学及其应用”。这是一本相当大的书,早期版本相当便宜。
在50小时内,我完成了第一章(命题逻辑),完成了54个练习。
这些来自麻省理工学院的视频是关于离散数学的更高级的课程。再说一次,他们假设你对数学相当了解。然而,尽管我很难理解它们,它们还是非常有趣。
在最坏的情况下,它至少会让你很好地了解离散数学是怎么回事。
有一位老师(汤姆·雷顿)的教学技巧比其他老师好。然而,他们对各自的学科都有很深的了解。
这本书教会了我逻辑的基础知识,这是作为一名开发人员应该具备的一项非常好的技能。毕竟,我们的工作是基于正确的逻辑。
带有量词和推理规则的命题逻辑。基本上,它是编写逻辑语句的方法,验证逻辑语句是否有意义,并证明它们的真值。
集合和图论的基础知识,这要归功于这些视频。它非常有趣,在很多方面都非常有用:状态机、网络…。
真值表对于整理复杂的条件语句或重构它们非常有用。
用谓词、合取和析取(命题逻辑的语言)来表达令人困惑的简短规范可能会显示出矛盾和细节缺失。它可以非常简洁、准确地概括复杂的规范。它可以成为规范和代码本身之间的一座很好的桥梁。
理解如何写数学证明是很难的,特别是当没有人能帮助你或纠正你的证明的时候。
我仍然缺乏一些数学基础,尤其是麻省理工学院的视频。
在我的离散数学知识遇到了其他一些(小)问题后,我决定回到基本问题上来。
指导我选择的另一个重要原因是:我真的很喜欢做一些数学。如果没有这一点,我就不会继续学习计算机科学。
别搞混了:与计算机科学相关的数学与你在学校学过的(也许是讨厌的)不同。我建议你试一试。
在这一点上,我决定在学习离散数学和数学基础之间轮流学习。
这个4小时的视频真的很棒,可以刷新很多东西,从和和乘积到百分比,指数,对数…。通过大量的练习,它很快就覆盖了很多地方。
给出的提示对快速理解和解决基本问题也很有帮助。
你可以在YouTube上看到长达一小时的视频预览版。如果你喜欢,你可以在Vimeo上买到。
我的心算能力提高得很好。如果你在没有计算器的情况下很难快速计算百分比,甚至做简单的乘法,本课程将会对你有很大的帮助。
能够心算对现实生活中的很多事情都很有帮助。快速计算促销,一辆满满的购物车大概有多贵…。
在学习了SiCp和离散数学之后,终于花点功夫就明白了所有的事情,这是非常放松的。我没有遇到太多困难。
如果我可以回到这次冒险的开始,我会按照这个顺序研究不同的科目:
我会同时学习基础和离散数学,然后转到SICP,试图获得一路上我仍然错过的数学知识。
我将继续学习数学和离散数学的基础知识至少150小时:
我对它知之甚少,这已经在我的日常开发人员生活中帮了我很大的忙。
我感觉(并读到)它是计算机科学中所有其他领域的基础。
简而言之:一次非常好的经历,潜藏在我许多弱点的基础上,同时也教会了我我错过的坚实的基础。
但请记住:如果你希望通过学习计算机科学成为一名超级巫师程序员,你可能会失望。计算机科学很难学。它有很强的理论性,即使我在日常工作中已经发现它的一些用处,它也一点也不令人兴奋。
走过这段旅程需要勤奋的工作,需要耐心,需要奉献。有明确的目标,具体的学习计划和享受这个过程是强制性的。
这篇文章是由Matthieu Cneude撰写的,最初发表在The Value Dev上,这是一个专注于软件开发中重要的和永恒的概念的博客。你可以在这里阅读这篇文章。