JouyPub

JouyPub 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织 www.google.com 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

JouyPub 收藏了文章 · 2018-09-20

阿里最全面试116题:阿里天猫、蚂蚁金服、阿里巴巴面试题含答案

【阿里天猫、蚂蚁、钉钉面试题目】

  1. junit用法,before,beforeClass,after, afterClass的执行顺序
  2. 分布式锁
  3. nginx的请求转发算法,如何配置根据权重转发
  4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap)
  5. 线程的状态
  6. 线程的阻塞的方式
  7. sleep和wait的区别
  8. hashmap的底层实现
  9. 一万个人抢100个红包,如何实现(不用队列),如何保证2个人不能抢到同一个红包,可用分布式锁
  10. java内存模型,垃圾回收机制,不可达算法
  11. 两个Integer的引用对象传给一个swap方法在方法内部交换引用,返回后,两个引用的值是否会发现变化
  12. aop的底层实现,动态代理是如何动态,假如有100个对象,如何动态的为这100个对象代理
  13. 是否用过maven install。 maven test。git(make install是安装本地jar包)
  14. tomcat的各种配置,如何配置docBase
  15. spring的bean配置的几种方式
  16. web.xml的配置
  17. spring的监听器。
  18. zookeeper的实现机制,有缓存,如何存储注册服务的
  19. IO会阻塞吗?readLine是不是阻塞的
  20. 用过spring的线程池还是java的线程池?
  21. 字符串的格式化方法 (20,21这两个问题问的太低级了)
  22. 时间的格式化方法
  23. 定时器用什么做的
  24. 线程如何退出结束
  25. java有哪些锁?乐观锁 悲观锁 synchronized 可重入锁 读写锁,用过reentrantlock吗?reentrantlock与synmchronized的区别
  26. ThreadLocal的使用场景
  27. java的内存模型,垃圾回收机制
  28. 为什么线程执行要调用start而不是直接run(直接run,跟普通方法没什么区别,先调start,run才会作为一个线程方法运行)
  29. qmq消息的实现机制(qmq是去哪儿网自己封装的消息队列)
  30. 遍历hashmap的三种方式
  31. jvm的一些命令
  32. memcache和redis的区别
  33. mysql的行级锁加在哪个位置
  34. ConcurrentHashmap的锁是如何加的?是不是分段越多越好
  35. myisam和innodb的区别(innodb是行级锁,myisam是表级锁)
  36. mysql其他的性能优化方式
  37. linux系统日志在哪里看
  38. 如何查看网络进程
  39. 统计一个整数的二进制表示中bit为1的个数
  40. jvm内存模型,java内存模型

【阿里巴巴面试题目】
欢迎大家加入Java进阶高级架构:702895903

  1. 如何把java内存的数据全部dump出来
  2. 如何手动触发全量回收垃圾,如何立即触发垃圾回收
  3. hashmap如果只有一个写其他全读会出什么问题
  4. git rebase
  5. mongodb和hbase的区别
  6. 如何解决并发问题
  7. volatile的用途
  8. java线程池(好像之前我的理解有问题)
  9. mysql的binlog
  10. 代理模式
  11. mysql是如何实现事务的
  12. 读写分离何时强制要读主库,读哪个从库是通过什么方式决定的,从库的同步mysql用的什么方式
  13. mysql的存储引擎
  14. mysql的默认隔离级别,其他隔离级别
  15. 将一个链表反转(用三个指针,但是每次只发转一个)
  16. spring Aop的实现原理,具体说说
  17. 何时会内存泄漏,内存泄漏会抛哪些异常
  18. 是否用过Autowire注解
  19. spring的注入bean的方式
  20. sql语句各种条件的执行顺序,如select, where, order by, group by
  21. select xx from xx where xx and xx order by xx limit xx; 如何优化这个(看explain)
  22. 四则元算写代码
  23. 统计100G的ip文件中出现ip次数最多的100个ip
  24. zookeeper的事物,结点,服务提供方挂了如何告知消费方
  25. 5台服务器如何选出leader(选举算法)
  26. 适配器和代理模式的区别
  27. 读写锁
  28. static加锁
  29. 事务隔离级别
  30. 门面模式,类图(外观模式)
  31. mybatis如何映射表结构
  32. 二叉树遍历
  33. 主从复制
  34. mysql引擎区别
  35. 静态内部类加载到了哪个区?方法区
  36. class文件编译后加载到了哪
  37. web的http请求如何整体响应时间变长导致处理的请求数变少,该如何处理?用队列,当处理不了那么多http请求时将请求放到队列

中慢慢处理,web如何实现队列

  1. 线程安全的单例模式
  2. 快速排序性能考虑
  3. volatile关键字用法
  4. 求表的size,或做数据统计可用什么存储引擎
  5. 读多写少可用什么引擎
  6. 假如要统计多个表应该用什么引擎
  7. concurrenhashmap求size是如何加锁的,如果刚求完一段后这段发生了变化该如何处理
  8. 1000个苹果放10个篮子,怎么放,能让我拿到所有可能的个数
  9. 可重入的读写锁,可重入是如何实现的?
  10. 是否用过NIO
  11. java的concurrent包用过没
  12. sting s=new string("abc")分别在堆栈上新建了哪些对象
  13. java虚拟机的区域分配,各区分别存什么
  14. 分布式事务(JTA)
  15. threadlocal使用时注意的问题(ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享)
  16. java有哪些容器(集合,tomcat也是一种容器)
  17. 二分查找算法
  18. myisam的优点,和innodb的区别
  19. redis能存哪些类型
  20. http协议格式,get和post的区别
  21. 可重入锁中对应的wait和notify
  22. redis能把内存空间交换进磁盘中吗(这个应该是可以的,但是那个面试官非跟我说不可以)
  23. java线程池中基于缓存和基于定长的两种线程池,当请求太多时分别是如何处理的?定长的事用的队列,如果队列也满了呢?交换进磁盘?基于缓存的线程池解决方法呢?
  24. synchronized加在方法上用的什么锁
  25. 可重入锁中的lock和trylock的区别
  26. innodb对一行数据的读会枷锁吗?不枷锁,读实际读的是副本
  27. redis做缓存是分布式存的?不同的服务器上存的数据是否重复?guava cache呢?是否重复?不同的机器存的数据不同
  28. 用awk统计一个ip文件中top10
  29. 对表做统计时可直接看schema info信息,即查看表的系统信息
  30. mysql目前用的版本
  31. 公司经验丰富的人给了什么帮助?(一般boss面会问这些)
  32. 自己相对于一样的应届生有什么优势
  33. 自己的好的总结习惯给自己今后的工作带了什么帮助,举例为证
  34. 原子类,线程安全的对象,异常的处理方式
  35. 4亿个int数,如何找出重复的数(用hash方法,建一个2的32次方个bit的hash数组,每取一个int数,可hash下2的32次方找到它在hash数组中的位置,然后将bit置1表示已存在)
  36. 4亿个url,找出其中重复的(考虑内存不够,通过hash算法,将url分配到1000个文件中,不同的文件间肯定就不会重复了,再分别找出重复的)

有1万个数组,每个数组有1000个整数,每个数组都是降序的,从中找出最大的N个数,N<1000

  1. LinkedHashmap的底层实现
  2. 类序列化时类的版本号的用途,如果没有指定一个版本号,系统是怎么处理的?如果加了字段会怎么样?
  3. Override和Overload的区别,分别用在什么场景
  4. java的反射是如何实现的

【阿里巴巴面试题目含答案】

1,mysql的三大引擎是啥?

mysql常用的引擎有InnoDB,MyISAM,Memory,默认是InnoDB

InnoDB:磁盘表,支持事务,支持行级锁,B+Tree索引

ps:优点: 具有良好的ACID特性。适用于高并发,更新操作比较多的表。需要使用事务的表。对自动灾难恢复有要求的表。

缺点:读写效率相对MYISAM比较差。占用的磁盘空间比较大。

mysql的4大特性+4种隔离级别:

MyISAM:磁盘表,不支持事务,支持表级锁,B+Tree索引

ps: 优点:占用空间小,处理速度快(相对InnoDB来说)

缺点:不支持事务的完整性和并发性

MEMORY(Heap):内存表,不支持事务,表级锁,Hash索引,不支持Blob,Text大类型

ps: 优点:速度要求快的,临时数据

缺点:丢失以后,对项目整体没有或者负面影响不大的时候。

2,redis的hash算法用的是啥?

redis应该是使用一致性hash算法---MurmurHash3 算法,具有低碰撞率优点,google改进的版本cityhash也是redis中用到的哈希算法。

现有的主流的大数据系统都是用的 MurmurHash本身或者改进

3,nosql为啥比sql快?

Nosql是非关系型数据库,因为不需要满足关系数据库数据一致性等复杂特性所以速度快;

sql是关系型数据库,功能强大,但是效率上有瓶颈

4,什么是索引为啥nosql没索引?nosql有索引滴

索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

聚簇索引:有主键时,根据主键创建聚簇索引;没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引;如果以上两个都不满足那innodb自己创建一个虚拟的聚集索引

非聚簇索引:非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引

5,B+树和B树区别?

B树的非叶子节点存储实际记录的指针,而B+树的叶子节点存储实际记录的指针

B+树的叶子节点通过指针连起来了, 适合扫描区间和顺序查找。

BATJ面试题目

1,应该怎么封装简历才有BATJ面试机会?

2,HashMap底层执行原理,

3,hashtable和ConcurrentHashMap如何实现线程安全?

4,jvm的内存布局,垃圾回收机制

5,类加载机制里的,双亲委派模型

6,阐述事务的隔离级别和传播属性

7,高并发下,如何做到安全的修改同一行数据?

8,A服务调用B服务多接口,响应时间最短方案;

9,A系统给B系统转100块钱,如何实现?

10,动态代理的几种实现方式及优缺点

11,多线程下读概率远远大于写概率,如何解决并发问题?

12,按线程池内部机制,当提交新任务时,有哪些异常要考虑?

13,@Transaction注解一般写在什么位置?如何控制其回滚?

14,说说Spring的IOC容器初始化流程?

15,说说springboot启动机制

16,Redis高性能的原因大概可以讲一些?

17,你是怎么控制缓存的更新?(被动方式/主动方式/增量/全量)?

18,浅析Http和https的三次握手有什么区别。

19,谈谈Session/cookie机制,如何实现会话跟踪?

20,什么是一致性hash?

21,MQ有可能发生重复消费,如何避免,如何做到幂等?

22,如何做限流策略,令牌桶和漏斗算法的使用场景?

查看原文

JouyPub 收藏了文章 · 2018-08-29

如何成为一位「不那么差」的程序员

前言

已经记不清有多少读者问过:

博主,你是怎么学习的?像我这样的情况有啥好的建议嘛?

也不知道啥时候我居然成人生导师了。当然我不排斥这些问题,和大家交流都是学习的过程。

因此也许诺会准备一篇关于学习方面的文章;所以本文其实准备了很久,篇幅较长,大家耐心看完希望能有收获。

以下内容仅代表我从业以来所积累的相关经验,我会从硬技能、软实力这些方面尽量阐述我所认为的 “不那么差的程序员” 应当做到哪些技能。

技能树

作为一名码代码的技术工人,怎么说干的还是技术活。

既然是技术活那专业实力就得过硬,下面我会按照相关类别谈谈我们应该掌握哪些。

计算机基础

一名和电脑打交道的工种,计算机是我们赖以生存的工具。所以一些基础技能是我们应该和必须掌握的。

比如网络相关的知识。

其中就包含了 TCP 协议,它和 UDP 的差异。需要理解 TCP 三次握手的含义,拆、粘包等问题。

当然上层最常见的 HTTP 也需要了解,甚至是熟悉。

这块推荐《图解 HTTP》一书。

接着是操作系统相关知识。

由于工作后你写的大部分代码都是运行在 Linux 服务器上,所以对于这个看它脸色行事主你也得熟悉才行。

比如进程、线程、内存等概念;服务器常见的命令使用,这个没啥窍门就是得平时多敲敲多总结。

我也是之前兼职了半年运维才算是对这一块比较熟悉。

Linux 这个自然是推荐业界非常出名的《鸟哥的 Linux 私房菜》

当作为一个初学者学习这些东西时肯定会觉得枯燥乏味,大学一般在讲专业课之前都会有这些基础学科。我相信大部分同学应该都没怎么仔细听讲,因为确实这些东西就算是学会了记熟了也没有太多直接的激励。

但当你工作几年之后会发现,只要你还在做计算机相关的工作,这些都是绕不开的,当哪天这些知识不经意的帮助到你时你会庆幸当初正确的选择。

数据结构与算法

接下来会谈到另一门枯燥的课程:数据结构。

这块当初在大学时也是最不受待见的一门课程,也是我唯一挂过的科目。

记得当时每次上课老师就让大家用 C 语言练习书上的习题,看着一个个拆开都认识的字母组合在一起就六亲不认我果断选择了放弃。

这也造成现在的我每隔一段时间就要看二叉树、红黑树、栈、队列等知识,加深印象。

算法这个东西我确实没有啥发言权,之前坚持刷了部分 LeetCode 的题目也大多停留在初中级。

但像基本的查找、排序算法我觉得还是要会的,不一定要手写出来但要理解其思路。

所以强烈建议还在大学同学们积极参与一些 ACM 比赛,绝对是今后的加分利器。

这一块内容可能会在应届生校招时发挥较大作用,在工作中如果你的本职工作是 Java Web 开发的话,这一块涉猎的几率还是比较低。

不过一旦你接触到了模型设计、中间件、高效存储、查询等内容这些也是绕不过的坎。

这块内容和上面的计算机基础差不多,对于我们 Java 开发来说我觉得平时除了多刷刷 LeetCode 加深印象之外,在日常开发中每选择一个容器存放数据时想想为什么选它?有没有更好的存储方式?写入、查询效率如何?

同样的坚持下去,今后肯定收货颇丰。

同时推荐《算法(第4版)》

Java 基础

这里大部分的读者都是 Java 相关,所以这个强相关的技能非常重要。

Java 基础则是走向 Java 高级的必经之路。

这里抛开基本语法不谈,重点讨论实际工作中高频次的东西。

  • 基本容器,如:HashMap、ArrayList、HashSet、LinkedList 等,不但要会用还得了解其中的原理。这样才能在不同的场景选择最优的设计。
  • IO、NIO 也是需要掌握。日常开发中大部分是在和磁盘、网络(写日志、数据库、Redis)打交道,这些都是 IO 的过程。
  • 常见的设计模式如:代理、工厂、回调、构建者模式,这对开发灵活、扩展性强的应用有很大帮助。
  • Java 多线程是非常重要的特性,日常开发很多。能理解线程模型、多线程优缺点、以及如何避免。
  • 良好的单测习惯,很多人觉得写单测浪费时间没有意义。但正是有了单测可以提前暴露出许多问题,减少测试返工几率,提高代码质量。
  • 良好的编程规范,这个可以参考《阿里巴巴 Java 开发手册》以及在它基础上优化的《唯品会 Java 手册》
 《Java核心技术·卷 I》值得推荐。

多线程应用

有了扎实的基础之后来谈谈多线程、并发相关的内容。

想让自己的 title 里加上“高级”两字肯定得经过并发的洗礼。

这里谈论的并发主要是指单应用里的场景,多应用的可以看后文的分布式内容。

多线程的出现主要是为了提高 CPU 的利用率、任务的执行效率。但并不是用了多线程就一定能达到这样的效果,因为它同时也带来了一些问题:

  • 上下文切换
  • 共享资源
  • 可见性、原子性、有序性等。

一旦使用了多线程那肯定会比单线程的程序要变得复杂和不可控,甚至使用不当还会比单线程慢。所以要考虑清楚是否真的需要多线程。

会用了之后也要考虑为啥多线程会出现那样的问题,这时就需要理解内存模型、可见性之类的知识点。

同样的解决方式又有哪些?各自的优缺点也需要掌握。

谈到多线程就不得不提并发包下面的内容 java.util.concurrent

最常用及需要掌握的有:

这一块的内容可以然我们知道写 JDK 大牛处理并发的思路,对我们自己编写高质量的多线程程序也有很多帮助。

推荐《Java 并发编程的艺术》很好的并发入门书籍。

JVM 虚拟机

想要深入 Java ,JVM 是不可或缺的。对于大部分工作 1~3 年的开发者来说直接接触这一些内容是比较少的。

到了 3~5 年这个阶段就必须得了解了,以下内容我觉得是必须要掌握的:

掌握这些内容真的对实际分析问题起到巨大帮助。

 对此强力推荐《深入理解Java虚拟机》,这本书反反复复看过好几遍,每个阶段阅读都有不同的收获。

数据库

做 WEB 应用开发的同学肯定要和数据库打不少交道,而且通常来说一个系统最先出现瓶颈往往都是数据库,说数据库是压到系统的最后一根稻草一点也不为过。

所以对数据库的掌握也是非常有必要。拿互联网用的较多的 MySQL 数据库为例,一些必须掌握的知识点:

  • 索引的数据结构及原理、哪些字段应当创建索引。
  • 针对于一个慢 SQL 的优化思路。
  • 数据库水平垂直拆分的方案,需要了解业界常用的 MyCAT、sharding-sphere 等中间件。

常规使用可以参考《阿里巴巴 Java 开发手册》中的数据库章节,想要深入了解 MySQL 那肯定得推荐经典的《高性能 MySQL》一书了。

分布式技术

随着互联网的发展,传统的单体应用越来越不适合现有场景。

因此分布式技术出现了,这块涵盖的内容太多了,经验有限只能列举我日常使用到的一些内容:

  • 首先是一些基础理论如:CAP 定理,知道分布式系统会带来的一些问题以及各个应用权衡的方式。
  • 了解近些年大热的微服务相关定义、来源以及对比,有条件的可以阅读 martin fowler 的原文 Microservices,或者也可以搜索相关的国内翻译。
  • 对 Dubbo、SpringCloud 等分布式框架的使用,最好是要了解原理。
  • 接着要对分布式带来的问题提出解决方案。如分布式锁分布式限流、分布式事务、分布式缓存、分布式 ID、消息中间件等。
  • 也要了解一些分布式中的负载算法:权重、Hash、一致性 Hash、故障转移、LRU 等。
  • 最好能做一个实践如:[秒杀架构实践

](https://crossoverjie.top/%2F2...

之前有开源一个分布式相关解决组件:

https://github.com/crossoverJie/distributed-redis-tool

同时推荐一本入门科普《大型网站技术架构》,出版时间有点早,从中可以学习一些思路。

懂点架构

相信大家都有一个架构师的梦想。

架构师给人的感觉就是画画图纸,搭好架子,下面的人员来添砖加瓦最终产出。

但其实需要的内功也要非常深厚,就上面列举的样样需要掌握,底层到操作系统、算法;上层到应用、框架都需要非常精通。(PPT 架构师除外)

我自身参与架构经验也不多,所以只能提供有限的建议。

首先分布式肯定得掌握,毕竟现在大部分的架构都是基于分布式的。

这其中就得根据 CAP 理论结合项目情况来选择一致性还是可用性,同时如何做好适合现有团队的技术选型。

这里推荐下开涛老师的《亿级流量网站架构核心技术》,列举了很多架构实例,不过网上褒贬不一,但对于刚入门架构的能科普不少知识。

如何学习

谈完了技能树,现在来聊聊如何学习,这也是被问的最多的一个话题。

而关于学习讨论的最多的也是看视频还是看书?

视频

不得不承认视频是获取知识最便捷的来源,毕竟包含了图、文、声。

大学几年时间其实我也没好好上专业课,我记得真正入门 Java 还是一个暑假花了两个月的时间天天在家里看 ”马士兵“ 老师的视频教程,当时的资源也很老了,记得好像是 07 年出的视频(用的还是 Google )。

那段时间早起晚睡,每天学到东西之后马上实践,心里也很有成就感。后来开学之后一度成为同学们眼中的”学霸“人物。

 现在打开我 12 年的电脑,硬盘里还躺着好几十 G 的教学视频。

看书

工作后时间真的很宝贵,完全没有了学生生涯的想学就学的自由。所以现在我主要知识来源还是书籍。

这些是我最近看的书:

IMG_2387.JPG

看书又会涉及到电子书和纸质书的区别,我个人比较喜欢纸质书。毕竟我可以方便的记笔记以及可以随时切换章节。最主要的还是从小养成的闻书香的习惯。

知识付费

近几年知识付费越来越流行,许多大佬也加入了这个行列,人们也逐渐在习惯为知识去付费。

说实话写一好篇文章出一份视频都非常不容易,能有正向的激励,作者才能持续输出更好的内容。

这块我觉得国内做的比较好我也为之付费的有极客时间、大佬的知识星球等。

这三点没有绝对的好坏之分,其实可以看出我刚入门的时候看视频,工作之后看书及知识付费内容。

视频的好处是可以跟着里面老师的思路一步一步往下走,比较有音视频代入感强,就像学校老师讲课一样。

但由于内容较长使读者没法知晓其中的重点,甚至都不敢快进生怕错过了哪个重要知识,现在由于 IT 越来越火,网上的视频也很多导致质量参差不齐也不成体系。

而看书可以选择性的浏览自己感兴趣的章节,费解的内容也方便反复阅读

所以建议刚入门的同学可以看看视频跟着学,参与工作一段时间后可以尝试多看看书。

当然这不是绝对的,找到适合自己的学习方式就好。但不管是视频还是看书都要多做多实践。

打造个人品牌

个人品牌看似很程序员这个职业不怎么沾边,但在现今的互联网时代对于每个人来说都很重要。

以往我们在写简历或是评估他人简历的时候往往不会想到去网络搜索他的个人信息,但在这个信息爆炸的时代你在网上留下的一点印记都能被发现。

博客

因此我们需要维护好自己的名片,比如先搭建自己的个人博客。

博客的好处我也谈过几次了,前期关注人少没关系,重要的是坚持,当你写到 50、100篇文章后你会发现自己在这过程中一定是的到了提高。

GitHub

第二点就和技术人比较相关了:参与维护好自己的 GitHub。

由于 GitHub 的特殊属性,维护好后可以更好的打造个人品牌。

Talk is cheap. Show me the code 可不是随便说说的。

想要维护好可以从几个方面着手:

  • 参与他人的项目,不管是代码库还是知识库都可以,先融入进社区。
  • 发起自己的开源项目,不管是平时开发过程中的小痛点,还是精心整理的知识点都可以。

但这过程中有几点还是要注意:

  • 我们需要遵守 GitHub 的社交礼仪。能用英文尽量就用英文,特别是在国外厂库中。
  • 尽量少 push 一些与代码工作无关的内容,我认为这并不能提高自己的品牌。
  • 别去刷 star。这也是近期才流行起来,不知道为什么总有一些人会钻这种空子,刷起来的热度对自己并没有任何提高。

这里有一篇国外大佬写的 How to build your personal brand as a new developer :

https://medium.freecodecamp.org/building-your-personal-brand-as-a-new-web-developer-f6d4150fd217

English 挺重要

再来谈谈英语的重要性,我记得刚上大学时老师以及一些培训机构都会说:

别怕自己英语差就学不了编程,真正常用的就那些词语。

这句话虽没错,但英语在对 IT 这行来说还是有着极大的加分能力。

拿常见的 JDK 里的源码注释也是纯英文的,如果英语还不错的话,一些 Spring 的东西完全可以自学,直接去 Spring 官网就可以查看,甚至后面出的 SpringCloud,官方资料就是最好的教程。

再有就是平时查资料时,有条件的可以尝试用 Google + 英文 搜索,你会发现新的世界。

不然也不会有面向 Google/Stack Overflow 编程。

对于英语好的同学自然不怕,那不怎么好的咋办呢?

比如我,但我在坚持以下几点:

  • 所有的手机、电脑系统统统换成英语语言,养成习惯(不过也有尴尬的连菜单都找不到的情况)。
  • 订阅一些英语周刊,比如 ”湾区日报“。
  • 定期去类似于 https://medium.com/ 这样具有影响力的国外社区阅读文章。

虽然现在我也谈不上多好,但目前我也在努力,希望大家也一起坚持。

推荐一本近期在看的书《程序员的英语》。

保持竞争力

技术这个行业发展迅速、变化太快,每年也都有无数相关行业毕业生加入竞争,稍不留神就会被赶上甚至超越。

所以我们无时无刻都得保持竞争力。

多的谈不上,我只能谈下目前我在做的事情:

  • 打好基础。不是学了之后就忘了,需要不停的去看,巩固,基础是万变不离其宗的。
  • 多看源码,了解原理,不要停留在调参侠的境界。
  • 关注行业发展、新技术、新动态至少不能落伍了。
  • 争取每周产出一篇技术相关文章。
  • 积极参与开源项目。

思维导图

结合上文产出了一个思维导图更直观些。

总结

本文结合了自身的一些经验列举了一些方法,不一定对每位都有效需要自行判断。

也反反复复写了差不多一周的时间,希望对在这条路上和正在路上的朋友们起到一些作用。

大部分都只是谈了个思路,其实每一项单聊都能写很多。每个点都有推荐一本书籍,有更好建议欢迎留言讨论。

上文大部分的知识点都有维护在 GitHub 上,感兴趣的朋友可以自行查阅:

https://github.com/crossoverJie/Java-Interview

文中有贴了一些站外链接,阅读原文可以方便查看

你的点赞与转发是最大的支持。

查看原文

JouyPub 收藏了文章 · 2018-08-24

微服务简介

微服务简介

微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。

微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。

应用架构发展

单体架构

单体应用 就是将所有的业务场景的表示层、业务逻辑层和数据访问层放在一个工程中。最终经过编译、打包,部署在一台服务器上。典型例子是j2ee的war包或ear包。

single.png

在应用的初始阶段,单体架构无论是在开发速度、运维难度上,还是服务器的成本上都有着显著的优势。在一个产品的前景不明确的初始阶段,用单体架构是非常明智的选择。随着应用业务的发展和业务复杂度的提高,这种架构明显存在很多的不足,主要体现在以下3个方面。

  • 缺点:
  1. 随着业务扩张,开发难度加大,动一发而迁全身,代码的可读性、可维护性和可扩展性下降,业务扩展带来的代价越来越大,开发都在同一个项目改代码,相互等待,冲突不断。
  2. 部署启动时间较长,期间服务会中断,模块间相互影响较多,测试难难度加大,一个微小的问题,都可能导致整个应用挂掉。
  3. 性能容量有限,无法满足高并发下的业务需求,受单机限制(纵向扩展),有性能瓶颈。

集群架构

随着业务的发展,大多数公司会将单体应用进行集群部署,并增加负载均衡服务器(例如Nginx、F5等),以应对用户量的增加而带来的高并发访问量。此时的系统架构如图1-3所示。

cluster.png

  • 优化策略:
  1. 负载均衡,通过分发服务器,将用户的访问分派到不同的应用服务器,应用服务器的负载不再成为瓶颈,用户量增加时,添加应用服务器即可。
  2. 添加缓存,使用缓存服务器来缓解数据库的数据以及数据库读取数据的压力。大多数的读取操作是由缓存完成的,但是仍然有少数读操作是从数据库读取。
  3. 读写分离,当有大量的读写操作时,将数据库进行读写分离是一个不错的选择,例如MySQL的主从热备份,通过相关配置可以将主数据库服务器的数据同步到从数据库服务器,实现数据库的读写分离,读写分离能够改善数据库的负载能力。
  4. 分区分库分表,将数据量较大的表水平或垂直切分,分散到不同的库或主机上,分散数据库的压力,提高性能。
  5. 应用拆分,将较重要或访问量较大的功能模块拆分出来作为新应用单独开发、运维。新应用与老应用间的相关依赖通过接口调用或其它方式交互。

集群有一定的处理高并发的能力,也能应对一定复杂的业务需求,改善了系统的性能,但是依然没有改变系统为单体架构的事实,此时存在的不足之处如下。

  • 缺点:
  1. 并发容量虽有提高,但有限。虽做一定的应用拆分后,一定程度上可以缓解单体应用的问题。但随着服务拆分越来越多,开发、部署、运维、管理难度也越来越大。
  2. 持续交付能力差,业务越复杂,代码越多,修改代码和添加代码所需的时间越长。新人熟悉代码的时间长、成本高。
  3. 子应用间依赖耦合较紧,重复功能建设,重复代码等,服务间通信没有标准等。

微服务架构

“微服务”最初是由Martin Fowler 在2014年写的一篇文章《MicroServices》中提出来的。关于Martin Fowler的介绍

Martin Fowler是国际著名的OO专家,敏捷开发方法的创始人之一,现为ThoughtWorks公司的首
席科学家。在面向对象分析设计、UML、模式、软件开发方法学、XP、重构等方面,都是世界顶级的
专家,现为Thought Works公司的首席科学家。Thought Works是一家从事企业应用开发和——集
成的公司。早在20世纪80年代,Fowler就是使用对象技术构建多层企业应用的倡导者,他著有几
本经典书籍: 《企业应用架构模式》、《UML精粹》和《重构》等。

相对于大规模的集群,微服务带来了质的飞越,不仅仅是服务拆分,微服务是一整套的服务治理的架构,具备整套的设施。

微服务

微服务架构领域

  • 特性:
  1. 每个服务为独立的业务开发,单独部署,跑在自己的进程中。
  2. 自动化测试、部署、运维( DevOps )。
  3. 快速演化、快速迭代。
  4. 整个业务由一系列的独立的服务共同组成系统。
  5. 高度容错性、高可用、高并发。
  • 具备能力:
  1. 注册中心:应用启动自动注册,调用方自动发现上线应用。服务异常自动隔离。
  2. 配置中心:多环境配置管理,支持在线管理配置信息,客户端实时生效。支持版本管理,快速回滚。
  3. 消息中心:服务间异步通信的总线。
  4. 负载均衡:服务调用服务会采用一定的分发策略,一般是客户端分发策略。
  5. 服务间通信:使用http或RPC协议进行服务调用,REST、gRPC、Thrift、hession等
  6. 服务降级、熔断、重试:降级,服务或依赖服务异常时,返回保底数据。熔断,若依赖服务多次失效,则断开,不再尝试调用,直接返回降级值。重试,熔断后,定期探测依赖服务可用性,若恢复则恢复调用。
  7. 服务发布与回滚:红绿部署、灰度、AB Test等发布策略,可快速回滚应用。
  8. 服务动态伸缩、容器化:根据服务负载情况,可快速手动或自动进行节点增加和减少。
  9. 服务监控与告警:服务定期健康检察、指标统计、异常告警通知运维。
  10. 请求缓存与合并:服务间调用相同请求缓存,类似请求合并成批量请求,减少服务间通信,提高性能。
  11. 服务网关:用户请求过载时进行限流、排队,过载保护,黑白名单、异常用户过滤拦截等。
  12. 服务依赖、文档、Mock Server、版本管理:自动生成接口文档,接口版本化管理,Mock接口等。
  13. 日志收集、追踪、分析:集中收集各服务日志汇总,方便排障、问题调查、应用日志分析等。
  14. 性能监测APM:对各服务性能进行监测与分析,为服务优化提供数据支持。

以上我整理的微服务相关应具备的能力,内容相当的多,要搭建这样一套完善的微服务平台,花费的财力和时间都是巨大的。幸好开源界已经在各方面有众多的可选方案。

微服务架构挑战

  • 服务规模大,部署、运维、管理难度大。
  • 服务间调用关系复杂,调用链路长,排障难度大。
  • 服务间通信成本变大,性能和容错带来的挑战。
  • 服务间依赖较多,系统集成、测试难度变大。
  • 开发人员技术能力挑战,各服务间重复代码,重复建设等。
  • 集群规模大,功能性能监控、告警带来的挑战。
  • 大规模分布式,数据一致性带来的挑战。
  • 需求和版本协调复杂度大大增加,测试难度也增加。
  • 对基础架构要求大大提高,规模大幅增加。

微服务实施

SpringCloud

SpringCloud是在SpringBoot基础之上构建的快速开发分布式系统(微服务)的工具集。
为开发人员提供了一个开箱即用,快速构建微服务的一些通用组件(例如配置管理,服务发现,断路器,智能路由,消息总线等)。

官网

Dubbo

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。

官网

下一代微服务Service Mesh(网格服务)

Service Mesh 架构图:

serviceMesh

Service Mesh 开源项目简介:

第一代 Service Mesh,2016 年 1 月 15 日首发布,业界第一个 Service Mesh 项目,由 Buoyant 创业小公司开发(前 Twitter 工程师),2017 年 7 月 11 日,宣布和 Istio 集成,成为 Istio 的数据面板。

第一代 Service Mesh,2016 年 9 月 13 日首发布,由 Matt Klein 个人开发(Lyft 工程师),之后默默发展,版本较稳定。

第二代 Service Mesh,2017 年 5 月 24 日首发布,由 Google、IBM 和 Lyft 联合开发,只支持 Kubernetes 平台,2017 年 11 月 30 日发布 0.3 版本,开始支持非 Kubernetes 平台,之后稳定的开发和发布。

第二代 Service Mesh,2017 年 12 月 5 日首发布,由 Buoyant 公司开发(借鉴 Istio 整体架构,部分进行了优化),对抗 Istio 压力山大,也期待 Buoyant 公司的毅力。

2017 年 9 月首发布,由 Nginx 开发,定位是作为 Istio 的服务代理,也就是替代 Envoy,思路跟 Linkerd 之前和 Istio 集成很相似,极度低调,GitHub 上的 star 也只有不到 100。

查看原文

JouyPub 关注了标签 · 2018-08-09

关注 92188

JouyPub 关注了标签 · 2018-08-09

前端

Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征。在互联网的演化进程中,网页制作是Web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行为也以浏览为主。2005年以后,互联网进入Web 2.0时代,各种类似桌面软件的Web应用大量涌现,网站的前端由此发生了翻天覆地的变化。网页不再只是承载单一的文字和图片,各种富媒体让网页的内容更加生动,网页上软件化的交互形式为用户提供了更好的使用体验,这些都是基于前端技术实现的。

Web前端优化
  1. 尽量减少HTTP请求 (Make Fewer HTTP Requests)
  2. 减少 DNS 查找 (Reduce DNS Lookups)
  3. 避免重定向 (Avoid Redirects)
  4. 使得 Ajax 可缓存 (Make Ajax Cacheable)
  5. 延迟载入组件 (Post-load Components)
  6. 预载入组件 (Preload Components)
  7. 减少 DOM 元素数量 (Reduce the Number of DOM Elements)
  8. 切分组件到多个域 (Split Components Across Domains)
  9. 最小化 iframe 的数量 (Minimize the Number of iframes)
  10. 杜绝 http 404 错误 (No 404s)

关注 194656

JouyPub 关注了标签 · 2018-08-09

区块链

区块链(英语:Blockchain 或 Block chain)是一种分布式数据库,起源自比特币。区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。该概念在中本聪的白皮书中提出,中本聪创造第一个区块,即“创世区块”。

区块链在网络上是公开的,可以在每一个离线比特币钱包数据中查询。比特币钱包的功能依赖于与区块链的确认,一次有效检验称为一次确认。通常一次交易要获得数个确认才能进行。轻量级比特币钱包使用在线确认,即不会下载区块链数据到设备存储中。

比特币的众多竞争币也使用同样的设计,只是在工作量证明上和算法上略有不同。如,采用权益证明和 SCrypt 算法等等。

关注 51190

JouyPub 关注了标签 · 2018-08-09

关注 65926

JouyPub 关注了标签 · 2018-08-09

ios

iOS 是苹果公司为其移动产品开发的操作系统。它主要给 iPhone、iPod touch、iPad 以及 Apple TV 使用。原本这个系统名为 iPhone OS,直到2010年6月7日 WWDC 大会上宣布改名为 iOS。

系统结构

  iOS的系统结构分为以下四个层次:核心操作系统(the Core OS layer),核心服务层(the Core Services layer),媒体层(the Media layer),Cocoa 触摸框架层(the Cocoa Touch layer)。

发展历史

iOS最早于2007年1月9日的苹果Macworld展览会上公布,随后于同年的6月发布的第一版iOS操作系统,当初的名称为“iPhone 运行 OS X”。最初,由于没有人了解“iPhone 运行 OS X”的潜在价值和发展前景,导致没有一家软件公司、没有一个软件开发者给“iPhone 运行 OS X”开发软件或者提供软件支持。于是,苹果公司时任CEO斯蒂夫.乔布斯说服各大软件公司以及开发者可以先搭建低成本的网络应用程序(WEB APP)来使得它们能像iPhone的本地化程序一样来测试“iPhone runs OS X”平台。 

  1. 2007年10月17日,苹果公司发布了第一个本地化IPhone应用程序开发包(SDK),并且计划在2月发送到每个开发者以及开发商手中。

  2. 2008年3月6日,苹果发布了第一个测试版开发包,并且将“iPhone runs OS X”改名为”iPhone OS“。 

  3. 2010年2月27日,苹果公司发布iPad,iPad同样搭载了”iPhone OS”。这年,苹果公司重新设计了“iPhone OS”的系统结构和自带程序。 

  4. 2010年6月,苹果公司将“iPhone OS”改名为“iOS”,同时还获得了思科iOS的名称授权。 

  5. 2010年第四季度,苹果公司的iOS占据了全球智能手机操作系统26%的市场份额。

  6. 2011年10月4日,苹果公司宣布iOS平台的应用程序已经突破50万个。

  7. 2012年2月,应用总量达到552,247个,其中游戏应用最多,达到95,324个,比重为17.26%;书籍类以60,604个排在第二,比重为10.97%;娱乐应用排在第三,总量为56,998个,比重为10.32%。

  8. 2012年6月,苹果公司在WWDC 2012 上宣布了iOS 6,提供了超过 200 项新功能。

  9. 2013年9月11日凌晨苹果在秋季发布会上宣布iOS 7于9月18日正式推出,2013年9月19日凌晨1点开放免费下载更新。

  10. iOS 8于2014年9月17号向用户推送正式版。

  11. iOS 9于2015年9月16日正式推出。iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放。iOS 9加入了更多的新功能,包括更加智能的Siri,新加入的省电模式。iOS 9为开发者提供5000个全新的API。

  12. 2015年12月9日,苹果正式推送了iOS 9.2,更新内容相当之多,修复BUG改善稳定性自然不必多说,还增加了很多新功能,比如邮件增加了Mail Drop功能可以发送大附件、iBooks开始支持3D Touch、Apple News新闻中的“热门报道”等等

关注 50808

JouyPub 关注了标签 · 2018-08-09

程序员

一种近几十年来出现的新物种,是工业革命的产物。英文(Programmer Monkey)是一种非常特殊的、可以从事程序开发、维护的动物。一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发、维护工作,特别是在中国,而且最重要的一点,二者都是一种非常悲剧的存在。

国外的程序员节

国外的程序员节,(英语:Programmer Day,俄语:День программи́ста)是一个俄罗斯官方节日,日期是每年的第 256(0x100) 天,也就是平年的 9 月 13 日和闰年的 9 月 12 日,选择 256 是因为它是 2 的 8 次方,比 365 少的 2 的最大幂。

1024程序员节,中国程序员节

1024是2的十次方,二进制计数的基本计量单位之一。程序员(英文Programmer)是从事程序开发、维护的专业人员。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1GB=1024M,而1GB与1级谐音,也有一级棒的意思。

从2012年,SegmentFault 创办开始我们就从网络上引导社区的开发者,发展成中国程序员的节日 :) 计划以后每年10月24日定义为程序员节。以一个节日的形式,向通过Coding 改变世界,也以实际行动在浮躁的世界里,固执地坚持自己对于知识、技术和创新追求的程序员们表示致敬。并于之后的最为临近的周末为程序员们举行了一个盛大的狂欢派对。

2015的10月24日,我们SegmentFault 也在5个城市同时举办黑客马拉松这个特殊的形式,聚集开发者开一个编程大爬梯。

特别推荐:

【SF 黑客马拉松】:http://segmentfault.com/hacka...
【1024程序员闯关秀】小游戏,欢迎来挑战 http://segmentfault.com/game/

  • SF 开发者交流群:206236214
  • 黑客马拉松交流群:280915731
  • 开源硬件交流群:372308136
  • Android 开发者交流群:207895295
  • iOS 开发者交流群:372279630
  • 前端开发者群:174851511

欢迎开发者加入~

交流群信息


程序员相关问题集锦:

  1. 《程序员如何选择自己的第二语言》
  2. 《如何成为一名专业的程序员?》
  3. 《如何用各种编程语言书写hello world》
  4. 《程序员们最常说的谎话是什么?》
  5. 《怎么加入一个开源项目?》
  6. 《是要精于单挑,还是要善于合作?》
  7. 《来秀一下你屎一般的代码...》
  8. 《如何区分 IT 青年的“普通/文艺/二逼”属性?》
  9. 程序员必读书籍有哪些?
  10. 你经常访问的技术社区或者技术博客(IT类)有哪些?
  11. 如何一行代码弄崩你的程序?我先来一发
  12. 编程基础指的是什么?
  13. 后端零起步:学哪一种比较好?
  14. 大家都用什么键盘写代码的?

爱因斯坦

程序猿崛起

关注 155111

JouyPub 回答了问题 · 2018-08-07

一条sql使用了join联查,发现有一个表索引没用上

检查下这几个表的编码和collation是否一致

关注 3 回答 3

认证与成就

  • 获得 150 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-08-04
个人主页被 2.3k 人浏览