2017 年に .NET 開発者が知っておくべきこと

本記事は、マイクロソフト本社の Scott Hanselman Blog の記事を抄訳したものです。 【元記事】 What .NET Developers ought to know to start in 2017 2017/1/11

 

.NET Componentsずいぶん前にも、「.NET 開発者が知っておくべきこと」というタイトルでブログ記事 (英語) を書いたことがあります。このときは質問集のように掲載したのが悪かったのか、リクルーターなどにリトマス試験紙のように使われてしまいました。

.NET については情報量が膨大なので、便利なリストを作成して学習ガイドや用語集として使ってもらおうと思い立ち、Jon Galloway と協力して用語とリソースをリストにまとめました。

始めてみて最初に思うのは、「やることが多すぎるじゃないか。だから .NET は嫌なんだ」ということかもしれませんが、参入時にはどのプラットフォームでも同じような壁 (用語集の作成) にぶつかるものです。3 文字略語のない言語やコンピューター エコシステムはありません。あまり深く考えずに、知っておくべきことを知ることからゆっくり始めていきましょう。どこまでやるかはご自身で判断すればよいのです。すべてを知らなくても大丈夫です。その代わり、どのレイヤーでもラベルでも、今どんなプログラムに向き合っているにせよ、その奥にはまだ知らない事実が隠れている可能性があるということだけは知っていてください。

あなたにとって知っておかなければならない項目には線を引いておいてください。その部分を理解したら、他も見てみるようにしてください。詳しい内容を知りたい人もいれば、そうでない人もいます。根本から学ぶべきか、ユーザー視点で学ぶべきかを考え (英語)、自分のスタイルで楽んでください。

まず、.NET と C# ですが、オンライン (https://dot.net、英語) で学ぶことができます。また、F# は https://www.tryfsharp.org (英語) で学習できます。どちらのサイトでもダウンロードなしでコードを作成し、ブラウザー上で作業できます。

https://dot.net (英語) で .NET Core と Visual Studio Code を入手したら、さっそく読み始めてみましょう!

知っておくべきこと (必須)

  • .NET はいくつかの主要なコンポーネントからなります。ランタイムと言語から見ていきましょう。
  • 主要なランタイムは、以下の 3 つです。
    • .NET Framework - Windows PC、デバイス、サーバー上で稼働するモバイル アプリケーション、デスクトップ アプリケーション、Web アプリケーションを作成できます。
    • .NET Core - Windows Linux Mac 上で稼働するサーバー アプリケーションを作成するための高速なモジュール型プラットフォームを提供します。
    • Mono for Xamarin - Xamarin により .NET を iOS Android で使用できます。スキルやコードを再利用しながらネイティブの API やパフォーマンスを利用できます。Mono (英語) はマイクロソフトが Xamarin を買収する前に作成されたオープン ソースの .NET です。Mono は、オープン ソースで柔軟なもう 1 つの .NET ランタイムである .NET Standard をサポートします。また、Mono は Unity ゲーム開発環境でも使用されています。
  • 主要なプログラミング言語は以下のとおりです。
    • C# - C スタイルの言語の表現性と美しさを備えた、シンプルで強力でタイプセーフなオブジェクト指向のプログラミング言語です。C やそれと似た言語を使い慣れている方なら、難なく使いこなせるはずです。C# の詳細については、「C# ガイド (英語)」を参照してください。ブラウザーで実際に試してみることもできます (https://dot.net、英語)。
    • F# - 従来のオブジェクト指向の命令型プログラミングもサポートする、クロス プラットフォームで関数ファーストなプログラミング言語です。F# の詳細については、「F# ガイド (英語)」を参照してください。ブラウザーで実際に試してみることもできます (https://www.tryfsharp.org、英語)。
    • Visual Basic – .NET 上で稼働するさまざまなアプリケーションを構築できる言語で、学ぶのも簡単です。何年も前になりますが、私も VB から始めました。
  • 入手場所
  • ランタイムと言語の次は、プラットフォームフレームワークです。
    • フレームワーク - 使用可能な API を定義するものです。.NET 4.6 Framework、.NET Standard などがあり、名前で参照することもありますが、コードや構成ファイルでは TFM (下で説明) で参照します。
    • (.NET の) プラットフォーム - Windows、Linux、Mac、Android、iOS などがあり、ビット数も含めると、x86 Windows と x64 Windows の違いもあります。今では、各 Linux ディストリビューションにも独自のプラットフォームがあります。
  • TFM (英語) - ターゲット フレームワーク モニカー (Target Framework Moniker) のことで、目的のフレームワークとバージョンを指すモニカー名 (文字列) です。たとえば、net462 (.NET 4.6.2)、net35 (.NET 3.5)、uap (Universal Windows Platform) などがあります。詳細については、こちらのブログ記事 (英語) を参照してください。TFM を選択すると、使用可能な API と、コードを実行するフレームワークが決まります。
  • NuGet (英語) - NuGet は .NET をはじめとするマイクロソフト開発プラットフォーム向けのパッケージ マネージャーです。NuGet クライアント ツールを使用して、パッケージを生成したり利用したりすることができます。NuGet Gallery はパッケージの中央リポジトリで、すべてのパッケージの作者とユーザーが使用できます。
  • アセンブリ (英語) - 一般にコンパイルされたコードが格納された DLL または EXE のことです。アセンブリは .NET Full Framework アプリケーションの構成要素で、デプロイメント、バージョン管理、再利用、アクティベーションのスコープ指定、セキュリティ許可の基本単位となります。.NET Core では、アセンブリとさらにメタデータが格納された NuGet パッケージが基本単位となります。
  • .NET Standard ("netstandard") (英語) - .NET Standard (英語) はバイナリ互換フレームワーク間の参照を簡素化します。1 つのフレームワークから他の複数のフレームワークを参照できます。.NET Standard Library はすべての .NET ランタイムで使用可能な .NET API の正式仕様です。
  • .NET Framework と .NET Core の違い (英語) - .NET Framework は Windows アプリと Windows システム向けである一方、.NET Core はサーバー アプリ、コンソール アプリ、Web アプリ向けのより小さなクロス プラットフォーム フレームワークで、他のシステムを構築するコア ランタイムです。

知っておくべきこと (任意)

  • CLR - 共通言語ランタイム (Common Language Runtime) のことで、マイクロソフトの .NET Framework の仮想マシン コンポーネントで、.NET プログラムの実行を管理します。実行時コンパイルはコンパイルされたコードをマシンに対する命令に変換し、コンピューターの CPU がこれを実行します。
  • CoreCLR (英語) - .NET ランタイムです。.NET Core が使用します。
  • Mono (英語) - .NET ランタイムです。Xamarin などが使用します。
  • CoreFX (英語) - .NET クラス ライブラリです。.NET Core が使用します。Mono もソース共有に使用します。
  • Roslyn (英語) - C# と Visual Basic のコンパイラです。ほとんどの .NET プラットフォームやツールが使用します。ソース コードの読み取り、作成、分析用の API を提供します。
  • GC - ガベージ コレクション (Garbage Collection) のことです。.NET は GC によってプログラムの自動メモリ管理を提供します。GC はメモリ管理に対して緩いアプローチを取っており、メモリの即時回収よりもアプリケーションのスループットに重点を置いています。.NET GC の詳細については、「ガベージ コレクションの基礎」を参照してください。
  • "マネージ コード" - マネージ コードは、実行が CLR のようなランタイムによって管理されているコードのことです。
  • IL – 中間言語 (Intermediate Language) のことで、高水準の .NET 言語で書かれたコードのコンパイルにより生成されます。たとえば、C# が「りんご」だとすると、IL は「りんごソース」で、JIT と CLR は「りんごジュース」と考えることができます。 ;)
  • JIT – 実行時コンパイラ (Just in Time Compiler) のことです。IL をコンパイルしてネイティブ コードとして実行する準備をします。
  • .NET がある場所ですが、.NET Framework は C:\Windows\Microsoft.NET に、.NET Core は C:\Program Files\dotnet にあります。Mac では通常 /usr/local/share にあります。.NET Core はアプリケーションとバンドル可能で、アプリケーションのディレクトリに自己完結型アプリケーション (英語) として格納されます。
  • 共有フレームワークと自己完結型アプリの違い - .NET Core は共有フレームワーク (同じマシンの複数のアプリが共有) を使用できますが、アプリケーションはそれ自体で自己完結型にすることができます。「xcopy でデプロイ可能、bin でデプロイ可能」という言葉を耳にすることがあるかもしれませんが、これはそのアプリが完全に自己完結しているという意味です。
  • async と await (英語) – キーワードの async と await は、長時間実行 (待機) する関数呼び出し (データベースのクエリや Web サービスの呼び出し) のスレッドを解放する IL を生成します。これによりシステム リソースが解放されるので、待機中もメモリやスレッドなどを大量に消費せずに済みます。
  • Portable Class Libraries - 「最小公倍数」的なライブラリで、プラットフォーム間でコードを共有できます。PCL はサポートされていますが、パッケージ作成者は代わりに netstandard をサポートする必要があります。.NET Platform Standard は PCL の進化系で、プラットフォーム間でのバイナリの移植性を実現します。
  • .NET Core は以下の部分からなります。
    • .NET ランタイム (英語) - 型システム、アセンブリの読み込み、ガベージ コレクター、ネイティブの相互運用性、その他の基本的なサービスを提供します。
    • フレームワーク ライブラリ群 (英語) - プリミティブ データ型、アプリケーションの構成タイプ、基本的なユーティリティを提供します。
    • SDK ツール群 (英語)言語コンパイラ (英語) - 基本的な開発作業を可能にします。.NET Core SDK に含まれています。
    • 'dotnet' アプリ ホスト - .NET Core アプリの起動に使用されます。ランタイムを選択し、ホストし、アセンブリ読み込みポリシーを提供し、アプリを起動します。同じホストを使用してほぼ同じ方法で SDK ツールを起動することもできます。

知っておくとよいこと

  • GAC – グローバル アセンブリ キャッシュ (Global Assembly Cache) のことで、Windows 上の .NET Framework が共有ライブラリを保管する場所です。"gacutil /l" で内容を一覧表示できます。
  • アセンブリの読み込みとバインド - 複雑なアプリでは、アセンブリを面白い方法でディスクから読み込むことができます。
  • プロファイリング (メモリ消費量、GC など) (英語) - C# や .NET のコードを評価 (プロファイリング) できる優れたツールがたくさんあります。このようなツールが Visual Studio には多数用意されています。
  • LINQ - 統合言語クエリ (Language Integrated Query) のことで、オブジェクトやデータベースを宣言的にクエリする高度な手段です。
  • CTS と CLS - 共通型システム (Common Type System) と共通言語仕様 (Common Language Specification) のことで、オブジェクトがどのように使用され、渡されるかを .NET が機能するあらゆる場所で機能するよう相互運用可能な形で定義します。CLS は CTS のサブセットです。
  • .NET Native (英語) - いつの日か中間言語ではなく、ネイティブ コードにコンパイルできるようになるでしょう。
  • .NET のロードマップ (英語) - 2017 年の .NET の展望です。
  • "モダン" C# 7 (英語) - C# には毎年新機能が実装されます。最新版は C# 7 で、優れた機能が多数揃っているのでぜひご覧ください。
  • Reactive Extensions (英語)- Reactive Extensions (Rx) は、監視可能なシーケンスと LINQ スタイルのクエリ演算子を使用して非同期かつイベント ベースのプログラムを作成するためのライブラリです。LINQ スタイルの演算子をデータ ストリームに適用して、クリーンかつ非同期に実行する洗練されたイベント ベースのプログラムを作成できます。

注: 一部の文章は、そのトピックに関する Wikipedia の記事から引用し簡潔にまとめたものです。Creative Commons 表示 - 継承 3.0 非移植。一部の文章は、こちらの .NET ドキュメントから引用しています。この記事は、ブログへのリンクやテキストをまとめたものです。一部の内容は筆者独自の考えですが、多くは異なります。


謝辞 : この場を借りて、Raygun に感謝したいと思います。既に 40,000 人を超える開発者が Raygun でアプリを監視しています。ぜひ皆様もお使いください。ソフトウェア アプリケーションのエラー、クラッシュ、パフォーマンスに関する問題の根本原因を知ることができます。インストールはわずか数分で済みます。さっそくお試しください (英語) !

寄稿者について

719c91f5c3013e43ee46ed2bdc67f883 Scott Hanselman は、大学教授やファイナンスのチーフ アーキテクトを務めた経験を持ち、現在は講演者やコンサルタントとして活動しています。また、父親、糖尿病患者でもあるマイクロソフト社員です。コメディアンとしては失敗しましたが、コーンロウ ヘアーのスタイリスト、著者としての肩書も持っています。