[译] 学习编程旅途上的心得与工具

编程是一个值得拥有的伟大技能。它给了你构建、修补和发明的能力,然后让你在个人和职业上都能收获巨大的奖励。它打开了通向各种各样职业生涯之门,伴随而来的是丰富的收益,即体面的薪水、随时随地工作的自由,或者以上全部这些。


所以,为什么越来越多来自不同背景的人都决定开始学习编程,也就不足为奇了。但是,每个尝试这项任务的人很快都会面临着一个不愉快的事实:学习编程好难。


起初,会感到复杂、疑惑,因为大部分代码根本一点意义都没有。与期望的相反,“我搞不懂它”的感觉在整个学习途中也许只增不减,这使得热情的初学者感到无助、迷茫,甚至准备放弃。


这个故事的寓意就是:做好准备。因为通往程序乐园是一个漫长的旅途,若一开始没有正确的心态,将会很快就失去此中的乐趣。


在此篇文章中,我将会尝试为你提供一些引导,包括:在你的旅途中应该做什么、如何更好地做到、以及沿途中对你有帮助的工具和资源。


应该做什么

显而易见,你首先要考虑的就是写代码,它的本质是一门技术学科。你最早需要掌握的技能需要大量的“精确”与“正确”,并且任何偷工减料都会让你一无是处。你至少需要学习一丁点数学,或者那些看起来像数学的东西,例如程序逻辑。


要点就是,学习编程的基础需要大量的专注与实践。然而,无以计数看起来是技术或非技术的人已经先于你已经开始了他们的旅途,所以不用过于垂头丧气。正如我们将会看到的那样,有大量专为你这样的初学者而准备的资源来帮助此旅途尽可能的简单。

一开始学习编程的成本是很陡峭的。在太多的“基础原理”需要掌握,包括编程语言的各个部分(表达式、变量、数据类型、操作符、循环、条件判断、函数、类),帮助理解运行你的代码需要使用多少CPU时间和内存的技术(非常复杂)。你将会编写很多一开始无法运行的代码,因此你将不得不忍受让每一个程序员都痛苦的经历:调试。


一旦你学会了怎样写代码,你就能学会怎样编写更稳定的代码。让代码更高效,容易阅读和理解,并且便于扩展,是一门艺术,其中还包括持续演进。你将能够开始探索不同语言的原理,并从一个简单的“码农”进级为一个“软件工程师”。这也是一个需要大量时间和实践的过程,但是你越精通,为你打开的机遇就越多。


怎样学习编程

通往编程乐园的旅途,各有各的不同,但这里还是有一些好的原则可以让旅行者从中获益。如果你才刚刚启程,以下是我推荐的基本过程:


1、选择你的目的地:掌握一门语言,任何语言都行

如果你真的打算学习编程,你所选取的语言其实并不重要。大部分流行的编程语言都有着相似的基本原理内容,并且当你完全掌握了你的第一编程语言后再去学习一门新的语言将会轻松很多,而不是一开始就挣扎于一堆语言。如果你是通过大学的学科或类似的方式来学习编程的话,你的语言可能已经被选择好了。


不管怎样,除非你确切知道在这个长跑中你想做什么,只有5门语言是我推荐值得考虑的:Ruby,JavaScript,Python, C,Java,这些语言在学习的容易程度、获得知识的广度以及长期工作项目的数量之间有着很好的平衡。


以下是帮助你进行决定的一些提示:


解释性语言

解释性语言容易上手。这是因为他们的代码一写完就能马上运行。相反地,编译性语言在编写代码和运行代码之间需要一个额外的步骤。


因此,用解释性语言可以更快地编程,但他们并没有高效地利用计算机资源,也容易存在一些不易察觉的bug。他们适用于那些对于性能并不是很优先的应用。这些语言在网站开发中很流行。事实上,其中的JavaScript,是唯一可以直接在浏览器执行的语言,由此使得它能够快速成为众所周知最赚钱的语言之一。

编程语言
优点
缺点
通常用于
Ruby
  • 非常灵活的语法

  • 容易上手

  • 需求大,工作待遇好

  • 灵活性会使得底层模糊不清

  • 性能低,不适用于高端应用

JavaScript
  • 浏览器内软件的唯一选择

  • 对于每一个现代的站点都至关重要

  • 需求大,工作待遇好

  • 复杂的语法有时会让人感到疑惑

  • 对于初学者,比Ruby或Python更有挑战性

Python
  • 有让人喜爱的优雅、简约

  • 容易上手

  • 性能低,意味着不适用于商端应用

  • 网站后端,可见 Diango

  • 科学性研究和学术,可见 SciPy


编译性语言

编译时,代码在它运行之前会从人类可读的代码转换成机器能够直接执行的代码。这也就是为什么它会比解释性语言更快、更高效。编译器其中一个职责就是确保所编写的代码都“有意义”,因此它可以识别并且预防各种各样解释性语言容易出现的bug


出于这个原因,用这些语言却想把这些错误或者差的代码置之不理是很难的。他们会强制你去很好地理解“在底层”到底做了什么,你也会学到更多关于计算机是如何工作的。对应的代价是这些语言更劳动密集型,并且典型地对于初学者学习挑战性更大


编译性语言用于要求高性能和稳定性的应用,其中包括运行于资源严重受限的硬件的嵌入式应用,和甚至一个小小的bug都能造成极大破坏的庞大又复杂的应用。

编程语言
优点
缺点
通常用于
C
  • 能比其他”高性能编程语言“交付更好的性能

  • 可以教会你更多关于计算机如何工作

  • 本次推荐列表中最难以掌握的编程语言

  • 操作系统

  • 高端电子游戏

  • 嵌入式系统

  • 机器人和人工智能

Java
  • 全球使用最广的语言

  • 严格的书写强制着要有清晰、高效地思维方式

  • 复杂的语法导致阅读和工作笨重

  • 许多人认为过于老式、片面、接近下降

  • 大型企业应用

  • 网站开发

  • Android开发


HTML和CSS:非编程语言

应该注意到HTML和CSS不是编程语言,虽然他们基本用于每一个网页。他们是展示性语言,用于定义如何展示和应该包括什么,而非如何运行。不管怎样,HTML和CSS都是一个不错的起点,因为他们更容易上手,并且能教会你如何把代码编写正确。此外,如果你打算进行网站开发,某种程度上你也需要学习HTML和CSS。


2、快速开始

学习需要时间,因为有太多内容需要吸引。如果你打算第一天就想尝试构建一个完整的应用,那基本是行不通的。为了不至于陷入沮丧,从解决一个简单的小问题开始,可以让你走得更为顺畅。


例如,传统上学习一门新的语言时编写的第一个程序就是在屏幕上打印”Hello World“的”Hello World“程序。在大多数语言里,基本上不会编写一个简单而又没有什么实际的作用的程序。然而,它依然结合了编程语言中很多的基本原理部分,所以它对于一个人入门如何编写某一语言还是很适用的。


在这里,你可以编写对一些数字进行加、减的东西,然后从用户那获取输入。随后你可以学到决定路径的条件,和执行重复操作的循环。很快,你就能够准备构建你第一个项目,那时你也就能够开始经历如何构建 一个完整应用了。


3、要有耐心

编程的核心部分可以很有挑战性。但如果你还没明白计算机在底层是如何工作的话,这些挑战并非显而易见。


比如,当我一开始出发时,我觉得调试是一个很让人受不了的过程:它看起来一点都不像是在编程。因为我得花费整整一天去排查我写过的代码,尝试去找出问题的所在,”我这一次要***怎样才能搞定这个问题呢“不断在我脑里回旋,让我崩溃得几乎快要放弃,而不是写一些新的代码做一些更酷的事情。最后最后,我发现我在某处漏了一个分号,或者使用了缩进来代替空格,而当我让我的代码能够再次运行时,一天又过去了。那时我感觉我完完全全就是一个笨蛋,简直是在浪费时间。


这样的事情,也会发生在你的身上,同样地它也会让你抓狂。所以,对于调试的技巧就是:要有耐心,并且放松点。在《对于初学者学习编程的最好方式是什么》一文中推荐注重过程,而非结果。如果你注重最终的结果(如”我在要六月底前构建一个网站“),你将会觉得沮丧,并且感觉自己像个失败者。随着过程一点一点地前进,你将会更成功。


4、实践、实践再实践

一如任何技能,编程也在于功多手熟。要想更好地学习地编程,没有比实践更好的方式了。即使你一周只有业余的几个小时,只要能坚持定时实践,总有一天,你将会找到编程的真谛。最后,你将能拥有可以在短短地几秒钟之内搞定问题的直觉,而在此之前可能需要花费你整整一天(如追踪调试一个bug)。


一旦你觉得自己已经差不多掌握了编程语言的基础部分后,进行实践的一个更好方式是开启你的第一个项目。设想一个你想构建的简单应用,比如一个待办列表,一个计算器(再一次,快速开始),然后撸之!这将会教会你怎样去解决架构和设计上的问题,以及如何构建不同的部分使之可以相互融合成为一个能够工作的整体。这些都是可以让你能够自称为程序员的基本技能。


资源

根据你的目标、学习风格和用意,在旅途中你可能需要使用到不同的资源。为了帮助你决定什么方法适用于你,这里快速整理了一些你能够用得到的工具,粗略涵盖了从结构化学习到非结构化学习。


结构化学习

如果你不是以学业为重,此部分建议的目录将提供教师、作业、测试、等级、期限和实在的结果。而这些建议需要你走进一间课室或者在编程之外。


正规大学学位

花费最大但对于大部分人来说,又是最有价值的建议就是获得一个正规大学的学位,它可能让你有机会为开启编程和计算机技术的职业生涯打下最好的基础。根据你申请的大学和学位,你将会收到对应的录取通知书(等于一条脚迈进了职业的生涯)。但是更为重要的是,你将能塑造出可以洞悉计算机所有一切的本领,以及编写确实无可挑剔代码的能力,而高效的软件正依赖于此。

以下是你可以从大学课程中进行更深入学习的内容,而在非大学里学习这些将会更难。

  • 电子电路:几乎全部电脑硬件的基本物理底层。

  • 数字逻辑电路:怎样用电路表示真和逻辑结构。

  • 微机与计算机系统:如何将逻辑电路结合成一个能够被编程和计算的机器。在这些元件和打印总线上发生了哪些事情。

  • 操作系统:如何编写一个能够进行管理、组织、自我保持和制授权各种各样应用程序进行安全性操作的电脑。

  • 数据库:如何存储和复制海量的数据且无丢失、不被破坏,并且易于搜索。

  • 网络:各种不相关的计算机系统如何进行通信。

  • 高等数学:包括微积分和线性代数。对任何尖端领域的职业生涯都是至关重要。

  • 单片机:如何从模拟世界穿越到数字世界。

  • 数值方法:用姨夫现实世界的问题不能很好的映射到计算机时。

计算机科学和工程学校会让你痛不欲生,你不得不担惊受怕,不得不强迫自己完成这些学科。但是一分耕耘一分收获。我曾经也为获取我的学位而苦苦挣扎,但是我拿到毕业证的那一天是我人生中最美好的日子之一。


训练营

所谓的训练营是用来满足那些没有时间或资源去追求一个正规学位,但又愿意更努力工作,或者至少想学习开启软件开发职业生涯最基本要求的人的需要。对于一个正规的学位与接下来要讨论的半结构化学习,训练营所需要的代价和承诺在于这两者之间。


训练营的课程通常在8到12周之间,学费金额约10,000刀左右。他们在短时间内覆盖了绝大部分内容,在此期间你得牺牲你的大部分其他业余爱好。但是,他们会承诺为你准备实际的开发环境,并且让你以最快的速度进入编程的生涯。很多训练营以职业生涯的日子告终,或者在你一毕业就为你安排一个职位。


相对来说,训练营在最近这几年是一个爆炸的现象。因此,尽管很多都提供了关于就业率的追踪报告,依然很难评估他们的成功率有多少。也就是说,当这个新兴的爆炸式行业在持续快速发展的过程中我们只能期待有更好、更具价值的流程出现。如果你仔细地埋调查,你将会发现训练营是否适合于你。


大部分的训练营都是有固定场所的,你可以你的城镇上找到那些对你有作用的训练营。如果你居住在大都市,也许你可以在这里这里找到你想要的训练营。


半结构化学习

现在越来越多的资源变得随手可得,这些资源来自那些工作于有很好结构和指导但是又没有时间或资源提交给正规则大学或训练营的人。而这些资源通常提供在网上,且大部分是完全免费的!随着对这些服务的高度需要,这些工具迅速发展,日益成熟并且体现了它们的价值。本质上,软件开发或多或少也受到这些工具演进的驱动,正如软件的学习与教育的相互促进。

你真的想成为一个程序员,对吗?以下这些技巧和工具将能帮助你如何开始。


海量在线开放课程(MOOC)

MOOC是一个惊人的资源,并且在质量和支付得起的教育中取得了重大的进展。他们通过在线的方式将世界上最好的大学课程的结构和指导提供给任何一个能够连得上互联网的人。很多流行的MOOC也都是完全免费的,尽管还会有一个额外的价格(以此承诺坚持学习),而且也可以获得像类似大学那样的学分。


这里有很多可以获得由来自世界上著名大学的教授进行齐整讲授的一流MOOC平台,还有你和你的同学与世界各地的人进行相互帮助的社区平台。以下是一些著名的提供商:

注意,正如广告中所说的,这些课程提供了大学级别的课程,所以你最好做好克服他们的准备。


入门网站推荐

如果你喜欢有结构和有指导性的学习,但又不受限于期限,这还有很多利用各式各样交付方法提供自动化、一步接一步训练的在线平台。其中有一些以视频形式提供,有一些则用文本。而且很多都包含了你可以直接在浏览器上练习的即时编辑器。通过这些网站你可以在你的环境中自由地学习,不管是在每一天最后的一个半小时里,还是在每个周末10个小时马拉松式的练习。


其中很多平台都需要支付以便能订阅到全部的内容,另外很多则提供免费的资料以便你可以马上开始,以下网站可以根据个人需要自由选择。

这仅仅是其中很小的一部分,通过搜索你可以找到更多!


非结构化学习

对于那些想找到适合自己的方式、或利用他们自己自由的时间来提高,而又不想有结构化课程压力的人来说,以下工具提供了一个自主学习的途径。即使你准备使用以上任意一种途径来学习,你也能从以下这些资源中找到可以帮助补充你进行更好学习或进行练习的平台 。


实战网站

如果你的目标仅仅只是练习解决编程问题,那么再一次,你需要用到互联网。以下站点提供了一系列编码挑战,这些挑战为了解决问题,有着即时编程接口,以及可以看到将你的与其他用户的解决方案进行对比的排行结果。


视频

学习编程离不开实践,但如果你想学到更深的内容,除了会议和夜间在线的课程外,还有一些更好的系列讲座。如果你喜欢这样的方式,可以到YouTube或者网上找下这方面有关的视频。


书籍

即使有这么多有用的技术,但对很多人来说仍然没有比书更能让他们一头扎进去获得关于某一主题深入理解的了。如果你想通过此方式来学习,可以看下Toptal免费编程书籍推荐清单


结语

学习编程的旅途,因人而异。不同的人有不同的资源、不同的目标,并且在此途中又有不尽相同的挑战和机遇。不要过于担心别人正在做什么,或者他们是如何到达终点的。即使对于经验丰富的程序员,此旅途也是没有终点的,因为总会有一些新的东西需要学习。



所以,我的建议就是,慢慢来,祝你旅途愉快!这里有太多东西需要你去探索,并且一个充满神奇的世界正等待着你的到来。千里之行,始于足下。这里只是一些好用的鞋子。祝你好运!


关于作者

Nick McCrea, United States


本文翻译作者为:dogstar,发表于开源中国个人博客;欢迎转载,但请注明出处,谢谢!

展开阅读全文
打赏
2
9 收藏
分享
加载中
更多评论
打赏
0 评论
9 收藏
2
分享
返回顶部
顶部