还在讨论哪种编程语言最具价值?还在头疼怎么快速掌握新的语言?本文给出了一劳永逸的办法:掌握所有编程语言不是梦。

以下为译文:

我想在这里讨论的不是如何掌握一门编程语言,而是掌握所有的编程语言

许多初学者会写信给我,问我应该学习哪种编程语言,以及如何学习编程语言。起初我总觉得这个问题太低级。但是渐渐地,我发现不仅是初学者,即便是许多知名科技公司的高级工程师实际上也对这个问题颇为不解。

今天,我打算花点时间回答这个搁置了很久的“低级”问题。我也希望与更多开发者分享我的想法。

如果你有以下几种困惑,那么本文会对您所有帮助:

你是初学者,不知道选择哪门语言入门。

你是高级程序员或团队负责人,但你对新兴语言感到困惑,不知道该投资哪门语言。

你的团队针对使用哪门语言争论不休,甚至发生了一些不必要的冲突。

你选用了一些时尚的编程语言,但是两个月后发现它们都很坑。

就我个人而言,如果遇到没见过的语言,我会直接使用,而不会花很长时间学习。阅读本文后,也许你会明白为什么我可以做到这一点。通过了解语言的特征,每个程序员都可以像我一样实现这个目标。至少我希望如此。

关注语言的特征,而非语言本身

许多开发人员很在意他们或别人是否可以熟练使用某种语言,他们常常会对不同语言的优点和缺点争论不休。然而,对于我来说这些问题都不存在。尽管我撰写了很多批评语言的文章,但我很少在实际工作中争论语言本身。我发现最根本的原因是相对于语言本身,我更加重视语言的特征。我可以用任何语言甚至很糟糕的语言写出优秀的代码。

任何语言都是各种语言特征的集合。例如,编程语言就像一台计算机。其品牌可能是IBM、戴尔或苹果。但是,你能说苹果的电脑就一定比IBM好吗?不能。首先你必须了解计算机的配置,例如处理器型号、内核数量、CPU的时钟频率、一级缓存、二级缓存……,内存和硬盘,显示分辨率,还有显卡、网卡等等。有时你还需了解每个硬件的兼容性。

对于编程语言来说,这些计算机的配置则等同于语言特征。以下是语言特征的一些例子:

  • 变量定义

  • 数学运算

  • for循环语句,while循环语句

  • 函数定义,函数调用

  • 递归

  • 静态类型系统

  • 类型推断

  • Lambda表达式

  • 面向对象

  • 垃圾收集

  • 指针运算

  • Goto语句

语言特征与计算机配置类似。在选择计算机的时候,没人会说戴尔的计算机就一定是最好的,他们会说这台计算机的CPU是Intel i7处理器,比i5好,DDR3的内存比DDR2快很多,SSD硬盘的读写速度比普通硬盘快很多,ATI的显卡性能很差,等等。

编程语言也是如此。每种语言都有一组通用的特征,例如变量、函数、条件语句和循环语句。只要你学习一种编程语言,并掌握基本概念,就可以将这些知识应用到其他语言中。因此,我们可以掌握语言的特征,而不用浪费时间来选择语言。

当一个聪明的程序员开始接触一种新的编程语言时,他们通常不会花费很多时间阅读语言的手册或书籍,而是选择直接使用该语言来解决实际问题。例如,我用R语言执行一些复杂计算时遇到了一个问题。首先我会花几分钟浏览R语言手册,了解该语言的特征。然后我会从网上找到与该问题相关的R语言的程序,并对其进行修改,直到解决问题。在解决问题的过程中,你可以很快掌握该语言。

选择一门合适的入门语言

作为初学者,你应该选择一门没有明显缺陷的合适的编程语言。首先你应该掌握这门语言的特征,然后将这些语言特征应用到其他编程语言上。哪种语言作为入门最合适呢?我个人认为可以从下列语言着手:

  • Scheme

  • C

  • Java

  • Python

  • JavaScript

相反,我不推荐用下列语言作为入门:

  • Shell

  • PowerShell

  • AWK

  • Perl

  • PHP

  • Basic

  • Go

一般来说,不应该使用脚本语言作为入门语言,尤其是那些源自早期的Unix系统的语言。虽然与Unix shell相比,PowerShell有所改进,但它依然没有摆脱脚本语言的根本问题——他们的设计者不知道自己在干什么。

初学者利用脚本语言学习编程时无法掌握到关键点,这是一个非常严重的问题。脚本语言经常会将一些系统工具的知识(例如正则表达式、互联网等)添加到语法中,这不仅浪费了初学者的很多时间,而且导致他们无法真正掌握编程最关键的概念:变量、函数、递归、类型等等。

掌握关键特征,忽略次要特征

初学者应该关注编程语言最关键的特征,而不要为次要内容分神。我发现在许多编程课的开头,经常有学生在学习用“printf”函数输出“Hello World!”时,老师要求他们记住“printf”函数的诸多复杂的输出格式,例如%d、%F、 %. 2f等等。

然而,众所周知,输入和输出操作根本不是语言的主要部分。与核心的特征相比,这都是次要的。一些初学者在学习了几周的Java后,仍然对“printf”功能感到恼火。虽然他们写了几百行“printf”函数,但仍然不明白变量和函数是什么,甚至不知道如何使用算数语句和循环语句!

许多初学者认为编程很难学的最大的一个原因是,他们以为记不住%d、%F、 %. 2f就不可能深入学习!

自己动手实现语言的特征

在学习了基本的语言特征并使用它们编写代码之后,下一步就是实现这些特征。只有你动手实现不同的语言特征,才能算是完全掌握了它们。

一位编程大师曾经说过,理解一门编程语言的最佳方式是自己动手实现它,这意味着你需要编写一个解释器来实现它的语义。但是我认为可以对这句话做略微的改动:完全掌握语言的一个特征的最佳方式是自己动手实现它。你不需要实现整个语言,因为归根结底我们要使用是语言的特征。只要你自己动手实现了语言的一个特征,那么你就可以掌握所有语言中这个特征的实现与使用。

例如,在学习SICP时,很多人可能会选择使用Scheme来实现一个面向对象系统。面向对象系统的Scheme的语法与其他语言(如Java、C ++、Python等)有很大的不同。但是,它可以帮助你理解所有面向对象(OOP)语言中面向对象的概念。它甚至可以帮助你理解各种面向对象实现方法之间的差异。

直接学习面向对象编程语言无法掌握这一点,因为在你学习Java、C ++、Python等语言时,你只是一个用户,在使用Scheme亲自动手实现面向对象系统之后,你就成为了创造者。

总结

无论是初学者还是高级程序员,你都应该更加关注语言的特征,而不是使用哪种语言。只有这样,你才能快速掌握新语言并编写高质量的代码。

掌握所有编程语言不是梦-转自csdn的更多相关文章

  1. swift编程语言基础教程 中文版

    swift编程语言基础教程 中文版 http://download.csdn.net/detail/u014036026/7845491

  2. C#下使用XmlDocument详解

    XML在开发中作为文件存储格式.数据交换的协议用的非常普遍,各个编程语言有都支持.W3C也制定了XML DOM的标准.在这里主要介绍下.Net中的XmlDocument,包括xml读取和写入等功能.一 ...

  3. centos7安装nodejs运行环境及卸载

    一.安装1.进入官网下载最新版本https://nodejs.org/en/ 选择下载后上传或直接使用wget下载 wget https://nodejs.org/dist/v8.11.2/node- ...

  4. Http协议Status状态代码

    Http协议:Http协议(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用http请求有三部分 ...

  5. React++ node.js ++SQL Sever ++MySQL++ python ++ php ++ java ++ c++ c#++ java ++ android ++ ios ++Linux+

    "C语言在它诞生的那个年代,是非常不错的语言,可惜没有OOP.当项目臃肿到一定程度,人类就不可控了. 为了弥补这个缺陷,C++诞生了.而为了应对各种情况,C++设计的大而全,太多复杂的特性, ...

  6. MHA 实现VIP切换用到脚本

    在MHA Manager端配置中,如果实现MHA的vip故障切换需要在配置文件/etc/masterha/app1/app1.cnf 中启用下面三个参数: master_ip_failover_scr ...

  7. ajax实现输入用户名异步提示是否可用

    <script type="text/javascript"> //页面加载完毕后执行 $(document).ready(function(){ //用户名输入框绑定 ...

  8. 在CentOS 7上安装Node.js

    一.安装1.进入官网下载最新版本https://nodejs.org/en/ 选择下载后上传或直接使用wget下载 wget https://nodejs.org/dist/v8.11.2/node- ...

  9. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

随机推荐

  1. 【TCP/IP详解 卷一:协议】第二十二章 TCP的坚持定时器

    这两章来到了TCP的定时器部分,在 TCP的超时与重传 和 TCP的三握四挥 我们介绍了 TCP的重传定时器 和 TCP的2MSL定时器. 本随笔介绍 防止返回ACK丢失的死锁情况 的 坚持定时器 和 ...

  2. NOI 4977 怪盗基德的滑翔翼(LIS)

    http://noi.openjudge.cn/ch0206/4977/ 描述: 怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯.而他最为突出的地方,就是他每次都能逃脱中村警部的重重围 ...

  3. UVa 11054 Gergovia的酒交易

    https://vjudge.net/problem/UVA-11054 题意:直线上有n个等距的村庄,每个村庄要么买酒,要么卖酒.设第i个村庄对酒的需求为ai,ai>0表示买酒,ai<0 ...

  4. Redis集群学习笔记

    Redis集群学习笔记 前言 最近有个需求,就是将一个Redis集群中数据转移到某个单机Redis上. 迁移Redis数据的话,如果是单机Redis,有两种方式: a. 执行redis-cli shu ...

  5. Java中如何实现类似C++结构体的二级排序

    1:实现Comparable接口 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; ...

  6. python 判断一个数字是否为3的幂

    def is_Power_of_three(n): == ): n /= ; ; print(is_Power_of_three()) print(is_Power_of_three()) print ...

  7. telnet不是内部或外部命令的解决方案

    telnet主要是为了维护使用,windows默认不打开这个功能,所有无法登陆 按照下面截图,可轻松打开telnet功能 点击控制面板 选择程序和功能 点击左上角打开 turn windows fea ...

  8. 日志_测试代码_Qt532

    1. int LogFile(QString &_str) { QDateTime datetime = QDateTime::currentDateTime();//获取系统现在的时间 QS ...

  9. vs2010_相关目录

    1. C:\Program Files\Microsoft SDKs\Windows\v7.0A 2.创建了 C:\Program Files\Microsoft Visual Studio 9.0 ...

  10. 【Golang 接口自动化02】使用标准库net/http发送Post请求

    写在前面 上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单独拎了出来,我们在这一篇一起从源码来了解一下Golang的Post请求. 发送Post请求 net/h ...