微軟剛剛將其 Windows 系統(tǒng)對(duì) Visual Basic 6 程序的完全兼容支持延長(zhǎng)到了 Windows 8 的整個(gè)產(chǎn)品周期. Visual Basic 6 最早發(fā)售于 1998 年, 所以現(xiàn)在來(lái)看 VB6 程序?qū)⒅辽俦恢С?24 年. 相比之下 .NET Framework 1.1 (2002 年發(fā)行) 則僅僅被支持了 7 年, 到了 Windows 7 (2009) 便被微軟拋棄了. 我的一個(gè)學(xué)生曾經(jīng)開(kāi)玩笑說(shuō)過(guò) Visual Basic 6 就像 Windows 環(huán)境中“殺不死的小強(qiáng)”. 實(shí)際上這個(gè)比喻不無(wú)道理 - 蟑螂生存的秘訣在于它的簡(jiǎn)單, 它們所做的所有事情就是在自己占據(jù)的角落里堅(jiān)持活下去, 除此之外什么都沒(méi)有. 同樣, Visual Basic 6 也滿(mǎn)足了開(kāi)發(fā)者為它預(yù)設(shè)的市場(chǎng)的所有需求——允許經(jīng)驗(yàn)不多的程序員快速開(kāi)發(fā)簡(jiǎn)單的程序. Visual Basic 從未被當(dāng)作一種提供給專(zhuān)業(yè)程序員開(kāi)發(fā)復(fù)雜程序的語(yǔ)言.
Visual Basic 6 實(shí)現(xiàn)其價(jià)值的方式是將 Windows 的各種復(fù)雜之處簡(jiǎn)化, 因此簡(jiǎn)單的工作對(duì)于 VB 來(lái)說(shuō)非常容易完成. 不過(guò)另一方面, 相對(duì)復(fù)雜的工作比如使用線(xiàn)程則基本是不可能的. 對(duì)我來(lái)說(shuō)有一個(gè)經(jīng)驗(yàn)規(guī)則很有用:VB 中, 用了十分鐘實(shí)現(xiàn)不了的功能對(duì)我來(lái)說(shuō)肯定是沒(méi)法實(shí)現(xiàn)的. 此外 VB 成功的另一個(gè)關(guān)鍵之處是由于其提供的功能較少, 所以所需的學(xué)習(xí)時(shí)間和學(xué)習(xí)難度也較低. 舉個(gè)例子說(shuō), 就是學(xué)習(xí)開(kāi)巴士需要的時(shí)間顯然比學(xué)習(xí)怎么開(kāi)戰(zhàn)斗機(jī)少, 而成為一個(gè)優(yōu)秀的 Visual Basic 程序員需要的時(shí)間也顯然比成為一個(gè)優(yōu)秀的 C++ 程序員少; 而當(dāng)時(shí) Visual Basic 6 面對(duì)的主要同類(lèi)對(duì)手就是 C++.
不過(guò)到了 Visual Basic .NET 時(shí)代微軟顯然沒(méi)有意識(shí)到這些. 當(dāng) VB .NET 成為一個(gè)所謂“全功能語(yǔ)言”的時(shí)候, 微軟的開(kāi)發(fā)者為它加上了 C# 所擁有的所有高級(jí)和復(fù)雜的功能 —— 線(xiàn)程, 多態(tài)繼承, 等等. 也因此 VB .NET 變成了一個(gè)和 C# 要求相同的技能, 相同的學(xué)習(xí)過(guò)程和給人完全相同體驗(yàn)的編程語(yǔ)言. 當(dāng)然這并不完全是微軟的判斷失誤: 微軟員工其實(shí)做了他們認(rèn)為 Visual Basic 開(kāi)發(fā)者們要求他們做的事情, 滿(mǎn)足了 VB6 用戶(hù)的要求.
但對(duì)于 Visual Basic 來(lái)說(shuō), 用“沉默的大多數(shù)”來(lái)描述大部分開(kāi)發(fā)者非常合適. 幾乎所有的 Visual Basic 6 用戶(hù)都對(duì)現(xiàn)在的產(chǎn)品非常滿(mǎn)意——沿用我們前面所使用的比喻, 他們很愿意只做公交司機(jī): 每天五點(diǎn)下班回家, 不用加班到半夜; 周末在家和家人在一起而不用回到辦公室; 晚上和配偶在一起, 而不是坐在辦公室里帶著充滿(mǎn)血絲的眼睛連夜編程, 早上吃著昨天剩下的冷飯. 他們并不在意 Visual Basic 6 既沒(méi)有提供運(yùn)算符重載也不提供完整的面向?qū)ο竽P? 所以他們沒(méi)有抱怨什么.
而微軟聽(tīng)到的聲音則來(lái)自 3% 愿意成為戰(zhàn)斗機(jī)駕駛員的 Visual Basic 6 公交司機(jī)——他們?cè)陂e暇時(shí)間參加業(yè)內(nèi)會(huì)議, 在網(wǎng)上論壇中提問(wèn), 給各種關(guān)于 VB 的文章寫(xiě)自己的回復(fù). 而也是這些人不能滿(mǎn)足只在幻想中發(fā)射導(dǎo)彈擊毀剛剛別了他們巴士的轎車(chē)——他們真的去向微軟要求新的巴士必須帶著和戰(zhàn)斗機(jī)一樣的加力燃燒室, 兩邊掛著格斗導(dǎo)彈, 車(chē)尾帶上干擾彈發(fā)射器, 駕駛座還要有平視顯示器. 因?yàn)樗麄兪?Visual Basic 開(kāi)發(fā)者中喊話(huà)聲音最大的一群, 所以微軟照做了.
于是到最后, 將 Visual Basic .NET 交給熟悉了 Visual Basic 6 的大部分程序員就如同人施放魔法將一只寵物狗僅僅在生理上變成了叢林狼, 然后便對(duì)著它大喊“去林子里抓只羊回來(lái)!”適應(yīng)了寵物狗生活的狼顯然會(huì)這么想“哈? 您沒(méi)事兒吧? 我哪兒也不去就在這兒帶著等你給我開(kāi)罐頭.”于是 Visual Basic 6 程序員依然如故.
當(dāng)然 Visual Basic 6 也并非完美無(wú)缺. 最好的例子可能就是 On Error Resume Next 了——在工作的時(shí)候某一步執(zhí)行出問(wèn)題了, 所以我們繼續(xù)按原計(jì)劃該干什么干什么然后看看結(jié)果什么樣? 想想都知道這明顯不合理. 然而我們?nèi)匀粦?yīng)該記住由技能較低 (所以便宜) 的開(kāi)發(fā)人員對(duì)功能有限 (便宜) 的程序進(jìn)行快速 (便宜) 開(kāi)發(fā)能解決很大一部分實(shí)際生產(chǎn)中遇到的問(wèn)題, 而 Visual Basic 6 是這種情景中一種優(yōu)秀的工具.
Visual Basic 6 解決的問(wèn)題并不會(huì)憑空消失, 所以到微軟提供一種可以替代 VB6 的工具前, Windows 系統(tǒng)中的小強(qiáng)還是會(huì)繼續(xù)頑強(qiáng)的生存下去. 我愿意賭五塊錢(qián), 就算到了 Windows 9 還是 Windows 10, 微軟也還是必須提供 Visual Basic 兼容.