V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
pocarisweat
V2EX  ›  程序员

看到「学什么新语言」这个问题,推荐这本书

  •  1
     
  •   pocarisweat · 2021-08-21 12:45:24 +08:00 · 6110 次点击
    这是一个创建于 1223 天前的主题,其中的信息可能已经有所发展或是发生改变。

    《七周七语言:理解多种编程范型》 https://book.douban.com/subject/10555435/

    书里囊括了颇有代表性,但很多程序员未必了解的 7 种语言:

    • Ruby
    • Io
    • Prolog
    • Scala
    • Clojure
    • Haskell
    • Erlang

    书的篇幅没有那么长,这些语言也未必能用在实际工作上,但一定能打开你的眼界。书里介绍的语言,和 vczh 之前推荐的几门编程语言( https://www.cnblogs.com/geniusvczh/archive/2013/04/27/3047560.html , Go 语言粉丝请不要点开这个链接!)也高度重合。

    这里( https://segmentfault.com/a/1190000002944730 )还有一篇对作者的采访。他甚至后来还写了第二本书( https://book.douban.com/subject/26921107/ ),包括 Lua 、Idris 、Elm 、Elixir 等。

    「语言都是工具」这话本身是没错的,但喜欢说这句话的人时常是在表达一种虚无主义的态度,即「什么语言都一样」。但锤子和螺丝刀都是工具,大概人们也不会混用它们吧?

    34 条回复    2021-08-24 06:34:30 +08:00
    echo1937
        1
    echo1937  
       2021-08-21 13:05:41 +08:00 via iPhone
    这本书不容易读懂
    lululau
        2
    lululau  
       2021-08-21 13:34:15 +08:00   ❤️ 7
    我推荐这些语言,排名不分先后

    1. Java:用户最多的语言
    2. JS: WEB 前端的核心语言
    3. Ruby:通用场景下最好的语言,最好的动态类型语言
    4. Python:测试、科学、AI 等特定场景下用得最多的语言
    5. Go:兼顾性能和易用性的条件下,用得最多的语言
    6. Rust:最好的系统级语言
    7. Swift:兼顾性能和易用性的条件下,最好的语言
    8. Kotlin:最好的 JVM 平台语言
    9. Bash:不用说明吧
    10. Zsh: 最好的 Shell
    11. Haskell: 逻辑体操语言
    12. C/C++:历史最悠久的,用的最多的系统级编程语言
    powerman
        3
    powerman  
       2021-08-21 13:44:34 +08:00   ❤️ 1
    语言都是工具,没说完的下半句是 趁手就好,

    本来大部分场景就是什么语言都一样,你在那里搞 语言好坏分析 宗教战争,
    人家都用趁手的工具把代码撸完,拿钱泡妹 喝咖啡去了。

    真正的资深优秀的程序员基本上不会去讨论工具的好坏,也懒得分析这些东西,因为语言跟技术只是手段,并不是目的,大部分时候目的是为了实现功能,而当你在讨论语言优劣的时候,本就把语言优劣的争论当作一种目的了。
    charlie21
        4
    charlie21  
       2021-08-21 13:50:28 +08:00
    @powerman #3 当你在讨论语言优劣的时候,也可以是讨论即将(用此语言)解决的问题,语言本身只不过是给你对此 problem 给出的 solution 提供 support, 其中有的语言可提供的 support 更好、有的语言可提供的 support 不好.

    这和 “将语言优劣的争论当作一种目的” 无关,因为它仅限于此 solution 和 solution 所 targeted 的 problem
    namelosw
        5
    namelosw  
       2021-08-21 13:54:12 +08:00   ❤️ 14
    > 「语言都是工具」这话本身是没错的,但喜欢说这句话的人时常是在表达一种虚无主义的态度,即「什么语言都一样」。

    这种人一般都没啥见识,让他们把几个常见的靠 mutation 实现的算法从 C 翻译成 Haskell 就跪了。LeetCode 最近加了 Erlang 和 Elixir,仔细看就会发现很多题没有这俩选项,因为这些题在没有变量的语言里就不成立。

    总得来说,他们觉得语言都一样是因为他们其实只用过一种语言:C*。不管是 Python C 还是 Java,都算 C*。

    如果用距离来形容语言间的区别,可能 C* 在地球,Python 和 Ruby 就是在一个洲的不同国家,而 C 和 Java 分别在不同的洲。人们常用的 SQL 就在月亮上,虽然远但是里地球还很近。Haskell Prolog 之类的可能就在火星和金星,Coq 之类的可能在海王星。除此以外,显然还有很多系外行星我们不太了解。

    另外《七周七语言》看完了可以去看 《 Concepts, Techniques, and Models of Computer Programming 》
    namelosw
        6
    namelosw  
       2021-08-21 13:58:47 +08:00
    @powerman 那我理解你说的程序员还不够优秀。

    Rob Pike 和 Martin Odersky 肯定对什么是好语言有一些看法。

    就算不是语言作者,John Carmack 也会经常跳到 Racket 和 Haskell 来实验这些思想是不是更好,Linus Torvalds 会认为 C 很好,但是 C++ 不好,Rust 有待观望。
    Cbdy
        7
    Cbdy  
       2021-08-21 14:01:57 +08:00 via Android
    @lululau 请不要把 C 和 C++当成同一种语言,就像没有人会混淆 Java 和 JavaScript
    stimw
        8
    stimw  
       2021-08-21 14:14:03 +08:00
    @powerman #3

    Linus Torvalds: “C++ is really a terrible language!” (狗头)
    Lemeng
        9
    Lemeng  
       2021-08-21 14:26:28 +08:00
    学语言,还要看一本书。实在没那时间,支持一下
    powerman
        10
    powerman  
       2021-08-21 14:49:05 +08:00
    @stimw

    你只记住了这一句话,但是并不了解整个事情来龙去脉,本来这种事情的争论,从一开始就是一件错误的事情,后面的争论已经毫无意义,大多都是情绪化的输出。

    对于 linus,他知道他的开源项目需要什么,开源这东西,很多时候 人的精力跟社区的精力有限,能处理各种问题讨论 propral 并且把项目推动下去就已经很不容易,你想想有人天天给你发邮件,跟你说 你为什么不用 C++重写一下你的 git 跟 Linux,C++不比你手里工具好用,这种蜜蜂嗡嗡的声音有多难受吗?
    powerman
        11
    powerman  
       2021-08-21 15:00:43 +08:00
    @namelosw

    这些争论都只是一些毫无意义的事情,包括 linus 吐槽 C++那个事情,你如果真去看来龙去脉就知道,他也只是被那些蜜蜂嗡嗡声音搞得烦了,才下场来吐槽一波 C++,事实上现代 C 语言编程中,存在大量模仿面向对象编程的痕迹,而大家都知道 C 并不支持面向对象。

    编程其实真正的重点是 业内的公认的那些最佳实践跟一些代码设计原则,个人推荐看一下 unix 的编程哲学跟代码大全,因为所有的工具跟语言都是围绕这些东西在转,如果你从职业生涯一开始就知道 软件开发的一些经典的代码原则跟实践,那么你在后续的工作成长中,你会发现很多东西是顺其自然的样子,因为业内沉淀优秀的东西都是那么回事。
    zzw1998
        12
    zzw1998  
       2021-08-21 15:07:41 +08:00 via iPhone
    看标题进来还以为是自然语言
    namelosw
        13
    namelosw  
       2021-08-21 15:37:10 +08:00   ❤️ 4
    @powerman

    > 被那些蜜蜂嗡嗡声音搞得烦了,才下场来吐槽一波 C++

    Linus 很明确地说过,他觉得 C 好是因为 C 很简单地 map 到冯诺依曼机器的操作上,看到代码你就知道机器是怎么运行的。而 C++ 的问题是,一方面 C++ 引入的抽象让代码脱离硬件,另外一方面是这些抽象是 leaky 的,不完整的抽象会到处泄露抽象下面的东西。

    所以从上面两点推理,他觉得 Rust 有潜力,很可能是因为 Rust 虽然也构建了抽象但是不那么 leaky,所以值得观望。

    > 事实上现代 C 语言编程中,存在大量模仿面向对象编程的痕迹,而大家都知道 C 并不支持面向对象。

    你多看一些东西,就知道这个世界除了面向对象还有很多其他优秀的东西。游戏社区有 ECS,函数式社区有代数建模。现代 C 出现很多类似 OO 的代码,是因为大部分程序员只了解 OO 。

    > 业内的公认的那些最佳实践跟一些代码设计原则

    作为 OO 的支柱之一的继承,本身作为 subtyping 甚至都不是一个很好的 polymorphism 。OO 社区强调 OCP 原则,其实是因为大部分 OO 语言的核心机制本身很容易破坏 OCP 。

    你说的这两本书是很好,但是世界远比这两本书大。

    而且…… 我举了这么多人,你只对一个人的例子做了很主观的反驳,就认为你的看法更好,不太合适吧。

    "A language that doesn't affect the way you think about programming is not worth knowing." - Alan Perlis
    danhahaha
        15
    danhahaha  
       2021-08-21 17:03:06 +08:00   ❤️ 2
    既然比作工具,那么肯定不一样,要不然发明那么多工具干嘛,还是因为不好用,所以才会有人发明新的更好用的
    loading
        16
    loading  
       2021-08-21 17:05:42 +08:00
    这书我推荐给很多人了,但是,我本人除了封面和书名,其他我一无所知。
    loading
        17
    loading  
       2021-08-21 17:16:01 +08:00
    @lululau #2 你给了这么多最,里面其实容得下一个 php 吧,有一说一。
    aristolochic
        18
    aristolochic  
       2021-08-21 17:37:23 +08:00
    好奇怪,为什么有人一看到把几个语言并列放在一起,脑子里第一时间想到的是接下来要排名列次,踩一捧一了。

    > 真正的资深优秀的程序员基本上不会去讨论工具的好坏,也懒得分析这些东西
    > 这些争论都只是一些毫无意义的事情

    我没看出来楼主的分享中有任何形式的“讨论语言优劣”、“搞 语言好坏分析 宗教战争”,只是在说一些值得了解以扩展思路的语言,却惨遭扣上这种帽子。

    就像出省出国旅游,去别的地方玩还要搞个 Benchmark/Questionary,头脑也太不活泛了吧。有那么多人,搞钱用一套方便搞钱的,自己玩用一套使用舒适的,甚至于自己看着不爽发明一套,也没见人家精神分裂。

    图灵机和 Lambda 演算、Actor 和 CSP 、继承和组合、call/cc 和 Monad 、文本宏和 AST 宏……等等都能达成目的,但各有各的优势和劣势不假,长久以来各家也骂战是少数,相互吸纳才是主流。怎么别人告诉你吃苹果吃腻了可以试试我家的梨,你却要怀疑这梨有毒呢?也没一巴掌拍没你手上的苹果不让你吃啊。

    毕竟还有很多人可是没见过梨的。
    chenyu0532
        19
    chenyu0532  
       2021-08-21 18:19:07 +08:00
    不是有这么一句话吗:当你不知道学什么语言的时候就学 java
    gowk
        20
    gowk  
       2021-08-21 21:13:59 +08:00 via iPhone   ❤️ 3
    下面这段话我贴了好多遍了,我都贴烦了
    You aren't a Go, or Rust, or Java, or Python, or JavaScript developer (unless you are writing those languages). In reality you are a developer who uses language X to solve Y problems. You can learn new languages and paradigms. Don't get stuck in the I am an X developer.
    wangxiaoaer
        21
    wangxiaoaer  
       2021-08-21 22:04:20 +08:00
    很多人喜欢说的是语言无所谓,学习语法很快,但是我觉得不同语言最主要的是思维方式的不一样,这个没有想象中那么简单。虽然一个合格的开发人员可以快速学习其他语言,但是把切换语言当作是换种饮料那种成本很低的想法不太合适。
    roundgis
        22
    roundgis  
       2021-08-21 22:57:29 +08:00 via Android
    如果沒有目標那就學好英文
    hobochen
        23
    hobochen  
       2021-08-21 23:05:33 +08:00
    语言是用来解决问题的,所以我还是觉得要学点对解决问题有用的语言。

    比如你要写点儿依赖又多、性能又有要求的系统,你可能就只能写 C++。
    比如你要在个 VM 上写点儿复杂业务逻辑,那学 C#或者 Java 准没错。
    比如你要去魔改 linux kernel 或者给 kernel 写驱动,那就学点儿 C 。
    比如你要去搞机器学习,把自己变成胶水层工程师,那就学点儿 Python (而且真的只需要一点儿)。

    如果你连自己想要解决什么问题都没搞清楚,就想着学点儿新语言,那么我觉得你只是在学习新的系统库 API 和语法糖。
    hobochen
        24
    hobochen  
       2021-08-21 23:09:29 +08:00
    出于我个人的喜好,我建议去学 C++和 Haskell 。

    C++绝对不是一个让人学起来用起来身心愉悦的语言,但是精通 C++的过程能让你确立足够的审美和对计算机工程有足够的了解。

    Haskell 则是一个,大多数人没接触过,但很有意思的世界。
    lanlanye
        25
    lanlanye  
       2021-08-21 23:32:56 +08:00
    学什么语言取决于要做什么工作,不过不同语言通常是根据不同思想设计出来的,多了解一些或许会有新的收获。
    Ps. 我觉得 Go 也没那么糟嘛。
    adoal
        26
    adoal  
       2021-08-22 01:11:10 +08:00
    说“语言都是工具”,还有很大可能并不是楼上的技术大牛们互相不认可的技术原因,只是说这话的当事人凑巧职业生涯的开始是在程序员岗位上,但毫无心思深入钻研编程技术,一心想着“我只是现在做 crud,我可以在甲方(发包单位或公司里业务部门)的鞭打下去摸清楚业务需求从而跟公司业绩直接贴近,我想未来脱离这些乱七八糟的细节,做一个只要能拿技术吹水就行不需要真抠细节的管理者”。
    WuSiYu
        27
    WuSiYu  
       2021-08-22 02:59:40 +08:00
    “语言都是工具”这句话可对可错,主要得看所处的环境 /圈子

    对于 PL 圈或类似圈子、对编程语言本身有研究的人,自然不会太认同,毕竟从设计角度上他们都有非常大的差异
    对于更加普遍的软件开发者而言,选择一个语言往往是被迫的,学习语言的选择也会被本地就业环境左右;从相对功利的角度去看,不管语言本身的各种差异如何,反正都是上班的工具了
    mazhimazh
        28
    mazhimazh  
       2021-08-22 10:31:48 +08:00
    学 Java 语言,看我的系列丛书《深入解析 Java 编译器:源码剖析与实例详解》、《深入剖析 Java 虚拟机:源码剖析与实例详解》
    plko345
        29
    plko345  
       2021-08-22 16:31:48 +08:00 via Android
    @powerman 可是,无论在哪个邻域,“工具”都非常重要,为什么到你这就变成很无用的了
    secondwtq
        30
    secondwtq  
       2021-08-22 21:07:07 +08:00
    楼主确实有点来错地方的意思。
    和“编程语言”打交道的人并不全是一样的,至少可以分成两类非常不同的人:
    一种人接触编程语言是为了解决某个和编程语言没太大关系的问题。
    另一种人接触编程语言就是为了折腾编程语言。

    至于这两种人的事情对另一种人有什么好处,这个现在还很不好说。但是可以肯定的是当两种人碰到一起讨论编程语言时必然会出现各种鸡同鸭讲的状况。目前看来本站前者居多。
    lancelock
        31
    lancelock  
       2021-08-23 10:32:48 +08:00
    语言只是工具,一句毫无逻辑的话,我不知道为什么很多人跟风说,好像喊口号一样。

    首先这就不是一句完整的话,你抛出了一个观点,然后呢,你的结论是什么?
    姑且认为你的结论就是 "用什么语言都没啥区别",那么你就需要一个条件(工具都没有区别)来支持你的观点。

    如果所有工具都没啥区别,那那么多发明家、科学家一辈子都在折腾啥?闲的蛋疼是吧
    NoDocCat
        32
    NoDocCat  
       2021-08-23 15:06:01 +08:00
    你和一帮拿着螺丝刀拧水龙头的人,有什么好聊的呢?
    ljzxloaf
        33
    ljzxloaf  
       2021-08-24 05:46:41 +08:00
    有用 C 写 crud 的吗
    O5oz6z3
        34
    O5oz6z3  
       2021-08-24 06:34:30 +08:00
    一个想法,不一定对。编程语言就和球类运动似的,球类运动也分乒乓球、网球、桌球、排球、保龄球、篮球、足球、棒球、橄榄球、高尔夫球……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5699 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:47 · PVG 09:47 · LAX 17:47 · JFK 20:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.