先做个自我介绍,我是 2015 年大四实习开始学习的 .net,如果从 2016 年毕业开始算,到目前为止已有 5 年的 web 开发相关经验了,自认为并不是技术很厉害的人,但是也有一点个人的经验,希望能够帮助到其他人。

能脱坑就尽快吧

对于 web 开发,我想要简单对比下 c#、java、go 这三门语言,主要是个人稍微比较了解并不代表其他语言不适合于做 web 开发。三门语言的各方面对比相信网上都有很多相关的文章,在此不再赘述,主要想表达一些比较主观的个人观点。

go 语言个人认为是一门比较现代化的语言,无论是从语法上还是从设计上都感觉比其他语言来得简洁。

  • 错误处理:conent,err:=ioutil.ReadFile("filepath")

    c#、java 的错误处理方式都是需要通过 try catch 来捕获,但是 go 只需要在有可能报错的方法后增加一个 err 变量。虽然 c# 可以使用在方法内部 try catch,然后使用 tuple 封装错误的方式来实现类似的效果,但使用起来始终没有 go 这么优雅。

    public static (string, Exception) ToJson(this object obj)
    {
    if (obj == null)
    {
    return (string.Empty, new ArgumentNullException(nameof(obj)));
    } try
    {
    return (JsonConvert.SerializeObject(obj), null);
    }
    catch (Exception e)
    {
    return (string.Empty, e);
    }
    } var (json, e) = obj.ToJson();

    顺带一提: V 语言的错误处理是我认为目前为止最简洁的方案,但目前这门语言仍在开发中。

    fn (r Repo) find_user_by_id(id int) ?User {
    for user in r.users {
    if user.id == id {
    // V automatically wraps this into an option type
    return user
    }
    }
    return error('User $id not found')
    } user := repo.find_user_by_id(10) or { // Option types must be handled by `or` blocks
    return
    }
  • 启动多线程(协程)的方式

    go 启动协程的方式特别简洁且优雅 go function(),虽然 c# 也可以很快创建线程 Task.Run(Function),但 go 的这种设计还是更加让我喜欢。

  • channel 的设计

    channel 是一种用于在协程之间相互通信的技术,这让我想到了大学开发安卓时 UI 线程与子线程的通信,显而易见,channel 更加的简洁、优雅。

而 c# 与 java 之间,大部分人都会觉得这两门语言比较相似,优缺点大概就是 C# 语法糖比较多开发比较快,java 社区庞大类库多开发也很快,优点在此不多赘述,个人认为 .net 类库没有 java 丰富,目前 java 的 web 开发基本离不开 spring,而 spring 个人认为有点过度设计。

除了以上说到的一点浅显的对比,还有很关键的一点就是就业市场,以下是我在拉勾网上的搜索结果。





很明显,.net 如今的就业市场是无法与 java 相比的,而 go 作为后来者在上海也已经快赶超 .net 了,基于以上种种,个人建议对于已经使用 C# 作为工作语言多年的人,可以继续深入学习,尽管就业市场并不乐观。对于刚入坑不久的人,建议可以了解一下其他语言,尽快脱坑。

一点小建议

对于往后还将从事 .net 开发的人,我有一点小小的建议,希望能对你有所帮助。

尽可能少用第三方框架

个人建议在开发中尽可能少去使用各种第三方框架,并不是说第三方框架不够优秀。

  • 官方框架已足够优秀

    这边说的是 asp.net core,对于 .net framework 以及 MVC 不再做评价,因为这些技术已不再是主流。从 asp.net core 1.0 开始,.net 开发团队就热衷于使用 owin 的启动方式,类似于 app.Start<Startup>(); 然后在 Startup 中去做各种各样的配置,这点只是个人观察所得,并没有看到官方有此类描述。这种服务启动方式,比过去的 asp.net 项目更加直观清晰,反正让我感觉很舒适。此外,asp.net core 的依赖注入也是个特别好的设计,对象统一在 Startup.ConfigServices 注册,并且只通过构造函数注入,这可以很好地规范项目代码。

  • 第三方框架可能说没就没

    15 年刚开始学习 .net 的时候,发现了一个三方框架叫 Nancy,当时感觉这个框架比官方的 MVC 框架优雅多了,然而万万没想到的是,这么多星的一个仓库现在已经不再维护了。可能有些人会觉得反正只要不出 bug、项目足够稳定就可以,但是项目不再维护意味着框架不再会有新功能,将来某个时刻发现框架已难以满足开发需求,那时候就只能重构迁移至其他框架了。

    我现在维护的一个老项目就使用了一个很老的第三方开发框架,现在去搜索已经找不到代码库了,博客园上有一点相关的文章,giee 上似乎有这个框架的私有库,也不知道当时这个框架是怎么弄到手的,反正现在就只有几个 dll,出 bug 了要看源码只能反编译,而恰好还真被我发现了一些 bug。对于这种不开源、维护状态未知的框架,都有人敢使用,我是佩服他的勇气的。强烈建议,千万不要在工作中随便使用什么乱七八糟的第三方框架。

自建项目模板

也许有人会说用第三方框架能快速开发,项目能够更快地上线,但是个人认为那种所谓"开箱即用"的开发框架都属于过度设计,将许多东西都揉在一个项目里面,然后还在框架中加入了很多具有个人特色的开发习惯,比如DDD。若为了能达到快速开发,其实每个人都通过为自己建立一个项目模板而轻松达到这个目的。

将自己常用的一些组件以及对组件的适当封装都写到项目模板中,在下次需要新建项目的时候,直接基于此项目模板就可以快速继承自己积年累月总结出来的一套最适合自己的开发模式。我个人就在 github 上维护了一个自己的项目模板,如果你觉得这种方式可行的话,可以参考官方文档以及我的模板去搭建一个自己的项目模板。

最后

以上所有内容都是比较主观的观点,若有不对之处,还请指出,望多多包涵。邮箱:venyowong@163.com

.net 经验总结的更多相关文章

  1. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验

    服务器汇总:http://www.cnblogs.com/dunitian/p/4822808.html#iis 服务器异常: http://www.cnblogs.com/dunitian/p/45 ...

  2. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  3. iOS架构一个中型普通App的一些经验总结

    这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...

  4. 从史上八大MySQL事故中学到的经验

    本文列举了史上八大MySQL宕机事件原因.影响以及人们从中学到的经验,文中用地震级数来类比宕机事件的严重性和后果,排在最严重层级前两位的是由于亚马逊AWS宕机故障(相当于地震十级和九级). 一.Per ...

  5. CentOS上 Mono 3.2.8运行ASP.NET MVC4经验

    周一到周三,折腾了两天半的时间,经历几次周折,在小蝶惊鸿的鼎力帮助下,终于在Mono 3.2.8上运行成功MVC4.在此总结经验如下: 系统平台的版本: CentOS 6.5 Mono 3.2.8 J ...

  6. 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...

  7. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  8. C#异常处理经验(原则与方法)

         本文是异常处理经验性的文章,其实跟C#关系也不大.比较适合刚刚熟悉异常语法,而缺乏实战的读者.当然,经验老练的读者也可指出不足.给予意见.补充说明,一起完善文章,分享更多知识与经验.   1 ...

  9. 【原创经验分享】JQuery(Ajax)调用WCF服务

    最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...

  10. 千回百折:百度Java研发offer斩获记和经验分享

    起因 面试过程 等待offer的过程中悟道 Java面试常考知识点个人总结 过程 百度——作为国内互联网的巨头之一,最近的一些风波对其褒贬不一,但是类似事件不是第一次发生,也绝对不是最后一次,对于真的 ...

随机推荐

  1. Linux基础命令---nslookup查询域名工具

    nslookup nslookup是一个查询DNS域名的工具,它有交互和非交互两种工作模式. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.   1.语法     ...

  2. 【Python】【Basic】MacOS上搭建Python开发环境

    1. Python3 1.1. 下载地址:https://www.python.org/downloads/mac-osx/ 1.1.1. PKG包安装: 没啥可说的,点点点,下一步而已,不用手动配置 ...

  3. Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

    目录 1.      写在前面 2.      开发环境 3.      大致流程 4.      框架简介 5.      运行结果展示 6.      文件与配置 7.      测试接口实例 n ...

  4. java职业路线图

  5. 【Linux】【Services】任务计划、周期性任务执行

    Linux任务计划.周期性任务执行       未来的某时间点执行一次某任务:at, batch     周期性运行某任务:crontab         执行结果:会通过邮件发送给用户        ...

  6. css clip样式 属性功能及作用

    clip clip 在学前端的小伙伴前,估计是很少用到的,代码中也是很少看见的,但是,样式中有这样的代码,下面让我们来讲讲他吧! 这个我也做了很久的开发没碰到过这个属性,知道我在一个项目中,有一个功能 ...

  7. 【前端】关于DOM节点

    参考这个: https://juejin.cn/post/6844903849614901261 DOM树的根节点是document对象 DOM节点类型:HTML元素节点(element nodes) ...

  8. 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

    实现的功能: l  APP控制月球灯 l  本地月球灯控制 l  APP控制"大白"颜色,实现各种颜色变身 l  门状态传感器状态APP显示 l  网络状态指示灯,连接服务器长亮, ...

  9. [源码解析] PyTorch 分布式(15) --- 使用分布式 RPC 框架实现参数服务器

    [源码解析] PyTorch 分布式(15) --- 使用分布式 RPC 框架实现参数服务器 目录 [源码解析] PyTorch 分布式(15) --- 使用分布式 RPC 框架实现参数服务器 0x0 ...

  10. Python循环控制

    一.比较符 和算术操作符一样,布尔操作符也有操作顺序.在所有算术和比较操作符求值后,Python 先求值 not 操作符,然后是 and 操作符,然后是 or 操作符. 二.if控制 if name ...