.NET的一点历史故事:擦肩而过的机遇

Sun 公司曾经借由 SunOS/Solaris 这个 UNIX 操作系统,SPARC 硬件平台和 Java 语言建立了一个商业帝国。Sun 工作站应该是很多资深业界大佬们偶尔还会拿来回忆的一个经典产品。不过时间进入二十一世纪第一个十年的中段,它已经在竞争对手的轮番进攻下显出了颓势。作为最后一搏,当时的管理层采纳了开放源代码这个方式,希望学习网景公司孕育 Mozilla/Firefox 的经验来扭转乾坤。于是2005年,它宣布了 OpenSolaris 项目,开源自己的操作系统,并在2006年11月13日,更近一步将自己核心资产 Java 平台开源,并采用 GPL 这个非常严格的授权协议。虽然这些努力并没有完全解决 Sun 公司的经营困难,它最终被甲骨文收购,但是开放+开源的 Java 平台确实在之后的十几年中顶住了新型语言的冲击,既然是 IT 业界广泛采用的主要技术。与之相比,微软一家主导并且完全绑定在 Windows 平台的 .NET 技术,在二十一世纪的发展过程中却是从平淡无奇开始的。

2002年2月13日发布了 .NET Framework 1.0 和 Visual Studio .NET 2002 之后,微软将研发资源同时投到了多个领域,希望在广度和深度上追上 Java 的脚步。这些投资在后来的三年内逐步提升了 .NET 平台的开发灵活性,也补上了一些缺环,但是是否符合用户的需要则必须另说了。

第一个重要升级是2003年4月3日,微软发布了Visual Studio .NET 2003 和 .NET Framework 1.1。这个版本带来了一些新的特性,但是明显比较平淡:

  • IP v6支持

  • ODBC 和甲骨文数据库支持

  • 配合 Windows CE 开发的 Compact Framework

  • ASP.NET 对于移动浏览器的支持

在2007年 iPhone 发布之前,J2ME 和 Windows CE 的竞争只能说是小孩打架。所以这次升级更多的是配合微软 Windows Server 2003 的发布。毕竟 Windows Server 2003 是微软第一个内置 .NET Framework 的 Windows 发布版本。

下一个重要升级就拖到了2005年11月7号的 .NET Framework 2.0 和 Visual Studio 2005。从这里开始,.NET 开始慢慢在广度上追上 Java,比如加入官方构建工具 MSBuild,官方测试框架 MSTest,加入64位支持,同时在深度上开始超越 Java,比如在 CLR/MSIL 层面实现真正的泛型。同时微软开始发布适合嵌入式系统使用的Micro Framework。

有了这个关键的版本做基础,微软后面连续发布了 .NET Framework 3.0 (2006年11月6日) 和 3.5 (2007年11月19日),终于在广度上再进一步,加入 WPF、WCF、WF 和 EF,ASP.NET 开始支持 AJAX。在深度方面,.NET 开始引入 LINQ 机制,使得数据库操作可以不使用 SQL 等查询语言,而是在 C# 等语言层面直接集成。

在 Java 开源之前,微软也做出了一些积极行动,比如

  • 2004年4月5日在 SourceForge 开源了 WiX 工具

  • 2006年6月正式上线了 CodePlex 开源托管平台

  • 2006年11月2日和 Novell 公司达成了一系列开源软件相关的合作(Novell 公司当时是 Mono 项目的领导者,所以这些合作对于 Mono 团队有很大帮助)

但是它一直没有在是否开源 .NET 平台问题上做出决定。这些当然我们事后来看都是可以理解的,因为

  • 微软公司的创始人 Bill Gates 领导了商业软件革命,使得软件有版权这一理念深入人心,并且建立了自己的微软帝国,同时也促使了其他商业软件公司成长壮大。

  • 开源软件运动对于商业软件公司具有潜在威胁,而大型商业软件公司选择开源自己产品的案例不多(网景、IBM和Sun走在了时代的前列)。

  • 微软公司内部对于如何运作开源项目,如何把开源代码作为竞争手段缺乏了解,所以迟疑不决。

但是当时没有追随 Java 开源的热潮去做 .NET 平台的开源,对于微软来说还是棋差一招。等它八年后意识到必须走开源这条路的时候,IT 世界的版图已经完全不同了。

相关文章:

  • .NET 的一点历史往事:和 Java 的恩怨

  • .NET的一点历史故事:招兵买马和聚义山林

原文地址:http://weibo.com/ttarticle/p/show?id=2309404102499094119132


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

响应式布局

一、实现弹性布局的方法: 1.浮动百分比 好处:网页内容宽度自适应 多设备都适用 2.flex弹性盒模型:该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用空间。 二、Flex布局的功能: 1.在屏幕和浏览器窗口大小发生改变时&am…

Java 中的 String 真的是不可变的吗

转载自 Java 中的 String 真的是不可变的吗 我们都知道 Java 中的 String 类的设计是不可变的&#xff0c;来看下 String 类的源码。 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for char…

JS中变量的作用域

/** 作用域* - 作用域指一个变量的作用的范围* - 在JS中一共有两种作用域&#xff1a;* 1.全局作用域* - 直接编写在script标签中的JS代码&#xff0c;都在全局作用域* - 全局作用域在页面打开时创建&#xff0c;在页面关闭时销毁* - 在全局作用域中有一个全局对象…

Mybatis入门 使用注解

使用XML方式地址为Mybatis入门 使用XML 1、目录结构 2、需要修改的地方 1、mybatis的配置文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.…

浅析如何在Nancy中生成API文档

前言 前后端分离&#xff0c;或许是现如今最为流行开发方式&#xff0c;包括UWP、Android和IOS这样的手机客户端都是需要调用后台的API来进行数据的交互。 但是这样对前端开发和APP开发就会面临这样一个问题&#xff1a;如何知道每个API做什么&#xff1f; 可能&#xff0c;…

bootstrap样式

一、目前比较主流的前端框架有&#xff1a; 1.layui 2.vue.js 3.bootstrap 4.jquery ui 二、bootstrap&#xff1a; 1.来自Twitter,目前最流行的前端框架之一 2.是基于HTML、CSS和JavaScript的一个简洁、灵活的开源框架。 3.目前版本是V3 三、bootstrap的优势&#xff1a; 1.快…

JS中的this指向问题

this&#xff08;上下文对象&#xff09; 我们每次调用函数时&#xff0c;解析器都会将一个上下文对象作为隐含的参数传递进函数。 使用this来引用上下文对象&#xff0c;根据函数的调用形式不同&#xff0c;this的值也不同。 指向当前对象 this的不同的情况&#xff1a; 1.…

一文告诉你如何导出 Git 变更文件

转载自 一文告诉你如何导出 Git 变更文件 有时候我们想导出某次版本提交时有哪些变更的文件&#xff0c;在 svn 中有一个 export 功能&#xff0c;很方便&#xff0c;如下图所示。 在 Git 中我也找到了以下两种方法。 方法1 使用 git 自带命令 git archive, 语法如下。 g…

模糊查询

模糊查询是针对字符串操作的&#xff0c;类似正则表达式&#xff0c;没有正则表达式强大通配符&#xff1a;_ 、% 、[] 、_ 表示任意的单个字符--查询MyStudent表中任意姓张&#xff0c;名字两个字的姓名 select * from MyStudent where fname like 张_ --查询MyStudent表中任意…

Entity Framework Core的贴心:优雅处理带默认值的数据库字段

对于用于保存记录添加时间的数据库日期字段&#xff0c;我们通常会设置一个 GETDATE() 的默认值&#xff0c;而不是在应用程序的代码中获取当前时间进行保存&#xff0c;这样可以避免由于web服务器时钟不同步引起的时间偏差。 Entity Framework Core 在设计时贴心地考虑到这个…

bootstrap组件

一、Bootstrap常用的组件&#xff1a; icon图标&#xff0c;下拉菜单&#xff0c;导航&#xff0c;导航条&#xff0c;输入框&#xff0c;缩略图&#xff0c;媒体对象&#xff0c;列表组&#xff0c;分页导航。 二、小图标&#xff1a; 1.bootstrap中内置提供了250多种小图标。…

JS中使用工厂模式创建对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>function createPerson(name , age ,gender){//创建一个新的对象var obj new Object…

深度历险:Redis 内存模型详解

转载自 深度历险&#xff1a;Redis 内存模型详解 Redis 是目前最火爆的内存数据库之一&#xff0c;通过在内存中读写数据&#xff0c;大大提高了读写速度&#xff0c;可以说 Redis 是实现网站高并发不可或缺的一部分。 我们使用 Redis 时&#xff0c;会接触 Redis 的 5 种对…

count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manu

mybatis 查询用户总个数时 报错 org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: FUNCTION eesy_mybatis.count does not exist. Check the Function Name Parsing a…

.NET的一点历史故事:误入歧途,越陷越深

移动计算的时代其实早已有了苗头&#xff0c;起码微软的 Windows CE、诺基亚的 Symbian 都曾经给手机用户多少带来了一些便利&#xff0c;黑莓则由于接入了企业邮件等商业应用而日进斗金&#xff0c;甚至 Sun 也给自己的 Java 平台做了一个 J2ME 标准&#xff0c;试图用 J2EE 那…

bootstrap样式代码案例

运行结果如下所示&#xff1a; 代码如下所示&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,user-scalableno,initial-scale1.0,maximum-scale1.0,mi…

JS中用构造函数创建对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>/* 构造函数的执行流程&#xff1a;* 1.立刻创建一个新的对象* 2.将新建的对象设置…

史上最全阿里 Java 面试题总结

转载自 史上最全阿里 Java 面试题总结 以下为大家整理了阿里巴巴史上最全的 Java 面试题&#xff0c;涉及大量 Java 面试知识点和相关试题。 JAVA基础 JAVA中的几种基本数据类型是什么&#xff0c;各自占用多少字节。 String类能被继承吗&#xff0c;为什么。 String&#…

SELECT * FROM user WHERE username LIKE #{aaa}与SELECT * FROM user WHERE username LIKE '%${value}%'

在Mybatis中模糊查询like有两种写法&#xff1a; 第一种为SELECT * FROM user WHERE username LIKE #{aaa} 另一种SELECT * FROM user WHERE username LIKE ‘%${value}%’ LIKE #{aaa}执行的SQL为&#xff1a; 使用的是&#xff1f;占位符&#xff1a;对用的是preparedStatem…

bootstrap组件的案例代码

运行结果如图所示&#xff1a; 代码如下所示&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,user-scalableno,initial-scale1.0,maximum-scale1.0,mi…