首页 > 编程笔记 > C#笔记
阅读:854
C#/.NET开发学习路线以及职位要求
在我们学习 C# 语言之前,也许大家会有这样的疑问,作为一个合格的 .NET 程序开发人员,需要掌握哪些知识?这些知识应该如何去准备?如果把 .NET 程序开发人员简单地分为初级、中级和高级的话,自己又应当属于哪一级呢?
下面先从 .NET 程序开发职位要求讲起。
.NET 程序开发职位要求
曾几何时,面向对象编程语言是 Java —统天下,但现在,.NET 开发的职位越来越多,很多大型企业也选择 .NET 平台搭建自己的系统与服务。
在各大招聘网站上都活跃着大量的 .NET 开发职位,这些职位的技能要求互不相同,但可以简略归纳为三部分:
必要技能:包括主语言相关、设计与架构相关、岗位相关、数据库相关、线程相关以及语言相关。
加分技能:包括软件工程相关以及其他。
软性技能:包括文档书写、分析问题与解决问题的能力、沟通能力等。
例如,下图为某招聘网站上的一个“.NET资深开发工程师”的岗位要求。
其中第 1〜5 条都属于必要技能,包括对 .NET 平台开发经验的年限要求,以及掌握 ASP.NET.MVC、WebAPI 等各类 .NET 平台部件的要求。
第 4 条为设计与架构相关要求,第 5 条则是数据库方面的要求。
第 6〜7 条为软性技能,第 8〜9 条为加分技能(通常有“优先”等字)。
那么,知道了应聘的要求,我们该如何进行准备呢?针对每种不同要求,又需要如何学习?下面主要讨论必要技能和加分技能。
必要技能
虽然各个岗位对必要技能的要求不同,但 一般来说,必要技能可以划分为几部分,如下图所示。
C# 相关
因为咱们接下来的主要任务是学习 .NET 和 C# ,所以我就默认 C# 是岗位要求的主语言。
对于 .NET 程序开发人员来说,主语言包括 C# 本身,以及它的运行环境 .NET 开发平台。
对于 C#语言来说我认为十分重要,必须要掌握的知识点如下图所示:
其中:
.NET 平台基础知识:包括 .NET 平台构成,.NET 平台语言的编译(IL 和 JIT),以及编译之后的结果一一程序集的结构和部署。另外,什么时候需要直接操作程序集(反射),及其优缺点。
C# 类型基础:C# 包括引用类型和值类型,及其区别和联系,它们在内存上又是如何分配的。
C# 作为面向对象的语言:C# 是怎样体现了面向对象的三大特征:封装、继承和多态的,接口、抽象类的区别和联系,以及何时考虑使用接口。
内存管理和垃圾回收机制:内存管理和垃圾回收机制是什么样的;根据 CLR 的垃圾回收机制,我们又应当做些什么。
C# 数据结构:C# 中主要的数据结构的区别和联系。C# 提供了非泛型和泛型的集合,在什么情况下,选用什么数据结构,Array、ArrayList 和 List
C#每一代的主要特性:1. 委托与事件、反射;2. 泛型;3. LINQ;4. 动态语言运行时;5. async/await 归到异步部分。其中,又以 LINQ 尤为复杂,它包括了扩展类型、Lambda 表达式(表达式又是一个很大的话题)、闭包等,这些都是面试时常见的问题。
对于这些形形色色的特性,除了可以答出它们的定义之外,还需要知道,为什么要引入它们,引入它们是为了解决什么问题,在没有它们的时候,同样的问题又是怎样解决的。
设计与架构相关
设计与架构相关的内容如下图所示。
其重要性仅次于主语言,因为这个技能严重影响代码质量。
设计与架构的学习和理解绝非一日之功,对它进行“临时抱佛脚”基本是不可能的,通过考察面试者对设计模式、面向对象的理解,基本可以准确地将面试者归到高手、中等和初学者这三类中。
当然,如果岗位本身比较初级,那么这方面的要求将会相应降低。
因为 C# 是一个面向对象的编程语言,所以,面向对象成为面试考察的重点内容。
经典的设计模式就是灵活运用面向对象的结果。
常用的知识点包括:
面向对象设计五大原则。光背书没用,一定要用过(在项目中用或者自己用)才能有自己的心得体会。
常用设计模式,包括单例模式、策略模式、观察者模式、工厂方法模式等,及其 UML 类图。
依赖注入的概念,以及依赖注入的工具。
岗位相关
如果用人单位招的是 ASP.NET 程序员,那么肯定得了解 ASP.NET 生命周期、路由、前后端传值、MVC,以及至少一门前端语言等。
如果招的是后端,可能会问一些关于 Web 服务、WebAPI 的知识。
专门负责写 WPF 应用的岗位,可能会在线程上大做文章。
当然,框架类库的基础知识点也很重要。例如对 WPF,如果你不知道如何禁止用户更改窗口的大小,那没什么关系,上网一查即可;但如果你不清楚长任务时如何保证界面良好的响应,工作线程如何更改 UI 线程控件的值,那么你编写出来的 WPF 应用一定会让用户怨声载道。
有些岗位还需要应聘者清楚分布式、脚本语言、Linux 环境、缓存、消息队列、高级算法、大数据应用等相关知识。
对这些知识的掌握和理解,一方面需要看书,另一方面也要结合相关项目经验。岗位相关的知识点五花八门,因岗而异。
数据库相关
确实有一些开发者不需要和数据库打交道,不过,大部分岗位都要求对数据库操作有一定了解。
数据库方面的技能如下图所示。
如果一个岗位要求熟悉数据库,那么面试官期待的将是:
使用主语言访问数据库并熟练掌握增删改查操作。对于 C# 做主语言的情况,可以使用非 ORM (ADO.NET) 或 ORM (Entity Framework) 两种工具。
基本的 SQL 书写。DBMS 常用对象及工具,例如表、视图、存储过程等。
数据库基础知识,例如什么是范式,为什么数据库要遵循范式,不遵循范式的数据库会产生什么问题,什么是索引 (聚集索引和非聚集索引 ),索引的利弊等。
什么是事务,为什么需要事务,没有事务会怎么样,解释事务隔离层级。
上面说的都是关系型数据库中最重要的知识点,有些岗位还需要应聘者懂得非关系型数 据库、数据仓库等。
线程相关
很多复杂的应用都会出现多线程的身影,线程相关的技能如下图所示。
Windows 操作系统赋予了我们使用线程的能力,我们可以利用多线程改善程序的性能。
对这一块知识,很多初级开发者都不清楚,可能是由于没有机会写一个需要多线程的应用。
关于多线程的材料较少,而且多为英文,也是初级开发者对于线程不清楚的另一个原因。
但是,大型应用,或者对性能要求很高的应用,多线程则无处不在。
.NET 本身也提供了非常丰富的线程管理类库。
语言相关
这里的语言相关是指使用英语的能力。具体来说,包括阅读英文文档、英文邮件写作,甚至使用英语和他人进行沟通的能力。
对于外企来说,这块非常重要,而非外企则相对不那么重要,但由于目前大部分较为权威的文档和资料仍然是英文的,而且缺乏翻译,所以开发者还是需要把自己的英语水平提升,能够无障碍地阅读英文技术文档。
这一块的学习只能通过日积月累,别无捷径。不过,我不推荐大家马上拿来一本四六级甚至托福单词去背,因为,其中大部分单词在实际开发中都遇不到,而真正需要知道的单词(例如,delegate 委托,interface 接口等),要么不在词汇表里,要么根本不是这个意思,而你把 abandon (四级的第一个单词)背得再熟,平时也基本看不见它。
更快捷的方法是阅读 MSDN 文档,并把不会的单词记录下来。
加分技能
软件工程和项目经验相关
虽然也有单枪匹马搞定项目的例子,但那通常出现在“远古时代”,现在的软件开发项目越来越复杂,常常需要多个人组成团队一起合作。
团队会有专门的项目经理负责需求的整理(也可能没有,如开发者自己兼职项目经理),制定开发进度,开发者同心协力,从小目标开始,分而治之,最终完成项目。面试官(可能是开发者,可能是管理开发者的团队领导),不仅仅关心一个团队新人是否有能力完成领导交给他的任务,也会关心这个新人是否可以和现有人员通力合作。
面试官可能会问以下问题,并根据你的回答默默思考你和新团队的契合程度:
项目经验,你之前做过什么,最得意的项目是什么,你在其中处于什么角色,解决了什么问题。
你之前的项目是瀑布开发模型还是敏捷,你更喜欢哪种,敏捷有什么优点和缺点。
你之前公司的代码是如何实现版本控制的。
你对单元测试有什么认识,是否写过单元测试代码。
如果面试者对这一块很不清楚,或者,面试者之前完全没有用过相关的工具(代码控制、测试等),面试官可能会担心这位面试者写出来的代码质量不高。
其他个人经历
这部分主要包括个人网站、社区贡献(如写书、翻译、MVP、论坛回答问题等)、开源项目,甚至个人出版物等。
随着网络的开放,开源运动的兴起,越来越多的开发者愿意分享自己的知识和代码到社区,也对其他开发者的批评和指正报以积极的回应。
由于大部分人都没有什么社区贡献,因此,在社区积极热心提供知识的那些开发者就很容易脱颖而出。
参与社区的活动会扩大自己的人脉,从而对找工作有着积极的作用。
而且, 对社区的贡献也体现出一个人在工作之余,仍然对技术有着浓厚的兴趣,并愿意将自己的心得体会分享给他人。
高级技能
除了上面列出的技能外,如果应聘的职级较高,那么还可能会有属于高级开发人员的一些必备技术型技能。
这些技能不是一项特定的技术,而是各项技能的综合,用于解决一些特定的问题。
例如,大部分大型 IT 公司都拥有一个自己的门户网站,它的访问量是十分巨大的,因此,大型 IT 公司的高级开发人员必须熟悉如何让系统在超高并发下保持稳定,找出系统性能的瓶颈,然后对其进行优化。
对这个问题的解答,并不限于一门语言或一种工具,而涉及方方面面的知识,这些知识的积累通常需要完整经历一个大型项目,并且该项目要足够大,这就限定了先决条件——小公司基本上是无缘大型项目的。
具备高级技能的开发者在就业市场上屈指可数。
所有教程
socket
Python基础教程
C#教程
MySQL函数
MySQL
C语言入门
C语言专题
C语言编译器
C语言编程实例
GCC编译器
数据结构
C语言项目案例
C++教程
OpenCV
Qt教程
Unity 3D教程
UE4
STL
Redis
Android教程
JavaScript
PHP
Mybatis
Spring Cloud
Maven
vi命令
Spring Boot
Spring MVC
Hibernate
Linux
Linux命令
Shell脚本
Java教程
设计模式
Spring
Servlet
Struts2
Java Swing
JSP教程
CSS教程
TensorFlow
区块链
Go语言教程
Docker
编程笔记
资源下载
关于我们
汇编语言
大数据
云计算
VIP视频
优秀文章
C++文件输入输出流(无师自通)
GB2312编码和GBK编码,将中文存储到计算机
C语言转义字符
Qt元对象和属性系统详解
文本文件和二进制文件到底有什么区别?
数据库涉及到哪些技术?
Python SQLite create_function()方法:注册自定义函数
Spring setDriverClassName方法:设置数据源的驱动类
Spring queryForObject方法:查询的结果以对象类型返回
JS Undefined类型