极客时间 2 周年 特邀 100 位在产品、架构、测试、运维、人工智能、管理、编程语言、运营等各个领域的专家,在 App 内与用户交流互动。
InfoQ 特别整理了《Java 入门》图书作者臧萌(Mark)与用户的互动和问答集锦,分享给大家。
我是臧萌,《零基础学 Java》的视频课讲师,之前写过《Java 入门 1·2·3》一书。从事一线工程师工作 13 年有余,当前工作是 PayPal 数据处理组技术负责人。工作中主要涉及的技术栈包括 Java,分布式,消息队列,Spring,DevOps,监控,DSL 等等,对 Hadoop,HBase,Aerospike,Storm,Spark,Esper 也有一些研究。
极客时间已经 2 岁了,今天我来部落和大家聊聊,大家关于「编程学习,工作,软件开发设计」问题都可以问我,我会尽我所能逐一回答,希望能和极客时间一起,把部落打造为行业内最好的技术交流社区,大家燃起来。
Q1:Java 未来走势会如何,当今开发语言较多,Java 未来的趋势如何?
Mark:现在还没有一门语言有替代 Java 的决定性优势或者说明显的趋势。当然各种语言的市场份额都在起起落落。我觉得没必要把语言和语言之间看成是对立的关系。有新的语言出现,说明行业在发展,有了新的点,新的问题需要解决。学习一门新的语言,也不是什么难事儿。在有一门语言的基础下,在工作中需要频繁用到另一门语言的场景下,学会一门语言需要的时间大概是几个月,达到熟练掌握另一门语言的程度需要的时间可能就是一两年年。
聊聊 Java 前景的个人看法:
Java 的前景其实还是可以的。Java 的市场占有率一直是波浪线,上上下下的享受。从找工作的角度来说,Java 还是市场需求量足够大的。这是一个行业和生态问题。比如说,一个技术总监,负责一块新的业务,老板甩给你 X 百万,说,半年给我高出个 XXX 来。那么现在做 XXX 的大都是用的 YYY 技术,你会选择用 ZZZ 技术吗?大概率不会,因为 YYY 成熟,好招人,有现成的解决方案,坑少,资源多,确定性大。除非是 ZZZ 有很优秀的功能,对于新产品来说不可或缺,否则是不大会有管理者纯粹为了追求技术革新而尝试这种变化的。简言之,选择一个语言(注意是语言,不是工具),八分以上看生态和背景,不到两分看功能 / 技术优势。
Java 怎么流行起来,成为编程语言第一把交椅的常客,这个故事我就不说了。都是事后诸葛亮。简单一句的话,就是出现的时机对,Sun 公司的策略对,语言的功能对。
Java GC 是个问题,Java 耗内存比较多是个问题,语法不够炫,写代码的效率有时候比较低。为什么 Java 能常坐江湖老大地位呢?我随便说说自己的想法,想到哪里说到哪里:
- Java 的生态完整,成熟,开放,持续发展。太多公司在 Java 上投入了太多的资源。包括代码资源,研发积累,人才储备,比如阿里巴巴在 JVM 上就有很多的积累,自己也推出了龙井牌 JDK。Java 的人才也多,好招人。Java 的坑也少(同样的坑,趟的人多了,就更不容易踩坑,有坑也更容易更快的填平)。JVM 也是一个开放的平台,虚拟机绝对是 Java 的制胜法宝(内存自动回收,跨平台,运行时优化,支持多语言 / 语法,面向标准发展,太多了)。Java 是由标准定义的,并非某个公司独自把持,让更多的公司可以参与进来,(我认为)这是维持生态的基石,也是促使生态发展的前提。
- Java 的功能和学习成本的平衡的拿捏的不错。世界上大部分人还是普通人,很难的东西,很难普及。单从技术上说,后起之秀比 Java 做的好不难,难就难在“拿捏好功能和学习成本”的平衡点
- 面向对象的设计思路和“中庸”的语法,适合大规模协作编程。面向对象的设计思想,还是比较简单容易理解的。很多编程语言功能丰富,条条大路通罗马。这可以说是“鼓励”程序员随时随地来个 free style。但是这样的问题在于,别人看这段 free style 的时候,就要花去更多的时间成本。别说别人,就算是自己,回头看的时候,也难说不皱眉:what am I 弄啥嘞 ?有些技术就是这样,学学可以很爽,但是太灵活不一定是好事情,真的大规模用起来不一定一直爽。
当然,Java 肯定是不完美。没有一门编程语言是完美的,每种编程语言都由其活跃的空间,编程语言百花齐放,互相借鉴和发展,是一个好事儿。
Q2:二师兄你好,我是你的小粉丝,毕业一年半,您的专栏我已经看了很多讲,感觉弥补了很多基础知识,有空就去翻翻看,我现在是一个 Java 业务增删改查程序员,你说的那些消息队列,分布式工作中接触不到,但是自己又想学,确有不知道从何下手,很迷茫?
Mark:业务增删改查也是很有技术含量的。只是现在的框架封装的很好,把很多细节都封装在里面了。从业务用到的具体技术入手,可以学到不少东西。
有个简单的问题:请你描述一下 Java 程序启动的过程。这个问题的答案,全看回答的人掌握的深浅。学的深入了,可以聊一个小时,一知半解,可能只能回答一句话。我随便说几个问题:Spring 是怎么工作的?如果让你写一个依赖反转框架,你会怎么做?Spring 是怎么决定和组织 Bean 的初始化顺序的?Spring 是多线程的吗?Transaction 是怎么做的?SQL 精通了吗?Tomcat 启动过程是什么?太多了。如果能把工作中接触到的,实际用到的技术吃透,是最好的。工作中能用得到的,学起来才起劲儿。除非有别的目的,否则没必要刻意追求工作中确实用不到的技术。可以初步了解一下,但是深入学习的话, 还是要找和工作能有关系的东西。
Q3:请问老师,应届生第一家公司总觉得不顺心,公司氛围不喜欢,同事之间也很冷漠。最主要的平时的任务也接触不到什么难点,可能和做的业务比较边缘有关。只能自己平时去看一些博客或者视频去了解一些不懂的技术。需不需要去考虑跳槽,但是第一份工作没得到什么提升盲目跳槽我觉得也得不到好的结果。希望可以得到关于应届生提升自己和第一份工作换公司方面的建议。十分感谢。
Mark:一般来说,大家对工作经验不少很丰富的同学,面试主要还是看基础。工作三五年之内,如果能够做到 Java 基础非常牢固,编程能力和工作经验匹配,能熟练使用常用工具(Maven,Git,DB 等),不需要什么特殊的专业技能(比如精通 Kafka),offer 基本上随便拿,只是待遇问题。应届生的话,我建议打好 Java 和编程的基础(Core Java,Java 的集合类,GC,内存堆栈,ClassLoader,IO,JVM,同步,数据结构,多线程等等),如果工作中用到 Spring,可以好好学学 Spring。用心工作,肯定会有提升。不要放过工作中遇到的问题,遇到一个,解决一个。遇到不会的,就学一个,不需要刻意去找学习的方向,也会有合理的成长的。
Q4:老师你好,我是一名前端工程师,想请教一个问题:前端工程师有必要学习 Java 吗? 因为我了解到阿里很多大牛用 Node.js 做中台,但很多业务场景还是不能满足,有前端同学还是要去学 Java 才能实现特定场景的需求。之前听过 winter 老师的公开课,他也表达了类似的观点,说在阿里能把 Node.js 玩转的大佬屈指可数,而且对这个技术的推进也很艰难。对此我想问问老师的看法,谢谢。
Mark:首先可以参考我在 Q1 下面说的关于 Java 为什么流行的回复。
单独从“已经掌握了 NodeJs,要不要再继续学 Java”的角度,我不敢妄言,因为我不大会 NodeJS,也不太了解 JS 的生态。。。单纯从技术和趋势上讲,大型的项目会趋向使用强类型的语言。这是经过了很多实例验证的。所以如果继续学习 NodeJS,我能给出的一个浅浅的建议是,可以学一下 TypeScript。因为后端的复杂业务逻辑,用 TypeScript 的几率会比 JS 要大一些。NodeJS 开发后端的优势我觉得是全栈。抛开技术特点,我从钱的角度说说我的理解。如果前端用 JS,后端用 Java,可能需要三个人。但是有人忙,有人闲。如果都用 JS,那么可能两个人就够了,两个人一直忙就可以。而且技术储备只要一个技术栈,环境也只要一个环境,so easy。这样可以快速且省钱的把一个事情搞起来。如果规模越来越大,对人的技术要求越来越高,一个人的工资顶好几个人的,可能就会考虑后端用 Java 写。同时,Java 在大规模项目开发中的生态还是比较完整的。当然这只是一点浅薄的观点……
如果你工作中有可能考虑使用 Java 做一部分后台,学一点 Java 做好准备也无妨。
Q5:老师您好,我这里有几个问题困惑了很久。
1. 最近总是焦虑,感觉 Java 领域的知识点太多,自己的知识深度和广度都很欠缺。学习某一领域知识的时候总是不够专一,每当学习了一部分的时候又觉得其他的领域也不懂又开始学习其它领域。多个领域一起抓这种学习方式是不是不好,因为来回切换学习容易忘记之前学过的,是我太焦虑了么,应怎么改进。
2. 最近想专心研究消息队列,就目前工作 4 年的我,如果太过于钻研一个领域会不会偏科?应该怎么权衡?因为 Netty,Zookeeper,Redis,MySQL,Dubbo, 虚拟机,这些领域我都还只是简单会用,感觉跳槽面试完全不够。
3. 看书读源码时会看代码的每一个细节,明知道不太好,就是不能够说服自己改掉这个毛病,很枯燥,求老师指点一二。先在此谢过老师了。
Mark:喜欢学习是个好事情。
关于 1)和 2),我的看法是,学习的东西,尤其是深入学习的东西,还是要和自己日常工作能够有关系。可能是可以直接用在生产上,比如说消息队列,或者能够开发一个独立的小工具。这样才有学的动力和目的。能解决实际的问题。纯学的问题在于,无法通过解决实际问题,产生实际价值的方式,验证自己学的怎么样,属于纸上谈兵。我能感受到你是个不喜欢纸上谈兵的人,可能这也是你焦虑的原因之一?
所以我的建议是,新技术学肯定是要学,选择学习的新技术前,先评估一下哪些技术可能可以帮助到自己的工作。然后慢慢在工作中展开使用,边用边学。强调一下,生产无儿戏,在生产上用新东西要谨慎小心,步步验证,慢慢推进,想好回退策略。如果是开发一个独立的工具,对线上生产没影响,是最好的。
关于 3),可以从用入手,用熟了,再深入架构,理解了架构,再深入代码细节。或者通过一些讲解开源项目的书 / 课程来学习。
Q6:我是 Ruby on Rails 栈满足业务需求的水平,有限的时间有两个选择:继续深挖 Ruby on Rails,那么应该注重什么方向以保证技能的通用性?如果跟随老师捡起 Java-Spring 栈,以我的背景应该多关注哪些模块?PS 我未来感兴趣的业务方向是云服务提供商。
Mark:Ruby on Rails 不熟,不敢妄言。抛出之前回复的一个观点吧。保值的不是技术,而是使用技术解决业务问题、支撑业务发展的能力。说回 Java。如果你有确定的职业方向,可以重点关注这个方向的技术趋势呀。我倒是碰巧 n 年前做过一段时间的云开发。当时做的是资源管理系统,用的是 Spring+MySQL。典型的一个系统。但是云计算里现在方向很多很多了。不同的方向的技术栈差别很大。
Q7:老师您好,用过 Java 但是总感觉用的不得不好。很多细节不懂。前阵子又看了 Java 核心技术这本书。但是感觉还是很迷。所以老师,想要提升 Java 应该看哪里?或者说看您的课程应该重点关注哪些部分?谢谢老师。
Mark:对于之前学过一些同学,重点当然是之前没学会,感觉比较迷的啦。比如你如果觉得数组比较迷,就重点看看数组那一节。如果你觉得类和面向对象比较迷,那整个第二篇你都要好好看。
Q8:老师,最近一直在努力学习 Java, 但是总感觉没有找到技巧,很慢,对很多东西都无从下手,很是着急,有没有什么好点的方法?
Mark:Java 学习没有太多技巧。如果是基础语法的话,可以顺着我的教学视频学,有问题欢迎随时交流。如果是某个具体的技术,可以看官方文档的入门 demo,这个过程我在第六章的“160 | 一个从 pptx 文件中抽取文字的小工具”也有讲述一个大概的过程。看文档,看 demo,写代码是必不可少的。也要好好利用搜索引擎和 StackOverflow。
Q9:臧老师,您好,请问在开发过程中,用的比较多的 Java 知识点有哪些?平时提升 Java 技能需要关注哪些方面?
Mark:用的比较多的知识的,就是你不会的知识点 :-) 平时提升 Java 技能,最需要注意的就是,遇到不会的知识点不要绕开,有计划的刻意学习这些,Java 水平自然会提升。从刻意学习知识点的角度来说,比较普遍的有:数据结构(视工作性质看要学多深入),Java 的 concurrent 包比较值得学,apache common 的很多包,用到的话值得学一下。Spring 的用法,思想,要学。虽然很俗,但是 Java 的面向对象的思想要理解,平时工作可以多想想,类为什么要这么设计,以后方便扩展否,别人用我设计的类,会不会骂这些类设计的太烂不好用。
Q10:身边有些同事从 Java 转去大数据了,还有一些工作没几年的大数据人比同级别的 Java 工程师公资要高不少。一方面觉得心里不平衡,一方面又不想放弃已有的 Java 计数栈,请问臧老师关于 Java 和大数据的一些看法。(就是从 Java 开发转到数据工程师,又转到大数据开发。)
Mark:从数据处理系统的角度来说,大数据已经是必选项了,这颗技能树是肯定要点的。如果你说的大数据开发工程师仅限于会用这些大数据平台,做一些系统,那我觉得还好。使用这些大数据平台的学习成本并不是很高。但是根据我的见闻,做这个除了要对技术有感觉,还要对数据有感觉,有折腾数据的冲动。
转行做大数据平台的开发工程师,那就是另一回事儿了。与使用大数据平台相比,这是在一棵树下乘凉,还是和一棵树绑定的区别。大数据开发工程师要求对某个或者某几个大数据平台有深入的学习和研究,比如 Hadoop,HBase,Storm,Spark,Flink 等等。现在大数据平台还没有绝对的胜利者,所以如果深入研究一个系统,以后如果这个系统不主流了,可能之前的积累就有些浪费了(当然这些经验对学习其它的大数据系统肯定是有帮助的,但是毕竟可能要重新学)。即使是同一个大数据平台,它的的技术更新也是比较快的。做这个方向,要确定自己是持续学习新知识的动力,而且要有深挖技术兴趣,比如针对自己公司的业务,对平台的调度或者资源分配算法进行优化等。
最后,学习新东西总归是好事情。即使用不上,也是拓宽了视野,锻炼了能力。
Q11:欢迎臧老师,能指点下从其他语言到 Java 的一个学习线路图么?谢谢
Mark:你这是曲线让我做广告么。如果是有了一门别的语言的基础,那么我的零基础学 Java 的第一章可以轻松愉快的学一下,后面的内容组织是我精心安排的,略有啰嗦,但是没有废话,建议要上手实操,跟着里面的大小例子学起来。学完之后,Java 的语法是没有问题了。剩下的是熟悉 Java 的生态环境。我又要提 Spring 了。Spring 基本上是 Java 学会之后下一个必须学一点的东西。不仅仅是从技术上,学好 Spring 对理解面向对象,程序设计也有帮助。再然后,就看具体做的东西了。Java 生态大,每个领域都有值得学的东西。要根据自己的工作 / 兴趣展开。
Q12:老师,您好!我目前从事 PHP 开发,已经使用 PHP 两年多了,想问下,Java 的技术路线,技术栈都是什么?
Mark:如果是做网站的话,现在应该是用 SpringBoot 的比较多。Spring 生态完整的覆盖了网站开发的各个层,包括 http,数据访问,事务支持等等。Swagger 可以方便的帮忙生成 API 和框架代码。当然,上手之后还是要深入学习的。
Q13:Mark 你好,管理信息系统的实现一般是 Java/PHP/Python/Go => 数据库。业务上升之后,变成 Java/PHP/Python/Go => cache => 数据库。在往后增加搜索,读写分离;主要的业务就是对存储进行更新和检索。是不是说管理信息系统的宿命就是面向存储编程。选取合适的存储服务程序,进行数据的编辑。这时候,工程师的价值就是存储程序的熟悉程度?
Mark:说一点我的感受。虽然做技术的内心的小骄傲可能很难放下。但是迟早绝大多数的技术人都会认识到这一点:技术是为业务服务的。做技术的第一出发点是解决业务的问题。而不是追求技术本身的的高度或者说复杂度。当然,第二出发点就是追求技术的精进,(以为了更好的服务业务)。“服务好业务”和“把技术做精进”有时候是一致的,有时候是不一致的。
当然,现在还有一种更高远的说法,是要用技术驱动业务。这个对于很多公司来说,太过高远。即使是在有这种能力的公司,也不是每个人都有这种机会参与这种项目。所以技术驱动业务,还是不能算主流。至少现在的主流,还是技术服务业务。
那么再说一点诗和远方。技术服务业务,是一个螺旋上升的循环。如果你对现在处理的业务已经重复到无聊的程度,那么就多花心思去让业务自动化,让代码生成代码。而不是甘心的去重复的堆砌代码。这样,即能服务好业务,也能精进技术。但是落脚点要找对,业务第一,业务赚钱,技术不赚钱。纯玩技术谁给发工资呢?
Q14:大佬好,我想询问一下,Java 的未来前进方向是怎么样的呢,以及有什么知识是比较有保值意义的呢?!据我所知道的,中国程序员里面 Java 的分量其实是很足的,但在外国好像其比例略微有着下降的趋势,我不知道后面国内的前进方向是否会跟随着外国,但假设会的话,那我们如何去把学习和对待这些改变呢,再多学种语言的基础上,Java 知识体系中有什么是较为重要或者说对我们以后的道路是会有着更大,更深远的影响呢?!
Mark:其实有保值的技术,是不存在的。请收起你的搬砖听我慢慢忽悠。保值的是能力,而非技术。技术是能力的一种,但不是全部。技术存在的意义,是解决业务问题。帮助公司赚钱和发展。所以真正保值的能力,是活学活用技术,用技术解决业务问题的能力。而不是技术本身。
再聊聊 Java 本身的前景:
Java 的前景其实还是可以的。Java 的市场占有率一直是波浪线,上上下下的享受。从找工作的角度来说,Java 还是市场需求量足够大的。这是一个行业和生态问题。比如说,一个技术总监,负责一块新的业务,老板甩给你 X 百万,说,半年给我高出个 XXX 来。那么现在做 XXX 的大都是用的 YYY 技术,你会选择用 ZZZ 技术吗?大概率不会,因为 YYY 成熟,好招人,有现成的解决方案,坑少,资源多,确定性大。除非是 ZZZ 有很优秀的功能,对于新产品来说不可或缺,否则是不大会有管理者纯粹为了追求技术革新而尝试这种变化的。简言之,选择一个语言(注意是语言,不是工具),八分以上看生态和背景,不到两分看功能 / 技术优势。
再聊聊学习:
首先,Java 的基础要学牢固。Java 现在不同的领域技术栈还是有差别的。就我接触到的面来说,Spring 是 Java 知识体系当之无愧的必选必学必会。抛开语言,可以学一些更通用的东西,比如 Linux,网络等。这些技术其实是比较值得积累的,因为它们的变化比较少,而且用的又非常广泛。Java 生态对很多领域都有渗透。我的建议是,根据你自己现在工作所在的领域,选择几个 Java 项目的翘楚,深入研究一下。工作以后,学习还是要和工作结合在一起的,这样方便实践,也更有学习的动力,不容易放弃。
回到最初的观点,对“以后的道路是会有着更大,更深远的影响”的,还是学习用技术解决问题的能力。单纯的谈一个技术,意义不大。现在的而技术都对学习者很友好了,各种配套工具和资料都有。学会不难,用好不易。
2 年时间,极客时间已经为用户交付了 94 门课程,涵盖产品、架构、测试、运维、人工智能、管理、编程语言、运营等多个领域。9 月「部落」上线后,用户又有了新的思考和讨论的聚集地。欢迎你 加入「部落」 ,和大咖们共同探讨技术问题,和我们一起探索新的学习方式。