【译】给好学进取的开发者的一些建议(自学故事)

2,708 阅读13分钟

原文连接:Tips for Aspiring Developers (Self-Taught Story)


就像是一个不断发展的科目,每天都有新人加入,其中,"我该学什么编程语言","我怎么开始","我怎么找到一份工作","我该从何处学习"等等是最常见的普遍问题。

这些都是有效的问题,并且,希望这篇文章能帮助你们更好的管理这个不断变化的科目,或许变的比以往更好。

注意: 请不要完全以我的建议为标准,我希望你保有自己的看法。他们大多数来源于我个人的经验,以及我周围人的经验,以及我在网络上与他人的交流。另外,如标题所示,本文并不仅仅只针对于开发人员,而是一个希望进取的人,或者刚刚踏入某个领域的人。


我该学什么编程语言

这可能是最常被问到的问题了。你对编程很感兴趣并且决定学习一门编程语言,但是,选谁呢?

在我看来,一开始并没有什么这个语言比那个好。选择一门语言很大程度取决于学习他的人对这门语言的痴迷程度。有些人倾向于 Web 开发(PHP & JavaScript 可能是最为人熟知的),有些人倾向于游戏开发(C#, C++),有些人倾向于桌面应用开发(Objective C, Swift, Java)并且有的倾向于各个方面(Java, C#, Python)。这儿有无数种语言可以选择,有些专注于某个领域,有些则相反。

如果你真的了解自己喜欢的领域,那么你的选择就会比较明确,但如果你不能决定是只专注某个领域,还是多面接触,那么较好的选择就是被用于大多数领域的语言,比如 Java, C#, Python等。

有些人可能会对此有争议——像 Java 和 C# 那样的语言并不是开始的较好选择,有些观点是认为初学者应该从C 或者 C++ 开始入门打基础,但是我个人的首个编程语言是 Java,我和他的联系很深,我非常喜欢和他一起工作。我很高兴我能为 Java 写一些新书,或者可与其一起使用的任何技术书籍。

Java 和 C# 有许多相似之处。资源和内存管理的差异使 C# 在游戏开发中成为更好的选择 ,即使 Java 的速度和内存管理多年来已经得到了显著的改善和提升,C# 仍然被选择适用于游戏领域,并且一段时间内仍会如此。而在另一方面,制作大型企业 Web 和桌面应用程序通常使用 Java 完成,不过我不会再多说了,因为这开始偏离主题了。

Python 最近越来越受欢迎了,并且行业内的使用量也在增加。他被用于游戏开发,Web 开发,机器学习等等。正如我所知的,他比前两个更容易学习,所以对于初学者来说这可能会是一个不错的选择。

我怎么开始

你应该去上大学吗,你应该报名参加课程吗(传统的或在线的),你应该买些书籍吗?

我不认为成为一名合格的开发者必须需要大学。很多人在大学时很失落,并且不觉得他们获得了足够的知识。在我看来,无论你身处什么环境,无论好坏,只要你想学,你就会学到的。

一开始我去参加了本地的一些课程,这是我开始打基础的地方,并且我还可以在这之上再建立一些基础的事物。接下来的几年里,我一直致力于购买像 Udemy (不过这网站emm,我就推荐一下慕课,实验楼啥的吧)这样的网站上的课程,并在像 Packt Publishing (至于这个我推荐一下图灵社区)这样的网站上购买书籍。

不用说,我还非常依赖论坛和社区,StackOverflow 成为了我最好的伙伴,YouTube之类的,我见过很多人都很乐意在网上提供帮助,并且社区真的帮助了我很多很多。

我还注意到一个常见的现象,就是人们通常会关注学习一个事物的前置条件。就像"我需要擅长数学吗","我需要了解物理吗","这对我来说是否太复杂了"之类的。我不确定这些想法事怎么来的,老实说。是的,数学好是一个加分项,有些领域需要广泛的使用和理解数学,比如人工智能和深度学习。但是请明白,对于大多数领域,了解基础,基本数学是正常的。你不需要成为一位数学专家来学习编程。

我甚至遇到很多对数学并不感兴趣的人,在编程领域学习过一段时间后,发现编程更容易理解,更有趣。

了解一些相关概念或者一些简单的计算机科学在学习编程方面是一个优势,但这不是必须的。

在我看来,编程本身并不是那么的复杂,学习语言的语法并不难,因为大多都逻辑清晰使用简单。但是,成为一个优秀的程序员需要知道如何使用语言的语法来使其更加高效的工作。他需要具有通用性和实用性,有时那会是一个抽象的方法。并且那需要通过大量的思考而且这是非常关键的部分。幸运的是,他们不需要是与生俱来的特性,如果在一开始他就是有缺陷的,可以通过其他方式去实现。

我可以在哪里学习

我个人的看法是,在哪里都可以学习。无论环境或是周围的人如何。但我想回答这个问题的更好的方法是举几个例子。

网上有许多免费或者付费的服务,你可以使用他们开始学习!

这里是几个例子:

  • CodeAcademy - 一个非常受欢迎的网站,拥有着良好的声誉。该网站提供了一种互动的方式,通过提供部分理论来平衡实践和理论,你可以在线使用他的内置编译器来练习你所看到的内容。
  • freeCodeCamp - 他有些不同,首先他关注理论,然后是练习,他支持你建立自己的项目,获得证书,并将开源项目添加到你的简历中。
  • CodeWars - 本文后面有一个关于他的单独内容。
  • W3Schools - 主要关注 Web 开发,这是学习HTML, CSS, JavaScript等技术的较好的场所之一,尤其对初学者来说。
  • Udemy - 我的最爱之一。Udemy 提供各种各样的课程,而且很便宜。在我看来,我更喜欢付费课程,并且再强调一下 Udemy 的课程真的便宜。不要被蒙蔽了,虽然你经常都能看到价格标签是 200300,但是那只是一种营销手段。Udemy一直都有各种折扣。一次我没有再折扣时间内获得一些课程,之后才迎来了一场大折扣,预计每门课程不超过200 - 300, 但是那只是一种营销手段。Udemy 一直都有各种折扣。 一次我没有再折扣时间内获得一些课程,之后才迎来了一场大折扣,预计每门课程不超过10 。
  • edX - 由麻省理工学院和哈佛大学提供支持的知名教育网站。包括一些免费课程和付费认证。
  • Khan Academy - 另一个受欢迎的网站,提供各种领域的课程。
  • Udacity - 提供编程相关或者非相关的免费课程,以及有偿学位和证书。
  • Packt Publishing - 我的另一个最爱。Packt 的书从不让我失望,并且我很高兴总能得到一些新事物。不幸的是,他们的书相当贵,但是幸运的是,你还是可以享受折扣并以便宜的价格购买-约 15$ 美元左右。

总是保持好学的心

我认为好学是非常重要的。这是一个每天都在变化的科目。一年前的理想解决方案,现在可能就被淘汰了。我去年买了一本 Angular2 的书来扩展我的工作领域,但是我仍然还没有阅读他,然后突然间我发现,Angular6 几个月前已经发布了。

我喜欢教学,并认为这是进步的一个重要方面。爱我所做的事情让我每天都能学到新东西,而学不感兴趣的事或者强制性的学习会让我很难受。我不认为这是时候学习并且学习几个小时了。我注意到自己正在阅读新文章,获取最新的信息,并为他的乐趣制作应用程序,测试自己的挑战,只是因为他很有趣。

老实说,学习这些需要花费大量的时间,保持不断的跟进和学习,但如果你喜欢这样做,那就不难了。

"成为开发人员"需要多长时间

"成为开发人员",这是一个需要讨论的主题,而另一个则没有答案。

我可以告诉你的是,通常平均需要多长时间才能达到可以开始工作的水平。

这取决于学习的人自己,但学好任何一门语言都至少需要一年的时间。但是要记住,一旦你"成为一名开发人员",你就永远不会停止学习。

年限知识水平
1 年一年的知识,你应该能够创建简单的应用程序,并且至少具有一些与你选择的语言相关的流行技术和框架的经验。
2 年我认为至少需要 2 年的学习才能被认为是初级开发人员,能够真正的负责一个项目的开发。
3 - 4 年3 - 4 年的时间,你可以被认为是一个成熟的开发人员,或者称为中级开发。
4 年或以上这也取决于你自身,但我经常看到 4 年以上的开发者被称为高级开发。

请记住,仅仅是投入你的时间并不会让你成为开发人员。还要加上你投入的努力。有时拥有 2 年经验的人可能比拥有 3 年经验的人更好。这意味着我的表格仅用作与参考,或者作为你在不久的将来可能投入的时间的概念,去看到一些结果。

失败

在某些事上做错了,是很常见的事,无论是制作在线平台还是AI,视频还是游戏或其他任何东西。

当我觉得我无法做任何事时,我总是感到疲惫,我陷入了"编程死区",总是会卡在同样的错误上,有时甚至是好几天。这让我感到绝望。我不得不承认,这并不总是那么容易,但是当你终于解决了他,便能体会到什么是"山穷水复疑无路,柳暗花明又一村"。经历这些起伏是在任何领域取得进步的基本过程,毕竟,胜败乃兵家常事,你得学会坦然受之。

专注于一件事

成为一门语言的大师,好过成为所有领域的学徒,这会是一个好的起点。像是 DevOps 这样的潮流很受欢迎,在一个职业中统一了很多领域,但我不建议初学者学习。如果你希望能够完成常规团队所做的一切,请便,但那需要大量的知识,意愿和经验才能做到这一点。

实践

实践可以让你找到问题所在,这是编程的一个非常重要的特性。一旦开始编程,实践也将提高你的技能。

根据我的经验,CodeWars 是训练和实践的好地方。

CodeWars 为 Java, PHP, Python, Ruby, JavaScript, C#, Clojure, Go, SQL, Swift, TypeScript, C, C++等一系列不同的语言提供了无数的挑战。

他是由我所热衷的传统东方风格的形象制作的,我很喜欢他们介绍的 Katas (个人训练/挑战) 和 Kumite (陪伴/挑战他人) 的荣誉系统,他会随着每个完成的Kata 或 Kumite 增加。你从 8kyu 一路前进到 1kyu,不就像是一个初入江湖的少年最终成为一个名满江湖的高手一样吗。

CodeWars 有一个庞大的社区,你可以学到很多东西。

总而言之,万事开头难,不要气馁。这些 Katas 不容易解决,需要你的知识和智慧。

没必要重新发明轮子

在大多数情况下,没有必要重新发明轮子。你能在网络上找到大多数解决方案,随时可以使用。使用他人的解决方案,可以让你专注于自己的工作。虽然从头开始做所有事请是有益的,但是也让你的愿景变得模糊,并使你偏离原来的轨道。

试着阅读别人的源码

即使每个人都有自己的编码风格(命名,格式化等),你也应该去试着阅读理解他人的源码。

当你进入办公室或团队的开发环境时,你必须与他人合作,你必须能够理解他们写的代码。团队合作可以帮助你更好的维护和升级现有的代码,同时那会改变你自己的风格,而只有你改变了风格,才会导致你重新发明轮子。

在你学会跑之前先学会走

如果你刚接触某些事物,那么在尝试这个事物的高级用法之前,请先建立一个扎实的基础。

如果你试图强制运行,可能CPU会直接爆炸(233我就是皮一下)。

为了之后的高楼大厦,请先打好地基。

成为社区的一员

成为社区的一部分是一种典型的人类特征。我们喜欢整理和组织我们感兴趣或有益的事物。如果你的城市举行有关计算机科学或某种你感兴趣的编程语言的聚会,那还等什么呢!

无论你的知识水平如何,那不阻碍你和他人交流讨论。你可能还会找到志同道合的其他人。我经常和朋友们交换书籍和课程,我们每个人都批量购买和分享资料,所以即使你预算很紧张,也不难用这种方式获得有用的资料。

写注释文档是一件好事

这不是最有趣的事,但是对于你自己和你的团队都是非常有益的。如果你写了某个功能并且一段时间没有使用过,你可能就会忘记他是如何工作的。这件事发生在我身上时,重新审视项目就会让我很迷茫:'我在这里做过什么?'。

这会导致大量时间浪费在理解旧代码的功能上,但是只需要写一些简单的注释文档,这将节省所有人的时间。

血泪史让我必须告诉你们,养成这个习惯,是非常非常有用的。

结语

说了这么多,是时候结束了。我希望这篇博客可以帮助任何踏上这条路的人,我希望我的个人经历可以通过这种方式回报社区。希望你能从中获取有用的信息。

Good Luck!