V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
closedevice
V2EX  ›  程序员

[求助] 我好像再也没学会另外一门编程语言!

  •  
  •   closedevice · 2022-11-03 20:19:00 +08:00 · 2583 次点击
    这是一个创建于 533 天前的主题,其中的信息可能已经有所发展或是发生改变。

    记得以前刚从事研发这个行业,做的是 Java 方面的事情,当时认真研究了几年语言特性,从使用到语言实现,再到 VM 实现细节。

    这么多年过去了,用的过语言蛮多,但好像再也没有花大量的时间研究另外一门语言:很多时候就是用的时候看看,一段时间不用就忘了,仿佛从未将它们学透过一样。

    所以各位同行有遇到类似的问题么?是怎么解决这个问题的?

    16 条回复    2022-12-18 16:14:08 +08:00
    msg7086
        1
    msg7086  
       2022-11-03 20:36:48 +08:00   ❤️ 1
    解决什么问题?
    没有学透第二门语言是一个问题吗?造成了什么样的后果,对你产生了什么样的坏影响?

    学编程语言,基本上两个作用,一能用这门语言挣钱养家糊口,二能学习这门语言设计的思想精髓。
    现在养家糊口不成问题,设计思想也差不多都学完了,你还需要解决什么问题?
    wu67
        2
    wu67  
       2022-11-03 21:01:32 +08:00   ❤️ 2
    表示一直想学一门 js 以外的语言, 但每次一看那些语言的符号(定义 /操作符)就头疼, 然后不了了之, 像 :: [] 全大写蛇形常量 之类的, 混在一起我每个符号都认识, 但组合一起就不知道啥意思了. 第一次感受这种痛苦时大二时学 C 艹
    FrankHB
        3
    FrankHB  
       2022-11-03 21:07:59 +08:00
    你确信?
    JVM 的 bytecode 编码的就是一种跟 Java 截然不同的语言。
    zhuo1ang
        4
    zhuo1ang  
       2022-11-03 23:27:08 +08:00
    说真的我也有这种感觉,浅尝辄止的语言很多,都没有能掌握到一个比较深入的程度,这一点上还需要额外自律,自己真是动力不足...
    2NUT
        5
    2NUT  
       2022-11-03 23:31:23 +08:00
    看 op 的描述 你算 T 型人才
    thinkershare
        6
    thinkershare  
       2022-11-04 00:15:44 +08:00
    没有必要去深入理解一门编程语言,如果你是做编译器和编程语言设计的另说.
    iClass
        7
    iClass  
       2022-11-04 00:32:00 +08:00
    程序员的必修之路:语言从入门到放弃。唯有改行才能改邪归正🤔。
    HeapOverflow
        8
    HeapOverflow  
       2022-11-04 08:18:21 +08:00
    会那么多语言干嘛,深度大于广度
    lmshl
        9
    lmshl  
       2022-11-04 10:22:45 +08:00
    学语言重要的是语言特性
    在消除 illegal state 方面,Option/Optional/Maybe 和 Either/Result 就都出现在 Java/Rust/Scala/Haskell 中,其根本思想一致,但是表现深度各有不同( Haskell ≈ Scala > Rust >> Java)
    而 Kotlin/Swift/TypeScript 等则走向另一条路,Union type ,Explicit Null Type
    ADT 数据结构,也就同时出现在这些现代语言中( Haskell/Scala/Rust/Kotlin......)。Go 则是开历史倒车,这也是为什么我不喜欢 Go 。

    说到并发,大部分语言都选择了用户有感的 stackless coroutine (基于 IO Monad 的 Haskell ,Scala ,JavaScript Promise 。以及基于编译器翻译成状态机的 Rust ,Kotlin ,JavaScript Async ,C#),少部分选择了用户无感的 stackful coroutine (比如 Java Loom ,Goroutine )。

    说到资源管理,有 GC 的语言可以用 (AutoCloseable/IDisposable),无 GC 则可能用 RAII ( Drop/Deinit),函数是语言可能选 Resource Monad 甚至还能配合 linear type 做更强力的保证。


    回到问题:我认为学语言的主要目的是学语言特性,因为健壮代码的最佳实践已经被抽象成这些语言特性。当你学会这些语言特性以后,你可以很低代价迁移到具备此类语言特性的其他语言中,甚至在不具备这些特性的语言里(比如 Java )你依然可以写出正确的代码。

    如果你想学语言特性,我建议可以用《 SICP 》打基础,用多范式的 Scala 做练习,同时继续学习 Rust 与 Haskell 。并且给自己一个驱动力,比如在允许的情况下,新项目选型或者个人项目可以考虑采用 Rust / Kotlin 来逼自己一把。
    tobeyoung
        10
    tobeyoung  
       2022-11-04 10:25:09 +08:00
    @FrankHB bytecode 编码应该不算一种语言吧,我觉得 smali 这种才算一种语言
    pocarisweat
        11
    pocarisweat  
       2022-11-04 10:36:05 +08:00
    vczh 以前说它推荐学五个语言就够了:C++、Ruby 、Haskell 、Prolog ,因为它们代表了不同的编程范式,还有一个是啥忘了,按照他的风格可能是 C#吧。

    刚好有本《七周七语言》的书也涵盖了这些语言: https://www.v2ex.com/t/797161

    但是一般情况下,只要没有工作压力,人是很难深入学习另一门语言的
    junmoxiao
        12
    junmoxiao  
       2022-11-04 10:41:01 +08:00
    @lmshl sicp 就算了,懂的人不需要看,不懂的人看着费劲
    FrankHB
        13
    FrankHB  
       2022-11-04 19:46:35 +08:00
    @tobeyoung 怎么不是呢,机器码编码的汇编语言也是语言,还不止一种。
    只不过不是所谓的高级语言罢了。
    JVM bytecode 的 opcode 和 IL 都是放在 JVMS 里讲的。就是 Dalvik bytecode ,也是同时给出运算格式和助记符语法的。Smali 反而不算一个很正式的语言,因为总结它的文法的正式文档都找不到。
    如果 OP 说的是真的,那根本不需要有什么焦虑,因为高级语言和不高级的语言差的比多数不同高级语言之间大多了。
    FrankHB
        14
    FrankHB  
       2022-11-04 19:57:34 +08:00
    @lmshl 这个结论是菜鸡理解。
    说学语言的目的是学语言特性,就跟学库的目的是学 API 一样。典型地没搞清目的和手段。
    如果学语言的目的是要了解不同的范式,那么学会怎么使用特性是可以提供一些帮助,但是因为不熟练就没法确定是否顶用,这非常低效,是个不推荐的做法。
    正常的做法是,直接把目的拔高到修改和制造不同的语言,然后才能方便在不同的语言特性中去重。语言特性不再需要是直接学习的对象,要学习的应该是语言规则怎么写的原因。理解了为什么怎么写,比理解具体是什么重要得多,也理应更加花时间消化。比较几下顺带还可以看出编写 spec 的作者的水平问题。
    至于学会具体语言特性怎么用,那本来就是顺便。须知,大多数个别特性其实都不怎么顶用。归纳出什么特性组合顶用,无非是两种套路:一整个语言挨个儿学(因为一大抄,非常低效),要么就是自己理解怎么去组合。当你清楚怎么组合时,那自然就知道该怎么用了(或者说怎么批判不顶用)。
    只有遇到实际需求叫你用哪个具体语言去实现什么东西的时候,再去考虑学整个语言——通常也不需要(因为绝大多数语言的设计者都有不少明确不求甚解的地方,设计出来的东西从没正常到值得你整个照搬去参考的地步)。
    lmshl
        15
    lmshl  
       2022-12-18 15:42:31 +08:00
    @FrankHB
    大佬的建议给我的感觉就像是......😂
    学霸:“真的很建议大家考清华大学”
    专家:“真的很建议大家全款买房”

    楼主这个阶段和水平的人,我觉得离着大佬说的“改语言”和“造语言”还远得很
    FrankHB
        16
    FrankHB  
       2022-12-18 16:14:08 +08:00
    @lmshl 又不是重写,改改局部特性,跟改库 API 没多少区别。
    会难改的八成是原始设计的错,不见得轮得到显示出用户的菜。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2832 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:30 · PVG 10:30 · LAX 19:30 · JFK 22:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.