进入后端Java行业前明白个道理:程序员解决的问题,大多不是程序问题

Posted JAVA炭烧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进入后端Java行业前明白个道理:程序员解决的问题,大多不是程序问题相关的知识,希望对你有一定的参考价值。

前言

很多人都说,程序员很辛苦,与这个角色联系在一起的词儿,通常是忙碌、加班、熬夜等。作为程序员,我们将其看作一个值得全情投入的职业,希望能够把精力放在设计算法、改进设计、优化系统这些具有创造性与成就感的本职工作上。

但现实情况却是,许多人因为一些“意外”,陷入了无休止的忙碌,比如:

  • 你辛辛苦苦写的代码还没上线,产品经理就告诉你需求变了;
  • 你拼命加班只因错估了工作量,自己造的“孽”,含着泪也要搞定;
  • 你累死累活做出来的东西和要求不符,只能从头再来;
  • 你大面积地修改代码只是因为设计糟糕,无法适应新的需求变化;

……
诸如此类,不胜枚举。我们很辛苦,但耗费我们大量时间和精力去应付的工作,并不是技术工作,反而是这些看似很“不值当”的事儿。

为什么会这样?

在软件行业里有一本名著叫《人月神话》,其中提到两个非常重要的概念:本质复杂度(Essential Complexity)和偶然复杂度(Accident Complexity)。

简单来说,本质复杂度就是解决一个问题时,无论怎么做都必须要做的事,而偶然复杂度是因为选用的做事方法不当,而导致要多做的事。

比如你要做一个网站,网站的内容是你无论如何都要写的,这就是“本质复杂度”。而如果今天你还在用汇编写一个网站,效率是不可能高起来的,因为你选错了工具。这类选错方法或工具而引发的问题就是“偶然复杂度”。

这以至于我意识到一个事实:大部分程序员忙碌解决的问题,都不是程序问题,而是由偶然复杂度导致的问题。 换句话说,只要选择了正确的做事方法,减少偶然复杂度带来的工作量,就算是软件开发是可以有条不紊进行的。

不管是想转行做前端亦或者是毕业参加前端工作的小伙伴们,除了技术上的掌握,这方面的业务能力、问题解决能力也要加强。当然我们只有先面试通过了再去考虑这些问题,所以小编分享一份详细又全面的面试题,让你事半功倍

小编在此分享一份36W字的面试宝典,内容涵盖:基础&进阶篇字符串&集合面试题汇总、.Java并发编程、JVM、数据结构与算法、网络协议、数据库、mysql、52条SQL性能优化策略、一千行SQL命令、Redis、MongoDB、Spring(共485页,36W字)点击这就可以领取完整版PDF后端Java全面面试题资料喔

如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
[JAVA进阶群]

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

学习资料

Java必问知识点精华合集

JVM

  1. 线程
  2. JVM内存区域
  3. JVM运行时内存
  4. 垃圾回收与算法
  5. JAVA四中引用类型
  6. GC分代收集算法VS分区收集算法
  7. GC垃圾收集器
  8. JAVA IO/NIO
  9. JVM类加载机制

Java集合

  1. 接口继承关系和实现

  2. List
    Arayist (数组)
    Vector (数组实现、线程同步)
    Linklist (链表)

  3. set
    HahSet Cah陶)
    TreeSet (仁叉树)
    LnkHashSet(HashSet+ LinkedHashMap)

  4. Map
    HashMap (数组+链表+红黑树)
    ConcurrentHashMap
    HashTable (线程安全)
    TreeMap (可排序)
    LinkHashMap (记录插入顺序)

JAVA多线程并发

  1. JAVA并发知识库
  2. JAVA线程实现/创建方式
  3. 4种线程池
  4. 线程生命周期(状态)
  5. 终止线程4种方式
  6. sleep与wait区别
  7. start与run区别
  8. JAVA后台线程
  9. JAVA锁
  10. 线程基本方法
  11. 线程上下文切换
  12. 同步锁与死锁
  13. 线程池原理
  14. JAVA阻塞队列原理
  15. CyclicBarrier. CountDownlatch、 Semaphore的用法
  16. volatile关键字的作用 (变量可见性、禁止重排序)
  17. 如何在两个线程之间共享数据
  18. ThreadLocal作用(线程本地存储)
  19. synchronized和ReentrantLock的区别
  20. ConcurrentHashMap并发
  21. Java中用到的线程调度
  22. 进程调度算法
  23. 什么是CAS (比较并交换-乐观锁机制-锁自旋)
  24. 什么是AQS (抽象的队列同步器)

Java基础

  1. JAVA异常分类及处理
  2. JAVA反射
  3. JAVA注解
  4. JAVA内部类
  5. JAVA泛型
  6. JAVA序列化创建可复用的Java对象
  7. JAVA复制

Spring原理

  1. Spring特点
  2. Spring核心组件
  3. Spring常用模块
  4. Spring主要包
  5. Spring常用注解
  6. Spring第三方结合
  7. Spring I0C原理
  8. Spring APO原理
  9. Spring MVC原理
  10. Spring Boot原理
  11. JPA原理
  12. Mybatis缓存
  13. Tomcat架构

如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!**
[JAVA进阶群]

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

微服务

  1. 服务注册发现
    客户端注册(zookeeper)
    第三方注册(独立的服务Registrar)
    客户端发现
    服务端发现
    Consul
    Eureka
    SmartStack
    Etcd
  2. API网关
    请求转发
    响应合并
    协议转换
    数据转换.
    安全认证
  3. 配置中心
    zookeeper配置中心
    配置中心数据分类
  4. 事件调度(kafka)
  5. 服务跟踪(starter-sleuth)
    Hystrix断路器机制
  6. 服务熔断(Hystrix)
  7. API管理

Netty与RPC

  1. Netty原理
  2. Netty高性能
    多路复用通讯方式
    异步通讯NIO
    零拷贝(DIRECT BUFFERS使用堆外直接内存)
    内存池(基于内存池的缓冲区重用机制)
  3. Netty RPC实现
    概念
    关键技术
    核心流程
  4. RMI实现方式
    实现步骤
  5. Protoclol Buffer
    特点
  6. Thrift

网络

  1. 网络7层架构

  2. TCP/IP原理.
    网络访问层(Network Access Layer)
    网络层(Internet Layer)
    传输层(Tramsport Layer-TCP/UDP)
    应用层(Application Layer)

  3. TCP三次握手/四次挥手
    数据包说明
    三次握手
    四次挥手

  4. HTTP原理
    传输流程
    HTTP状态
    HTTPS

  5. CDN原理
    分发服务系统
    负裁均衡系统:
    管理系统:

日志

  1. SIf4j
  2. Log4j
  3. LogBack
    LogBack优点
  4. ELK

Zookeeper

  1. Zookeeper概念
  2. Zookeeper角色
  3. Zookeeper工作原理(原子广播)
  4. Znode有四种形式的目录节点

Kafka

  1. Kafka概念
  2. Kafka数据存储设计
  3. 生产者设计
  4. 消费者设计

RabbitMQ

  1. 概念
  2. RabbitMQ架构
  3. Exchange类塑

Hbase

  1. 概念
  2. 列式存储
  3. Hbase核心概念
  4. Hbase核心架构
  5. Hbase的写逻辑
  6. HBase vs Cassandra

MongoDB

  1. 概念
  2. 特点

Cassandra

  1. 概念
  2. 数据模型
  3. Cassandra- 致Hash和虚拟节点)
  4. Gossip协议
  5. 数据复制
  6. 数据写请求和协调者
  7. 数据读请求和后台修复
  8. 数据存储(CommitLog. MemTable、 SSTable)
  9. 二级索引(对要索引的value 摘要,生成RowKey)
  10. 数据读写

设计模式

  1. 设计原则
  2. 厂方法模式
  3. 抽象工厂模式
  4. 单例模式
  5. 建造者模式
  6. 原型模式
  7. 适配器模式
  8. 装饰器模式
  9. 代理模式
  10. 外观模式
  11. 桥接模式
  12. 组合模式
  13. 享元模式
  14. 模板方法模式
  15. 观察者模式
  16. 迭代子模式
  17. 责任链模式
  18. 命令模式
  19. 备忘录模式
  20. 状态模式
  21. 访问者模式
  22. 中介者模式
  23. 解释器模式

负载均衡

  1. 四层负载均衡vs七层负载均横
  2. 负载均衡算法/策略 LVS
  3. Keepalive
  4. nginx反向代理负载均衡
  5. HAProxy

数据库

  1. 存储引擎
  2. 索引
  3. 数据库三范式.
  4. 数据库是事务.
  5. 存储过程(特定功能的SQL语句集)
  6. 触发器(-段能自动执行的程序)
  7. 数据库并发策略
  8. 数据库锁
  9. 基于Redis分布式锁
  10. 分区分表
  11. 两阶段提交协议
  12. 三阶段提交协议
  13. 柔性事务
  14. CAP

一致性算法

  1. Paxos
  2. Zab
  3. Raft
  4. NWR
  5. Gossip
  6. -致性Hash

JAVA算法

  1. 二分查找
  2. 冒泡排序算法
  3. 插入排序算法
  4. 快速排序算法
  5. 希尔排序算法
  6. 归并排序算法
  7. 桶排序算法
  8. 基数排序算法
  9. 剪枝算法
  10. 回溯算法
  11. 最短路径算法
  12. 最大子数组算法
  13. 最长公共子序算法
  14. 最小生成树算法

数据结构

  1. 栈(stack)
  2. 队列(queue)
  3. 链表(Link)
  4. 散列表(Hash Table)
  5. 排序二叉树
  6. 红黑树
  7. B-TREE
  8. 位图

加密算法

  1. AES
  2. RSA
  3. CRC
  4. MD5

分布式缓存

  1. 缓存雪崩
  2. 缓存穿透
  3. 缓存预热
  4. 缓存更新
  5. 缓存降级

Hadoop

  1. 概念
  2. HDFS
  3. MapReduce
  4. Hadoop
  5. MapReduce作业的生命周期

Spark

  1. 概念
  2. 核心架构
  3. 核心组件
  4. SPARK编程模型
  5. SPARK计算模型
  6. SPARK运行流程
  7. SPARK
  8. RDD流程
  9. SPARK
  10. RDD

Storm

  1. 概念
  2. 集群架构
  3. 编程模型(spout->tuple->bolt)
  4. Topology运行
  5. Storm Streaming Grouping

YARN

  1. 概念
  2. ResourceManager
  3. NodeManager
  4. ApplicationMaster
  5. YARN运行流程

机器学习

  1. 决策树
  2. 随机森林算法
  3. 逻辑回归
  4. SVM
  5. 朴素贝叶斯
  6. K最近邻算法
  7. K均值算法
  8. Adaboost算法
  9. 神经网络
  10. 马尔可夫

云计算

  1. Saas
  2. Paas
  3. laaS
  4. Docker
  5. Openstack

Tip:本来这一栏有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,请直接点击这里领取资料哦

结束语

对于面试,说几句个人观点。

面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。

其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。

所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。

以上是关于进入后端Java行业前明白个道理:程序员解决的问题,大多不是程序问题的主要内容,如果未能解决你的问题,请参考以下文章

进入测试行业前明白个道理:程序员解决的问题,大多不是程序问题

转行或实习生参加前端面试前要明白个道理:程序员解决的问题,大多不是程序问题...

Java 程序员必备的 15 个框架,前 3 个地位无可动摇!

Java 程序员必备的 15 个框架,前 3 个地位无可动摇!

[查异常网]-20160403-程序员总结:帮助你早些明白一些道理

华科师兄快40岁才明白的道理