读《后端技术面试38讲》--学习笔记和读后感 (一)

学习笔记和读后感

主要记录阅读李智慧编写的《后端技术面试38讲》课程的学习笔记和一些自己的工作和学习体会。
课程所讲的内容是比较系统性的讲了后端技术开发的技术理论,比较适合于有六七年以上开发工作经验的软件开发人员,如已经从事过一些项目的架构设计工作,则能够更系统的理解课程内容;在阅读过程中将自己的工作感悟和既往的技术学习内容,不断地表达出来,则能更充分的提升对软件工程的系统认知和表达能力。

0、掌握软件开发技术的第一性原理

第一性原理是什么
就是让我们抓住事务最本质的特征原理,依据事务本身的规律,去推导、分析、演绎事物的各种变化规律,进而洞悉事物在各种具体场景下的表现形式,而不是追随事物的表面现象,生搬硬套各种所谓的规矩、经验和技巧,以至于在各种纷繁复杂的冲突和纠结中迷失了方向。

感想:
想要透彻的理解和掌握技术,那么一定是要对这个技术有个体系化的认识并且通过实践运用来验证所学程度;学习一项新技术本身是一项较为有难度的事情,但往往新技术来源于一些既有的技术,而较难的复杂的东西又往往是基于一些较容易的简单的东西;因此通过不断地建立和完善自己掌握的技术体系知识再去不断地学习和拓展掌握的技术体系知识范围,这是一个不断精进的过程,而这一过程最重要的内容就是如何建立好这个体系的基石。
这个软件开发的技术体系的基石是什么呢?又要如何扎实的掌握好这些基石呢?我个人认为软件开发的基石是计算机的体系结构,而计算机是用机器的电路做逻辑运算,这个运算需要有相应的输入并且运算后产生结果输出,控制运算规则的执行称之为CPU ,运算指令及数据的来源地则称之为存储器。
对运算规则的凝练和抽象表达产生了算法,对数据的合理组织和表达产生了数据结构,二者都是从实践和理论上的总结和演进,从逻辑上讲有了数据结构和算法就可组成逻辑上的软件了,但要运行软件则需要计算机去执行,如何调度硬件的运行、计算机之间的通信、计算机和人的交互、调度计算机内软件的运行、数据的读取和存储等一些列软件组合成了操作系统;同时对常见实践中的有效的良好的软件方案的总结产生了软件设计理念,如何抽象、复用及应对扩展;对有较大复杂度或有较大规模的软件系统的结构进行进一步的总结则产生架构设计理念,如何应对流量、内部一致性协调。

01丨程序运行原理:程序是如何运行又是如何崩溃的?

感想:
程序的运行生命周期分为 就绪 、运行、阻塞 ; 在程序加载后,操作系统判断它满足所需条件时,则程序会加入到就绪的队列中排队等待运行,程序获得CPU运行时间时则会被执行,当遇到IO通信或者其他临界资源(锁) 等,则会阻塞,放弃CPU的运行权,等待资源的获得;当运行期的程序运行时间片消耗完或者阻塞程序获得了资源后,程序也会进入就绪状态;三者状态遵循这样的规则而转化。程序的运行是需要资源的比如内存和CPU, 当一些特定资源被耗尽或者产生资源依赖的死循环(死锁导致多线程卡死),程序则会出现崩溃现象 。为了防止程序崩溃,则需要检查并修正程序重不正确的使用资源或不正确的占有资源,对外部则采取限制措施,防止程序被压垮 。

02丨数据结构原理:Hash表的时间复杂度为什么是O(1)?

感想:
数据结构是对数据的结构化组织形式,是为了有规律的使用数据,在使用数据的操作上有增删改查,采用不同的数据结构对一定规模的数据集进行这些操作会有不一样的成本(运算时间复杂度、存储空间复杂度),如何在特定场景下选择合适的数据结构从而降低总体的使用成本,往往需要透彻的理解数据结构并透彻的分析场景下的数据使用。

03丨Java虚拟机原理:JVM为什么被称为机器(machine)?

感想:
JVM 虚拟机是通过中间层的方式屏蔽底层操作系统的差异;另外将内存管理工作从业务程序开发中剥离开来;通过模拟栈的方式,来执行程序指令(程序指令则是将Java语言开发的程序翻译为字节码程序之后则是编译后的机器指令);JVM的核心在于内存结构及垃圾回收策略。

04丨网络编程原理:一个字符的互联网之旅

总结:通过讲述一个请求从客户端发起到数据中心中业务服务的多个阶段、通信方式、分流情况:DNS 、CDN、HTTP、TCP、LB。
DNS: 是查找请求目的地是哪里
CDN: 是就近解决 , 缓存的一种表现形式
HTTP: 以什么方式询问 ,结果又会是什么样的
TCP: 询问的通信方式是靠谱的
LB:流量是会被分流处理,也就是说业务服务是有足够能力处理的

05丨文件系统原理:如何用1分钟遍历一个100TB的文件?

硬盘 : 从性能和成本上综合考量 一种是容量大(单位成本低)但性能较差的机械硬盘,一种是容量较小(单位成本高)但性能较高的固态硬盘 ; 单机的硬盘容量总是有个上限的 对于需要在较短时间读取较大容量的文件,单机条件在容量上和性能上都不太可能满足要求。

文件系统 : 将文件数据和存储空间进行关联映射的系统,如 linux 的inode文件控制块,主要通过多层级结构,是的一个4k的inode文件控制块信息可以关联的表达近70G大小的文件。

RAID : 通过冗余的方式 存储数据,以降低硬盘故障带来的数据丢失风险,同时分片带来读写性能上的提高 。单机上一般8块硬盘 ,raid方式 提高单文件容量上限,也是有限度的
0 : 分N份 ,扩大单个文件的容量上限,读写速度提高N倍 , 任意丢失,则损坏
1: 分两份 ,对等备份 ,提高可用性 磁盘利用率只有50%
10 : 容量和可用性得到保证, 磁盘利用率未提高
5 : 对10的优化,分片改为N-1 , 另1分作为校验数据, 如其中一份数据损坏,可以恢复
6: 计算两片校验数据

分布式文件系统:以HDFS为例,从模式上也可以看到RAID的影子,只是这种是以机器为粒度来组织文件的存储

文件系统通过内部的不同形式的组织,通过层级、分片、冗余、分布式等的演进,提高文件存储的容量上、可用性、性能。

06丨数据库原理:为什么PrepareStatement性能更好更安全?

SQL 执行过程 连接器 - 语法分析其 - 语义分析与优化器 - 执行引擎
Statement : 一个完整sql ,直接按流程执行, 语句也可以包含多个sql
PrepareStatement : 先提交带占位符的sql , 进行预处理,提前生成执行计划,当给参数后,则真正执行,效率更好, 也能避免SQL注入

B+树组织数据储存的方式, 决定了可以支持范围查找, 索引的最左前缀原则,

07丨编程语言原理:面向对象编程是编程的终极形态吗?

机器语言: 最贴近硬件 ,需要枚举操作, 认为记忆难 不便于使用
汇编语言: 对命令的语义起了别名 ,稍微便于记忆和使用
高级语言-面向过程式: 极大的方便了程序开发, 但面向过程编程 不利于复杂软件的开发和维护
高级语言–面向对象式:软件开发大多数的功能都是为了解决现实世界的业务问题,面对对象的方式能够更好的将现实对象和行为映射到软件中,更加方便业务方案转化到技术方案 。
面向数据的编程–函数式编程 :
为了更好利用CPU的多核及分布式集群的多服务器特性 – 反应式编程

答疑丨Java Web程序的运行时环境到底是怎样的?

理解JVM 、Tomcat容器 、业务程序代码 在运行时的关系 进程 、线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值