高级Java工程师养成记-Java概述

信息技术发展趋势

目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、物联网、人工智能、区块链等为代表的新兴技术三个阶段。
高级Java工程师养成记-Java概述

  • 互联网
    互联网自从20世纪90年代逐渐兴起,主要是通过网络连接了世界各地的PC,笔记本以及背后提供各种服务的大型服务器集群。
    其中绝大多数PC、笔记本都运行着Windows,macOS操作系统,而服务器主要是以类Unix(CentOS,Ubuntu Server)占据主要市场。
    依靠互联网成长起来的公司有Apple、Google、Amazon、Microsoft、Baidu、Alibaba、Tencent。

  • 移动互联网
    移动互联网主要从2010开始爆发式增长,主要是通过网络连接了世界各地的移动设备(最典型的就是手机),它们绝大多数都运行着Android,iOS操作系统。
    依靠移动互联网成长起来的公司有字节跳动、蚂蚁金服、小米、美团、滴滴。

  • 大数据、云计算
    随着用户的爆发式增长,以海量数据为基础的大数据、云计算技术在Google、Amazon、Apple、Baidu、Alibaba、Tencent等大型互联网公司有着广泛的商业应用场景。

  • 物联网
    物联网会以手机作为中枢,通过物联网连接所有的智能设备,包括智能家居、汽车、电视等嵌入式设备,目前国内的小米、华为等在智能家居、电视、汽车等领域广泛布局。而随着5G的逐渐普及,万物互联的时代即将到来。

  • 人工智能
    人工智能(AI)作为当前最火爆的技术,国内的Baidu、Tencent、Alibaba等互联网公司逐渐根据自身的核心业务开始布局,Alibaba最早将人工智能技术布局在电商和物流领域,而Baidu开发出了对话式人工智能操作系统Dueros和自动驾驶平台Apollo,Tencent则是在游戏领域应用人工智能。

  • 区块链
    区块链经历了数字货币、智能合约和超级账本三个阶段,区块链技术可以广泛使用在金融、供应链、物流、公共服务等领域,解决互联网的信任问题,目前蚂蚁金服、京东已经有大量的区块链应用落地。

计算机系统组成

计算机系统概述

计算机是一种用于高速计算的电子机器,可以进行数值运算、逻辑判断,还有存储记忆功能,能够接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速的处理,然后把处理的结果输出的现代化智能电子设备。日常生活中常见的台式机、笔记本、手机等等都属于计算机。

计算机系统由硬件(Hardware)系统和软件(Software)系统两大部分组成。
软件是运行在硬件之上,而硬件的好坏会直接影响软件运行的性能。
计算机通过软硬件的共同协作就可以完成日常常见的任务,例如听歌、看电影、购物、聊天等等。
高级Java工程师养成记-Java概述

计算机硬件系统

计算机硬件系统主要由主机和外部设备组成。
主机主要是包含中央处理器和内存储器。
中央处理器主要由运算器和控制器组成,实现数据的数值计算、逻辑判断和其他设备控制。
而内存储器分为RAM和ROM,其中RAM(Random Access Memory)表示随机存储内存,程序运行时指令和数据都会被加载到内存中,这种存储器在断电时将会丢失其存储的内容。而ROM(Read-Only Memory)表示只读内存,是一种只能读出事先存储数据的固态半导体存储器。

外部设备主要包含外部存储器、输入设备、输出设备组成。常见的外存储器包含移动硬盘U盘等等。外部存储器通常用于大容量存储数据,IO性能比内存要低的多,但是只要硬件设备不坏的情况下能够永久存储数据,而常见的输入设备包含鼠标键盘等等,常见的输出设备包含声卡、显卡等等。网卡也是属于输入输出设备的一种,主要用于网络上的数据接收和发送。

在后期程序排查错误时除了要考虑程序本身的错误以外,还要考虑计算机硬件故障,例如内存不足,磁盘写满,网络不通等问题

每个计算机组件的IO性能也各不相同,CPU、内存、磁盘都遵循容量越大、IO性能越差的特点。
高级Java工程师养成记-Java概述

在后期优化程序时需要考虑程序时间复杂度和空间复杂度的问题。

计算机软件系统

软件的出现实现了人和计算机更好的交互,它是由开发人员采用某种编程语言(C/C++/Java等等)编写的一系列指令以及不同业务场景产生的数据组成。

通常将软件分为系统软件和应用软件

  • 系统软件
    驱动程序、操作系统、语言处理程序等都是属于系统软件。
    驱动程序是硬件厂商使用编程语言(C/C++)编写的程序,在使用硬件(例如打印机、显卡、声卡等等)前必须安装对应的驱动程序。
    操作系统是负责通过驱动程序管理硬件资源,同时给应用软件提供运行平台,目前主流的操作系统有Windows,Linux,macOS,Android,iOS,鸿蒙。
    语言处理程序是用于将编程语言编写的源程序编译或者解释成对应平台的机器语言的程序。

  • 应用软件
    微信、支付宝、淘宝、WPS等等都是属于应用软件,它们都是运行在操作系统之上的。
    运行在不同操作系统之上的软件交互方式也不一样,Linux上的软件通常是使用字符界面的交互方式,运行在Windows,macOS上的软件通常是以鼠标、键盘操作的交互方式,运行在Android,iOS上的软件通常是以手势触控、语音等交互方式。

程序和指令

程序是为了完成某项任务(例如聊天、听音乐)而使用某种编程语言(例如C/C++)编写的一组指令序列。
而指令是计算机程序控制的最小单位,由操作码和操作数组成,操作码是计算机要执行什么操作,例如加减乘除操作,而操作数具体执行的对象,具体的数据以及数据的位置。
所有指令的集合称为指令系统,常见的PC机指令系统有Intel X86指令集,常见的手机指令系统有ARM,因此手机上的程序不加修改是不能直接在PC机上运行,因为不同的指令集是不兼容的。

计算机语言发展史和应用场景

计算机编程语言发展史

计算机已经成为人类大脑的延伸,成为人类工作和生活中不可或缺的一部分。而算法是计算机的灵魂,编程语言是塑造计算机灵魂的工具,即算法需要编程语言实现。让计算机具备"灵魂",可以按照人的意志运行,甚至某天按照计算机自己的意志运行,其核心就是算法。

计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段。
其特点是使得程序员用编程语言开发、测试、部署应用程序越来越方便、高效。但是是以牺牲效率为代价,随着计算机硬件的快速发展,绝大多数应用场景的效率损失可以忽略不计。

  • 机器语言
    计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。

  • 汇编语言
    随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别二进制的0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。尽管如此汇编语言目前仍然在工业电子编程、软件的加密解密和计算机病毒分析等场景广泛使用。

  • 高级程序设计语言
    高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心计算机底层硬件差异而只需要专注于业务模块实现即可。而且相对于机器语言、汇编语言而言,高级语言学习起来更加容易,门槛更低,因此会有更加充足的人力资源,从而更容易开发大型商业软件。例如Windows、macOS、Linux等操作系统都是使用C/C实现。国内的阿里巴巴在电商、物流、金融、支付领域大量使用Java实现。而 C/C++,Java,Python,Go都是目前最流行的高级程序设计语言。

计算机语言应用场景

如果想知道目前主流的编程语言有哪些,可以访问tiobe 首页获取编程语言排行榜。

2020年7月编程语言排行榜
高级Java工程师养成记-Java概述

根据当前(2020年7月)Tiobe排行榜得知,C/Java/Python分别排在前三名, 随后紧跟着C++,C#,JavaScript,Go等等。每种编程语言都有自己擅长的应用场景。

编程语言 应用场景
Java 大型互联网应用(淘宝、天猫),Android,大数据
JavaScript 浏览器端、服务端、PC桌面
Scala 大数据开发
Go 高并发、区块链、微服务
Python 人工智能、机器学习、自动化运维、数据分析 、图形处理
C 硬件驱动、操作系统、系统软件
C++ 系统软件、网络通讯、科学计算 、游戏引擎
C# Windows应用,Web应用、游戏
Kotlin Android应用开发
Swift macOS,iPhone,iPad应用开发

那么如果你作为初学者,面对如此之多的编程语言,到底应该先从哪门语言上车呢?如果你想深入的学习其他语言和架构相关的知识之前建议熟练掌握Java语言。因为Java语言不仅仅只是一门简单的程序设计语言,基于Java有许许多多的开源组件、框架,同学们可以通过阅读源码提升自己的水平,以及免费和收费的学习资源,而且Java在企业级应用、Android开发、大数据开发有广泛的应用,就业场景十分广阔。无论哪种语言,都是实现目标的工具,而不是目标本身。

而如果时间充分的话,我的ittimeline 头条号会覆盖上述的十种编程语言,目的是实现全平台(Windows,Linux,macOS)应用开发、测试、部署。

目前第一阶段(2020/07/19-2021/07/31)会集中精力在Java/JavaScript/Scala这三种语言以及由它们衍生的分布式应用开发、大数据应用开发以及大前端应用开发。感兴趣的同学可以关注。

程序的编译和解释

由于高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,因此需要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。

为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。

  • 程序编译
    开发人员使用高级编程语言L1编写的应用程序通过编译器生成成计算机底层能够识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go

  • 程序解释
    首先使用L0语言实现另外一个程序,也就是解释器,然后将开发人员使用高级语言L1编写的应用程序作为输入,每一句L1编写的程序都会在L0中作为等价的转换然后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。

而Java和C#属于编译+解释型语言,以Java为例子,Java程序在运行之前首先被编译成Java字节码,然后在JVM虚拟机上解释运行。

Java概述

Java的发展历史

高级Java工程师养成记-Java概述
Java之父-James Golsing

  • 起源
    1991年,Sun公司的James Golsing领导的工程师小组想要开发一种用于像有线电视机顶盒这样的消费类电子产品的小型计算机语言,该产品的特点是由于不同的厂商选择不同的CPU和操作系统,因此要求该语言不能和特定的体系结构绑定在一起,也就是跨平台的。最初将这个语言命名为Green,后来改成Oak,但是发现已经有一种语言叫这个名字,最终改为Java。

  • 流行
    20世纪90年代末,Java赶上了互联网发展的潮流,而互联网的特点刚好和消费类嵌入式电子产品类似(不同计算机产商选择不同的CPU和操作系统),得益于Java的跨平台特性,可以制作在支持Java的Web浏览器内的程序(Applet)而逐渐流行起来。

  • 生态
    由于Java开源,也得到了许多大厂(例如Oracle,IBM,阿里巴巴,谷歌,苹果)的支持,逐步发展成为具有开源、跨平台、高性能、支持多线程、分布式、安全可靠等诸多特性的开发平台和运行平台,而且自JDK1.4以后逐渐涌现出许多为了简化企业级开发的开源框架,例如后期会学习的Spring Framework,MyBatis,Netty,Dubbo等等都是使用Java实现,开发者可以通过阅读Java和框架的源码来提高自身的编程功力。

  • 开发平台
    经过20多年(1995年正式对外公开发布)的发展已经逐步建立起自己强大的生态体系,在大型互联网分布式应用开发,移动端Android开发以及大数据开发占据了广阔的市场,最典型的就是国内互联网巨头-阿里巴巴在其电商、物流、金融、支付、大数据、云计算等业务场景中大量使用了Java及其相关技术栈(MyBatis,Spring Framework/Spring Boot/Spring Cloud/Spring Cloud Alibaba,Hadoop,Spark,Flink)。

  • 运行平台
    Java程序是运行在JVM(Java Virtual Machine)之上的,这就是Java程序跨平台实现的本质原因,而且由于Java的开放性,有越来越多的语言是运行在JVM之上的,例如大数据处理语言Scala,Android开发的Kotlin以及Clojure,Groovy等等。

而作为一个Java开发者而言,了解Java语言的历史就要了解JDK(Java Development Kit)的发展历史,以及当前企业开发时选用的JDK版本和目前最新的JDK版本。

  • 1995年 5月23日Java语言诞生
  • 1996年SUN公司对外发布了JDK1.0
  • 1998年SUN公司发布了JDK1.2,将Java分成了J2SE,J2EE,J2ME
  • 2004年SUN公司发布了JDK1.5,也被称为JDK5.0,同时J2SE,J2EE,J2ME分别更名为JavaSE,JavaEE,JavaME
  • 2006年12月SUN公司发布了JDK1.6
  • 2011年Oracle公司发布了JDK1.7,也被称为JDK7.0
  • 2014年Oracle公司发布了JDK8.0
  • 2017年Oracle公司发布了JDK9.0
  • 2018年3月Oracle公司发布了JDK10.0,版本号也被称为18.3
  • 2018年9月Oracle公司发布了JDK11.0,版本号也被称为18.9
  • 2019年3月Oracle公司发布了JDK12.0,版本号也被称为19.3
  • 2019年9月Oracle公司发布了JDK13.0,版本号也被称为19.9
  • 2020年3月Oracle公司发布JDK14.0,版本号也被称为20.3

JDK5.0是JDK发展史上具有里程碑意义的版本,具有许多新特性,例如可变参数、自动拆装箱,泛型、注解、枚举等等。

JDK7.0是Oracle公司09年收购SUN公司之后发布的第一个版本,也就意味着自JDK7.0以后下载JDK需要去Oracle官网下载。

JDK8.0是国内互联网公司使用的主流JDK版本,许多Java的开源框架(例如SpringBoot2.x,Spring Cloud)都是基于该版本开发,也是Oracle公司长期支持的JDK版本。

JDK9.0以后Oracle公司将JDK的发布周期改为半年发布一个大的版本,而在企业项目开发时应该选择互联网大厂广泛使用,并且是官方长期维护的版本,而不是最新的版本。Oracle官方长期支持的JDK版本为JDK8和JDK11,分别支持到2025年和2026年。而JDK9,JDK10,JDK12,JDK13,JDK14都不是官方长期支持的版本。

高级Java工程师养成记首先会基于JDK11开始学习,然后逐渐会覆盖最新版本JDK涉及到的新特性。JDK是向下兼容,这也就意味着JDK8的特性能在JDK11上运行。

关于JDK版本的选择
在学习Java时可以选择当前最新的JDK版本,而在企业应用开发中,JDK的版本和线上环境运行的JDK版本保持一致即可。

Java的特性

Java是基于 C/C基础之上发展而来,但是不同于C/C的是Java是纯粹的面向对象(一切皆对象)语言,舍弃了C语言中容易引起错误的指针,并引入了垃圾回收机制避免了绝大多数内存泄露问题。
相对于C/C而言,Java更加简单易用、安全、健壮,同时开发效率更高(拥有大量的开源组件、框架),运行效率低于C/C,而且支持跨平台(一次编写,到处运行),体系结构中立,也支持分布式应用开发和高并发、高可用、高性能等应用场景。

Java程序之所以能够跨平台,是因为Java程序运行在JVM之上,没有和特定的平台绑定,Java程序不需要关注底层操作系统的差异性,而Oracle公司针对主流的操作系统提供了不同的JVM实现,从而屏蔽了底层操作系统的差异。

体系结构中立指的是JVM的实现可以是符合JVM规范的实现,例如Oracle公司的HotSpot,而且只要程序编译生成字节码文件,都可以在JVM上运行,例如Scala,Groovy都可以在HotSpot虚拟机上运行。

Java的应用场景

Java自从1998年之后将Java分为三个版本,分别是JavaSE,JavaEE和JavaME,不同的版本有不同的应用场景。

  • JavaSE(Java Standard Edition):标准版Java,提供了完整的Java核心API,主要用于桌面应用开发,例如JMeter。

  • JavaEE(Java Enterprise Edition):企业式Java,主要用于企业级后台服务,大型分布式互联网应用开发,例如电商、金融、银行等等。

  • JavaME(Java Micro Edition):嵌入式Java,主要用于开发嵌入式设备的产品,例如塞班手机游戏(已经消亡)。

由于Java主要的擅长领域是企业级后台服务开发、Android移动应用开发以及大数据应用开发,而Java语言是它们的基石语言,因此无论是从事企业级后台服务开发,还是Android以及大数据应用开发,都要先从JavaSE入门,然后根据自己的职业方向选择企业级应用开发技术栈、Android应用开发技术栈和大数据应用开发技术栈。

相关文章: