我最近在7月4日的那一周休了一个假,因此有时间来回顾我的职业生涯。令我震惊的是,我已经写了近30年的代码了!于是,我决定好好利用这段额外的休息时间来创作一篇怀旧的帖子,回顾在过去近30年时间中我工作过的编程语言。向我从“Hello, World”开始学习新语言的30年致敬。

30年程序生涯26种语言 看我与“Hello World”的往事

  我学习的第一种编程语言是TI BASIC,BASIC专门为微软TI 99 / 4A microcomputer而编写的一种语言。BASIC,即Beginner’s All-purpose Symbolic Instruction Code(初学者通用符号指令代码),是一个7岁的、被约束在家里、没有游戏玩的孩子学习的完美语言。该语言用行号组织代码行,并且像这样在屏幕上展示内容:

30年程序生涯26种语言 看我与“Hello World”的往事

  1981年 – TI BASIC

  我花了几个月的时间使用TI BASIC编写了“choose your own adventure”游戏,并且其中更多的时间是花在听黑色的盒式磁带记录器存储和恢复数据时发出的汽笛声,爆裂声,还有嘶嘶声。也许我年轻的生命中最令人激动和关键的时刻就是,几年后我的父母带回家一台Commodore 64。这台机器提供开箱即用的Commodore BASIC,或PET BASIC。这也是微软基于6502 Microsoft BASIC而编写的,而6502 Microsoft BASIC专门为那个芯片系列而写,恰巧那时此芯片系列也同样可以服务Apple机器。

  1984年 – Commodore BASIC

  问号是PRINT命令的简写,而之后奇怪的字符是输入RUN命令的省略方式(R SHIFT + U ——在Commodore 64键盘上提供出色的小的图形片段,你可以用它来制作基本的图片)。

  我很快发现,BASIC不会做所有我想要它做的事情。 “demo scene”在那时一枝独秀,并且一群志同道合的人正在制作令人惊叹、将挑衅机器极限的程序。它们会做一些类似诱使video chip去绘制图形,去绘制那些原本应该是不可能的或滚动内容的或甚至是移动数据到屏幕“超出范围”边界部分的图形。实现这些特技需要精确的定时,而定时只能通过直接的机器语言代码才能实现。所以,我启动了机器监视器(允许你直接输入机器代码到内存的软件名称),并写了这个小程序:

30年程序生涯26种语言 看我与“Hello World”的往事

  1985年 – 6502 Machine Code

  这个小app通过一个索引加载“Y-累加器”,然后通过始于$ C100的内存旋转,一次发送一个字符到ROM子程序,ROM子程序会将它们打印到显示器。这等同于机器代码中的一个for循环(for y = 0; y <= 0x0d, y++)。该RTS从子程序返回。为了执行程序,你必须使用内置的SYS命令,调出内存地址(不幸的是,你必须将十六进制值$ C000转换为十进制49152,但除此之外,这样的工作很有魅力)。我有用于“HELLO,WORLD”的PETSCII字符,保存在内存地址$ C100(是的,Commodore 64有它自己特殊字符页)。

  下面是结果:

30年程序生涯26种语言 看我与“Hello World”的往事

  当然,生活中的话,当我从原始机器代码转移到程序集更容易。有了程序集,我可以预先计划好我的软件,并使用标签来标记存储区域,而无需记住内存地址。上面显示的相同程序可以这样写:

  1986年 – 6502 Assembly

  * = $C000;

  set the initial memory addressCHROUT = $FFD2  ;

  set the address for the character out subroutine

  LDY #$00 LOOP

  LDA HELLO, Y

  CMP #$00

  BEQ END

  JSR CHROUT

  INY

  BNE LOOP END

  RTSHELLO

  ASC 'HELLO, WORLD.' ;

  PETSCIIHELLOEND DFB 0 ;

  zero byte to mark the end of the string

  大约在那个时候我才意识到我真的很喜欢编写软件。我在高中学了一些课程,但所有他们教的是愚蠢的小Pascal语言,一种旨在使学习如何编程更“容易”的语言。真的?更容易吗?在使用机器监视器手工编码复杂程序之后,Pascal感觉非常的矫枉过正。当然我不得不承认“Hello, World”的语法真的特别直接。

  1989年 - Pascal

  program HelloWorld;

  begin  writeln('Hello, World.');

  end

  我认为那时时尚的年轻人使用C语言工作。这是一种相当灵活的语言,感觉比程序集更像是一组功能性宏。我作为兼职自学了C,但只用了一小段时间。

  1990年 – C

C++代码
  1. #include <stdio.h>  
  2. main(){    
  3.   printf("Hello World");  
  4. }  

  这个小程序,包括处理标准输入/输出,然后以它自己的方式发送文本的一个库。库是C语言如何允许我们开发跨平台——函数调用也是同一回事,无论你是在Windows还是Linux环境中,但库本身实现所有低级别的使其在目标机器上工作所需的例行程序。上面的代码是我几年后在我的Linux机器上鼓捣的。很难形容如果你在那个时间还没有投入计算机是什么样子,但感觉你并非一个真正的程序员,除非你构建你自己定制的Linux安装。我所说的通过“构建你自己”,字面上的意思是粗粗处理源之后,定制它以匹配特定的你所拥有的硬件。最有趣的是处理视频卡,和了解“dot clocks”以及所有让主板与图形芯片友好结合的细微差别。好吧,我有点离题了。

  C语言真不是我学习的一个挑战,但我很快发现时尚的年轻人正在做一些与众不同的东西,并遵循这种被称为“面向对象编程”的范式。机器代码和程序集与OO大不相同,因此,从程序性到面向对象的转变是我准备好要应对的挑战。那时的你还不能便捷地从网上搜索内容(当然也是可以的,但它使用不同的机制),所以我到外面去给自己买了一摞C ++的书。事实证明,C ++支持“对象”这个想法。它甚至用对象来表示流和管道以操作对象。这个面向对象的玩意还推出了命名空间的概念,以便于更好地管理代码分区。总而言之,“Hello,World”变成了:

  1992年 – C ++

C++代码
  1. #include <iostream>using namespace std;  
  2. int main(){  
  3.   cout << "Hello World";    
  4.   return 0;  
  5. }  

  我上了大学,但令我失望的是,大学竟然不教我感兴趣的“现代”语言课程,例如C和C ++。相反,我不得不蒙混过关一门家庭作业是在我们称之为“Cypher”的主机上执行的课程,使用一种有趣的编程语言,叫Fortran,这语言实质上关注你把代码放到了哪个纵列!这是对的,当时这个语言指定纵列1用于注释,纵列1 – 5用于声明标签,纵列6用来标记延续,仅在纵列7你才可以开始编写实际的代码。总之,学得越多,我越下定决心以后再也不要使用它。

  1993年 – Fortran

  PROGRAM HELLOWORLD

  PRINT *, 'Hello, World!'

  END

  因为我并没有投入太多热情到主课程,所以我大多数晚上都在计算机实验室中,登陆到学校拥有的大量Unix机器上。就是在那里,我发现了Internet,并学到了关于安装软件的“老派”方式:拉下源代码,构建,检查错误,调整,修复,并获得一个可工作的客户端。老实说,我不知道你在没有学习基于运行回去方式编程的情况下是如何使用Unix的,我只能不断地用我的方式围绕系统编辑修改、探索和学习。我经常要做的一件事是执行命令,那将导出大量的信息,然后你不得不使用“方便的”命令行工具来解析这些信息。在那段时间我学习的一种最酷的语言之一是PERL。用这样一个简单的例子,我就可以说明它并没有得到应有的公正,请看:

  1993年 – PERL

  $welcome = "Hello World";

  print "$welcome\n";

  同时,我很快发现了大量的World Wide Web(是的,这就是我们当时对它的称呼……Internet运行所有那些有趣的程序,例如Gopher和Archie,而World Wide Web只是上面的一系列文档)。HTML对于我而言是另一个飞跃,因为这是我第一次亲密接触创建声明式UI。不同于加载变量或常量,以及调用某些关键字或子程序,照字面意思我就可以在页面上组织内容。你会惊讶于20年后,HTML页面的基本语法真的完全没有改变。

  1993年 – HTML

XML/HTML代码
  1. <html>  
  2.   <head>  
  3.     <title>Hello, World</title>  
  4.   </head>  
  5.   <body>  
  6.     <h1>Hello, World</h1>  
  7.   </body>  
  8. </html>  

  这对我来说是一个有趣的时刻。我从个人计算机(TI-99/4A 和Commodore 64以及一段花在Amiga上的短暂时期)转移到了大型计算机,突然我的PC于我而言成为了一个连接到Unix大型主机的终端。我也运行Linux操作系统在我的PC上,因为这是当时连接到Internet和网络最快的方式——TCP / IP协议栈被内置到操作系统,而不是像在旧的Windows版本中那样放置在系统上面(还记得NETCOM吗?)。我的大部分工作都是在大型计算机上完成的。

  我没有意识到的是我正在失去与PC世界的联系。这在当时非常明显,个人计算机的疯狂时代已经过去,尘埃落定于这两种计算机:PC,运行Windows,对于我们大多数人,以及Mac,对于设计师。这就是我深信不疑的。当时我有一个室友,专注于Mac,并且在那段时间设计了电子优惠券。他有所有这些漂亮的图形设计程序,并常常问我,“你的PC上有什么能做到这一点?”我会耸耸肩,提醒他我甚至不会画圆和正方形,所以我了解图形软件干什么呢?我喜欢我的PC,因为我理解软件理解数学,所以即使我不会绘画,也可以使用数学来创建分形图形或粒子风暴。当然,这样做需要有一个显卡,而且从Telnet会话到Unix框并不实用,所以我开始学习如何在PC上编码。当时,只有Win32和C ++才能实现这些伎俩。现在你仍然可以在Visual Studio 2012中创建用于堆栈的样板文件。当然,我就不让Win32跨越150行代码的初始“HELLO.C”的细节来烦你了。

  1994年 – Win32 / C ++(示例为近期的)

30年程序生涯26种语言 看我与“Hello World”的往事

  用命令行执行的结果:

30年程序生涯26种语言 看我与“Hello World”的往事

  然而,粒子流和Mandelbrot集对我就业并没有产生任何帮助,因此我只能采取不同的办法。讽刺的是,我一开始的职业和计算机没有一点关系。是的,我的第一份正式工作是在一家保险公司接索赔电话,工作语言为西班牙语。在这个我愿意熬夜工作于PC,并且对低薪表示“满足”的工作面试中,我不经意间提及我会讲西班牙语。于是他们派了他们的双语代表来面试我,我通过了测试,并在一周内获得了一个更高薪水的职位,在一些简短的电话中,我学到了比我多年在高中学到的更多的西班牙语。

  我年轻,有竞争力,并且我们基于一天成功解决多少索赔进行排名。但是我总是落后,因为我用的软件往往隔一段时间就崩溃。这对我而言,是一个全新的系统——AS / 400(现在称为iSeries)——但我还是搞清楚了,并且学会了至少如何在崩溃之后重新启动索赔软件。IT部门很快流行起来,并把我拉到一边。我担心我遇到了麻烦,但是他们给了我去IT部门的offer。于是我的工作基本上变成了维护AS / 400系统,以及给大量打印机换墨盒,以便于打印保单表格和索赔。

  在我去操作换墨盒的过程中,我做了一个很大的改变。由于某些表格只要黑色墨水,而其他表格还需要绿色或红色的亮点。但是这些打印机只能处理一种墨水轮廓,所以每当遇到不同类型的表格时,我们会得到一个警报,然后去换墨水。我觉得这这是荒谬的,所以我花时间来自学RPG。我写了一个程序,它将匹配打印作业到墨水颜色,然后排序打印队列,以便于所有的黑色打印都能放到一起,所有的绿色都放到一起,等等,这将8小时的工作到缩减到2个小时,并给了我大量时间来学习RPG。原始版本——RPG II和RPG III ——是一种粗糙的语言,被简单地设计为模仿打卡系统,并生成报告(代表Report Generator)。和Fortran一样,RPG是一种定位语言。

  1995年 – RPG

  I

  'HELLO, WORLD'

  C

  HELOC

  HELO

  DSPLYC

  SETON

  LR

  注意第一个字符显示的行的不同类型(其实它原本会有若干列,但我有意省略了一些边缘代码)。这定义并显示了一个常数,然后设置一个指示符结束程序。

  在这些操作之后,我又开启了第二幕个人秀。月末的会计需要相当多的时间和精力。原来的系统是一台读取穿孔卡片的Honeywell 主机。写了一个COBOL程序,能在模拟穿孔卡片的文件中读取并输出另一个之后注入AS / 400被处理的文件。在此之后,各种会计数据必须得匹配。由于舍入误差,不支持的交易,以及任何其他许多数字几乎从不匹配的问题,所以这工作就成为了调查进程,找出哪里坏了,然后更新代码来解决它。我们也曾“紧急”工作过11个小时,读取输出数据生成账务调整,以平衡账目,如果我们无法找到问题的话。虽然我没有涉及很多COBOL代码,但是我不得不去充分地了解它,以便于阅读Honeywell 源代码来解决AS / 400上的问题。

  1995年 – COBOL

  IDENTIFICATION DIVISION.PROGRAM-ID.

  HELLO.ENVIRONMENT DIVISION.DATA

  DIVISION.WORKING-STORAGE SECTION.01

  WELCOME-MESSAGE

  PIC X(12).PROCEDURE DIVISION.PROGRAM-BEGIN.

  MOVE "Hello World" TO WELCOME-MESSAGE.

  DISPLAY WELCOME-MESSAGE.PROGRAM-DONE.

  STOP RUN.

  这只是一段很短的时间,之后顶级RPG大师来到我们公司给我们上了为期三天的课程,因为最酷的事情是发生在AS / 400世界中。不仅AS / 400机器转移到64-bit(众所周知加倍的位数更好,对吧?),而且RPG语言正在越来越规整,版本IV将接受更多的程序并且几乎比以往任何时候都要更面向对象。那有什么酷的吗?在给我们培训的时候,我不由得大笑,因为所有老的RPG开发者对这种“新的编程风格”目瞪口呆抓耳挠腮,试图蒙混过关,但我却可以放心,因为最终可以回归到我更习惯使用的C和C ++程序,而不是RPG语言曾经那种紧密,狭隘,指示符和基于列的风格。

  一些开发人员可能会因为其中一个特征而三振出局,要知道这些特征真的可以打败任何人。语言要求指示符从某一个列开始,并且输入的指示符要先于它们。这是一个非常有限的空间,所以你可能真的只能加载几个字符常量,否则,你就不得不指定它们作为常量或数据结构并读取它们。新的语言移动关键字栏到了右侧,这样就有更多的空间来放置在“要素一”。这意味着我们现在只要短短的几行代码就可以做到“Hello, world”。语言也更“程序化”,所以你可以通过return结束一个程序,而不是设置指示符(尽管如果我没有记错的话,主程序的return其实只是设置在幕后的指示符)。

  1996年 – RPG / ILE

  C     'HELLO, WORLD' DSPLY C

  RETURN

  AS / 400内置数据库功能在操作系统内称为DB2。在很长的一段时间内,数据库只支持通过RPG或其他软件直接的指示符,不支持SQL语法。它作为一种特殊的程序包,名为SQL / 400而推出,但潜在的支持依然在那里。我在1998年写了第一篇出版(打印)的,关于窃听SQL用于AS / 400(Create an Interactive SQL Utility)的文章。大概有一百万个方法可以用SQL输出“Hello, World”,但也许最简单的方法是这样的:

  1998年 – SQL

SQL代码
  1. SELECT 'HELLO, WORLD' AS HELLO  

  首先抱歉这里我没有按时间顺利来写,但SQL作为我“主要”或“有薪”工作的一部分,很重要。并且同时我参与了很多重游戏,从DOOM开始(我的第一个游戏,因此印象深刻,当时我还花钱购买了完整版本),然后是DOOM II和HEXEN,以及最后的Quake。如果你不熟悉第一人称射击游戏的历史,那么我告诉你正是Quake这个游戏改变了游戏的历史。它提供了第一个“真正的”3D世界(前人只是用2D地图模拟3D,从而允许不同的地板和天花板高度),并通过支持TCP / IP和使用高级代码彻底改变了死亡匹配,这些高级代码比以前允许更多的游戏玩家出现在同一张地图中。

  这也是极其定制化的。虽然我在审美上不擅长,并且从来没有去创造我自己的模型或地图,但是我直接跳进了编程。Quake提供了一种基于C的语言,叫QuakeC,从字面上你会编译成一个特殊的跨平台字节码,可以运行在所有目标平台上,如Quake。我快速写了一些修改,以便于做一些例如允许玩家玩火或导致钉鞋从墙上逼真弹回的事情。有人在聊天室要求我编程一个点子,正是这个点子让我出了名,它被称为“MidnightCTF”,基本上说,就是将现有地图的所有灯关掉,只允许玩家使用配备的手电筒照明。Quake是第一批支持真正3D音效的游戏,这增加了游戏的趣味。

  甚至有人从我的修改中择取了一个代码片段收录到“编程语言词典”的QuakeC entry条目下。Nikodemos是我玩Quake时用过的昵称。QuakeC的“Hello, World”不过是一条在游戏中发送给当前所有玩家的广播消息。

  1996年 – QuakeC

  bprint("Hello World\n");

  直到这时候我才意识到互联网是真的蓬勃发展了。1993年,我在大学里发现它的时候,还没有人明白我在说什么,那个时候我真的非常灰心丧气。但短短几年后大家都在争先恐后地访问Internet(一些公司,如AOL和微软MSN,认为他们可以建立自己的版本……但最后都放弃了,决定接入到互联网中)。我意识到,在大型机上的工作会逐渐过时,或者充其量我只能做那种隐藏在后面昏暗角落中攻击“旧系统”的开发人员。我决定学习新的东西。

  我转移到另一个正在研究一个新玩意的部门——设计一个应用程序,通过连接用VB6(COM +)和ASP编写的应用程序中的几个不同的系统,来提供跨供应商的可视化。

  1998年 – VB6(COM)W / ASP

  Public Class HelloWorld

  Shared Public Function GetText() As String

  return "Hello World"

  End Function

  End Class

  <%@ Page Language="VB" %>

  <OBJECT RUNAT=SERVER SCOPE=Session ID=MyGreeting PROGID="MyLibrary.HelloWorld">

  </OBJECT>

  <HTML>

  <HEAD>

  <TITLE><%= MyGreeting.GetText() %></TITLE>

  </HEAD>

  <BODY>

  <H1><%= MyGreeting.GetText() %></H1>

  </BODY>

  </HTML>

  当时,我有机会与一个有天赋的架构师一起工作,这位架构师设计了一个在当时相当令人惊讶的系统。我们的COM +组件在接口中都接受单一的字符串参数,因为输入信息是作为XML传递的。这使得我们的组件可以轻松处理来自于网站的消息,因为它们可以引入来自于第三方系统的数据。这是一种真正的“web服务”,在我真正理解这个词是什么意思之前。在客户端,表单是由JavaScript解析并打包成XML,再发布下去的,所以来自于网页的“帖子”和直接来自于服务的帖子并没有什么不同。服务也返回作为XML的数据。这将与一个针对UI(称为PXML——presentation XML)的模板结合,然后XSLT模板将转换它用于显示。这使得我们可以调整UI而无需更改底层代码,而且这非常像一个低效率的XAML引擎。这是在.NET之前的日子。

  当然,JavaScript是我们的克星,因为那时候我们不得处理各种浏览器。是的,当涉及到JavaScript和跨浏览器兼容性的时候,存在于15年前的同样问题今天依然存在。幸运的是,所有的浏览器接受发送对话框给最终用户的方式。

  1998年 – JavaScript

JavaScript代码
  1. alert('Hello, World.');  

  很多时间被花在工作于Microsoft XML DLLs上(是的,如果你还记得注册MSXML解析器)。MSXML3.DLL很快就成了我最好的朋友。下面是使用XSLT将XML转换为HTML的一个例子。

  1998年 – XML / XSLT to HTML

XML/HTML代码
  1. <?xml version="1.0"?>  
  2. <hello>Hello, World!</hello>  
  3.   
  4. <?xml version='1.0'?>  
  5. <xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">      
  6.   <xsl:template match="hello">          
  7.     <html>              
  8.       <head>  
  9.         <title><xsl:value-of select="."/></title>  
  10.       </head>  
  11.       <body>  
  12.         <h1><xsl:value-of select="."/></h1>  
  13.       </body>  
  14.   
  15. <%Const MSXMLClass = "MSXML2.DOMDocument"   
  16.         Set XSLT = Server.CreateObject(MSXMLClass)  
  17.         Set XDoc = Server.CreateObject(MSXMLClass)   
  18.         XDoc.load(Server.MapPath("hello.xml"))  
  19.         XSLT.load(Server.MapPath("hello.xsl"))   
  20.         ResponseResponse.ClearResponse.Charset = "utf-8"Response.Write   
  21.         XDoc.transformNode(XSLT)%>  

  我用了好几年的时间工作于那个范例。在那段时候我经历了个人的转变,体重减了近70磅,腰围从44” 降到32”,对健身充满了激情。我开始兼职性地开办我自己的公司,并最终离开了我所在的公司,成为了一家为医院提供翻译服务,并有一个西班牙语的在线饮食计划的小公司的IT总监。这再一次提高了我讲西班牙语的能力,因为翻译是从英语翻译成西班牙语,反之亦然。我学到了不少关于各种行业用语之间的差异,以及有针对性翻译的重要性。我还重写了一个完整的应用程序,此应用程序使用ASP和嵌入的SQL调用,并且被硬编码为西班牙语,成为一个完全数据库驱动的,白标的(对于品牌推广)本地化app(该公司一直想扩展其他语言,例如法语)。这是一个激动人心的时刻,当我在我的工作中使用Microsoft堆栈时,因为工具和服务器成本的关系,于是我为自己的公司开源社区。就是在那个时候我学会了所有这些关于LAMP堆栈……Linux操作系统,Apache HTTP服务器,MySQL数据库,以及用于开发的PHP。讽刺的是,这方面的经验之后反倒促成了我和Microsoft合作的第一次咨询活动之一,因为他们想要接触到开源社区以便于着手Silverlight……但这是另一个故事了。

  2002年 – PHP

PHP代码
  1. <?php $hello = 'Hello, World.';   
  2. echo "$hello";?>  

  当我有机会转移到另一个职位去为一家新公司构建软件开发时,时间又过去几年,这中间我一直工作于这些特定的平台上。我成为了一家提供无线热点的小型初创企业的第三个员工,在无线热点这个词盛行起来之前。当我加入的时候,我发现这家公司的初始平台是用Java写的。这门语言其实我已经用它做过相当多的“修修补补”工作,所以结合C ++和Microsoft堆栈技能迅速掌握它,并不是一个巨大的跨越。

  2004年 – Java

Java代码
  1. public class Hello {  
  2.     public static void main(String[] args) {  
  3.         System.out.println("Hello, World");  
  4.     }  
  5. }  

  作为一门语言,我毫无理由反对Java,但是我们在使用时特定地包括即将搁置不用的Microsoft JVM,以及一个不想扩展的自定义服务器。我将平台迁移到了.NET上,令人惊讶地是,单一的IIS服务器比若干专用Java服务器可以处理更多的请求。虽然这里我说的是“迁移”,但其实是打造一个新的平台。我们希望迁移J ++代码到C#,因为J ++真不实用。幸运的是,C#非常接近于Java,所以大多数时候团队都能够轻松过渡,我们使用现有系统作为新系统运行在Windows机器上的“spec”,并从MySQL移动到SQL Server 2005。注意C#的“Hello, World”和Java是何等的相似。

  2005年 – C#

C#代码
  1. public class Hello  
  2. {  
  3.    public static void Main()  
  4.    {  
  5.       System.Console.WriteLine("Hello, World!");  
  6.    }  
  7. }  

  使得我们公司在当时如此成功的部分原因是,有一个允许我们从中央位置管理所有热点和接入点的“控制面板”。我们可以远程重启它们,应用固件更新,监控它们以及存储历史以诊断问题。这个软件迅速发展成为移动设备管理(MDM)平台,而这个平台就是公司现今的主打产品。他们重新命名软件的名称,并把产品投入市场,但我们面临的挑战是用HTML提供一种极致互动的体验,而且还要跨浏览器兼容(使用Microsoft定制的Java小程序事先解决)。我们使用AJAX和HTML成功构建了一个令人印象深刻的系统,但我们的团队苦苦挣扎于复杂,丰富的用户界面,当他们不得不测试通过这么多浏览器和平台的时候。虽然我们需要因为热点登录体验做到这一点,但是管理方面可以更加灵活,因此我研究了一些替代方案。

  当我发现Silverlight的时候,我被迷住了,于是决定先驾驭它。由于我成功地在几个星期内搞定了监测仪表板的POC,并且每个人都喜欢它,所以我们决定孤注一掷。在我最乐观的猜测下,我们的团队使用Silverlight能从概念到发布代码比JavaScript和HTML堆栈快4倍。那时HTML5还仍然是个空谈。我们建立了相当多的Silverlight功能,在我离职之前。直到我们在和Apple一起工作在MDM方面时,他们不希望Silverlight出现在他们软件的任何地方,并且HTML5减缓了发展势头,因此公司只能改弦易辙,但是我还是享受了好几年用这一种语言来构建丰富的业务应用程序,并且这种语言通过XAML将声明式UI的力量带到允许插件的浏览器和平台中(我听说那些已经不流行了)。

  2008年 – Silverlight(C#和XAML)

XML/HTML代码
  1. <UserControl x:Class="SilverlightApplication1.MainPage">      
  2.   <Grid x:Name="LayoutRoot" Background="White">          
  3.     <TextBlock x:Name="Greeting"></TextBlock>      
  4.   </Grid>  
  5. </UserControl>  
C#代码
  1. public partial class MainPage : UserControl  
  2. {           
  3.   public MainPage()           
  4.   {                   
  5.     InitializeComponent();                   
  6.     Loaded += MainPage_Loaded;           
  7.   }  
  8.   void MainPage_Loaded(object sender, RoutedEventArgs e)  
  9.   {                   
  10.     Greeting.Text = "Hello, World.";           
  11.   }  
  12. }  

  当然,Silverlight就像一只坏股票一样一路绿了下去。但它仍然是一种非常有用和可行的技术,但一旦人们意识到Microsoft并没有放太多筹码在这只股票上,那时它就只能死掉——和它在当时是否是正确的工具无关,一切根源在于一种它已经过时的感觉。HTML5用“write once, run everywhere”的口号很好地营销了自己,并且数以百计的企业在他们意识到自己的错误之前,就贸贸然地一头扎了进来(它其实应该是“一次编写,到处被困,然后为每个目标设备再写一次”)。

  不过,Silverlight还是有让我们喜欢的部分的,就在Windows 8.1中的XAML和C#堆栈。下面是“Hello, World”的一个版本,使用模型 – 视图 – 视图模型(MVVM)模式。

  2011年 – WinRT / C#

C#代码
  1. public class ViewModel  
  2. {  
  3.   public string Greeting      
  4.   {          
  5.     get  
  6.     {  
  7.       return "Hello, World";          
  8.     }      
  9.   }  
  10. }  
XML/HTML代码
  1. <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">      
  2.   <Grid.DataContext>          
  3.   <local:ViewModel/>      
  4.   </Grid.DataContext>      
  5.   <TextBlock Text="{Binding Greeting}"/>  
  6. </Grid>  

  虽然Windows 8.1让我有空闲投入到我的写作和业余项目,但对于大多数公司而言,仍然有一些新的东西在里面,因此他们希望一个基于web的解决方案。那意味着HTML和JavaScript,所以那是我花了我大部分时间携手工作的语言。是的,一旦我以为我可以抽身离去,它们又将我拉了回来。在我认真思考了我为什么讨厌使用HTML和JavaScript来web开发的原因之后,我决定去找一个更好的办法。我们的团队聚在一起,寻找潜在的方法,终于发现一个很酷的解决方案。最近,一种新的语言被发布了,它就是TypeScript,这是JavaScript的一个超集。它没有试图改变语法,任何有效的JavaScript也是有效的TypeScript。更进一步的,这语言还提供了一些开发时功能,例如可帮助塑造API调用和提供丰富内容的接口(而没有出现在生成的代码中),同时还有很多构造例如有继承性的类,强类型变量以及静态修饰符所有这些编译成完全有效的,跨浏览器的JavaScript。

  使用TypeScript是一个非常容易下的决定。即使是处于测试阶段,100%它的产品都适用于JavaScript,所以如果我们发现它不能很好地工作,那么我们只要放到JavaScript开发即可。事实证明,这令人难以置信地有用——即使是团队中的JavaScript纯粹主义者和那些憎恨任何试图“修改语言”的人,也赞同TypeScript给了我们额外的控制力和重构能力,并且TypeScript支持并行开发,能够提升我们发布基于web的高质量代码的能力。

  2012年 - TypeScript

  class Greeter {

  public static greeting: string = "Hello, World";

  public setGreeting(element: HTMLElement): void {

  element.innerText = Greeter.greeting;

  }

  }

  var greeter: Greeter = new Greeter();

  var div: HTMLElement = document.createElement("div");

  greeter.setGreeting(div);

  document.body.appendChild(div);

  TypeScript并不是我们所做的唯一变化。我们也想要去掉一些围绕建立对象用于数据绑定时的惯例和繁文缛节。我们使用了Knockout,Knockout是一个伟大的框架,但它需要我们做比预想更多的事情。我们团队中的某个人在调查了几个备选方案之后,选择了AngularJS。起初我持怀疑态度,但很快意识到这真的很像用于web的XAML。它给了我们一个在保持UI声明式的同时隔离命令式逻辑和解决另一个问题的办法。我们的团队愉快地使用TypeScript和AngularJS堆栈已经好几个月了,并且毋庸置疑地爱上了它。我现在正工作于用于WintellectNOW的模块,因为我相信这是一件大事。如果说30年的编程时间教会了我什么的话,那就是:今天是今天,明天会改变。我不是一个C#开发人员,也不是一个JavaScript开发人员或AngularJS专家。我都不是。我是一个码农。是一个程序员。一个纯粹,朴素和简单的程序员。语言只是一种工具,而我恰巧会讲很多种而已。所以,“Hello, World”,我希望你能享受我30年的旅程……下面是最新的。

  2013年 – AngularJS

  <div ng-app>

  <div ng-init="greeting = 'Hello, World'">

  </div>

  </div>

 

翻译作者:码农网-小峰

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.jizhuomi.com/software/627.html
2016年9月8日
作者:鸡啄米 分类:软件开发 浏览: 评论:0