如何学习新的编程语言?
一名软件工程师的最大挑战就是使自己的技术栈跟得上技术的发展,而在这个技术飞速发展的时代,保证自己不被淘汰的唯一方法就是不断学习。
那么,程序员需要掌握多门编程语言吗?很多初学者都被这个问题所困扰。
Google研究总监 Peter Norvig曾就这个问题给出自己的观点,一名优秀的程序员至少应该掌握 6门编程语言,其中包括:
一名画家若擅长使用多种类型的画笔,就可以创作出多种类型的艺术画作;一名程序员若掌握多种类型的编程语言,在解决问题时就可以有多种选择。
如果展开以上三个特性的话,就几乎包含了学习一门编程语言所需要关注的所有重要知识。
在学习编程语言之前,需要先简单了解其主要特性及可以解决的问题,即选择适合自己的编程语言,带着目的去学习。
下表所示为一张关于编程语言分类的表格,读者在选择编程语言进行学习时,可以参考这张表,选择最适合自己的编程语言。
比如,你擅长Java,希望学习另一门编程语言来提升自己的竞争力,就可以先选择和 Java 相似的编程语言,例如和 Java 同为强类型的、解释型的编程语言,再根据 TIOBE 编程语言排行榜就知道 Python 值得学习。
当然,选择编程语言的标准不尽相同,比如想从事手机 App 开发,就需要学习和移动端开发有关的编程语言,比如 Object-C、Java 和 Swift;如果对区块链技术感兴趣,想要从事区块链开发,那么 Go、Python、Solidity、C++ 等会是不错的选择。
很多人通过阅读书籍进行学习,因为他们觉得书籍上的内容相对完善且成体系,并认为通过视频和课程学习会比较慢。关于编程的书,大概有入门类、工具类、实战类、进阶类、原理类等,可以根据自己的知识程度进行选择,切勿盲目选择。
还有些人认为在阅读书籍的过程中会遇到很多没见过的名词、定义等,容易阻碍学习的进度。他们愿意选择偏重实践的内容,倾向于课程、视频等方式,因为可以进行现场敲代码、排查问题等。
各种学习方式并无好坏之分,适合自己才最重要。如果能够将多种方式相结合,通过书籍完善自己的知识体系,并提升理论知识,再通过视频及课程增加自己的实战经验,就再好不过了。
另外,在学习新语言时,翻阅官方文档和源码也是必不可少的,当然,这比较适合在学习的中后期进行。切勿遗漏这个步骤,这是了解并掌握一门语言的至关重要的步骤。
我们要把从书本中学习到的理论知识和实际应用结合起来,由浅入深地学习,最终达到熟能生巧的目的。孔子说“学而不思则罔,思而不学则殆”,在学习编程语言的过程中,学和思固然重要,勤加练习却也是必不可少的。
在学习编程语言的过程中进行练习,可以增加自己对理论知识的理解,增强自己的记忆。
我们都知道,Java 中的 int 是有范围的,书本上说如果超过范围就会溢出,那么这个范围到底是多少,溢出之后的表现是什么呢?只有真正地敲一遍代码,真正地练习一下才会有深刻的体会,才能在日后的工作中避免发生类似的错误。
另外,在练习的过程中难免会遇到各种各样的问题。比如,Java 初学者在安装 JDK 和配置环境变量时可能会遇到很多问题,其想办法解决问题的过程非常可贵,因为在日后的工作中能够自主解决各类问题,是一名优秀程序员的必备技能。
在很多时候,初级程序员和高级程序员之间最突出的区别其实就是解决问题的能力。通过实践,我们也可以锻炼自己在这方面的能力。所以,在实践的过程中遇到任何问题都不要退缩和逃避,要勇敢地面对并解决问题。
问问题可以采用六何法。六何法,又叫作 6W 或 5W1H 分析法,即 What、Who、When、Where、Why 及 How,需要我们在学习的过程中多思考、多问问题。
举个简单的例子,在学习设计模式中的单例模式时,可以用六何法多提几个问题,例如:
在学习的过程中,如果没被问题驱动,你学到的就可能只是一个技术概念和用法。有了六合法的问题驱动,你学到的就会从一个点横向扩展成一条线,如果将线上的每个点都逐渐深入,就会扩展成一个面。
比如,我们用六合法来学习单例时,就可能以单例模式为中心点扩展到线程安全、锁、序列化、枚举、类加载机制等知识。
教学学习法有如下好处:
那么,程序员需要掌握多门编程语言吗?很多初学者都被这个问题所困扰。
Google研究总监 Peter Norvig曾就这个问题给出自己的观点,一名优秀的程序员至少应该掌握 6门编程语言,其中包括:
- 支持类抽象的编程语言如 Java 或 C++;
- 支持函数抽象的编程语言如 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) 教是最好的学
通过写博客来学习也是非常棒的一种学习方式,这对于新技术的学习十分有效,还可以通过技术分享、线下会议及线上教学等方式将自己学到的知识分享给他人,这就是教学学习法。教学学习法有如下好处:
- 迫使自己更深入地了解更多的知识。
- 在教学的过程中会加入自己的理解。
- 可以回头翻看教学的内容。
- 可以加深记忆。
- 可以和别人深入探讨。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算