java 特种兵笔记:论道

感悟:

  1. 变通:让标准变成价值,给你一种思想和标准,你可以有不同的使用,不能死扣定理,我们需要解决问题!
  2. 看书:分两类,一类根据知识点进行罗列,而且结构清晰,可以看完一章有选择进行总结(不是笔记,总结是带有自己理解的),一类是零乱但是重要,需要边看边划出重要点(重要点是你还未遇到的坑或者知识点),然后看完一章进行总结。
  3. 千万不要坚定地认为什么方式快,什么方式慢,一定要讲究场景。(存在即合理)
  4. 一切在于场景与需求,十分需要,但也可以在某些情况下放弃。(性能,优化)
  5. 变化都是使用简单的基础知识加以变通的结果,这种变化是十分多的(万变不离其宗)
  6. 算法<-->生活,一一对应,如查找和排序想想学校里面排队,找人是怎么做的,把能想到的不同的手段联系到相应的方法(所有的算法来自于生活,而且没有生活那么复杂,即使是多线程技术也能在生活中找到活生生的例子)
  7. 算法:无论多么复杂,总能在实际生活中找到逻辑背景。在这种前提下,只要深度挖掘业务背景,就可以在基础算法之上进行灵活扩展。
  8. 思维横向扩展,思维发散扩展。
  9. 无论去做基础程序还是去做优化,都需要深知它的细节,才能做到心中有数。
  10. 重复制造:在了解了底层后我们需要提升知识面,知道哪些是别人提供的,哪些是需要我们自己写的。(java第三方包及工具类:我们应当知道有许多别人写的工具包可以直接拿来使用,以及如何寻找这些工具包,基础知识可以帮助我们快速学习新的工具包,以及掌握它的本质)
  11. 源码:主要目的是看懂意思和知道它的坑。
  12. java:希望将一些复杂的逻辑细节封装在工具中,能让代码尽量干净,整洁,容易维护。代码不干净在许多地方出现大量不干净的代码需要修改则要到许多地方修改,很多时候我们不知道去哪里修改,这些代码会让我们不停在技术和业务之间切换,没法专心做好业务细节,更没法深度挖掘业务。技术本身是在业务驱动下才能发挥作用的,而人在业务驱动下去学习技术能得到最佳实践。
  13. 第三方包:大公司使用的工具包正确性和性能是经过很多公司验证的,如果有问题大家都会知道。注重功底的基础上也需要大量的学习,铺开知识面,才能有选择,但:深知内在细节是我们量化选择的条件。
  14. 冗余:不是所有的工具包都能完全满足需求,这个工具包满足一部分需求,那个工具包满足一部分需求,而将这些工具包组合起来比自己写一个还蛮烦,还会有一大堆冗余,此时可以考虑扩展了。
  15. 个性化问题:每个场景都会有一些变化,开源的工具包是提供一些通用的处理,同时提供一种Java封装思想,许多代码也值得我们去参考,因此当遇上个性化问题时,并非没提供就不写了,需要深知所设计领域的业务和个性化,,这样才能对业务做出一个很爽的架构体系。

技术:

  1. 算法的基础是建立在数字的基础之上,只有数字才能真正完成计算和对比操作(如对象的hashCode()方法)。
  2. 其实数据库也离不开这些原理,大多数数据库的索引都会用换汤不换药的B+树(当然也有使用Hash算法),此思想是平衡二叉树的一种扩展。sql—》查找和排序算法
  3. 操作符:不同的运算有多种实现方式,越接近底层越快(| & ^)
  4. 为提升整体工作效率和节约资源,能提前做的事情就提前做(编译时优化)
  5. 懂得站在他人地角度和场景看待事物的不同侧面,加以推导,结合别人的意见和建议,就有机会知道真相。(如果我是语言的作者,我会如何设计?再结合提供验证,本质,文档,共同引导我们知道真相)
  6. 编译阶段能确定的内容只能来自于常量池,new出来的对象是运行时决定的。(intern()运行步骤流程,和equals()效率对比,intern()将对象保存在常量池中,使得==更快速,而不用equal()比较节约时间,原来new出来的对象和比较的对象不是同一个,所以不能用==比较,需要使用intern()将对象存入常量池,比较就可以用==,类比Integer int a = 10; Integer int b =10; a = b;a和b同为对象,但保存在常量池中就可以用==比较内存地址比equals()更快)
  7. String扩容的条件,与StringBuilder的区别,+操作符的优化。
  8. 知道什么时候会自动拆装箱,它简化了代码,但是并不是让我们一无所知。(通过源码学习)(如何调节拆装箱参数,如何避免自己写的代码频繁拆装箱)

道:

  1. 古人云:心有灵犀一点通,深深地了解技术以及它的内在。学习基础的武功,再学习任何武学都很快,内在修为将会决定你在技术这条道路上能走多远。
  2. 知其然并知其所以然:由知识引导思维,由思维引导答案,由结果印证理论,不断迭代的过程。在这个过程中对问题的认识会越来越清晰,自然在见解上越来越有道理,同时也会对自己所在的领域充满信心。
  3. 很多技术源自生活。
  4. Bug:正所谓我们不怕犯错误,怕的是不知道什么是错,更怕的是我们一直坚信正确的事竟然是错的。
  5. 测试:测试场景是不能作为真理来指导开发的,最多只能指导同样的场景下的开发(测试可以帮助我们去理解本质,以及知道本质后它是一个印证的过程)。
  6. 本质:知道了内在,知道了常规算法,知道了生活中对应的方法,我们发现它并不是那么难,关键是你是否愿意去看它的本质。
  7. 过于看中技术本身,过分仰望技术本身,学海无涯,你需要放下才能找到新的方向。
  8. 静心:功底并非天高,任何人只要静心都能行。
  9. 总结:学习后一定要落实于根本,回顾与总结,什么都想要去学习,结果学了就丢了,没有自己知识的凝固,没有自己的总结和笔记。(总结应该包含自己的理解和感受,应当能阐述学习和理解过程中的痛苦)
  10. 不是每天都要去总结(浪费时间,要不就是小总结),如果非常忙没必要(如果看到一篇比较好的文章,可以先初步看看内容,把它记录下来,写到总结中表示想要去学习的内容,等闲暇之余总结或许更好)
  11. 总结技术:技术领域你可以总结思路,总结所学所用,总结遇到的问题,总结为什么,总结解决问题的手段和方法,分析问题和定位问题的思路,总结在解决问题时所用的知识,总结技术点上是否还有相关的方案,以及对比相关知识的优缺点。
  12. 总结业务:业务上总结自己最近最近做过什么,那些是大事还是小事,自己所做的事情和几个月前比提高没有,效率上提升没有,时间安排如何,如果加班太多能否不加班,自己的工作效率是否可以进一步提升,以及如何提升,通过技术完成某些自动化还是基于时间管理来更合理地安排自己,未来几个月准备或希望去做什么样的事情,是否有能力去参与更重要的职责。
  13. 工作与学习:工作本身就是一种学习,更偏重于实践,基于工作学习一个新知识更快一些,大多在使用层面,当遇上一些稀奇古怪的问题,就要去看看内在的原理,此时去看看源码。这样碎片化的学习方式其实也是积土成山的过程,达到一定程度自然是量变引起质变,此时去翻看牛人秘籍知识知识梳理的过程。
  14. 立足当下:需要立足于当下业务,尽自己所能去挖掘,通过业务细化驱动技术的发展,尽我们所能广泛联系知识,整个学习是一个迭代的过程,功底是逐步提升的。
  15. 自信:学会相信自己,有信心去面对困难。(拥有面对逆境的心态和战胜困难的决心)
  16. 面对别人提出质疑:第一反应是看你的内心世界是否足够强大。也许在这个时候我们可以看看别人是如何修身养性的,别人能做到,我们同样能够做到。
  17. 问题:代码有问题,我们就看原因,不论是不是自己的问题都要告诉真正的原因。有问题没关系,我们不怕犯错误,而是怕错了不改,反反复复犯同样的错误,可能还是同样低级的错误。如果反反复复有人提出同样的问题,而且绝大多数不是自己的问题,可以以文档的形式呈现出来,代码不是我们写的,使用者通常不知道所有的细节。
  18. 乱搞:结果就是东西越多,问题就越多,做一件事情来解决问题,但是带来了更多的问题。
  19. 冷静面对事情的真相:客观面对我们所面临的事情,加上业务本身的熟悉程度,技术功底的配合,冷静思考,量化的判断,全局性影响的分析,逐步突破层层技术和业务难关,可以很酷解决绝大部分问题。
  20. 经验:只要是代码,肯定就会存在Bug,只有看到这类问题的本质,才能在遇到类似问题时去定位判断,而不是直接使用前人总结出来的经验解决问题。随着技术的发展,经验也会变得不靠谱。(经验可以用来借鉴和参考,但经验不能用来当饭吃,同时别人告诉你的是他的经验,也同样是一种参考和借鉴,我们要学会去看问题本质的方法和习惯)
  21. 框架:前一件东西还没掌握,新的又来了:需要方法,需要功底,懂得它的根本和发展的方向和模式,基本就知道它要做什么了,也基本知道会怎么做了,自己也可以实现,知识没有必要而已。开源软件常见的参数不会太多,当你知道它的根本:通过命令和文档查询时非常快速的,学习的代价不应该太大。
  22. 坑:我们应当”站在别人的肩膀上看问题,不仅仅是要沿用前人写好的东西,更需要看到他们所遇到的那些坑“。新一代的程序员不必都经历上一代程序员所经历的同样的坑,那样只是延续,而没有任何发展。新一代程序员即使要经历坑,也是经历一些更新的坑,去挖掘更新的东西,而不是走老路。

学习方法:

每个人在不同的阶段应当有不同的学习方法,不能一概而论:多看,多练,多思考,多练习,多总结。

  • 多看:

    • 看什么?看别人如何写代码,如何分析和解决问题,用到了什么技术,如何面对工作的压力,如何为人处事,如何协调资源等。
    • 怎么看?周围都是你的同事,同事中肯定有高手。网上有你的朋友,朋友中肯定有佼佼者。你会用到许多开源框架,其中肯定包含许多经典的代码和思想。
  • 多练:
    • 多练,应该练什么?
    • 自己什么都想练什么都想学习,无论别人写出多么优秀的程序,干出多么大的事情并非一朝一夕之事(立足当下)]
    • 立足当下:找到自己的兴趣,而非别人的兴趣;找到自己的业务挖掘点,而非别人的业务(不是说不去关注别人所做的业务,而是一种经验的交流,不要老觉得别人碗里的饭要香一些)
    • 兴趣:建立在你对解决的问题的价值是否理解上,兴趣可以给你带来不错的收入,兴趣是你可以处理一些周围人处理不了的问题,星期是你擅长的点是否能够得到发挥等,其实兴趣是自己挖掘的。
    • 初学者一定要多练习,即使是练习代码,也是很好的,达到一定程度再思考都可以。即使是水平很高的人也会多练习,只是练习的代码不一样罢了。练习可以让我们对问题有更多的感性认识,许多问题在练习后自然会逐步清晰起来。在练习的基础上,才会进一步有理性认识
  • 多思考,多练习:
    • 经多多练习,很多人走偏,进入技术控的死角,因为对技术的控制会成为一种乐趣。这个阶段我们要多思考。
    • 这种技术有什么缺点?我们用它能解决什么核心问题?相关的技术有什么?它们有什么区别?
    • 串联:当我们深入地去学习一样东西地时候,会自然地需要学习另外一样东西,这就是知识之间的串联,碎片化的学习并非完全碎片化,随着深入的学习,知识自然会串联在一起。
    • 深入:在练习,思考的基础上要如何深入?各类网络博客,官方文档,源代码,书籍都是一个积累的关键因素,当资料很多的时候需要挑选关键点。
    • 关键点:我们关注的点就是关注点。其实关键点就是你最想知道的一个点,这种关键点对不同层次的人会有不同的划分概念,它可以新到一条代码怎么写,一个二进制位在程序内部如何处理,也可以粗到总体架构是怎么回事,这完全和你的工作相关,同事也与你对工作的理解程度相关。这是一个积累的过程,知识和业务体系越通,想要找到的关键点就越容易,所以学习,思考,时间是不断迭代的。
    • 思维:思维上我们要去放纵扩展,体系化扩展(但不要钻牛角尖),在扩展的过程中会迫使自己去学习相关的许多知识,而且这些知识会刻苦铭心,随着知识不断地串连化,也会逐步形成体系。如果有一天你发自你内心地认为“一切源于思想和生活方法”,这时你再看高手们地书,或许就是一种知识梳理地过程和经验的交流。
  • 多总结
    • 一个人不论学习多么努力,多么会思考,但如果他的知识没有沉淀,终究会丢掉一些东西。
    • 何时沉淀?沉淀什么?这是我们不断摸索的东西,没有定论,如果你认为 它对你未来的发展是有帮助的,或者说你认为它可以帮助你提高水平或扩展知识面,那么你就将它沉淀下来。 每天我们有了一个小沉淀,每周就会有点小总结,每月就有一些感悟,每季度就会发现几个月前的自己是那么的“幼稚”,那么自己就真的成长了。经过 1 年、2 年的坚持,你 可能会比别人知道得更多,也深入了很多。
    • 也许有人说无论你怎么沉淀都没有用,始终在原地踏步,几年后还是一个样。那么你 就要想想:在总结的过程中是否考虑过方法有没有问题?或许自己始终在沉淀那些很简单、 很容易的东西,仅仅是为了“记录”而缺乏自己的见解;或许在总结的过程中没有去考虑 如何做得比以前更好。当然如何总结是个人的自由,每一种总结都有它的价值所在,即使是“面”上的扩展总结,只要是没有曲解基本的道理,仍可以“引导他人”
      成长。
    • 什么时候需要去沉淀知识呢?当你解决了问题时,当你学习到问题的本质时,当你看 到了以前看不到的东西时,当你觉得值得去总结时,长期坚持总结是厚积薄发的基础,这 是亘古不变的道理。从量变到质变取决于在总结的过程中你能否从某个点去突破和深入, 也许就差那么一点点儿,当发生质变后在对待问题的态度和方法上会有一个更加广阔的空间,这就是我们通常所说的“茅塞顿开”。
    • 沉淀什么?我们不仅要总结知识点,也要总结方法、手段、心态,以及身边可以深度 挖掘的业务。
时间: 2024-10-01 02:01:36

java 特种兵笔记:论道的相关文章

Java系列笔记(1) - Java 类加载与初始化

目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个Class对象,存储在.class文件中,JVM使用类加载器(Class Loader)来加载类的字节码文件(.class),类加载器实质上是一条类加载器链,一般的,我们只会用到一个原生的类加载器,它只加载Java API等可信类,通常只是在本地磁盘中加载,这些类一般就够我们使用了.如果我们需要从远

Java学习笔记3-操作符

Java基本操作符:+.-.*./.%.=.==.!=.+=.-=. 优先级:先乘除后加减,如果是连接符+号会优先往前匹配,比如 a+++++b,会被解释称 a++ ++ +b,所以会报错,需要自行使用括号隔离为 (a++) + (++b). 对象的引用如果赋值给了对象的引用后,2 个对象将指向同一个引用,有一个对象的引用重新赋值后将同时影响到另一个对象,比如 ClassName classA = new ClassName(); ClassName classB = new ClassName

[Java基础笔记]数组

Java基础笔记 定义数组: int[] numbers = new int[100]; //方法一 double[] num = new double[10]; int[][] a = new int[2][5]; 通过new创建的数组,元素默认值为0(0.0) int[] scores = {5,4,33,12,46}; //方法二 int[][] a = { //位数不足,自动补0 {5,3,2,1,6}, {10,12,14,15}, }; 数组特性:存储的都是同类型数据:长度定义后不可

Java系列笔记(2) - Java RTTI和反射机制

目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). 在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本文主要讲反射方式实现的RTTI,建议在阅读本文之前,先了解类的加载机制(

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

think in java 读书笔记

java中没有单独函数的概念,依赖类的方法. java中优化了向前引用,类可以在调用者之后. java中包的命名方法实际上是网址的倒转. c++中因为存在全局变量和函数所以会存在一个变量名冲突的问题,但是java中不存在全局变量,不同程序设计者通过不同的类将相同名字的变量和方法隔离. static关键字 通常,我们创建类时会指出那个类的对象的外观与行为.除非用new 创建那个类的一个对象,否则实际上并 未得到任何东西.只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法. 但在两种

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用2

1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用. findClass protected Class<?> findClass(String name) throws ClassNotFoundException 使用指定的二进制名称查找类.此方法应该被类加载器的实现重写,该实现按照委托模型来加载类.在通过父