一、   引子

从我还是编程菜鸟时起,.NET就从来没让我失望过。总是惊喜不断。

当年我第一个项目是做个进销存。用的Winform。当时我是机电工程师。编程只是业余心血来潮而已。

.NET的低门槛、VS良好的编程体验及MSDN完善的说明让我从此踏上了码农的不归之路。

回首十年,是从.NET2.0一路走来,记得当年灵感之源发过一篇.NET技术堆栈大全,

http://www.cnblogs.com/unruledboy/p/NetStack.html),对照下自己,4.5的很少用到,其他技术或多或少都有涉及。

二、   .NET技术栈的分析

.NET从第一版发布至今,也有17年历史了。能经久不衰,肯定有它的特长和亮点。我认为它最大的亮点就是生产力。最大的特长是做桌面应用。

说通俗点,就是.NET什么都能做,做桌面他最精,出活他最快。

做移动端,.NET也有一席之地,xamarin和Unity。然而竞争对手有JAVA和Obj-C,Swift,H5与之PK。xamarin还嫩了点。

做后台服务,.NET Core,WCF这些技术不错,但服务器很多是Linux,JAVA先入为主,更有优势。

做网页,ASP.NET很好。但是竞争对手就更多更强了,JAVA,PHP,js,各种开源解决方案。

在现在流行的NO SQL、AI这些领域,.NET也有一席之地,然而这块它显然不是主流。

而在桌面这块,有WPF,Winform,和他相关的有WCF,WF,ADO.NET,EF,LINQ。结合Visual Studio,Ofiice,SQL  Server,竞争对手完全不是一个档次。

那么,这个技术栈最适合的领域是哪些呢,我认为就是运行在Windows系统上的各种程序。

桌面应用要数据库有数据库,要服务有服务,要控件有控件,要报表有报表(RDLC),简直是要啥有啥。更不用说还有强大的第三方控件、丰富的开源组件。

如果有人想用JAVA或者其他什么技术做桌面,我只能说,这很奇葩。除非你对性能要求到苛刻程度。

如果你想做移动端,大数据,互联网什么的,继续用.NET没问题。但是性价比不突出。比如NO SQL这块的,其他语言擅长就让它做好了,.NET来调用就是。田忌赛马,扬长避短。

有人说桌面药丸,微软要倒,What?微软新CEO上台两年股票涨了一倍多,现在活得好好的,DELPHI这个没妈的孩子现在都在茁壮成长,是不是想多了。

又有人拿.NET的性能说事。说什么不如C++云云。这个之前的老赵、xiaotie他们都分析过,按我经验,还没发现有什么性能问题。

因为.NET类库和C#语言都有一个特点,就是给你多种选择。你想省事偷懒自然可以用现成的。想追求极致,甚至你可以用指针。我也用过指针。

差不了多少的性能,和天壤之别的开发效率,这个性价比应该仔细考量。

三、   极限压榨.NET技术栈的潜能

既然.NET最大亮点是生产力,就结合我个人的例子来说吧。

当初打算设计组态软件。单位不是软件公司,我的职责也不是设计组态软件。一开始只是心血来潮。但是面临一个很大问题。就是我看到的组态软件,WINCC,Intouch,都是庞然大物。

如果不是脑子烧掉,不会想着靠一己之力做出来。但是我分析之后,发现我只需要解决两个关键问题。一个是组态设计器,一个是网关。

网关我参考的是OPC规范。按下不表。组态设计器这个,因为我看上了WPF对图元的表现能力、Blend的零代码设计能力。先在网上搜WPF图形设计器,找到了这个:

感谢周金根提供的这个线索。找到了一套WPF开源的图形设计组件: Diagarm Designer。

然而看了代码体验了DEMO之后,再比较WINCC等的功能,感觉工作量还是十分巨大。

这时候我想,如果能把这套组件的界面连线功能纳入Visual Studio就好了。于是继续搜索,发现了这个:

https://msdn.microsoft.com/zh-cn/subscriptions/bb546938(v=vs.90).aspx

果然微软没有让我失望。于是我只需要专注于如何将我需要的组态设计器功能嵌入到Visual Studio神器就可以。

.NET对数据库、文件IO、通讯协议的完美支持让我编程省了很多事。加上我之前积累的类库,进展飞快。

这时候碰到一个新问题,就是常规组态软件有一个重要功能:组态变量。也就比如1号电机、2号电机同时运行的话显示绿色,应该表示为:Motor1.Running & Motor2.Running。

这要求我的设计器能够支持常规的四则运算、逻辑运算,也就是支持复杂的表达式。

微软的表达式树ExpressionTree 提供了对表达式完美的封装。我可以方便的利用它实现我的语法。

我的业余爱好是研究程序化交易。我选择了Winform,绘制K线图我只用了几百行代码,就实现了一个可以缩放、拉伸、移动、加入自定义指标的K线图。

为什么这里选用Winform而非WPF?因为WPF优势是界面与代码分离,利用Blend工具人工绘图,冗余较多。但做K线图需要读入大量数据,程序生成,使用Winform提供的GDI+ API绘制效率更高。

我利用组态项目的表达式解析器加以改进,很快做出来股票预警器。其他地方也很多参考、借鉴了网关、组态设计器的现成代码和思路。

现在做成的这个交易系统,包括图形界面、自定义指标、各种函数支持、策略生成器、回测、实盘运行,总共代码也没有多少,非常简洁。这要感谢.NET强大的架构能力和类库。

很多人说python做程序化交易首选,比如python的脚本能力和各种图表绘制能力。但我大C#的强类型编程能力、架构能力、各种语法糖,写策略不是python能比的。至于自定义图表,别忘了可以导入或者嵌入EXCEL。

一旦你用惯了.NET,有了自己积累的类库,和长期培养的架构理念、抽象能力。你可以在桌面上实现你能想象到的大部分事,让程序成为你的好帮手。

有人说.NET 不能做大数据、不能玩阿尔法狗什么的。拜托。这些东西本来就不是个人、小团队玩的,是国家或者大集团才用得上的。别想多了。

作为一个.NET铁杆粉丝,我只感到庆幸。因为.NET很适合我和我的行业。两岸猿声啼不住,轻舟已过万重山。

github地址:https://github.com/GavinYellow/SharpSCADA。我的第一个开源项目。为了推广它,我这国庆节每天抽出点时间敲键盘。欢迎大家多提宝贵意见和建议。

.NET十年回顾的更多相关文章

  1. [转]一个普通IT人的十年回顾---金旭亮

    金旭亮老师十年体会,很有收获.转自网络. 金旭亮于1989年与超级解霸的开发者梁肇新同时迈入广西大学的校门,却走了一条与其不同的路. 1994年起开始自学计算机专业本科课程,并开始编程,从未间断,迄今 ...

  2. 金老师的经典著作《一个普通IT人的十年回顾》

    学习人生             -------一个普通IT人的十年回顾(上)序从1994到2003,不知不觉之间,我已在计算机技术的世界里沉浸了十年.有位哲人说过:如果一个人能用十年的时间专心致志地 ...

  3. 飞漫魏永明:从MiniGUI看嵌入式十年得与失

    日前,飞漫软件创始人魏永明,在飞漫成立十周年之际,回顾了公司发展这十年,同时也回顾了嵌入式发展的这十年.魏永明以自身涉及嵌入式产业的方方面面,创新.人员管理.工程管理.教育培训.经营策略等多方面,并且 ...

  4. 【乔布斯05年斯坦福大学毕业典礼上的演讲】——Stay Hungry, Stay Foolish.(转)

    Steve Jobs: Commencement Address at Stanford University "Stay Hungry, Stay Foolish." 求知若饥, ...

  5. paper 86:行人检测资源(上)综述文献【转载,以后使用】

    行人检测具有极其广泛的应用:智能辅助驾驶,智能监控,行人分析以及智能机器人等领域.从2005年以来行人检测进入了一个快速的发展阶段,但是也存在很多问题还有待解决,主要还是在性能和速度方面还不能达到一个 ...

  6. 使用Python,字标注及最大熵法进行中文分词

    使用Python,字标注及最大熵法进行中文分词 在前面的博文中使用python实现了基于词典及匹配的中文分词,这里介绍另外一种方法, 这种方法基于字标注法,并且基于最大熵法,使用机器学习方法进行训练, ...

  7. Java异常处理总结

    题记:本文为工作十年回顾总结系列之Java语言之异常处理篇,主要内容为<Thinking in Java >第四版和<Effective Java>第二版的阅读笔记,网上流传的 ...

  8. centos6.5 MySQL数据库的安装

    <div id="home"><div id="header"> <div id="blogTitle"> ...

  9. Data - 关于大数据

    历史与趋势 大数据的前世今生:诞生.发展.未来? 如何利用数据赚钱?大数据价值变现的10种商业模式及利弊分析 10大行业大数据应用痛点及解决策略 大数据凉了?不,流式计算浪潮才刚刚开始 概念与定义 关 ...

随机推荐

  1. Java内存模型_基础

    线程之间的通信机制有两种: 1.共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式的通信. 2.消息传递:线程之间没有公共状态,线程之间必须发送消息来显示的进行通信 同步:是指程 ...

  2. 中科微北斗定位模组ATGM336H简介

    36H系列卫星定位模块 产品介绍 ATGM336H是高灵敏度,支持BDS/GPS/GLONASS卫星导航系统的单系统定位,以及任意组合的多系统联合定位的接收机模块.ATGM336H基于本公司自主独立研 ...

  3. JSON创建键值对(key是中文或者数字)方式详解

    JSON创建键值对(key是中文或者数字)方式详解 先准备好一个空的json对象 var obj = {}; 1. 最原始的方法 obj.name = 'zhangsan'; //这种方式很简单的添加 ...

  4. redis info 命令详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt119 Redis Info 命令以一种易于理解和阅读的格式,返回关于 Red ...

  5. WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据(转)

    WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据 WebForm1.aspx 页面 (原生AJAX请求,写法一) <%@ Page Langu ...

  6. Linux设置全局代理与yum代理

    设置全局代理,方法如下: 修改 /etc/profile 文件,添加下面内容: http_proxy=http://username:password@yourproxy:8080/ ftp_prox ...

  7. 团队作业9——Beta版本展示博客

    一. 骆杰宁(组长) 风格:少说话,多做事. 擅长技术:Jsp 编程兴趣:GUI 希望角色:PM 一句话宣言:年轻是本钱,不努力就不值钱. 胡丹丹 风格:不断沉淀自己 擅长技术:擅长TCP/IP协议模 ...

  8. 扫雷游戏制作过程(C#描述):第四节、菜单操作

    前言 这里给出教程原文地址. 该项目已经放在github上托管. 菜单操作 我们现在的程序单击菜单的时候不会有任何反应,这一节我们主要介绍菜单的相关代码,使得菜单能够正常使用. 现在我们希望在对应级别 ...

  9. 201521123073 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  10. 201521123033《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...