- 博客(38)
- 收藏
- 关注
原创 不背八股!!!面试官:为什么有了HTTP还需要RPC?
在前文为什么说TCP是基于字节流的?中我们介绍了为什么TCP是基于字节流的,其中最本质的原因就是因为TCP是流式传输数据的,并且TCP的数据格式没有消息边界。在网络实践中,为了解决TCP粘包的问题,我们通常使用的是自定义消息头的方法,因为这样比较高效且灵活,通常消息头内有一些控制信息,比如这条消息的包长度具体是多少,这条消息的格式是什么样子的,有没有进行压缩,来源方IP,来源方是哪里等等。后来随着这种方式慢慢在互联网中被认同,就形成了各种各样的规范,我们将这些规范称之为协议。
2023-12-17 12:46:23
186
原创 计算机专业大学四年应该怎么过?早点看到这篇文章就好了
还有项目的准备,还是以后端为例,项目做得好才在面试的时候和面试官有东西说,如果项目全是自己随便写的demo,或者经不起推敲的玩具项目,先不说会给面试官很差的观感,而且也会使得正常面试那面试官只能和你聊基础和算法题了、这里的项目可以是老师实验室的项目,最好是真的和企业合作的项目,能够落地使用。大三下就正式开始了暑期实习的招牌,暑期实习的流程和秋招是差不多的,所以最好是去体验体验,暑期实习一般是统招,就是整个公司都进行招聘,各个部门共享简历池,暑期实习一般也有转正机会,所以难度会比日常实习高不少。
2023-09-12 21:16:52
297
原创 计算机专业读研还是就业? 希望你能早点看到这篇文章
如果你有名校情结,或者想感受一下研究生的生活,亦或者是想让自己有着更多的选择和退路,那么读个研也是不错的选择,不同于前几年读研出来基本都是干算法的情况,现在计算机研究生卷开发的也有不少,研究生期间做的一些有难度的项目和一些paper对于找工作也是很有帮助的,毕竟这些内容在本科很难接触到,校招的时候。而算法的话通常都需要。收入,如果能在本科找到一份不错的工作的话,以鹅厂为例,以开发白菜来算,就算三年不涨薪,税前也有100W,而大部分研究生的收入只能勉强覆盖自己的开支,甚至覆盖不了。有问题欢迎大家找我讨论。
2023-09-09 20:49:50
335
1
原创 Prometheus存储拓展
但是其实不是所有场景都需要去拓展Prometheus的容量,因为数据量根本达不到单机的Prometheus的容量上限,假设每台机器每个周期大概采集100个指标,采集频率是10S/次,那么可以同时监控的机器数量是20W台,当然这里没有考虑到采集中间件的指标,实际上,很多中间件抛出指标是很多的。联邦集群可以看做是Prometheus内置的一种集群方式,核心就是Prometheus数据的级联抓取,它能够使得不同的Prometheus数据聚拢在一个中心的Prometheus中。
2023-08-11 11:39:41
186
原创 Prometheus存储拓展
但是其实不是所有场景都需要去拓展Prometheus的容量,因为数据量根本达不到单机的Prometheus的容量上限,假设每台机器每个周期大概采集100个指标,采集频率是10S/次,那么可以同时监控的机器数量是20W台,当然这里没有考虑到采集中间件的指标,实际上,很多中间件抛出指标是很多的。联邦集群可以看做是Prometheus内置的一种集群方式,核心就是Prometheus数据的级联抓取,它能够使得不同的Prometheus数据聚拢在一个中心的Prometheus中。
2023-08-11 11:32:57
85
原创 深入浅出事件溯源
为事件驱动的微服务架构提供了一个可靠的基础。通常,我们在DB层面存储的内容是一条详尽的数据,比如一条评论的数据最核心的内容可能是这样的,当然,在公司里面还会有很多附加的控制信息,比如平台的ID,其他表的信息之类以方便交互。事件溯源可以作为可靠的发布机制,在事件存储库中保存事件本质上是一个原子化的操作,我们需要实现一种机制,将这些持久化保存的事件传递给所有感兴趣的消费者。存储了每个聚合的完整历史记录,可以轻松实现检索聚合过去状态的查询,想要确定给定时间点的聚合状态,只需重放直到该时间点位置发生的所有事件。
2023-08-08 12:11:01
69
原创 分布式事务常见解决方案汇总
第二阶段某资源管理器出错:该资源无法响应事务管理器的Commit请求,事务管理器会在一段时间之后重发请求,如果在达到最大重试次数之后仍然无法正确响应,那么事务管理器会把该资源管理器标记为失败,会向其他所有的资源管理器发送Rollback请求进行数据回滚,保障数据的一致性。实现分布式事务,最常用的方法就是二阶段提交协议和TCC,这两个算法的使用场景是不一样的,二阶段提交协议实现的是数据层面的事务,比如XA规范采用的就是二阶段提交;如果资源都可用,协调者会执行正常的业务操作,但并不提交事务。
2023-08-02 19:31:36
55
原创 K8S的卷、临时卷、持久卷、PV、PVC、SC
每个SC都会包含provisioner parameters 和 recalimPolicy字段,这些字段会在SC需要动态制备PV的时候用到,SC的命名很重要,用户使用这个命名来请求生成一个特定的类,当创建SC对象的时候,管理员设置SC对象的命名和其他参数,一旦创建了对象就不能再更新了。在容器重启期间,Pod中任何类型的卷都不会丢失。临时卷就是为此类用例设计的,因为卷会遵从pod的生命周期,和pod一起创建和删除,所以停止和启动pod时,不会受持久卷在何处可用的限制,临时卷在pod规约中以内联的方式定义。
2023-07-07 17:46:40
900
1
原创 Docker底层实现
Docker镜像是如何构建:Docker中的每一个镜像都是由一系列只读的层组成的,DockerFile中的每一个命令都会在已有的只读层上创建一个新的层,类似于搭积木,镜像的每一层其实都只是对当前镜像进行了部分改动,当镜像被docker run命令创建时,就会在镜像的最上层添加一个可写的层,也就是容器层。,就像运行在不同的机器上一样。fork:当调用fork函数时,系统会创建新的进程为其分配资源,例如存储数据和代码的空间,然后把原来的进程值都赋值到新的进程中,只有少量值与原来不同,相当于克隆自己。
2023-06-25 19:21:16
88
原创 微服务进程间通信实现
在传统的应用程序中,服务实例的网络位置通常是静态的。但在现代的基于云微服务的应用程序中,通常不那么简单,IP地址和服务实例并不是强关联的了,某些时候服务实例会动态的销毁、创建,空出IP地址和占用IP地址。消息的每个字段都有编号,并且有一个类型代码,消息接收方可以提取所需的字段,并跳过其无法识别的字段,因此grpc使api能够在保持向后兼容的同时进行变更。在微服务架构中,不同的服务是托管在不同的代码库,运行在不同的进程甚至是机器上的,这会比单体架构中服务之间进行通信付出更大的成本。
2023-06-25 18:39:04
102
原创 venv是什么
通过创建虚拟环境,你可以为每个项目创建一个干净的、隔离的Python环境。这样可以确保项目所依赖的软件包和版本不会和其他的项目产生冲突,同时也方便在不同的项目之间进行切换和管理依赖关系。虚拟环境是一种隔离的Python环境,可以独立于系统中的其他Python环境进行操作。下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。有问题欢迎大家找我讨论。来安装所需要的python包,这些包会被安装到该虚拟环境中,然后可以通过。来激活venv环境,从而进入到虚拟环境,然后可以在虚拟环境中使用。
2023-06-09 11:35:33
2008
原创 Go云原生学习笔记二
gRPC是一种现代化开源的RPC框架,能够运行于任何环境之中,最初由谷歌进行开发,之前说过RPC是一种软性的规范,而不是硬性的协议。每个流中的消息是有序的。一旦客户端完成了消息的写入,它就等待服务器读取消息并返回响应,同样,gRPC保证单个RPC调用中的消息是有序的。客户端从返回的流中读取,直到没有更多的消息,gRPC保证在单个RPC调用的消息是有序的。6.IP哈希算法:根据客户端的IP地址,通过哈希算法计算出一个值,然后将这个值对服务器列表长度取值,得到要访问的服务器编号,类似于随机。
2023-06-09 11:08:18
240
原创 Go云原生学习笔记一
3.SOA面向服务架构 :当垂直架构的应用越来越多,就会出现多个应用都依赖的业务组件,比如数据库,而且各个应用交互越来越频繁,此时就需要把部分通用的组件拆分独立处理,于是SOA面向服务架构诞生了,它带来了模块化开发、分布式拓展部署和服务接口定义等概念。SOA架构适用于大型软件服务企业对外提供服务的场景,并不适合一般的业务场景,其服务的定义、注册和调用都需要繁琐的配置,业务总线的吞吐量决定了整个系统的上限,因为整个系统都是通过总线进行任务分配的。下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。
2023-06-09 10:19:55
138
原创 一周撸完K8S基础概念 Day2
创建K8S对象的时候必须提供对象的spec用来描述对象的期望状态,以及对象的 一些基本信息(name kind),当时用API创建独享的时候,API在请求主体中应该包含JSON格式的数据,大部分情况下我们提供的是。字段,用于引用其属主对象,一个有效的属主引用,包含与属主对象同在一个命名空间下的对象名称和一个UID,K8S自动为一些对象的附属资源设置属主引用的值,这些对象包含了。元数据围绕应用的概念进行组织,K8S不是平台即服服务,应用程序是非正式的,并且使用元数据进行描述,应用程序包含的定义应该是送伞的。
2023-05-31 15:26:40
71
原创 为什么K8S要选择抛弃Docker?
K8S在较早期的版本中引入了CRD CNI CRI CSI等接口,而CRI是1.5版本引入的新接口,Kubelet可以通过这个接口使用各种各样的容器运行时,其实CRI的发布就意味着K8S一定会将Dockershim的代码从仓库中移除。K8S是容器编排领域的事实标准,而Docker从诞生之日到今天都在容器中扮演着举足轻重的地位,也一直是K8S的默认容器引擎,然而在2020年12月,K8S社区决定着手移除仓库中Dockershim的相关代码。K8S虽然是现在容器编排领域的龙头,但是他也有他的缺点。
2023-05-31 14:51:02
1644
原创 一周撸完K8S基础概念 Day1
kubelet接收一组通过各类机制提供给它的PodSpecs,确保这些PodSpecs中描述的容器处于运行状态且健康,kubelet不会管理不是由k8s创建的容器,kubelet是k8s集群中的每个node上的主要组件之一,负责管理节点上的容器化工作负载,与控制平面交互,确保集群中的容器正确运行,并且维护节点的健康状态。容器类似于VM,但是相比于VMWare生成的那种VM,容器更加轻量级,并且与VM类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等等,容器之间可以共享OS。
2023-05-30 13:03:05
88
原创 分布式系统常见设计
cgroup实现的硬件层面的隔离,比如CPU、内存等等。因此在设计的比较好的云服务里,按时间的纬度来度量可用性已经没有了太大的意义,因为不管怎样服务都是可用的,系统都是活着的,起码部分服务可用,因此在云服务里更合理的新的衡量可用性的指标是请求失败比率,即哪些服务不能对外提供能力,占比具体为多少。1.某些时候系统会遇到负载过高的问题,当系统外来的或者内部的负载过高,超过预先定义的阈值,为了保证更加重要的业务的服务质量,希望将一些非核心的业务降低服务质量,从而释放一些额外的资源给紧急业务使用。
2023-05-17 16:48:46
256
原创 分布式系统基础理论
CAP是分布式系统方向中的一个非常重要的理论,可以粗略的将它看成是分布式系统的起点,CAP分别代表的是分布式系统中的三种性质,分别是Consistency(可用性)、Availability(一致性)、Partition tolerance(网络分区容忍性),它们的第一个字母分别是C A P,于是这个理论被称为CAP理论。如果有分区(P),那么系统就必须在可用性(A)和一致性(C)之间取得平衡,否则(E),当系统运行在无分区的情况下,系统需要在延迟(L)和一致性(C)之间取得平衡。
2023-05-09 19:32:05
82
原创 逆向初识
1.静态链接 链接器将函数的代码从其所在地(目标文件或者静态链接库)复制到最终的可执行程序中,整个过程在程序生成的时候完成,静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码,静态链接则是将相关代码复制到源代码相关位置,参与程序的生成。运行的时候JVM从.class文件中读一行解释执行一行。文件装载进行与目标文件相关的一些初步分析,包括文件格式解析、文件信息搜集和文件性质判定,分析出文件执行入口地址,初步分析文件的数据段和代码段以及文件运行所以来的其他文件信息。
2023-04-27 16:39:07
305
原创 消息队列系统学习
RabbitMQ的优点是客户端支持多语言,多协议支持,不支持消息批量操作,有pull和push两种模式,使用的主从模式master/slave,master提供服务,slave做备份,数据可靠(因为有备份),单机吞吐量为万级别,消息延迟为微秒级,内存级别,可以主动开启持久化,支持集群和负载均衡,不保证多Client消息有序。消息的确认可以逐个进行,也可以累积到一起。当在消费者上启用自动重试的时候,如果消息没有被消费,那么就会存储到重试主题中,在指定的延迟时间后,消费者会主动接受来自重试主题的失败消息。
2023-04-25 20:24:45
433
3
原创 Go常见手搓demo
同步的话会有一个问题就是Even和Odd都往这个ch中写东西了,但是没有人去消费它,所以我们只能选择手动关闭。通道必须得是有缓冲的,不然在main goroutine中往里面<-1就会阻塞住,下面的go协程就不会执行了。2.buildHeap和heapify都传参都是i,n,而堆排的时候是维护一个当前大小的堆,所以是0,i。下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。关闭通道的时候需要异步进行,也就是异步Wait(),然后立马关掉ch。通过select来实现一有消息就读,如果读完就退出。
2023-04-25 20:09:12
254
原创 流媒体技术初识
而所谓的流媒体则特指一切采用这种流式传输的媒体文件。视频会存储在谷歌数据中心的硬盘里,由GFS和BigTbale管理, GFS是谷歌开发的一个分布式文件系统,用于管理分布式环境中的大规模数据,而BigTable是建立在GFS上的低延迟分布式数据存储系统,用于处理分布在千万台机器上的PB级别的数据。Youtube的后端微服务是由Python Java 和Go 写的,而前端是使用JS写的,主要的数据库是由Vitess支持的MySQL,另外使用Memcache实现了缓存,并使用Zookeeper进行节点的协调。
2023-04-25 17:05:27
123
原创 Go模糊测试是什么
需要注意的一点是,在Go执行的过程中,多个fuzzing target是并行来处理的,底层会有多个worker,调度的顺序也不一定,所以不能做持久化,也不能依赖一些全局状态,不要尝试改变入参。日常测试代码的时候我们经常使用table driven test的方式来构造一组输入和预期的结果,之后调用我们的待测函数,检查结果是否和我们的预期匹配,也就是我们平常说的Mock数据。,另外模糊测试其实也是一种持续测试的手段,因为如果不限制执行的次数或者执行的最大时间,它就会一直不停的执行下去。
2023-04-25 17:03:26
51
原创 一文搞懂什么是云原生
容器:轻量级的虚拟化技术,能够在单一主机上提供多个隔离的操作系统环境,通过一系列的namespace进行进程隔离,容器分为运行时和编排两层,运行时负责容器的计算、存储、网络等,编排层负责容器集群的调度,服务发现和资源管理。首先云原生是和云计算分不开的,这里的云计算更多的指的是一种云上的资源,而云出现之前,市场还处在一个物理机时代,如果要启用一个新的应用,就得自己搭一台新的服务器,一直到2001年VM出现了,通过虚拟机可以在一台服务器上跑多个虚拟机来减少服务器的数量(同时也是减少了企业堆机子的钱)
2023-04-19 16:34:30
316
原创 一文搞定Docker底层
Docker镜像是如何构建:Docker中的每一个镜像都是由一系列只读的层组成的,DockerFile中的每一个命令都会在已有的只读层上创建一个新的层,类似于搭积木,镜像的每一层其实都只是对当前镜像进行了部分改动,当镜像被docker run命令创建时,就会在镜像的最上层添加一个可写的层,也就是容器层。,就像运行在不同的机器上一样。fork:当调用fork函数时,系统会创建新的进程为其分配资源,例如存储数据和代码的空间,然后把原来的进程值都赋值到新的进程中,只有少量值与原来不同,相当于克隆自己。
2023-04-19 16:23:36
74
原创 go.sum是什么
当使用go mod安装依赖包的时候,会根据go.mod文件中指定的版本号下载相应的依赖包,并计算依赖包的哈希值,将这些信息记录到go.sum中,当再次构建项目的时候,go.mod会检查go.sum文件,确保依赖项的哈希值和之前记录的值一样,以此来保证项目的构建过程是可重现的。go.sum文件的重要性在于保证Go项目的依赖关系的可靠性和安全性,避免因为依赖包版本不一样导致的不可预期的问题。go.sum文件的作用在于记录各个依赖项的版本和哈希值,用于验证项目的依赖关系是否发生变化。全平台账号:安妮的心动录。
2023-04-17 23:01:17
895
原创 Go如何解析不定JSON数据
在开发中常常会碰到很多JSON类型的数据进行交互,而其中有很多JSON数据你是不能确定它的字段和结构的,而Go语言是一门静态强类型的语言,在进行JSON解析的时候必须要确定字段的类型,定义出对应的结构体,然后再进行Unmarshal,那这二者之间的冲突我们该如何解决呢?除了encoding/json之外,还有很多第三方库可以用来解析不确定的JSON数据,例如gjson和jsonparser,这些库通常提供了更加灵活和高效的JSON解析方式,可以根据具体的需求选择合适的库来使用。有问题欢迎大家找我讨论。
2023-04-17 13:42:41
1172
原创 一文学会常见设计模式
因此,当使用模式的时候,我们常常在一个代理类中创建一个对象的实例。抽象工厂:一个工厂创建一系列(同一个产品族)的产品,增加新的产品族很方便,无需修改已有系统,符合开闭原则,增加新的产品等级结构很麻烦,需要对原有系统进行较大的修改,违背了开闭原则,相当于在工厂方法的模式下进行了折中,如果产品结构等级稳定,那么就相当于完全遵循开闭。在面向对象编程的过程中,设计一个类,建议对外提供的功能单一,接口单一,影响一个类的范围就限定在这一个接口上,一个类的一个接口具备这个类的功能含义,职责单一不复杂。
2023-04-13 18:38:18
71
原创 学git看这一篇就够了
git commit的时候,仓库并不会将本地和远程仓库代码进行比较,不会识别出代码是否存在冲突,必须进行pull命令之后,才会将本地代码和远程仓库的代码进行比较,如果二者的代码存在冲突,必须要解决冲突后重新commit push,如果不存在冲突,则pull的时候直接合并代码,不会将本地代码覆盖掉。HEAD是一个指针,指向的分支就是当前分支,在一开始的时候,master分支是一条线,Git使用master指向最新的提交,再用HEAD指向master,就能确定当前分支以及提交点。
2023-04-10 22:44:57
73
原创 waitgroup与互斥锁底层
版本中引入了饥饿模式,当goroutine超过1ms没有获取锁,那么就将当前的互斥锁切换到饥饿模式,在该模式下,互斥锁会直接交给等待队列最前面的g,新的g在该状态下既不能获取锁,也不会进入自旋状态,只会在队列的末尾等待。锁的使用场景是解决多协程下数据竞态的问题,为了保证数据的安全,锁住一些共享资源。mutex的最开始实现只有正常模式,在正常模式下等待的线程按照先进先出的方式获取锁,但是新创建的goroutine会与刚被唤醒的goroutine竞争,导致刚被唤起的goroutine拿不到锁,从而长期被阻塞。
2023-04-10 22:43:21
276
原创 正排索引与倒排索引
倒排索引指的是词项到文档ID的映射,也就是将每个词项出现的文档ID存储在一个词项对应的数据结构中,便于快速地根据词项获取包含该词项的文档ID列表。正排索引指的是文档id到文档内容的映射,也就是将每个文档的内容存储在一个文档ID对应的数据结构中,便于快速地根据文档ID获取文档内容。可以看到,这个倒排索引存储了每个单词出现的文档ID,如果我们要查找包含单词『document』的文档,可以快速找到包含该单词的文档ID。相比之下,倒排索引存储了每个单词出现在哪些文档中,即存储了单词->文档ID的键值对,举个例子。
2023-04-08 21:23:37
230
原创 前端路由实现方式
现在主流的路由实现方式主要有两种 分别是history和hash模式单页面:服务只有一个index.html静态文件那么内容区域:首页、商城、购物车、我的对应的内容,并且浏览器并没有发出实际的http请求,内容区域是如何认识到用户点击了不同的模块,从而更新内容区域呢?
2023-04-08 21:21:32
43
原创 curl入门
博客:cbb777.fun全平台账号:安妮的心动录下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。有问题欢迎大家找我讨论~curl是常见的命令行工具,用来请求web服务器。它的名字就是客户端(client)的URL工具的意思。功能非常强大,命令行参数多达几十种,如果熟练的话可以取代Postman这一类的http请求图形界面工具。不带任何参数的时候,curl发出的就是GET请求,返回的结果是网站的源代码这里要加上www,如果直接curl baidu.com得到的结果是。
2023-04-08 21:20:05
46
原创 Gin复习
拦截器通常只在特定的代码路径或者逻辑流中执行,例如在特定的web请求或者调用特定的方法的时候,通常由程序本身实现,通过代码中的特定注解或配置来声明和使用,旨在通过拦截请求和响应来处理和修改它们,以实现特定的功能,如安全性、性能检测和日志记录等等。Go提供了可通过发射发现的结构体标签,这些在标签库json/xml中得到了广泛的使用,orm框架也支持了结构体标签,上面的这个例子就是因为encoding/json支持json结构体标签,每种标签都有自己的特殊规则。结构体标签是可以随意写的,只要符合语法规则。
2023-04-03 23:22:37
158
1
原创 MySQL主键的一些思考
自增id的值是顺序的,所以innodb在索引B+树的叶子节点层面可以直接把每一条记录都存储在上一条记录的后面,当达到页面的最大填充因子的时候(页面容量已经满了)下一条记录就会写入新的页中,数据按照这种顺序的方式进行填充,主键页就会以近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费。页分裂:保证后一个数据页的所有行主键值比前一个数据页的主键值大,所以当ID不为自增的主键的时候,就会导致后一个页的所有行并不一定比前一个数据页的行的id大。
2023-03-30 22:01:05
1285
1
原创 深入了解异地多活
博客:cbb777.fun全平台账号:安妮的心动录github: https://github.com/anneheartrecord下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。有问题欢迎大家找我讨论~系统性能三指标要想理解异地多活,我们需要从架构设计的原则说起现如今,我们开发一个软件系统,对其要求越来越高,一个好的软件架构应该遵循以下3个原则:高性能高可用易扩展高性能:系统拥有更大流量的处理能力,同时接口返回的速度应该尽可能的快。易扩展:系统在迭代新功能的时候,能够以最
2023-03-29 22:12:10
459
原创 limit与分页键
举个例子,假设我们需要查询一个包含一百万行数据的用户表,并且我们需要查询第500001到第500100行的数据。如果用偏移量的方式进行查询,需要查询前5000000行数据才能获得我们需要的结果,这将导致查询性能非常低下。而使用分页键的方式,可以在查询时直接指定分页键的值,从而定位到结果集的起始位置,避免了大量的数据扫描。在使用分页键的时候,通过查询分页键来定位结果集的起始位置,从而避免了偏移量很大的情况,也就是避免了SQL深分页的情况。查询结果集中的某个位置之后的记录,即查询结果集的偏移量很大的情况。
2023-03-27 23:03:57
77
1
原创 为什么我会持续写面经
当我写出来的东西能帮他人解决问题,能够获得别人的赞同,能起到哪怕一点点微小的帮助,对我来说也是一种认同+满足,不断的重复这个过程,慢慢的去影响越来越多的人,帮助到越来越多的人,是一件很快乐的事情,至少对于我来说是这样。工程方面的能力:你写了什么项目,你对自己的项目理解的程度深不深,常用的技术栈你学的怎么样,你的debug能力,把你招进来是不是真的能有产出,一些常用的框架、命令、工具你会不会用,会不会协同合作等等。我觉得逻辑清晰,语句通顺,面试官能听懂你说的东西,并且觉得你说的有道理,这是很重要的一个能力。
2023-03-27 22:50:50
44
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人