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

2022-11-03 20:19:00 +08:00
 closedevice

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

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

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

2791 次点击
所在节点    程序员
16 条回复
msg7086
2022-11-03 20:36:48 +08:00
解决什么问题?
没有学透第二门语言是一个问题吗?造成了什么样的后果,对你产生了什么样的坏影响?

学编程语言,基本上两个作用,一能用这门语言挣钱养家糊口,二能学习这门语言设计的思想精髓。
现在养家糊口不成问题,设计思想也差不多都学完了,你还需要解决什么问题?
wu67
2022-11-03 21:01:32 +08:00
表示一直想学一门 js 以外的语言, 但每次一看那些语言的符号(定义 /操作符)就头疼, 然后不了了之, 像 :: [] 全大写蛇形常量 之类的, 混在一起我每个符号都认识, 但组合一起就不知道啥意思了. 第一次感受这种痛苦时大二时学 C 艹
FrankHB
2022-11-03 21:07:59 +08:00
你确信?
JVM 的 bytecode 编码的就是一种跟 Java 截然不同的语言。
zhuo1ang
2022-11-03 23:27:08 +08:00
说真的我也有这种感觉,浅尝辄止的语言很多,都没有能掌握到一个比较深入的程度,这一点上还需要额外自律,自己真是动力不足...
2NUT
2022-11-03 23:31:23 +08:00
看 op 的描述 你算 T 型人才
thinkershare
2022-11-04 00:15:44 +08:00
没有必要去深入理解一门编程语言,如果你是做编译器和编程语言设计的另说.
iClass
2022-11-04 00:32:00 +08:00
程序员的必修之路:语言从入门到放弃。唯有改行才能改邪归正🤔。
HeapOverflow
2022-11-04 08:18:21 +08:00
会那么多语言干嘛,深度大于广度
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
2022-11-04 10:25:09 +08:00
@FrankHB bytecode 编码应该不算一种语言吧,我觉得 smali 这种才算一种语言
pocarisweat
2022-11-04 10:36:05 +08:00
vczh 以前说它推荐学五个语言就够了:C++、Ruby 、Haskell 、Prolog ,因为它们代表了不同的编程范式,还有一个是啥忘了,按照他的风格可能是 C#吧。

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

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

楼主这个阶段和水平的人,我觉得离着大佬说的“改语言”和“造语言”还远得很
FrankHB
2022-12-18 16:14:08 +08:00
@lmshl 又不是重写,改改局部特性,跟改库 API 没多少区别。
会难改的八成是原始设计的错,不见得轮得到显示出用户的菜。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/892459

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX