昨天刷知乎的时候看到一个问题:为什么我学个 JAVA 就已经耗尽所有,而有些人还能同时学习多门语言。
链接: https://www.zhihu.com/question/485917018 里面有个回答让我印象深刻,我大概引述一段:
因为你学错了方向。 学 C ,学 C++,学 Java ,学的目标应该是“自己写 libevent”,“自己写玩具版 unreal”,“自己写模板程序”,“自己写 spring 中间件”,“自己写设备驱动”,“自己写 DSL 解释器” 这些其实很容易。本科专业课内容而已。 一旦你往这个方向训练自己,那么换语言就是换一换符号风格,没什么大不了的。思路就是那么几条,模仿、遍历、分治、动态规划、……;手法就是那么几种,缓存、索引、信号/事件、回调/消息循环/dispatcher……;注意事项就那么几点,边界值、等价类、数据完整性原子性、死锁、空转…… 这寥寥十几、几十个知识点,玩好了,玩精了,万变不离其宗——几十年了,哪有什么软件/算法能跳出窠臼的? 学什么调优啊。这软件我都会写。知道内部算法,看一眼参数就知道是调整什么的、调整后会造成哪些影响——真不知道稍微一查也立刻明白了。 学什么框架啊。这思路我看了就懂,就知道怎么写。我觉得这个框架我应该这么写、这么给人用,一看果然是,哪有什么“学习负担”——猜错了?猜错了说明基础知识掌握不过关,赶紧补课去。唰唰补足短板,以后就再也难不倒我了。 如此反复训练,自然学什么越学越快、猜什么越猜越准——随便什么技术,内行一看,都是新瓶装旧酒! 那能不轻松吗?
这回答让我觉得醍醐灌顶,我原来一直觉得,Java 的东西怎么这么多呀?为什么就学不完呢?然后才发现自己原来一直沉浸在业务里,除了这位答主提到的 spring 中间件我稍微能有些头绪,他提到的其他的技术我是一点都不了解,一点都不明白。 我是一名土木专科转行的后端开发,虽然年纪越来越大,但还是想继续提升自己的能力,主要原因还是因为自己学历不好,想要提升自己的能力,看有没有机会能跳出外包圈进入甲方公司。。。
1
chaleaochexist 341 天前
不同语言的写法其实是完全不同的.
知乎上的东西看看就好了. 语言不重要这句话只针对真正的大牛而不是知乎上的. |
2
pengtdyd 341 天前
有多大龄? 30 岁以上那就算了吧。25 岁左右可以继续深耕。
|
3
draymonder 341 天前
闻道有先后,术业有专攻。
提升自己能力最好的就是知道自己不足的点,针对性的提高下。 |
4
kuituosi 341 天前 2
他这个说法其实没问题
你熟悉这几门课程,数据结构,算法设计,数据库原理,网络原理,操作系统 设计模式 微服务架构 那么语言只是不同的符号,完成同样一件事情的方法不同而已 我自己的经历起初是学生时代 c++,工作几年后转为 java 有 c++和 java 之后再学其他语言就是小菜,学 python 几天就能干活,学 golang 一个月足够 学 js 几周就能干活,rust 学的久 6 个月后才干活 总结就是 c++打基础,java 学技能。c++让你学习很多开源软件没有压力 特别是 java 能让你的技能树点满,其他语言就是小菜 rust 学的久是因为上手门槛高,要想写顺手必须经过严格训练,没练好很容易编译不过会让你哭 真的不骗你,rust 专治各种不服 我现在用 rust 实现的 im 在技术上可以比肩微信或者 telegram ,rust 真的很强但是完全掌握不容易 推荐我认为应该多花时间学的语言,第一名非 java 莫属不接受反驳,编程思想和各种顶级源码是最好的老师 第二名就是 rust ,高性能高质量中间件最强工具,没有之一 第三名是 c/c++,语法学个大概就行,主要是各种重量级源码是 c/c++写的 |
5
404www 341 天前
果然还得是宇宙机
|
6
leaves615 340 天前
不管学什么编程语言,知识结构都是倒金字塔。越往下范围就越小,然后就发现除开语言特性、语法、文法、生态、api 等,逻辑、数学公式都是一样。所以再学一门就只需要学习差异部分。然后就可以写了。
每种编程语言有各自的特点和适应场景。编程语言只有最合适你的,没有最好的。 |
8
meiyiliya 340 天前
按现在互联网上的说法,这就是教育的闭环,年少时的一颗子弹时隔几年后击中眉心,学生时代打基础时期觉得教的"没什么用",脱离了社会,面试时可是需要会使用 XX 框架,到了社会上工作了几年又觉得基础重要,但既然都到了这一步了,再回过头意义不大了,我个人感觉工作中吃透业务比吃透技术要有用,因为技术是服务业务的,技术原理了解就好。
|
9
AkaneWWW OP @draymonder 闻道有先后,术业有专攻,虽然我作为 30 岁的转行人员可能不太有资格认同这句话,但我还是觉得这句话很有道理就是了
|
10
janus77 340 天前
语言只是工具,大学里面学的是思想,思想才是计算机界的基石,就好像你研究物理一定要先学数学一样。
当然如果你只是为了工作,那就用到什么学什么,先学框架、中间件这些,然后是最佳实践、架构这些,然后是性能优化、底层这些,到这个时候你就开始用到思想了。要看你现在处于什么阶段 |
12
AkaneWWW OP @kuituosi 这几门课程我在看了知乎的回答之后,都下载了对应的电子书,但是我的时间实在是不太够,不知道要怎么做才能把这些都学完,感觉现在要学的东西太多了,对于我来说,目前正在进行自考本科,又在学英语,Java 方面的各种技术也不能落下,毕竟现在工作就在写这些,现在越学越迷茫了
|
14
ZZ74 340 天前
@janus77
在国内这环境,等你意识到开始用思想的时候 就已经来不及了。 其实 CS 的人本科阶段,把 C 用好,算法和数据结构学好。操作系统也熟悉,最好看一些 linux kernel 源码,体会一下数据结构和算法的在里面的应用 就够了 不考研的话,等到大四,再补一点 CPP 或者 Java 就够了 ACM ,数学建模,编译原理接触下就行了。 |
15
AkaneWWW OP @ZZ74 大佬,我想问一下,对于我这种半路出家转行进入这个行业的人,我该怎么做才能靠近那些本专业毕业工作了几年的人的水平呢?是不是应该静下心先去把专业里的几门大课全部先学一遍?
|
16
nerkeler 340 天前 via Android
半路出家大概率像我一样是 javaweb 方向,既然已经是这样的处境了,那只能面向工资发展了,意识到哪里落下就补哪里吧,就算是科班,绝大多数也到不了上面老哥说的那种深度。
|
18
nerkeler 340 天前 via Android
刚转一年多点,在外包,我这边是驻场没有甲方开发,偶尔和甲方领导讨论技术实现,平心而论我感觉并没有多厉害,很多时候也只是实现而已,并没有什么精妙的设计和想法。你要是真想转甲方的话,基础算法数据结构得整上吧,数据库方面得稍微精通点,java 方面 JUC 深入点,这几个就够小半年学的了,有精力再看看 spring ,后面拓宽再看看网络协议,辅修另一个语言,主要是应用场景用得上,我就是这么给自己规划的,虽然进度都不咋样,并且在考虑该干不干这个了
|
19
kera0a 340 天前 via iPhone
不知道你有没有网上学完计算机本科的课程,计算机网络,操作系统,数据结构,编译原理等等。没有的话强烈推荐,这些课程难度并不高,你甚至可以当开拓视野的科普片看。
很多东西你学完后才会发现,思维都很质朴,没有什么高大上,高大上都是在这些质朴的思想下慢慢垒起来的。 我感觉这些基础课程还是非常重要的。虽然可能你工作中好像没用到,但学习这些能让你的思维方式改变。 了解底层的一些原理后也更自信了,什么各种高大上的名词你一看原理就会想,不就是 XX 嘛。 纯属个人经验,我也是渣渣,一些自己的感悟。 |
20
ikas 340 天前
一个知识的维度,你研究的越多就会发现需要懂的越多.
选一个自己自认为可以搞下去的方向去深究,看看自己究竟可以走到哪一步 知道自己的上限然后其它相关的再来研究 另外自己学习的能力,思考的方式,解决问题的方法经验这些也是极为重要的. 再说语言,除非你是从 java,c#这一类的语言,跳转到 c++,rust 这样的.否则难度都不是很大的 (当然不包括一些..语言) 可以去对比 java netty,c++ facebook/wangle,c# Azure/DotNetty |
23
AkaneWWW OP @nerkeler 我和老哥的情况还蛮像的,转行后,今年是在外包工作的第四年,也经常会和行里的人探讨技术实现和项目问题,但是目前我的这批外包的同事,真的太卷了,而且技术方面也限制的很严重,技术老旧,实现混乱,管理也很混乱,所以才起了该离开了的心思~~
|
24
windman038154 340 天前
@kuituosi 大佬想请教一下,现在公司自己做 IM 组件的还多吗,一般公司应该没有预算吧。做 IM 系统最核心的是哪方面的问题呢?
|
25
vultr 340 天前
有一本叫作 深入理解计算机系统 的书,特别适合非计算机专业的人看,补一补数据结构,算法方面的知识是很有必要的,虽然在工作中不一定用得上。
|
26
monmon 340 天前 6
|
27
meiyiliya 340 天前
@AkaneWWW 现在极力的找补作用并不大了,等你安心补上计科的几门课,没个脱产的几年吃透大概率做不到知乎上说的能自己写,可能有了家庭这个时间会更延长,最后达到的效果就是了解原理,然后随着时间的推移又逐渐遗忘,对于工作上来说”意义“并不大,我个人认为现在更好的方案是先吃透业务,找到业务上最薄弱的地方,在这些地方上看有没有技术去解决或提升,也就是业务上为什么要有这些中间件,当时没有中间件的时出了什么问题,理解为什么要有这东西,比这东西怎么实现的在工作上要更有帮助,这样才可以在工作上即提升技术也能做出贡献。
|
28
kuituosi 340 天前
@windman038154 主要还是看架构设计
|
29
dog82 340 天前
语言入门不难(RUST 除外),学个两三周就能写 CRUD 了
但是象写标准库那样使用语言很难,不信你看看 Java JDK 和 Golang 的库 大部分的 Go 程序员,都是在用 java 的风格写 CRUD |
31
shawn4me 340 天前
技术为业务服务,如果公司的业务已经发展到了对应的地步那么自然就会接触到对应的知识。相信软件发展这么多年以及信息行业的开放性,会有比较多成熟的解决方案。那么自己要做的就是准确发现当前业务中的问题,然后将成熟的解决方案应用到公司的业务之上。在能够解决提升当前的问题的情况下,再去深层次研究,是什么,为什么,以及怎么做的问题。感觉会比没有方向的学习要好一些。
|
33
jones2000 340 天前
提升自己有很多含义, 比如涨工资, 社交能力提升,人脉提升等等。 技术能力的提升不一定能带来工资的提升。先搞清楚自己要什么, 如果是要钱, 技术只是很小的一个因素而已。
|
34
coderzhangsan 340 天前
@dog82 学习另外一门语言,尤其是设计模式很大不同的语言,想要标准化编程,我觉得这个是比较难的,绝大多数人编程思想受"母语"影响较深,你看 java 转 go ,写出的代码偏 java 风格,php 转 go ,写出的代码偏 php 风格,真正学通一门语言,就是要用当前语言的设计思想去编程,但大多数人学习只是功利性的需求而已,很少花时间去理解这门语言的设计思想并为之付诸实践。
|
35
mantouboji 340 天前
何必要这样难为自己,祸害他人,费力气当一个高产 bug 的职场杀手业界毒瘤呢?
|
36
AkaneWWW OP @mantouboji 真是对不起了
|
37
draymonder 337 天前
@AkaneWWW emm ,从我角度来看
打基础是需要很长时间的,即使我作为科班学生,现在入手操作系统源码也是相对来说比较痛苦的 我的建议是 1. 向身边经验丰富的人学习,吸取别人的工作经验,多看别人的系统设计 2. 每天反思下自己的工作模式上有没有可以提升效率的地方,比如哪些重复工作可以自动化解决掉 3. 遇到问题,多和有经验的人沟通讨论,可能别人有更优的方案 4. 语言、设计模式这些都不本质。。本质上你要多看别人的代码,思考为什么要这样设计,这么设计的好处,不好的点在哪里。而不是说学到个工厂模式,就满地找地方写把工厂模式应用上去 |