Visual Studio 20th Anniversary

blog.kondoumh.com

Visual Studio 2017 のインストーラは Electron + Riot.js みたいです。Riot 流行るかもですね。

qiita.com

祝 2017 リリース記念ということで、僕と Visual Studio の関わりを 24年前ぐらいから振り返ってみました。

Visual Basic 1.0

93年ごろ、研究室の先輩に「Windows の画面がめちゃ簡単に作れる言語があるよ」と Visual Basic でフォームにボタンを貼り付けてイベントを作成するところを見せてもらいました。同じ Microsoft の QuickBasic*1 は触ったことがありましたが Windows 3.x アプリがポトペタで作れることに感心しました*2

Microsoft C/C++ 7.0

Visual でもないし、Windows がメインのターゲットでもありませんが、MS C/C++ 7.0 は C++ の GUI ライブラリ MFC*3 が同梱され Windows 開発がサポートされた最初のバージョンだったと思います。

1992 年前後、大学の研究室では Turbo C/C++*4 が使われていて MS-DOS のコードエディタ、デバッガが動いてました。そもそも C++ が登場して商用のコンパイラが出たのが90年頃なので、まだ若い言語だったのです。

MS C は高価だったため、最初に入った会社で使った時にやはり企業はお金持ってるなと妙に感心したりしました。

94年に入社した会社では MS C で PC98の MS-DOS アプリケーションを書いてました。Turbo C/C++ のような統合開発環境は付属していなかったか別売りだったのでしょうか。VZ Editor 使ってました。

当時は C/C++ コンパイラは個人的に買うには高価だったので、自宅 PC には DJGPP*5 や LSI C-86 試食版をインストールして CUI プログラムを書いていました。Linux で本物の GCC が使えるのはもう少し先。そんな Visual C++ 登場前夜でした。

Visual C++ 1.0

Windows 3.1 の SDK と MFC を正式サポートし C++ の統合開発環境 (IDE) を提供した最初のバージョン。

このころはまだ MFC ではなく C と Win32 API で開発。あまり GUI は作成せず、簡単なダイアログとか設定画面ぐらい。システム寄りのファンクションコールや高速なアルゴリズムを実装。DLL*6 や VBX*7 を作って VB の画面担当エンジニアに提供してました。

Visual C++ は 486SX 33MHz / RAM 6MB のラップトップでも軽々動いてました。DOS/V と PC98 では一応同じバイナリが動作しましたが低レイヤーのコードは分ける必要がありました。

Windows 3.x では、DDE*8 というプロトコルでプロセス間通信がサポートされていました。後発の OLE*9 が主流になりましたが、現在でも DDE は Windows のダイアログボックスで親画面とのデータ交換で使用されています。OLE によって Word ドキュメントに Excel のスプレッドシートを埋め込むということができました*10

Windows も 3.1 で成熟し 16bit アプリの爛熟期。この間に Windows NT が着々と開発され 32bit 時代を迎えることになります。

Visual C++ 2.0

Windows NT 3.1 向けの 32bit コードを生成する最初のバージョン。会社でも購入していましたが、リリースされたばかりの NT 向けのお仕事はあまりなく*11、使う機会はありませんでした。付属していた 16bit 用 の Visual C++ 1.5 を使っていた記憶があります。

Visual C++ 4.0

華々しく登場した Windows 95。

IBM の OS/2 がマシンリソースを要求するのを体験していたので 同じ 32bit OS である Windows 95 が Windows 3.1 用マシンで動くのか半信半疑でしたが、意外とさくさく動いてました*12

Visual C++ 4.0 は Windows 95 のバイナリを生成する C/C++ コンパイラを搭載。NT と同じ 32bit プロセッサの広大なメモリ空間が使えるようになりました。Visual Basic と Visual C++ は別製品でした*13

この頃ようやく C++ と MFC を覚えて、ライブラリだけでなくアプリ全体も作るようになりました。画面描画は GDI*14 を MFC の薄いラッパー経由で使っていました。

ただ、この頃の業務アプリは PowerBuilder や Visual Basic 4 などの 4GL*15 で画面を作成し Pro*C *16 で開発したライブラリや RDO*17 経由で DB 接続する方式が主流でした。画像データベースシステム*18を開発するため、Oracle から取得した BLOB を Bitmap に変換して返す DLL 関数や OCX などを作ってました。

Visual Studio 97

1997年に登場した Visual Studio の名を冠した初のプロダクト。Visual C++ 5.0 / Visual Basic 5.0 / Visual J++ 1.0*19 を同梱したスイート製品。C++ と Basic の IDE は別プログラムでした。

当初は Web を軽視していた Microsoft ですが、このバージョンで Visual InterDev という開発環境と ASP*20 という Web テクノロジーを投入してきました。僕は Web アプリは JSP*21 で書いていて Visual InterDev は使う機会ありませんでした。

翌年リリースされた 6.0 の印象が強すぎて、あまり覚えてませんが Visual C++ 4.1 / 4.2 のプロジェクトを移行して使っていたと思います。

Visual Studio 6.0

1998年リリース。Visual Studio 98 になるかと思いきや連番に逆戻り*22。 Visual Basic と Visual C++ は相変わらず別 IDE。

当時は研究所の仕事をしていて Enterprise Edition を購入してもらえたのでした。Enterprise Edition には、Visual Modeler という Rational Rose のサブセット版が同梱されており、僕を UML 厨として開眼させてくれました。

C++ では Template による総称的プログラミングパラダイムが登場し STL*23 が整備されたので、自分の MFC アプリで使っていた直交性に欠けるコレクションライブラリを駆逐してました。

Template は Microsoft でも積極的に活用され、軽量な COM*24 コンポーネントを作るために ATL*25 が登場しました。ブラウザで動作する Active X Control は MFC で作ってるとサイズが大きくて当時のインターネットの帯域では耐えられないということで登場したものです。独特な API セットでした。ATL を拡張した WTL*26 も登場しましたが、あまり流行りませんでした。今でも ATL のコードは Windows の奥深くで動作しているはずです。

この当時 C++ や Java など異種言語間でコンポーネントの相互利用を可能にする分散オブジェクト技術である CORBA*27 が登場し、Microsoft も COM の分散コンポーネント版である DCOM をリリースして対抗。Visual Studio での開発をサポートしました。これらはのちに SOAP や REST など Web ベースの技術によって超レガシーになってしまいましたが。。

開発のターゲットは Windows 95 / 98 でしたが、Visual C++ 使ってると不安定になるので開発マシンは NT 4.0 にスイッチしました。

OpenGL や GDI+ による可視化アプリ、動画からフレームを抽出してサムネイルとインデックスを生成するアプリ、IBM の 音声認識エンジン ViaVoice による音声による対話で操作するアプリなど開発してました。Windows CE Toolkit for Visual C++ 5.0 で Windows CE 機 から GPS データや画像を送信するアプリなども書いてました*28。Visual C++ で一番コードを書いていた時代です。

Visual Studio 6.0 に同梱された Visual C++ 6.0 は Windows の C++ 処理系として長く君臨し、Windows 2000 / XP 時代を通して使われました。2004年までサービスパックが出るようなロングセラーでした。

blog.kondoumh.com

この頃は Visual Studio の成熟期でもあり停滞期でもあったのでしょう。エンタープライズな分野においては、Java がイケイケで VB / C++ はレガシーになっていきました。

Visual Studio.NET 2002

ビジネスアプリ部門で Java に水を開けられていた Microsoft は C/C++ Win32 を基盤技術とした MFC / COM+ とは全く異なるクリーンでモダンな アプリケーションフレームワークとランタイムを開発、.NET Framework 1.0 としてリリースしました。Visual Studio にも勢い余って .NET をつけてしまいました。

最初 .NET Framework のホワイトペーパーを読んだときはよく意味が分かりませんでした。Java っぽいものを出すみたいだけど、Windows でしか動かない? 何それおいしいの?

J++ は無くなりましたが、J# という言語が Java -> .NET マイグレーション用に提供されていました。

自分的には .NET Framework よりも Visual C++ / C# / VB.NET が一つの IDE に統合されたのが大きかったです。と同時に MFC アプリ開発にとっては Visual C++ 6.0 の UI とのギャップが大きくて戸惑いました。

Visual Studio.NET 2003

2002 の翌年に 2003 が出て、.NET Framework 1.1 デビュー。このバージョンからエンタープライズでも .NET が使われ始めました*29

当時のプロジェクトでも、VBA で作っていたレガシーなコンポーネントを一部、VB.NET に移行しました。

blog.kondoumh.com

個人的にはポスト MFC を求めて Qt を触り始めてました。

blog.kondoumh.com

Visual Studio 2005

.NET Framework 2.0 デビュー。ようやくエンタープライズで本格的に使えるアプリケーションフレームワークとして成熟してきました。

blog.kondoumh.com

Java 案件が多かったので、.NET はスルーしてきましたが、大規模な業務システムのアーキテクチャを .NET で構築するプロジェクトに入ったことで真剣に取り組まざるを得なくなりました。

C# / VB.NET も進化し、Property, Partial Class, Typed DataSet, Delegate などが実装され、当時の Java (5.0) を抜き去りました。ASP.NET / Windows Form / ADO.NET など業務アプリを作成する上で欠かせないテクノロジーが整備されました。Web プロジェクト周りもサービスパックで強化。

blog.kondoumh.com

2006年から3年ぐらい .NET による業務アプリケーションの開発支援をしていました。

その後、.NET Framework 3.0 が登場し、LINQ による関数型プログラミングとか WPF による MVVM プログラミングなどの新しいパラダイムに触れてエキサイトしたものでした。そういえば、Silverlight も登場しましたね。

Visual Studio 2005 は業務で C++ のコードを書いた最後の Visual Studio でもありました。Visual Studio Express Editon*30 が提供されるようになったのはこのバージョンからですが、MFC はサポートされていませんでした。

iEdit は Visual C++ 6.0 から 2005 に一気に移行し Visual Studio.NET 2002/2003 はスルーしていました。

blog.kondoumh.com

blog.kondoumh.com

Visual Studio 2008

.NET Framework 3.5 をサポートした Visual Studio が 2008 年に登場。.NET 開発支援の頃は、あまり触っていませんでしたが、WPF / WCF / Entity Framework / Silverlight などの技術を積極的に使うようになりました。

blog.kondoumh.com

この頃は、日本マイクロソフトのエバンジェリストグループのお手伝いで .NET 3.5 テクノロジーを駆使した Dinner Now というリファレンスアプリのドキュメントを MSDN 用に作成したりというお仕事もありました。イベントにも参加してましたし。

blog.kondoumh.com

ASP.NET DynamicData という ASP.NET WebForm ベースの Rails オマージュなテクノロジーを使って自社の SFA アプリを開発したりもしました。DynamicData はもうオワコンになっています。Microsoft のテクノロジー戦略は節操なく変更されるので、見極めが難しいですね。

ASP.NET MVC が登場したのもこの頃ですが、Java な案件に長期携わることになり、ずっと後まで使うことはありませんでした。

Microsoft がめちゃ推しだった Silverlight で iEdit クローンを作ってみたのもこの頃でした。

blog.kondoumh.com

github.com

Visual C++ 2008 は iEdit のメンテナンスで結構長く使っていました。

blog.kondoumh.com

blog.kondoumh.com

Visual Studio 2010

.NET Framework 4.0 サポート。F# デビュー、C# は 4.0 に。Azure の開発をサポートし始めたのもこのバージョンから。.NET のパッケージマネージャ NuGet もこのバージョンで登場しました。

お仕事で、自社サービスの宣伝を兼ねて「Visual Studio 2010 と Team Foundation Server 2010 を活用した業務システム開発のライフサイクル管理」というホワイトペーパーをマイクロソフトの Visual Studio 2010 キャンペーン用に作成し、Visual Studio 2010 のローンチイベントで配布してもらいました。

そんな資料を配っておきながら、実業務は長らく Java プロジェクトだったため 2010 を本格的に使ったのは 2014年。ASP.NET MVC でパッケージ開発案件でアーキテクチャを構築しました。MVC は初めてでしたがすでに成熟期に入っており、さほど戸惑うことなくその生産性を享受することができました。

この時は .NET Framework 4.0 がターゲットの実行環境ということですでに登場していた Visual Studio 2013 と C# 5.0 を使わず、2010 / C# 4.0 / MVC 3.0 を選択したのですが、.NET Framework 4.0 をターゲットフレームワークに指定するだけで C# 5.0 / MVC 4.0 で開発できたというのは後で知りました。

Visual C++ も C++11 対応で モダン化の途上にありました。

blog.kondoumh.com

Windows Phone 7 の Developer Tools なんてのもありましたね。

blog.kondoumh.com

au から発売されていた IS12T は買おうかどうかかなり悩んだ端末です*31

www.fmworld.net

Visual Studio 2012

.NET Framework 4.5 サポート。Windows 8 のメトロスタイルアプリあらため Windows ストアアプリが開発できるようになったバージョンです。メトロはタイポグラフィと UI を融合させる斬新なスタイル*32。Windows RT という Windows から Win32 レイヤーを削ぎ落とした軽量 OS を搭載した Surface RT が登場し、iPad ではできないコンピューティングを一瞬だけ夢見させてくれました。

Windows RT 及び Windows 8.1 のタブレットモードで動作するストアアプリは、バックグラウンドになった時は活動を停止して電源消費を抑え、フォアグランドにマシンリソースを解放します。アプリ間のデータは共有ブローカー越しにやり取りする。ノンプリエンプティブなシングルタスクとグローバル領域でのデータ授受。これはまるで Windows 3.x アプリの実行モデルです。

開発は、WPF や Silverlight と同じ XAML プログラミングに、独自のイベント処理やデザイン上の規約に準拠する必要があります。例によって、ダイアグラムエディタを習作。

github.com

しかし、結局 Windows RT は Windows CE Handheld PC と同じ道を辿り衰退しました。アプリ開発者が集まらず、アプリが増えず、利用者が増えないという悪循環。個人的には期待してたんですが。これに懲りたのか Windows 10 は PC とタブレットをサポートする 2in1 OSとして、軽量化と UI 改善を果たし生まれ変わりました。Windows RT 的なレイヤーは Windows 10 の UWP(Universal Windows Platform) として生き残っています。まだ成功してるとは言い難いですが。

ということで、2012 はメトロの夢を見て終わりました。

Visual Studio 2013

.NET Framework 4.5.1 サポート。C# は 5.0

blog.kondoumh.com

2013 年 Microsoft は One ASP.NET というビジョンを提示して、フロントエンド開発における存在をアピールしていきました。 MVVM な JavaScript フレームワーク Knockout.JS 、プロトタイプベースな JavaScript にクラスベースなプログラミングパラダイムをもたらす TypeScript、WebSocket の .NET 実装 SignalR などが登場。 Visual Studio 2013 のプロジェクトテンプレートに Single Page Application が追加されたり、ASP.NET/Web API として WCF に依存しない 軽量な REST フレームワークが提供されたり。すでに 2012 で Web Essentials という Web のフロントエンド開発支援用アドインが出てましたし、Windows での Node.js ネイティブサポートなど Microsoft がどんどん Web な会社になっていきました。OSS コミュニティへの歩み寄りも顕著になりました。ということで Visual Studio Express シリーズは Community 版として提供されるようになり、MFC アプリ開発も Community 版に降りてきました。

個人的には GPU 使った可視化がやりたくて C++ で Direct 2D をちょっと触ったりしました。

www.youtube.com

Visual Studio Tools for Cordova による ハイブリッドアプリ開発の環境構築とガイド作成を実施。ブラウザで動作する Android エミュレータはなかなかの出来でしたが、Node.js が標準と違うパスに入るなど色々カオスで、今なら普通に npm で Cordova 導入して Visual Studio Code と Android Studio でいいじゃんという感じです。

昨年は .NET による基幹系システムフレームワーク開発を1年半。がっつり使いました。

blog.kondoumh.com

このプロジェクトでは GUI は残念ながら Windows Form でした。エンタープライズでは WPF はまだマイナーです。WPF も Blend 使わなくても、Visual Studio のデザイナでレイアウトできるようになったり地道に改善はされてるのですが。

Visual Studio 2015

.NET Framework 4.6 / Windows 10 サポート。Windows のバージョンはずっと 10 で固定されることになりました。 blog.kondoumh.com

Xamarin がサポートされ、スマートデバイスの開発環境の有力候補として存在感出はじめました。

Visual Studio Code とか for Mac とかマルチラットフォーム展開も盛んです。

blog.kondoumh.com

blog.kondoumh.com

あとは、なんと言っても OSS 化された .NET Core ですね。みんな使うようになるといいなぁ。

まとめ

古い記憶を辿りながら、Visual Studio との関わりを書いてみました。6.0 / 2005 / 2013 が一番使ったバージョンですね。

いろんな技術の栄枯盛衰とともに進化・発展してきた Visual Studio。インストーラーも 2012 ぐらいからかなり賢くなり導入楽になっています。英語版と日本語版のリリースもラグがなくなりましたし。当面、2年単位でバージョンアップしていくのでしょうか。

今はまた Java な案件どっぷりで、使用機会が減りました*33。C# や .NET Framework 自体は好きなので、プロジェクトがあったら使うことはやぶさかではありません。ただ、Java に比べて技術者が少ない問題があるので。。Xamarin で開発とかあったら今後も使うかもしれません。

@mattn さんのコラを貼って終わりにします。

*1:構造化プログラミングが可能な Basic 拡張言語。Visual Basic の前身。

*2:Macintosh の HyperCard を知ってたのでそれほどのインパクトは受けませんでしたが。

*3:Microsoft Foundation Class Library

*4:後の Borland C/C++。この時代は速さを表す形容詞として Turbo を使っていたのでしょう。C++ の標準化を先導するライブラリも Boost という名前ですね。

*5:GCC を DOS で使うための DOS-Extender

*6:Dynamic Link Library

*7:Active X Control の前身の OCX の前身の 拡張部品。VB eXtension?

*8:Dynamic Data Exchange

*9:Object Linking and Embedding

*10:のちに COM / DCOM / COM+ という分散オブジェクト技術に発展します。

*11:そもそもマシンの要求スペックが高くて試しにインストールすることもままならない状況でした。

*12:内部的にはかなり 16bit コードが残っていたようです。真の 32bit OS は 先に出ていた Windows NT 3.1 でした。

*13:3.0 系が抜けているのは日本未発売の Windows for Workgroups 3.11 がターゲットだったからでしょう。95 以前の日本企業では Novell NetWare が普及してました。

*14:Graphical Device Interface

*15:アプリケーションを構築するための高機能プログラミング言語の総称

*16:Oracle に接続するバイナリを生成する C のプリコンパイラ

*17:Remote Data Object

*18:今の人には意味不明な言葉だと思いますが、Web 登場前の90年代、画像を検索・表示するシステムを構築するのは大変な手間暇がかかったものです。

*19:Microsoft 版 Java。今はなかったことになっています。

*20:Active Server Pages

*21:Java Server Pages: ASP オマージュなサーバーサイドレンダリングテクノロジー

*22:結局、リリース年がつかない唯一のバージョンとなりました。

*23:Standard Template Library

*24:Component Object Model

*25:Active Template Library

*26:Windows Template Library

*27:Common Object Request Broker Architecture

*28:今なら全部 スマホで簡単にできちゃいますね。

*29:1.1 でもまだベータバージョンというべき出来で、移行に苦労してるシステムを時々見ます。

*30:Express Edition は C# や Basic など言語別に提供され、2012 からは Web や Desktop などターゲットプラットフォーム別に提供されていました。

*31:結局購入には至りませんでした。

*32:フラットデザインや Google の Material Design でも採用されました。

*33:Visual Studio Code は便利に使ってますが。