前言

园子经常在讨论关于.Net发展的问题,我也这些年在工作乃至创业过程中使用.Net碰到的一些问题和看法。
个人擅长的技术面,C/C++/MFC/STL、ASM、JAVA、VB、Javascript/Typescript、C#/WebForm/MVC、Android/MonoDroid,Linux/Windows,还有没有可以吹的,还有从286一直到i7,从ms-dos到win 10,可以算是一条道跟从微软走到黑。

使用.Net的职业发展问题

每次提出这个问题,大家都会说.Net在国内也有高薪工作。事实上,我个人的感觉这些年明显感觉.Net的工作机会少;以及以前同事,朋友的发展情况来看,也是如此。当然你非要说我没有他们勤奋努力,我也没有办法。在国内Java或者PHP等等,相同的努力,背景,智力条件,获得更高收入的机会更多。所以,有一个概率,使用JAVA技术获得发展机会跟多一些,就如同在清华北大,你更容易找到技术牛人,而到三本院校比率就会变小一样。不要说也有成功的,我同学同样学历不高,现在是百度的研究员;也有在阿里巴巴任职项目经理的。

其实我不想这样来说,目前我个人推荐新同学以Java为主,如果又需要再来搞.Net。同样搞.Net的同学也可以看看Java。基础掌握的好,语言不过是工具。

碰到的问题

谈这些问题的时候,我强调一下我们从事产品的开发,可能与完全的互联网产品视角稍微不同。产品是给经销商、客户、实施人员来安装。所以最好,简易的安装,一键完成配置,需要技术支援的程度越少越好。

1、以易用性为傲的软件系统越来不易用
VS、SQLServer的安装依赖,对系统的依赖。经常是系统缺少了这个安装,缺少那个安装包。特别是SQL Server的安装,经常出现问题。我们公司的实施人员,应该对计算机是非常熟悉的,他们经常连SQL Server的安装搞不好。
我已经彻底切换到使用mysql、sqlite的方案,mysql 的安装比 sql server 好很多,而且free。

2、产品延续性与稳定性的问题
七八年前开发一个产品的时候,有一个类似于图形设计的东西。我们采用了Silverlight,当时Silverlight升级也比较快。我们觉得这样开发起来比Flash要快,当时浏览器H5技术还不如现在成熟,所以也没有考虑。Silverlight技术细节的东西不说了。测试环境都OK,最后发现在客户那里出现了很多种状况。比如页面崩溃,微软推送了新的更新无法运行…我们人少,实在没有太多的精力去分析,我选择你就是求个稳定。
微软大概自己废弃的技术还有很多。

3、产品安装与IIS
B/S系统,你没法绕开IIS,如果是一个产品直接给到客户安装,客户经常是搞不定的。甚至于有些客户直接拿XP。有些人要说客户傻逼,客户就是爷,何况竞争对手用java写的产品可以,解压,然后批处理运行()。客户说你产品没有运行起来,可以走了…..那一刻,真心蛋疼啊。

据说下一代的.net会有很好的解决办法,可以脱离IIS。为了解决这个问题,我把IIS Express 封装了一下,做了一个绿色版。

4、生态系统
Java在各方面的开源系统,组件,框架可选择的余地比较多,重要的是成功的方案也比较多。有很多组件,库都是从Java改写过来。

5、成本
我们公司基本都是购买的正版软件,从操作系统到开发工具。这个相对于选择其他的软件来说,这个也是一笔不小的费用。其实VS并不是最贵的软件,贵的是那些电路的设计工具,三维CAD之类。
如果将软件迁移到云端,Windows的虚拟机要贵一些。

6、人力资源
招聘.Net的人员比较困难,找到好的开发人员更加困难。我招聘的时候,感觉找到好的.Net开发很难。其实啊,找Java的也不容易。

坚守与实践

曾经有一段时间,我也特别困惑,打算转换到其他的平台与语言,后来觉得目前至于我来说,依然是一个比较好的选择。

1、使用Java并不能给带来跟多的效益
如果不是从个人薪酬来说,使用Java的产品,与使用 .Net ,并不能让客户多掏钱。微软体系的工具开发效率还是要一些,我们团队在.Net上的投资更多。

2、跨平台,覆盖面广
.Net相对Java,有些特性类似于C++,比如条件编译。现在很多库,编译支持多个平台的版本,比如支持mono,MonoDroid,甚至于Portable直接多平台公用。
.Net可以开发Linux,Windows、Mac上运行的程序,包括UI。支持树莓派等一些IoT设备的开发。
下一步我们会逐步把Web的部分迁移到linux,有些使用C++开发的第三方库依赖是一个难点。

3、.Net访问原生库更方便
如果使用.Net调用系统的DLL、so,通过PInvoke更加的方便。

3、移动平台
xamarin是一个非常不错的解决方案,我们将PC端开发的很多软件功能移植到了Android,同时我们继续维护Windows的版本。它能够让你实现算法,数据结构,通讯协议等很多功能的共享,降低很多的成本。能够很好的保护现有的投资。
使用xamarin不代表着你对移动平台的了解的技术要少,我认为要求更高。

4、搭配选择微软将以外的技术
比如数据库,我们现在基本选择mysql,功能足够,费用低。比如有些功能服务,考虑使用nodejs等等。

总结

所以如何选择,完全是看客官自己。但是我相信.Net最近在跨平台,移动端的发力,以后会更加的有优势,这一切来的太晚。来的太晚,总是好过没有吧。可能有一个合适的机会,我也会在项目中使用Java来替代.Net。

要做的事情比较多,匆匆随便,欢迎雅正。

本来使用Markdown写好的,不知道为什么解析的格式不对。下班以后再来调整格式吧。

从业十余年谈谈对dotnet看法与坚持的更多相关文章

  1. TesterHome创始人思寒:如何从手工测试进阶自动化测试?十余年经验分享

      做测试十多年,有不少人问过我下面问题: 现在的手工测试真的不行了吗? 测试工程师,三年多快四年的经验,入门自动化测试需要多久? 自学自动化测试到底需要学哪些东西? 不得不说,随着行业的竞争加剧,互 ...

  2. 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。

    windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...

  3. 第一章-第五题(你所在的学校有计算机科学专业和软件工程专业么?相关专业的教学计划和毕业出路有什么不同?阅读有关软件工程和计算机科学的区别的文章,谈谈你的看法。)--By 侯伟婷

    我所在的本科学校和研究生学校都有计算机科学专业和软件工程专业.具体的教学计划无从得到,所以此情况无从对比,但是我从本科教务处网站找到了计算机科学专业和软件工程专业有关专业方面的课程,现列表如下. 表格 ...

  4. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  5. 谈谈《Dotnet core结合jquery的前后端加密解密密码密文传输的实现》一文中后端解密失败的原因

    详情请看<Dotnet core结合jquery的前后端加密解密密码密文传输的实现>,正常来讲,这个博客里面的代码是没有问题的,但是我有时候却会直接报错,原因是后台解密失败:Interna ...

  6. 《windows核心编程系列》十五谈谈windows线程栈

    谈谈windows线程栈. 当系统创建线程时会为线程预订一块地址空间区域,注意仅仅是预订.默认情况下预定的这块区域的大小是1MB,虽然预订这么多,但是系统并不会给全部区域调拨物理存储器.默认情况下,仅 ...

  7. 对于Hibernate和MyBatis的区别与利弊,谈谈你的看法

    Hibernate与MyBatis的对比: 1.MyBatis非常简单易学,与Hibernate相对复杂,门槛较高: 2.两者都是比较优秀的开源产品: 3.当系统属于二次开发,无法对于数据库结构做到控 ...

  8. 十余年软件开发经历,经验总结和程序一览(涉及Socket、WPF、vc++、CAD、图像、GIS)

    前言 本文主要介绍我开发的几款软件产品,大概介绍一下功能.可以让读者了解本人的开发能力,所擅长的方面.有相关开发需求可以联系作者. 本人开发软件多年,从事的行业也多种多样:自然接触了不同的业务,开发了 ...

  9. 《windows核心编程系列》二十二谈谈修改导入段拦截API。

    一个模块的导入段包含一组DLL.为了让模块能够运行,这些DLL是必须的.导入段还包含一个符号表.它列出了该模块从各DLL中导入的符号.当模块调用这些导入符号的时候,系统实际上会调用转换函数,获得导入函 ...

随机推荐

  1. c/c++中关于sizeof、strlen的使用说明

    sizeof: 一般指类型.变量等占用的内存大小(由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小) strlen: c字符串的长度(参数必须是字符型指针 char*,当数组名作 ...

  2. TransmitFile函数的简单使用

    简述 TransmitFile是一个扩展的 API,它允许在套接字连接上发送一个打开的文件.这使得应用程序可以避免亲自打开文件,重复地在文件执行读入操作,再将读入的那块数据写入套接字.相反,已打开的文 ...

  3. liniux mint android-ndk风波

    我的安装过程sudo chmod a+x android-ndk-r10d-linux-x86_64.bin/dowonload $ ./android-ndk-r10d-linux-x86_64.b ...

  4. c#反射机制

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

  5. 在MonthCalendar控件中选中日期

    Calendar.MONTH Calendar now=Calendar.getInstance();System.out.print(now.get(Calendar.MONTH));得到的月份少1 ...

  6. (转)springMVC+mybatis+ehcache详细配置

    一. Mybatis+Ehcache配置 为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方 ...

  7. 用极简方式实现新浪新版本特性展示效果--view的图片轮播

    在发布版本的时候,大多数软件会在第一次使用新版本时候弹出视图用几张图片给用户做一个新版本特性介绍,最简单如下图新浪的版本特性介绍 由于图片是全屏展示且是左右滑动,大多数情况开发者会选择使用scroll ...

  8. FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时遇到的坑,给textview赋值时出现的空指针异常

    FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时,给textview赋值时出现的空指针异常 public class BaseFr ...

  9. 父元素相对定位后,子元素在ie下被覆盖的问题!

    <div id="append_parent" style="position: relative;"> <div id="zoom ...

  10. SQL Server架构 -- 数据库文件和文件组

    在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,也是在特定文件夹下创建不同的文件,然后经过文件存储系统去抓取数据信息.理解文件和文件组的概念可以帮 ...