本文是MVP Ediwang写的回忆一个80后的拖控件的感悟,与君共勉:

每一代人都有记忆里的味道。煤球炉、黑白电视机是属于父母的记忆。而“拖控件”式编程,启蒙了无数像我这样的80后(嗯,89也算80后)。

经典旧世

2000 年那个时候,上海这样的城市里也不是每家每户都有电脑,我家也没有电脑。我在学校经常听几位家里条件不错的同学说他们玩电脑的事情。CIH、千年虫等名词让我对电脑有着非常强烈的好奇心。而我第一次体验到计算机,是在我母亲单位的机房里。它是一台卧式机箱、15寸 CRT 凸面屏显示器的 Windows 95 电脑。

当时的微软对我来说就是神的存在。因为我认识电脑到使用电脑的一切几乎都离不开这家伟大的公司,它就像上帝一样开天辟地,创造万物:WindowsOfficeIE这些当年几乎是唯一的主流产品。而微软的创始人之一比尔·盖茨也成了我的偶像。还记得当年,上海有个PC专题的电视频道,有一天该频道播放了比尔盖茨关于.NET战略的演讲,啥也不懂的我,居然坐在电视机前完整看完了节目。当时的我并不知道,.NET将会彻底改变我的人生轨迹。

图:《人民网》报道 .NET 战略

可能对于现在的年轻一代程序员来说,并不知道“拖控件”是什么意思。在我小时候,当年最流行的编程启蒙语言并不是Python和那满地的少儿培训班,而是Visual Basic 6.0。VB6之所以被称为”toy language”,就是因为它提供了图形界面的可视化设计器,只要拖拽控件(如按钮、文本框)到窗口上,就可以通过事件驱动的模型来编程,极易上手。

而我在VB6上没拖多久控件,就不小心误入了 .NET 的世界,起因是小时候不懂,为了更新编程环境,不小心购买了一张 Visual Studio .NET 的盗版光盘,装完了发现,这个VB怎么和以前的不太一样啊,从此走上了不归路……

图:Visual Studio .NET on Windows 2000

图:Visual Basic .NET 代码

控件的远征

无数程序员就这样拖出了一个时代。工业、医疗、零售、制造、物流等行业至今仍然随处可见 .NET 拖出来的Windows Form、WPF甚至ASP.NET WebForm系统。Visual Studio强大的工具支持,以及拖控件事件编程模型,虽然让生产力发挥到了极致,但也成了不少人对.NET固有的印象:“你这种用.NET的,拖拖控件,小学生都会!

拖控件生态,也养活了诸如DevExpressTelerik葡萄城等队友。这些三方厂商提供了比微软.NET Framework内置控件更强大的免费或收费的控件库,配合Visual Studio使用,开发效率简直恐怖。

控件王之怒

但正常的 .NET程序员都知道,控件只不过是 GUI 应用的一种形式而已。ASP.NET MVC、Web API、Signal R等框架根本拖不了控件。根深蒂固的 “.NET就是拖控件” 的思想,也闹出过笑话。记得8年前,微软刚推出 ASP.NET MVC 3 框架不久,我所在的公司就接到了一个 MVC 的新项目,由于整个部门200多人只有我研究过MVC,公司就派我去给客户做个POC。我第一天就被高级研发经理训斥了:“公司为了这个项目花钱买了 DevExpress 的 ASP.NET 控件,你为什么不用啊?” 。面对公司白买的控件,我笑出了眼泪,就像这样:

.NET成人礼 | 还记得20年前一起拖过的控件吗?的更多相关文章

  1. ATL控件签名之后页面还提示“在此页面上的Activex控件和本页上的其他部分及交互可能不安全”

    ATL控件正常签名打包,然后安装之后还是会提示: 没理由啊,签名是花钱搞得正当的签名.后来查了资料才知道这还不够,需要在创建ATL控件的时候继承一个IObjectSafetyImpl 类 知道了原因, ...

  2. 为什么我要使用一个20年前的IBM老键盘

    为什么我要使用一个20年前的IBM老键盘 发表在 心得体会 | 3条评论 几天前,我在网上发了一张图片,想炫耀了一下我的新MacBook Pro笔记本强悍的多屏功能.没人感兴趣.但图上的那个老键盘却得 ...

  3. 【CSS】Houdini, CSS的成人礼

    前情提要 CSS:老板,你看ES9,ES10都出来了,您看我的事情什么时候... W3C: 这不是正在走着流程嘛!小C你不要心急! W3C:(语重心长)你看啊,我们先(1)提个开发提案章程, 然后再批 ...

  4. low-code 与 20 年前的 Dreamweaver 有什么区别?

    一.low-code 是什么? A low-code development platform (LCDP) is software that provides a development envir ...

  5. c#静态构造函数 与 构造函数 你是否还记得?

    构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧. 静态构造函数是在构造函数方法前面添加了stat ...

  6. 《C#编程风格》还记得多少

    开始实习之后,才发现自己是多么地菜.还有好多东西还要去学习. 公司很好,还可以帮你买书.有一天随口问了一下上司D,代码规范上面有什么要求.然后D在Amazon上面找到了这本书<C#编程风格(Th ...

  7. 【编程之外】还记得曾经给'大学导师'写过的报告嘛 --> 前方高能

    写在前面 本文不是讲技术的,也没什么代码可看 本文不是讲技术的,也没什么代码可看 本文不是讲技术的,也没什么代码可看 还记得我们曾经给我们大学''导师''写过的报告嘛? 大学他愿意在凌晨6点向你询问近 ...

  8. c#静态构造函数 与 构造函数 你是否还记得?(转载)

    构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧.静态构造函数是在构造函数方法前面添加了stati ...

  9. 你还记得当初为什么进入IT行业吗?

    说到这个问题,小编相信不少童鞋开始忆往昔峥嵘岁月,那个少年为了心中的改变世界的理想,进入了这个行业,但是呢,有一群人画风就不一样了,他们进入IT行业,完全只是是因为.... 小时候广告看多了....: ...

随机推荐

  1. Gym 101964 题解

    B:Broken Watch (别问,问就是队友写的) 代码: import java.awt.List; import java.io.BufferedInputStream; import jav ...

  2. jquery中的 $(function(){ .. }) 函数

    2017-04-29 在讲解jquery中的 $(function(){ .. }) 函数之前,我们先简单了解下匿名函数.匿名函数的形式为:(function(){ ... }),又如 functio ...

  3. pandas可视化:各种图的简单使用

    一.Matplotlib中几种图的名字 折线图:plot 柱形图:bar 直方图:hist 箱线图:box 密度图:kde 面积图:area 散点图:scatter 散点图矩阵:scatter_mat ...

  4. Android的消息循环与Handler机制理解

    一.概念 1.事件驱动型 什么是事件驱动?就是有事了才去处理,没事就躺着不动.假如把用户点击按钮,滑动页面等这些都看作事件,事件产生后程序就执行相应的处理方法,就是属于事件驱动型. 2.消息循环 把需 ...

  5. 【学习笔记】第七章 python3核心技术与实践--输入与输出

    [第六章]思考题答案,仅供参考: # coding:utf-8import time#方法一start_time = time.perf_counter()s = ''for n in range(0 ...

  6. Java8之熟透Lambda表达式

    一.Lambda简述 1.1.Lambda概述 ​ Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. ...

  7. 解决ie6上碰到的css兼容问题

    ie6上css碰到的坑 前两天在给一个项目做东西的时候,碰到一个有意思的项目,是需要兼容ie6,有一些碰到并且解决的问题,给大家写下来,方便大家以后碰到类似的问题哈- 喜欢的话还请点赞! 1.impo ...

  8. Failed to access IIS metabase.

    framework4.0 可这样 C:\Inetpub\AdminScripts>cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\ C:\WIN ...

  9. Spring事务传播行为中可能的坑点

    一.简介 Spring事务配置及相关说明详见:https://www.cnblogs.com/eric-fang/p/11052304.html.这里说明spring事务的几点注意: 1.默认只会检查 ...

  10. 转:LinkedHashMap和HashMap的比较使用

    import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.uti ...