面试问题笔记

计算机网络

  • OSI参考模型(怎么封装解封的,每层重点协议是什么)
    封装总:每层协议都将在上层数据的基础上,加上自己的头部信息。
    数据封装的过程大致如下:
    1.用户信息转换为数据,以便在网络上传输
    2.数据转换为数据段,并在发送方和接收方主机之间建立一条可靠的连接
    3.数据段转换为数据报,并在报头中放上逻辑地址,这样每一个数据包都可以通过互联网络进行传输
    4.数据包或数据报转换为帧,以便在本地网络中传输。在本地网段上,使用硬件地址唯一标识每一台主机。
    5.帧转换为比特流,通过物理层介质传输出去

解封:发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

  • TCP/IP模型(简化了哪些层,有什么好处)
    OSI参考模型的优点是性质相似的工作划分在同一层。每一层所负责的工作范围,都区分得很清楚。万一出了问题,很容易判断是哪一层没做好。
    OSI参考模型的缺点是将“服务”与“协议”的定义相结合,使得参考模型变得格外复杂,实现起来更加困难。

TCP/IP模型的优点是能够提供面向连接和无连接两种通信服务机制。
TCP/IP模型的缺点是没有明显的区分服务、接口和协议的概念。没有划分开物理层与数据链路层。TCP/IP模型完全不是通用的。

  • IP协议(不可靠连接、特点)
    IP是整个TCP/IP协议族的核心,位于网络层
    设计IP的目的是提高网络的可扩展性:一是解决大规模网络的互联;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。
    IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
    IP所提供的服务大致可归纳为两类:
    ●IP数据报的传送。将IP信息包从源设备传送到目的设备。通过IP地址与IP路由器(网络之间的一种传送机制)来实现。
    ●IP数据报的分割与重组。将过长的信息包进行分割,以便能在最大传输单位较小的网络上传输。分割后的IP信息包,由目的设备接收后重组,恢复成原来IP信息包

无连接:非连接式的传送方式是指IP信息包传送时,源设备与目的设备双方不必事先连接,即可将IP信息包送达。即源设备完全不用理会目的设备,而只是单纯地将IP信息包逐一送出。至于目的设备是否收到每个信息包、是否收到正确的信息包等,则由上层的协议(例如TCP)来负责检查。

IP信息包的传送方式:单点传送、广播传送、多点传送。
协议版本:IPv4(有十进制和二进制两种表示方法)、IPv6(每一块都包含四个16进制数)
IP地址的结构:网络地址+主机地址。

  • TCP、UDP(在哪层,三次握手四次挥手,拥塞、滑动窗口。。)
    TCP的可靠传输的工作原理:
    a.停止等待协议/超时重传:
    停止等待就是每发完一个分组,就停止发送,等待对方的确认,在收到确认后再发送下一个分组。
    如果超过一段时间没有收到确认,就认为刚才发送的分组丢失了,因而重传刚发发送的分组,这就叫做超时重传。
    b.流水线传输
    停止等待协议简单但是信道利用率低。流水线传输使用的就是连续 ARQ 协议和滑动窗口协议。连续 ARQ 协议:连续发送一组数据包,然后再等待这些数据包的ACK。不必每发完一个就停下来等待对方确认。连续ARQ协议通常是结合滑动窗口协议来使用的。滑动窗口协议在在发送方和接收方之间各自维持一个滑动窗口,发送发是发送窗口,接收方是接收窗口,而且这个窗口是随着时间变化可以向前滑动的。它允许发送方发送多个分组而不需等待确认。

TCP的流量控制:利用滑动窗口实现流量控制。
所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收。利用滑动窗口机制就可以实施流量控制。

TCP的拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
慢开始和拥塞避免、快重传和快恢复

  • 常见应用层协议
    DNS、FTP、SMTP、HTTP、Telnet

  • 对称密钥/非对称密钥加密方式,什么时候应用
    (1) 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
    (2) 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
    (3) 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

操作系统

  • 进程和线程

进程与程序的联系与区别
① 程序是一个静态的概念。而进程动态的概念。② 程序可以长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。③ 进程是由程序、数据和进程控制块三部分组成的。④ 一个程序至少有一个进程,一个进程至少有一个线程.

Java创建线程的方式主要有以下三种
继承Thread类,并重写run方法通过创建该子类的对象,获得线程对象,调用线程对象的start()方法启动线程。
实现Runnable接口, 定义Runnable接口的实现类并重写run()方法,创建实现类的对象,并以此Runnable对象作为Thread的target创建Thread对象,即线程对象,调用线程对象的start()方法启动线程
实现Callable接口。

进程间通信的方式:
管道 : 允许一个进程和另一个与它有共同祖先的进程之间进行通信
消息队列 : 客服了信号承载信息量少和管道只能承载无格式字节流以及缓冲区大小受到限制的缺点
共享内存 : 使得多个进程可以访问一个内存空间
信号量 : 主要作为进程间以及同一进程不同线程之间的同步手段

线程池就是创建多个线程并且进行管理的容器。(线程池是个容器,可以创建线程和管理线程,并且给线程分配任务)
线程池的好处: (1)重用已经存在的线程,减少了线程的创建和销毁的开销。(2)可有效控制最大并发的线程数,提高了系统资源的使用率避免很多竞争,避免了OOM啊 死锁啊等。(3)可以提供定时和定期的执行方式,单线程,并发数量的控制等功能!线程池可以使得对线程的管理更加方便,并且对高并发的控制尽在掌握。

  • 常见调度算法
    1 先来先服务
    既可用于作业调度,也可用于进程调度。每次调度都是从后备作业队列中选择最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
    缺点:比较有利于长作业,而不利于短作业。 有利于CPU繁忙的作业,而不利于I/O繁忙的作业。
    2 最短优先
    它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。
    缺点:长作业的运行得不到保证。
    3 优先级调度算法
    为每个进程设置一个优先级,在调度的时候,选取优先级最大的任务去执行。
    4 高响应比优先算法:
    是对,先来先服务和短进程优先算法的一种综合考虑。响应比=(等待时间+需要执行的时间)/需要执行的时间。
    5 时间片轮转调度算法:
    每个进程被分配一个时间片,即允许进程在该时间段中运行。如果在时间片结束时该进程还在运行,则剥夺CPU分配给另一个进程。如果该进程在时间片结束前阻塞或结束,则CPU立即进行切换。此调度程序所要做的就是维护一张可以运行进程列表,当一个进程用完它的时间片后,就被移到队列的末尾

  • 死锁的产生和解决

  • 虚拟内存(概念、为什么会产生虚拟内存),页面置换算法(常见)
    虚拟内存:首先,它是基于程序的局部性原理。包括时间局部性和空间局部性,就是在一个较短的时间内,仅使用程序代码的一部分,相应的,应用程序所访问的存储空间,也许局限某个区域内。基于局部性原理,程序再装入的时候,可以将程序的一部分装入内存,其余的留在外存。然后就可以启动程序的执行,在执行的过程当中所访问的信息不在内存的时候就从外存调入到内存,然后继续执行;另一方面,将内存当中暂时不需要使用的内容换出到外存当中,从而腾出更多的空间调入内存信息,这样操作系统为用户提供了一个比实际内存大很多的内存,就成为虚拟内存。

之所以称为虚拟内存,是因为这种内存实际上并不存在,只是由于系统提供了部分装入、请求调入和置换功能之后,给用户的感觉好像是有一个比实际物理空间大很多的内存,虚拟内存大小是由计算机的地址结构决定,并非是由内存和外存简单的相加的,实现方式有三种,分别是分页分段和段页式。

常见的置换算法:

  1. 最佳置换算法(OPT)
    最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。
  2. 先进先出(FIFO)页面置换算法
    优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。
  3. 最近最久未使用(LRU)置换算法
    选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。
  4. 时钟(CLOCK)置换算法
    LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。
    简单的CLOCK算法是给每一帧关联一个附加位,称为使用位。当某一页首次装入主存时,该帧的使用位设置为1;当该页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为CLOCK算法,又称为最近未用(Not Recently Used, NRU)算法。
  • 磁盘调度
    (一)先来先服务算法(FCFS)
    1、算法思想:按访问请求到达的先后次序服务。
    2、优点:简单,公平。
    3、缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道,使磁头反复移动,增加了服务时间,对机械也不利。
    二)最短寻道时间优先算法(SSTF)
    1、算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。
    2、优点:改善了磁盘平均服务时间。
    3、缺点:造成某些访问请求长期等待得不到服务。
    三) 扫描算法(电梯算法)(SCAN)
    1、算法思想:当设备无访问请求时,磁头不动;当有访问请求时,磁头按一个方向移动,在移动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。
    2、优点:克服了最短寻道优先的缺点,既考虑了距离,同时又考虑了方向。
    3、例子:下图是一个示例。请同学自己写出一个可能的磁盘访问序列,并计算磁头移动总距离。
    四)循环扫描算法(CSCAN)
    循环扫描调度算法是在扫描算法的基础上改进的,为了减少延迟,规定磁头单向移动,例如,只是自里向外移动,从当前位置开始沿磁头的移动方向去选择离当前磁头最近的那个柱面访问,如果沿磁头的方向无请求时,磁头立即返回到最里面的欲访问的柱面,再亦即将最小柱面号紧接着最大柱面号构成循环。
    优点:兼顾较好的寻道性能和防止饥饿现象,同时减少一个请求可能等待的最长时间。
    缺点:可能出现磁头停留在某处不动的情况(磁臂黏着)

数据结构

  • 常见排序算法过程和时间复杂度、空间复杂度
    参考

  • 深度搜索:思路就是先找一个主线,然后回头找到每一个点的分支。这就是回溯法,所谓回溯法,就是每一点都有相同的特征,但状态不一样。当从头遍历到尾后,要原路返回,每次返回的那个点状态不一样。仔细想想,这个递归的思想是一致的,用for i=1:N表示遍历每一种状态,用if判断每一种状态所要执行的动作,每次执行的动作模式是一样,即递归

  • 广度搜索:从图的顶点中任意地选择一个根,然后添加与这个顶点相关联的所有边。在这个阶段所添加的新顶点成为生成树在1层上的顶点。下一步,按顺序访问1层上的每个顶点,只要不产生简单回路,就将与这个顶点相关联的每条边添加到树里。这样就产生了树在2层上的顶点。如此来,直到已经添加了所有顶点。从以上分析,很容易可以看出,这并非回溯可以做到的,所以得按照其本身思路实现。

  • 最短路径问题:【1】迪杰斯特拉算法:实际上是一个贪婪算法(Greedy algorithm)。因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点。迪杰斯特拉算法总共就干了两件事:1 不断运行广度优先算法找可见点,计算可见点到源点的距离长度。2 从当前已知的路径中选择长度最短的将其顶点加入S作为确定找到的最短路径的顶点。【2】Floyd算法,是一个经典的动态规划算法。可以正确处理有向图或负权的最短路径问题。(动态规划算法是通过拆分问题规模,并定义问题状态与状态的关系,使得问题能够以递推(分治)的方式去解决,最终合并各个拆分的小问题的解为整个问题的解。)

  • 求最小生成树:【1】 普利姆算法(顶点少,边多):从图中任取一个顶点作为一棵树,然后不断从与该树相连的边中选取一条权值最小的边。将该边及所连接的顶点并入树中,直到图中所有顶点都被并入树中。【2】Kruskal算法(顶点多,边少):每次找出候选边中权值最小的边,就将该边并入生成数中,重复此过程,直到所有的边检测完。

  • 二叉树,哈夫曼树/编码,遍历方式,线索二叉树

  • 常见查找算法(B/B+树,红黑树,平衡二叉树,哈希算法)

计算机组成原理

  • 冯诺依曼体系
    冯·诺伊曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构冯·诺伊曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺伊曼的这个理论称为冯·诺伊曼体系结构。

工作原理(流程)
输入设备获取数据存储到内存中,CPU 从内存中取出数据并进行处理,运算完毕后在交给内存,内存将 CPU 处理过的数据交给输出设备,由输出设备进行数据的输出。

特点
(1)计算机处理的数据和指令一律用二进制数表示。
(2)顺序执行程序。计算机运行过程中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一概念称作顺序执行程序。
(3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。

注意
a) 存储器指的是 内存,而不是 外存(磁盘)
b) 不考虑缓存的情况下,这里的 CPU 能且只能对内存进行读写,不能访问外设(输入或输出设备)
c)外设(输入或输出设备)要进行输入或者输出数据时,也只能写入内存或者从内存中读取数据
d) 所有设备都只能直接和内存打交道

  • 指令寻址

常见问题

  • cache作用
    高速缓冲(Cache)储存器是介于CPU和内存之间的一种可高速存取信息的芯片,是CPU和RAM之间的桥梁,用于解决它们之间的速度冲突问题.其工作原理为:通常程序是按程序代码的顺序执行指令,当CPU处理了某一地址上的数据后,接下来要读取的数据很可能就在后继的地址上.于是可把这段代码一次性地从内存复制到Cache中.CPU要访问内存中的数据,先在Cache中查找,当Cache中有CPU所需的数据时(称为命中),CPU直接从Cache中读取,如果没有,就从内存中读取数据,并把与该数据相关的一部分内容复制到Cache,为下一次访问做好准备.只要算法得当,在Cache中的命中率一般很高,平均可达80%左右,从而提高了工作效率.

  • 进程和线程

  • TCP三次握手

  • TCP如何解决拥塞

  • 数据库三大范式

  • 快排过程,时间复杂度

  • 傅里叶变换,矩阵的秩
    傅里叶变换
    矩阵的秩

  • 对AI怎么看

  • 最常用语言,为什么

  • 读博吗?研究生计划是什么

    • 信息安全面临着哪些威胁:外部威胁包括网络攻击,计算机病毒,信息战,信息网络恐怖,利用计算机实施盗窃、诈骗等违法犯罪活动的威胁等。内部威胁包括内部人员恶意破坏、内部人员与外部勾结、管理人员滥用职权、执行人员操作不当、度安全意识不强、内部管理疏漏、软硬件缺陷以及雷击、火灾、水灾、地震等自然灾害构成的威胁等。
  • 路由算法有哪些?分为静态路由算法和动态路由算法。静态路由算法简便可靠,但当网络拓朴变化较大的情况下,调整的复杂度会比较高,只适合用于对于安全性要求较高的系统,或者是规模较小的网络。动态路由算法有距离向量路由算法、链路状态路由算法。距离向量路由算法是使用跳数来衡量到达目的地地址的路由距离,仅和相邻的路由器交换信息,交换的信息就是自己的路由表,并且按固定的时间间隔来交换信息。链路状态路由算法是每个节点通过广播的方式与其他所有节点交换信息。最终所有的路由器能够建立一个全网的拓扑结构图,然后每个路由器根据这个拓扑结构图来选择最优路径,从而构造路由表,当链路状态发生变化的时候需要重新构造。

  • 流水线是什么?什么时候流水线不能继续:流水线指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。可以在同一个时间启动2个或以上的操作,借此来提高性能。在实际中,会出现2种情况使流水线停顿下来或不能启动:1、多个任务在同一时间周期内争用同一个流水段。例如,在一些算数流水线中,有些运算会同时访问一个运算部件。2、数据依赖。比如,A运算必须得到B运算的结果,但是,B运算还没有开始,A运算动作就必须等待。解决方案:第一种情况,增加运算部件的数量来使他们不必争用同一个部件;第二种情况,重新安排运算的顺序。

  • 贪心算法&例子:所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。基本思路:1.建立数学模型来描述问题。2.把求解的问题分成若干个子问题。3.对每一子问题求解,得到子问题的局部最优解。4.把子问题的解局部最优解合成原来解问题的一个解。
    【例】[找零钱问题]假如老板要找给我99分钱,他有上面的面值分别为25,10,5,1的硬币数,为了找给我最少的硬币数,那么他是不是该这样找呢,先看看该找多少个25分的,诶99/25=3,好像是3个,要是4个的话,我们还得再给老板一个1分的,我不干,那么老板只能给我3个25分的拉,由于还少给我24,所以还得给我2个10分的和4个1分。

@Test
public void testGiveMoney() {
    //找零钱
    int[] m = {25, 10, 5, 1};
    int target = 99;
    int[] results = giveMoney(m, target);
    System.out.println(target + "的找钱方案:");
    for (int i = 0; i < results.length; i++) {
        System.out.println(results[i] + "枚" + m[i] + "面值");
    }
}

public int[] giveMoney(int[] m, int target) {
    int k = m.length;
    int[] num = new int[k];
    for (int i = 0; i < k; i++) {
        num[i] = target / m[i];
        target = target % m[i];
    }
    return num;
}
  • 分治算法&例子:分(divide):递归解决较小的问题。治(conquer):然后从子问题的解构建原问题的解。步骤:1、分解(Divide):将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;2、解决(Conquer):若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;3、合并(Combine):将各个子问题的解合并为原问题的解。
    【例】二分查找
    1) 选择一个标志mid将集合分为二个子集合
    2) 判断标志arr(mid)是否能与要查找的值target相等,相等则直接返回
    3) 否则判断arr(mid)与target的大小
    4) 基于判断的结果决定下步是向左查找还是向右查找
    5) 递归记性上面的步骤
public static int binarySearch(int[] arr,int target) {
		int left = 0;
		int right = arr.length-1;
		while(left<=right) {
			int mid = (left+right)/2;
			if(arr[mid]==target) {
				return mid;
			}else if(arr[mid]>target) {
				right = mid-1;
			}else {
				left = mid+1;
			}
		}
		return -1;
	}
  • 软件开发方法
    结构化法:即面向过程的开发方法。其基本思想是“自上而下,逐步求精”,把一个复杂的系统拆分,化繁为简,形成一个个的构件。其讲究的是用户至上,系统开发过程工程化、文档化、以及标准化。严格的区分来工作阶段,每个阶段都有明确的任务和应得额成果。
    面向对象方法:面向对象的开发方法是自底而上的,主要表现为和现实事物结合起来,把世间万物抽象出来,形成一个个的抽象对象。相比结构化法有更好的复用性,分析、设计、实现三个阶段界限不明确,其关键点在于建立一个全面的、合理的、统一的模型。
    原型法: 其适用于需求不明确的场景,包括抛弃型原型和演变型原型。
    抛弃型原型:业务做完之后原型就已经没有用处了;
    演变型模型:在原来的模型基础之上逐步修改并一直沿用;

    • 管同属于敏捷阵营,XP 方法关注工程实践,包括了重构、结对编程、持续集成 , SCRUM 方法 是一个包含很多管理实践的过程框架,包括固定的timebox、站立会议。
  • 迭代开发:增量式模式,螺旋式模型和原型法都具有迭代开发的特征,即将一个大型软件系统的开发过程视为一个逐步学习和交流的过程,软件系统的交付不是一次完成的,而是通过多个迭代周期逐步来完成交付。

  • 敏捷软件开发:强调在不确定的情况下,适应软件需求快速变化的,基于迭代式开发的软件开发方法和实践。

  • 敏捷体系分为五个层次:价值观、原则、方法、实践、工具

  • 主流敏捷方法:SCRUM、XP、Kanban。Scrum着重于项目管理,适合用于难以提前完全规划好的项目。极限编程着重于软件开发的最佳实践。看板是可视化工作流程,限定工作量、优化周期时间。

  • 开源软件开发方法:开源软件是一种源代码可以任意获取的计算机软件。伴随着网络而兴起的,这种方法依赖于分散在全球的开发者和使用者通过网络协作,常见的有Linux、eclipse、Facebook

  • 首先,DevOps的基础是敏捷软件开发、精益思想和看板方法,这是一种鼓励快速迭代,尽快向用户交付价值的软件过程。其次,它的微服务架构方式,帮助用户分解业务架构、解耦复杂应用系统。第三,大量虚拟化技术的使用,使得开发测试环境与生产环境几乎没有差别,新的功能模块封装在容器中,以类似集装箱形式快速部署到生产环境中。第四,一切皆服务的理念指导,不仅大大降低了开发部署和运维的难度,同时也降低了成本。第五,构建了强大的工具链,支持高水平自动化,代码从编写到部署上线,几乎不需要人工干涉。

  • 测试工具
    Junit是Java单元测试框架。Selenuim是基于网络应用的开源测试框架。实现的是基于UI页面测试,对浏览器支持良好,支持绝大多数浏览器。Cucumber是一款自动化验收测试工具,用户按照行为驱动开发模式创建测试用例。

  • 如何持续集成:持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。(持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。)(持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。)
    而所谓的持续,就是说每完成一个完整的部分,就向下个环节交付,发现问题可以马上调整。是的问题不会放大到其他部分和后面的环节。这种做法的核心思想在于:既然事实上难以做到事先完全了解完整的、正确的需求,那么就干脆一小块一小块的做,并且加快交付的速度和频率,使得交付物尽早在下个环节得到验证。早发现问题早返工。
    持续集成工具:Jenkins(自动化编译、自动化测试、自动化部署、丰富的插件库)

  • 分布式开发怎么做
    分布式就是通过计算机网络将后端工作分布到多台主机上,多个主机一起协同完成工作。
    Java分布式
    分布式应用程序就是指应用程序分布在不同计算机上,通过网络来共同完成一项任务,通常为服务器/客户端模式。更广义上理解“分布”,不只是应用程序,还包括数据库等,分布在不同计算机,完成同一个任务。之所以要把一个应用程序分布在不同的计算机上,主要有两个目的:1)分散服务器的压力。2)提供服务,功能重用

  • 熟悉的技术及相关应用开发举例(含编程、算法、机器学习等技术)

  • 在课外是否还写过其他程序或系统(除课堂作业,竞赛比赛和实习之外的)

  • 自我评价自学新技术的能力和效率

  • 描述你参与度最高的一个项目,说明建设系统的背景,系统的功能模块,开发团队组成,你负责的部分,系统完成情况(系统是否实际投入使用)

其他

  1. 机器学习
    • 机器学习就是让机器从大量的数据集中学习,进而得到一个更加符合现实规律的模型,通过对模型的使用使得机器比以往表现的更好。

    • 监督学习:根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。分类:回归:针对于连续型变量的,例如预测房屋价格、分类:针对离散型的,输出的结果是有限的。,例如估计肿瘤性质。无监督学习:我们不知道数据集里数据、特征之间的关系,而是要根据聚类或一定的模型得到数据之间的关系。比起监督学习,无监督学习更像是自学。区别:1 有监督机器学习的核心是分类,无监督机器学习的核心是聚类;2 有监督的输出结果,是分类分好了,标签也同时贴好了。无监督属于先聚类后定性,有点类似于批处理。

    • 逻辑回归:是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。Logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinear model)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同。如果是连续的,就是多重线性回归;如果是二项分布,就是Logistic回归;如果是Poisson分布,就是Poisson回归;如果是负二项分布,就是负二项回归。Logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最常用的就是二分类的Logistic回归。

    • 决策树:决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。决策树是一种十分常用的分类方法,需要监管学习。
      剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不错的结果。之所以这么做,是为了防止“过拟合”(Overfitting)现象的发生。
      过拟合:指的是模型的训练结果“太好了”,以至于在实际应用的过程中,会存在“死板”的情况,导致分类错误。
      欠拟合:指的是模型的训练结果不理想。

    • SVM:支持向量机。主要用于解决模式识别领域中的数据分类问题,属于有监督学习算法的一种。
      将实例的特征向量(以二维为例)映射为空间中的一些点,就是如下图的实心点和空心点,它们属于不同的两类。那么 SVM 的目的就是想要画出一条线,以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。
      SVM 算法特性:训练好的模型的算法复杂度是由支持向量的个数决定、SVM 训练出来的模型完全依赖于支持向量,重复训练过程,结果仍然会得到完全一样的模型、一个 SVM 如果训练得出的支持向量个数比较少,那么SVM 训练出的模型比较容易被泛化。

    • 神经网络:是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。基本架构:神经元、参数、偏置项。特点是:大规模并行处理,分布式存储,弹性拓扑,高度冗余和非线性运算。

    • KNN:邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN是通过测量不同特征值之间的距离进行分类。 算法的描述:1)计算测试数据与各个训练数据之间的距离;2)按照距离的递增关系进行排序;3)选取距离最小的K个点;4)确定前K个点所在类别的出现频率;5)返回前K个点中出现频率最高的类别作为测试数据的预测分类

    • K-Means:聚类。聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来。K-Means是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
      步骤:首先输入k的值,即我们希望将数据集经过聚类得到k个分组。从数据集中随机选择k个数据点作为初始大哥(质心,Centroid)对集合中每一个小弟,计算与每一个大哥的距离(距离的含义后面会讲),离哪个大哥距离近,就跟定哪个大哥。这时每一个大哥手下都聚集了一票小弟,这时候召开人民代表大会,每一群选出新的大哥(其实是通过算法选出新的质心)。如果新大哥和老大哥之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),可以认为我们进行的聚类已经达到期望的结果,算法终止。如果新大哥和老大哥距离变化很大,需要迭代3~5步骤。

    • 过拟合和欠拟合
      过拟合:指的是模型的训练结果“太好了”,以至于在实际应用的过程中,会存在“死板”的情况,导致分类错误。
      欠拟合:指的是模型的训练结果不理想。

    • 聚类,回归,分类:
      聚类(clustering):无监督学习的结果。聚类的结果将产生一组集合,集合中的对象与同集合中的对象彼此相似,与其他集合中的对象相异。
      分类(classification):有监督学习的两大应用之一,产生离散的结果。
      回归(regression):有监督学习的两大应用之一,产生连续的结果。
      给定一个样本特征 , 我们希望预测其对应的属性值 , 如果 是离散的, 那么这就是一个分类问题,反之,如果 是连续的实数, 这就是一个回归问题。
      如果给定一组样本特征 , 我们没有对应的属性值 , 而是想发掘这组样本在 二维空间的分布, 比如分析哪些样本靠的更近,哪些样本之间离得很远, 这就是属于聚类问题。
      如果我们想用维数更低的子空间来表示原来高维的特征空间, 那么这就是降维问题。

  2. 深度学习相关
  3. 前沿知识(怎么看无人驾驶、AI。。。)
    • 软件项目版本、项目文档的管理的核心思想是要保证软件项目、项目文档具有可追溯性。对这点,首先要建立配置管理计划,其次选择一款合适的配置管理软件,再次实施配置管理,并实时监控并不断改进。配置管理中的难点是力度和执行力。
    • 信息安全面临着哪些威胁:外部威胁包括网络攻击,计算机病毒,信息战,信息网络恐怖,利用计算机实施盗窃、诈骗等违法犯罪活动的威胁等。内部威胁包括内部人员恶意破坏、内部人员与外部勾结、管理人员滥用职权、执行人员操作不当、度安全意识不强、内部管理疏漏、软硬件缺陷以及雷击、火灾、水灾、地震等自然灾害构成的威胁等。

项目

  • 背景和创新点
  • 用到哪些技术
  • 有哪些难点,如何解决
  • 还有哪些可继续改进
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值