关于学习.NET的历程回顾
自从2023年9月11日注册公众号以来,这次还是第一次介绍自己。我今年24岁,双非本,211硕,非计算机相关专业。大学期间接触过计算机相关的课程可能就《大学生计算机基础》、《C语言程序设计》,并且也没掌握多好。
22年4月研究生复试结束,联系好导师后,由于导师研究方向的缘故,才第一次接触到.NET。
22年9月研究生开学,正式开始学习.NET,当时为了学习VB.NET,买了一本《VB.NET程序设计与软件项目实训》。
开始看《Visual Basic.NET实用教程》。
当时使用的还是.NET Framework+VB.NET+DevExpress+SqlServer+Winform组合,如果没有自己探索,可能研究生三年都会一直这样使用。
经过自己的探索了解,发现2016年就已经有.NET Core可以跨平台还更加强大,而且在.NET生态中,主流语言也不是VB.NET而是C#。
开始尝试学习C#,在力扣上使用C#做难度为简单的题,虽然那时候对我而言并不简单。
这时期主要还是在学习.NET Framework+VB.NET+DevExpress+SqlServer+Winform组合。
有空的时候开始看一些有关C#的电子书,比如《深入理解C#》、《C# 7.0本质论》、《C#入门经典》、《C#图解教程》。
主要是阅读《C#图解教程》与《C#入门经典》,《深入理解C#》与《C# 7.0本质论》没有看下去。
从之前与数据库交互直接使用ADO.NET,到后来使用SQLHelper类,再到使用Dapper,后来才了解到还有ORM的存在,开始学习使用EFCore、SQLSugar,还有一个FreeSQL还没使用过。最开始的实践基本上都是基于事件驱动编程,在Winform中通过拖拽设计页面,在写一下事件处理函数,就这些写了好几个月,我都不知道C#中的委托与事件为何物,更不用说Linq与异步了。
研究生阶段总是对就业充满焦虑的,我也知道.NET在国内确实不是主流,而且也发现现在B/S架构比C/S架构更流行。
23年2月开始学习html、css、javascript,说是学习,其实没有真的先去学这些再上手,而是直接去使用LayUI进行web前端的学习。
23年3月开始看B站的黑马程序员的SpringBoot的教程学习,学习了SpringBoot+MyBatis Plus基本的CRUD操作。
但是也明白现在java太卷了,而且自己真的不喜欢java八股文,什么jvm调优、分布式、高并发、微服务,这些东西还没接触过,如果只是为了面试死记硬背,自己没有真的在项目中使用到,感觉很虚。看了现在java招聘的要求,除了掌握Spring Boot、Spring Cloud、MyBatis外,还要掌握各种中间件如缓存数据库Redis、消息队列kafka、rabbitMQ等、Elasticsearch等,数据库不局限于关系型数据库MySQL、PostgreSQL还需要掌握非关系型数据库MongoDB。刚开始学习看到这些让我畏惧,于是又陷入到迷茫中。
23年4月,觉得畏惧java那就继续C#吧。在B站上观看杨中科老师的.NET6教程视频,买了杨中科老师的《ASP.NET Core技术内幕与项目实战》,但由于读研还需要做其他的事情,web开发这块都没有涉及到,教程和这本书没有看完,但还是从中学到了很多东西。
23年5-6月,觉得要不试试C++与嵌入式吧,网上说不用担心35岁失业,越老越吃香。开始学习侯捷老师的C++视频,买了《C++ Primer》开始看。
由于之前学过Winform,就开始了C++的跨平台UI框架Qt的学习。嵌入式方面花了两百多买了一块STM32开发板。这块板子到现在为止我还没有动过。
就是在买了这块板子之后,我突然意识到这样下去不行,学啥都只是学了个皮毛,学啥都坚持不下去,一直很焦虑未来的就业。
学编程要么为了兴趣要么为了赚钱。我发现我其实很喜欢C#,对.NET也有兴趣,我想先不考虑就业的问题,毕竟当时才研一下,距离找工作还有一段时间。我决定基于兴趣去搞事去玩,想用C#干啥就干啥,不考虑当下的市场情况。
但是读研也并不简单,不是你想干什么就能干什么的,你需要做你的课题研究,也要帮老师做横向。可能很多人都没听说过Modelica,Modelica是一种面向对象的语言,用于对信息物理系统进行建模。它支持由数学方程控制的可重用组件的因果连接,以促进从第一性原理进行建模。简单的说就是能更高效地对复杂系统进行建模,可以用它来进行物理系统的仿真建模与matlab中的simulink类似。
23年9月-24年6月其实我研究生生涯的主要任务是使用MWorks.Sysplorer+Modelica进行某个物理系统的仿真计算。
23年6月至今,基于兴趣爱好学习C#的一些历程分享:
- 用C#干爬虫:C# + Html Agility Pack + HttpClient + Selenium/Playwright爬取并解析静动态网页数据。
- 用C#玩AI:C# + NumSharp实现最小二乘法并使用Scottplot或OxyPlot绘图;用ML.NET Model Builder做了个简单的猫狗识别,并在.NET应用中集成。用C#训练模型其实并不推荐,还是主流的python的Pytorch比较好,但是可以使用ONNX与OpenVINO推理模型;最近LLM这么火,将LLM与自己的应用集成,除了可以用python的langchain外也可以用SemanticKernel实现相同的目的,还可以结合向量数据库、提示词工程等,做一些Rag应用,现在还有GraphRAG,都很值得尝试,去做一些AI Agent应用多好玩啊。
- 用C#做客户端:C#技术栈中涉及到客户端可用的很多,winform简单易上手,基于事件驱动很好理解,缺点做出好看的界面不容易,虽然现在可以靠Blazor Hybrid但本质上不算是winform算webview了以及不能跨平台;使用WPF,基于数据驱动,配合MVVM模式可以很好的实现UI与业务逻辑的解耦,使用xaml构建页面更加灵活,WPF中还有很多很好的设计,如数据绑定,命令,依赖属性等等,WPF很强大,我也很喜欢WPF,缺点还是不能跨平台。WinUI3也可以做现代化风格的Windows应用,缺点还是不能跨平台。跨平台客户端的方案有Avalonia、Uno Platform、Maui,其中Maui可以结合Blazor Hybrid使用一些Blazor组件库可以快速构建美观的页面。
- 用C#做后端:ASP.NET Core MVC,前后端分离可以Vue/React+ASP.NET Core Web Api+EFCore/SQL Sugar/FreeSql +SqlServer/MySql/PostgreSQL+MongoDB+Redis/Garnet等技术栈,前后端不分离可以使用Blazor,使用C#前后端都搞定,构建项目效率很高。
今后的实践探索方向
学编程要么为了好玩要么为了赚钱,一直基于兴趣完全不考虑赚钱太理想主义了,我也明白.NET在国内的岗位不算多,特别是大公司的岗位。之前考虑兴趣与赚钱在国内能更好的结合,我主要学习WPF技术,我觉得WPF技术在国内就业岗位还是有的。WPF是个好东西,但是很多人都不认识,哈哈可以说别人不"识货",但这是个人没法改变的。随着就业压力的增加,我决定不再局限于.NET,拓展自己的技术栈,为以后的就业增加竞争力。TypeScript同样出自我很崇拜的C#语言创建者Anders Hejlsberg之手,单纯知道这个我就很想学习使用TypeScript。
今后可能会探索的技术栈。
前端:语言 TypeScript / JavaScript,框架 Vue3/React
后端:语言 C#/Go/Java,框架ASP.NET Core Web API/Spring Boot
客户端:语言C#/Dart,框架WPF/Avalonia/Flutter
人工智能相关:语言C#/Python,框架SemanticKernel/Pytorch/langchain
虽然说语言与框架的思想总有相通之处,但生态、相关工具链、以及各种解决方案的掌握都需要时间。而且也只有真的实践了,才会真的积累有效的经验。
为什么写公众号?
其实做公众号初心不是为了赚钱,虽然说由于关注人数的增加与阅读量的增加,现在每个月都能有几十块的收入。
除去OSS的成本每个月几块钱,每个月也还能赚几十块。
但是如果想通过这种方式搞钱付出回报比太低了,你写那么多原创文章,还是付出了一定的时间精力的,但是赚到的钱还不够去外面吃顿饭还不够买几杯奶茶,如果只是为了赚钱,估计早就放弃了。
其实做公众号最主要还是为了自己,于我个人而言,发表博客能给我带来正反馈,当有人点赞、收藏、分享的时候,我就会有成就感,觉得自己的分享是有价值的,对别人是有帮助的,而且知识的掌握,也不是一蹴而就的,自己时不时的回顾也很方便,如果还能帮助到有需要的人,那就更有意义了。获取正反馈之后,学习更有动力与兴趣,更会分享,更分享更有正反馈,就形成了一个良好的循环,我也发现这样做,比之前的学习都更持久更加有收获。因为当你入门一个东西,如果半天没有成果,没有积累起成就感就会很容易放弃的。
目前文章同步分享在微信公众号、博客园、CSDN、稀土掘金、知乎。
通过网络在广袤的时空中有幸与各位产生联结,如果文章对您有所帮助那就太好了,接下来会根据自己的探索实践,分享一些.NET技术栈之外的东西,当然还是以C#相关的为主,当成是个人学习的记录,如果对您有用可以继续关注,如果觉得没有帮助了取消关注也没有关系,仅以此文回顾自己.NET的学习历程与确定未来探索方向,祝各位都能奔赴自己的星辰大海!