前言

园子经常在讨论关于.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. poi2015 bzoj4377-4386训练

    就按时间顺序写吧 完成度:10/10 3.30 bzoj4385 首先一定是删去连续d个数,然后枚举终点,起点显然有单调性,用单调队列乱搞搞就可以啦 bzoj4378 首先才结论:可行当且仅当把所有大 ...

  2. 适配ios9出现的问题:-canOpenURL: failed for URL

    -canOpenURL: failed for URL: "wtloginmqq2://qzapp" - error: "(null)" 2015-09-13 ...

  3. Js计算当前日,当前周开始结束时间,当前月份,当前年份

    <script type="text/javascript"> //日期加上天数后的新日期. function GetDateStr(AddDayCount) { va ...

  4. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  5. ssh配置git clone简易流程

    1. 生成密钥 ssh-keygen -t rsa -C "jaynaruto@qq.com" //如果只有一对密钥,建议不要修改默认的密钥名称,即一直按回车即可 此命令会在你当前 ...

  6. Zookeeper开源客户端框架Curator简介

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  7. 如何生成git的公钥和私钥

    转载地址:http://blog.csdn.net/wqjsir/article/details/17386087 一. Git windows 客服端(MsysGit)下载 下载地址:http:// ...

  8. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...

  9. html视频播放器的代码 及其参数详解

    播放视频最实用的一段代码是: 程序代码 <"></embed></object> 其他的看参数自己修改吧 .avi格式 代码片断如下: 程序代码 < ...

  10. 五分钟搭建起一个包含CRUD功能的JqGrid表格

    之前的项目也曾用过JgGrid对它的基本功能也是略有了解,网上有个国外的开源的项目,但是不适合个人的风格,所以花了3天空余的时间封装了下JqGrid,也算是参加开发工作10个月以来写的第一个比较完整的 ...