从.NET看微软的焦虑
节日没事,就想聊聊微软的NET。
1.孩子静悄悄,必定在作妖
截止目前,微软的市值达到1.85万亿美元,按说,这样一个宙斯级的巨无霸应该过的非常舒坦,
但是,和微软市值成鲜明的反差,我们从.NET的发展感觉出微软的焦虑。这种焦虑来源于微软在多个垂直领域里的强烈竞争。特别是在移动领域。
所谓:孩子静悄悄,必定在作妖。当过妈妈的都知道,如果妈妈发现小孩子一直静悄悄,那可不是好事,因为那意味着孩子肯定又在“干坏事”了。
人与人国与国都是这样,越是强调什么就表示越不是什么。当你越是强调你和某人是好朋友,就表示你和某人已经有了裂痕。就像当中国越是强调“中美同向而行”时,就越表示当前中美不是同向而行。
同样的,用在.NET身上,我们能看的出,微软每天都在呼喊:来吧,来用我把,我非常好。
我每天升级,我从.NET升级到1.0,升级到2.0,升级到3.0,升级到4.0。。。一直升级一直更新一直扩展新功能,而且还开源。
我支持Windows,支持Linux,支持Mac,支持Android,支持各种设备。你要开发任何设备,我NET都支持,来吧,来用我吧。
但是,虽然这样,这似乎仍打不动开发者的“芳心”。
2.两大巨头都建立了自己的护城河
几十年来,微软通过Windows一直垄断了桌面电脑操作系统,但是我们不得不承认,我们现在花在移动端上的时间越来越多,
微软错失移动互联网成为了不可弥补之遗憾,而两大巨头----谷歌和苹果都已经建立了自己的护城河。
2.1谷歌的Android与Kotlin
谷歌的Android主要采用Java开发,十多年来,谷歌逐步完善了Java在Android上开发的霸主地位,其指标性的标志是类库逐渐完善(见下图)。
这种生态完全可以媲美微软.NET类库在Windows上的开发作用。
再加上与Androi Studio的整合以及Google Mobile Service的绑定。
谷歌推出了一整套完美的解决方案。在这种情况下.NET要从谷歌虎口抢食,势必难度极大。
2.2 Kotin(还有Go语言)
你微软不是开源了.NET了吗?那谷歌也制作了Kotin语言,并提供强大的类库支持。
你微软NET开源,我Kotin也开源。
你微软NET支持泛型,我Kotin也支持泛型
你微软NET支持多平台,我Kotin也支持多平台(android/windows/mac/linux都支持)。
你微软的Typescript可以转为Javascript,我Kotin也支持Kotin转为Javascript。。
从很多方面比较,Kotin的第一感觉就是阻击NET的势力扩张。
就像春晚,我可以不看但是你不能没有。同样,Kotin可以不好用但是绝不能没有。
梦想重要有的,万一Kotin火了呢?
2.3苹果的Object-C与Switf
和谷歌类似,苹果自己建立了一套基于Object-C的体系结构,
在这个封闭圈里,利用Object-C语言与XCode Studio开发环境,苹果自己打通了苹果手机,苹果电脑,苹果手表,苹果电视等的生态圈。
换句话说,在这个自己的生态圈里,苹果自己玩,大门一关,不让别人进来。
2.4 Swift语言
Swift 是苹果推出的编程语言,专门针对 OS X 和 iOS 的应用开发。Swift 在各个方面优于 Objective-C,也不会有那么多复杂的符号和表达式。同时,Swift 更加快速、便利、高效、安全。
Swift 对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的编程语言。
总之,Swift也和NET类似:
Swift也是开源的,是跨平台的(windows/android/ios都可用),也支持各种现代编程(泛型、异步、网络编程等),
另外,养子不如亲生,作为苹果的亲儿子,毫无疑问,苹果以后还会继续扩充Swift的功能,充实其类库。
从上面可以看到,作为开源,跨平台的NET和Kotin,Swift竞争中,并没有十足的优势。
3.五大手机制造商的势力崛起
在PC时代,Windows一统天下,所有电脑制造商都要看Windows眼色行事,但是到了手机时代,风向变了,Android开源了,这使得手机制造商可以从底层修改源代码来为我所用。
就算是谷歌都无十足的把握来掌控整个Android系统。
如果做个比喻,这犹如中国历史上的“春秋战国时代,周天子名义上是天子,但是其实地方诸侯才是真正的握有实权的霸主”。
而目前全球手机制造商基本上就五家:三星,苹果,华为,小米和Oppo(Vivo属于Oppo体系)。这5家犹如“战国五雄”,每个人都有自己的地盘。
因为手机和PC最大的不同是:他是私人的,而且是其它设备的中心。
想象一下:你除了用自己的手机玩游戏,购物办公等通用的操作,还有更重要的IoT。
你可以用手机控制电视,洗衣机,空调,电冰箱等。在这个万物互联的时代,手机是核心。
也正是如此,这五家巨头都在打造自己的生态系统。
以小米为例,你要用小米手机吗?你买了小米手机,那你可以用小米电视,小米洗衣机,小米路由器,小米空调。。。。
所以,手机制造商决定开发人员的要求。
不管是小米,华为,Oppo还是三星,清一色的,后端核心都是Java(外加部分C/C++,特别是华为多用C++)。前端可以用多种语言,包括JS。
而就算是华为推出的鸿蒙系统,也主要以Java+C++为主。 这让微软的.NET有力无处使。
4.机器学习领域,Python异军突起
大数据、人工智能AI、机器学习ML等领域,近几年成为热门行业,在这里,Python异军突起。微软虽然推出了Machine Learning(NET.ML),但是毫无疑问
Python才是主流。特别是AI的领军人物谷歌的tensorflow和百度的paddlepaddle都使用Python作为教程。
用过Python的人都知道,Python最大特点:简单,强大。
大数据最大的特点就是2个:(1).数据量大 (2).对数学要求高
而Python通过第三方库,例如python numpy库,做了大量扩展,对于 实数、复数、矩阵、微积分、统计函数、复变函数等都提供了大量库。
在这里,使用压倒一切。你不用给我说类,说继承,说封装。那不是工科所关注的,他们关注的是结果。
例如,我给你一个数学公式,f(x)=a^2+bx+c 你给我画出他的曲线图来。
如果是.NETer,怎么办?你要让我用System.Drawing类,先自己定义Point类,设置颜色SetColor(),再划线Drawing(),对了,用完了对象要Dispose()?工科生要吐血了。
这种复杂的工作,在Python里,例如使用plotly作为工科数学计算,几行代码就可以搞定。
换句话说,NET在新兴领域受到考验。
5.自动驾驶领域也与微软/NET无缘
车载操作系统将是手机之后另外一个需要关注的特点。 在国内,华为发布打造具备确定性低时延能力的实时车控操作系统,中兴也发布了车载系统,还有百度的阿波罗Apollo,苹果推出了CarPlay车载系统,
谷歌推出了Android Automotive,以及三星、微软等都推出汽车操作系统。但是最终可能只有三家胜出:
1.百度的Apollo 2.苹果的CarPlay 以及谷歌的 Android Automotive。
车载操作系统进一步延伸就是无人驾驶。这对操作安全性要求极高,另外还要打通汽车制造的上下游产业,没几家公司能玩得起。
苹果是自己的生态圈,谷歌有Android作为加持,而百度Apollo不是最好的,但是百度的优势是中国有全球最大的汽车消费国,可以提供海量数据。
因为无人驾驶,需要太多传感器、视觉技术知识,需要大量数据积累,这是百度的优势。
而在开发方面,Apollo使用的是Java与C++。
6.游戏行业最赚钱的是腾讯
除了上面说的,据国外报道,目前游戏行业,最赚钱的游戏公司是腾讯。其次是索尼和苹果,微软排在第四。
7.微软失去对浏览器的控制权
微软浏览器Internet Explore已经过时,Edge也已经采用Chrome内核。虽然浏览器不赚钱,但是却是一个企业实力的标志。
我们常说:一流的企业卖标准,二流的企业卖品牌,三流的企业卖产品,四流的企业卖苦力;
微软失去对浏览器的控制权,这会让很多行业标准不再由微软决定。例如WebAssembly怎么执行依据不是微软说的算,所以他推出了
ASP.NET Core Blazor尽可能掌握主动权。 但是从本质上说,现在的微软Edge浏览器和我们现在用的QQ浏览器,360浏览器已经是同等水平。
8.微软在云服务和办公Office365上具有优势
上面说了为了面临的竞争者,但是微软在传统的Windows+Office具有绝对优势外,
特别是在云服务和Office365也具有绝对的主导权,份额也在不停的增加。
但是,尽管如此,这不足以支持微软帝国全部的业务,毕竟,云租用亚马逊云才是老大,而Office365也并不是不可替代。
由于在移动互联网面临的调整,这或许才是微软焦虑的原因,
这体现在NET上,就是不停的扩张NET的功能,希望吸引更多开发者。
*最后,微软仍然是巨无霸,就市值来说,微软市值基本上等于“阿里+腾讯+百度”三者和。
附:我对NET的一些看法
上面介绍了,或许微软的焦虑,导致微软不断扩充NET的功能。但是,不断膨胀的NET又让人望而却步。这就产生了矛盾:NET越来越强大但讨论的人越来越少。
我本身是非常喜欢NET的,但是事实上,就算是NET大本营的博客园,关于NET Core的讨论也是越来越少(除了一些重量级的人员),一枝独秀不是春,百花齐放春满园
那么问题出现在哪里?个人感觉有一下几点:
(1)用过Java的人都知道,Java分为三个版本 Java SE(标准版),Java EE(企业版)和Java ME(微型版),Java的定位非常简单:初学者学习SE,入门后就会写Form程序,
进阶后使用EE编写JSP Servlet 制作网站。最后ME开发嵌入式开发,比较清晰。
但是NET的就很难说清楚了,例如 NET Framework, .NET Compact, ASP.NET, .NET Core, ASP.NET Core, NET5.0 都有啥区别,或者说目的是什么?
相信很多外行人不清楚,就算内行的有时候都有点迷惑。
(2)我一直认为技术是分级的,当年VB能战胜C++就算因为简单。而现在NET Core感觉走进了死胡同。 当年WebForm虽然受到很多人耻笑,特别是ViewState臃肿,但是
WebForm提出的Page_Init, Page_Load, Button_Click的事件驱动模型编程,使用起来确实很简单。在Java里也有类似的 init(), service() destroy()生命周期模型,使用起来很简单。
但是 Asp.Net Core使用IOC和DI,服务注册等,IOC全称是Inversion of Control翻译成中文叫控制反转(感觉很拗口)进行周期控制,DI 全称是DependencyInjection翻译成中文叫依赖注入,
还有Middleware、ServiceProvider相信不少初学者,看到这些名词估计就会吓的后退。(我们可以不求甚解的写出Hello World,但是不可能一辈子都只写Hello World,项目越复杂就会要求NET Coree门槛越高)。
(3)更新技术太快。例如Java经典的SDK7 2011年发布,到现在还在用。也许是焦虑的原因,NET 基本上每过几个月就发布一个新版本。而且,整体感觉微软的技术越来越复杂。
例如前端时间要做一个Office365开发,下载了一个SDK,结果发现,整个文件非常大,非常复杂。层层调用,层层配置。
每次.NET Core发布,最大的感觉是除了Core新增了不少功能,就是速度提升。Net Core2.0比Core1.0快。 Core3.0比Core2.0快,Core4.0比Core3.0快,Core5.0比Core4.0快。
换句话说,每一次发布都打脸上一个版本,这让老用户情何以堪。NET最早发布与2000年左右,但是他的后辈们(例如Rust,Python,NodeJS)等都已经开始崛起。
NET虽然有点坎坷,但是微软的TypeScript却是成功的,真是有心栽花花不开,无心插柳柳成荫,