C#は長期的な成長のための投資が進められていた
――Visual Studio for MacやXamarinの登場など、C#の環境が変化していると思いますが、山田さんは現状をどのように捉えていますか?
山田:ご指摘のとおり、現在C#を取り巻く環境は大きく変化しようとしています。これは2010年代前半に停滞期などと言われていたのとは対照的です。具体的には、C# 5.0(Visual Studio 2012)のあと、C#はしばらく際立った話題がない時期にありました。
もちろん、C# 5.0で非同期メソッド(async/await)が追加されたことで、言語としての機能が出揃ったという事情もありますが、むしろ大きかったのは「さらなる飛躍のための準備」という要因です。今後10年、20年と戦える言語、環境へと生まれ変わるべく、この時期、長期的な成長のための投資が着々と進められていました。
代表的なのが、Roslyn(.NET Compiler Platform)――C#コンパイラーのC#による再実装です。従来、C#コンパイラーはC++(アンマネージコード)で実装されていたため、「コンパイラーの機能を部品化したとしても、マネージコードからは呼び出しにくい」「そもそもマネージコード/アンマネージコードの通信はオーバーヘッドが大きく、扱いづらい」などの問題がありました。
しかし、Roslynによって、たとえばコード解析やリファクタリングなどの機能を誰もが手軽に実装できるようになります。副次的な効果ではありますが、これまでVisual Studio本体はコード解析やインテリセンスなどの機能のために、コンパイラー相当の機能をC#コンパイラーとは別に実装してきましたが、Roslynによってこれが一本化されます。
もともと、C#は言語単体というよりも、IDE、.NET Frameworkと密接な関係を保ちながら進化してきた言語ですが、Roslynによって機能の身軽な追加が可能な環境が整ったことは大きいと思います。
そして、クロスプラットフォーム化です。従来、C#(.NET)といえば、Windowsのための言語(環境)というのが常識でしたが、macOS、Linuxなどにも対応した.NET Core、Android/iOSなどのモバイル環境を主ターゲットとしたXamarinの登場によって、クロスプラットフォームで動作する環境が整ってきています。
実行環境だけではありません。macOS環境で動作するVisual Studio for Mac、Windows/macOS/Linuxで利用できるコードエディターのVisual Studio Codeなども提供されており、開発のための環境も着々と整ってきています。
C#といえばWindows、Windowsだけでは守備範囲が狭い、と毛嫌いしてきた方は、これを機会にちょっとだけ認識を改めて、C#という選択肢を加えてみてもいいかもしれません。
幅広いアプリ開発分野に活用できる
――改めて、C#の強みとは何なのでしょうか。
山田:C#というとWindows環境での強みに頭が行きがちですが、ここまでにも触れたように、それはすでに過去の認識です。クロスプラットフォームで、しかも、幅広いアプリ開発分野に活用できるのがC#の強みと言えます。
デスクトップアプリ、Webアプリなどクラシカルな開発現場はもちろん、XamarinによるAndroid/iOSを問わないモバイル開発、Unityによるコンシューマーゲーム開発、VSTOによるOfficeアプリ開発などなど、おおよそ目立ったところでできないことはないのではないかと思えるほどです。
守備範囲の広さは、そのまま言語(技術)としての間口の広さに直結しますので、今後のC#需要の伸びしろには期待していいのではないでしょうか。
また、C#は数年以上に及んだ潜伏の期間を今抜けんとしています。今後10年、20年のための準備を終えたC#は、いよいよ短スパンでのバージョンアップが継続的にリリースされると予想されます(実際、C#7.0から半年足らずで7.1がリリースされ、すでに7.2も間近に迫っています)。
今この時点でC#を学ぶことは、新たなスタート地点に立ったC#にいち早くキャッチアップするという意味でも、十分に価値あることだと思います。
新版では図版を大切に
――『独習C# 新版』は『C# 3.0: A Beginner's Guide』の翻訳ではなく、山田さんの執筆による完全な書き下ろしとなっています。その狙いとは?
山田:旧版は名著でした。しかし、原著はC# 3.0。監訳者が4.0対応のために追記しながら頑張ってこられましたが、5.0以降に対応するにはさらに建て増し的な加筆が必要で、改訂が難しくなっていました。そうした事情が一番だと思います。
先に触れたように、雌伏の時を終えて、今後C#は短サイクルで進化していくことが予想されます。これに即応できる地盤固めのための準備が、今回の新版刊行だと認識しています。
紙書籍ということで、リアルタイムにマイナーバージョンアップを追跡するのは困難ですが、個人的には電子書籍で差分を埋めつつ、紙書籍とのハイブリッドで、できるだけ短サイクルに改訂を重ねられればいいなと考えています。
内容面からは、旧版はよかれあしかれ説明が細かく、より具体的な例を挙げようとしているためにサンプルコードが冗長になりがちで、結果として700ページ近くに及んでいました。
そこで本書では、(賛否はあるかとは思いますが)なるべく言語機能の理解に直結しないコードを省き、サンプルの意図を一目で理解できるように、と心掛けたつもりです(自分でどんどん手を動かせるように、紙面上のサンプルはほぼすべてダウンロードできるようにしていますので、ぜひご活用ください!)。
本書はC# 5.0以降の新機能を加えて600ページ強なので、ずいぶんとコンパクト化されたかなと思っていますが……さて、どうでしょうか。
また、旧版は文字情報を中心としたストイックな書籍でした。翻って、新版では図版を大切に、初学者の方でも主な概念を視覚的にイメージしやすいように努めました。
プログラミング言語の学習というと、論理的に厳密な理解を、とのめりこんでしまいがちですが、要所要所では一歩身を引いて、大枠でざっくりとしたイメージを持つようにすると、バランスの取れた学習を進められるのではないでしょうか。
行き詰まりを感じた方にこそ
――本書はどういう方向けなのでしょうか。
山田:こんなことを言ってしまうと怒られてしまいそうですが、プログラムを一から学ぶ人向けではないと思います。もちろん、前提知識がなくても読めるような解説を心掛けていますが、600ページ以上に及ぶ書籍です。分量だけをとっても手軽とは言えません。
よって著者としては、手軽にC#を概観したいならもっと薄い本を選ぶべきですし、すぐさま何かを作りたいならASP.NETやXamarin、デスクトップアプリなどの本を選ぶことをお勧めします。もちろん、現在であればネットを検索しても良質な情報とサンプルコードが入手できると思います。
しかし、表面的な理解はどこかで行き詰まります。特にフレームワークで具体的なアプリを開発していると、当たり前のようにC#特有のイディオムが出てきます。おまじない、決まりごとと割り切ってもそれなりに開発できてしまうのがC#のいいところですが、肝心なところで応用が利きません。トラブルにも対処しにくくなります。
本書はそのような行き詰まりを感じた方にこそ読んでいただきたい、と考えています。本書のアプローチは愚直で、遠回りにも思えるかもしれません。しかし、単なる手先のテクニックではない、確かな言語理解は、後々の開発のための血肉であり、底力になっていくはずです。
大層なことを言っていますが、反面であまり難しくも考えず、初学者の皆さんも気軽にまずは手元に置いておいてください。積読でも構いません。そして、自分の開発したいアプリの手法を学びながら、ふと言語としてC#をもっと知りたいと思ったときに、知識を再確認できる本でもあると思っています(それがつまみ食い的な学び方であっても、個人的にはいいと思います)。
必ずしも最初から最後まで集中して読み通さなくてもいい
――本書の内容や特徴についても教えてください。
山田:先に白状してしまうと、本書はフレームワークについては一切扱っていません。ですから、この本を読んでも、デスクトップアプリもWebアプリも開発できません。扱っているのは、コンソールアプリだけです。
しかし、フレームワークに由来する独特のルールやお作法は、たいがい言語そのものを学ぶ際にはノイズとなるものです。これらノイズを取り去って、C#という言語を集中して学べるようにすることが本書のすべてです。
構成そのものはスタンダードで、C# 7.1時点で学ぶべきテーマはおおよそサポートしています。第1章~第4章はほかの言語でも共通した内容となっているので、一般的なプログラミングの知識がある方であれば、つまみ食い的に読んでいっても十分に理解できるのではないでしょうか。
第5章~第6章は.NETライブラリの主要なクラスについての解説です。クラスの用法に慣れるという目的でここに配置していますが、ちょっとしたリファレンスとしても利用いただけると思います。
そして、本書でかなり紙数を割いているのが、当たり前ではありますが、第7章~第9章のオブジェクト指向構文です。Javaなど、ほかのオブジェクト指向言語を知っている方であれば言わずもがなのところもあるかもしれませんが、細かな点で意外と違いもあったりします。ほかの言語を知っている方はなおのこと、「違い」を意識してみると既存の知識共々に理解を深められるのではないかと思います。
第10章~第11章はより高度なテーマです。とはいっても、LINQ、マルチスレッドなどはすでにフレームワークを利用するうえではほぼ前提知識のようになっていますので、最低限押さえておいていただきたいテーマです。
先ほどから何度か触れていますが、必ずしも最初から最後まで集中して読み通すという学び方ばかりでなくて構わないと思っています。アプリ開発(フレームワーク)を学ぶ中で、不確かな言語理解を再確認するための用途で、関心を持った章から読み進めていってください。本書はそうした用途でも十分に耐えうるよう、関連するテーマへの参照をなるべく細かく入れ、関連性を意識しながら学べるようにも意識しています。
基礎に立ち返ってみたいと思ったときに
――本書を通して、どういった知識が身につきますか?
山田:先ほどの話とも共通しますが、本書ではアプリ開発の具体的な手順は扱っていません。また、地道に構文に向き合う本書のスタンスは、なかなかに読者の皆さんの気力を要求するのではないかと予想しています。
よって、本書で学んだあとというよりも、本書を学びながら具体的なアプリの開発に取り組んでみてください。自分が今現在学んだことが具体的な形になっていくことは(=具体的なイメージを持つことは)、単なる構文知識を補完することにもなりますし、本書を学び進める推進力にもなっていくのではないかと思います。
C#に限ったことではありませんが、新しい言語を学ぶ際には、「ざくっと学べる言語入門書」を最初に、その後、「より深く学ぶための言語入門書」(本書はこれ)、「具体的な開発のためのアプリ開発書」を並行して読み解くことで、バランスのいい学びを得られるのではないでしょうか。
――では最後に、これからC#を学ぼうという方にアドバイスをお願いします。
山田:アドバイスなどとたいそうなことは言えませんが、C#に限らず、最近ではますます個人でも開発できるアプリの幅が広がっています。難しいことを考えずに、まずはプログラミングを楽しみ、何かを自分の手で作ってみましょう。
また、特定の言語、特定のアプリに拘泥されずに、さまざまな言語に触れてみてください。そうしてできることが広がってきたときに、もう一度基礎に立ち返ってみたい――そう思ったときに、本書が皆さんの選択肢の一つになれば、著者としては嬉しく思います。