乐趣区

关于java:Java-学习大法

分享 Java、.NET、Javascript、效率、软件工程、编程语言等技术常识。

本文 GitHub TechShare 已收录,没有广告,Just For Fun。

零、前言

对于该文档

在不同的阶段要应用不同的学习办法,这里将学习分为两个阶段:从 0 到 1 的阶段、从 1 到 100 的阶段,本文次要讲这两个阶段的学习形式和相干材料。

另外这份文档偏重的是在长期如何学好,而非短期,短期要迅速上手应用某一技术,那能够采纳其余的学习模式。

一、从 0 到 1

金字塔模型

在从 0 到 1 的阶段,须要采纳 金字塔模型 的学习办法,即先深刻学习根底原理,再向上学习应用层技术。举个栗子,比方一个初学者在 java 根底不扎实的状况上来学习 spring 框架,当看到 bean 的生命周期时,他是否可能很好地进行了解?这背地的思考能够引出一连串的问题,比方为何须要 IoC,为何默认是单例,DI 和单元测试之间有什么关系?对于初学者来说这些必然是很难了解透彻的,所以须要先打好根底。

工夫老本

也能够从 工夫老本 的角度去思考这个问题,当在学习较为根底的常识的时候,不容易碰到难点,这个时候可能尽快排汇,每分钟的浏览效率更高。这是一个很奢侈的情理,只是因为许多事实起因导致许多开发者没有很好的学习基础知识:计算机科学概论、编程语言入门、离散数学、数据结构与算法等等。

易学难精

在应用层的基础知识其实并不难,尤其是编程语言方面,也有一些同学很器重根底学习,但就是学的不够好,这里就波及到学习编程的一个难点,即 易学难精,对于面向对象语言而言,须要把握的货色绝对来讲是很少的,归根结底就是条件管制、循环、封装、继承、多态、多线程、语法等诸如此类,当初有许多的少儿编程培训班也能够佐证编程语言是易于学习的,难于精通在于这些基础知识自身就具备相当高的形象层级,最早的计算机就是一个巨型的计算器,要应用计算器是简略的,然而一个问题为何要如此计算却能够是无比简单的。

第一性原理

学习编程能够类比学习数学,那么如何能力学的更好,除了先学习基础知识外,在学习其上的内容的时候,还要 时刻思考基础知识 ,这有点像马斯克提出的 第一性原理,时刻剥开事物的表象,看到外面的实质,而后再从实质一层层往上走 ,数学学的好的人并不是靠死记硬背记公式,而是本人有能力推导出公式,同样编程学的好的人也并不是靠背 sdk,他们本人就能够设计出 sdk,那么当咱们在学习 sdk、框架、技术工具的时候都能够进行 逆向思考,jdk、spring 框架为何如此设计,它们是如何使用面向对象的三大个性?为何这三大个性能够演化出如此多的设计模式?看完一本基础理论书籍后不应该将其束之高阁,而是该当重复咀嚼,时刻放弃思考,直至恍然大悟、死记硬背。

像产品迭代一样更新学习办法

学习的时候同时要不断更新「学习的办法」,使本人的学习形式失去迭代降级、晋升效率,对于学习的书也有很多,比方《如何浏览一本书》、《学会发问》、《像加勒比海盗一样学习》、《思维导图》、《疾速浏览》、《把工夫当作敌人》等等,这些书让咱们把握更多学习方法论的同时也扩大了常识网络,正所谓磨刀不误砍柴工、万变不离其宗,多从不同的角度思考学习编程这件事件,晋升学习能力并非欲速不达,而是一件须要积淀和积攒的事件。

学习方向

有了金字塔这一根底的学习模型后,绝对来讲不太容易走弯路,但技术路线千千万,还是要有肯定的方向,否则容易在技术的路线上迷失。学习的方向跟个人兴趣关系也很大,因而这里仅列举一个大抵的方向,仅供参考。

首先是基础知识。

  • 计算机科学概论

    • 计算机科学这门学科的总览,从深度和广度上展示这门学科的根本框架。
  • 编程语言

    • 《Java 编程思维》、《Java 核心技术》
    • 入门时最须要的是一本由浅入深的书籍。
  • 数据结构与算法

    • 《数据结构与算法剖析》、《算法导论》、《离散数学及其利用》
    • 代码写的好与坏,数据结构和算法是基本。
  • 计算机网络

    • 《计算机网络:自顶向下办法》、《TCP/IP 详情》
    • 在服务端开发畛域,计算机网络的重要性显而易见。

基础知识畛域是非常广阔的,这外面也有纷繁复杂的问题,当碰到难懂的知识点时须要去补充更多的基础知识以便进行下一步学习,就像玩游戏一样,当你的等级还打不赢一个 boss 的时候就不要硬打,先去打打小怪补充点教训

以上内容不须要全副学完才开始下一阶段,有了肯定的根底之后能够开始学习应用层的常识,具体什么时候开始,这个就看基础知识的把握水平,多从工夫老本的角度思考,当学习效率有余的时候思考去补充更多的基础理论常识。

应用层:

  • Web 开发

    • 《Java Web 高级编程》
  • Spring 框架

    • 《Spring 实战》、《Spring Boot 实战》
  • 编程语言

    • 《Java 并发编程实战》

再次阐明,以上仅是简略的列举了一些学习点,要害还是围绕着自底向上这一思维进行学习,但并非把所有的底都铺好再往上学习,而是依据不同的畛域,打不同区块的地基,在不同区块上垒高墙。

浏览经典

学习方向并非喋喋不休能够讲清楚的,因为这个方向自身在学习的过程中很容易产生变动,浏览的书籍会扭转人的思维,其重要性显而易见,市面上的书多如牛毛,伏尔泰说过 图书馆是真谛和舛误的宝库,如果读错了书,那不仅没有晋升,还可能令本人退化,如何甄选好书其实不难,优先选择经典个别不会有错。当初是一个常识付费的时代,领有常识比以往更容易变现,这衍生出一个问题,就是常识市场上存在品质参差不齐的「产品」,也存在大量的同质化,这些内容个别谋求尽快奏效,是不适宜从 0 到 1 这个阶段的,经典则通过工夫的考验,是最优质的常识起源。

学习形式

很多人不读经典,一部分起因是一些经典的书比拟难以浏览,还有一些是因为通过其余形式学习更加轻松,比方看教学视频,看视频学习的节奏比较慢,头脑能够处在一个比拟轻松的状态上来接管常识,不光要接管常识,还须要接管很多无用的信息,比方讲课老师的长时间进展、演示等等,这些无形中耗费了工夫老本。看视频学习须要视状况而定,即在学习艰深难懂的常识时才须要通过别人来解说,咱们最开始都是通过老师讲课来学习常识的,在读大学的时候应该曾经可能造成较强的自学能力,在许多常识畛域的学习上都不再须要别人传授。

依据所学常识的艰难水平,抉择适宜本人的学习形式,优先读经典书籍,不要因为惰性而抉择低效的学习形式。

学习品质

采纳适当的学习形式是为了晋升学习效率,但不要陷入一味谋求速度的误区,在从 0 到 1 的阶段许多书都须要通读而非挑读,对书中的细节也不能疏忽,经典的基础理论书籍须要缓缓浏览,而非疾速浏览,在浏览的时候要辅以练习晋升学习品质。

编程实战

在编程方面,遇见较难学习的知识点的时候,一个解决办法是去补充更多的基础知识,另一个办法是进行编程练习,能够找一些本人感兴趣的小我的项目进行实际,比方学到面向对象的时候,能够写一个简略的小游戏,定义游戏外面人物、怪物的对象模型,琢磨为何会由过程式编程转变为面向对象编程,这些自我实际在晚期是十分重要的,能够加深学习了解,令本人不须要死记硬背。

趣味是最好的老师

找本人感兴趣的我的项目也能够晋升集体的编程趣味,趣味是最好的老师,当你趣味越来越浓之时,苦学编程就变成了一种享受,当你写出一个网站、写出一个小游戏的时候,成就感会促使你持续学习,甚至激发你的潜能。

二、从 1 到 100

当曾经入门编程这个畛域之后,你应该可能感触到编程的魅力,也对其有了一个较为全面的意识,满足这两点后就进入接下来从 1 到 100 的过程,若不满足,则这个回升过程可能是会比拟苦楚或者懈怠的,这时更须要时刻去坚固基础知识,更多的去发现编程乏味的中央,更全面的去意识编程。

在这个阶段差不多开始须要面对工作的问题,那首先从实用性的角度登程学习必备的常识技能,如数据库、设计模式等,再一直裁减常识广度,同时又时刻使用第一性原理去理清常识脉络。

筛选书籍

在第一个阶段,看的书不在多而在精,基础理论的经典书籍也更多,比方大家熟知的「Java 四大名著」,在 0 到 1 阶段的书比拟容易筛选,而在这个阶段须要看的书则会更多,所以如何在学习之前做好筹备工作,挑好书籍也是十分重要,无效地利用豆瓣、github,认真翻阅书的目录,雷同畛域的书多加比照,直到挑选出适宜本人的书后再开始浏览。

晋升技术视线

学习多种编程语言能够晋升编程能力,毕竟不同的编程语言的个性和设计还是有不少差异,能够从中吸纳别的编程语言的长处,除了学习同类范式的编程语言,还可学习不同范式的编程语言,比方函数式编程语言,除了这些常见的,还有逻辑编程语言、畛域特定语言等。尽量学习一些差别跟 Java 较大的语言,比方 python、ruby,Python 之禅中提到「做一件事件有且只有一种办法」,而 ruby 则提倡做一件事件能够有多种办法,这些设计哲学背地能够引发一系列的思考。

Java 编程语言因为用户过多,所以在语法和版本上的更新是绝对落后的,如果视线仅停留在这个畛域,实际上是对本身存在一个比拟大的限度。将其与 C# 比照也十分有意思,Java 中许多新的语言个性都是在追随 C# 的脚步,有一些 C# 外面优良的货色,在 Java 中很难找到替代品,比方 linq,Java 中有开源的 QueryDSL 我的项目,但跟这种语言级别的个性比起来的确逊色不少。

好奇心、摸索欲和顺藤摸瓜

多学几门编程语言是晋升技术视线的一个小的方面,要晋升这种视线扩大的能力,具备好奇心和摸索欲是必不可少的,当咱们看到一本优良的书籍的时候,外面个别会援用其余书籍,顺藤摸瓜地进行学习能够造成更好的常识脉络。

均衡的艺术

将新学习的语言与 Java 进行比照,呈现设计上的差别必然是各有优缺点,在思考的过程中找到其中的平衡点是十分要害的,因为编程在许多状况下都须要衡量多种计划,浏览别人写的代码比拟难的一个起因之一就是实现一个性能的形式有太多种了,而当可能得心应手地进行衡量的时候,脑海里会浮现出更优良的计划,这时可选择性曾经不多了,那整体的代码可读性也变高了,这便是 Python 之禅「做一件事件有且只有一种办法」的立意。这个设计跟 ruby 各有优缺点,但这一点显然是升高了开发时的认知累赘和抉择老本。

做减法,缩小心智累赘

学习了肯定的常识后,容易呈现一个景象,即拿着锤子看什么都像钉子,想挥一挥刚把握的这把锤子,实际上在利用的时候是不可一股脑把会的技术都用上,必须学会做减法。举个例子,当咱们学习了 ORM 框架之后,在简略的 CRUD 场景下不再须要写 SQL 语句,这便是一种减负,那因为 ORM 框架在解决简单的聚合查问时是不那么通明的,须要很深刻的学习能力写好一个高性能的简单查问,那咱们在使用 ORM 编写简单查问的时候会减少很大的心智累赘,不禁地会思考一个问题,这个时候为什么不间接写 SQL 呢?这其实也是一直衡量的过程,当问题的复杂程度达到一个级别后,写 SQL 变成了一个更好的抉择。学习是为了帮忙咱们减负,储备更多的常识则会有更清朗的抉择。

重视工程实际

学习技术常识的同时,很多时候要将其与工程实际相结合,比方:接口优先准则可能使团队合作更加顺利,通过 git 提交代码要思考代码审查和继续集成,单元测试为何要按运行快慢进行分类,这些都是技术须要与工程相结合的案例,联合思考能力更加全面,能力使软件开发更加麻利。

使劲思考 /Think Harder

浅显的编码工作是容易的,只须要通俗的思考就可实现,但对于艰深的问题,却须要咱们 Think Harder,使劲思考,想的更深刻些,思考更多的可能性,本人提出问题,寻找答案,反复这一过程,直到想不出其余问题,编程须要的是十分周密的思考,当用你的程序的用户越来越多的时候,可能性也越来越多,必须思考的足够周全。事务音讯是一个深刻思考的典型案例,即提出一个又一个的问题,最初便会呈现通俗思考下不会呈现的解决方案。还有像单元测试中为何须要 mock 框架,为什么 NoSQL 采纳列式存储,都不是通俗思考所能想明确的,使劲思考才会失去答案。

编程思维

要造成深厚的功力,须要咱们使劲思考、多元化投资常识资产,不是久而久之能够取得的,但咱们能够透过景象去看实质寻求一个高效的晋升办法。认知决定思维,那咱们能够多看一些对于技术认知方面的书籍,比方《设计模式》、《代码大全》、《程序员修炼之道》、《Unix 编程艺术》这类的书籍。

建设技术分支

当编程曾经成为你的职业之后,不能光依照个人兴趣来进行学习,须要思考工作须要,有的人很器重骨干技术的倒退,当工作中须要用到其余技术时不去零碎学习,将就着用,这在短期对本人影响不大,长期却造成了微小的工夫节约,比方在局部公司 Java 后端开发偶然须要做一些前端工作,那须要本人去掂量该如何学习以及学到何种水平,从投资回报率的角度去思考这个问题,当因为没有零碎学习导致本人在解决小问题时都破费大量工夫时,那就应该去零碎学习下,最终破费的工夫更少,并且还建设了技术分支,在学习其余技术的时候,技术视线以及技术思维也可能晋升。

像做投资一样治理常识资产

建设技术分支时能够从投资回报率的角度思考,那在常识资产的其余方面同样也实用。

庄重的投资者定期投资;多元化是长期胜利的要害;聪慧的投资者在激进的投资和高风险高回报的投资之间均衡他们的资产;周期性地从新评估和均衡资产。

虚心是一把钥匙

笛卡尔说过,学的越多,越能发现自己的无知,萧伯纳也说,看的好书越多,越能发现自己的无知 。这里再次提到好书的重要性,另外一个重点就是学习使人变强,但千万不能越学越高傲,常常看好书的人比拟少呈现这种景象,反而是学习不到位的人容易呈现,这外面隐含的一个逻辑就是咱们 毛主席说过的「虚心使人提高」,在学习的路线上,虚心是一把钥匙,虚心的人往往看到的是别人的长处,吸取别人所长为我所用。文人相轻的景象切勿呈现在技术畛域,对于别人分享的一些常识、工具,多去理解,切莫先入为主,好的货色及时转化为本人的常识资产。

批判性思维

虚心是一把钥匙,但也不能虚心过头,咱们搞代码的思考问题就是得如此审慎,虚心促使咱们向别人学习,但不能什么都接管,当然还是要取其精华去其糟粕。批判性思维使用切当在学习上也是大有脾益,当初互联网上各种常识分享、博客,那些全是对的吗?其中提出的一个观点是否通过验证,若有采取测试,那测试方法是否切当?必要的时候应用批判性思维。什么又是批判性思维呢,如何锤炼批判性思维呢?带着这些问题又能够迭代降级咱们的学习办法了。

三、学习材料

大道至简,以上两局部内容是内功,能够应用下面的「学习大法」来使用上面给出的一些学习材料。

Java 相干学习材料

  • Java 四大名著:《Java 编程语言》、《Java 编程思维》、《Java 核心技术》、《Effective Java》
  • 《Head First Java》
  • 《Java 并发编程实战》
  • 《Java Web 高级编程》
  • 《Java 8 实战》
  • 《Spring 实战》、《Spring Boot 实战》
  • 《Java 性能优化权威指南》
  • 《深刻了解 Java 虚拟机》
  • 《Netty 实战》
  • 《RxJava 响应式编程》
  • 《单元测试的艺术》
  • https://github.com/Snailclimb/JavaGuide
  • https://github.com/lcomplete/SpringCloudLearning
  • https://github.com/lcomplete/advanced-java
  • https://github.com/lcomplete/technology-talk
  • https://github.com/hollischuang/toBeTopJavaer
  • https://github.com/xkcoding/spring-boot-demo

基础知识

  • 《计算机科学概论》
  • 《数据结构与算法剖析》
  • 《离散数学及其利用》
  • 《计算机网络:自顶向下办法》、《TCP/IP 详解》
  • 《古代操作系统》
  • 《汇编语言》
  • 《C 语言程序设计》
  • https://github.com/lcomplete/CS-Notes
  • https://github.com/wolverinn/Waking-Up

算法

  • 《编程珠玑》
  • 《编程之美》
  • 《算法导论》
  • https://github.com/azl397985856/leetcode
  • https://github.com/MisterBooo/LeetCodeAnimation
  • https://github.com/labuladong/fucking-algorithm
  • https://github.com/greyireland/algorithm-pattern

编程思维

  • 《设计模式》、《Head First 设计模式》、《反模式》
  • 《代码整洁之道》
  • 《编写整洁代码的艺术》
  • 《重构》
  • 《畛域驱动开发》
  • 《Unix 编程艺术》
  • 《七周七语言》

数据库

  • 《SQL 必知必会》
  • 《高性能 MySQL》
  • 《SQL 语言艺术》
  • 《MySQL 技术底细》
  • 《Microsoft SQL Server 2008 技术底细:T-SQL 查问》
  • 《Microsoft SQL Server 2008 技术底细:T-SQL 程序设计》
  • 《SQL 反模式》
  • https://github.com/lcomplete/Database-Series
  • https://github.com/lcomplete/BigData-Notes

架构

  • 《架构整洁之道》
  • 《企业架构模式》
  • 《微服务架构设计模式》
  • 《Kubernetes in Action 中文版》
  • https://github.com/lcomplete/architect-awesome
  • https://github.com/rootsongjc/kubernetes-handbook

工程实际

  • 《麻利软件开发:准则、模式与实际》
  • 《代码大全》
  • 《人月神话》
  • 《人件》
  • 《继续交付 2.0》

集体修炼

  • 《程序员修炼之道》
  • 《程序员的职业素养》
  • 《高效程序员的 45 个习惯》

linux

  • 《鸟哥的 linux 私房菜》
  • 《Linux 命令行与 shell 脚本编程大全》

技术相干

  • 《黑客与画家》
  • 《软件随想录》
  • 《松本行弘的程序世界》
  • 《编程人生》
  • 《浪潮之巅》

学习之道

  • 《如何浏览一本书》
  • 《思维导图使用手册》
  • 《学会发问》
  • 《像加勒比海盗一样学习》
  • 《把工夫当作敌人》
  • 《疾速浏览》
  • 《学习之道》

其余优良资源

  • 《精通正则表达式》
  • https://github.com/lcomplete/free-programming-books-zh_CN
  • https://github.com/Nepxion/DiscoveryGuide
  • https://github.com/wuyouzhuguli/SpringAll
  • https://github.com/julycoding/The-Art-Of-Programming-By-July
  • https://github.com/wx-chevalier/Developer-Zero-To-Mastery

既然曾经看到这里,不防点个赞,star 一下,github,没有广告,交个敌人 🤝。

退出移动版