👏👏👏

尊敬的造访者们,我们又见面,欢迎你来到面经部分😃。此章节小编收藏了大量的面试题,包含了各个阶段和各个大厂的经典面试题,积累下来分享给大家,一起学习一起进步🙋。

# 前端趋势

  1. 小程序

在⼩程序⽅⾯,今年仍然是⼩程序突⻜猛进的⼀年,各⼤主流的 App 都上线了⼩程序能⼒的⽀持,各前端团队也都有了专⻔的⼩程序开发团队,以适应更快的⼩程序开发需求。同时App 中很多关键的功能都被⼩程序所替代,甚⾄有些 App 已经变成 Native ⼩程序壳,上层的应⽤实现全部是⼩程序。

在微信小程序出现以前,大家在谈 Hybird、ReactNative,但终归只是技术层面的狂欢,始终没有业务属性的注入。小程序的出现,一方面告诉业界在当前设备上 Webview 也没差到哪去,另外一方面告诉业界如何让有能力的商家在超级 APP上进行私域运营。

另一方面,从技术角度说,在上层 DSL 的严格限制下,超级 APP 就可定义符合自己诉求的 Web 标准,弥补当前 Web 标准的不足,最后和客户端配合,结合离线、预加载、定制Webview 能产出类似于 NSR 等各种酷炫的技术模型,让 Web 在端内低成本达到 Native 版的体验,端外也不会像 Weex 一样有点小别扭。 不过由于需要依赖超级APP(微信、支付宝、百度、美团、头条等),由于各家平台采用的具体方案的差异,造成目前小程序的落地方案也不一样,有时候需要开发多套代码。

  1. 跨端开发

跨端开发⽅⾯,RN ⽣态已经⾮常成熟,或者说看不到太多发展前景,因为目前还停留在0.61版本,似乎1.0版本仍然遥遥无期。因此,今年很多团队转战⾕歌⽣态的 Flutter,特别是 Flutter for Web 的第⼀个 Release,⼜让 Web 前端重燃希望、跃跃欲试。同时,苹果公司也发布了全新的 UI 系统——SwiftUI,同时,开源社区中 SwiftUI for Web已经在路上了,SwiftUI for Android 还会远吗?跨端开发⽅⾯,Flutter 仍会快速发展,并且会有更多的开发者,Flutter on JS、SwiftUIfor Web&Android 也将是开源⽣态值得期待的事情,毕竟跨端仍没有⼀个完美的解决⽅案。

  1. 前端工程化

在前端⼯程化⽅⾯,开发者最重要的基本素养就是通过⼯具提升效率,⽽前端开发者在这⽅⾯会持续迭代和优化。

曾经我们谈 Yoman,谈 CLI 等系列构建工具,但在团队大了之后始终觉得差点什么。反观 Java 同学,从没听说过 Spring Boot 配置工程师。今年很多团队都在建设完整的前端 DevOps 流程⼯具集,⼀些团队之间也开始协作共建,不管是 Web 还是⼩程序项⽬,从新建项⽬、开发、联调(tiao)、部署、测试、发布、运维到监控统计,都有完善的⼯具做保障和提效,今后前端⼯程也会越⾛越标准化。

展望2020年前端的发展,前端工程体系一定会更加闭环,不再是一个脚手架这么简单,而是会结合 IDE,打通业务属性,从项目初始化、到编写代码、到 CI、到灰度、到发布 形成一个完成的闭环。

  1. Serverless

Serverless 的⽕爆⼏乎可以归因于前端。因为 Serverless 能够较完美的⽀持Node.js,使⽤Serverless 帮助前端开发者解决了使⽤Node.js 过程中的诸多问题。当前的前端工程师大多都是科班出身,虽不能和正宗的服务端开发同学比,但也可写很多服务端层的业务逻辑。当前已经有很多公司在做 BFF 层,来满足这部分诉求,但依旧摆脱不掉运维、机器分配 这条拦路虎。随着 Serverless 的逐步落地,BFF 这层的代码会摆脱运维、机器分配等复杂的问题,同时大概率会由前端同学写这部分代码,服务端同学专注中台系统的实现。从业务上说,业务的试错成本也会大幅度降低。

随着 Node.js 成为前端开发者必备技能之后,云计算的不断普及会让Serverless 触⼿可及。当越来越多的开发者尝到研发⾼效的甜头之后,Serverless 必将对前端的研发模式产⽣变⾰。同时,使用Serverless的同学一定会使用 TS。这也意味着,2020 不写 TS 可能真的就 Out 了。

  1. WebAssembly

WebAssembly 是一种新的字节码格式,目前主流浏览器都已经支WebAssembly。 和 JS 需要解释执行不同的是,WebAssembly 字节码和底层机器码很相似,可以快速装载运行,因此性能相对于 JS 解释执行而言有了极大的提升。 也就是说WebAssembly 并不是一门编程语言,而是一份字节码标准,需要用高级编程语言编译出字节码放到 WebAssembly 虚拟机中才能运行, 浏览器厂商需要做的就是根据 WebAssembly 规范实现虚拟机。

有了 WebAssembly,在浏览器上可以跑任何语言。从 Coffee 到 TypeScript,到 Babel,这些都是需要转译为 js 才能被执行的,而 WebAssembly 是在浏览器里嵌入 vm,直接执行,不需要转译,执行效率自然高得多。

举个例子,AutoCAD 软件是由美国欧特克有限公司(Autodesk)出品的一款自动计算机辅助设计软件,可以用于绘制二维制图和基本三维设计。使用它时,无需懂得编程,即可自动制图,因此它在全球被广泛应用于土木建筑、装饰装潢、工业制图、工程制图、电子工业、服装加工等诸多领域。

AutoCAD 是由大量 C++ 代码编写的软件,经历了非常多的技术变革,从桌面到移动端再到 web。之前,InfoQ 上有一个演讲,题目是《AutoCAD & WebAssembly: Moving a 30 Year Code Base to the Web》,即通过 WebAssembly,让很多年代久远的 C++ 代码在 Web 上可以运行,并且保证了执行效率。hrome 的核心 JavaScript 引擎 V8 目前已包含了 Liftoff 这一新款 WebAssembly baseline 编译器。Liftoff 简单快速的代码生成器极大地提升了 WebAssembly 应用的启动速度。2019年,很多的公司都开始投入人力进行WebAssembly的学习个改造,相信2020年WebAssembly会经历爆发式期。

  1. 5G

2019年一个绕不开的话题就是5G。⾸先,5G 带宽的⼤幅提升带来传统 Web ⻚⾯复杂度的进⼀步提升,如同 2G 到 4G 变⾰过程中⻚⾯从 WAP 的纯⽂本超链接时代变⾰到 4G 全图⽚视频时代。5G 对于⻚⾯的变⾰必将是巨⼤的,但肯定不会⼀蹴⽽就。因为相应的配套设施也需要逐步完善,如硬件性能和浏览器的处理速度。⽽服务端渲染(SSR)肯定是其中⼀个捷径,轻前端重后台,5G 是桥梁,把渲染放后台,不像同构那么简单,需要关注和优化渲染性能。WebAssembly 或许会在这个机遇下得到快速发展,因为它可以⽆缝对接后台多种语⾔,⽽后台渲染的优化也会带来前端⻚⾯研发模式和技术架构的变⾰。

其次,5G 带来的万物互联,⼜将带来有别于智能⼿机和普通 PC 的多样化的应⽤场景,VR、可穿戴设备、⻋载系统、智能投影、智能交互等⼜会把 Web 带⼊各种各样的垂直领域,这也意味着前端将有更多⼴阔的空间。相信随着5G的大规模商业,会诞生一批新的互联网巨头。

# 开发者如何看 Java 发展趋势?

在纷繁复杂的编程语言中,Java 一直是深受开发者和企业欢迎的编程语言。从 2001 年起,Java 在 TIOBE 榜单中几乎排在首位,偶尔排在第二位。受欢迎程度如此高、使用广泛的编程语言肯定会有一些需要掌握的特定技能。

除了需要掌握的技能,哪些 Java 使用场景最受欢迎呢?

  1. 用于 Web 编程

大多数企业都喜欢使用 Spring MVC 构建 Web 应用程序的后端,使用 Angular 或 React.js 前端框架来构建应用程序的前端。这意味着,Java 程序员虽然不需要完全掌握 JavaScript 前端框架的知识,但是需要了解 Java 代码如何与前端框架进行交互。

最受欢迎的 Java 后端框架是 Apache Struts。与 Spring 一样,Apache Struts 自 5 年前发布以来,一直在跟随 Java 的更新步伐,不同的是,Spring MVC 只是复杂解决方案的一部分,而 Apache Struts 可以处理应用程序的多个方面,例如测试或数据访问。

  1. 数据处理

很多人都认为大数据并不是 Java 擅长的应用场景,但是 CV Compiler 的调查结果显示 Java 在大数据方面的应用正在崛起,甚至 CV Compiler 认为在数据科学的市场,Java 可能会与 Python 相提并论。

很多企业招聘人员都希望 Java 应聘者能够熟悉 Apache Kafka、Hadoop、Azure 以及 Spark 等与大数据相关的解决方案。

  1. 微服务

很多经验丰富的开发人员都认为 Java 是微服务开发的最佳编程语言,Java 本身也在积极支持微服务,例如 2019 年,Jakarta EE 社区的优先级就是支持微服务。

Java 微服务框架也经历了大洗牌,Spring Boot 和 Spring Cloud 进入晚期大众阶段,它们已经成为企业信任的 Java 微服务开发框架。Helidon 和 Microprofile 进入早期采用者阶段,不过 vert.x 可能会因为相对利基的市场无法跨过早期采用者阶段。

  1. 数据库和 Web 服务器

提到 Java 在数据库方面的使用场景,相信很多人都会想到目前比较流行的 NoSQL 数据库 Cassandra 和 MongoDB。而在 Web 服务器方面,Tomcat 和 Apache 也绝对是领导者的角色。

# 国外开发者如何看待 Java 的发展趋势

从上文中我们可以看到,时至今日,Java 仍然在众多使用场景中占据着举足轻重的位置。那么,Java 未来将如何发展呢?我们搜集了一些国外开发者对 Java 的趋势判断,以及他们认为现阶段需要掌握的 Java 相关技能。

  1. RedMonk 创始人 James Governor

在不久的将来,我们可能会看到 Quarkus(Kubernetes Native Java 框架)等 Java 框架及其相关技术会越来越受到关注。例如,它可能是 Vert .x,因为 Java 正在积极响应和参与容器革命。

  1. Java Champion,JavaOne Rockstar Consultant Adam Bien

有一个现象有点让我惊讶,那就是与 Spring 相比,Spring Boot 的受欢迎程度居然较低。另外,JPA (Java Persistence API),Java EE API 之一,被列为独立项目,加上对 SQL 技能的强烈需求,都表明了 Java 市场对关系数据库的持续兴趣。

另外,Maven 作为领先的构建工具,市场体现出了对 Maven 技能的强烈需求,而 Apache Kafka 虽然非常流行,但是并不是适用于所有项目的通用架构,所以市场需求反响不是很强烈。

作为一名 Java EE 开发人员,如果想要在市场中具备强劲的竞争力,那么他需要掌握以下技能,JPA、SQL、JMS (Kafka 也是一种 JMS 实现)、JAX-RS (REST)、Maven (Java EE 中的缺省值)、Git(事实上的标准)。

  1. Netflix 的高级软件工程师 Alex Borysov

如今,Spring 框架和微服务体系结构实际上已经成为 Java 世界中的标准。但是,不断发展的行业要求软件工程师在掌握现有 Java 技能的基础上,还要开发新的 Java 技能。Service Mesh 和 service proxy 正在改变微服务的开发方式,所以 Java 程序员也要积极学习 Istio、Linkerd2 或 Envoy。另外,随着越来越多的公司转向公有云和混合云,拥有亚马逊 AWS、谷歌云平台或微软 Azure 的经验非常重要。

Java 领域中,反应式编程处于上升趋势,虽然我认为它不会取代传统的命令式编程,但是我们需要了解什么是反应式编程,反应式编程如何改变 Java 生态,以及一些反应式框架,例如 Project Reactor、RxJava、Spring WebFlux 等。

在数据存储方面,NoSQL 和多语言持久性是当今工程师必备的 Java 技能。NewSQL 的发展同样值得期待,例如 Google Spanner 就是作为服务在生产环境中应用的一个最佳案例。

  1. Java Champion,Sebastian Daschner

在企业 Java 项目中,我已经不太看得到 SOA 的需求,而 Spring 和 Spring Boot 在实际应用中经常同时使用,所以这时探究两者的区别就不是特别有意义了。另外,我看到大家对各种云原生技术的兴趣越来越大,如果这种趋势继续发展下去,相信未来几年,Java 也会变得更加有趣。

除了以上开发者,InfoQ 首席编辑 Charles Humble 也针对 Java 的未来发展趋势发表了自己的看法,他认为:

  • Java 模块化系统采用也是一个很有趣的话题。我敢肯定 OSGI 拥护者对于将它放在创新者阶段会有意见,但这样做可能是对的。
  • 我想可以将 Clojure 移到晚期大众阶段。当然,人们还在用它,但我感觉到它的使用量在下降,而且它本身面向的就是利基市场。
  • 我会将 Ceylon 移掉。它一直以来都没有获得太多关注,而且我不认为进入 Eclipse 会给它带来多大帮助。这个项目的活跃度很低,过去 6 个月只有 10 个代码提交。
  • 测试框架的趋势看起来相当稳定。我们要把它移掉吗?从采用率来看,我给它们排个顺序:JUnit、TestNG/Cucumber、Spock,但似乎变化不大?
  • SmartBear 最近收购了 Cucumber,可能会促进它的发展,但即使是这样,我仍然倾向于把它们移掉。人们似乎对 JVM 上的 Node 不感兴趣?我想可以把它移掉。
  • 我很想把 Kotlin 移到早期大众阶段,它是我近来最经常听到的一门 JVM 编程语言,这要得益于Android 开发的流行。可以说,它已经越过了鸿沟,但仍然落后于其他编程语言,比如 Groovy、Swift 或 Go 语言
  • 我觉得 Scala 可以留在晚期大众阶段,人们会逐步弃用它。

# ❤️❤️❤️

本章节都会将面试的各个核心考点罗列出来,包括一些核心知识、核心考点、频考点、提供给大家使用🤡。这些面试题都是小编东收西藏积累来的,如果有过失的题目,或者因为coding有误的地方,欢迎您的指出😅,作者会在第一时间进行修改,不会耽误大家的学习。

希望在这里我们可以每天攻克一个难题,看懂一个知识核心,我们一起向高级工程师迈进😚。希望你的坚持在不久的日子里可以得到彰显,多年后会有看自己,会感激自己的不懈努力,相信自己加油

最后让我们一起努力吧!💯

>