求职经验分享
前言
历时半个月时间,终于找到了一份.net开发的工作。
双非本科。。。
求职软件
我手机下载了
- 应届生求职 不常用
- Boss直聘 常用
- 前程无忧 不常用
- 智联招聘 常用
- 猎聘 不常用
- 拉勾招聘 不常用
最常用的是Boss直聘,最后也是在Boss直聘上找到的工作,然后其次是智联招聘。
首先来讲讲Boss直聘,我是沟通了334个,投递了22份简历,面试了3个。看图:
我大部分投递的职位是C#/.net开发,少量是Java开发,然后3个面试都是.net开发。
然后boss的会员我自己觉得并没有什么用,花6元开个试用一周就行了。
面试经验
消除紧张的最好办法就是自信,别问到不会的问题就紧张起来了,不会就是不会,有什么大不了的,下次面试记住之前不会的题目就行了,没什么好紧张的。
第一份面试是厦门的一个.net实习开发,然后是经过了笔试和电话面试,Boss上写的工资是5k-6k,然后实际谈的时候是只能开到3k-3.5k,说boss上的薪资是转正之后的,然后不包吃住,所以谈崩了。
第二份面试就是上海的一个,也是.net开发,然后电话面试也是过了,但是只能给我开200+20饭补每天,但是在上海这个工资我感觉太少了,不包吃住,所以就推掉了。
第三份面试也就是我现在要去入职的,苏州昆山的.net开发工程师,经历了笔试-电话面试-第二次笔试-电话面试,第一轮笔试分为算法题和逻辑题,算法题很简单,也就是leetcode上简单类目的题目,然后逻辑题就稍微有点难了,因为准备的时候也没怎么准备逻辑题目,但是最后还是给我通过了。电话面试就是问一下技术问题。第二次笔试是要求做一个简单的增删改查系统。最后的电话面试就是了解我的情况了。总的来说流程是很清晰,最后开出的工资是5k加上加班费。
智联招聘上有很多java的岗位,然后校招也有,自身学历高的话很吃香,然后boss上.net岗位还是挺多了,我自己大部分也是用boss去投的,然后boss上也是有校招的岗位。然后除了招聘软件还可以去自己学院的官网找就业那一块,有很多公司校招的信息,然后可以投递简历。
可以没事刷刷leetcode的算法题,比如:
- 查找字符串数组中的最长公共前缀
- 给定一个字符串,找到它的第一个不重复的字符(字母都为小写),并返回它的索引。如果不存在,则返回空字符串
- 二进制功能实现。例如输入一个值如22 输出的结果是10110
- 求数组中的最大值
都是很简单的题目,当然根据你面试的岗位而定,我是实习开发,所以题目相对简单。
然后有些公司会叫你做一个简单的系统,如果是采用的Asp.Net MVC 不是.NET Core的话,还是可以采用依赖注入来实现功能的,然后架构搭建清楚,视图层、模型层、控制器层,多写注释,虽然他要求只需要实现增删改查,但是我们在查的时候可以实现多条件查询、分页查询,这都可以加分的。对于依赖注入具体看:
ZY知识库 · ZY - .Net Framework使用Autofac实现依赖注入 (pljzy.top)
面试题分享
下面是我面试的遇到的常见面试题,如果有疑问可以评论,有错误可以指出,感谢大家支持。
IOC
IOC(Inversion of Control)是一种软件设计思想,也是面向对象编程中的一个重要概念。它是指控制反转,即将对象的创建、依赖关系的管理和对象的生命周期的控制交由外部容器来完成,而不是由对象自身来完成。
AspNetCore 应用的生命周期
- 构建阶段(Build):在这个阶段,应用程序的依赖关系和配置信息被加载和配置。这包括注册服务、配置中间件管道和设置应用程序的配置选项。
- 启动阶段(Startup):在这个阶段,应用程序开始启动。在启动阶段,可以执行一些初始化操作,如数据库迁移、创建数据库连接等。
- 运行阶段(Run):在这个阶段,应用程序开始处理请求。请求经过中间件管道,执行相应的逻辑处理,并生成响应。
- 停止阶段(Shutdown):在这个阶段,应用程序接收到停止信号,开始停止处理请求。可以执行一些清理操作,如关闭数据库连接、释放资源等。
反射在AspNetCore里的使用场景
C#中的反射(Reflection)是一种强大的机制,允许在运行时获取和操作类型的信息,包括类、方法、属性、字段等。通过反射,可以动态地创建对象、调用方法、获取和设置属性值等。
可以用反射来进行依赖注入,然后可以用反射来修改对象的属性和字段,ORM和mapper这些也是反射实现的
介绍一下MySQL的索引
MySQL的索引就是提高查询性能,有唯一索引、主键等等,还有就是列有很多重复的内容就没必要建立索引了。
主键索引是在表的主键列上创建的索引,保证主键列的唯一性。 唯一索引也是用于索引列的唯一性但是唯一索引允许空值。
大部分索引都是通过Hash,B-树,B+树实现的。
慢查询
慢查询就是超过了设置的时间阈值的查询,Mysql有慢查询日志,通过设置参数开启它,查看日志,优化产生慢查询的语句。
介绍一下lambda
lambda表达式 是一种简化的匿名函数,参数=>表达式或语句块,叫goes to 。
lambda跟委托的关系
可以创建委托
linq的原理
LINQ的原理基于.NET框架中的一组标准查询运算符(Standard Query Operators),这些运算符定义了一套通用的查询操作,如过滤、排序、投影、分组等。这些运算符是通过扩展方法的形式定义在.NET框架的IEnumerable
LINQ 查询语法、方法语法
- 查询语法(Query Syntax):查询语法使用类似SQL的语法结构来编写查询。它使用关键字(如
from
、where
、select
等)来描述查询的逻辑。查询语法通常以query
或from
关键字开始,以select
或group by
关键字结束。
示例:
var query = from student in students
where student.Age > 18
select student.Name;
- 方法语法(Method Syntax):方法语法使用一系列的方法调用来构建查询。它使用LINQ扩展方法来对数据进行筛选、排序、投影等操作。方法语法通常以数据源(如集合)作为起点,然后通过链式调用方法来进行操作。
示例:
var query = students
.Where(student => student.Age > 18)
.Select(student => student.Name);
泛型
C#中的泛型(Generics)是一种通用编程机制,它允许在编写代码时使用类型参数,以实现代码的复用和类型安全。
泛型可用于定义泛型类、接口、方法 然后用<>将类型参数作为占位符,具体的类型在使用的时候指定。
await/async 的实现原理
await表示这个方法是可等待的,防止阻塞线程,async表示该方法为异步方法,这2个关键字的搭配使用的,有async就有await。
他们都是基于Task来实现的,编译器会把async方法编译成一个类,并且把异步方法中的代码切分成多次方法调用,每个await会切分状态。
使用async
关键字修饰的方法在编译时会被转换为一个状态机。编译器会分析方法中的await
表达式,并将方法的执行流程分割为多个状态,以便在await
表达式处暂停和恢复执行。
抽象函数
抽象函数(Abstract Function)是一种在抽象类或接口中声明但没有具体实现的函数。抽象函数必须在派生类中进行实现。使用abstract
关键字来声明一个抽象函数。
虚函数
是一种允许子类重写的基类方法,在基类中,可以使用virtual
关键字来声明一个虚函数。
在ASP.NET MVC中,有几种常见的方式可以在页面之间传递值:
- 使用URL参数:Request.QueryString
- Session
- TempData、ViewBag、ViewData
- Cookie
- Model:return View("TargetView", model);
- application 全局
C#中的委托是什么?事件是不是一种委托?
可以使用delegate
关键字来定义委托类型
委托可以把一个方法作为参数代入另一个方法,委托可以理解为指向一个函数的引用。事件是一种特殊的委托。
委托的使用场景
- 事件处理:委托经常用于实现事件处理机制。通过定义一个委托类型作为事件的类型,并将委托实例用于注册和触发事件,可以实现事件的订阅和处理。
- 回调函数:委托可以用作回调函数的参数,用于将某个方法传递给另一个方法,并在需要时进行调用。这在异步编程、多线程和事件驱动编程中非常常见。
- LINQ查询:在LINQ(Language Integrated Query)中,委托用于指定查询条件、投影和排序等操作。通过将委托传递给LINQ方法,可以实现自定义的查询逻辑。
- 委托链:委托可以持有对多个方法的引用,形成委托链。这种委托链可以用于实现事件的多个处理程序,或者在多个方法之间进行协作和扩展。
- 插件和扩展性:委托可以用于实现插件架构和扩展性。通过定义一组委托类型,并允许其他代码提供委托实现,可以实现动态加载和扩展应用程序的功能。
- 委托作为参数:委托可以作为方法的参数,用于将方法作为参数传递给其他方法。这可以实现一种灵活的方式来定义和传递特定的行为或算法。
- 委托作为返回值:委托可以作为方法的返回值,用于根据不同的条件返回不同的方法实现。这可以实现一种动态的方法选择和调用。
什么是装箱和拆箱?
答:从值类型转换到引用类型装箱。从引用类型转换到值类型拆箱。
抽象类和接口的相同点和不同点有哪些?何时必须声明一个类为抽象类?
相同点:
- 都是用来实现抽象和多态的机制。
- 都不能被实例化,只能被继承或实现。
- 都可以包含抽象方法,即没有具体实现的方法。
- 都可以被子类继承或实现,并在子类中实现抽象方法。
不同点:
- 抽象类可以包含非抽象方法,而接口只能包含抽象方法。
- 类只能继承一个抽象类,但可以实现多个接口。
- 抽象类的子类可以选择性地覆盖父类的方法,而接口的实现类必须实现接口中定义的所有方法。
- 抽象类可以有构造方法,而接口不能有构造方法。
总结:抽象类和接口都是实现抽象和多态的机制,但抽象类更适合用于一些具有公共实现的类,而接口更适合用于定义一组相关的方法,供多个类实现。抽象类可以包含非抽象方法和构造方法,而接口只能包含抽象方法。
C#面向对象 OOP
C#是一种面向对象的编程语言,它支持面向对象的编程范式。面向对象编程(Object-Oriented Programming,简称OOP)是一种以对象为基本单位的编程思想,通过封装、继承和多态等概念来组织和管理代码。
以下是一些关于C#面向对象的重要概念:
类(Class):类是面向对象编程的基本构造块,它定义了对象的属性和行为。类是对象的模板,用于创建实例化的对象。
对象(Object):对象是类的实例,它具有类定义的属性和行为。通过实例化类,可以创建一个具体的对象。
封装(Encapsulation):封装是一种将数据和方法封装在类中,以保护数据的安全性和完整性的机制。通过封装,可以隐藏类的内部实现细节,只暴露必要的接口。
继承(Inheritance):继承是一种通过创建一个新类来继承现有类的属性和方法的机制。通过继承,可以实现代码的重用和扩展。
多态(Polymorphism):多态是一种允许不同类型的对象对同一个消息做出不同响应的机制。多态性可以通过继承和接口实现。
抽象类(Abstract Class):抽象类是一个不能被实例化的类,它只能作为其他类的基类。抽象类可以包含抽象方法和具体方法。
接口(Interface):接口是一种完全抽象的类型,它只包含方法、属性和事件的声明。类可以实现一个或多个接口,以实现多态性和代码的解耦。
构造函数(Constructor):构造函数是一种特殊的方法,用于创建和初始化类的实例。它在对象创建时自动调用。
成员访问修饰符(Access Modifiers):C#提供了一些访问修饰符,用于控制类成员的访问级别,如public、private、protected等。
面向对象编程的优势包括代码的重用性、可维护性、可扩展性和可测试性等。通过使用面向对象的思想和概念,可以更好地组织和管理代码,提高开发效率和代码质量。
简述WebServices
WebServices是一种web服务,是微软退出的跨平台分布式应用程序,使用SOAP协议通讯。
WebApi和WebServices的区别
webApi是http协议,WebServices是SOAP协议,
转发和跳转的区别
- 转发(Forwarding)指的是将请求或控制流从一个处理器转发到另一个处理器,而不改变请求的原始地址或URL。转发通常在服务器端内部进行,客户端不会察觉到请求的转发。在转发过程中,请求的处理会在服务器内部交给另一个处理器或页面来完成。
- 跳转(Redirecting)指的是将请求或控制流从一个处理器转移到另一个处理器,并且会改变请求的地址或URL。跳转通常在客户端发生,服务器会向客户端发送一个特殊的响应,告诉客户端去请求新的地址或URL。客户端会重新发送一个新的请求到新的地址,从而完成跳转。
- 转发是一次请求,跳转是二次请求。
进程和线程的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个
进程可以有多个线程,这些线程共享这个进程的资源。
在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
- using 引入名称空间或者使用非托管资源
- new 新建实例或者隐藏父类方法
用sealed修饰的类有什么特点?
答:密封,不能继承。
HashMap和Hashtable的区别
Hashtable是线程安全的,而HashMap是非线程安全的。在多线程环境下,如果需要保证线程安全性,可以使用Hashtable。如果不需要考虑线程安全性,并且希望获得更好的性能,可以使用HashMap。
ado.net的内置5大对象有哪些?分别作用是什么?
- Connection(连接对象):Connection对象用于建立与数据库的连接。它提供了连接字符串、打开和关闭连接的方法,以及事务的支持。通过Connection对象,可以与数据库建立通信通道。
- Command(命令对象):Command对象用于执行SQL语句或存储过程。它提供了执行查询、插入、更新和删除等操作的方法。Command对象可以通过Connection对象创建,并且可以指定要执行的SQL语句或存储过程的名称。
- DataReader(数据读取器):DataReader对象用于从数据库中读取数据。它提供了逐行读取数据的能力,可以通过执行Command对象的ExecuteReader方法来获取一个DataReader对象。DataReader对象是只进只读的,它不支持数据的修改。
- DataAdapter(数据适配器):DataAdapter对象用于在数据源和DataSet之间进行数据的填充和更新。它可以执行查询并将结果填充到DataSet中,也可以将DataSet中的数据更新回数据源。DataAdapter对象通常与Command对象一起使用。
- DataSet(数据集):DataSet对象是一个内存中的数据缓存,用于存储和操作数据。它可以包含多个DataTable对象,每个DataTable对象代表一个数据表。DataSet提供了对数据的增删改查等操作,可以在离线状态下进行数据的处理。
MVC框架中,ActionResult,JsonResult,ContentResult哪个可以return view()?
ActionResult
各种连接查询
- NATURAL JOIN(自然连接):在SQL中,自然连接是通过使用相同列名进行连接的。例如,假设有两个表A和B,它们有一个相同的列名"ID",可以使用以下语句进行自然连接:
SELECT * FROM A NATURAL JOIN B;
- CROSS JOIN(创建笛卡尔积):在SQL中,可以使用CROSS JOIN来创建两个表的笛卡尔积。例如,假设有两个表A和B,可以使用以下语句进行交叉连接:
SELECT * FROM A CROSS JOIN B;
- INNER JOIN(内连接):在SQL中,内连接是通过使用连接条件来匹配两个表的行。例如,假设有两个表A和B,它们有一个相同的列名"ID",可以使用以下语句进行内连接:
SELECT * FROM A INNER JOIN B ON A.ID = B.ID;
- OUTER JOIN (外连接):在SQL中,外连接可以使用LEFT JOIN、RIGHT JOIN或FULL JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行左外连接:
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
- LEFT OUTER JOIN(左连接):在SQL中,左外连接可以使用LEFT JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行左外连接:
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
- RIGHT OUTER JOIN(右连接):在SQL中,右外连接可以使用RIGHT JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行右外连接:
SELECT * FROM A RIGHT JOIN B ON A.ID = B.ID;
- FULL OUTER JOIN(全连接):在SQL中,全外连接可以使用FULL JOIN来实现。例如,假设有两个表A和B,可以使用以下语句进行全外连接:
SELECT * FROM A FULL JOIN B ON A.ID = B.ID;
这些示例是使用SQL语言进行的简单实现。在实际应用中,具体的实现可能会因数据库系统的不同而有所差异。此外,还可以使用其他编程语言和技术来实现这些连接操作,例如使用编程语言中的集合操作或ORM框架。
Mysql视图
视图,虚拟表,从一个表或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用SELECT语句
查询数据,也可以使用INSERT,UPDATE,DELETE
修改记录,视图可以使用户操作方便,并保障数据库系统安全。
语法:CREATE VIEW 视图名 AS 查询数据源表语句;
存储过程创建
存储过程(Stored Procedure)是预编译的SQL语句集合,可以在数据库中创建和保存。存储过程可以接受参数,并且可以在数据库中被调用和执行,提供了一种封装和复用数据库逻辑的方式。
procedure(pro shei jio)
CREATE PROCEDURE [dbo].[MyStoredProcedure]
@Param1 INT,
@Param2 VARCHAR(50)
AS
BEGIN
-- 存储过程的逻辑代码
-- 可以包含SQL语句、流程控制语句等
-- 使用参数时,可以通过@Param1、@Param2等引用参数值
-- ...
END
ASP.NET Core和ASP.NET MVC的区别
- 跨平台支持:ASP.NET Core是一个跨平台的开发框架,可以在Windows、Linux和macOS等多个操作系统上运行。而ASP.NET MVC则是建立在传统的.NET Framework上,主要运行在Windows操作系统上。
- 开发模型:ASP.NET Core采用了新的开发模型,即面向中间件的管道模型。它将请求处理流程划分为多个中间件组件,可以根据需要灵活地配置和组合中间件。而ASP.NET MVC则是基于控制器和视图的模式,通过控制器处理请求并生成视图来呈现结果。
- 性能和轻量级:ASP.NET Core具有更好的性能和更低的资源消耗,因为它是经过精简和优化的新一代框架。它采用了新的Kestrel服务器和高性能的ASP.NET Core运行时。相比之下,ASP.NET MVC是建立在.NET Framework上的,可能会有一些额外的开销。
- 依赖注入:ASP.NET Core内置了依赖注入容器,使得在应用程序中实现依赖注入变得更加容易。而ASP.NET MVC需要使用第三方库或手动实现依赖注入。
- 配置和部署:ASP.NET Core使用了新的配置系统,可以更方便地配置应用程序的设置。此外,ASP.NET Core的部署也更加灵活,可以通过自包含的部署方式将应用程序和其依赖项一起打包。
- 开放源代码:ASP.NET Core是开源的,托管在GitHub上,可以参与社区贡献和获取最新的更新。而ASP.NET MVC虽然也有一些开源组件,但整体上是微软的闭源框架。
总的来说,ASP.NET Core是一个跨平台、高性能、轻量级的Web开发框架,具有更好的可扩展性和灵活性。它采用了新的开发模型和技术,适用于构建现代化的Web应用程序。而ASP.NET MVC则是建立在.NET Framework上的成熟框架,适用于传统的Windows平台上的Web开发。选择使用哪个框架取决于具体的需求和项目要求。
ASP.NET MVC Action
在ASP.NET MVC中,Action是控制器中的一个方法,用于处理来自客户端的请求并生成响应。Action方法根据请求的HTTP动词和路由规则来确定执行的逻辑,Action方法可以返回各种类型的结果,如View、PartialView、Json、File等,Action是ASP.NET MVC框架中的核心概念之一,用于处理请求和生成响应。通过编写适当的Action方法,可以实现业务逻辑的处理、数据的获取和操作、视图的渲染等功能。
TCP三次握手和四次挥手
TCP 的三次握手和四次挥手是建立和关闭 TCP 连接时使用的一组步骤。下面是对三次握手和四次挥手的简要说明:
三次握手(Three-Way Handshake):
第一步(SYN):客户端向服务器发送一个带有 SYN(同步)标志的数据包,表示客户端请求建立连接。此时客户端进入 SYN_SENT 状态。
第二步(SYN-ACK):服务器收到客户端的请求后,向客户端发送一个带有 SYN 和 ACK(确认)标志的数据包,表示服务器接受连接请求,并向客户端发送确认信息。此时服务器进入 SYN_RCVD 状态。
第三步(ACK):客户端收到服务器的响应后,向服务器发送一个带有 ACK 标志的数据包,表示客户端接受服务器的确认信息。此时客户端和服务器都进入 ESTABLISHED(已建立)状态,连接正式建立。
四次挥手(Four-Way Handshake):
第一步(FIN):当客户端决定关闭连接时,向服务器发送一个带有 FIN(结束)标志的数据包,表示客户端不再发送数据。此时客户端进入 FIN_WAIT_1 状态。
第二步(ACK):服务器收到客户端的结束请求后,向客户端发送一个带有 ACK 标志的数据包,表示服务器接受关闭请求。此时服务器进入 CLOSE_WAIT 状态。
第三步(FIN):当服务器也决定关闭连接时,向客户端发送一个带有 FIN 标志的数据包,表示服务器不再发送数据。此时服务器进入 LAST_ACK 状态。
第四步(ACK):客户端收到服务器的结束请求后,向服务器发送一个带有 ACK 标志的数据包,表示客户端接受关闭请求。此时客户端进入 TIME_WAIT 状态,并等待一段时间后关闭连接,服务器在接收到客户端的确认后关闭连接。
通过三次握手,客户端和服务器建立了可靠的连接,可以进行数据传输。通过四次挥手,双方完成了数据传输并关闭了连接。
这些步骤确保了可靠的连接的建立和关闭,以及数据传输的完整性和有序性。
希望这个简要的说明对您有所帮助!如果您有任何其他问题,请随时提问。
缓存穿透问题
给定一个数据库没有的字段id,缓存中查不出来会去查数据库。如果有恶意用户则会增大数据库压力。
缓存雪崩
缓存项集中过期引起缓存雪崩。
缓存击穿
缓存击穿是指在使用缓存的系统中,当某个热点数据失效或者被清除时,同时有大量的请求涌入,导致请求直接访问数据库或其他存储系统,从而造成系统性能下降甚至崩溃的情况。
总结
对于有高学历的我觉得找工作简单很多,有很多大公司可以考虑。然后学历不是很高,技术又还行的,可以投递中大型和中小型公司的开发岗位,公司建议找100人以上的公司,然后自己去用软件查查公司有没有纠纷,参保人数是多少,注册时间是多少。擦亮眼睛,不要进骗子公司了。
在找工作的时候不要忘记背面试题了,大部分面试官一般会问数据库知识,岗位技术方面的知识,对于实习的工作,问的问题还是比较简单的。然后在面试的时候有不会的面试题,自己先记着,可以做笔记,面完之后继续背。
然后投递简历的时候不要看到招聘信息上写的1年经验就不投了,有时候公司也会招优秀的应届生,我的建议是海投。