学习编程,无需浪费时间和金钱
注意:这是一篇联合文章。如果您感兴趣,可以在我的开发博客上查看原文。
我记得高中时读过一篇短篇小说,讲的是一位胸怀大志的作家。他投入了大量的时间和金钱,买了一支高档钢笔和一本装帧精美的笔记本,买了一张只有严肃作家才会坐的书桌,书房里摆满了他从未读过的旧书,幻想着写作的美好未来。这幅画里缺少的是墨水触纸——他什么都做,就是不写。
同样的事情也经常发生在想要进入软件开发的初学者身上——他们安装了各种各样的 IDE 和工具,但他们并不真正了解这些工具的用途,浏览初学者学习的最佳编程语言的列表,并且通常将大部分时间花在思考编程和试图提出项目想法上,而不是......好吧,编程。
选择一种语言,任何语言
与其浪费时间比较不同的语言,不如直接选一门语言开始写代码。其实这都无所谓。学习 Java、学习 Python、学习 PHP、JavaScript、Go、Scratch,或者任何你想学的语言。初学者只要能真正开始,什么都可以。你不应该在还没有经验的情况下,浪费时间争论各种语言的优缺点——毕竟,经验才是你真正需要的;语言只是达到目的的一种手段。
YouTuber Michael Reeves 在他的一个视频中很好地解释了这一点:
只需选择一种并开始学习编程...所有现代编程语言都非常强大,它们可以完成各种各样的事情。
我记得本科第二学期,我的编程基础老师听到我抱怨学习C++时,给了我一些非常有见地的教诲。当时,C++对我来说完全陌生,而且让我感到无比沮丧。他说,这个学位的目的不是教我们如何用任何一种特定的语言编程,语言只是程序员工作的工具。我们希望毕业后,我们能够根据需要学习任何一种语言。我们的目标是学习如何像计算机科学家一样思考,而不是把自己局限在任何一种特定语言的狭隘框架中。
语言仅仅是程序员完成工作的工具。
现在,这里有一个值得一提的警告:作为初学者,您选择的语言将影响您对软件开发的最初看法,并决定您最终是否真正喜欢编码,或者是否会失望而归。
许多大学课程向初学者介绍 Java、C++ 以及(麻省理工学院的)Python,这是有原因的:这三种语言非常流行,涵盖了众多软件开发领域,因此实用且值得学习。此外,由于它们是通用语言,因此初学者更容易上手。
我的建议是:不要只选择一种语言就放弃它。最明显的原因是,并非每种语言都适合解决所有问题。此外,将你的世界观局限于单一的语言范式会严重阻碍你作为开发者的成长。
相反,我建议用你最喜欢的语言来学习编程基础知识、算法和数据结构,并逐渐走出你的舒适区。所有这些都与语言无关,并且易于迁移。一旦你掌握了这些技能,你会发现学习新的编程语言就是习惯一种新的语法(或许还有一种新的思维方式,比如从面向对象语言过渡到函数式语言)。
不要再浪费钱去学习你永远学不会的课程
Udemy、Udacity、Lynda、Vertabelo Academy、Codeacademy Pro 等等。这些平台有什么共同点?它们都是在线平台,目标客户是那些感到不知所措或对职业发展感到失望、希望尽快实现职业转变的职场新手。这些平台随处可见,但我认为它们对学习实际编程不利,因为它们提供的资料很少比网上随时可用的免费内容质量更高。
这些课程最大的问题在于持续不断的指导——这很不公平。你需要自己研究,犯错,破坏代码,学习如何调试,所有这些宝贵的经验都会伴随你一生,最终让你成为一名更优秀的程序员。简单地照搬老师的做法或许能帮助你形成肌肉记忆,但却无法让你获得只有亲身体验才能获得的深刻理解。
你有没有注意到 Udemy 的课程总是打折?或者这些平台几乎对每个问题都提供了提示,或者讲师直接告诉你如何做某件事,或者他们甚至在视频中直接进行谷歌搜索,而不是鼓励学生自己去研究这些内容?这些都是危险信号。
很多这类课程都涉及被动学习,即使它们鼓励你跟着老师的指导,在自己的机器上打字练习。为什么?因为你实际上并没有自己发现问题,然后寻找解决问题的方法。这就是人们学习的方式——通过经验、好奇心和失败。
很多这类平台都隐藏着一层薄薄的主动学习的面纱。实际上,你正在做以下三件事之一:
- 将老师手写的所有内容都打出来。
- 直接复制粘贴他们的代码或从他们的 GitHub 克隆一个 repo。
- 甚至没有编码——只是听,并希望一切都坚持下去(剧透:它不会)。
然后,一周后,你发现自己不得不重新回顾之前的练习(甚至是相关的视频)来回忆如何做某件事。如果是这样,那么你显然什么都没学到。
现实:开发人员必须不断在网上搜索信息,浏览 Stack Overflow 帖子、Reddit、YouTube 教程、文章,甚至官方文档——我敢说——才能找到问题的答案。但是,既然可以花钱请一位老师教你怎么做,为什么还要自己费力寻找答案呢?这会让你感到安心又安心。
同样,这些平台也让你免于在自己的机器上设置一项技术,虽然过程有些棘手(但很有价值) 。相反,它们提供了一个舒适的小型沙盒环境,让你可以随心所欲地编写代码,而无需了解从你编写代码到计算机解释和理解代码之间发生了什么。如果你打算认真投入时间学习和在现实世界中使用一项技术,为什么不花点时间了解如何在自己的电脑上使用它呢?
我承认:我确实理解沙盒环境的吸引力。它能让你专注于重要的事情——学习语言——而不会被任何障碍所困扰。毕竟,医学院的学生不会在真正的病人身上进行手术。但你也不能指望永远在尸体上做手术。
以下是我曾经购买的两门 Udemy 课程,我认为它们是实现我当时的目标(显然是 Web 开发和游戏开发)的关键:
我两门课都只学了大概10%,因为实在无聊透顶。我不是那种能忍受坐在教室前听完一堂又一堂的课,然后断断续续地做些“现在你试试”的练习题的人,而且这些练习题大部分都挺无聊的。我做任何事都需要一个背景——一个真正相关、有趣、有挑战性、并且我想做的项目。待办事项列表应用对我来说不太合适,因为它们不是我真正想做的。在学习游戏开发的时候,按自己的方式做游戏可不是我想要的。
例如,我通过创建自己的个人网站,几乎掌握了所有关于 HTML、CSS 和(部分)JavaScript 的知识——我先有一个愿景,然后研究所有必要的部分,最终将其变为现实。我利用自己的时间和条件,学习了 Web 开发和游戏开发。
在佛罗里达大学学习游戏人工智能课程时,我对 Unity 游戏引擎和 C# ——也就是我们即将使用的主要技术——一无所知。我是如何能在这么短的时间内学会这些的呢?通过开发一款我自主设计并真正感兴趣的游戏。通过谷歌搜索、阅读教程,以及亲身经历尝试实现目标却屡屡受阻的艰苦过程。此外,还要与其他开发者合作——而这些是在线课程很少会涉及的。
你想做什么?想清楚了,然后开始谷歌搜索。如果你觉得某门课程适合你,至少不要浪费钱去买——网上有很多免费资源可以帮你找到目标。
通过阅读代码学习编码
能够熟练地阅读他人代码是任何开发者的必备技能。就像阅读书籍可以让你接触不同的文学风格、技巧、体裁和主题,从而帮助你成为一名更优秀的作家一样,阅读代码也可以让你接触不同的解决方案、架构、设计模式和语言范式,从而让你成为一名更优秀的程序员。
我清楚地记得,当我编程经验只有一年左右的时候,我害怕阅读别人的代码。你不熟悉代码,所以一切对你来说都很自然,你会感到沮丧,并质疑作者为什么使用某些命名约定或设计模式。如果你有这种感觉,你可能一头扎进一个复杂的项目,而不是初尝苦头。
以下是我对如何提高代码阅读技能的建议:
-
加入 Stack Exchange 网络上的Code Review之类的网站。初学者(甚至高级程序员)经常会在这里发布他们的代码,供经验丰富的开发人员审阅。对于初出茅庐的程序员来说,这是一个非常宝贵的资源。我建议你完整地阅读原始发帖人的代码,尽可能地慢。然后,查看回复,看看其他开发人员提供了什么样的反馈。了解他们提出这些建议的原因可以帮助你避免在自己的代码中犯类似的错误。如果需要,你可以整理一份常见错误列表,并列出相应的建议。不过,随着时间的推移,你应该不再需要这样的参考——通过反复接触同类问题,这一切都会成为你的第二天性。
-
阅读教程。但需要注意的是:切勿盲目地照搬单个教程,在不理解代码真正含义的情况下复制粘贴内容。相反,应该阅读几个(2-3 个)关于同一主题的教程,并仔细阅读。这样做有两个好处:1)这样可以减少被缺乏经验的开发人员误导,避免他们传授一些不好的做法;2)如果两个教程之间存在任何差异,您可以研究这些差异,以便更好地理解为什么某些决策在一个代码片段中有效,而在另一个代码片段中无效。
我发现第二个技巧在从头学习 CSS 时特别有用。最初,我很害怕阅读其他人的样式表,因为我从来没有真正理解他们的规则在做什么。那么我是怎么做的呢?我阅读了W3Schools、MDN、CSS-Tricks和其他网站,以找到在前端做同样事情的多种方法。然后,对于呈现给我的每一行 CSS,我都会在本地输入代码,刷新浏览器,并在脑海中记下发生的视觉变化。如果有什么不清楚,我会立即停下来,用 Google 搜索该特定的 CSS 属性,看看它到底是做什么的。所有这些都涉及阅读、阅读、以及更多的阅读。它永无止境——如果你认真对待开发,这是一项重要的技能,无论你选择追求什么专业。
熟悉设置开发环境
在处理大型代码库(尤其是非您自己的代码库)时,了解如何正确设置本地开发环境,并使用所有正确的工具和依赖项至关重要。如果您是新手,可以考虑以下练习:使用GitHub 的“探索”部分找到一个有趣的项目,并将其克隆到您自己的机器上。然后,按照其 README 中的说明设置您的开发环境,并在本地成功构建该项目。
这项练习具有巨大的价值,因为这是所有开发人员在工作中都需要掌握的技能。如果您遇到任何问题,请在网上搜索一下;其他人很可能之前也遇到过同样的问题,并且已经在 GitHub、StackOverflow 或 Reddit 上报告过。如果您实在找不到答案,可以考虑在代码库中创建一个问题来寻求帮助。
其中很重要的一点是学习如何轻松进入终端环境,减少对传统 GUI 的依赖。特别是,了解如何使用 Bash Shell 及其常用命令,将大大简化您的开发者工作。如果您想兼顾两者,可以考虑使用Visual Studio Code作为您的 IDE——它是免费的,内置终端支持,拥有免费扩展程序市场,并且能够与 Git 等版本控制软件流畅集成。所有这些都是您最终作为程序员需要用到的。
关于 Git 的说明
说到版本控制,如果你对 Git 感到茫然,那么请记住:没有比实际在实际项目中使用 Git 更好的“学习”方法了。网上有大量教程和视频,声称能在短短 15 分钟内帮助你理解 Git,但讽刺的是,它们都忽略了关键点:Git 是一项应用技术,如果单独使用,很难理解或体会。观看视频时,你可能觉得一切都很清晰,但除非你亲自使用 Git,否则第二天你就会忘记它。
你绝对需要将 Git 与一个实际操作项目联系起来——最好是一个涉及多个协作者的项目——这样才能理解为什么功能分支工作流程是普遍接受的标准,或者为什么你永远不应该对公共分支进行变基。这也能帮助你熟悉存储工作、切换分支、修改提交以及检出特定提交的操作。这些操作在我几乎没有 Git 经验的时候都会让我感到害怕,但一旦你掌握了它们,你就会明白它们为什么如此重要。
我还强烈建议您避免使用 Git 的 GUI 客户端,因为它们会妨碍您掌握和记住常用的 Git 命令。命令行是您的朋友,而不是敌人。如果您难以记住某个命令的作用,或者难以记住如何在 Git 中实现某些功能,请随时参考Atlassian 文档——它们写得非常好。您还可以在 StackOverflow 上找到许多常见 Git 问题的优秀答案。
知道 Leetcode 不是答案
还记得SAT和ACT吗?大多数人都不想去。那段时间,你得死记硬背那些将来可能用不到的材料和词汇,只是为了证明自己的智力,好考上大学。我讨厌整个过程,只珍惜其中学到的一两个数学技巧。
Leetcode 也是如此。招聘行业普遍存在一种(可以说是有害的)做法,即根据程序员在白板上解决编程难题的能力来衡量其能力,这催生了 Leetcode、Hackerrank 等许多致力于帮助开发人员掌握解决难题技巧的平台。我个人很幸运,在面试中没有经历过这种折磨,我希望你也不会。
有人告诉过你,如果你想在科技行业找到一份好工作,就必须死记硬背Leetcode吗?别听他们的。如果你想进入顶尖的独角兽公司,这或许是可行的,但对于大多数开发者职位来说,这并非易事。你能做的最好的事情是参与个人项目,深入了解你未来想要使用的技术,并扎实掌握计算机科学基础知识(这在面试中肯定会被提及)。如果你发现自己总是死记硬背,那么你的方法就错了。
话虽如此,我承认 LeetCode 上确实有一些相当有趣的题目,它们能够激发你的思考,并测试你对计算机科学基本数据结构的理解。以下是我个人最喜欢的:
所以,如果你对解决这些问题感兴趣,不妨一试。但不要把时间浪费在练习 Leetcode 思维上,这会让你成为更好的程序员(或者让你成为更胜任你申请的职位的候选人)。这在整体规划中只是很小的一部分。
别再自责了
失败很糟糕。很多次。但你需要习惯编程通常会带来的挫败感,因为它是不可避免的。
这就是在线编程课程往往令人失望的地方——一旦训练轮脱落,只要你遇到一个不熟悉的问题,恐慌就会出现。因为到目前为止,你遇到的每个问题都有解决方案:一位老师会很乐意告诉你如何去做某事。
然后会发生什么?人们转向 Quora、Reddit 或其他他们经常访问的论坛来发泄和寻求安慰,被告知编码并不那么难,他们并不笨,而且随着时间的推移他们会变得更好。
真相是什么?你并不笨。学习编程实际上就是学习一门新语言——一开始会有一段艰难的过渡期,大部分时间你只能死记硬背、重复学习,很少有东西能真正凭直觉理解。但最终你会豁然开朗,回过头来看看自己一直以来都在做什么。最终,你会豁然开朗,成为你的第二天性。
但别误会:实现这一目标的过程绝非易事。一旦你真正做到了,你就会意识到自己并非编程高手(有人会说是吗?),而且你仍然有很多知识缺口。不幸的是,人们被误导,认为编程比任何其他高薪技能都更容易掌握,或者花钱上课就能保证成功。事实上,成为一名优秀的开发人员需要多年的实践、自我激励和努力工作。
当然,你永远不会停止学习。
鏂囩珷鏉ユ簮锛�https://dev.to/aleksandrhovhannisyan/learn-to-code-without-wasting-time-money-2k0e