SapInterview

Picasun ECNU_Jinggg

自我介绍

技术面试

oop

  • 面向对象编程的三个核心特征是:

    • 封装:隐藏对象的内部状态和实现细节,仅通过方法对外交互。
    • 继承:允许新类接收现有类的属性和方法,促进代码复用。
    • 多态:允许不同的对象对同一操作做出不同的响应,增加灵活性。
  • https://refactoringguru.cn/design-patterns/catalog

  • 设计模式(Design Patterns)是软件工程中的一种最佳实践,它是在特定情况下经过验证的、可复用的解决方案。设计模式通常用于解决在软件设计过程中遇到的常见问题。设计模式可以分为三大类:

    • 创建型模式(Creational Patterns):这些模式提供了创建对象的最佳方式,以便在创建过程中增加灵活性和可复用性。常见的创建型模式包括:
      • 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。
    • 结构型模式(Structural Patterns):这些模式涉及对象的组合,以获得更大的结构。常见的结构型模式包括:
      • 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。
    • 行为型模式(Behavioral Patterns):这些模式专注于对象间的通信。常见的行为型模式包括:
      • 备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
  • 面向对象设计原则简略版:

    • 单一职责原则(SRP):一个类只负责一项功能,减少复杂度。
    • 开放封闭原则(OCP):类对扩展开放,对修改封闭,支持功能扩展。
    • 里氏替换原则(LSP):子类可以替换父类,且不改变功能。
    • 接口隔离原则(ISP):接口要细化,避免不必要的依赖。
    • 依赖倒转原则(DIP):高层模块不依赖低层模块,而是依赖抽象。
    • 合成复用原则(CRP):通过组合而非继承实现复用。
    • 迪米特法则(LoD):减少对象之间的依赖,降低耦合度。
  • Go的面向对象方法:

    • 没有类(Class): Go没有传统意义上的类(class),而是通过结构体(struct)来定义对象的属性。 结构体通过方法(method)为其提供行为。
    • 接口(Interface): Go的接口是隐式实现的,一个类型只要实现了接口定义的方法,就自动实现了该接口,不需要显式声明。 这种特性使得Go具有很高的灵活性和可扩展性。
    • 封装: Go的封装通过大写字母(public)和小写字母(private)来控制字段和方法的可见性,而不是传统语言中的访问修饰符。
    • 组合而非继承: Go没有继承(inheritance)机制。取而代之的是组合(Composition),即通过将一个结构体嵌入到另一个结构体中,实现对象的复用。 Go通过结构体组合而非继承来实现代码重用,避免了传统OOP中的继承层次问题。
    • 多态: Go的多态通过接口实现,一个类型通过实现接口中的方法集来实现多态。接口方法的调用是动态的,类似于其他面向对象语言的多态实现。
  • 其他传统面向对象语言(如Java、C++)的面向对象方法:

    • 类与对象: 传统的面向对象语言通过类(Class)来定义对象的蓝图,并通过类实例化对象。 类中包含字段(属性)和方法(行为),类是面向对象的核心概念。
    • 封装: 封装是面向对象的基本特性之一,通常通过访问控制修饰符(如public、private、protected等)来实现字段和方法的封装,控制对象的外部访问。
    • 继承: 继承是面向对象的重要特性,通过父类和子类的关系来实现代码复用和扩展。 子类可以继承父类的属性和方法,并可以重写父类的方法。
    • 多态: 多态在传统面向对象语言中通过类继承和接口实现。子类可以重写父类方法,或通过接口引用来动态决定对象的行为。
    • 接口与实现: 在传统面向对象语言中,接口是显式声明的,类型必须显式声明实现某个接口,并提供接口方法的实现。
  • 方法重载和重写

    • 重写(Override):是子类对父类允许方位的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写。
      • 假设有一个父类 Animal,它有一个方法 makeSound(),表示动物发出声音。子类 Dog 重写了 makeSound() 方法,实现了狗叫的声音。此时,Dog 类中的 makeSound() 方法和 Animal 类中的 makeSound() 方法具有相同的签名(方法名、参数列表、返回类型),但具体的实现逻辑不同。
    • 重载(Overload):是在一个类里面,方法名字相同,二参数不同。返回类型可以相同也可以不同,每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
      • 运算符重载、方法重载
      • 假设有一个类 Calculator,它有多个 add() 方法,用来计算不同类型的加法。一个 add() 方法接收两个整数,另一个 add() 方法接收两个浮点数,还有一个 add() 方法接收一个整数和一个浮点数。虽然方法名相同,但由于参数列表不同(参数类型或数量不同),这些方法构成了重载。

数据库

https://xiaolincoding.com/mysql/

  • 分析查询速度慢的原因,提出解决方案

      1. 数据库结构问题
      • 原因:表结构设计不合理,如字段类型不匹配、冗余字段多、缺乏合适的索引等。
      • 解决方案
        • 优化表结构,选择合适的字段类型。
        • 移除不必要的冗余字段。
        • 添加合适的索引以加快查询速度。
      1. 缺少或不合适的索引
      • 原因:没有为查询中涉及的字段创建索引,或者索引创建得不恰当。
      • 解决方案
        • 分析查询语句,确定需要创建索引的字段。
        • 创建合适的索引,如单列索引、复合索引等。
        • 定期维护索引,删除不再需要的索引
      1. 查询语句效率低
      • 原因:查询语句设计不合理,如使用了SELECT *、复杂的JOIN操作、子查询、不当的函数使用等。
      • 解决方案
        • 优化查询语句,避免使用SELECT *,尽量指定需要的列。
        • 简化JOIN操作,使用合适的JOIN类型。
        • 避免在WHERE子句中使用复杂的函数或表达式。
        • 减少子查询的使用,可以考虑将子查询转换为JOIN操作。
      1. 数据库服务器性能问题
      • 原因:服务器硬件资源不足,如CPU、内存、磁盘I/O等。
      • 解决方案
        • 升级服务器硬件,如增加内存、使用更快的磁盘等。
        • 优化服务器配置,如调整内存分配、优化I/O性能等。
      1. 数据库配置不当
      • 原因:数据库的配置参数不适合当前的负载情况。
      • 解决方案
        • 调整数据库配置参数,如缓冲区大小、连接数限制等。
        • 使用数据库性能监控工具来分析和调整配置。
      1. 网络问题
      • 原因:客户端与数据库服务器之间的网络延迟。
      • 解决方案
        • 优化网络配置,减少网络延迟。
        • 如果可能,将数据库服务器迁移到离客户端更近的地理位置。
      1. 锁和并发问题
      • 原因:高并发环境下的锁争用问题。
      • 解决方案
        • 优化事务的大小和持续时间,减少锁争用。
        • 使用合适的事务隔离级别来减少锁的争用。
      1. 使用慢查询日志
      • 原因:未利用数据库的慢查询日志来分析慢查询。
      • 解决方案
        • 开启数据库的慢查询日志,记录执行时间超过阈值的查询。
        • 分析慢查询日志,找出性能瓶颈并进行优化。
  • ACID是数据库事务的四个关键属性,用于确保数据的可靠性和一致性:

    • 原子性(Atomicity):事务要么完全成功,要么完全失败,不会结束在中间某个点。
    • 一致性(Consistency):事务确保数据库从一个一致的状态转换到另一个一致的状态。
    • 隔离性(Isolation):并发执行的事务彼此隔离,互不干扰。
    • 持久性(Durability):一旦事务提交,其结果就是永久性的,即使系统故障也不会丢失。
  • 数据库规范化(Normalization)的简化概念是将数据库结构分解成更简单的结构,以减少数据冗余并提高数据一致性。主要范式包括:

    • 第一范式(1NF):每列都是不可分的原子值。
    • 第二范式(2NF):在1NF的基础上,非主属性完全依赖于主键。
    • 第三范式(3NF):在2NF的基础上,非主属性不传递依赖主键。
    • BC范式(BCNF):在3NF的基础上,要求每个决定因素都是候选键。
      • 这意味着,除了候选键之外,其他属性不能决定表中其他任何一列的值。
    • 第四范式(4NF):消除多值依赖。
      • 是指在一个关系表中,如果某个属性集 A 确定另一个属性集 B,而这个关系中还可以存在属性集 C 与 B 无关,则称 A 多值依赖于 B。换句话说,A 决定 B 和 C 时,B 和 C 是彼此独立的。
    • 第五范式(5NF):消除连接依赖,确保数据可重组不丢失。
  • 列存储的缺点:

    • 写入和更新慢:不适合频繁更新和插入。
    • 事务性能差:不适合频繁事务操作。
    • 内存开销大:压缩和索引带来额外内存占用。
  • 列存储的应用场景:

    • 数据分析和聚合查询(如BI、OLAP):适合大规模数据聚合。
    • 数据仓库和日志分析:适合只读或少量写操作的场景。
    • 高压缩场景:大量重复数据的压缩效果更好。
  • 列存储适合高效的数据分析和聚合计算,但在频繁更新和事务型操作中表现不佳。

  • 事物隔离级别
    https://xiaolincoding.com/os/4_process/pessim_and_optimi_lock.html

  • B 树和 B+ 树的结构区别

    • B 树:
      • 每个节点都存储键值和数据指针(或数据记录)。
      • 内部节点和叶子节点都包含键值和数据,叶子节点之间无指针连接。
      • 查询时可以在非叶子节点中找到目标数据。
    • B+ 树:
      • 所有数据都存储在叶子节点中,内部节点仅存储键值和指向子节点的指针,不直接存储数据。
      • 叶子节点之间按顺序双向链表连接,方便范围查询。
      • 查询时必须到叶子节点才能找到目标数据。
  • B+ 树相对 B 树的优势

    • 查询效率更高:B+ 树的所有数据都在叶子节点上,每次查询必须从根节点到叶子节点,因此查询路径固定且较短,容易优化。
    • 范围查询效率高:B+ 树的叶子节点通过链表连接,可以顺序扫描,特别适合 MySQL 中的范围查询需求。
    • 更高的磁盘利用率:B+ 树的非叶节点不存储数据,仅存储键和指针,使得每个节点可以存储更多的键值,减少了树的高度,降低了磁盘 I/O 次数。
    • 稳定的查找速度:由于所有数据都在叶子节点上,查找过程和路径长度一致,因此 B+ 树的查找速度较为稳定。

操作系统

  • 进程 线程 调度

  • 死锁的四个必要条件:

    • 互斥条件:一个资源只能被一个进程或线程占用。
    • 非抢占条件:已分配给一个进程的资源,不能被其他进程强制抢占。
    • 占有并等待条件:一个进程或线程占有一个资源,并且等待其他进程的资源。
    • 循环等待条件:多个进程或线程之间形成环形等待链。
  • 避免死锁的策略:

    • 破坏互斥条件:通过共享资源或者非互斥的方式来避免死锁。
    • 破坏非抢占条件:允许线程在等待其他资源时释放已占用的资源。
    • 破坏占有并等待条件:要求线程在申请资源时,必须一次性申请所有需要的资源。
    • 破坏循环等待条件:通过对资源申请顺序进行统一排列,避免环形等待。
  • 死锁的预防和解决方法:

    • 资源分配策略:例如银行家算法,通过对进程资源的请求进行判断,确保系统始终处于一个安全状态。
    • 检测与恢复:定期检测系统中的死锁,若发生死锁,选择某个进程终止或者回滚来打破死锁。
    • 超时机制:让进程等待一段时间后,主动释放已获得的资源,避免死锁。
  • 多线程编程的难点及解决方法:

    • 死锁:
      • 问题:多个线程互相等待对方释放资源,导致程序卡住。
      • 解决方法:避免循环依赖资源,可以通过排序资源请求、使用超时机制等方式来避免死锁。
    • 竞态条件、线程安全:
      • 问题:多个线程并发访问共享数据并修改,可能导致数据不一致。
      • 解决方法:使用锁(如互斥锁 Mutex)、使用线程安全的数据结构(如 Go 的 sync.Mutex)、原子操作等,确保对共享资源的独占访问。
    • 线程通信:
      • 问题:线程之间如何有效传递信息,避免竞争条件。
      • 解决方法:使用线程间通信机制(如消息队列、信号量、Go 的 channel)确保数据的有序传递。
    • 线程调度:
      • 问题:过多的线程切换会导致性能下降。
      • 解决方法:合理设计线程池,减少不必要的线程创建与销毁,控制并发线程数量

网络

算法

  • DFS在AI中的应用
    • 路径规划:用于迷宫、机器人导航等路径查找问题。
    • 解空间搜索:在数独、八皇后等问题中搜索所有可能解。
    • 博弈树搜索:在游戏AI中探索可能决策,结合α-β剪枝提高效率。
    • 逻辑推理和规划:用于验证目标是否可达。
  • 优缺点
    • 优点:内存占用低,适合深层搜索,可快速找到一种解。
    • 缺点:可能陷入深度路径,不保证找到最优解。

  • 避免侵犯用户隐私的爬虫措施

    • 之前
      • 遵守robots.txt:尊重网站爬取规则。
      • 获取授权:如有需要,联系网站获得许可。
    • 进行中
      • 避免抓取敏感数据:避免收集个人信息。
      • 不爬取登录保护区:避免访问需要登录的信息。
      • 限制爬取频率:减少对网站的负担。
    • 之后
      • 匿名化处理:去标识化用户数据。
      • 提供数据删除机制:确保用户能删除其数据。
  • AI 企业

    • 客户管理
      • 客户服务:聊天机器人、语音识别
      • 营销与销售:个性化推荐、市场分析
    • 运营优化
      • 自动化与效率提升:智能流程自动化(RPA)、供应链优化
      • 生产与制造:智能制造、机器人自动化
    • 决策支持
      • 数据分析与决策支持:大数据分析、预测分析
      • 金融与风险管理:欺诈检测、信用评分
    • 人力资源管理
      • 人才招聘:简历筛选、候选人分析
      • 员工绩效分析:绩效评估和决策支持
    • 产品与创新
      • 产品研发与创新:AI设计、仿真与模拟
  • 敏捷开发是一种灵活的开发方法,强调快速交付、持续改进和客户参与。主要特点包括:

    • 迭代和增量:通过短期迭代,逐步交付功能。
    • 客户参与:客户持续反馈,调整需求。
    • 持续改进:每次迭代后进行反思和优化。
    • 团队合作:高效沟通和协作。
    • 灵活应变:快速响应需求变化。
    • 常见方法有 Scrum、Kanban 和 XP(极限编程)。适用于需求不确定或变化快的项目。
  • 开发人员(Developer)

    • 开发人员负责编码和实现产品功能,是实现需求的核心力量。
    • 编码与实现功能
    • 测试与保证代码质量
    • 参与会议与协作
    • 持续改进开发流程
    • 开发人员不仅写代码,还与团队紧密合作,确保快速响应需求变化并交付高质量产品。
  • 产品负责人(Product Owner)

    • 产品负责人定义需求和优先级,确保开发团队理解并交付正确的功能。
    • 定义产品需求
    • 管理产品待办事项列表
    • 参与迭代计划会议
    • 验证交付内容
    • 产品负责人是团队与客户的桥梁,确保产品开发符合需求,并根据反馈调整方向。
  • 软件测试方法:

    • 功能测试:验证软件功能是否符合需求。
    • 性能测试:检查软件在不同负载下的表现。
    • 回归测试:验证修改后功能是否正常,避免影响其他部分。
    • 兼容性测试:确保软件在不同操作系统和设备上兼容运行。
    • 安全测试:发现软件中的安全漏洞。
    • 用户体验测试:确保界面友好,用户体验良好。
    • 探索性测试:根据经验随机测试软件,寻找潜在问题。
  • 堆与栈对比

特性
存储内容 局部变量、函数调用等 动态分配的对象、数据结构
内存管理方式 静态分配,自动管理 动态分配,程序员手动管理或垃圾回收
分配速度 较慢
生命周期 自动管理,随函数的调用和返回 手动管理,直到显式释放或垃圾回收
内存限制 较小,受操作系统限制 较大,受系统总内存限制
优缺点 速度快,但内存有限 灵活且能存储大数据,但管理复杂
  • 总结:
      • 用于存储局部变量和函数调用。
      • 内存分配快,自动管理,但空间较小,内存不能动态增长。
      • 适合用于存储生命周期明确、大小固定的数据。
      • 用于动态分配内存,如对象和动态数据结构。
      • 内存分配较慢,且需要手动管理或依赖垃圾回收机制,但空间较大,能存储更多的数据。
      • 适合用于存储需要动态变化的对象或较大数据。

语言

  • Node:
    • 在计算机科学中,”Node” 通常指的是网络中的一个连接点,它可以是一台计算机、服务器、路由器或者任何可以发送、接收和转发数据的设备。在编程和数据结构中,”Node” 指的是一个基本单元,它通常包含数据和指向其他节点的链接,是构成链表、树、图等数据结构的基础。
  • JS:
    • “JS” 通常是 “JavaScript” 的缩写,这是一种广泛使用的编程语言,主要用于网页开发,以实现网页的动态交互功能。JavaScript 也可以用于服务器端(通过 Node.js)、桌面应用、移动应用等多种环境中。
  • Node.js:
    • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许 JavaScript 代码在服务器端运行。这意味着开发者可以使用 JavaScript 来编写服务器端逻辑,而不是仅限于客户端的网页交互。Node.js 采用了非阻塞 I/O(输入/输出)模型和事件驱动架构,这使得它非常适合处理大量并发连接,因此它在构建高性能网络应用方面表现出色。
    • Node.js 支持模块化开发,拥有庞大的第三方库生态系统 npm(Node Package Manager),开发者可以通过 npm 安装和共享代码。
  • 总结来说,”Node” 可以指网络中的一个连接点或数据结构中的一个基本单元,”JS” 是 JavaScript 语言的缩写,而 “Node.js” 是一个让 JavaScript 能够在服务器端运行的环境。

SAP

  • SAP公司的主要特点:
    • 企业资源规划(ERP)软件:SAP以开发ERP软件而闻名,这些软件帮助企业整合和管理核心业务流程,包括财务、人力资源、供应链管理、客户关系管理等。
    • 广泛的产品线:除了ERP软件,SAP还提供云解决方案、商务智能工具、应用开发平台和其他软件产品。
    • 全球影响力:SAP是全球最大的企业应用软件和解决方案提供商之一,服务于全球各地的公司,包括许多财富500强企业。
    • 创新和研发:SAP持续在云计算、大数据、人工智能、物联网和机器学习等新兴技术领域进行研发和创新。
    • 多样化的客户服务:SAP提供多种服务,包括咨询、实施支持、培训和技术支持,帮助客户成功部署和使用其软件。
    • 生态系统:SAP拥有一个庞大的合作伙伴网络,包括系统集成商、独立软件供应商和咨询公司,共同为客户提供服务。

开发方案

  • 开发方案:上下游之间的关系理清 代码结构(开发 测试 上线 流程)

  • 技术评审:开会 可行性 消耗预估 耗时 QPS

  • 开发阶段:

  • 测试阶段:

    • 线下环境 BOE 完全隔离
    • 线上 小流量 POE
  • 正常上线

    • 灰度上线 一部分流量走新上线 一部分原来
    • 分机房 小流量上 看接口问题 swagger 日志
    • 监控台 接口QPS cpu负载 接口耗时
  • 不正常上线

    • 接口耗时过高 下游接口出问题
      • 数据库查询导致 要不要加缓存
    • CPU资源暴增 线程释放问题
    • 版本回滚 git
  • 文档和代码不一致

    • 加强定期交流协作
    • 自动化文档生成工具
    • 确定文档为开发流程的一部分
    • 定期的审核和更新文档
  • 主库和副库代码不一致问题

    • 直接读主库 服务器负载压力
    • 强制同步 再进行读 (举例子 数据重要程度 亏钱问题)
    • 通过锁来进行控制

Web开发三层架构
controller:控制层,接收前端发送的请求,处理请求并响应数据
service:业务逻辑层
dao:数据访问层,负责数据访问操作

群面问题

  • 语言Go

    • 简单易学:语法简洁,开发效率高。
    • 高效并发:内置协程(goroutine)和通道(channel),适合高并发。
    • 编译快:编译速度快,生成小型可执行文件,便于部署。
    • 自动内存管理:垃圾回收(GC)机制,减少内存管理负担。
    • 强大标准库:丰富的标准库,便于网络和系统级开发。
    • 跨平台支持:编译后可直接在不同操作系统运行。
    • 类型安全:静态类型语言,增强代码安全性。
  • SAP 在区块链领域的主要贡献和工作集中在以下几个方面:

    • 区块链平台集成: SAP 提供了 SAP Cloud Platform Blockchain,允许企业通过云服务快速部署和管理区块链解决方案。这个平台支持多种区块链技术,包括 以太坊 和 Hyperledger 等。通过这一平台,企业可以在现有业务流程中整合区块链技术,如智能合约和去中心化应用(DApps)。
    • 智能合约和供应链管理: SAP 集成了 智能合约 功能,尤其是在供应链管理中,利用区块链提高透明度、减少欺诈,并确保交易的可靠性。例如,企业可以通过智能合约在区块链上自动执行合同条款,从而实现更高效的供应链操作。
    • 区块链即服务(BaaS): SAP 提供了区块链即服务(Blockchain as a Service,BaaS),为企业提供一个快速、灵活的开发平台,使其能够创建和管理基于区块链的应用。这使得企业无需自己搭建区块链基础设施,即可轻松实现智能合约、数据共享和去中心化交易等功能
    • 与企业合作的实际应用: SAP 在一些实际的行业应用中,采用了区块链技术帮助企业优化业务流程。例如,食品溯源和跨境支付等场景,企业能够通过区块链提高透明度、简化流程,并减少交易成本。
    • 合作与联盟: SAP 也与多家区块链公司和技术合作伙伴合作,包括与 IBM(Hyperledger)和 以太坊 的合作。通过这些合作,SAP 能够将区块链技术融入其产品生态,并为企业提供多种选择。
  • 特点

    • sync.WaitGroup 控制 goroutine 的⽣命周期
    • 通道(channel)来通知 goroutine 退出
  • Post title:SapInterview
  • Post author:Picasun
  • Create time:2024-11-11 15:46:21
  • Post link:https://redefine.ohevan.com/2024/11/11/SapInterview/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.