编程学习指南:从零基础到专业程序员的成长路径

本文详细探讨了学习编程的多种途径,包括大学教育、自学和编程训练营,强调了理解编程概念的重要性,并提供了实际建议如参与开源项目和寻找导师,帮助读者建立坚实的编程基础并成长为专业开发者。

如何学习编程

人们经常问我:“我怎样才能成为一名程序员?”或者“我该如何学习编程?”答案因人而异,取决于个人情况和学习方式。由于这个问题被频繁提出,我决定写一篇文章来分享我的见解。

找到最佳方法

在学习编程时,无论采用何种方法,有一条原则对我非常有用:始终问自己“完成这个任务的最佳方式是什么?”或“正确的方式是什么?”。编程中有许多不同的路径可以实现目标,但通常只有一种是推荐的方式,要么是基于编程语言的最新实践,要么是程序员社区基于经验达成的最佳实践。

通常,你可以通过阅读所学编程语言的文档,或通过Google、Stack Overflow搜索最佳实践来获取这些信息。如果找不到答案,可以在论坛、邮件列表或Stack Overflow上提问。至今我仍然这样做,尤其是在遇到需要学习新知识的任务时。

这样做的好处是,你不仅学会了编程,还学会了如何成为一名优秀的程序员。同时,它迫使你深入理解所使用的工具和语言。如果你持续这样做,最终会对所工作的系统有深入的理解,同时保持足够的实践性以维持兴趣。

当然,你必须确保真正理解所读的内容。这可能意味着深入阅读更多文档,直到理解所有使用的词汇和符号。这没关系!这正是这个系统工作的关键部分——你获得了对所处理符号和概念的真正深入理解。

需要明确的是,当你初学编程并面对具有挑战性的任务时,先用任何方式完成它是可以的。你正在学习基础,而不是最佳实践。这条建议适用于你已经掌握了如何完成任何任务的基础之后。对于纯粹为了学习而做的项目,最重要的是你学到了想要学的东西。但一旦掌握了基础,就应深入探索,尝试看看是否以最佳方式完成了任务。

大学教育

大学中最常教授的与编程相关的科目是“计算机科学”。我之所以说它与编程相关,是因为在大多数计算机科学课程中学到的东西,很少会在作为职业程序员日常生活中真正有用。这并非总是如此——有些领域计算机科学非常有用。但总的来说,我们称为“软件工程”或“开发”的领域与大学所涵盖的“计算机科学”不同。

通常,大学涵盖的计算机科学基础非常有用。我上大学时学习了计算机科学,前两年的学习对我非常有益,尤其是最初的几门课程。我在软件开发的一些基本概念上打下了坚实的基础。

但当时我没有意识到,计算机科学只是部分关于编程的研究。另一部分是算法的研究。(对于阅读本文但不了解的读者,算法是一系列完成某个任务的步骤。这就是它的全部含义。甚至购物清单也是一种算法。)算法的研究通常涉及学习最高效的做事方式。也就是说,找出如何以最少的步骤或使用最少的内存来完成诸如排序整数列表等任务。有些问题除非你知道正确的算法,否则计算机根本无法解决,偶尔你会在编程中遇到需要这些知识的问题。所以它确实有一些用处。但解决这些算法问题并不是你将花费大部分时间做的事情。

即使对于那些提供“软件工程”课程的大学,它们也很少能提供真实世界的完整体验。原因是大多数课程最多只持续几个月,最多让你与几个人合作,代码库只有几千行代码。在现实世界中,你将与大量人员合作,代码库将持续多年,至少数万行代码。然而,这些软件工程课程仍然比什么都没有好得多。

话虽如此,有些大学确实培养出了优秀的程序员,无论是通过计算机科学课程还是软件工程课程。通过大学课程学习编程总是有一些价值的。至少,大学提供了一个结构和纪律,鼓励你完成课程。

自学

与大学培训相反,许多程序员是自学的。他们在网上阅读一些文档,摆弄东西,设法让这些东西工作,最终通过许多痛苦、艰难的经验成为有能力的程序员。

我学习编程的很多方式就是这样。对我来说最重要的是有一个想要完成的任务。你看,编程是一种工具,它本身不是目的。它是一个你用来完成其他事情的系统。所以你必须有一些想要完成的事情。有时你必须自己编造那个任务。例如,我的一个朋友有一个非常简单的游戏的想法。所以有一个夏天,我花了几个星期学习Java,以便编写那个游戏。我已经从大学课程中掌握了另一种语言C的编程基础。所以我对编程并不完全陌生,这帮助很大。

我所做的(也是我推荐大多数人如果想学习某种语言的话应该做的)是,我只是浏览了语言创建者提供的官方教程。对我来说,这是一个旧版本的Java教程。几乎每种语言都有这样的官方教程,或者至少推荐一些你可以学习的网站。通常你只需要在Google中搜索你想学习的语言名称,后跟“教程”一词,就能找到你想要的内容。或者去你想学习的语言的主网站,查看他们的“入门”链接。

如果你完全不知道如何编程,根据你对计算机的经验水平,可能还需要先学习一些其他东西。你可能需要学习一点计算机如何工作、如何编辑文本文件,以及如何通过命令行运行程序(因为这通常是你运行第一个程序的方式)。不过,现在很多这些都被使用基于网络的代码编辑器简化了,你可以在网络浏览器中编写代码并直接运行。要找到其中一个,只需在Google中搜索你的语言名称,后跟“web editor”(不带引号)一词。

一旦你学习了某种语言的教程,有很多方法可以自学编程。Google和Stack Overflow绝对是你的朋友,你所使用语言的官方文档也是。我自学时经常做的是,在语言的官方文档中搜索与我想做的事情相关的词汇,然后阅读那些文档以理解我想完成什么。但这里的关键,正如我上面指出的,是你必须真正理解。如果你对编程非常陌生,有时只是复制粘贴一些代码而不理解它的作用是可以的。但通常这很快就会让你陷入困境,甚至在你自己的理解方面。你会发现某些东西不工作,而你完全不知道为什么。

事实上,不理解为什么某些东西出问题是自学编程中最令人沮丧的部分之一。我猜这是大多数人放弃的地方。某些东西不工作,系统输出一些完全神秘的错误消息,而他们不知道如何修复它。这总是,总是因为程序员不理解编程语言的某些方面、他们使用的工具,或错误消息中的词汇含义。当你复制粘贴了某些东西而没有完全理解所复制代码中的每个词汇和符号时,这种情况最常发生。

是的,逐一学习每个词汇和符号的真正含义可能看起来工作量很大,但这就是你学习编程的方式。程序员对社会有价值不仅仅是因为他们知道从哪里以及如何从Stack Overflow复制粘贴东西。他们有价值是因为他们学习并理解了某些概念,以及如何应用它们。你实际上通过这样做增加了作为程序员的价值。

然而,在没有任何帮助的情况下尝试完成这个过程仍然常常非常令人沮丧。希望如果你正在这样做,当你完全卡住时,有人可以求助,帮助你回答问题。我没有这样的人,有时这非常艰难,我会花30个小时盯着一段代码,抓狂地试图理解为什么这该死的东西不工作。所以如果你有人可以交谈,这通常比试图自己解决更好,尤其是当你刚刚开始时。有时当你对编程完全陌生时,阅读某个东西的所有文档可能会让人不知所措。有一个指导者或至少一个帮手会有所帮助。

编程训练营

介于大学培训和自学之间的是“编程训练营”,这是过去几年出现的一种现象,组织声称可以在X周或Y个月内教人们编程。通常,这些项目实际上提供比大学更好、更实用的教育,尽管其中一些可能不会给你大学培训会提供的理论深度。也就是说,你不会学到太多编程背后的理论(特别是如何良好编程的基础),这些你可能从一些更正式的培训中学到。

作为指南,我会说:如果一个项目承诺在不到一个月内教你编程,它可能是垃圾。你可能在那段时间学到一些Web开发的基础,但你永远无法通过仅仅四周的经验成为一名专业程序员。根据我看到的各种训练营的结果,获得作为优秀程序员的基本技能是一个至少需要几个月的过程。你可能在几周的课程中获得足够的基础,然后可以继续自学其余部分,但一个月的编程不会让你成为专业开发者。

现在,这一切可能听起来我对训练营相当不满,认为成为“真正的程序员”的唯一方式是忍受自学的痛苦。然而,事实远非如此。事实上,我见过从训练营中产生的优秀产品。就个人而言,我见过的最好的编程学校如今可能被称为“训练营”,那就是The Tech Academy。他们做得很好,将不知道如何编程的人变成程序员,这是我总是推荐给那些不想自学的人如何编程的方式。可能还有很多其他不错的训练营。

如果我今天评估一个训练营,我会找出有多少毕业生获得了作为专业程序员的好工作,并尝试找到一些那些毕业生,问问他们的培训与他们日常实际工作的相关性如何。

经验

一旦你通过大学、自学或编程训练营掌握了编程基础,在职业生涯中你能做的最重要的事情之一是选择一些好的首次经验,帮助你作为软件开发者成长。

实习

如果你是一名大学生,我强烈建议你利用许多软件公司提供的暑期实习。这是体验在真实软件公司工作的低风险最佳方式。大多数公司实际上会付钱给你,这也是毕业后被那家公司雇用的最简单方式。由于他们已经有与你的经验,招聘过程要容易得多。

开源

如果有某个开源项目你真的很想参与,试着看看他们需要什么,就去工作 on it。通常,开源项目有一个为新来者提供的可用任务列表,你可以挑选一些任务并开始工作。这里的优势是通常没有截止日期,并且通常有一个非常支持性的志愿者社区,可以在邮件列表、聊天室等回答你的问题。由于大多数开源项目参与一个称为“代码审查”的过程,你还将从更资深工程师那里获得关于你代码的反馈,这也将帮助你作为程序员成长。除此之外,在开源中工作提供了你可以向任何雇主展示的工作证据。(当你为公司编写代码时,通常不能将其带出公司并向其他未来潜在雇主展示作为你是优秀程序员的证据。)此外,公司通常喜欢在你的简历上看到开源参与,因为它表明你对编程感兴趣并有热情。

导师制

当你接受第一份程序员工作时,考虑它将为你提供的成为更好程序员的机会。公司是否有更有经验的软件工程师可以帮助你成长,或者它完全由几乎没有专业经验的新大学毕业生组成?公司是否进行代码审查,即你的每个更改都由更资深工程师审查以帮助你在编程方面变得更好?

也许最重要的是,当你接受一份工作时,确保它是一个关心软件最佳实践的公司。这在软件公司——即主要产品是软件的公司——比其他公司更常见(例如,金融机构雇佣许多程序员,但他们是否深度关心软件质量很大程度上取决于公司甚至你工作的公司部分)。你更有可能在稍微成熟的公司,或者至少在没有可怕截止压力且即将倒闭的公司(例如资金即将耗尽的初创公司)有这种经验。

我不是说你应该仅仅因为他们可能不是完美的工作公司就拒绝你唯一的offer。但请记住,如果你寻找作为程序员的职业和技能成长,你不会通过在不紧的截止日期内为讨厌你的产品但 somehow 被迫使用它的用户编写糟糕代码来获得它。

阅读

网上有很多关于软件最佳实践的内容。也有很多好书。(我甚至写了一些这样的书,如果你正在学习编程,你可能会喜欢。)值得在线阅读各种软件最佳实践,尤其是当它们直接与你实际试图解决的某些实际问题相关时。继续阅读书籍、博客、网站等是保持更新的好方法,有时即使它们不直接实用。例如,偶尔我会去阅读一些新的编程语言或某些CPU功能,不是因为它与我在做的事情有任何关系,而是因为它似乎是我作为程序员应该知道的好且有用的信息。

总结

这就是我通常给人们询问如何编程的建议基础。可能还有其他事情要知道,尤其是我在《Why Programmers Suck》中涵盖的内容。当然,以上所有只是一个需要数月或数年才能真正熟练掌握的过程的总结。但希望这能帮助你学习编程,或提供一个资源,当别人问你同样的问题时,你可以发送给他们!

-Max

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计