30年的Hello world

30 年的 Hello world

轉載自:http://www.admin10000.com/document/2398.htmlphp

 

最近我在7月4日這一天所在的那週休假了。休假期間,我利用大把的時間對我時至今日的職業生涯進行了反思。 意識到我如今寫代碼都寫了快30年了,難免讓我有些許震驚。所以我決定,要利用這段美好的休閒時光,寫篇博文來懷懷舊,探究一下我在過去30年的工做中所用到的全部編程語言。且謹以此篇文章獻給我以編寫「Hello, World.」開始而學習各類新語言的30年美好時光。html

 

  TI BASIC是我所學習的第一門編程語言。它是由微軟專爲TI 99/4A微型計算機編寫的一種特殊類型的BASIC方言。BASIC是Beginner’s All-purpose Symbolic Instruction Code的縮寫,意思是初學者的通用符號指令代碼。對於困在家中又無遊戲可玩的7歲孩子來講,BASIC是再好不過的一門編程語言了。該語言採用行號來組織多行代碼,要想在屏幕上顯示點什麼就能夠象下面這樣把要顯示的內容「print出來」:ios

  1981 – TI BASIC程序員

  我花了幾個月的時間用這種BASIC編寫了一些「choose your own adventure(請你來選擇你要扮演的角色來進行遊戲)」類型的遊戲,甚至花了更多的時間聽着用來保存和恢復數據的黑色盒式磁帶錄音機發出的滋滋、啪啪和嘶嘶聲。 我人生中最令我激動和最關鍵的時刻恐怕是多年後我父母把一臺Commodore 64帶回家的那個時刻。這個機器隨機帶有Commodore BASIC,或者叫作PET BASIC,並且可開箱即用。這種BASIC也是由微軟編寫的,它基於6502 Microsoft BASIC,也就是微軟專爲6520系列芯片而編寫的BASIC,而蘋果的機器那時所採用的也正好是這個系列的芯片。web

  1984 – Commodore BASIC面試

  其中的問號是PRINT命令的簡寫形式,下面那行中的奇怪字符是RUN命令的一種縮寫形式(R SHIFT+U -在Commodore 64的鍵盤上,SHIFT加字符能夠用來輸入一些很酷的圖形小片斷,你能夠拿這些圖形小片斷拼出一些基本看得過去的圖片)。sql

  很快我就發現,BASIC語言作不到我想作的全部事情。此時「演示場景(demo scene)」正在興起,不少人都在編寫使人叫絕的程序來挑戰機器的能力極限。 他們會作一些相似讓視頻芯片畫一些根本不可能畫出來的圖形或者把內容或更多數據滾動到屏幕邊上「超界」的部分。完成這類壯舉須要嚴格的時間順序控制,而這種控制除了直接使用機器語言的代碼別無它法。所以,我裝上了機器監視器器(機器監視器是可以讓人將機器代碼直接輸入到內存中的軟件的名字),寫出了下面這段小程序:數據庫

  1985 – 6502 機器碼編程

c64machine

  這段小程序會將一個索引裝載到「Y-加法器」中,而後將始於$C100的內存中的字符一個一個的發送給ROM中的一個子程序,從而將這些字符顯示出來。這就是for循環(for y = 0; y <= 0x0d, y++)所對應的機器碼。RTS命令會從子程序中返回。爲了執行這個程序,你還得使用內建的SYS命令呼叫出內存地址(很不幸,爲此你不得不將16進制的$C000轉換成10進制的49152,但除此以外其它的運行起來那叫一個順暢)。我將表示「HELLO, WORLD」的PETSCII字符存儲在了內存地址$C100處(是的,Commodore 64有它本身特殊的字符頁(character page))。程序運行結果以下:小程序

  固然,當我從原始的機器碼轉戰到彙編語言時,日子就稍微好過了點。使用匯編語言,我就能夠預先規劃個人軟件,並且還不用死記內存地址了,只需用標籤來標記內存地址便可。上面那段機器碼對應的徹底相同的彙編程序能夠以下來編寫:

  1986 – 6502 彙編語言

* = $C000       ;set the initial memory address
CHROUT = $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      RTS
HELLO    ASC 'HELLO, WORLD.' ; PETSCII
HELLOEND DFB 0 ; zero byte to mark the end of the string 

  大約也就是這個時候,我意識到我是真的喜歡編寫軟件了。高中時我參加了一些課程,但他們教的不過是一些很愚蠢的小型Pascal語言,設計這種語言就是爲了使學習如何編程變得「輕鬆一些」。真是輕鬆了嗎?通過使用「機器監視器」徒手編寫複雜的程序以後,我感受Pascal實在是太過於輕鬆了。我還真是不得不認可,用Pascal編寫「Hello, World」的語法實在是太簡單了。

  1989 – Pascal

program HelloWorld;
begin
  writeln('Hello, World.');
end

  我想,在這時候,很時尚的小子們都在用C編程序呢。C是一種很是靈活的語言,它感受就象是彙編語言之上的一些功能性的宏,而不像是一門新語言。所以我額外自學了C,但C我卻只用了不長的一段時間。

  1990 – C

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

  這段小程序包含了一個處理標準輸入/輸出的庫,而後就在屏幕上輸出了一段文字。C中的庫使得C能夠開發跨平臺的應用 —— 無論是在Windows仍是在Linux中調用的都是同一個函數,但庫自己實現了可以運行於目標機的全部底層子程序。上面這段代碼也是我多年後在Linux機器上首選擺弄的代碼。若是那時你尚未入計算機這個行當,有些狀況是我光用語言很難說明白的,那時要是你不弄個Linux自定義安裝版,你們就以爲你不是個真正的程序員。我所說的「弄個自定義安裝版」,意思是梳理Linux的源代碼,將其按照你本身獨特的硬件對Linux進行定製。其中最有意思的要數對顯卡的處理了,要掌握監視器的「點時鐘」狀況,其中還須要施展各類奇巧淫技才能讓主板很好的配合圖形芯片一塊兒工做。好吧,我跑題了。

  C對我來講學起來真的不算是個挑戰,但我很快就搞明白了,耍酷的小子們在作着不一樣的事情,正在學習一種稱爲「面向對象編程」的編程範型。機器碼和彙編語言多是和OO距離最遠的東西了,從面向過程的編程轉向面向對象的編程對我來講是個我樂於接受的挑戰。在那時你還沒法僅僅經過在線搜索來尋找學習資料(搜是能夠搜的,但搜索機制和如今不一樣並且搜索結果也少之又少),所以我就出去買了一摞C++的書。 C++的確支持「對象」這個概念。它甚至還使用對象來表示流和管道,可以以對象的方式來對它們進行操做。面向對象還引入了命名空間的概念,以此來更好的管理代碼的劃分。說了這麼多,此次「Hello, World」變成這樣了:

  1992 – C++

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

  我一猛子扎進了大學,但令我失望的是,個人大學裏並無開設教授我所感興趣的象C和C++這樣的現代語言的課程。相反,我不得不該付差事的課程倒是讓我在一個叫作「Cypher」的大型機上用一種叫作Fortran的頗有趣的語言來寫做業。Fortran這種語言居然很在乎你把代碼放到哪一欄中!沒錯,那時這種語言規定第1欄用來寫註釋,第1到5欄寫語句的標籤,第6欄用於續行字符,只有從第7欄你才能開始寫真正的代碼,我學到了足夠多的Fortran,使我認識到我之後不再想用這種語言編程了。

  1993 – Fortran

       PROGRAM HELLOWORLD
       PRINT *, 'Hello, World!'
       END

  那時我翹了大部分課程,把晚上的大部分時光花在了計算機房。在那裏我使用的是咱們大學的大型Unix機。在機房裏我發現了Internet,學到了安裝軟件的「老式」的方法:下載軟件源代碼,build出可執行程序,查看錯誤,而後進行相應的調整和修復才能獲得一個好用的軟件。實話說,我還真不知道不學會那時的編程技術,你怎麼才能學會使用Unix。那時我不斷地探索和學習使用計算機系統的方式。當時我所作的最多見的一件事就是執行一個可以倒出大量信息的命令以後,再使用一些很是「順手」的命令行工具對這些信息進行解析。那年我學到的最酷的語言之一就是PERL。雖然用「Hello, World.」這樣簡陋的例子作演示對PERL來講很不公平,但就先將就一下吧:

  1993 – PERL

$welcome = "Hello World";
print "$welcome\n";

  與此同時我很快發現了大量的World Wide Web(是的,那時咱們就是這麼稱呼Internet的。Internet中運行的就是GopherArchie這類好玩的程序,World Wide Web只是Internet之上的一寫文檔而已)。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大型機的終端而已。我還在PC上運行了一個Linux操做系統,這是由於Linux是鏈接到Internet和網絡的最快最方便的方式 —— Linux內置了TCP/IP協議棧,無需想老版本的Windows那樣在操做系統之上再安裝這個協議棧了(還有人記得NETCOM嗎?)個人大部分工做是在大型機上完成的。

  我真地意識到了,我在間接失去同PC世界的聯繫。顯然那時瘋狂的我的計算時代已經結束了,有兩種機器漸漸成了接灰的擺設了:一種是對於咱們中的大部分人來講的運行Windows的PC,另一種就是對於設計者而言的Mac機器。PC已通過時了就是我當時的信念。那時我有個室友整天圍着Mac轉,用Mac來設計各類優惠卷。他有一大堆漂亮的圖形設計程序,常常會把一個叫作Quark的軟件調出來,而後問我:「你的PC裏有這樣的軟件嗎?」我會聳聳肩而後提醒他,我連一個圓或者正方形都不畫,我要這樣的圖形軟件有什麼用?我喜歡個人PC,由於我懂軟件,並且我也會數學,即便我沒有畫什麼圖,我確定可以利用數學在計算機上畫出分形圖形或者粒子風暴圖。固然要作到這些就須要有圖形卡,經過TELNET鏈接到Unix機可幹不了這些事,因此我開始學習PC編程了。那時在PC上用來編程的就是Win32和C++了。即便在今天的Visual Studio 2012中,你依然可以運行下面我說的這個例子。我不會用我原先在Win32下編寫的有150多行代碼的「HELLO.C」程序來煩你的。

  1994 – Win32 / C++ (這個例子要稍稍新一些)

  打開一個命令行窗口而後運行這個程序後會獲得這樣的結果:

  個人粒子流程序和曼德布洛特集合程序確定在找工做方面幫不上什麼忙,因此我必須再找另外的辦法。使人哭笑不得的是,個人職業在開始時同計算機居然沒有絲毫的關係。剛開始我爲一家保險公司工做,工做內容是處理來自西班牙的電話索賠事務。狀況就是這麼個狀況。在爲一個薪水較低的工做接受面試時,我準備安心用這份微薄的薪水來戶口,晚上再熬夜搞PC編程,我偶然提到我會說西班牙語。他們叫來他們的雙語業務表明來面試我,我經過了測試。就在一週以內我獲得了一個薪水更高的職位,由於我在短短的幾個電話中學到了比我在整個高中幾年裏學到的還有多的西班牙語。

  那時我還年輕,求勝心切。咱們的級別是基於天天咱們成功完成的索賠總數來計算的。我不想就由於我所使用的軟件每隔一段時間就要崩潰而被甩在後面。咱們使用的對我來講是一套全新的系統 —— AS/400 (如今叫作iSeries) —— 可是我仍是想出了辦法,學會了在索賠軟件每次崩潰以後如何重啓它。公司的IT部門很快明白了是怎麼回事了,並把我叫到了一邊。起初我擔憂我惹上麻煩了,可是實際上他們向我提供了一個轉入IT部門的機會。我又開始了個人第三次轉折,工做內容基本上就是維護AS/400系統,爲打印保險單和理賠表的大型打印機換打印盒。

  在這個工做中,換打印盒的過程佔據了整個工做中的大部分時間。這是由於有些表格只用黑墨,而有些別的表格卻還須要綠色或紅色的墨。那些打印機裏只能裝一種墨,因此在碰到不一樣類型的表格時,打印機就會提示咱們去換上所需的墨。我認爲這種作法太荒謬了,因此我花時間自學了RPG。我編寫了一個程序,可以將打印做業同墨的顏色匹配起來,而後對打印做業隊列進行排序,把全部的黑色打印做業排到一塊兒,而後是全部的綠色打印做業,等等。這樣一來,原先8小時的工做就變成只需2個小時就能完成,我就有更多的時間來學習RPG了。RPG最初的版本 —— RPG II和RPG III ——  還都很是原始,其最初的設計只是用來簡單地模擬卡片打孔系統的方式來產生報表(其名字就是Report Generator的縮寫,意思是報表產生器)。RPG和Fortran同樣,都是位置性的語言。

  1995 – RPG

I              'HELLO, WORLD'        C         HELO
C           HELO      DSPLY
C                     SETON                     LR

  請注意每行的第一個字符代表的是各行的代碼類型(實際上它還應該多佔幾列,但我故意省略了其中的一些空白處)。第一行定義了一個常量,而後第二號將該常量顯示到屏幕上,最後第三行是一個讓程序結束執行的指示符。

  在開始運維工做後我又幹了個人第二件大事。每次月底結算都須要花費大量的時間和精力。原先的系統是在一臺Honeywell大型機上讀取穿孔卡片。其中有個COBOL程序從一個模擬穿孔卡片的文件中讀取數據,而後輸出到另一個文件中,最後再把這個輸出文件送入AS/400中進行處理。處理完成後,還須要將各類結算數據對一下。因爲舍入錯誤、不支持事務以及另外的一些問題,數據幾乎每次都對不上,因此就須要對整個計算過程進行調查,找出是哪裏處理差子,而後再經過更新代碼來修復錯誤。若是咱們未能找出問題所在,咱們還弄了一個「緊急開關」,在11點按下這個開關,就會讀取輸出數據而後調整結算數據來讓帳簿平衡。雖然我並無大量的COBOL編碼經驗,但我須要經過閱讀Honeywell的COBOL代碼來理解透徹它的工做過程,而後我纔可以很好的處理掉髮生在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專家就來到咱們公司,給咱們上了3天的課程,這是由於最酷的事情發生在AS/400的世界中。不只僅是AS/400正在轉向64位(你們都知道位數加倍後就會比原先好上一倍,對吧?) ,並且RPG語言也正在獲得巨大的改進,版本IV比覺得更多了融合了面向過程的特性以及一些面向對象的原則。這得多酷啊?咱們扎入培訓中後內心樂開了花,由於睜大全部的老式RPG開發者都在爲努力學習這種「新的編程風格」而撓頭時,我內心的石頭終於落地了,終於可以回到我用C和C++時更爲熟悉的面向過程的編程風格了,再也無需使用過去的那種刻板而受侷限的基於指示符和列的RPG語言了。

  不少開發者可能會由於某個特性而感到高興,這些特性也的確讓人另眼相看。語言要求指令開始於一個肯定的列,輸入在指令以前。這裏侷限性很大,你只有加載少許的常量字符,或者你不得不把它指明爲常量或者數據結構,並把它們讀入。新語言則把關鍵字列移動到右邊,就有更大的空間給」factor one「。這意味着咱們如今能夠用幾行代碼來寫「Hello,World」 了。這種語言也是程序化的,因此你能夠經過返回而不是在指示器中設置來停止一個程序。(儘管我記得正確的話,在主程序中返回就是設置封裝的指示器)

  1996 – RPG/ILE

C     'HELLO, WORLD' DSPLY 
C                    RETURN

  AS/400在操做系統中內置了一個叫作DB2數據庫。在很長一段時間內,該數據庫只支持經過RPG或其它的軟件同其直接交互,並不支持SQL語法。後來出了個專門的叫作SQL/400的軟件包,但DB2在底層就對SQL提供了支持。爲此我還在1998年是發表了個人第一篇文章,寫的就是關於如何在AS/400中如何本身接入對SQL的支持(Create an Interactive SQL Utility)。在SQL中實現「Hello, World」的方法可能會數不勝數,但最簡單地要數這個了:

  1998 – SQL

SELECT 'HELLO, WORLD' AS HELLO

  我要爲打亂時間順序道歉,但SQL彷佛徹底能夠看做是我「主要的」或者「得到報酬的」工做的一部分。同時我一直都在瘋狂玩着遊戲,剛開始玩的是DOOM(這是第一個給我留下深入印象的遊戲,我居然還花錢買了這個遊戲的完整版),後來藉着玩了DOOM II和HEXEN,最後玩得最High的要數Quake了。若是你不熟悉第一人稱射擊遊戲(FPS)的發展史,我還得告訴你,Quake仍是一個改變了遊戲歷史的遊戲。這個遊戲爲玩家提供了史上第一個「真正的」3D遊戲環境(以前的那些遊戲都是用2D映射表來模擬出3D的地板和具備必定高度的天花板),經過對TCP/IP的支持完全改變了死亡比賽的模式, 它採用了很是高級的編程技術,從而容許比以往任什麼時候候都多的玩家在同一個地圖中同時玩遊戲。

  Quake的可定製化程度也極高。雖然我在美工方面不怎麼地,歷來沒弄明白怎麼建立本身的模型或地圖,但我直接扎近了編程來對它進行定製。Quake提供了一種基於C的編程語言,名爲QuakeC。這種語言可以編譯爲跨平臺的字節碼,而這種字節碼能夠在可以運行Quake的全部目標平臺之上。很快我就編寫了一些改造性的程序,可以作到讓玩家着火、讓鐵釘從牆上逼真地反彈回來等等相似的事情。在一個聊天室裏,有我的說了一個點子讓我編程實現一下,後來就由於我編寫的這個叫作「MidnightCTF」的功能而爲你們所知。其實就是直接在現有的任何地圖上將全部的等都關閉,但爲每一個玩家配備一個手電。Quake是第一個支持真正的3D音效的遊戲,這爲遊戲增添了一種有趣的可玩性。

  甚至還有人從個人那些改造性的程序中拿出了一段代碼,放到了「編程語言字典」中的QuakeC詞條之下。下面這段用QuakeC編寫的「Hello, World」代碼實際上就是將一條廣播消息發送給了當前遊戲中的全部玩家。

  1996 – QuakeC

bprint("Hello World\n");

  此時我意識到了Internet真地要發展起來了。1993年我還在上大學時發現了這一點,但我很是沮喪,由於根本沒有人真正明白我在說什麼,但僅僅在幾年以後,每一個人都在爲了搶着進入Internet領域而亂做一團(有些公司,好比AOL和微軟的MSN,都想打造屬於每一個公司本身的互聯網。。。但最終都無功而返,接入了咱們如今所說的這個大的Internet)。我發現我在大型機上的工做立刻就會過期,或者最好的狀況下我只能成爲一個藏在後面的某個角落中,鼓搗「那些個老系統」的開發人員。我想接觸這些新東西。

  後來我轉到了一個在工做中使用這些新東西的部門 —— 用VB6(COM+)和ASP編寫一個應用,把幾個不一樣的系統鏈接起來,從而可讓全部供應商都能看到其中的數據。

  1998 – VB6 (COM)和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 service」,我在真正的理解這個詞是什麼意思以前就幹了這有的事。客戶端的表單由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很快就成了個人朋友,下面是一個將XML經過XSLT轉換爲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>
        </html>
    </xsl:template>
</xsl:stylesheet>
<%
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.Clear
Response.Charset = "utf-8"
Response.Write XDoc.transformNode(XSLT)
%>

  那個模式上我花了幾年時間。那段時間中我我的經歷了一些轉變,體重減輕了70磅,腰圍從44英尺減小到32英尺,因爲健康我充滿了激情。我兼職開了一家本身的公司,甚至從當時的公司辭職,我在這家專爲醫院提供翻譯服務和擁有一個在線的西班牙語節食程序小公司擔任IT理事。我能再次夠提升個人西班牙語能力,由於翻譯是從英語到西班牙語,反之亦然。我甚至將整個用ASP和內嵌了西班牙語硬編碼的SQL語句的程序重寫。使其成爲了徹底數據驅動的、標白的(爲了品牌)和本地化的(公司想把他弄成其餘像法語之類的分支)。在微軟公司的技術棧的那段時間,我仍是至關使人興奮的。但因爲工具和服務器的花費,讓我在開本身公司的時候接觸了開源社區。那時,爲了開發我學了全部像LAMP棧..Linux系統,Apache的Http服務器,MySQL數據庫和PHP之類的技術。諷刺的是,因爲這些經歷,當微軟試圖爲了讓開源社區擁抱Sliverlight的時候,我成爲了其短時間質詢...但那又是另一個故事了。

  2002 – PHP

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

  在特定的平臺工做了許多年後,我終於有機會進入到新公司的另外一個軟件開發崗位。我是一個當時還不出名的創業公司的第三個職員。若是你曾在Panera或Chick-fil-A吃飯或在Caribou喝過咖啡,那你可能就使用過我參與過編寫的,或爲了無線熱點體驗而最近升級過的軟件。當我加入這家公司的時候,初始平臺是用Java編寫的。我在這個語言上,我曾用其作過不少「修補」工做,所以加上C++和微軟棧上的技能我很快的就將其從新撿了起來。

  2004 – Java

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

  在語言當中我對Java並不感冒,可是咱們要用到的特殊東西涉及到微軟將要放棄的JVM,並且一個定製的服務器並不須要擴展。當把平臺遷移到了.Net平臺,我很驚訝的發現IIS服務器比其餘幾個專用的Java服務器能處理更多的請求。我說的「遷移」,實際上是從新構建了一個新平臺。咱們尋求一種把J++代碼轉換爲c#代碼,但發現那確實不實用。幸運的是C#與Java很是是接近,大多數團隊都能經過現存系統的「規則」輕鬆的將其翻譯成能在Windows運行的系統,且把MySQL遷移到SQL Server 2005。注意Java的"Hello,World"和C#是多麼的接近。

  2005 – C#

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

  咱們的公司那時之因此很是成功,部分緣由在於咱們的「控制面板」可以讓咱們集中在一個地方就能夠管理全部的熱點和訪問點。咱們能夠在遠程對這些熱點和訪問點進行重啓、固件更新並用一心跳信號來對他們進行監控,同時還爲診斷問題保存了歷史信息。這個軟件很快就發展成了一個移動設備管理(MDM,也即Mobile Device Management的縮寫)平臺,併成爲公司如今的旗艦產品。他們在發佈產品時從新起了一個新的品牌名,可是因爲咱們的挑戰而獲得了一個可以跨平臺的HTML的交互性很是強的用戶體驗(先前的解決方案採用的是微軟定製的Java Applet)。咱們用AJAX以及HTML成功的構建了一個可以打動人的系統,但咱們的團隊不得不在如此多的瀏覽器和平臺上進行測試,而咱們的系統又是個負責富UI系統,這對咱們的是個很大的挑戰。雖然爲了提升熱點登陸用戶體驗咱們還須要維護這個系統,但它在管理方面更加靈活了,因此我又對一些其它的提到方案進行研究。

  當我發現Silverlight時,就對它着迷了,但我仍是以爲先讓我本身對它進行探索爲好。我能夠在咱們監控面板的概念性產品前面站幾個禮拜,發現每一個人都很喜歡它,因此決定你們全力投入對它進行開發。我最樂觀的估計是,採用Silverlight以後,從產品的概念到發佈咱們團隊所須要花的時間要比採用JavaScript和HTML相關技術少4倍。那時,HTML5仍是個空中樓閣。在我離開以前,咱們的團隊已經用Silverlight實現了不少的功能。直到離開時咱們一直都在同Apple在MDM方面進行合做,Apple固然不想讓他們的軟件同Silverlight有任何瓜葛,可是我仍是享受了多年用一種能夠經過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後來就象一隻垃圾股同樣日薄西山了。那時Silverlight仍然是一個很是有用也頗有競爭力的技術,I但一旦人們發現微軟再也不對這種技術進行投入了,Silverlight立刻就行將就木了 —— 雖然人們感受它過期了,但這和它在那時是否是一個正確的工具沒有絲毫的關係。HTML5在宣傳本身是「編寫一次,處處運行」方面也作得至關不錯, 成百上千的公司在可以意識到他們的錯誤(HTML5的口紅「編寫一次,處處運行」的實際意思是,「編寫一次,處處碰壁,而後爲每一個平臺還得再編寫一次」)以前,不顧一切、爭先恐後地加入了HTML5的陣營。

  然而,咱們所喜歡的Silverlight中的那部分特性在Windows 8.1下的XAML和C#中存活了下來。 爲了好玩,下面給出採用酷小子們慣常使用的模型-視圖-視圖模型(MVVM)模式編寫的「Hello, World」。

  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是個輕鬆的決定。儘管它還處於beta測試階段,但它產生的代碼100%能夠直接用在產品中,因此若是咱們發現它產生的代碼有什麼問題的話,咱們徹底能夠跳過TypeScript,直接在JavaScript中進行修補。最後證實,TypeScript可用性至關高 —— 咱們的團隊中有幾我的對JavaScript有純正癖,痛恨對「修改JavaScript這種語言」的全部企圖都恨之入骨,即便他們幾我的剛開始持有懷疑的態度,最後也一致認爲,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也是一個很是不錯的框架,但它所須要的工做仍是比咱們所想的要多。咱們團隊中誘人對一些替代方案進行了調查研究,最後選定了AngularJS。剛開始我對它仍是有所懷疑的,但很快發現,這個方案真的同用於Web的XAML方案很是相似。採用它咱們能夠在使用聲明式UI的狀況下,還能解決另一個問題,就是咱們還能夠將命令邏輯從中隔離出來。到如今爲止已經有幾個月了,咱們的團隊在使用TypeScript和AngularJS這些相關技術時一直都很愉快,而且至關的愛用這套技術。 我如今正在參加WintellectNOW的一個課程,由於我決定這事關重大。然而,要說30年的經驗教會了我什麼的話,那就是:今天還存在,明天就消失。我不是一個C#開發人員,也不是一個JavaScript開發者,更不是一個AngularJS奇才。毫不是!我只是一個編程人員,一個程序員,純正的、樸素的、簡單的程序員。各類編程語言只不過是個工具,我只是碰巧學會了不少編程語言而已。好吧,再來一次 「Hello, World」。我但願你能喜歡這段旅程。。。一段直到如今的旅程。

  2013 – AngularJS

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

  「再見了,讀者朋友。」

  英文原文:30 Years of Hello, World

相關文章
相關標籤/搜索