MENU

技术知识体系,持续更新。。。

2024 年 10 月 30 日 • 访问: 779 次 • 知识网络

忙忙碌碌的工作和日常的学习中,获取到的信息与知识是非常碎片化的,难以入脑,如果要想真正学懂知识,达到学以致用的程度,那就必须要需要形成自己的知识架构体系,这是一个“熵减”的过程,非常痛苦但是却很有意义。幸运的是,许多前辈和大佬们在广阔的互联网世界中,已经整理出来了非常多的博客、资料、知识体系供我们后人参考,站在巨人的肩膀上,我们才可以看得更远。

参考资料
JavaGuide
二哥的Java进阶之路
破晓的知识屋
Java全栈知识体系
小林 x 图解计算机基础

编程基础知识

Java编程基础知识

感觉Java相关的知识比较八股文(有趣),但是面试和各种考试又会经常涉及到,这里主要参考breakDawn(破晓)这位博主的整理的知识体系,进行一个梳理,内容比较杂,但是还挺有参考性的,但是考华为Java可信考试的时候就是看了他整理的帖子复习的,相较于刷题的方式,看Java的知识效率有点低,还容易看着看着就睡着了,但是题目刷完就忘了。。。而且纯粹是为了通过考试吧。所以还是希望通过整理Java的基础知识,夯实基础,将知识内化为自己的东西。

  1. 基础数据类型
  2. 流程控制语句
  3. 类初始化过程/类加载
  4. 类、接口和枚举
  5. 容器(集合、Map)
  6. 异常体系结构设计
  7. 反射:反射、动态代理
  8. IO(流/reader/writer体系结构设计):文件、网络、流的read/write、序列化和反序列化
  9. JDBC/数据库
  10. 多线程编程
  11. 泛型
  12. NIO
  13. JDK工具、调试与定位
  14. Java8、Java11新特性/Stream/MapReduce
  15. Java安全类库/安全管理器
  16. Socket
  17. 垃圾收集(GC)
  18. 其他重要知识点

    1. Java深拷贝和浅拷贝的区别

软件工程与技术

现代软件工程

  • 敏捷开发模式(DevOps)
  • 软件开发团队是如何进行管理的?每日站会管理快速过进展,使用看板方法、燃尽图等可视化进展的工具进行进度管理
  • 轻文档化、快速迭代开发

数据结构与算法

学习数据结构和算法参考资料:
K神的Hello算法

数据结构

  • 线性结构:数组、链表、栈、队列
  • 非线性结构:树、堆、图
  • 哈希表

算法

  • 综合运用

    • 如果有1TB的数据需要排序,但只有32GB的内存如何排序处理?要求考虑性能和安全
    • https://blog.csdn.net/FX677588/article/details/72471357
    • 数据分块需要注意留下系统运行的内存空间,保证系统运行的安全,每个数据分块分别进行排序,再使用额外的内存空间(外排序)进行多路归并排序,通过设置输入缓冲区和输出缓冲区提升排序的性能,多路数据归并排序可以使用优先队列,也就是底层是堆的数据结构进行排序,最后将结果通过处处缓冲区最终写入硬盘。另外提升性能的方法还有

      • (1)使用SSD替代机械硬盘,提升磁盘读写的速度
      • (2)使用更大的内存,提升外排序辅助数组的长度,减少I/O次数
      • (3)多路合并可以通过分层的方式,逐级合并,减少磁盘的I/O
  • 排序算法

排序算法总结

  • 机器学习算法

    • 线性回归
    • K近邻算法(KNN)
    • 朴素贝叶斯(NB)
    • 逻辑回归(LR)
    • 支持向量机(SVM)
    • 决策树(DT)
    • 随机森林(RF)
    • GBDT
    • XGBoost
    • K-Means
  • 安全算法/现代密码学理论

    • RSA(密钥长度不小于2048 bits是安全的,推荐3072bits)
    • ECC 基于椭圆曲线(256bits等价于RSA 3072bits)
    • 哈希算法:SHA256/512是安全、MD5和SHA-1都是不安全的
    • 对称加密算法:DES、3DES都是不安全的,AES-128安全但推荐使用AES-256
    • DH(Diffie-Hellman 密钥交换)
  • 分布式系统算法

    • Paxos算法
    • ZAB协议

软件设计与重构

软件建模

UML图、类图、流程图、时序图。。。

Java的23种设计模式

Java 设计模式还是蛮有意思的,其实刚做项目的时候并没有太多的结构化、工程化的思想在里面,最主要的做法就是 “抄”,你听的没错,所有伟大的创新最开始都是从抄作业开始的。但是,随着不断的深入,维护的工程体量越来越大,对许多模块的原先的写法便会迸发出新的想法和灵感,这是需要经验积累,而非一蹴而就,读完《Java 编程思想》或者是看完 Java 的设计模式就能做到的。

更多的是,在学习完之后,在某天突然发现,好像这个某某模块这种写法有点像 XXX 里面看到这种设计模式,然后回去翻找一下资料,有种恍然间顿悟的感觉。

许多关于 Java 设计模式的书籍或者资料,画了一堆 UML 图也举了很多例子,但是都没有我在知乎上看到的这个系列讲解的清楚,基于一些实例和应用场景去将设计模式,估计笔者有过大量的项目经验才写的出,我这里做一下归档,方便自己后续查询。

设计模式一共有 23 种,分为 5 种构建型模式,7 种结构型模式,以及 11 种行为模式。构建型模式,顾名思义就是构建类(对象),研究如何从现实问题的抽象和建模问题,结构型模式侧重于设计程序的结构,而行为型模式则重点关注类与类之间的交互与协作,三大类的设计模式各有不同的侧重点,体现了面向对象的程序设计的思想。

软件重构

  • 什么是软件重构?

    • 在不改变软件外在行为的前提下,对代码进行修改,以优化程序内部的结构
  • 如何识别代码的坏味道?有哪些手法进行重构?

  • 如何保证重构的质量,如何评判代码重构的好坏,保证重构是可信的?

    • 测试保护:单元测试保护、SIT保护、日常拨测最小测试集保护
    • 重构需要小步前进,在了解程序逻辑和功能背景下进行,拒绝大规模重构、赶进度重构,应把重构视为一个工程进行,有规划、有目的逐步进行
    • 代码指标看护:CodeCheck静态扫描,最大函数长度、圈复杂度、最大函数嵌套深度、循环依赖、代码重复率,用于评判重构的好坏
    • 业界和公司可信编码规范指南:有优秀重构范式的例子,以及示例

      • 是否合理使用设计模式
      • 是否符合基础编码规范
      • 是否符合安全编码规范
      • 编码是否考虑可靠、可用性
    • 培训、技能提升、请教高级别的工程师:会提检视意见,代码评审和走读
    • 参考优秀开源社区的项目,读JDK的代码实现

可信理论与技术

参考资料
打造可信的高质量产品和解决方案

可信理论框架(Trustworthiness Framework)

华为可信理论框架

  • 可信任场景:封闭系统、开发系统、智能系统、系统的系统
  • 可信任特征:安全(Security&Safety)、韧性(Residence)、隐私(Privacy)、可靠(Reliability)、可用(Availability)
  • 可信任过程:治理与准备阶段,定义实现使用、持续改进
  • 可信任价值观:可信任、安全开发规范的工程师文化建设

我们来详细看一下可信任(Trustworthiness)的五个特征,我没有把安全单独放出来作为一个章节,是因为可信的概念是比安全概括更全面的一个概念,在可信任这个语义中,我们能看到安全与隐私保护在其中扮演着非常重要的角色,可以说是可信中最重要的两个特性,但除此以为,韧性、可靠、可用也不可忽视。实际上在公司的实际与安全相关的治理中,常常使用的是可信的场景来管控的,而不是狭义的安全,所以我们从可信的角度来分析问题,可以更全面的做到“安全”。

  • 安全(Safety and Security):Security指产品有良好的抗攻击能力,保护业务和数据的机密性、完整性和可用性。Safety指系统失效导致的危害不存在不可接受的风险,不会伤害自然人生命或危及自然人健康,不管是直接还是通过损害环境或财产间接造成的。
  • 韧性(Residence):系统受攻击时保持有定义的运行状态(包括降级),遭遇攻击后快速恢复并持续演进的能力。
  • 隐私保护(Privacy): 遵从隐私保护既是法律法规的要求,也是价值观的体现。用户应该能够适当地控制他们的数据的使用方式。信息的使用政策应该是对用户透明的。用户应该根据自己的需要来控制何时接收以及是否接收信息。用户的隐私数据要有完善的保护能力和机制。隐私保护应从多方面入手,从公司的安全隐私编码规范、软件生命周期管理、流程管控,到更高层面的法律法规、文化价值观宣传、员工培训等,实际上是隐私保护规范与治理全方面的体现。
  • 可靠性&可用性(Reliability&Availability): 产品能在生命周期内长期保障业务无故障运行,具备快速恢复和自我管理的能力,提供可预期的、一致的服务。 为了保证产品的可靠可用性,我们一般是宏观上,我们从系统架构设计的考虑,系统应具备高性能和高可靠性的特点(见系统架构设计章节)。微观上则是从软件开发的角度而言,如何保证产品的编码安全,如何通过测试提升产品的可靠可用性。

可信治理

  • 研发过程可信

    • 开发设计安全自检Checklist、Code Review、代码门禁检查
    • 可信编码要求(包括很多方面,基本代码规范、安全规范、代码设计、可靠&性能&可用性)
    • 安全编码规范
    • 常见的Web安全问题
  • 安全技术&规范

    • 安全算法:Hash算法、RSA(2048比特以上,非对称加密)、AES(128比特以上,对称加密)
    • 业界、公司发布的安全技术规范
    • 产品安全红线
  • 安全认证

    • 安全攻防、渗透测试(CTF比赛)
    • 等保认证、CC认证
    • 公司的ICSL送检
    • 业界知名安全评估认证
  • 安全治理&管理

    • 漏洞管理
    • 帐号和口令管理:帐号和口令如何管理?
    • 证书管理
    • 密钥管理
    • 签名管理
    • 权限管控&安全隔离
    • 安全检测&安全配置

系统架构设计

系统架构设计的能力不仅局限于某个特定的功能模块,而是要站在更高的视角总览全局,从局部与整体的角度进行取舍

引子

比如说,让你设计一个高可用性、稳定的、大规模的静态扫描系统?简单构思一下,我们会想到使用,微服务架构,并且该系统需要具备高性能、高可用性以及分布式的特点,但是如果再细致的设计细节,你能够做到吗?

这里先放一个不太成熟的回答,以后也许有落地经验之后,会有更深的理解:

  • 架构设计:考虑使用微服务的架构,根据静态扫描系统去拆分模块,划分层次:业务层、公共业务组件、基础服务组件层
  • 高性能

    • 基础硬件资源:结合业务体量、业务场景、历史数据,分析服务器节点的资源应该如何配置?比如服务器节点内存需要多少G,需要几核的CPU,硬盘需要多少T
    • 负载均衡:是否要多个实例,将用户的请求分担到多个节点
  • 高可用

    • 流控策略:对外部的用户请求,要做流程控制,保证资源的合理分配,比如说使用队列排队等待机制,当后台扫描资源占满后,考虑让用户的扫描请求进去等待队列
    • 超时&重试机制:用户某些扫描任务,由于扫描文件过多、后台服务器BUG,导致扫描任务超时,要进行资源释放
    • 冗余设计:后台扫描节点,异地容灾多节点,某节点故障时,仍能保证服务的正常提供
  • 灵活运用中间件来保证系统的高性能、高可靠性

    • 缓存(Redis):目测不是高并发的场景,内部使用的工具是不需要的
    • 消息队列(Kafka):可以用来做流控
    • 对象存储(OBS):用于存储和归档大量上传的文件
    • 分布式搜索分析引擎(Elasticsearch):用于检索和分析数据

云原生/微服务架构

可以谈一下你对云原生的理解吗?在做了三年的微服务开发,对于云原生的概念有什么自己的理解呢?我先放在这里,也许再过几年过来看一下,又会有更深的理解。

云原生一种平台的技术架构,包括容器、微服务、服务网格、服务契约API,我理解的云原生更多的是一种现代软件工程开发的方法论和思想,是为了适应现在许多复杂、需要快速迭代、敏捷交付的业务场景才提出来的。

现在许多的业务场景往往很复杂,你需要将整个业务平摊开来,然后经过分层和解耦的设计,将不同的服务、模块拆分出不同的微服务,去考虑他们之间如何交互和通信。还要考虑资源的弹性收缩,考虑性能的优化,考虑灵活的拓展与快速迭代等等。

从我们项目的架构来说,平时工作打交道最多的,技术中台提供的云平台的技术底座,本质上来说就是云原生的实践,我们基本上90%的时间都需要和它打交道,底层便是基于K8S实现的,基础的硬件资源被规划为一个个的节点,而微服务便以容器化的形式部署到这些节点上。平台本身提供了节点管理、容器化部署、指标监控、微服务治理、服务契约等云原生的功能。

容器

  • K8S集群:容器化集群管理

微服务

  • 微服务架构的概念是什么?
  • 微服务适合什么样的场景?
  • 微服务有哪些优缺点?

后端框架:Spring/SpringBoot

  • Spring/SpringBoot/MVC概念
  • IOC、注入、循环依赖
  • AOP

  • MySQL(Mybatis+Druid)

    • 数据库的事务你有了解吗?
    • 为什么要使用Mybatis,它有哪些优点?
  • 定时器:Quartz
  • 路由:Controller @RequestMapping()
  • 业务实现:Service
  • 开发工具/生产工具:Maven/Git/Intellij

服务网格

中间件

  • 中间件是什么

  • 缓存:Redis

    • Redis主要使用的是内存还是硬盘?Redis是一个内存数据结构存储(官方描述),是基于内存的数据库
    • Redis支持哪些类型的数据?
    • 缓存雪崩、缓存穿透、缓存击穿有了解吗?
  • 消息队列:Kafka

    • Kafka 的工作原理是什么?如何保证数据不丢失
  • 数据库:MySQL,华为自研的GaussDB(高斯数据库)
  • 日志:Elasticsearch、Logstash
  • 对象存储:OBS, S3桶
  • 分布式事务:zookeeper
  • 任务调度:阿里巴巴SchedulerX、开源XXL-JOB/ElasticJob/Spring Schedule/K8s Job

分布式系统

  • 分布式的理论、算法与协议

    • 分布式系统有哪些理论?CAP、BASE理论
    • 分布式系统有哪些算法和协议?Paxos、ZAB协议
    • 分布式系统如何保证事务的一致性,某些值协商的一致性?
  • 分布式项目实践

    • 有哪些分布式系统会用到的协调服务组件?Zookeeper、Dubbo

高性能与高可靠

  • 高性能

    • CDN
    • 负载均衡

      • 什么是负载均衡?
      • 负载均衡有哪些算法实现?一致性哈希算法能描述一下吗?
    • 数据库优化

      • 实际工作是否有遇到过SQL调优的经历?
      • 关系型数据库 MySQL 底层的索引是用什么算法实现的?
      • 数据库的事务是什么,能简单描述一下吗?
      • 索引失效如何定位?
      • MySQL执行过程和解析过程是怎么样的?
    • 消息队列
  • 高可用

    • 冗余设计详解
    • 服务限流详解
    • 降级&熔断机制
    • 超时&重试详解
    • 性能测试

大数据技术

大数据领域的知识主要包括机器学习(ML)、自然语言处理(NLP)、计算机视觉(CV)、数据可视化(Data Visualization)这几大领域,最近比较火的几个新领域有AIGC(生成式人工智能,Artificial Intelligence Generated Content)、大模型(ChatGPT, AlphaGo, AlphaFold-生物领域研究折叠蛋白质)

项目经历

  • 解决方案测试:光产品线P2P/P2MP运维项目(光产品线)

    • 通信网络知识
    • 业务领域:数通、传送网、接入网、光网络通信
    • 主要的职责:1.测试执行,2.测试方案设计,3.支撑实验局项目
  • Java后端工程师开发:安全运营中心项目(全球技术服务中心-研发管理部)

    • 业务领域:主要是对内部,给多个产品和业务线(车BU、OWS、HIS-内部IT服务平台、安全行管团队、netcare)的资产,开发运维平台,提供运维和技术支撑服务
    • 主要职责:1.开发功能特性代码,2.特性模块需求分析、设计与评审,3.培训与赋能、技能传承,4.版本管理与交付,MDE/Committer负责代码质量看护、三方件管理、漏洞评审、问题单回归
    • 你在OpenRASP主要承担什么样的职责?一个角色是插件开发(RASP项目主要分为框架层和插件层),另一个是推动项目从实验室落实到小规模产品化(从实验室到产品化需要许多流程化的规范与跨部门的协同,代码库、三方件)
  • 技术支持工程师:AUTIN OWS项目(全球技术服务中心-资源共享与交付中心)

    • 当前所在部门
    • 业务领域:主要是对外部,主要的客户是运营商,提供客户化适配、资源共享、技术支撑等服务,偶尔会出差去现场支撑客户项目交付
    • 主要职责:1.现场客户答疑,2.本地员工培训赋能,3.现场开发用户指定场景的UC

团队协作&版本管理

能描述一下你们开发团队是如何进行版本管理的吗?

  • 版本管理:使用git进行版本管理,以微服务为粒度进行划分,每个微服务是一个项目。存在一个主干分支(master)、特性试验分支(future)、以及一些特殊的比如说用于安全送检的安全送检分支(security)。由于项目是以月度进行迭代的,所以每月会归档月度版本分支。
  • 开发模式:每位开发人员拉取主干分支后,在自己的分支进行特性开发,代码提交到自己仓库,最后MR到主干分支。
  • 补丁管理机制:月度版本发布以后,问题需要修改进以前的版本分支,需要走补丁合入的流程,不能随意修改旧分支
  • 持续构建:工程团队会每日持续集成,构建日构建包,发布在CMC上,已保证每日合入的增量代码不会导致构建失败的低级问题。测试进行需求验收测试与回归问题时,也必须取的日构建包。

职业发展

Q: 你的职业发展的诉求和原因?

  • 地域:因为家庭原因,未来主要来深圳这边长期发展。
  • 发展路线:目前主要关注点在技术积累,后续希望(1)转型往一线发展,做产品经理&技术支持,深入了解产品与客户侧去了解如何运作的,积累的产品经验、客户经验和研发经验都具备之后,才有做好管理的能力。(2)转型做技术专家/SA/SE,做技术架构,偏向于技术管理
  • 原因:技术学习能力在30岁以前是巅峰,想保持持续的竞争力比较难,之后会越来越容易被淘汰,应逐步思考转型问题。

Q: 有什么问题想问我们的?

对于大多数面试而言一般结尾都会允许候选人提一些问题,简单的提一些问题表示一下对面试官的尊重:

  • 可以简单的询问一下团队的工作内容
  • 工作日历、工作时间,是否有大小周,以及平时几点下班
  • 了解一下团队的概况,包括规模和年龄分布情况
  • 团队项目遇到的困难点,自己是否能在团队中发挥作用和贡献

Q:面试中出现的一些关于服从性与调配的问题?

比如说是否接受到其他城市工作之类的,岗位是否接受调配。个人是能够接受出差和外派的,也可以接受业务部门的根据需要进行适当调剂。

最后编辑于: 2024 年 12 月 16 日
返回文章列表 打赏
本页链接的二维码
打赏二维码