记得以前刚从事研发这个行业,做的是 Java 方面的事情,当时认真研究了几年语言特性,从使用到语言实现,再到 VM 实现细节。
这么多年过去了,用的过语言蛮多,但好像再也没有花大量的时间研究另外一门语言:很多时候就是用的时候看看,一段时间不用就忘了,仿佛从未将它们学透过一样。
所以各位同行有遇到类似的问题么?是怎么解决这个问题的?
1
msg7086 2022-11-03 20:36:48 +08:00 1
解决什么问题?
没有学透第二门语言是一个问题吗?造成了什么样的后果,对你产生了什么样的坏影响? 学编程语言,基本上两个作用,一能用这门语言挣钱养家糊口,二能学习这门语言设计的思想精髓。 现在养家糊口不成问题,设计思想也差不多都学完了,你还需要解决什么问题? |
2
wu67 2022-11-03 21:01:32 +08:00 2
表示一直想学一门 js 以外的语言, 但每次一看那些语言的符号(定义 /操作符)就头疼, 然后不了了之, 像 :: [] 全大写蛇形常量 之类的, 混在一起我每个符号都认识, 但组合一起就不知道啥意思了. 第一次感受这种痛苦时大二时学 C 艹
|
3
FrankHB 2022-11-03 21:07:59 +08:00
你确信?
JVM 的 bytecode 编码的就是一种跟 Java 截然不同的语言。 |
4
zhuo1ang 2022-11-03 23:27:08 +08:00
说真的我也有这种感觉,浅尝辄止的语言很多,都没有能掌握到一个比较深入的程度,这一点上还需要额外自律,自己真是动力不足...
|
5
2NUT 2022-11-03 23:31:23 +08:00
看 op 的描述 你算 T 型人才
|
6
thinkershare 2022-11-04 00:15:44 +08:00
没有必要去深入理解一门编程语言,如果你是做编译器和编程语言设计的另说.
|
7
iClass 2022-11-04 00:32:00 +08:00
程序员的必修之路:语言从入门到放弃。唯有改行才能改邪归正🤔。
|
8
HeapOverflow 2022-11-04 08:18:21 +08:00
会那么多语言干嘛,深度大于广度
|
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 来逼自己一把。 |
11
pocarisweat 2022-11-04 10:36:05 +08:00
vczh 以前说它推荐学五个语言就够了:C++、Ruby 、Haskell 、Prolog ,因为它们代表了不同的编程范式,还有一个是啥忘了,按照他的风格可能是 C#吧。
刚好有本《七周七语言》的书也涵盖了这些语言: https://www.v2ex.com/t/797161 但是一般情况下,只要没有工作压力,人是很难深入学习另一门语言的 |
13
FrankHB 2022-11-04 19:46:35 +08:00
@tobeyoung 怎么不是呢,机器码编码的汇编语言也是语言,还不止一种。
只不过不是所谓的高级语言罢了。 JVM bytecode 的 opcode 和 IL 都是放在 JVMS 里讲的。就是 Dalvik bytecode ,也是同时给出运算格式和助记符语法的。Smali 反而不算一个很正式的语言,因为总结它的文法的正式文档都找不到。 如果 OP 说的是真的,那根本不需要有什么焦虑,因为高级语言和不高级的语言差的比多数不同高级语言之间大多了。 |
14
FrankHB 2022-11-04 19:57:34 +08:00
@lmshl 这个结论是菜鸡理解。
说学语言的目的是学语言特性,就跟学库的目的是学 API 一样。典型地没搞清目的和手段。 如果学语言的目的是要了解不同的范式,那么学会怎么使用特性是可以提供一些帮助,但是因为不熟练就没法确定是否顶用,这非常低效,是个不推荐的做法。 正常的做法是,直接把目的拔高到修改和制造不同的语言,然后才能方便在不同的语言特性中去重。语言特性不再需要是直接学习的对象,要学习的应该是语言规则怎么写的原因。理解了为什么怎么写,比理解具体是什么重要得多,也理应更加花时间消化。比较几下顺带还可以看出编写 spec 的作者的水平问题。 至于学会具体语言特性怎么用,那本来就是顺便。须知,大多数个别特性其实都不怎么顶用。归纳出什么特性组合顶用,无非是两种套路:一整个语言挨个儿学(因为一大抄,非常低效),要么就是自己理解怎么去组合。当你清楚怎么组合时,那自然就知道该怎么用了(或者说怎么批判不顶用)。 只有遇到实际需求叫你用哪个具体语言去实现什么东西的时候,再去考虑学整个语言——通常也不需要(因为绝大多数语言的设计者都有不少明确不求甚解的地方,设计出来的东西从没正常到值得你整个照搬去参考的地步)。 |
15
lmshl 2022-12-18 15:42:31 +08:00
|