写点什么

你真的应该再学习一种语言么?

  • 2008 年 5 月 27 日
  • 本文字数:2109 字

    阅读完需:约 7 分钟

当博客作者 Gustavo Duarte 宣称“学习新语言通常都是在浪费时间”时,他的观点受到了很大的争议。最初,他以标题“New Languages Considered Harmful”发表了文章,这是在刻意模仿 Dijksta 那篇关于 Goto 的经典论文,但是由于来自他人的反响过于强烈,因此它改了一个更为柔和的标题“Language Dabbling Considered Wasteful”。

对于专业程序员来说,学习新语言通常都是在浪费时间。尽管这种浪费可能很有趣(比如,成为一种嗜好),但是它仍然是浪费。如果你只是为了取乐,那么好吧,但是利润将受到威胁。在一群卓越的程序员面前宣传这种论调无异于异端邪说:甚至《The Pragmatic Programmer》这本书还建议我们应该每年都学习一种新语言(不过它的其他建议总体上说还是不错的)。这简直是废话。

他还解释了他认为学习新语言无用的原因:

潜在的理论是,通过学习新语言,你可以“扩展思路”,并成为一名“更优秀的程序员”。没错。只不过按照这种论断,吸毒也可以拓展我们的经验(可千万别试!)。事实上,学习一种新的语言是桩得不偿失的买卖,把大量的精力花费在低价值的任务上,这种时间投资只能获得很少的回报。

Gustavo 批评了 Scott 关于“学习新语言就是在不断地磨利自己的砍柴刀”的类比。Scott 说:

今年,我在学习 Ruby。这意味着我的团队转移到 Ruby 上了么?大概不是。它不过是意味着我今年正在学习 Ruby,我要坚持不懈地磨利工具。你可能忙于砍柴没功夫磨刀,但是我想提醒你——不管你用的是哪个牌子、哪种类型的刀——记住,别的人用其他牌子、其他类型的刀也照样顺顺当当地砍柴。别人也有你不知道的招式。

Gustavo 不相信事情会如 Scott 所述。

Scott Hanselman 争论说学习新语言是在磨利砍柴刀,但是我觉得他是被新买来明晃晃的钝刀子迷住了,反而忽略了自己那把磨了一半的旧刀子。与其有一打不好不坏的刀,不如只留下三把非常锋利的。你在工具箱中加入的每一种新语言,都将使你更难以利用已有的语言达到更大的生产力的提升。

网上还有大量后续的讨论。

最有趣的评论来自于 Hacker’s news ,它是 Lisp 技术传播者 Paul Graham 的站点的一部分。 Scott Schneider 在评论中说到:

我认为他坚持这种观点是因为持有这样的假设,即所有语言都有相同的概念,它们彼此只是“字面表达和句法风格”不同而已。但是我认为,建议学习更多编程的出发点在于让你自己可以接触到不同的程序设计范型。以此为目的,我并认为你不一定要把每一种语言都研究到钻牛角尖的程度,但应该能轻松自在地以一种新的方式去思考。

Steven Hazel 继续说道:

我认为“刚好够用(enough)”是一个关键点。文章的作者似乎在探讨是否应该每年都转移到一种新的语言上,这一点我承认是很荒谬的。真正的含义在于学习一些新概念,而不是每一年都把关键的程序用新的语言实现。事实上,只有一种语言是务实的选择时,我才会在日常工作中采用它。

Alain Perils 在其经典的“ Epigrams on Programming ”中宣称,“如果一种语言不会影响你思考程序设计的方式,那么它不值得学习。”,这一点和 Eric Raymond’的发现非常吻合:

Lisp 是值得学习的。一旦你真正掌握了它,就能获得非常有深度的、具有启发意义的经验;这些经验将让你在以后的日子里成为一个更优秀的程序员,即使你再也不会用到 Lisp。

下面的引用来自于 Paul Graham 的著名的文章“Beating the averages”,文中他提出了“The Blub Paradox”。文章中称:

达到了一定的年龄后,程序员很少再主动去转换语言了。无论他们曾经用过哪些语言,他们开始考虑“刚好够用”就行了。

The Blub Paradox 理论是指,每个人都知道他们为什么喜欢自己所选择的语言,这个原因通常都是该语言很强大。他们放弃机器语言而选择了 C 语言,是为了提高程序员的生产力;放弃了 C 语言而选择 Java,是为了进一步抽象,最终还是提高程序员的生产力。当然,他们也听说过其他的语言,但是他们认为“我用现在的语言可以解决眼前的问题,因此没有必要去学习另一种语言。”

程序设计语言,或者其他类型的语言,当你理解了它后(未必掌握得非常熟练),它开始左右你的思考。根据自然语言研究者的研究,如果一个词汇(或者一类词汇)没有在某种语言中出现过,那么人们在思考这个词汇所表现的概念时相当困难。Paul Graham 指出在程序设计语言的领域里也有相似的情况发生:

让程序来写程序?你什么时候会想去做这种事?如果你用 Cobol,并不经常。如果你用 Lisp,这种事每天都在发生。

那么,你应该花时间去学习一种新的语言么?如果你决定去学,如何选择下一种语言才能获得最大的收获呢?

Google 的研究主管 Peter Norvig 撰写了一篇名为“ Teach Yourself Programming in Ten Years ”的文章,文中他给出了关于如何选择语言的精辟的建议:

至少要学习半打语言。其中包括支持类抽象的语言(比如 Java 或者 C++),支持函数抽象的语言(比如 Lisp 或者 ML),支持句法抽象的语言(比如 Lisp),支持声明式规范的语言(比如 Prolog 或者 C++ 模板),支持协同程序(coroutine)的语言(比如 Icon 或者 Scheme),以及支持并行机制的语言(比如 Sisal)。

那么,你的看法呢?你会学习新语言么,还是认为那是在浪费时间?

查看英文原文 Should you really learn another language?

2008 年 5 月 27 日 06:32989
用户头像

发布了 53 篇内容, 共 10.5 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

从零开始搭建Kafka+SpringBoot分布式消息系统

小Q

kafka zookeeper 学习 面试 springboot

开发技巧 | mPaaS 小程序自定义事件,如何取消注册?

蚂蚁集团移动开发平台 mPaaS

小程序 API mPaaS

360OS张焰:AI视觉在教育中的应用

ZEGO即构

记一次GC频繁且间隔较长解决实战总结

AI乔治

Java 架构 JVM GC

小心踩雷,一次Java内存泄漏排查实战

AI乔治

Java 架构 JVM 内存

有奖讨论|作为程序员,女朋友是怎么吐槽你的?

Simon郎

女朋友 话题讨论

🤳你要悄悄变优秀,然后惊艳所有人

蚂蚁集团移动开发平台 mPaaS

mPaaS 智能投放 界面改版 产品资讯

年轻人,快来看看分布式与集群的区别是什么?

程序员小灰

redis 分布式 后台开发 集群 Linux服务器开发

语音识别端到端模型解读:FSMN及其变体模型

华为云开发者社区

大数据 模型 语音识别

AWS IoT Core设计解析

soolaugust

边缘计算 AWS 工业4.0 工业物联网 iiot

高并发的核心 - AQS【哪些琐是基于AQS来实现的】

Java架构师迁哥

专访阿里云 Serverless 负责人:无服务器不会让后端失业

阿里巴巴云原生

Serverless 微服务 云原生 CloudNative 无服务器

Appium之测试微信小程序

无个性不签名

App

深度剖析github star数15.1k的开源项目redux-thunk

徐小夕

Java GitHub 大前端 React

数据结构与算法系列之跳表(GO)

书旅

数据结构 算法 Go 语言

双非本硕四面百度竟意外成功?看完我的面试经历 网友都称:过于优秀

比伯

Java 编程 架构 面试 计算机

Linux常用命令速查

jiangling500

linux命令

高速公路二维码定位报警系统搭建解决方案

t13823115967

高速公路二维码定位报警 智慧公安

整天都在讨论使用SpringBoot,可你居然连缓存都不清楚

小Q

Java 缓存 学习 面试 springboot

接口测试之post常见数据提交方式

测试人生路

post 接口测试

区块链落地开发,区块链版权应用搭建

t13823115967

区块链+ 区块链落地开发 区块链版权应用搭建

为什么short、byte会被提升为int?及基本类型的真实大小

烫烫烫个喵啊

Java JVM

了不起的 Deno:带你极速获取各大平台今日热榜

华为云开发者社区

Java 安全 deno

深入解读:KubeVela 与 PaaS 有何不同?

阿里巴巴云原生

阿里云 开源 容器 云原生 CloudNative

Forsage智能合约系统APP开发|Forsage智能合约软件开发(现成)

系统开发 现成系统

淦!终于有人把Java 8和Spring 5完美合体了,业界堪称“神迹”

Java架构追梦

Java spring 架构 面试 springboot

LiteOS基于Sensorhub的超声波模组移植

华为云开发者社区

物联网 LiteOS 超声波

漫画:什么是 “智能供应链” ?

京东科技开发者

云计算 供应链 智能供应链

「linux」Socket缓存是如何影响TCP性能的?

linux大本营

Linux 后台开发 socket 架构师 TCP/IP

Gradle doesn't run because it can't find tools.jar in JRE

mengxn

kotlin Gradle

解锁高速 IT 团队利器:Jira Service Management

Atlassian

DevOps Atlassian Jira ITSM ITIL

你真的应该再学习一种语言么?_编程语言_Niclas Nilsson_InfoQ精选文章