程序员面试

1.反问公司:

  1. 目前团队规模?
  2. 团队目前工作计划如何?
  3. 开发产品公司设定的时间流程?
  4. 平均一周开几次会?

良好的编程习惯

代码风格、注释、代码稳健性、防御性变成、测试容易、代码复用、选择正确的设计模式、慎用全局变量、变量命名清晰

简述几种编程语言的特点、差异、适用场景

1. Java( 编译成字节码+JVM 解释执行)
  • 特点:Java是一种面向对象的编程语言,强调“一次编写,到处运行”(Write Once, Run Anywhere, WORA),具有良好的跨平台特性。
  • 差异:Java代码编译成字节码(Bytecode),然后由Java虚拟机(JVM)解释执行,这增加了程序的移植性,但也可能导致性能略逊于直接编译成本地代码的语言。字节码可以在任何安装了 Java 虚拟机(JVM)的平台上运行,实现了“一次编写,到处运行”(Write Once, Run Anywhere)的目标。
  • 适用场景:企业级应用、Android应用开发、大数据处理、云计算平台等。
2. Python(解释性语言,即时读取执行)
  • 特点:Python是一种高级动态类型语言,以其简洁易读的语法著称,非常适合快速开发。
  • 差异:Python支持多种编程范式,包括面向对象、命令式、函数式等,同时也因其解释执行而被认为不如编译语言快。
  • 适用场景:数据科学、机器学习、Web开发(如Django框架)、自动化脚本、教育领域等。
3. JavaScript
  • 特点:JavaScript是一种主要用于客户端脚本的编程语言,现在也被广泛应用于服务器端(如Node.js)。
  • 差异:JavaScript是一种动态类型语言,支持事件驱动、函数式编程和面向对象编程。它与DOM(文档对象模型)紧密结合,使得网页具有交互性。
  • 适用场景:Web前端开发、Web后端开发、游戏开发、桌面应用等。
4. C/C++(编译语言,转机器代码)
  • 特点:C和C++是两种紧密相关的编程语言,它们都是静态类型语言,支持低级别的内存操作。
  • 差异:C++在C的基础上增加了面向对象的特性,提供了类和对象的概念,使得C++更适合开发复杂的软件系统。
  • 适用场景:操作系统、游戏引擎、嵌入式系统、高性能服务器、桌面应用等。
5. Go (Golang)
  • 特点:Go是一种由Google开发的开源编程语言,设计初衷是为了提高开发效率和程序性能。
  • 差异:Go语言具有简洁的语法,内置对并发的支持(通过goroutines和channels),编译速度快。

简述互联网的工作原理

image-20240910095944809

互联网是一个全球性的计算机网络,它允许各种设备和服务器之间进行数据交换和通信。互联网的工作原理可以概括为以下几个关键步骤:

  1. IP地址和域名系统(DNS)
    • 每个连接到互联网的设备都有一个唯一的IP地址,用于标识设备在网络上的位置。
    • 域名系统(DNS)将人类可读的域名(如 www.example.com)转换为机器可读的IP地址。
  2. 数据包和路由
    • 信息在互联网上以数据包的形式传输。每个数据包包含发送者和接收者的IP地址。
    • 路由器是互联网上的关键设备,它们根据数据包中的地址信息决定数据包的传输路径。
  3. 传输控制协议(TCP)和互联网协议(IP)
    • TCP/IP是互联网通信的基础协议。TCP负责确保数据的正确传输,而IP负责数据的实际传输。
    • TCP通过三次握手过程建立连接,并在数据传输过程中进行错误检测和重传。
  4. 网络接口
    • 用户通过各种网络接口(如Wi-Fi、以太网等)连接到互联网。
  5. 服务器和客户端
    • 服务器是提供资源(如网页、文件、服务)的计算机。
    • 客户端是请求资源的设备,如个人电脑、智能手机等。
  6. 超文本传输协议(HTTP)
    • HTTP是用于从服务器传输超文本到本地浏览器的协议。
    • 当用户在浏览器中输入网址时,浏览器通过HTTP请求从服务器获取网页内容。
  7. 网络安全
    • 为了保护数据传输的安全,互联网使用加密技术(如SSL/TLS)来加密数据。
  8. 内容分发网络(CDN)
    • CDN是一组分布在全球的服务器,用于缓存和分发内容,以减少延迟和提高访问速度。

互联网的工作原理涉及多个层次的技术和协议,它使全球范围内的设备能够相互通信。下面是一个简要的概述,解释了数据如何从一台设备传输到另一台设备的过程:

1. 应用层
  • 应用程序:用户通过各种应用程序(如Web浏览器、电子邮件客户端、社交媒体应用)与互联网互动。这些应用程序使用特定的协议来发送和接收数据,例如HTTP(用于Web)、SMTP(用于邮件传输)等。
2. 传输层
  • TCP/IP:传输控制协议(TCP)和用户数据报协议(UDP)是两种常用的传输层协议。TCP提供可靠的、面向连接的服务,确保数据包按顺序到达且没有丢失;UDP则提供了一种无连接的服务,速度快但不保证可靠性。
  • 端口号:传输层使用端口号来标识主机上的特定应用程序,使得多个应用程序可以在同一台主机上同时工作而不互相干扰。
3. 网络层
  • IP地址:互联网协议(IP)为每个连接到互联网的设备分配一个唯一的地址(IPv4或IPv6),以便识别和路由数据包。
  • 路由:路由器使用路由表来决定数据包的最佳路径。数据包从源地址出发,经过一系列的路由器,最终到达目标地址。
  • NAT(网络地址转换):在家庭或企业网络中,NAT允许内部网络使用私有IP地址,而通过一个公共IP地址与外部网络通信。
4. 数据链路层
  • MAC地址:每个网络接口都有一个硬件地址(MAC地址),用于在网络层下的物理网络中标识设备。
  • :数据链路层将来自网络层的数据封装成帧,并在物理网络上传输这些帧。常见的数据链路层协议包括以太网(Ethernet)。
5. 物理层
  • 信号传输:物理层负责将比特流转换为电信号、光信号或其他物理信号,并通过电缆、光纤或无线介质进行传输。
  • 硬件设备:包括调制解调器、交换机、路由器、网卡等,这些设备共同构成了物理网络的基础设施。

具体步骤

  1. 发起请求:用户通过应用程序(如Web浏览器)向服务器发起请求。
  2. 打包数据:请求首先被分割成较小的数据单元(如TCP段),每个段包含源端口、目的端口、序列号等信息。
  3. 封装数据包:每个数据单元被封装成IP数据包,添加源IP地址和目的IP地址。
  4. 路由选择:数据包通过路由器在网络中传递,直到到达目的地。
  5. 传输数据:到达目的地后,数据包被重组为原始请求,并由服务器处理。
  6. 响应请求:服务器生成响应,重复上述过程将数据传回客户端。
  7. 显示结果:客户端应用程序接收到响应数据,并将其呈现给用户。

互联网的工作原理涉及复杂的协议栈和技术细节,但以上概述了基本流程。每个层次都有其特定的功能,共同作用于确保数据能够准确、高效地在网络中传输。

简述HTTP协议

HTTP(超文本传输协议,HyperText Transfer Protocol)是一种应用层协议,用于从Web服务器向浏览器传送超媒体文档,例如HTML文件。它是构建万维网的基础,定义了客户端(通常是Web浏览器)与服务器之间如何通信的规则。以下是HTTP协议的一些基本概念和特点:

image-20240910084924731

基本概念
  • 请求/响应模型:HTTP是一个基于请求/响应模型的无状态协议。客户端向服务器发送一个请求,服务器收到这个请求后,会返回一个响应。
  • URI/URL:统一资源标识符(Uniform Resource Identifier),通常称为URL(Uniform Resource Locator),用来标识一个资源的位置以及访问该资源的方法。
  • 消息结构
    • 请求消息包括请求行、请求头、实体主体等部分。
    • 响应消息包括状态行、响应头、实体主体等部分。
主要特点
  • 无状态性:HTTP协议本身是无状态的,意味着每个请求都是独立的,服务器不会保存关于客户端的任何信息。为了实现状态保持(如用户认证),需要使用诸如Cookie或Session等机制。
  • C/S架构:HTTP遵循客户端/服务器模式,其中客户端发起请求,服务器负责处理请求并返回响应。
  • 可缓存性:HTTP支持缓存机制,可以减少网络流量,加快页面加载速度。
  • 安全性:通过HTTPS(HTTP over SSL/TLS),HTTP可以加密传输的数据,保证了通信的安全性。

介绍一下常见的状态码

HTTP状态码是服务器响应请求时返回的代码,用于告知客户端请求的处理结果。状态码分为五类,每类都对应不同的响应情况:

1xx(信息性状态码)
  • 100 Continue:表明服务器已接收到请求的一部分,正在等待剩余部分。
  • 101 Switching Protocols:表明服务器已理解请求,并将通过Upgrade头信息进行协议切换。
2xx(成功状态码)
  • 200 OK:请求成功,服务器返回请求所希望的响应。
  • 201 Created:请求成功,并且服务器创建了新的资源。
  • 202 Accepted:服务器已接受请求,但尚未处理。
  • 204 No Content:服务器成功处理了请求,但没有返回任何内容。
3xx(重定向状态码)
  • 300 Multiple Choices:请求的资源可有多种选择,服务器默认返回这个状态码。
  • 301 Moved Permanently:请求的资源已被永久移动到新的URL。
  • 302 Found:临时重定向,类似于301,但资源的移动是临时的。
  • 303 See Other:建议客户端通过GET方法获取资源。
  • 304 Not Modified:资源未修改,可使用缓存中的版本。
  • 307 Temporary Redirect:与302类似,但不允许从POST变成GET。
  • 308 Permanent Redirect:与301类似,但不允许从POST变成GET。
4xx(客户端错误状态码)
  • 400 Bad Request:服务器无法理解请求格式,客户端请求错误。
  • 401 Unauthorized:请求需要用户的身份认证。
  • 403 Forbidden:服务器理解请求客户端的请求,但是拒绝执行此请求。
  • 404 Not Found:服务器找不到请求的资源。
  • 405 Method Not Allowed:请求方法(如GET、POST)不被允许。
  • 408 Request Timeout:请求超时。
  • 409 Conflict:请求与服务器当前状态冲突。
  • 410 Gone:请求的资源已被永久删除。
5xx(服务器错误状态码)
  • 500 Internal Server Error:服务器遇到错误,无法完成请求。
  • 501 Not Implemented:服务器不支持请求的功能,无法完成请求。
  • 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。
  • 503 Service Unavailable:服务器目前无法使用(由于超载或停机维护)。
  • 504 Gateway Timeout:网关或代理服务器在等待上游服务器响应时超时。
  • 505 HTTP Version Not Supported:服务器不支持请求的HTTP协议版本。

简述 Session 与 JWT 的区别

image-20240910101226904

image-20240910101833686

Session 和 JSON Web Tokens (JWT) 是两种常用的身份验证机制,它们各有特点和适用场景。以下是这两种机制的主要区别:

Session(基于会话的身份验证)

过程

  1. 用户登录:用户通过提交用户名和密码来登录系统。
  2. 服务器验证:服务器验证用户的凭据是否正确。
  3. 创建Session:一旦验证成功,服务器会在服务器端创建一个唯一的Session,并生成一个Session ID。
  4. 存储Session ID:服务器将Session ID作为一个cookie发送给客户端。客户端将此cookie存储在本地,并在后续的每个请求中自动附带这个cookie。
  5. 客户端发送请求:客户端在后续的请求中会自动携带包含Session ID的cookie。
  6. 服务器验证Session:服务器接收到请求后,会从cookie中提取Session ID,并在服务器端查找与之对应的Session信息。
  7. 授权操作:如果找到有效的Session,则服务器认为用户已通过身份验证,并根据用户权限返回相应的响应。
  8. Session过期或销毁:Session会有一个有效期,超过这个期限后会自动失效。此外,也可以手动销毁Session。

特点

  1. 服务器端存储:在传统的基于Session的身份验证机制中,服务器会在用户成功登录后生成一个唯一的Session ID,并将其存储在服务器端(通常是内存或数据库中)。这个Session ID会被存储在客户端的一个cookie中,每次请求时都会附带这个cookie。
  2. 状态保持:由于Session ID存储在服务器端,因此服务器可以保持用户的登录状态,直到Session过期或被手动销毁。
  3. 安全性:Session机制依赖于cookie的安全性,因此需要采取措施防止Session劫持攻击,比如使用HTTPS、设置cookie为HttpOnly和Secure。
  4. 跨域问题:由于Session依赖于cookie,而cookie默认不会随跨域请求一起发送,因此Session机制在跨域的情况下可能需要额外的配置或技术手段来实现。
  5. 可扩展性:随着用户数量的增加,Session的存储可能会成为瓶颈,特别是在分布式环境中,需要共享Session状态或使用Session复制技术。
JWT (JSON Web Token)(网络令牌)

过程

  1. 用户登录:用户通过提交用户名和密码来登录系统。
  2. 服务器验证:服务器验证用户的凭据是否正确。
  3. 生成JWT:一旦验证成功,服务器会生成一个JWT,其中包含用户的身份信息和其他必要的声明(claims)。
  4. 发送JWT:服务器将生成的JWT作为响应的一部分发送给客户端。
  5. 客户端存储JWT:客户端将接收到的JWT存储在本地(如localStorage、sessionStorage或cookie中)。
  6. 客户端发送请求:客户端在后续的每个请求中都将JWT放在HTTP头部的Authorization字段中,格式通常是Bearer <token>
  7. 服务器验证JWT:服务器接收到请求后,会从Authorization头部获取JWT,并对其进行验证(如检查签名、校验过期时间等)。
  8. 授权操作:如果JWT有效,服务器会解析JWT中的信息,并根据用户权限返回相应的响应。
  9. JWT过期或刷新:JWT有一个固定的过期时间(Expiration time, exp claim),一旦过期,客户端需要通过刷新Token(refresh token)机制来获取新的JWT。

特点

  1. 客户端存储:JWT是一种无状态的身份验证机制,Token是由服务器生成并发送给客户端的。客户端将这个Token存储在本地(如localStorage或sessionStorage),并在每次请求时将其放在HTTP头的Authorization字段中。
  2. 自我包含:JWT包含用户身份信息和其他声明(claims),这些信息被加密签名,因此不需要在服务器端存储对应的状态信息。
  3. 状态无感知:由于JWT是自我包含的,服务器只需要验证Token的有效性即可,不需要查询数据库来确认用户身份。
  4. 跨域友好:JWT可以很容易地在跨域请求中使用,因为它不依赖于cookie。
  5. 安全性:JWT的安全性依赖于签名算法(如HMAC、RSA等)和密钥管理。只有拥有密钥的服务器才能验证Token的有效性。
  6. 刷新机制:为了保持安全性,JWT通常有较短的有效期。为了维持用户的登录状态,可以使用刷新Token(refresh token)机制,允许用户在Token过期前请求新的Token。

对比

  • 状态管理:Session机制依赖于服务器端的状态管理,而JWT则是无状态的,所有的用户信息都包含在Token中。
  • 安全性:Session通常依赖于cookie的安全性,而JWT的安全性依赖于Token的签名算法和密钥管理。
  • 跨域支持:Session机制在跨域请求中可能存在限制,而JWT则更容易支持跨域请求。
  • 扩展性:随着用户数量的增长,Session机制可能需要考虑服务器端存储的压力,而JWT可以更好地支持分布式环境。

适用场景

  • Session:适用于需要服务器端保持状态的场景,比如需要频繁访问同一服务器的Web应用。
  • JWT:适用于微服务架构、移动应用、API接口等需要无状态、跨域支持的场景

简述并发与并行的区别

image-20240910103307769

并发(Concurrency)
  • 定义:并发是指在同一时间段内,系统看起来像是同时执行多个任务,但实际上这些任务是在交替执行的。在并发模型中,每个任务(或线程)在执行一段时间后可能会让出CPU,让其他任务有机会执行。
  • 特点
    • 多任务交错执行:并发的任务可能会交错执行,即一个任务执行一小段时间后暂停,让另一个任务执行,然后再回到第一个任务继续执行。
    • 共享资源:并发的任务通常需要共享某些资源,如内存、文件、网络连接等,这就需要通过同步机制(如锁、信号量)来协调这些任务之间的交互。
    • 调度:并发的执行需要有一个调度策略来决定哪个任务何时执行。
  • 例子:在一个单核处理器上运行多个应用程序,这些应用程序看起来像是同时运行,但实际上它们是在短时间内交替执行的。
并行(Parallelism)
  • 定义:并行是指真正的同时执行多个任务,这意味着多个任务在同一时刻占用不同的处理资源(如多个CPU核心)进行执行。
  • 特点
    • 真正的同时执行:并行意味着多个任务真的在相同的时刻被执行,而不是交替执行。
    • 硬件支持:并行通常需要硬件的支持,如多核处理器、多处理器系统或多台计算机组成的集群。
    • 任务分解:为了实现并行,任务通常需要被分解成多个可以独立执行的部分。
  • 例子:在多核处理器上同时运行多个线程或进程,这些线程或进程可以真正地同时执行,每个线程或进程分配给一个不同的CPU核心。
区别总结
  • 并发关注的是在单个处理器或单一时间内,通过调度机制使得多个任务看起来像同时执行一样。它侧重于任务间的协调和资源的共享。侧重于逻辑上的并行度,即多个任务在一段时间内交替执行,但看起来像是同时进行
  • 并行指的是多个任务或线程同时执行,通常需要多个处理器或处理器核心的支持。它侧重于通过并行处理来提高系统的整体吞吐量和执行速度。强调的是物理上的同时执行,即多个任务在不同的处理器核心上同时执行
使用场景
  • 并发:适用于需要处理大量交互式任务或需要频繁切换上下文的场景,如Web服务器、数据库管理系统等。
  • 并行:适用于需要高性能计算、大数据处理或图形渲染等需要大量计算资源的场景。

阐述进程和线程的区别

进程(Process)

定义:进程是操作系统进行资源分配和调度的基本单位。一个进程是一个正在执行的程序实例,具有独立的内存空间、文件句柄和其他系统资源。

特点:

  • 独立性:每个进程都有自己的地址空间和系统资源,因此一个进程中的错误不会影响其他进程。
  • 通信机制:进程之间通信(IPC)通常通过文件、管道、套接字等方式进行。
  • 创建和销毁开销大:创建一个新进程需要分配大量的系统资源,销毁进程也需要回收这些资源,因此创建和销毁进程的开销较大。

用途:进程通常用于运行独立的应用程序或服务,比如Web服务器、数据库管理系统等。

线程(Thread)

定义线程是进程内的一个执行单位,是CPU调度和分派的基本单位。一个进程可以包含一个或多个线程,这些线程共享相同的内存空间和其他资源。

特点:

  • 轻量级:相比于进程,线程的创建和销毁开销小得多。
  • 共享资源:同一进程内的所有线程共享相同的地址空间和系统资源,这使得通信更容易。
  • 同步问题:由于共享资源,线程之间需要解决同步问题,以防止数据竞争和死锁等问题。

用途:线程通常用于实现程序内部的并发执行,比如在一个应用程序中同时处理多个任务。

介绍一下主流的API协议

API(应用程序编程接口,Application Programming Interface)协议定义了不同系统之间如何进行通信和共享数据。API协议的选择通常取决于具体的应用场景、所需的功能、性能要求以及安全需求。以下是几种主流的API协议:

1. REST(Representational State Transfer)
  • 特点:REST是一种基于HTTP协议的软件架构风格,它定义了一组约束和原则,用于创建可伸缩的网络服务。
  • 优点
    • 简单易用,使用标准的HTTP方法(GET、POST、PUT、DELETE等)。
    • 无状态性,每个请求都包含所有必要的信息,使得系统更易于维护。
    • 可缓存,支持HTTP缓存机制,可以减少网络负担。
    • 支持多种数据格式(如JSON、XML)。
  • 适用场景:适用于Web应用、移动应用等需要与后台服务进行交互的场景。
2.WebSocket
  • 特点:WebSocket协议提供了全双工通信渠道,允许服务器主动向客户端发送消息。
  • 优点
    • 实时通信,支持双向数据流。
    • 减少了延迟,提高了效率。
    • 可以在HTTP协议之上运行。
  • 适用场景:适用于需要实时通信的应用,如在线聊天、实时股票报价、多人在线游戏等。
3.SOAP(Simple Object Access Protocol)
  • 特点:SOAP是一种基于XML的消息协议,用于在网络上进行信息交换。
  • 优点
    • 标准化程度高,支持多种传输协议(如HTTP、SMTP)。
    • 提供了详细的消息格式和错误处理机制。
    • 强大的安全性支持,如WS-Security。
  • 适用场景:适用于企业级应用,特别是需要高度安全性、事务处理和协议标准化的场景。

开发人员每天常用的10种数据结构

1. 数组(Array)
  • 定义:一组固定大小的同类型元素的集合。
  • 特点:随机访问速度快,插入和删除操作相对较慢。
  • 应用场景:存储和访问固定大小的数据集。
2. 链表(Linked List)
  • 定义:由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。
  • 特点:动态大小,插入和删除操作较快,但随机访问速度较慢。
  • 应用场景:实现队列、栈等数据结构,处理需要频繁插入删除的数据集合。
3. 栈(Stack)
  • 定义:一种后进先出(LIFO)的数据结构。
  • 特点:只能在一端进行插入和删除操作。“后进先出
  • 应用场景:函数调用栈、表达式求值、回溯算法等。
4. 队列(Queue)
  • 定义:一种先进先出(FIFO)的数据结构。
  • 特点:在一端插入元素,在另一端删除元素。“先进先出”
  • 应用场景:任务调度、消息队列、打印队列等。
5. 哈希表(Hash Table)
  • 定义:通过哈希函数将键映射到数组中的位置,从而实现快速查找。
  • 特点:平均情况下,插入、删除和查找的时间复杂度接近O(1)。
  • 应用场景:字典、缓存、数据库索引等。
6. 树(Tree)
  • 定义:一种层次结构的数据结构,由节点组成,每个节点可以有零个或多个子节点。
  • 特点:支持多种操作,如查找、插入、删除。
  • 应用场景:文件系统、DOM树、表达式树等。
7. 二叉树(Binary Tree)
  • 定义:一种特殊的树结构,每个节点最多有两个子节点。
  • 特点:支持多种变种,如二叉查找树(BST)、平衡二叉树(AVL树、红黑树)等。
  • 应用场景:搜索引擎、数据库索引、算法实现等。
8. 堆(Heap)
  • 定义:一种特殊的完全二叉树结构,满足堆属性(父节点的键总是大于或小于子节点的键)。
  • 特点:常用于实现优先队列。
  • 应用场景:堆排序、任务调度、内存管理等。
9. 图(Graph)
  • 定义:由顶点(节点)和边组成的结构。
  • 特点:支持多种类型,如无向图、有向图、加权图等。
  • 应用场景:社交网络、地图导航、推荐系统等。
10. 字典树(Trie)
  • 定义:一种用于存储字符串的树形数据结构。
  • 特点:每个节点代表一个字符,路径代表一个字符串。
  • 应用场景:自动补全、拼写检查、IP路由选择等。

什么叫鲁棒性?

鲁棒性(Robustness)是指系统在异常情况下仍能正常工作的能力。它通常指的是一个系统、模型或算法在面对不确定性和外界干扰时,能够保持稳定性和有效性的一种特性。具体来说,鲁棒性可以体现在以下几个方面:

  1. 抗干扰性:系统能够在存在噪声或干扰的情况下继续正常工作。例如,在通信系统中,即使信号受到一定程度的噪声影响,系统仍能够正确传输数据。
  2. 容错性:系统在部分组件发生故障或失效的情况下,仍然能够维持基本功能。例如,在分布式系统中,即使某些节点失败,整个系统仍能继续运行。
  3. 适应性:系统能够适应外部环境的变化,并在这些变化下依然保持良好的性能。例如,机器学习模型在训练数据与测试数据分布不一致情况下,仍能够给出准确的预测结果。
  4. 稳定性:系统在输入发生变化时,能够保持输出在可接受的范围内。例如,控制系统的输出不会因为输入的小幅波动而剧烈变化。
  5. 通用性:算法或模型在不同的数据集或应用场景下都能表现出良好的性能。例如,一个图像识别算法不仅在特定的数据集上表现良好,还能在其他类型的图像数据上具有较高的识别率。
  6. 健壮性:系统在面临非预期的输入或操作时,不会崩溃或产生不可预测的行为。例如,软件在接收到非法输入时,应该能够优雅地处理错误而不是崩溃。
posted @ 2024-09-23 11:34  德琪  阅读(9)  评论(0编辑  收藏  举报