如何学习新的编程语言?

一名软件工程师的最大挑战就是使自己的技术栈跟得上技术的发展,而在这个技术飞速发展的时代,保证自己不被淘汰的唯一方法就是不断学习。

那么,程序员需要掌握多门编程语言吗?很多初学者都被这个问题所困扰。

Google研究总监 Peter Norvig曾就这个问题给出自己的观点,一名优秀的程序员至少应该掌握 6门编程语言,其中包括:
  • 支持类抽象的编程语言如 JavaC++
  • 支持函数抽象的编程语言如 Lisp 或 ML;
  • 支持语义抽象的编程语言如 Lisp;
  • 支持声明规范的编程语言如 Prolog 或 C++ 模板;
  • 支持协程的编程语言如 Icon 或 Scheme;
  • 支持并发的编程语言如 Sisal。

一名画家若擅长使用多种类型的画笔,就可以创作出多种类型的艺术画作;一名程序员若掌握多种类型的编程语言,在解决问题时就可以有多种选择。

重点学习什么

《计算机程序的构造和解释》的作者曾经表达这样的观点:在学习一门新的编程语言时,应该关注这门语言的基本表达形式(Primitive Elements)、组合的方法(Means of Combination)及抽象的方法(Means of Abstraction)这三个特性。

如果展开以上三个特性的话,就几乎包含了学习一门编程语言所需要关注的所有重要知识。
  • 基础知识:基本语法、关键字、变量与常量、数据类型、运算符、流程控制、异常处理、文件处理、编程思想(面向对象、面向过程、函数式编程)、多线程支持等。
  • 应用知识:网络请求、数据处理、内置函数、对日志和调试的支持、对单元测试的支持、序列化与反序列化等。
  • 高级知识:开源类库、开源框架、底层原理等。

学习编程语言的正确方法

学习编程需要长期坚持,不要迷信三五天就能让人学会的教程,你可能三五天掌握了一些语法,却难以完成复杂一点的编程,也没有和同行交流的经验。

1) 选择适合自己的编程语言

如果想学习一门新的编程语言,又不知道学习哪一门的话,可以参考 TIOBE 编程语言排行榜,其榜单每个月都会更新,可以反映某编程语言的热门程度。

在学习编程语言之前,需要先简单了解其主要特性及可以解决的问题,即选择适合自己的编程语言,带着目的去学习。

下表所示为一张关于编程语言分类的表格,读者在选择编程语言进行学习时,可以参考这张表,选择最适合自己的编程语言。

分 类 编程语言
动态类型语言 Python、Ruby、Erlang、JS、Swift、PHP、Perl
静态类型语言 C、C++、Java、Object-C
强类型语言 Java、C#、Python、Object-C、Ruby
弱类型语言 JS、PHP, C、C++
编译型语言 C、C++、Pascal、Object-C、Swift
解释型语言 Python、JS、Erlang、PHP、Perl、Ruby、Java
静态语言 C、C++、Java
动态语言 C#、Python、Object-C, PHP, Erlang、JS

比如,你擅长Java,希望学习另一门编程语言来提升自己的竞争力,就可以先选择和 Java 相似的编程语言,例如和 Java 同为强类型的、解释型的编程语言,再根据 TIOBE 编程语言排行榜就知道 Python 值得学习。

当然,选择编程语言的标准不尽相同,比如想从事手机 App 开发,就需要学习和移动端开发有关的编程语言,比如 Object-C、Java 和 Swift;如果对区块链技术感兴趣,想要从事区块链开发,那么 Go、Python、Solidity、C++ 等会是不错的选择。

2) 选择好的学习方式

在学习新的编程语言时,笔者认为读书、看视频和参加培训都是不错的学习方式。当然,不同的学习方式适合不同的人。

很多人通过阅读书籍进行学习,因为他们觉得书籍上的内容相对完善且成体系,并认为通过视频和课程学习会比较慢。关于编程的书,大概有入门类、工具类、实战类、进阶类、原理类等,可以根据自己的知识程度进行选择,切勿盲目选择。

还有些人认为在阅读书籍的过程中会遇到很多没见过的名词、定义等,容易阻碍学习的进度。他们愿意选择偏重实践的内容,倾向于课程、视频等方式,因为可以进行现场敲代码、排查问题等。

各种学习方式并无好坏之分,适合自己才最重要。如果能够将多种方式相结合,通过书籍完善自己的知识体系,并提升理论知识,再通过视频及课程增加自己的实战经验,就再好不过了。

另外,在学习新语言时,翻阅官方文档和源码也是必不可少的,当然,这比较适合在学习的中后期进行。切勿遗漏这个步骤,这是了解并掌握一门语言的至关重要的步骤。

3) 勤加练习

很多开发者容易陷入误区,只注重理论知识的学习,不注重实战,在回答别人问题的时候头头是道,一旦动手实践却不知所措。所以,学习一门编程语言,是绝对离不开动手实践的。

我们要把从书本中学习到的理论知识和实际应用结合起来,由浅入深地学习,最终达到熟能生巧的目的。孔子说“学而不思则罔,思而不学则殆”,在学习编程语言的过程中,学和思固然重要,勤加练习却也是必不可少的。

在学习编程语言的过程中进行练习,可以增加自己对理论知识的理解,增强自己的记忆。

我们都知道,Java 中的 int 是有范围的,书本上说如果超过范围就会溢出,那么这个范围到底是多少,溢出之后的表现是什么呢?只有真正地敲一遍代码,真正地练习一下才会有深刻的体会,才能在日后的工作中避免发生类似的错误。

另外,在练习的过程中难免会遇到各种各样的问题。比如,Java 初学者在安装 JDK 和配置环境变量时可能会遇到很多问题,其想办法解决问题的过程非常可贵,因为在日后的工作中能够自主解决各类问题,是一名优秀程序员的必备技能。

在很多时候,初级程序员和高级程序员之间最突出的区别其实就是解决问题的能力。通过实践,我们也可以锻炼自己在这方面的能力。所以,在实践的过程中遇到任何问题都不要退缩和逃避,要勇敢地面对并解决问题。

4) 带着问题学习

学习要由目标驱动,在目标驱动起作用后,我们还可以采用问题驱动方式进行学习,即在学习过程中多问问题。

问问题可以采用六何法。六何法,又叫作 6W 或 5W1H 分析法,即 What、Who、When、Where、Why 及 How,需要我们在学习的过程中多思考、多问问题。

举个简单的例子,在学习设计模式中的单例模式时,可以用六何法多提几个问题,例如:
  • 什么是单例模式?
  • 什么时候使用单例模式?
  • 怎么实现单例模式?
  • 哪种单例实现方式最好?
  • 在单例模式中如何保证线程安全?

在学习的过程中,如果没被问题驱动,你学到的就可能只是一个技术概念和用法。有了六合法的问题驱动,你学到的就会从一个点横向扩展成一条线,如果将线上的每个点都逐渐深入,就会扩展成一个面。

比如,我们用六合法来学习单例时,就可能以单例模式为中心点扩展到线程安全、锁、序列化、枚举、类加载机制等知识。

5) 教是最好的学

通过写博客来学习也是非常棒的一种学习方式,这对于新技术的学习十分有效,还可以通过技术分享、线下会议及线上教学等方式将自己学到的知识分享给他人,这就是教学学习法。

教学学习法有如下好处:
  • 迫使自己更深入地了解更多的知识。
  • 在教学的过程中会加入自己的理解。
  • 可以回头翻看教学的内容。
  • 可以加深记忆。
  • 可以和别人深入探讨。

推荐文章
大数据的起源是什么?

大数据的起源是什么?大数据的起源是互联网。大数据目的是为了更好了解客户喜好,它将海量碎片化的信息数据进行筛选、分析,并最终归纳、整理出企业需要的咨讯。而这些海量的信息则来源于互联网。扩展知识:大数据概

Java Swing Timer:计时器组件

计时器(Timer)组件可以在指定时间间隔触发一个或多个ActionEvent。设置计时器的过程包括创建一个Timer对象,在该对象上注册一个或多个动作侦听器,以及使用start()方法启动该计时器。

大数据产生的背景有哪些?

大数据首先出现在互联网行业,其产生和发展与信息产业密不可分。随着物联网、社交网络、云计算等技术不断融入我们的生活以及现有的计算能力、存储空间、网络带宽的高速发展,人类积累的数据在互联网、通信、金融、商

map遍历的几种方式是什么?

map遍历的几种方式1、通过map.entrySet()遍历:Mapmap=newHashMap(); for(inti=0;i

Java字符串的加密解密

为了保证程序的安全,经常采用数据加密的方法。Java中提供了专门用于加密运算的类和接口。 除了使用加密类和接口外,还可以通过多种方式实现字符串的加密。其中常用的就是获取字符串的字节数组,之后对字节数

Python浮点数精度问题(包含解决方案)

前面章节提到,Python中浮点类型之间的运算,其结果并不像我们想象的那样,例如: >>>0.1+0.2 0.30000000000000004 >>>0.1+0.1-0.2 0.0 >>>0.1+

cvbs是什么接口?

CVBS中文名字叫复合同步视频广播信号或复合视频消隐和同步。cvbs是复合同步视频接口,也叫AV接口或者Video接口,是目前最普遍的一种视频接口,几乎所有的电视机、影碟机类产品都有这个接口。它是音频

JSP EL empty空运算符

通过empty运算符,可以实现在EL表达式中判断对象是否为空。该运算符用于确定一个对象或者变量是否为null或空。若为空或者null,返回空字符串、空数组,否则返回false。 例如,应用条件运算符

Hibernate generate_statistics属性:收集统计数据

hibernate.generate_statistics属性用于指定Hibernate是否收集有助于性能调节的统计数据。 语法: hibernate.generate_statistics=属性

Shell(Bash)单引号、双引号和反引号用法详解

单引号和双引号用于变量值出现空格时,比如name=zhangsan这样执行就会出现问题,而必须用引号括起来,比如name="zhangsan"。 不过,引号有单引号和双引号之分,二者的主要区别在于,

韩顺平JavaEE Servlet实战开发视频教程

本视频教程以开发用户管理系统为主线,讲解JavaEEServlet。 讲师韩顺平,国内著名的软件培训讲师,授课语言风趣幽默,课程内容注重实践。 视频目录: JavaEEServlet开山:Ja

ai换脸用的是什么软件?

ai换脸可以使用的软件:ZAO、DeepFaceLab、Pornub、PrebuiltApp其中ZAO和PrebuiltApp可以在手机上使用,只是做出的效果一般,深度AI换脸才是真正意义上的人工智能

Django中Cookie和Session介绍(一)

在Django中可以通过HTMLForm表单实现登录注册功能,但是在这之前,我们有必要简单介绍一下Cookie和Session。比如在某些场景下,在排除用户手动删除浏览器Cookie以及Cookie未

Spring Cloud Gateway实战案例(限流、熔断回退、跨域、统一异常处理和重试机制)

SpringCloudGateway作为新一代网关,在性能上有很大提升,并且附加了诸如限流等实用的功能。本节主要讲解 Gateway的一些实用功能的实例。 限流实战 开发高并发系统时有三把利器用来保

Java8新特性:Effectively final

Java中局部内部类和匿名内部类访问的局部变量必须由final修饰,以保证内部类和外部类的数据一致性。但从Java8开始,我们可以不加final修饰符,由系统默认添加,当然这在Java8以前的版本是不

Java Set.remove()方法:移除Set集合中的指定对象

Java 集合类中的Set.remove()方法用于移除Set集合中的指定对象。该方法返回值为boolean类型,如果Set集合包含参数o指定的对象,则返回true,否则返回false。 语法:

C语言求自然底数e,求自然对数的底e

自然底数e=2.718281828…,e的计算公式如下: e=1+1/1!+1/2!+1/3!+… 要求当最后一项的值小于10-10时结束。 算法思想 使用循环实现累加求和,并在求和后计算下一项所对

Servlet getServletConfig() 示例

C语言百钱买百鸡(百钱百鸡,百鸡问题)

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何? 实现过程: (1)使用for语句对3种鸡的数

Unity 3D Canvas画布

一是通过菜单直接创建; 二是直接创建一个UI组件时自动创建一个容纳该组件的画布。 1)ScreenSpace-Overlay渲染模式 参 数 功 能 PixelPerfect