zoukankan      html  css  js  c++  java
  • 每月IT摘录201901

    技术

    1.Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。
    2.在 InnoDB 中,索引使用的数据结构是 B+ Tree,这里的 B 是 Balance 的意思。B 类树的一个很鲜明的特点就是树的层数比较少,而每层的节点都非常多,树的每个叶子节点到根节点的距离都是相同的(这也是为什么叫 Balance Tree 的原因),另外,树的每一个节点都是一个数据页,这样每个节点只需要一次 IO 就可以全部读取。这样的结构保证了查询数据时能尽量少地进行磁盘 IO,同时保证 IO 的稳定性。
    B+ Tree 和 B Tree 不同,B+ Tree 中,只能将数据存储在叶子结点中,内部节点将只包含指针,而 B Tree 可以将数据存储在内部的叶节点中。因此 B+ Tree 的关键优势是中间节点不包含数据,因此 B+ Tree 的大小远小于 B Tree,并且可以将更多数据存储到存储器中。另外,B+ Tree 的每一个叶子节点包含了到相邻的节点的链接,这样可以快速地进行范围遍历。
    3.mysql最左前缀:
    如果不是按照索引的最左列开始查找,则无法使用索引;
    不能跳过联合索引中的某些列;
    如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找;
    以上几点也基本上代表常听到的“最左前缀”
    4.*你要尽量避免多个线程共享一个对象。
    *如果一定要共享这个对象,就不要定义成员变量。
    *如果一定要定义成员变量,就要对它的读写操作加锁。这里细说一下。
    *如果一个对象的成员变量有一个线程对它进行写操作,既set赋值。多个线程对它进行读操作,既get取值。就用volatile轻量级锁关键字修饰。
    *如果是多写多读,就请在get set方法加synchronize关键字加锁,或者用并发包下的Lock包下的显示锁加锁。
    *加锁有个缺点,每次getset都让你的线程多一步获取锁的操作。如果你不想对这个成员变量的读写方法加锁又要保证线程安全就请用Atomic包下的原子变量定义这个成员变量,它是用CAS无锁算法实现的。ConcurruntHashMap就用了它。
    *如果你既想定义成员变量又不希望它共享给多个线程从而带来并发问题,你就用ThreadLocal定义这个成员变量,它是每个线程独立使用,各自不可见的。这种方法不是锁,本质还是要尽量避免多个线程共享一个对象。。

    学习

    0.成功无捷径,作为一个优秀的技术工程师,最重要的事情是一年365天,每天都不停的学习积累,坚持很多年。
    吃得苦中苦,方为人上人,笔者早年进行技术积累的时候,也是这样过来的。每天晚上学习到凌晨一两点,周六周日全天学习,坚持了很多年。
    只有通过几年的积累,你才能够厚积薄发,量变产生质变,菜鸟变成大牛。(作者:石杉的架构笔记)
    1.☞利用SMART原则去审视你的计划
    A.目标必须是具体的(Specific)  
    B. 目标必须是可以衡量的(Measurable)  
    C. 目标必须是可以达到的(Attainable)  
    D. 目标必须和其他目标具有相关性(Relevant)  
    E. 目标必须有时间节点(Time-based)
    ☞用PDCA去跟进它.
    PDCA管理循环:将质量管理分为四个阶段,即计划(plan)、执行(do)、检查(check)、处理(Act)
    2.开发者定位自己更有帮助,所以,就总结了出了下面的14个阶段:
    看书,看视频,看博客,听课等等
    对着书敲代码
    脱离书自己敲代码
    自己实现一些小DEMO
    进项目看代码
    在别人指点下写代码
    独立在别人搭建好的框架内填写代码
    独立负责别人设计好的模块的实现
    独立负责一个软件模块的设计和实现
    负责较大的软件模块,拆分模块,分子任务给他人
    从程序设计、单一模块设计,进入软件系统架构设计的学习(书、课、人、搜)
    负责一个项目的子系统或一个小项目的架构设计,拆分,分派任务
    负责一个涵盖前后端、业务较复杂的项目的架构设计,拆分架构,分配角色,分派任务
    做中大型软件系统的架构设计(架构师),或专注特定领域,解决疑难杂症

    工作

    1.去面试java,面试官不一定是搞java的,可能是c++,也可能不是做技术的。
    2.在招聘高级及以上工程师的时候,一定会严格考察一项能力,系统设计能力。
    因为如果你仅仅是对各种各样的技术都熟悉,有技术广度,也有一定的技术深度,实际上是不够的。如果你的系统设计能力不到位,可能导致你在开发系统的时候会乱用技术。
    最常见的,比如你自己会怎样实现一个线程池?设计一个消息队列?设计一个Rpc?
    你的XX技术应该用在YY场景下,结果你用到ZZ场景下,肯定是不行的。
    这就是系统设计能力的重要性。
    3.一个非常典型的项目经验的面试考察情景如下:面试官反复的追问项目的各个地方的技术实现细节,就想看看有没有哪个地方是有一定的技术难度的,可以体现出这个候选人的一些项目上的亮点。
    但是呢,候选人说来说去,总是从业务的角度去说,就说有哪些子系统组成,分别是干什么的,如何交互的,看来看去都是系统业务的东西,就是没看到什么有技术含量的东西在项目里体现出来了。
    如果出现上述的情况,那么这个候选人要拿大厂offer的概率就很低了。
    因为你的项目里没看出来什么东西,没什么亮眼的地方。你看起来就跟千千万万个普通的工程师没任何区别。
    4.面试谈到项目,都是选个项目,谈谈具体架构,然后,询问用到的技术栈,最后谈谈整个项目架构现在瓶颈在哪,未来可能的瓶颈在哪,怎么优化。

  • 相关阅读:
    JVM
    Java反射和动态代理
    JMS(Java消息服务)
    Java多线程及并发
    zookeeper集群自动启动脚本
    zookeeper命令行客户端
    Zookeeper集群搭建步骤及相关知识点深入了解
    MySQL server PID file could not be found!
    Linux下jdk、Tomcat、MySQL的安装
    修改Linux的基本配置
  • 原文地址:https://www.cnblogs.com/expiator/p/10277863.html
Copyright © 2011-2022 走看看