本文章是程序汪粉丝的经历,我看了比较励志也分享给大家,虽然大家的技术跟他(.net)不一样,但学习的方式可以参考

本文你会看到这些,认可就继续读正文

  • 职业规划开始走偏了,请马上调整过来了
  • 程序员交很多技术朋友真的很重要(比如认识程序汪 javacm.com)
  • 外包没有归宿感,可替代强
  • 互联网公司对自己技术成长非常有帮助,但工作强度非常高 996常态
  • 模拟面试,简历优化,投简历的技巧都很重要
  • 爱总结爱输出的人不会差
  • 学习是人生最大的投资
  • 技术是一个不断迭代的过程,所以要保持一个学习的状态
  • 年轻多读书考好大学,不然年龄大了特别迷茫焦虑

正文

基本情况

 

本人是15年参加培训,在湖南长沙的一所培训机构培训二年多的时间,当时才16岁, 高二刚读完,成绩也是那种特别不好的,因为朋友的影响,选择了辍学,属于那种半路出家的,在培训期间,主要以.net为主,S1到S3学期,加上生活费一共花了差不多7万左右。在整个年级里面属于那种算学的还不错的(自己认为)。我今年22,从事.net开发,这是我的基本情况。

 

 

工作经历

一共到现在换了四家公司。下面介绍下每家公司的一个情况和总结。

 

(2017/3-2017/10)运维开发  8K

17年来上海找工作,因为当时没有工作经验么,所以简历包装了一下,找了一份运维的工作,带了一个四人的小团队,当时的想法也很简单,只要能找到工作就行,做运维做了不到一年的时间,也学到很多东西,不管是交流、思考问题、管理,都感觉提高了很多。最终也是因为想到自己的一个职业规划,还是想从事开发方面的工作。

 

(2017/10-2018/5).net开发  12K

2018年入职了一家医疗行业的小公司,做.net开发,比较偏传统。做了差不多半年左右的时间,因为公司拖欠工资、资金链断裂问题,选择了离职,但在这半年的时间里,技术提升了很多,同时也收获了一些技术上的朋友,从最开始的领导,慢慢到现在变成了朋友,一直到现在都保持技术上的交流,包括工作方面的,我们都属于特别热爱的技术的那种,聊技术能聊一晚上,说的可能有点夸张,但在.net这个领域里面算研究的比较深的了。

 

(2018/6-2019/4).net开发  17K

然后接着之后做了一年左右的外包,法本外派到微软,就类似于人力外包,然后帮微软的客户做房地产相关的项目,BPM、ERP类型系统,当时去微软也是抱着一种学习的心态去的,因为当时对外包这个也不知道是一个什么样的情况,没有体验过,做了一段时间明白了网上对外包的一些不好的看法,项目不稳定,代替性强,只要项目已结束,PM觉得你的作用不是很大,随时都有可能把你裁掉。工作地点不稳定,像我当时做完一个项目,接着又去另外一个客户现场做,这样长期下来,跑来跑去,就感觉自己特别的累,但是也有好的地方,上班的时间比较自由,不太被控制,同时项目结束一批换一批,接触到的人也比较多,这样也能提高融入团队的能力、交流能力。在这一年的左右的微软外包时间里,也学到了很多Azure相关的技术、另外对.net Core也有了一定的认知与了解。也为后面的工作,做了铺垫。

 

(2019/4-2020/7).net高级开发  23K

2019年4月,刚满了二年工作经验的我,也收获了一些offer。最终选择了一家互联网公司,旅游行业,待遇也比较的可观,虽然没有大厂的offer,但当时对于我来说已经算比较不错的了,毕竟技术栈也是我比较感兴趣的,主要开发一些基础设施系统和维护,日志系统、发布系统、授权系统来支撑公司的业务系统和平台。这一年的时间里,基本上每天都是晚上10点左右下班,但在这样的高强度工作下,感觉自己对微服务的理解、设计能力、与一些中间件的使用和研究都提升了很多, 也接触了很多比较新的技术,Docker、Kubernetes、RabbitMQ、Redis、ElasticSearch等。但由于今年的疫情,公司受到了很大的影响,正因为这次疫情,技术相关的部门裁了很多人,我也在其中,但赔偿还行,3个月,8月份开始找工作,到现在也收获了一些比较不错的offer。

 

关于面试

一个好的面试,往往需要做很多的准备,我6月份离职的这段时间,二个月里,基本上都是在家学习,但也会和朋友一起出来吃饭阿啥的,我面试之前会找人来模拟面试,然后根据模拟面试的一个情况,梳理下说话的节奏、项目介绍、技术点的回答的流畅性,然后简历修改完之后,最好找一个你认识的技术或者HR,帮你看下,这样简历投递后反馈率还是比较高的,还有一点就是每次面试完,最好把面试中一些回答的不是很好的问题或者是没回答上的,记下来,然后针对的去学习,下次面试遇到了会提高面试的一个通过率,投递简历的话,如果是没有工作经验的,或者没有一个目标的,可以选择批量投,我刚出来找工作的时候,就是批量投,自己也没有一个明确的目标,只要能找到工作就行,如果是有工作经验了,哪就针对的去投,还有就是投的一些公司,最好做下调查,比如看下融资情况,做什么业务的等等…, 4个月的时间里,前面二个月是在家学习,后二个月是在找工作,前前后后面试了大概15家公司左右。

 

这里说下我面试被问到一些面试题吧,这也是我自己的一个总结。

 

1、.net 基础

1、Task和Thread有什么区别

2、当执行遇到await的时候会执行什么动作

3、事件和委托之间的区别,Action和func的区别

4、Dictionary在多线程并发的情况下会出现什么问题,ConcurrentDictionary之间的区别

5、EF 在没有执行前,比如还没有Tolist()等情况下,做了什么事情

6、使用EF有没有遇到过什么问题?当时我的回答是在多线程的情况下更新实体,更新不了,必须重新取一次,才能更新,也就是跨线程了

7、IQueryable接口的作用

8、说说垃圾回收机制

9、MVC里面注册管道处理模型的步骤,MVC有哪些过滤器,在什么样的场景下适合使用,分别介绍下。过滤器的注册方式

10、AOP、IOC的作用

11、设计模式,一般都是问比较常用的,比如单例的三要素、工厂、代理、适配器,最好举几个例子

12、泛型里面的协变、逆变的作用

13、C#8.0新增的语法,你知道的有哪些

 

2、.net Core

1、.net Core启动执行顺序

2、三个依赖注入方式,生命周期、泛型注入、获取实例有哪几种方式

3、.net Core和 .net framework之间有什么不同

4、读取配置文件里面的接口IOptionsSnapshot、IOptionsMonitor之间的区别

5、读取配置文件,怎么保证修改后每次都是读取到最新的

6、配置环境变量的作用

7、JWT和Cookie之间的区别

8、什么是跨域、同源,怎么防止跨域请求

 

3、框架

1、Quartz.net创建任务的三大对象,具体说下每个对象是用来做什么的,自己有做过扩展么,说下IJobListener、ITriggerListener接口里面的方法,怎么防止Job在同一时间重复执行

2、Abp里面集成了哪些组件,事件总线你是怎么用的,注册实例有哪几种方式,说下Abp的启动流程, 你知道Application层暴露服务是怎么实现的么,需要注意哪些点

3、Autofac和.net Core原生的注入,有什么区别,什么样的场景下适合用Autofac属性注入

 

4、中间件

1、说下Redis里面的五大类型吧,分别适合什么样的场景使用,什么是缓存穿透、缓存雪崩,怎么避免这种情况发生,有搭建过集群么,集群的模式有哪几种,说下持久化RDB和AOF的方式区别、什么是哈希槽

2、介绍下RabbitMQ的四种路由,怎么设置插队,说下消息确认的方式,Tx、Confirm二种事务模式的区别

3、说下ElasticSearch的常用的数据类型,keyWord和text的区别,说下分词器的作用

4、 Apollo有哪些功能,大概的说下

 

5、微服务

1、如何设计一个高可用的微服务架构?一开始可以简单的说下,不要说的太细了,如果是问到里面的细节的话,最好仔细的去回答。这个问题是我面试架构师的时候被问到的,所以普通的开发可能不会问。

2、说说你对DDD了解的一个深度吧,说下领域是怎么划分的,介绍下值对象、聚合、聚合根,实体之间的联系。什么样的情况下聚合根当做一个整体使用,限界上下文的作用,你有没有自己独立搭建过项目,大概说下你是怎么分层的,每一层之间的联系是什么

3、介绍下Polly里面的策略,失败重试、服务降级、失败降级、超时处理等

4、HttpClient创建的三种模式,请求拦截器的作用

5、gRPC有什么特点,Protocol Buffers序列化的原理

6、用过identityserver4么,如果说用过,会问你在项目里面是怎么用的,和JWT有什么区别,需要注意哪些点

7、dockerfile的编写,编写dockerfile常用的指令,分别介绍下

8、优化镜像有哪几种方式?我当时回答是 From基础镜像找小一点的,尽量使用alpine,或者使用多阶段构建。

9、 kubernetes和Docker之间的区别?搭建一个高可用的集群,需要用到哪些组件?这是我的回答:nginx、Keepalived、HAProxy、Calico、metricsServer、CoreDNS、KubeProxy

10、什么是Restful?说下你在项目里面是怎么设计Api的。

 

6、数据库

1、 聚集索引和非聚集索引的区别

2、 说下存储过程吧,你平时用的多么,说下优点与缺点

3、 说下建表的三大范式

4、 怎么看执行计划,你平时是怎么优化SQL语句

5、 事务隔离级别,什么是悲观锁,这个问题出现率比较低

 

7、算法

一般的公司很少有算法题,出现比较高的是一些外企、一线互联网公司,像我最近去面的微软、iHerb、lexisnexis,直接在白板、白纸上写,如果写不出,可能下面的面试没法继续聊了, Leetcode上面的简单和中等的题要通过。每天抽时间多刷一刷。这样长期积累对自己的算法功底、代码的健壮性能提高很多。

 

下面是今年面试遇到的一些算法题

 

N叉树的最大深度

平衡二叉树

爬楼梯

寻找两个正序数组的中位数

两个数组的交集

重新排列字符串

排序链表

排序算法

最近的请求次数

斐波那契数列

 

关于学习

我的学习方法,看相关的视频教程,比如腾讯课堂、极客时间、慕课网这种平台都是比较不错的,里面有些视频是收费的,我觉得学习就是一个投资的过程,自己也花了不少的钱在这上面,然后就是体系化的去学习和实践,每学一个技术点,最好记录到笔记上,或者是记录在博客上,这样有利于加升印象,特别学的东西多了之后,不通过笔记记录,很难记住,主要还是找到适合自己的学习方法, 我自己特别适合看视频来吸收,还有就是看相关的技术博客、比如博客园里面的博主:张善友、蒋金楠、汤姆大叔等…,写的技术文章给我的影响还是蛮大的,看书也是不错的,我最近刚看完一本书,大概花了差不多四个月左右,叫《实现领域驱动设计》, 看完这本书感觉自己对业务的一个设计和划分收获了很多,然后就是给每周制定学习计划,这个计划时间,也不要控制的太死了,最好中间空一些时间出来,因为可能中间会插入一些其他的事情来,这样就会影响到后续的一个计划。如果已经工作了的,可能只有周末才有时间学习,.net Core依赖注入的源码、WebApi源码、Abp源码、Docker、K8s,这是我今年一直在学习的技术,像我的话,周六、周日下午5点左右开始,一直到晚上10点左右停止,中间包括吃晚饭的时间,然后洗完澡,躺在床上看会手机,就休息了。这是我自己的一个作息习惯,我上午基本上没什么状态,一到下午或者是晚上头脑会特别的清醒。多交一些搞技术的朋友(比如认识程序汪),多交流与指点,能给自己的一个职业发展起到作用。还有就是把英文提升下,因为很多的框架的文档都是英文,包括一些外企对英文也是非常看重的,所以英文是很重要的,平时去报名参加一些培训提升下,我是18年8月开始针对的去学习英文的,通过参加线下培训班的方式,周六下午1点到3点这个时间,每周坚持学习一次,到现在差不多一年左右的时间,现在至少能和老外简单的做英文交流了。

 

 

我觉得学习这个话题,对于程序员来说是很重要的,其他的领域也很重要,因为技术是一个不断迭代的过程,所以要保持一个学习的状态,以后对自己的一个职业发展是非常顺畅的,如果自己不迭代升级,长期这样的话,可能会被一些年轻努力的程序员取代,薪资也会跟着年龄下滑,所以趁着年轻而没有什么压力的情况下,把自己的技术功底学好,多投入一些钱花到学习上来,到一定时候,这些努力都会得到相对应的报酬,如果是年轻的时候不努力,年龄大了而且有家庭了,这个时候可能会感觉自己很迷茫,不知道以后的路怎么去选择,因为我身边有这样的技术朋友,能感觉的到那种迷茫,一般到了一定年龄很难克制自己去学习了,因为来自家庭上、工作上的压力会让你分散这些精力和注意力,所以不要等到年龄大了再来学,那个时候已经晚了。

 

 

个人感悟

说下我的一个经历与状况吧,以前我是一个比较喜欢打游戏的,只从工作后,就开始慢慢的放弃了这些爱好,包括篮球,因为被身边的朋友所影响和来自一些家庭的压力,就全心全意的把时间和精力投入到工作上来了,因为我本身没上过大学,也不知道大学的生活是一个什么样的状况,培训出来后是一个专科的学历,19年考了一个专升本,所以有那么一点点羡慕那些上过大学的同学吧,因为工作的原因,也认识了一些同事,他们的学历背景都比较的好,而且学习能力、与人相处都不错,以前我自己觉得学历没什么用,只是一块敲门砖,但现在看上去,有那么一点天真,特别是找工作的时候,找相当大一点公司,可能就会因为学历连面试机会都有没有,所以学历还是很重要的,像我目前的一个打算是2021年准备考一个硕士来弥补下学历,随便开阔下视野,以前欠下的东西,只要选择继续走这一条路,迟早要还回来的,不然后面的路很难走,特别是到一定年龄和年薪的时候,再往上晋升领导或者是技术总监,这个时候学历可能会受到一定影响。趁着还是学生的时候,多读点书,考一个好一点的大学,尽量不要选择我这种半路出家的,不然后面的路会走的很累。

 

最后聊下技术

因为我本身是做.net的,就说下目前我对.net了解的一个状况吧,.net在整个中国,岗位的需求量相当于Java还是很少的,特别是大型的互联网公司,基本上没有,现在出了.net Core之后相当于好一点了,因为做.net的太少了,有很多原因,.net在互联网行业的一些技术相当于Java还不是非常的成熟,微软对.net的一些API封装的过于丰富,导致开发人员把注意力放在实现业务中,从而这样对一些框架和API的理解和原理了解的不是很深,然后这样就形成了一种依赖,没有人来做一些框架上的东西了,到现在比较成熟的框架特别的少, 还有就是一些数据结构的实现、框架和算法,我这三年来了接触到一些同事和朋友等,很少会去研究这些框架、数据结构的底层原理和实现,更不用说算法了,所以为什么说.net入门简单,精通难。我三年多的时间里,在上海面试了差不多有80家公司左右,大部分的面试官基本上不会问你MVC、WebApi、WCF…里面的一些组件实现的原理和机制等一些源码的问题、包括一些数据结构的实现原理,还有就是开源的问题,以前.net framework不开源,这个问题,导致很多.net 转向java。 现在出了.net Core之后要好很多了,一些框架和中间件的支持也比较的完善和成熟了,面试的难度也增加了很多,包括岗位的薪资也提升了很多,但还是需要一些时间的沉淀和更多的人来参与进来做贡献,这样的话,.net以后会发展的越来越不错的。

网站javaclass.top收集整理