产品是由一系列属性组成,如,价格,性能,可移动性等。对于程序开发语言来说,就是性能、开发速度、可维护性等。对于产品的某个属性,并不是这个属性越高越好,只要足够高就行了。绝大多数人绝大多数场合,对产品的要求不是要求它“最好”,只是要求它“足够好”。当足够好之后,人们就会去关注其它的属性。

举例子,就拿人来说,吃东西,不是吃的越多越好,当人吃饱了,就会想别的花花肠子,所谓保暖思淫逸。拿电脑来说,当一个电脑性能足够用之后,我们可能就会要求它可携带、便携,当可携带之后,我们的关注点可能就是待机时间或其它要求了。

因此,本文的立足假设就是:市场上对一个产品的某项属性要求有一个满意线,超出这个满意线,就可以被市场接受,此时,不同产品之间竞争的主战场就会切换,从一个属性变化到另一个属性。

而市场是多样化的,每个市场对属性的要求不同。我简单的画一张图(上图),这个图上横坐标是时间,纵坐标是程序的性能。为了简化讨论,在这里只谈性能,至于其它的,用类似分析方法可以分析。一般来说,随着时间发展,程序的性能是逐步提高的,我们就假设C#的性能低于C++,是对方的0.X倍。这里假设有4个市场A、B、C、D,4个市场对程序性能的需求不同,A要求最高,B其次,C再其次,D最没要求。市场对性能的期望也是上升的,常见的情况就是上面的模式:市场对性能的需求是逐步上升的,产品的性能也是逐步上升的,但后者上升的比前者快。

上图中有3个时间点。在时间点1,C#还没出生,C/C++的性能可以满足D市场的需求,哈哈,这时候,D市场里的技术人员纷纷选择C/C++开发,这时A、B、C市场上的开发人员没办法,只能一句一句汇编的写。在时间点2,C/C++可以满足A、B、C、D四个市场的需求了。C#也发展到可以满足C、D这两个市场的需求了。此时,C、D两个市场上的技术人员,在选择技术时,就不再关心C#的性能问题,他们的关注重心是性能之外的事情,而C#在快速开发、可维护性上要优于C/C++。此时,选择C#就是正确的选择。而A、B两市场上的开发人员则绝不会考虑C#,因为性能不过关。时间继续发展,到了时间点3,B市场的一些先行者突然发现,C#可以满足他们的性能要求了——于是,C#又蚕食掉了C/C++的市场C。

当然,世界中的事情比这复杂的多,这幅图只是简化之后的阐释。上面这些文字,最核心的2个意思是:

(1)我们对大多事物的要求只是足够好,不是最好,当一个方面足够好了,人们的关注点会迅速切换到其它方面去;

(2)由于市场之间的交叉性很差,致命的竞争对手往往潜伏在别的领域,而不是目前正在正面竞争的技术。

对于第(2)点,再画一张图来解释:

这张图上只有两个市场A、B,这两个市场相隔甚远。有甲、乙、丙三种技术,在时间点1,只有甲、乙两种技术能满足A市场的需求。于是甲和乙两种技术缠斗不休,打呀打呀打呀,打到时间点2。这时丙技术虽有发展,但还是不能满足A市场的需求,A市场上没有丙技术的影子。甲和乙眼里只有对方,仍然互相踩啊打呀骂啊。到了时间点3了。甲和乙依然还在打啊打啊,这是A市场发现,丙技术能满足他们需求了,此外发现,丙技术还具备甲、乙技术所不拥有的其它优点。然后丙技术很快在A市场上传播开了,甲技术和乙技术傻眼了…… 市场的急剧变换就是这样发生的。想想摩托罗拉是怎么衰落的?

换到C/C++/C#可以推断,C#会对C/C++的现有市场逐步蚕食,从D到C到B到A……

但是——

(1)考虑到现有的在C/C++上的投资,并不一定会完全的转移到新技术上去

(2)其它市场,如嵌入式这一块如今发展凶猛,在这一快速发展的领域,C往往是最先满足需求的技术(如性能,内存占用,编译器的复杂程度等),C++是其次,C#是最后。因此表现就是,C#蚕食C/C++的老市场,C/C++不断的进军新市场。如果C/C++扩张速度大于被蚕食速度,那么在语言的份额上,C/C++依然是逐渐扩大的。

具体我们在技术的选用上,就要看这个技术是否在某方面已经足够用了,然后多方面考虑进行决策,而不是这个技术是不是最NB的。

=============

本文最想说的不是上面这些,而是下面的——

螳螂捕蝉,黄雀在后。C#在蚕食C/C++,但有一个潜在的对手,可能威胁到.Net在桌面开发的未来地位。而目前,绝大多数人对这个潜在的敌人还不甚了解。本文重点就是介绍这个潜在的对手。

这个潜在的对手就是Flash。Flash的主流市场是网络广告,然后是视频网站,这个市场和桌面开发完全是不沾边嘛!但是——请听我一一道来:

(1)Flash是一个虚拟机平台,跨平台的,还可以在很多手机上应用。我们以前可能觉得.Net是平台,Java是平台,但Flash也是一个平台,这三个平台之间没有啥本质的区别。Flash理论上也可以支持多语言,事实上,相关项目已经启动了。Flash/AIR可以运行在桌面。

(2)Flash的主流语言as3很强大了,已非昔日阿蒙,除了语法略有不同外,它几乎是和C#最相似的语言。有属性,有事件,有function,有接口,有异常,有比较强悍的静态类型系统,也有动态类,有反射,有Remote(as3的Remote非常好用的!),当然,缺乏的也不少,最主要的是缺泛型。as3性能也很不错,我简单的测试结果是Flash程序大约相当于sl程序性能的80%,而不用unsafe,sl性能和wpf是相当的。重构啊,单元测试全部都支持的。

(3)在UI上,和Flash/Flex对应的是WPF+Silverlight,不是Silverlight。目前Flex已经是4.0了。至于Html5,现在还在打酱油,本文除了这句话外,再也不会提及它。

(4)在IDE上,Flash Builder已经很好用了。此外还有古老的Flash和新生的Flash Catalyst。Flash现在是有3个不同定位的官方IDE,可满足于不同的需求。

下面,就以一个简单的Hello World来演示一下Flash开发和.Net开发的相似性。

上图是Flash Builder。由于是在Eclipse基础上开发的,有过Eclipse使用经验的可以快速上手。同时,它的开发模式和VS下WPF开发是非常类似的。而WPF在VS2010之前还无法拖控件,Flash Builder(Flex Builder)很早就可以拖动了。同时,Flex也提供了很多现有控件的。上面,我拖了2个控件,一个Label,一个Button。然后在Size and Position中,我设置了这个button的定位约束在右下方。

上图是官方的控件。常用的都有了。

上图是属性面板,里面列了button的属性和事件。带“闪电”图标的是事件。双击即可自动产生方法。比如,双击click,可产生:

protected function button1_clickHandler(event:MouseEvent):void
{
}

点击时让label显示helloworld,可在方法体中添加:

this.txt.text="Hello world.";

到现在为止,只写了这一行代码。然后运行,可以得到:

下面是完整的代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx" width="375" height="242">

<fx:Script>
        <![CDATA[
            protected function button1_clickHandler(event:MouseEvent):void
            {
                this.txt.text="Hello world.";
            }
        ]]>
    </fx:Script>

<fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button label="Click Me" click="button1_clickHandler(event)" right="10" bottom="10"/>
    <s:Label x="42" y="48" id="txt"/>
</s:WindowedApplication>

Flash的数据绑定非常简洁。改写成数据绑定版本:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx" width="375" height="242">

<fx:Script>
        <![CDATA[
            [Bindable]
            private var message : String;
            protected function button1_clickHandler(event:MouseEvent):void
            {
               this.message = "hello world";
            }
        ]]>
    </fx:Script>

<fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button label="Click Me" click="button1_clickHandler(event)" right="10" bottom="10"/>
    <s:Label x="42" y="48" text="{this.message}"/>
</s:WindowedApplication>

这些年来,Flash在悄悄的布置阵地,现在这个阵地已经成型了。由于关注于UI,这个虚拟机很小,语言也很实用很轻量级。部署在桌面的话也只是10M上下,而类似的WPF程序的部署大小是30M-40M。同时,还是跨平台的。并且,浏览器应用和本地应用之间的差异很小。开发速度也很快,比.net的开发慢不了多少。http://www.taaz.com/makeover.html 这是一个非常NB的Flash Web程序,我只用了5周时间就已经实现了它除了自定义模特之外的主要功能!

目前Flash还有一些非常大的缺陷,如虚拟机的成熟度仍然不够,还有桌面程序目前还不支持本地调用。前者依靠时间来完善,后者也需要等等。如果这些实现了,将是C#在桌面上的极大的威胁!但目前,.Net还很不在意Flash的存在,大家头脑中想起Flash依然还是漫天的网络广告。

C# vs. C++/C : 从技术管理角度的分析(附: .Net 在桌面领域的潜敌分析)相关推荐

  1. 公司技术管理角度看C++游戏程序员发展

    公司技术管理角度看C++游戏程序员发展 H3D 这是我多年来招聘培训游戏程序员的一点想法.一直想汇总一下.主要目的是为了更好的对公司新进C++程序员进行培训,并且建立起游戏程序员培训,发展,成才,成为 ...

  2. 建筑工程技术管理模式创新初探

    为了保证建筑工程的施工质量需要做好技术管理工作,保证在工程建设中能够对建筑工程所涉及的技术.工艺.工序等进行有效的规范及控制,通过对技术管理模式进行优化及创新的方式来实现在建筑工程中对施工流程进行全过 ...

  3. 技术的那些事儿_3_西方技术管理的精髓

    三.西方技术管理的精髓 1 从技术角度看:S曲线 我要让你们知道,老狗也有几颗牙! --艾兰(麦迪文的老爹) 把技术当作狗的话,这条狗就有小狗阶段,大狗阶段和老狗阶段,这就是技术的生命周期. Fost ...

  4. 从大数据技术参考模型角度梳理大数据标准

    大数据标准化背景 面对目前数量.速度和多样性日益增长的信息资产,大数据技术通过各种解决方案.体系.结构.工具和平台集合,能有效应对大数据场景. 因为数据是大数据的基础,对于大数据标准化,除了继承数据标 ...

  5. 技术管理:带人和团队管理

    声明:所谓的技术管理笔记,是一位原大公司的码农不甘寂寞,出来加入创业公司后的管理心得记录.大公司到创业公司的落差是全方位的,制度,氛围,资源,人才皆有.从最初的不适应到一路磕磕碰碰活到现在.心中充满感 ...

  6. 技术、管理和技术管理

    曾经听到过不少人说做管理的人不需要懂技术,其大意是因为懂技术反而会制约自己的管理判断或决策.最近因为在读MBA,也突然想起这一观点并做了一些思考.      对于这一观点,我想首先不能用对与错来对其加 ...

  7. 浅谈技术管理之个体能力建设

    最近在学习刘建国老师的技术管理36讲,被对方的管理思想所折服,写这篇读后感是为了向刘老师致敬.同时,这篇文章站在巨人的肩上稍微往前推进一小步,导入我的齿轮模型.我觉得用咬合的齿轮来打比方有以下几个考量 ...

  8. 【实战技能】非技术背景经理的技术管理

    目录 1 技术管理从哪里开始? 2 非技术背景经理的责任 3 如何对待技术供应商 4 技术管理的基本点 5 参考资源 不是技术出身的管理者,或者说不在技术第一线的管理者,如何做好技术管理呢?今天和大家 ...

  9. 《极客时间-技术管理实战》读书笔记

    外驱让我们可以做好本职工作,内驱才能让我们成就卓越. 做管理的基本认知: 更大的责任:更好的实现团队目标,基本体会不到行使权力的快感. 更立体的视角.考虑上级.下级.平级的期待和诉求,不能只是关心眼前 ...

最新文章

  1. linux——脚本的练习示例二
  2. 关于flock文件锁的阻塞与非阻塞
  3. asp.net 日期转换
  4. 插件式架构设计实践一:插件式系统架构设计简介
  5. Https背景与证书在spring boot项目中的使用
  6. 准备开始考试系统分析员
  7. java实现栈的方法
  8. SK-Learn之决策树
  9. 金融行业灾备压力大?看中和农信如何从容应对
  10. 服务器更新维护尚未全部完成,【已开服】11月21日全部服务器更新维护公告
  11. 菜鸟学习之Java入门基础知识
  12. 《IPD:华为研发之道》读书介绍
  13. 日历2021年日历表|2021年日历表打印版 Excel版
  14. 这样的简历HR才会看----个人整理
  15. js 根据公历日期 算出农历_JS简单获取当前日期和农历日期的方法
  16. [BZOJ2959]长跑——新技能:LCT+缩圈
  17. 9.3. Mathematical Functions and Operators
  18. 阿里云AI训练营SQL入门到实践 Task3:视图、子查询、函数等
  19. HarmonyOS之深入解析相机的功能和使用
  20. 2022面试Android之单例模式

热门文章

  1. NovuMind 首秀 CES,展示业界最高性能的 AI 芯片
  2. 王劲首度解析景驰:我们是跑得最快的无人驾驶公司
  3. 初级开发者vs高级开发者 | 每日趣闻
  4. 那些离开大厂,回归学术界的科学家们!
  5. 漫画:程序教你玩转股票
  6. vue-router 按需加载的 3 种方式
  7. Linux -nginx-源码安装
  8. WPF使用X:Static做多语言支持
  9. linux 中关于网络的配置方法
  10. 不知道为什么,很多优秀的产品知道人确很少