我对“Hello World”30年的爱恨情仇

摘要

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

1460361126-4535-20160411093342707-474332206

英文原文:30 Years of “Hello, World”

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

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

1460361127-2024-20160411093342645-1849293362

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 去绘制图形,去绘制那些原本应该是不可能的或滚动内容的或甚至是移动数据到屏幕“超出范围”边界部分的图形。实现这些特技需要精确的定时,而定时只能通过直接的机器语言代码才能实现。所以,我启动了机器监视器(允许你直接输入机器代码到内存的软件名称),并写了这个小程序:

1460361127-6719-20160411093342645-1911881492

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 有它自己特殊字符页)。

下面是结果:

1460361127-8075-20160411093342660-970094995

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

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

#include <stdio.h>
main (){  
  printf ("Hello World");
}

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

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

1992 年 – C ++

#include <iostream>using namespace std;
int main (){
  cout << "Hello World";  
  return 0;
}

我上了大学,但令我失望的是,大学竟然不教我感兴趣的“现代”语言课程,例如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 "$welcomen";

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

1993 年 – HTML

<html>
  <head>
    <title>Hello, World</title>
  </head>
  <body>
    <h1>Hello, World</h1>
  </body>
</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 ++(示例为近期的)

1460361129-4244-20160411093342645-785023869

用命令行执行的结果:

1460361129-6381-20160411093342645-472471605

然而,粒子流和 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

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 Worldn");

直到这时候我才意识到互联网是真的蓬勃发展了。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

alert ('Hello, World.');

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

1998 年 – XML / XSLT to HTML

<?xml version="1.0"?>
<hello>Hello, World!</hello>

-

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">    
  <xsl:template match="hello">        
    <html>            
      <head>
        <title><xsl:value-of select="."/></title>
      </head>
      <body>
        <h1><xsl:value-of select="."/></h1>
      </body>

-

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

2002 年 – PHP

<?php $hello = 'Hello, World.'; 
echo "$hello";?>

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

2004 年 – Java

public class Hello {
    public static void main (String[] args) {
        System.out.println ("Hello, World");
    }
}

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

2005 年 – C#

public class Hello
{
   public static void Main ()
   {
      System.Console.WriteLine ("Hello, World!");
   }
}

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

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

2008 年 – Silverlight(C#和 XAML)

<UserControl x:Class="SilverlightApplication1.MainPage">    
  <Grid x:Name="LayoutRoot" Background="White">        
    <TextBlock x:Name="Greeting"></TextBlock>    
  </Grid>
</UserControl>

-

public partial class MainPage : UserControl
{         
  public MainPage ()         
  {                 
    InitializeComponent ();                 
    Loaded += MainPage_Loaded;         
  }
  void MainPage_Loaded (object sender, RoutedEventArgs e)
  {                 
    Greeting.Text = "Hello, World.";         
  }
}

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

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

2011 年 – WinRT / C#

public class ViewModel
{
  public string Greeting    
  {        
    get
    {
      return "Hello, World";        
    }    
  }
}
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">    
  <Grid.DataContext>        
  <local:ViewModel/>    
  </Grid.DataContext>    
  <TextBlock Text="{Binding Greeting}"/>
</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

“Goodbye,各位读者。”

<div ng-app>    
  <div ng-init="greeting = 'Hello, World'">        
    {{greeting}}    
  </div>
</div>

-

译文链接:http://www.codeceo.com/article/hello-world-30-years.html

翻译作者:码农网 – 小峰

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: