索引:
.NET框架基础知识[1] - .NET框架基础知识(1) http://www.cnblogs.com/haoyifei/p/5643689.html
.NET框架基础知识[2] - .NET框架基础知识(2) http://www.cnblogs.com/haoyifei/p/5646288.html
.NET框架基础知识[3] - C# 基础知识(1) - http://www.cnblogs.com/haoyifei/p/5650541.html
经过了四年的工作,我已经跳槽6次了。这四年我全部都使用C#进行开发,除了获得到的offer之外,还面试失败或拒掉了不少offer,加起来面试的次数至少有30次。这些面试有质量很高的,也有泛泛而谈的,不同面试有时候还会问到几乎相同的问题,通过对问题的深入程度,可以大致判断一家公司和面试官的水平。
跳槽就是为了更好的生活。而改善生活需要有强大的业务能力,说服面试官在众多候选人中选择你作为胜利者。在若干年的工作学习中,我的水平也慢慢上升,一开始是什么都不会,后来会一些东西,到现在也可以从面试官的问题中,大概了解到他/她的水平如何。
不同类型的公司的面试题目也略有不同,而这些题目要不代表着你面试通过之后可能在实际工作中遇到的问题,要么就是面试官希望通过题目了解你个人的水平如何。例如Facebook,Google,BAT这种综合性公司在校招的时候,面对的都是应届大学生,他们没有什么可能会对搜索引擎十分专精,或者擅长自然语言语义分析。他们会的只是四年的大学计算机教育而已,面试完了之后,这些胜出者也不知道自己会去哪个组做什么方向的工作。所以这时候,给他们出题也不能考搜索引擎,大数据,而只能考最general的内容,那无非就是计算机基础知识和算法了。
而社招大部分情况下,面试官希望你第一天面试通过,第二天就能上班,并且来之能战。所以这时候问题基本都是你将来工作可能会遇到的问题。面试官希望你研究过这些问题,并且证明自己能做的比别人更好。当然,面试官也希望你的基础知识水平牢固,不会在开发,部署,测试等基本流程上一问三不知。例如,我曾经面试过三家投行,他们都希望面试者熟悉WPF或者Winform。所以,其中的两家问到了工作线程如何修改UI线程控件的内容这个经典问题。对于这个经典的情境,你不仅需要知道如果是按照常规的方法处理会发生什么(UI线程控件的内容只能被拥有控件的线程修改),还要知道怎么解决(Winform使用委托,WPF使用Dispatcher)。而且,你还可以提,如果你的应用是ASP.NET Web Application,则你需要反其道而行之,使用ConfigureAwait强制令系统不进行任何线程的切换。如果面试官知道你在说什么,他/她一定会很开心。如果面试官表现的一脸懵比,你可以在心中为这家公司降低一个档次。
当你回答问题时,如果你可以答的超乎面试官的意料,则他们给你开的工资可能也会出乎你的意料。例如,对于简单的问题“如何实现一个单例模式”,如果你只是给出了很简单的一个构造函数,则面试官可能会觉得你对线程安全不够敏感(当然比较弱的面试官可能会很高兴) 。如果你加了双重锁检查,面试官会问你第一个if是做什么的。如果你也知道,并且还可以解释清楚,为什么需要双重锁检查,面试官会觉得很满意。如果你甚至还可以提一句,在很多依赖注入工具中,只需要一个函数就能保证对象在全局都是单例的,例如autofac就有这个功能。面试官将会非常爽,然后话题可能会转到ioc,或者谈谈天气。
外国人问问题有时候不按常理出牌(或者你可以理解为,外国人的常理就是那样)。我遇到过的比较有趣的问题有:说出你觉得c#好的任意一个理由(我给出的答案是它的语法自然易懂,且比较优雅,背后编译器作的大量工作你可以不用知道。例证如lambda表达式和async与await关键字),为什么c语言被命名为c,说出你自学某语言时看过的书籍,你最喜欢哪种数据结构等。这些问题没有标准答案,你需要结合事例解释你的答案。对付这种问题,死记硬背是没有什么用的,你需要理解或者在背书的基础上,形成你自己的观点。
在学习的过程中,我泛泛阅读了若干本经典书籍,当然还有很多本正放在书架上供着,我可能一辈子也不会去看或者理解的了(例如“编译原理”)。我也看了很多博客,其中有大量现成的代码可供直接使用。我认为,作为一个立志奋发图强的.NET + C# 程序员,应该了解的知识包括:
上面这些如果你基本都会的八九不离十,你在任何一家公司都可以胜任一个后端程序员了。但如果你面试的职位还需要你写点API,以便让前端的哥们使用,那你还要粗浅的了解以下内容:
1. Web基础,包括五层模型,get和post的区别,http协议的一些状态码以及IIS的基本设定。对这个话题的深入了解,可以搞一本计算机网络方面的书籍,里面有详细的关于五层模型,TCP和IP协议的细节。如果你不是应聘网络方面的专家级别职位,我不认为它们是十分必要的。当然,如果你立志成为这方面的专家,请遵循http://coolshell.cn/articles/4990.html
2. Web服务。Web服务具有悠久的历史,最经典的两种方式SOAP和Restful的区别要知道。另外,微软对于这两种方式都给出了自己的实现,即WCF和WebAPI。
3. 对MVC有一定的了解。了解如何利用工具,对你的API进行自动化或非自动化的集成测试。
4. OWIN。微软的OWIN帮助我们从ASP.NET又臭又长的生命周期解脱出来,从此我们可以定义自己的生命周期。新的ASP.NET Core中也是这样,生命周期已经成为历史。我们要了解OWIN基本的工作方式,以及它如何和ioc工具进行配合。另外,通过OWIN,我们的工程可以和IIS解耦,可以用其他的工具代替笨重的IIS。
5. 对于金融交易系统,需要特别关注一下SignalR。它集成了服务器和用户进行通讯的几种方式,从常规的轮询,到服务器主动发送讯息,以及现在常用的WebSocket。它会根据情况自行选用它认为最合适的方式。
上面的内容并不包括前端,这是因为我觉得全栈工程师十分不现实(因为前端的内容和后端几乎是一样多的,而光掌握后端的内容,也需要至少3-5年的时间),所以不打算朝这个方向努力,而且我对前端的了解也十分皮毛。当然,只会简单的HTML和jQuery,可不能称自己是一个合格的前端工程师。
在漫漫的学习过程中,我们不仅要打牢基础,还要时刻关注新技术的动向。C# 6推出来一段时间了(虽然其中并没有什么重大的改进),C# 7也马上就要问世。ASP.NET Core的推出,把前端的打包和测试拉上了台面,同时令Angular JS 成为官方前端语言。对于后端来说,也许你没有机会为公司贡献Angular JS代码,但把握住新技术的演进流程,也会对整个知识体系的融会贯通有重要的作用。
我已经写了不少笔记,虽然大部分都是抄别人的。我在这里也打算效仿博客园众位前辈,弄一个面试题系列,其中不完全包含上述的所有内容,望各位大大不吝赐教。毕竟互相交流,人人都能受益。那么废话少说,我们马上开始。
原文:http://www.cnblogs.com/zhehan54/p/5651943.html