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

52 篇文章 0 订阅
10 篇文章 0 订阅

前言

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

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

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

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

为什么会这样?

在软件行业里有一本名著叫《人月神话》,其中提到两个非常重要的概念:本质复杂度(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:本来这一栏有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,请直接点击这里领取资料哦

结束语

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

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

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

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java后端程序员可以通过以下方式来成长: 1. 不断学习和掌握新的技术和框架,如Spring, Hibernate等。 2. 完成项目,并且不断总结和提高。 3. 参加技术社区活动,和其他程序员交流和学习。 4. 阅读相关技术文章和书籍,不断提高自己的理解能力。 5. 注意代码质量和可维护性,并且不断提高自己的编码能力。 ### 回答2: 要成为一名优秀的Java后端程序员,以下是一些成长的关键点: 1. 扎实的基础知识:掌握Java语言的基础知识,如语法、面向对象编程、异常处理等。还要了解常用的数据结构和算法,以便在解决问题时能够选择合适的解决方案。 2. 学习框架和工具:深入学习常用的Java后端框架,如Spring、Hibernate等,理解它们的原理和使用方式。同时掌握常用的开发工具,如Eclipse、IntelliJ IDEA等,提高开发效率。 3. 实践项目经验:参与实际项目开发,不断积累实战经验。通过实践,了解项目开发流程、团队协作和版本控制等,同时也可以发现和解决一些实际问题。 4. 深入学习数据库:掌握常用的关系型数据库和NoSQL数据库,如MySQL、MongoDB等。了解数据库的原理和优化技巧,能够设计和优化数据库模型。 5. 持续学习和自我提升:Java后端是一个快速发展的领域,需要保持学习的热情和积极性。关注新技术和行业动态,参加技术交流活动,阅读相关书籍和文章,不断提升自己的技术水平。 6. 理解业务需求:作为一名优秀的Java后端程序员,需要与产品和需求团队紧密合作,理解业务需求并转化为可行的技术方案。同时注重与端开发人员的协作,保证整个系统的协同工作。 7. 代码质量和可维护性:编写高质量的代码是成长的关键。注重编码规范,使用设计模式和合理的架构,编写具有可读性、可维护性和可扩展性的代码。 8. 锻炼解决问题的能力:Java后端开发过程中,经常会面临各种问题和挑战,要有解决问题的能力。培养良好的问题分析和解决思路,能够快速定位问题并给出解决方法。 总之,作为Java后端程序员,成长的关键在于持续学习、不断实践和提升自我的能力。只有通过不断地努力和不断提高,才能成为一名优秀的Java后端程序员。 ### 回答3: 作为一名 Java 后端程序员,要想不断成长,以下几点是很关键的: 1. 深入学习和掌握 Java 技术:Java 是一门广泛应用于后端开发的编程语言,了解核心概念和基础知识是成长的第一步。通过学习官方文档、书籍、在线教程等,掌握 Java 的语法、面向对象编程、多线程、集合等核心技术。 2. 实践项目经验:通过参与实际项目,积累实践经验是成长的重要途径。可以通过参与个人项目、开源项目,或者是向公司申请承担一些有挑战性的工作任务,来提升解决问题的能力和技术广度。 3. 学习框架和工具:Java 后端开发中使用了许多优秀的框架,如 Spring、MyBatis、Hibernate 等。深入了解这些框架的原理和使用方法,可以提高开发效率和代码质量。 4. 关注行业动态和技术趋势:技术日新月异,了解当行业的动态和技术趋势对于 Java 后端程序员至关重要。可以通过关注技术博客、参与技术社区等方式,及时了解新的技术和工具,不断拓宽技术视野。 5. 不断学习和自我更新:作为一名程序员,持续学习和自我更新是非常重要的。可以通过定期参加培训课程、参与技术社区讨论、阅读技术书籍等方式,不断提升自己的技术水平和专业素养。 6. 提高解决问题的方法和思维:作为一名 Java 后端程序员解决问题是日常工作的重要一环。要学会运用科学的方法和合理的思维来解决问题,善于分析、排查和调试代码,提高代码的可维护性和性能。 7. 不断挑战自我:面对技术难题和挑战时,不要畏惧,要积极主动地接受挑战并解决问题。通过接触一些新领域和技术,接触一些有挑战性的项目,可以不断挑战自我,从中获得成长。 总之,Java 后端程序员要想不断成长,需要不断学习新技术,实践项目经验,关注行业动态,提升解决问题的能力和思维方式,并时刻保持学习的状态和自我挑战的心态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值