2018年工作总结
不知不觉一年又过去了,过去的一年中有太多的东西需要去总结,只有通过总结才能够让自己认识到自己掌握了哪些东西,大脑中留下了哪些东西,遗忘了哪些?通过不断的反思然后进行查漏补缺最终才能让自己的知识形成框架,最后才能够真正地去掌握好这些技术,按照以前写作的思路每一年的总结都从工作和生活上两个方面进行反思,现在想改变一下写作的思路,毕竟生活方面是一个太过于宏大的主题想总结好是真的不容易,而且来博客园更多的是想记录一下自己的技术上的学习历程,所以以后还是将更多的精力放在和技术相关的一些问题的总结上,这些方面包括:框架学习、重大问题解决方法、工具的使用等方面来记录,后面一直都会按照这个思路来进行,毕竟只有专注于某一方面才能够写出更有深度的东西出来。
首先来对这一年做一个大方向的总结,这一年最大的转变就是由开发了3年多的CS桌面客户端WPF软件开发转为基于Asp.Net Core的WebApi的开发,从桌面端转向Web端,从一直坚持的大屏可视化软件的探索到现在进行Web后端的开发,更是从安防行业转向汽车行业,这些变化都是源于自己对过去状态的不满意和对新技术的不断追求中,但是这个转变的过程中必然会伴随着转型的阵痛,这种阵痛也会让自己取得更大的进步,有时候个人的选择更多的是为了更好地适应这个社会的节奏,因为在国内这个大环境下如果一个公司几年的投入最后都没有能够取得收益,那么更多的时候公司是没有耐心在继续维持这样的投入的,我想这对于很多依靠项目来生存的公司都是这样,当然这对于少数能够不断进行研发投入并以十年磨一剑的意志力来进行研发的公司来说也许他们更有耐心去等待开花结果的那一天,但是开发人员也需要不断地去反思自己的开发技术栈,并适时去作出调整从而更好地去适应这个社会的大趋势。
一 技术上
A Asp.Net Core WebApi
技术上第一个需要总结的肯定是基于Asp.Net Core WebApi的开发了,由于我们整个系统采用前后端分离,并且后端是使用REST风格的WebApi的开发,前端使用的是React框架,前后端通过定义Yaml文档来进行API的定义和规范,当然在进行服务端开发的时候可以使用Swagger文档来进行接口的调试,这样后端就能够独立于前端来进行接口的测试,当后端接口开发完成后便可以部署到测试环境中进行统一的前后端联调,在后面联调通过后还有专门的测试人员进行后续的测试,如果测试有问题会提出相应的Issue进行记录和跟踪。当然这个只是一个大概的前后端进行开发的一个流程,后面会针对这个流程进行详细的说明。
在整个技术选择的层面上由于公司之前的Web技术栈主要是使用微软的Silverlight技术来开发Web应用,后面由于官方停止对这套技术提供支持所以我们的系统就面临着改造和升级,由于微软.net core框架具有跨平台、高性能、开源......等一系列的优势,所以选择.net core作为公司下一代技术架构选择就是顺水推舟的事情了,而且Web开发前后端分离也是势在必行的做法,公司在选择前端框架时鉴于React的一系列的优势最终采用了这个框架,由于本人主要从事后端开发,所以这里主要去围绕后端的一些技术特定来做特定的分析。在从事.net core进行开发的时候和之前一直熟悉的基于.net framework 的WPF客户端的开发还是有很大不同之处的,首先便是两种框架对第三方程序集的引用的不同,.net core更多的是基于nuget包来安装和管理第三方程序集,另外在WPF中我们熟悉的App.Config也被appsetting.json等配置文件代替,更重要的是WPF中那一套基于UI的绑定、事件、路由、触发器......现在都用不到了,因为现在做后端更多的是为前端提供一种服务,自然不用去处理和界面相关的内容了,当然后端也有后端的一系类技术栈,而且也是很复杂的。另外我们需要需要从WPF中OOP的思想慢慢去适应Web开发的AOP(面向切面编程)的思想进行转变,另外客户端和服务端开发思路上有的更多的是相通,比如使用依赖注入容器来管理接口及实现,这个在WPF客户端有Prism、Caliburn......等相关的框架,这些框架都是使用依赖注入的思想来管理程序中的各种实例注入以及调用,这个几乎已经成为大型项目中的不二选择了,其中Asp.Net Core本身就是基于这种思路来实现的。另外在两者之间都不可避免与数据库进行交互,在我们的Asp.Net Core WebApi开发中使用EntityFrameworkCore作为数据库ORM框架,当然也有其他的很多选择Nhibernate等等,当然这些在WPF中也都存在对应的框架实现,还有WPF开发时针对SqlServer数据库,有非常好用的LinqToSql技术,可以进行快速开发,另外在两种框架中LINQ技术都是使用非常多的部分,其实更多的时候如果你非常熟悉.Net Framework框架那么你会比较快速地切换到.Net Core框架上,因为这些技术在本质上都是相通的。
B ABP
第二个在我们确定了服务端开发的技术方向后我们也需要一个非常好的后端服务开发框架,ABP框架作为GitHub上面一个非常出色的基于DDD的开源框架在针对我们公司的具体业务方面是一个非常优秀的开源框架,而且这个开源框架也得到了全世界开发者的支持和参与,你可以点击这里来访问ABP的官方网站去了解更多的ABP框架的一些内容。另外本人也在一步步学习这个优秀的ABP框架,也写了一些自己学习的心得这里你也可以访问这里看看是否对你的学习有所帮助。ABP框架为我们集成了一些列非常有用的技术,首先便是ABP框架的模块化Module的设计思想,另外里面集成了一整套基于多租户MultiTenant的代码实现,这样你通过使用ABP框架你能够不用写很多基础代码的情况下就能够写出一套多租户系统,这个确实对工作提供了巨大的帮助,另外ABP框架中提供了一些列基础技术支持:log日志、Owin、Redis、Cors、Dapper、Quartz、NHibernate、SignalR等一系类的支持,另外还提供了丰富的Authentication、Filter、Interruptor、AutoMapper、Configuration、UnitTest等一系列非常实用的功能,这些都是非常重要的部分,通过用好这些基础内容你就能够在开发过程中解决非常多的问题,更重要的是当我们遇到了一些重大问题的时候我们也能够在GitHub上面获得很多的帮助,这对于我们开发来说能够快速寻求技术上的支持也是非常重要的,当然整个框架本人也是在和公司的项目一起来学习,希望以后对于这个框架的理解能够上升到一个更高的层次。
C EntityFrameworkCore
在我们的后端开发中更多的时候我们是在和数据库进行交互,所以选择一套怎样的ORM框架对于我们来说也是非常重要的,在.Net Framework框架下面EntityFramework大家应该是非常熟悉了,所在在新的Asp.Net Core框架下面微软也开发了一套开源的EntityFrameworkCore框架,在我们的项目中使用的是Microsoft.EntityFrameworkCore2.1.4版本,当然这个版本也是不断地在升级之中的,这些框架可能还存在一些问题但是当我们发现一些问题之后我们还是能够在GitHub上面提Issue,然后微软也会得到这些反馈并在后期的开发过程中逐步解决这些问题,当然在我们的开发中当面临EntityFrameworkCore生成的Sql出现重大问题的时候,我们作为一个过渡阶段我们也会使用Dapper来写一些SQL语句来解决这些问题,等到后续官方给出了解决方案以后再逐步替换的方式来解决这些问题。在这个框架中有非常多的内容需要我们去学习,主键、外键、级联、导航属性等等一系列的概念,在掌握好这些的前提就是不断去学习去总结并进行摸索。当然更多的时候我们需要去参考官方的文档来了解这些内容。
在EntityFrameworkCore中当我们开发一个新的业务的时候我们首选的就是采用Model First方式,所以当我们在DbContext中定义好领域层Model以后,我们需要将这些字段映射为数据库中的字段,这就需要我们去了解Migration等一些列的操作,包括主键、外键、触发器、存储过程都可以在DbContext中通过迁移来一步完成。当然在我们的开发过程中会遇到各种各样的问题,这些问题必须由自己耐下心来进行解决。
D NSubstitute
在我们的开发过程中很大一部分时间都是在调试代码的Bug,所以在我们的代码中写单元测试就能够很大程度上增加代码的健壮性,减少代码出错的可能性,在我们的系统中我们使用了ABP默认的测试方法,而ABP中是通过引用NSubstitute程序集来进行单元测试的,如果你想了解更多NSubstitute测试框架的使用你可以访问其官网来了解更多的使用方法。另外单元测试一个更大的好处就是能够去规范你的代码的规范,如果代码没有一个非常完整清晰的调用关系那么你会发现在进行单元测试的时候是非常麻烦的,所以在一定程度上写单元测试也是在对代码进行重构这个也需要我们去明确。
二 工具上
俗话说得好“工欲善其事必先利其器”,在开发过程中我们如何才能使整个开发过程中有更高的效率呢?这个无论是在开发代码的过程中还是后期调试代码的过程中我们都会使用到一些非常有用的工具,这些工具的存在为我们解决了一些重大的问题,能够帮助我们快速定位问题并最终找到问题,最终解决问题。
A JetBrains ReShaper、DataGrip
JetBrains是一家捷克非常有名的软件公司,并且在软件IDE、插件、数据库工具方面开发了非常多非常有用的工具,首先推荐的就是ReShaper,这个VisualStudio插件只要你用过之后就离不开了,无论是代码的智能提示还是错误拼写亦或是代码优化做的都是非常不错的,能够更快速提高代码的开发效率。另外一个数据库管理工具DataGrip是目前使用过最好的数据库连接工具了,能够支持多种类型的数据库,而且智能提示等一系类功能也是超级棒,还能将数据库中的数据导出成多种格式从而方便进行查看和单元测试等等,让我们通过一张截图来认识它吧。
图一 DataGrid
B DbMonitor
这个就不用多说了,我们写的EntityFrameworkCorea代码最终生成的SQL就是通过DbMonitor来进行捕获的,通过这个工具我们能够直接查看最终生成的SQL代码,并以此为依据来进行代码的优化,错误排查、SQL中传递的参数等一系列的问题,而且我们还能够通过生成的SQL语句来排查一些EntityFrameworkCore代码中是否存在循环查询数据库等一系列问题,所以这个工具的重要性不言而喻。
图二 DBMonitor
C Postman
这个工具对于模拟前端发送的各种HTTP请求是一个非常好的工具,能够支持多种Http请求格式,而且能够设置各种Params、Authorization、Header、Body等请求相关的数据格式,是调试服务端非常重要的一个工具。
图三 Postman
D GitKraken
这个工具是一个非常好用的查看GIT提交和修改的工具,能够进行Pull、Stash、Pop查看主分支修改状况,查看代码和前一个版本之前的异同,查看提交记录,这个工具和VisualStudio里面集成的Git功能配合起来真是非常好用,这些使用的便利也只有在使用的过程中才能够体会到使用的便利之处啦。
图四 GitKraken
E Fidder
这个工具其实不用我做过多的解释,做Web开发的应该都会使用吧,能够抓取各种Http请求,而且还能够查询请求的数据,这个在很大程度上和浏览器开发人员工具有相同之处但是Fiddler的功能确实非常多而且也非常适用,下面也给出它的主界面截图吧,关于具体的使用还得自己去使用。
图5 Fidder
F BareTail
有时候当我们查询系统生成的日志文件的时候是不是没有办法定位到自己想看到的内容,有时候面对太多的日志记录我们都得找很久才能够定位到我们的错误地方,那么这个工具的出现就为我们解决了这个问题,通过为不同的关键字:ERROR、 WARN 、DEBUG、 TRACE设置不同的颜色从而方便自己查看日志记录,是不是很棒。
图6 BareTail
上面一部分就是对过去的一年在技术上以及使用的工具上的一些总结,当然这些总结只是一些概述性的说明,没有深入到具体的技术里面,因为这其中的任何一块都是一个非常大的内容,所以对于自己来说这些都还是一个起步的阶段,后面希望自己能够在每一块上面能够有更加深入的理解,从而加深对整个Web后端技术有更深刻的理解。