C#を勉強する順番

どうもこんにちは。ピーコックアンダーソンと申します。
C#を中心に、20年ほどプログラマーとして活動しています。

ここでは、私が現在、最適だと思っている、C#を学ぶ順番をまとめましたので
C#を使って現場で活躍されたい方は、ぜひご覧になってみてください。

  1. C#を勉強する順番!オブジェクト指向からドメイン駆動開発まで#1-1
  2. 最初に結論書いておきます
    1. 基礎文法
    2. コーディングルール,各種作法
    3. オブジェクト指向
    4. デザインパターン
    5. テスト駆動開発
    6. リファクタリング
    7. ドメイン駆動開発
  3. C#を勉強する順番!とりあえず最低限の文法や開発環境の使い方の知識は必要#1-2
  4. とりあえず最低限の文法や開発環境の使い方の知識は必要
    1. C#を学ぼう
      1. C#の本を買う
      2. Webでブログなどを見る
    2. Youtubeを使う
    3. Kindle本を使う
    4. VisualStudioを入れる
      1. いい時代。全部無料。
      2. Nugetも充実
  5. C#を勉強する順番!WindowsFormsプログラミングで電卓なんかを作ってイベントなどを使えるようにする#1-3
  6. WindowsFormsプログラミングで電卓なんかを作ってイベントなどを使えるようにする
    1. イベント
    2. 変数
    3. クラス?
      1. インタフェースとか継承とかテキストに書いてるけど必要性を感じない
  7. C#を勉強する順番!企業でのシステム開発とかだとDBを使うのでC#とDBをつなげる技術#1-4
  8. 企業でのシステム開発とかだとDBを使うのでC#とDBをつなげる技術
    1. SQLServerとOracle
  9. C#を勉強する順番!ボタンクリックイベントにだらだら書くのはなんか違う気がしてくる#1-5
  10. ボタンクリックイベントにだらだら書くのはなんか違う気がしてくる
    1. それだけだと厳しいことに気がつく
    2. 改造するたびに調査とかコードの解析がしんどい
    3. チーム内のコーディングが統一されていない
  11. 共通化メソッドを造ったからって美しいコーディングとはいえない
    1. 書く場所が違うだけは意味ない
    2. クラスを作ってstaticな関数にしたからOKじゃない
  12. C#を勉強する順番!良いプログラミングのお手本がないとどうして良いのかわからない#1-6
  13. 良いプログラミングのお手本がないとどうして良いのかわからない
    1. どうやって学んだらいいかわからない
    2. どんな感じで実装するのが正しいのか分からない
  14. C#を勉強する順番!プログラミング初級講座とかいう大手の研修を受けてみたが#1-7
  15. プログラミング初級講座
    1. 文法を教えている
  16. クラス,インタフェース
    1. 使い方のみ
    2. 効果的な使い方を教えていない
  17. C#を勉強する順番!良いプログラムとはリーダブルコード?コーディングルールを学ぶ#1-8
  18. リーダブルコードの表紙を発見
    1. サブタイトル:より良いコードを書くためのシンプルで実践的なテクニック
    2. 買ってから一気に読んだリーダブルコード
    3. 作法に関して
  19. C#を勉強する順番!第2章 オブジェクト指向との出会い#2-0
  20. オブジェクト指向との出会いってずっと前から出会っていたけど気がつかなかった!
    1. C#を学んでいるだけでは突破できない
    2. オブジェクト指向を学ぶことが良いプログラミングであると気づく
    3. ストラテジーパターンとの出会い
  21. C#とか関係なく,オブジェクト指向言語として捉える
  22. オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな#2-1
  23. オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな…きっと
    1. オブジェクト指向って何?
  24. デザインパターン
  25. ドメイン駆動開発がオブジェクト指向をうまくコーディネートしていて最強みたい#2-2
  26. ドメイン駆動開発
  27. ファーストクラスコレクション
  28. 2人の巨匠の話
  29. テスト駆動開発との出会い
  30. C#を勉強する順番!ドメイン駆動開発をするにはテスト駆動開発の知識が必須?#2-3
  31. ドメイン駆動開発をするにはテスト駆動開発の知識が必須?
  32. インタフェースってすごく重要だったんだ
  33. C#を勉強する順番!テストコードのないプログラムは全部レガシーコードって呼ぶらしい#2-4
  34. レガシーコード改善ガイド
    1. 例えば
  35. 基本的にはリファクタリング
  36. ダメコードのリファクタリングの仕方
  37. テストコードのないプログラムのリファクタリングは怖い
  38. 出来ればすべてゼロから作りたい
  39. 勉強が乗らないときは?
  40. C#を勉強する順番
  41. 追伸
  42. プロフィール

C#を勉強する順番!オブジェクト指向からドメイン駆動開発まで#1-1

今回はC#を勉強する順番を解説して行きます。ダメダメ文法プログラマーだった私が数年間でドメイン駆動開発まで勉強した勉強方法を順を追って説明して行きます。

最初に結論書いておきます

  1. 基礎文法
  2. コーディングルール,各種作法
  3. オブジェクト指向
  4. デザインパターン
  5. テスト駆動開発
  6. リファクタリング
  7. ドメイン駆動開発

こんな順番がおすすめです。

基礎文法

if文とかfor文とかListとかの使い方を最低限学んでおく必要があります。今後デザインパターンなどの賢者の書いた本を読んでいくのに,「インタフェースはどうやって書くんだったけかなー」なんて感じでは本を読むのがしんどくなって投げ出してしまいます。

とはいえ,オブジェクト指向の要素であるカプセル化,インタフェース,継承や,少しクセのある実装になる非同期プログラミングは現代のプログラミングに必須とはいえ,最初から完全にマスターしておく必要はありません。今後勉強していく中でおいおいマスターしていけば良いでしょう。

取りあえず,クラス,変数,if文,for文,配列,リストくらいは最低限何も見なくてもコーディングできるようにしておきましょう。

コーディングルール,各種作法

コーディングの作法も大切です。序盤に覚えておけば,変なクセがつかないので良いでしょう。変数名の頭文字を小文字にするとか,命名方法など,職場での規則もありますが,マイクロソフトが題している「クラスライブラリー設計」という本に大体大切な事は書いてありますから,一度すべて読んでおきましょう。マイクロソフトでクラスライブラリーを製作しているチームの方が書かれている本なので,本家のプログラミングルールを学ぶことが出来ます。職場のルールを確立するより,マイクロソフトのルールを職場に持ち込んだほうが全体がぶれなくなって良いでしょう。

オブジェクト指向

ある程度プログラミングが書けるようになってきたら,オブジェクト指向を学びましょう。
オブジェクト指向に関する本は色々出ているので,自分にあった本を探すのが良いでしょう。オブジェクト指向の要素や原則があるので色んな本を読んで勉強しましょう。

デザインパターン

オブジェクト指向の本を読むといろいろ書かれてはいますが,考え方の話がおおいので,結局どんな実装をするのがよいのかが分からなくなります。そのレベルまできたら,デザインパターンを学びましょう。デザインパターンとは,オブジェクト指向の具体的な使い方をまとめた「ノウハウ集」です。頭の良い先人がプログラミングのパターンをまとめてくれています。これを学ぶことが,賢者に近づく道となります。

テスト駆動開発

テスト駆動開発は,現代のプログラミングには必須の知識です。テストコードの書き方がわたらない人間がチームにいたら,書き方を教育して,全員がテストコードを書けるようになりましょう。テスト駆動開発の考え方は,少しのテストコードを書いて,そのテストコードを成功させるために少しの本番コードを記述します。あとはその繰り返しを行い,本番コードを作ってきます。

テスト駆動開発の中に,オブジェクト指向を行う大切な要素はすべて含まれているといっても良いくらい,テスト駆動開発はオブジェクト指向を学ぶ上でも大変有益なものです。

リファクタリング

リファクタリングとは,良くないコードを良くすることです。マーチンファウラーのリファクタリングという本に詳しいやり方は記述されているので,そちらを参考されてください。簡単に言うと,ダメダメプログラミングを発見したら,そのプログラミングに対してテストコードを記述し,そのダメコードにバグが混入しないようにして,ダメコードをイイコードしていくという手順です。色々なパターンを収録したカタログ集がリファクタリングという本に書かれています。

ドメイン駆動開発

以上を学ぶと,プログラミングに必要な要素はすべてそろっているのですが,すべてが点と点に分かれていて,うまく1つにまとめる知識が必要になります。そのすべてをまとめてコーディネートする知識がドメイン駆動開発となります。

この知識を得ることで,アプリケーション全体の見通しがよくなり,保守性の高いプログラミングをする事ができます。

 

C#を勉強する順番!とりあえず最低限の文法や開発環境の使い方の知識は必要#1-2

ここからは,私がC#で文法,オブジェクト指向,テスト駆動,ドメイン駆動開発などを学んでいく中で,つまずいたことや,感じたことをシェアして行きたいと思います。

とりあえず最低限の文法や開発環境の使い方の知識は必要

とりあえずC#ができるようになりたいと思った場合は,最低限の文法と開発環境の構築が必要となります。

C#を学ぼう

C#を学ぼうと思ったら,おそらく大体の人はC#の本を買うか,誰かのブログなんかを見て,文法などを覚えていくことになると思います。まったくプログラミングが初心者の場合も自分のレベルにあった本を選べば,if文やfor文,Listなどの使い方はマスターできるようになります。

この段階では,まだよりよりプログラミングを書くというよりも,やりたいことを実現するためにはどのようなコーディングをすれば良いのか?とか,もっといえば,コンパイルはどうするのか?などというレベルから始まるため,よりよりプログラミングというのはあまり意識することなく,とにかく,必要な文法を覚えることが必要です。

C#の本を買う

先述したとおり,自分にあった本を選んで,文法を覚えていきましょう。あなたがどれくらい初心者かにもよるので,一度本屋で立ち読みをして,分かりやすい本を選びましょう。

ある程度文法は分かっているけど,知識を深めたいと思っているレベルの場合は
プログラミングC# 第7版などがおすすめです。しっかりとした文法知識が身につきます。この本をしっかりと読んでいるのであれば,文法プログラマーとしては,上出来でしょう。

Webでブログなどを見る

日々の時代の流れにより,本という媒体は,おのずと情報が古くなってしまいます。考え方ということであれば,あまり時代に左右されませんが,最新のコーディングを学ぶのであれば,Webコンテンツを見るのも十分に有益です。

DOBONさん未確認飛行さんなどが有名ですね。

最初のうちは,こういった老舗のWebサイトで勉強すると良いでしょう。

Youtubeを使う

最近ではYoutubeで「C# 初心者」などと検索して,勉強する方法も良いでしょう。
Youtubeの動画を観ながら,一緒にプログラミングすることで,本で読むよりもスムーズに文法が学べます。

Kindle本を使う

本で学ぶのは良いことですが,私は2年ほど前からもっぱらKindle本を買っています。
紙の本はできる限り買わないようにしています。Kindleのほうが多少安くかえるのですが,魅力はそんなことではなく,パソコンの画面にKindle本を表示しながら,VisualStudioにコードを打ち込むことができる点です。

技術書籍の紙の本は分厚い本が多くて,重たいです。机の上において読むのはいいのですが,同時にコーディングしながら読むとなると,結構大変です。

私は近年スマホ開発のために本を買いましたが,Kindle本で読みながらコーディングをすると,Kindleを画面に映しながら作業ができるため,非常にやりやすいことに気がつきました。

紙の本を読んでいる人からすると,Kindle本は少し抵抗があるかも知れません。私も,8000円とかのお金を出して買うのだから,絶対に紙の本がいいと思っていましたが,Kindle本のほうがブログを読む感じで読みやすく,非常に重宝しています。

いっぱいになりかけている本棚を圧迫することもなくなり,今は,可能な限りKindleを購入しています。一部の本は紙の本しかないので,そういう場合は,仕方なく紙の本を買っています。

VisualStudioを入れる

いい時代。全部無料。

今はいい時代になりましたね。VisialStudioがタダで入れれるのですから。
VisualStudio2003までの頃は,高いお金を出さないと買えないので,家のパソコンに入れて勉強するのが難しかったです。VisualStudio2005から無料版がでたので,そのころから家でプログラミングが自由にできるようになりました。

ついでにSQLServerも無料でダウンロードできるようになったため,家の中で,システム開発ができるようになりました。

Nugetも充実

今はプラグインのような機能も充実しているため,大変便利です。
VisualStudioには,テストコードを書くためのMSTestが標準でついていますし,コードの書き方をチェックしてくれるコード解析や,StyleCopまで無料でインストールできます。

テストコードの網羅率をチェックするカバレッジを採る機能もNugetでインストールできるため,家での勉強は非常にやりやすくなりました。

というわけで,最初の勉強としては,本やブログや動画を観て,基礎文法を学びましょう。
そして,家の中に開発環境を構築しましょう。VisualStudioやSQLServerはマイクロソフトのサイトで無料で手に入ります。

C#を勉強する順番!WindowsFormsプログラミングで電卓なんかを作ってイベントなどを使えるようにする#1-3

C#を勉強する順番の第3話です。これまでは,勉強する全体の概要の説明と,基礎文法を学ぶための方法を解説いたしました。今回も基礎文法を学ぶレベルのお話なのですが,初心者の方はとりあえずWindowsFormsのプログラミングから入るのがやさしいかなと思います

WindowsFormsプログラミングで電卓なんかを作ってイベントなどを使えるようにする

イベント

Windowsのプログラミングには基本的には画面とかイベントという考え方があります。「画面でボタンが押されたとき」のようなタイミングでイベントという通知を受け取ることができるので,その通知の中に処理を書いて行きます。

このイベントの感じをつかむためには「電卓」をゼロから作ってみるのが良いと思います。Windowsでも標準で電卓機能がついていますが,それと同じやつか,それと似た感じの画面を自分で作ってみましょう。

画面に数値を表示するラベルかテキストボックスを設置して,数値入力用のボタンや符号を入れるボタンなどを並べます。

そしてそのボタンを押したときにボタンクリックイベントが発生するので,そのタイミングで計算処理をするのです。

さらにボタンを押さなくても,キーボードで「2」などを押すと,画面の「2」のボタンが押された時と同じ動きをするように実装しましょう。

これで,マウスクリックのイベントと,キーボード入力のイベントを拾って処理することができるようになります。

変数

C#に限らず,プログラミング言語には変数というものが使われます。数値型や文字型などがありますが,そのあたりも当然のように使えるようになりましょう。数値ならint型ですが,intが何バイトなのか?といったこともわかるようになりましょう。intが4バイト,shotが2バイトです。その他小数点数を扱う型や,バイナリーを扱う型など,扱えるようになりましょう。

クラス?

C#の参考書を紐解けば,クラスという概念が出てきます。クラスって何なのかなーって最初はなると思います。クラスは「値」と「ロジック」のひとかたまりです。

値とロジックがばらばらだと,分かり難いプログラムになるということに,昔の賢者が気づき,クラスというもので「値」と「ロジック」をひとまとまりで扱えるようにしてくれています。

最初のうちはこのクラスがどういった威力があるかが分からないと思います。これはオブジェクト指向を学ぶうちに,絶対的にひつような概念であることが分かるようになると思いますが,今はなんとなく,変数宣言とか,関数が書ける場所なのだなというくらいの理解でも大丈夫なので,参考書を読んで,がんがん進みましょう。

インタフェースとか継承とかテキストに書いてるけど必要性を感じない

クラスの意味がいまいち分からないのであれば,インタフェースはまったく意味が分からないと思います。

最高所では,いろいろな例えを出して説明してくれますが,オブジェクト指向を理解していない人が,その例えを聞いても分からない場合が多いです。とりあえず実装方法としてどう書くかくらいが分かったら,次のステップに進みましょう。

理解できていなくても大丈夫です。

C#を勉強する順番!企業でのシステム開発とかだとDBを使うのでC#とDBをつなげる技術#1-4

企業とかでC#を使うときは必ずといって良いくらいデータベースを使います。C#とつなげるデータベースは大体SQLServerかOracleが多いです。

企業でのシステム開発とかだとDBを使うのでC#とDBをつなげる技術

SQLServerとOracle

C#プログラミングは,C#だけで完結することはあまりなく,データベースを扱うことがほぼ99%くらいの確立で起こります。

そこで学ぶべきデータベースはSQLServerか,Oracleのどちらかが圧倒的に多いです。javaの型はDB2を使うことも多いかも知れませんが,私の経験上,たいていはSQLServerか,Oracleです。

どちらを勉強するべきかは,あなたの配属される現場によります。だから現場で使うデータベースを学ぶのが一番良いのですが,家で勉強するということであれば,SQLServerが無料でフル機能使えるので,非常に勉強しやすいでしょう。

SQLServerの無料版で,商用禁止の開発者向けエディションがあるので,そのエディションでフル機能の体験ができます。

まぁフル機能でなくても,無料版のやつで,SQLを勉強するくらいは十分にできます。

最初はselect文ってどうかくの?って感じでWebなどで調べながらSQLを学んでいきましょう。

テーブルの作り方や,基本的なSQLの文法を学べば,それをC#から呼び出す方法を学ぶことで,C#とデータベースを連携させることができます。

データベースと連携することで,アプリケーションの用途は非常に広くなります。

世の中で動作しているシステムはほとんどデータベースを使っています。データを記憶するということが,ちょっとした設定を覚えるとかでない限り,データベースが必要です。

会社なら取引先情報や社員情報。勤怠情報など,あらゆる情報を記憶するにはデータベースを使う必要があります。

C#初心者だったとしても,データベースも並行して覚えていきましょう。

C#を勉強する順番!ボタンクリックイベントにだらだら書くのはなんか違う気がしてくる#1-5

ここまで4回にわたってC#で勉強する順番について解説してきました。
プログラマーの会社や,メーカーなどに就職して,最初の1年くらいは,これまで解説したようなWindowsFormsのプログラミングや,イベントや変数や,データベースとの接続部分なんかの実装をメインで覚えていくと思います。

そしてだらだらっとプログラミングしても動作するので最初は何も問題ないと思っていると思いますが,自分が作ったプログラミングを改造したり,修正したりし始めると,とたんに保守性の悪さに気がつくと思います。

保守性というのはプログラムの直しやすさのことです。保守性が高いとは,プログラムの修正がしやすい事をあらわします。保守性が低いとは,プログラムを修正しづらいことを言います。要するに,どこかプログラムの1行を変更した影響が,どこまで広がるのかが分かりづらく,結局アプリケーション全体をテストしなおさないといけないようなプログラムは保守性が悪いプログラムといいます。

1年か2年働いて,自分のプログラムは動いてはいるが,動き続けるプログラムではないことに気がつきます。

ボタンクリックイベントにだらだら書くのはなんか違う気がしてくる

それだけだと厳しいことに気がつく

本を読んだりしても,なんとなくクリックイベントにだらだらとプログラミングを書くのは良くないような記述を見かけるんだけど,じゃあどう書けばいいか?というとなかなか回答が見つから,なんかうまくいかない,ちゃんとしたプログラミングができているか自信がもてないという状況でした。

改造するたびに調査とかコードの解析がしんどい

改造するたびに,自分のプログラムの悪さを感じていました。例えば重複コードがあるし,微妙に違う似たような関数があるし,修正することで,どれくらい他のプログラムが影響を受けるか良く分からないようなプログラミングでした。

チーム内のコーディングが統一されていない

チーム内のコーディングが統一されていませんでした。個々のプログラマーの好きな感じで書いていたので,ばらばらで,たまに共通関数は申し合わせて造ったりしていましたが,それ以外の部分は結構人それぞれが書くような感じでした。

共通化メソッドを造ったからって美しいコーディングとはいえない

共通化メソッドを造ったからといって,美しいコーディングとはいえません。例えばボタンクリックとキーボードのF12を押したときの処理が同じだからといって,関数を切り出したからといって,それが良いコードというわけではあります。

そりゃ,クリックイベントとキーダウンイベントの両方に同じコーディングがあるのは最低のプログラミングですが,その2つを共通かして1箇所の関数を呼び出すようにしたから良いプログラムになったという単純な話ではないという意味です。

書く場所が違うだけは意味ない

フォーム画面にプログラムをゴリゴリ書いてはいけないといわれたからといって,新しいクラスに関数をpublicで作って,それを呼ぶようにしたからといって,良いコードになったとはいえません。ましてや,意味なく別のクラスに処理を書かれると,可読性が下がるだけです。

別のクラスに書くにはそれなりの意味を持たせないといけません。

一番簡単な意味の持たせ方は,テストコードを書きやすくするためです。テストコードの解説をするにはまだ早いので,時期がきたらお話します。

クラスを作ってstaticな関数にしたからOKじゃない

クラスをstaticにしてどこからでも呼べるようにして共通化を図るのはやめてください。ピンポイントで,static関数を造っていくのは効果的ですが,例えばデータベースのProductテーブルを検索してくるのにProductクラスのGetDataをstaticな関数にして呼び出してはいけません。

こういう部分はインタフェースを使う必要がありますが,これに関してはオブジェクト指向を解説するときに解説したいと思います。

C#を勉強する順番!良いプログラミングのお手本がないとどうして良いのかわからない#1-6

C#で仕事をしていて,正しいプログラミングをしたいという思いがあったとしても,どのようにしてその知識を付けていけば良いのかが分かりませんでした。

例えばGoogleの検索エンジンで「C# サンプル」と検索しても当時であれば「WindowsFormsの実装サンプル」みたいなものや,「ファイルを開く」とか,「データベースに接続する」などといったピンポイントの技術のサンプルしか存在しません。

コード量でいうと10行から100行くらいで完結するようなサンプルしかWeb上にはありませんでした。

良いプログラミングのお手本がないとどうして良いのかわからない

どうやって学んだらいいかわからない

通常仕事というものは先輩から学びます。たいていの仕事は先輩のやり方を見て,先輩にやり方を教えてもらいます。でもこのIT業界というのは非常に特殊です。

先輩だから知っているわけではありません。

刻一刻と進化するIT業界で,先輩だから知っているなんて事はまったくありえないことです。歴史のある技術は先輩のほうが精通している可能性はあります。

今で言うとネットワークの技術というものは根本的には10年以上前からあまり変わっていませんし,ハブとかルーターとかの機能などの知識は先輩のほうがある可能性があります。

C言語なんかも古い言語で,完成されていて,枯れている言語なので,昔の知識が今でも十分通用します。

しかしC#というのは私が働きだしてから登場した言語です。以前はみんなVB6というオブジェクト指向を十分に生かせる言語ではなかったため,みんなボタンクリックイベントにだらだらと書いていくような実装をしていました。VB6にはコンストラクタという概念がありません。ということは完全コンストラクタパターンも当然できなかったわけです。

だから先輩の背中をみて学ぶということができなかったのです。今の新人の人は,先輩がオブジェクト指向に精通している可能性はあります。そういう人はラッキーなのでその人からたくさん学びましょう。学び方は一緒にプログラミングをするペアプログラミングが一番勉強になりますが,時間的な制約でそれができないのであれば,定期的にコードレビューを受けましょう。コードをチェックインする前にレビューを受けるのが理想ですが,無理なら週に1回とか,2週間に1回とかまとめてレビューしてもらっても良いです。

先輩が忙しいのであれば,ソースセーフやチームファンデーションサーバーから最新のチェックインの内容をレビューしてもらいましょう。

とはいえ,この作業には先輩やそのまた上司の理解が必要です。上司に無駄な時間と認識されるとできない作業になるので,そのあたりは中堅社員の力量が試されます。あなたの先輩にその力量があることを願います。なければエクストリームプログラミングの必要性を勉強して,社内に発表しましょう。

どんな感じで実装するのが正しいのか分からない

そんな感じでアプリケーション全体をどう実装するか?ということで参考になるプログラムのサンプルはWeb上にはあまり落ちていません。2015年~2017年にかけても結構探しましたが,特によさそうなものはありませんでした。

ということでみんなどうやって作っているのかなーっと色々調べていると,結局皆さんはオブジェクト指向などを学んで,よりより実装を模索しながら造っているようでした。

オブジェクト指向には原則というものがあり,そのあたりを意識したり,デザインパターンといわれるものを勉強すると,おのずとある一定の法則の元,アプリケーションの作成が行えるようなことがわかりました。

オブジェクト指向とデザインパターンに関しては後述するのでここでは控えます。

C#を勉強する順番!プログラミング初級講座とかいう大手の研修を受けてみたが#1-7

C#を仕事でプロとして使っている割に洗練されたプログラミングをしていないことに気づいていた私。ようするにダメダメプログラマーでした。もっとしっかり学んで,良いプログラミングをしたいと思っていました。そんなとき,会社から大手がやっている初級プログラミング研修を受けさしてもらえることになりました。

プログラミング初級講座

これを受講したときは,オブジェクト指向の知識はまったくなく,完全なる文法プログラマーでした。文法プログラマーとはその名のとおり,C#の文法しか知らないのに,「私,C#できます!」って言ってしまっている状態のことを言います。恥ずかしながら,当時の私は完全にこの文法プログラマーなのに,製品開発をバリバリやっていました。今は見るのも恐ろしいプログラムコードがこの世の中に存在し,お客さんのパソコンで動作しているかと思うと,恐ろしさと申し訳なさでいっぱいです。

文法を教えている

大手の初級プログラミング講習は10万円くらいしたと思います。たしか1日講習なので8時間くらいだったと思います。内容は基本的には文法とかプログラミングの歴史とかでした。文法プログラマーに文法なんて教えたら,今までやってきたことは間違いじゃなかったんだ!って思って,永遠に間違いに気がつかなくなりますよね。恐ろしい話です。

講習の最後の方ではオブジェクト指向の話が出ていました。今思えばこの研修でオブジェクト指向を教えてもらったから,オブジェクト指向の必要性や,自分が求めていた,よりよりプログラミングとは何かが分かった気がします。

クラス,インタフェース

使い方のみ

オブジェクト指向について教えてはくれましたが,基本的には使い方を教えていました。インタフェースはどう使うか?とか、クラスとはどう使うか?など。結局文法プログラマーになってしまう恐れのある教え方だとは思いましたが,使い方が分からないと,何も始まらないので,これはこれでよかったと思います。

効果的な使い方を教えていない

結局効果的な使い方までは教えてはくれませんでした。オブジェクト指向ではありがちなたとえ話だけは印象に残りました。継承は「車」と「トラック」でスーパークラスとサブクラスを表現していたし,インタフェースは再生ボタンで「CD」「DVD」「ハードディスク」のどれが再生されるかは気にせず,再生ボタンが押せる…みたいな例えでした。オブジェクト指向を理解していない人にこういった例えをしても,あまり理解できないものだと思いますが,

10万円の価値があったかは微妙でしたが,オブジェクト指向というものが私のプログラミングを変えてくれるという感じが起こり,私としては非常に意味のある研修でした。高額な研修を受けさせてくれた会社に感謝です。

C#を勉強する順番!良いプログラムとはリーダブルコード?コーディングルールを学ぶ#1-8

C#でよりよいプログラミングをする方法を模索しているときにとある本に出会いました。
その本の名は「リーダブルコード」という本でした。この本のサブタイトルを見た瞬間,より良いプログラミングをするためにはきっとこういう本を読まないといけないのだと思いました。

リーダブルコードの表紙を発見

この本を見つけたとき「これだ!これに違いない!」と思いました。このころ,新入社員も入社してきていた時期でもあり,何かと質問される割に,的確な回答ができない自分が非常に情けなかった時期でした。

「C#でよりよいプログラミングをする方法」というものをとにかく探していました。Webで検索しても「if文の書き方」みたいなものはスグに見つかりますが,より良いコーディングという記事はあまり見つけることができずにいました。

そんな中発見したのがこの「リーダブルコード」でした。

サブタイトル:より良いコードを書くためのシンプルで実践的なテクニック

サブタイトルが「より良いコードを書くためのシンプルで実践的なテクニック」でした。まさにドンピシャの内容ですよね。幸い,値段も2千円台くらいで,技術書としては安い値段でした。この頃はまだ,5千円から1万円程度する本を買いあさる前だったので,本に5千円以上かけるのは勇気のある時期でした。

いまは,5千円以上の本はぜんぜん買うし,奥さんにも「5千円でこの本を書けといわれたら無理なものを,だれかが書いて,たかだか5千円程度で提供してくれる。本てなんてすばらしいの?」という感じの人で,それを聞いてからは確かにそうだなと思い,本当に高めの技術書を買うことにためらわなくなりました。

今はKindleがあるので,さらにためらわずに経った瞬間からスグに読めるので本当にすばらしい時代だと思います。

買ってから一気に読んだリーダブルコード

このリーダブルコードを読んでから一気に読んだことを覚えています。とにかく毎ページ楽しくて,学ぶことの楽しさを感じました。今思えば,内容はプログラム設計の本ではなく,美しいコードの書き方,見やすいコードの書き方という感じの本なので,オブジェクト指向云々という話はほとんど出てきていなかった気がします。

そうは言いつつも,あまり勉強していない私だったので,身になることはたくさんありました。最後のほうにテストコードの話が出てきましたが,知識が乏しかった私は,テストには興味がないといって,そのあたりの章は読み飛ばしていました。なんて恐ろしいことでしょう。今では考えられませんね。今は,テストコードがもっとも大事だと思っていますから。

作法に関して

作法に関して言うと,コーディングルールというような名前の本がC#版とVB版で出ていますね。これはリーズナブルに図書館で借りて読んだ記憶があります。

このコーディングルールを一応一通り読んでおく価値はあると思います。ただ,この本に書いてあることがすべてではないですし,この本を読んだ後は,マイクロソフト直伝の「クラスライブラリ設計」という本を読むことをおすすめします。

この本はマイクロソフトのクラスライブラリーを作っているチームの人が書いているので,C#のクラスを作っている人と,同じコーディングルールで記述できるようになるため,こんな有益なことはありません。

最初の方の章では,大文字小文字の使い分けでアッパーキャメルやキャメルの使い分けや,大文字で記述すべき文字などが整理されています。

その後,クラスやインタフェースの使い方や,例外の使い方が解説されています。

当時の私は,例外とは予期せぬときに発生するもので,できるだけ発生させないようにするものだと思っていました。発生しても,どうやってもみ消すかを考えていました。

しかし,この本を読んで,例外をどのように使うかを学ぶことができました。エラー状態を表現するのはそうなのですが,エラーが発生した瞬間,どこまでさかのぼってthrowしていくかなどが解り,大変勉強になりました。

例外を継承して,InnerExceptionとして扱うなど,考えもしなかった考え方がたくさんありました。

とにかくC#で仕事をするなら全員「クラスライブラリ設計」は必読です。4000円くらいで安いので,いつも手に取れるところにおいておいて,プログラミングする感じがいいと思います。

C#を勉強する順番!第2章 オブジェクト指向との出会い#2-0

オブジェクト指向との出会いってずっと前から出会っていたけど気がつかなかった!

ずっと前から出会っていましたが,見てみぬふりをしていたのか,オブジェクト指向を正面から学んでいませんでした。しかし,リーダブルコードという本を読んでみても,何かしっくりしないものがありました。

C#を学んでいるだけでは突破できない

「C#を学んでいるだけでは突破できない何かがある…」なんとなく私の心の中は,そんな気持ちが芽生えていました。確かにリーダブルコードに書かれていることは有益な内容でした。美しいプログラミングをするための知識がありました。しかし,リーダブルコードは文法的な美しさや,コーディングルール的な美しさがメインで書かれていました。

ボタンクリックイベントの中身をどこか違うクラスに移動してみても,結局書いてある場所が違うだけで,それで何が良くなったのか分からない,というか,何も良くなっていない,もっと言うと,違う場所に書くようにしたために,返って可読性が悪くなってしまっていました。

オブジェクト指向を学ぶことが良いプログラミングであると気づく

どうすればいいのか悩んでいましたが,そんなときに以前の大手で学んだ,オブジェクト指向が頭に浮かびました。C#で美しいコードを書きたかったのだけど,C#なんて言語の概念は一度忘れて,オブジェクト指向言語として捕らえないといけなかったのだと思いました。

とりあえず,オブジェクト指向とは何かをインターネットで調べてみることにしました。以前働いていた職場では,3層構造でプログラミングをしている現場が結構ありました。働いているときは,それにどのような意味があるのかは分からず,そういう決まりなのでそれにならって書いているという感じで働いていました。

この3層構造がオブジェクト指向をつかむヒントになるのではないかと思い,いろいろとインターネットで3層構造に関して探しました。インターネット上には,あまりこの3層構造の概念は無かったように思います。少しは出てきましたが,詳しい解説はありませんでした。

ストラテジーパターンとの出会い

しかし,ひとつ有益な情報を得ました。それは,データ取得部分はDAOパターンを使うということ。DAOパターンはjavaの世界での常識のようでしたが,私にはよく分かりませんでした。私が読んだ記事では,データ取得部分にインタフェースを使用して,ストラテジーパターンにするということ。ストラテジーパターンなんてもちろん知らなかった私でしたが,インタフェースをしようして,インスタンスを差し替え可能にするという概念は,なんとなく理解でき,探していた3層構造のデータ部分に使えると感じました。さらにその記事では,ファクトリーパターンを使用して,必要なインスタンスを生成することを専門にしたクラスを実装することが書かれていました。この考え方は今でも使用している実装方法で,データなど外部との接触部分は「ストラテジーパターン」プラス「ファクトリーパターン」が有効です。

「困ったときは本を読む」ということで,本屋さんに行って,オブジェクト指向に関する本を色々と探しました。独習シリーズのオブジェクト指向という本がありました。そこには3層構造での実装が「java」と「C#」で書かれていました。先輩たちのしていた実装に結構似ていた気がしたので,みんなこれを見て実装していたのかな?と思いました。

それ以外でいうと「コードコンプリート」上下巻あわせると2万円近くしました。内容はリーダブルコードをさらに詳しくした感じに,プログラム設計の要素もある感じの本でした。

あとは,HeadFirstシリーズのオブジェクト指向本などは,漫画みたいな感じで,結構読みやすかったですね。

C#とか関係なく,オブジェクト指向言語として捉える

結局これまでは本屋に行ってもC#の本を買っていましたが,そんな小さな世界ではなく,プログラム設計のお話に目を向けなければならないということにようやく気がつきました。

そういった視線で本屋に行くと,結構設計に関する本が出ています。サンプルコードはほとんどがjavaですが,C#と非常によく似ているため,8割以上はすらすらと読めますね。

先祖であるC++やjavaの本から学ぶことはたくさんありました。

オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな#2-1

「オブジェクト指向って何なんだろう?」

あなたもプログラマーなら一度はこの疑問を持ったことがあるだろう。

オブジェクト指向を学ぶって事はデザインパターンを学ぶって事なんだな…きっと

オブジェクト指向って何?

オブジェクト指向とは何でしょうか?
私が13年ほど前に読んだ「なぜオブジェクト指向で作るのか?」という本にはこう書いてあった。なぜオブジェクト指向で作るのか?の問いに対して,それは「簡単にプログラムを作りたいから」

当時の私はダメダメ文法プログラマーだったため,この言葉の意味はまったく理解できませんでした。しかし今なら分かります。

私も今ならこう答えます。なぜオブジェクト指向で作るのか?それは

  • 「バグの無いプログラムを作りたいから」
  • 「保守性の高いプログラムを作りたいから」
  • 「複雑でないプログラムを作りたいから」

全部同じような意味ですが,前述の「簡単に作りたいから」というのは「再利用」が簡単にできて,修正もしやすいプログラムを作るには,「オブジェクト指向」で作る以外に無い。ということだと思います。

オブジェクト指向でプログラミングをすると,今言っているようなことが実現できます。

しかし,最初の問いにまだ答えられていませんね。
「オブジェクト指向」とは何か?

「人の数だけオブジェクト指向がある」といってしまえばそうなのですが,こんな答えだとなんの解決にもならないのでもう少し具体的に考えましょう。

オブジェクト指向を教えている技術書を紐解けば,オブジェクト指向の原則というものを書かれています。ここではあえて書きませんが,おそらく5つの原則があり,それにそってかかれたものが「オブジェクト指向」であると定義することができます。

一言で言えないところがなんともプログラマー全員の頭を悩ませる原因だと思います。

というわけで,オブジェクト指向が何かを学びたければ,その原則を学べばよいということになります。ちなみに原則とはできるだけそれに従うというイメージのもので,絶対的に破ってはいけないものではありません。

原則を理解しながらも,それ以上に破る有益な理由がある場合は,躊躇せず破りましょう。一番いけないのは,その原則を知らずに破ること。より良い実装がこの世に存在することが知らないことが罪なわけです。

もしあなたが「マイホーム」を建てるなら,知識の豊富な建築家に設計してもらいたいですよね?立地条件や予算,環境,耐震性などをすべて考慮し,海外の設計手法や,日本の昔の設計手法も全部知り尽くしている人が,状況におおじて,ベストな選択をしてくれた家を作ってほしいですよね?

コンクリート打ちっぱなしの家を作ったことしかないので,あなたの家もそれで良いですか?なんていわれたら即刻クビにしますよね?

しかし恐ろしいことに,プログラマーの世界では,それが往々にしてまかり通っています。
「C#の文法しか知らない」のにプログラミングをするというのは,まさにそういう状態です。

if文やfor文は建造物で言うところの釘の打ち方です。それしか知らずに,耐震性の高い家など建てれませんよね?そういうことを知りたければ,設計を学ばないといけません。プログラマーもプログラム設計を学ばないといけません。

その入り口がオブジェクト指向です。これが最強にしてすべてです。

ではどうやってそれを学べばよいのでしょうか?

それは、、、デザインパターンを学ぶことです。

デザインパターン

オブジェクト指向が何たるかを知りたければ,デザインパターンを学びましょう。有名なGOFのデザインパターン本が理解できれば良いですが,あの本は天才4人の本で,私のような凡人には,なかなか理解できませんでした。「メソッドをカプセル化する」という表現がたびたび出てきますが,それを「ストラテジーパターンのようにインタフェースの向こう側に関数を置くことなんだな」と理解できたころ,彼らが何を言っているのかが,スーッと入ってきたのを覚えています。

「メソッドをカプセル化する」がどういう意味かの解説はどこにもないので,彼らの会話のレベルの高さについていけるようになるには,別のデザインパターン本を3冊程度読んでからでないと理解ができないでしょう。

前回も紹介しましたが,HeadFirstシリーズのデザインパターンは漫画みたいな感じでなかなか読みやすいです。あと「オブジェクト指向のこころ」という本も分かりやすかったです。

「オブジェクト指向のこころ」ではデザインパターンを教えながら,オブジェクト指向の原則も教えてくれます。プログラムの骨格部分と,振る舞いの部分と,生成する部分に分けるなど,パワフルな考え方を教えてくれます。

デザインパターンと同じようなジャンルで,リファクタリングというものもありますが,あれは,現状のプログラムの動作を変えないように,よりよい実装に変化させるというものなので,デザインパターンよりは,もう少し小さいスケールだったり,局所的な使い方が多いです。

リファクタリングに関してはまた別の機会に紹介します。

ドメイン駆動開発がオブジェクト指向をうまくコーディネートしていて最強みたい#2-2

オブジェクト指向がよりよりプログラミングをするためには必須の知識であることは,たびたび解説しているとおりですが,オブジェクト指向を学ぶということはデザインパターンを学ぶということと気がつき,いろいろなデザインパターン本を読んでいましたが,そんなときドメイン駆動開発という記事を発見しました。

ドメイン駆動開発

ドメイン駆動開発はオブジェクト指向設計全体を最適化してコーディネートするような考え方で,大変有益な情報であるように思いました。

ファーストクラスコレクション

私の見た記事では,ファーストクラスコレクションが紹介されており,プログラムの中にあるリストをひとつのクラスに抜き出し,リストを操作するためだけのクラスを作るという考え方でした。

要するにprivateでListを宣言することでListをカプセル化し,リストにまつわるエトセトラはすべてこのリストを持つクラスで操作するという考え方でした。

カプセル化という概念をとても洗練した形で具現化しているデザインパターンだと感じました。

さらにその記事の中では,受注明細の合計値を誰が計算する?というような問題提起をしており,結果的に受注クラスの中に受注明細をリストにしたprivate変数を持つのではなく,受注明細というファーストクラスコレクションを作成し,合計値などはその受注明細であるファーストクラスコレクションに処理をさせるという考え方でした。

この考え方には衝撃を受けました。

後は,顧客クラスのようなものに,名称などの項目がある場合に,顧客の上限文字数は誰がチェックする?というような問題提起をされていました。通常は顧客クラスでのチェックを行いがちですが,バリューオブジェクトという考え方を取り入れ,顧客クラスの顧客名称は顧客名称クラスにさせるという,クラスを最小単位で作成する考え方に感銘を受けました。

2人の巨匠の話

その中で2人の巨匠の本を紹介されていたのでスグに私は買いました。
ケントベックの実装パターンという本と,マーチンファウラーのリファクタリングという本でした。実装パターンは廃刊になっていましたが古本で買いました。リファクタリングも当時は廃刊になっていたので1万円というめちゃくちゃ高値でしたが買いました。その後,改版本が5000円くらいで出たのでもったいない気持ちもありましたが,情報を少しでも速く取り入れられたことには,5000円以上の価値はあったと思い,気を取り直しました。

実際にそれは本当にそう思います。どんなに低価格でも,年齢を重ねてから知識を得るよりは,少々高額でも若いうちに知識を得ていたほうが,パワーアップした自分でその後の人生を歩むことができるので,本を読むのは速いに越したことがありません。

ケントベックの実装パターンでは「完全コンストラクタパターン」に感銘を受けました。マーチンファウラーのリファクタリングはテストコードの必要性を教えてくれました。

悪いコードの動作を変えずに,コードだけよりよくすることを「リファクタリング」と読んでいます。リファクタリングの基本は,事前に悪いコードに対してテストコードを記載し,その後コードを書き換えます。常にテストを行い,バグの混入を防ぎながら,既存のコードを改造していくという考え方に衝撃を受けました。

テスト駆動開発との出会い

これまでテストコードを書かずにコーディングしていた自分が恥ずかしくなりました。偉人たちは10年以上前からこんなプログラミングをしていたのか!グーグルもマイクロソフトも頭のいい人が働いていて,こうやってテストコードを書いて,昔からガンガンコーディングをしていたのに,私はテストコードも書かずに,文法プログラミングをしていたかと思うの,情けなく,悲しくなり,今まで書いたコードをすべて書き直したくなりました。

一度リリースしたら,簡単にはコードを書き換えることができないのがこの業界の悲しいところですね。そしていつまでの自分のコードが残っているため,後輩にも昔のコードを見られてしまいます。恐ろしい業界です。

ということで,この段階でドメイン駆動開発に出会うことができましたが,どうやら,ドメイン駆動開発はテスト駆動開発とともに実装する必要があることの気がつきました。結局,オブジェクト指向,デザインパターン,テスト駆動開発,リファクタリング,ドメイン駆動開発の順で学ぶのがよさそうであるとこのころ感じ始めました。

この賢者2人との出会いにより,このころから爆速でドメイン駆動開発に関して学び始めました。学び方はというと,基本的には本を読むことになります。ドメイン駆動の本で言うと,日本語で読めるのは4冊くらいしか出てません。テスト駆動関連の本は結構出ていますが,テスト駆動は実際に実装していく中で体得していくものという感じですね。

C#を勉強する順番!ドメイン駆動開発をするにはテスト駆動開発の知識が必須?#2-3

オブジェクト指向を理解するためにはデザインパタンを学ぶ必要があります。いろいろとデザインパターンの本は出ていますが,有名ものがGOFのデザインパターン本ですね。

ある程度デザインパターンを学ぶとひとつの疑問にぶち当たると思います。

「アプリケーション全体として、これらの知識をどう適応すべきか?」

そうです。デザインパターンは1つ1つが洗練されていてすばらしいプログラム設計のノウハウになっています。しかし,アプリケーションを作るときに,どのように適応するのが正しいデザインパターンの使い方なのかを説明してくれている書籍はあまりありません。

文法の本はifの使い方が書いているだけだし,デザインパターンの本はパターンがそれぞれに書いてあるだけです。オブジェクト指向本も原則が書かれているだけです。

純粋に1つのアプリケーションのサンプルが載っていたり,アプリケーション全体の設計手法を本にしたものはあまりありません。

ドメイン駆動開発の書籍を手にとってもらうと,それらの問いに対する答えがある程度か枯れています。

ドメイン駆動開発は,プログラムの複雑さを取り除き,オブジェクト指向設計を最適化する考え方です。なので,全体の設計というものの指針になります。

ドメイン駆動開発をするにはテスト駆動開発の知識が必須?

ドメイン駆動開発をする上でテスト駆動開発の知識は必須になります。テストコードを書かなくてもドメイン駆動開発のデザインパターンは適応できますが,オブジェクト指向を最適化するという意味からしても,テストコードを先に書き,必要最低限の本番コードを書きながら,テストしやすい構造のプログラミングをするというのは,必須知識となります。

リファクタリングのときもそうですが,プログラムを書く前にテストコードを書くというのは,現代のプログラミングにおいて,必須知識です。

テストコードを書くということは「クライアントコード」を書くということです。使う側がどのように使うかを想定し,「こんな関数を呼び出して,こんな戻り値がほしい」という使う側に最適なテストコードを書くわけです。サービスする側のコードは,その要望にこたえられるように本番コードを実装します。

テストコードを書くことで,プログラム全体が疎結合になります。疎結合とは,プログラムの結びつきのが弱いことを言います。個々のプログラムの結びつきが弱ければ,修正がしやすくなります。ドミノ倒しのストッパーのように,失敗してドミノを倒してしまっても,一定のところで止まります。それがないと,すべてが倒れてしまいます。要するに,プログラムの一部を変更しただけなのに,アプリケーション全体を再テストしないといけなくなります。

疎結合ということは,プログラムを修正しても,影響範囲がどこまで広がるのかが明確になります。ドミノのストッパーまでをテストすれば,あとはテストしなくても問題ないことが分かります。オブジェクト指向でのストッパーはインタフェースという機能が担ってくれます。テスト駆動開発では,インタフェースの使いどころが重要になります。外的要因に振り回されないようにインタフェースを使用して,ドミノのストッパーにしていきます。

外的要因とは,C#アプリケーションの外側の話です。例えば,SQLServerを使っていて,バージョンがあがって,とある関数が使えなくなったとしましょう。SQLServerから流れ込んでくるルートが限定されていれば,そのルートのテストを行えば,それ以外のテストは不要になります。だから,SQLServerと接触するときは必ずインタフェース越しに値を取得する必要があります。

インタフェースってすごく重要だったんだ

テスト駆動開発をすると,このように,オブジェクト指向での実装がすんなり入ってきます。先の例でうまくお伝えできたか分かりませんが,ドミノ倒しのストッパーになるインタフェースが非常重要であることを,私はテスト駆動開発を学んでようやく理解しました。

恥ずかしながら,テスト駆動開発をするまで,インタフェースってなんのためにあるのだろう?if文で分岐すれば別に困らないのになー、、、と本当に恥ずかしいほど無知な考え方をしていました。

今ではインタフェースなしにプログラムをする気にはなりませんし,テストコードを書く上で,インタフェースがないテストコードなどは存在しません。

というわけで,ドメイン駆動開発をする場合も必ずテスト駆動開発の知識が必要となります。その証拠に,ドメイン駆動に関する書籍を読むと,必ずそのうちの1章はテスト駆動開発に関しての記述があります。海外では常識になっていたようですが,日本ではVisualStudioの2008のPro版より標準搭載されたものの,私は,その重要性に気がつかず,2012年まで使用していませんでした。いまでは無料版のVisualStudioでもテストコードが書けるようになっていることからも,プログラミングの世界では常識であり,必須の知識がテスト駆動開発ということになります。あなたの職場でテスト駆動開発を知らない人間がいたら,必要性を教育してあげてください。

C#を勉強する順番!テストコードのないプログラムは全部レガシーコードって呼ぶらしい#2-4

過去の遺産として動作している,古き悪き保守性の悪いプログラムはレガシーコードを言われていますが,何もVB6などで実装されているコードがレガシーコードというわけではありません。

レガシーコード改善ガイド

「レガシーコード改善ガイド」という悪いコードをリファクタリングする技術が書かれている本によれば,「テストコードのないコード」はすべてレガシーコードと呼んでいる。

現代のプログラミング文化では,テストコードのないプログラムは認められていないダメなコードということになる。

すべてのプログラミングをコードはテストコードでカバーし,保守性の高いコードを書かなければなりません。

テストを意識することで,プログラム同士が疎結合になり,保守性が高まります。

例えば

例えばデータベースに接続するようなプログラムを書くとしましょう。そのままデータベースにアクセスしてしまうと,テストコードが書き辛くなります。

なぜ書きづらいのかというと,テストコードというのは基本的にはメモリ上で完結するものをテストするほうが書きやすいものです。「a+b=c」などというコードをテストするのはたやすいですが,指定されたフォルダーの中のファイルを読み込んで処理するとなると,そのファイルを指定したフォルダーに置いておかないといけないし,それがないとテストが通らなくなってしまいます。

だからできるだけメモリ上で完結するようにテストを書くようにする必要があります。

メモリ上でテストを完結するとなると、データベースへのアクセスは非常に厄介なものになります。そういう場合はデータベースと接触する部分にインタフェースを作成し,データベースと接触しないダミーのクラスを別途作成します。これをMock(モック)と呼んでいますが,そういった感じでテストコードを書いていくことで,アプリケーションの内側と外側が意識され,非常に疎結合な保守性の高いプログラミングができるようになります。というわけで,現代社会ではテストコードの技術は必須ということです。

基本的にはリファクタリング

職場にある過去のひどいコード(それは先輩が書いたものかもしれないし,過去のあなたが書いたものかもしれない)の多くはレガシーコードの可能性がありますが,リファクタリングすることでレガシーコードではなくなります。

レガシーコードをなくすためにはテストコードが必要ですが,リファクタリングの作業手順としては,テストコードを先に書いて,現状のダメコードに対して,テストでカバーします。その後リファクタリングでコードを改造していくのですが,最初にこのテストコードがないとバグの混入に気づけないので,最初にテストが必要ということです。

しかし,そもそもダメダメコードなので,ユーザインタフェースにデータベースへのアクセスコードがかかれていたりするため,純粋にテストコードでカバーするというファーストステップから夢が絶たれます。

ダメダメコードにテストコードで事前にカバーするなど到底無理な話だと私は思います。

とはいえ既存のダメコードに触れるときはある程度のリファクタリングが必要です。

ダメコードのリファクタリングの仕方

ダメコードをリファクタリングするにはある程度やり方があります。たいていのダメコードは特性が決まっています。結局VB6や初期VB.NET,C#で書かれたコードはオブジェクト指向の知識がほぼない状態で書かれているコードが多々あるため,画面にゴリゴリとプログラムが書かれていると思います。

ボタンクリックの中、もしくは,ボタンクリックから呼ばれる関数(いずれも画面クラスに書かれているはず)にだらだらと処理が書かれていて,データベースにアクセスして,画面にデータをセットしているか,画面のデータをデータベースに登録しているでしょう。

その中で,データベースにアクセスしているところを見つけましょう。
データベースにアクセスしている箇所にSQLが書かれているのであれば,それらをトランザクション単位で分けていきましょう。

マスター系のデータで1テーブル検索,1テーブル更新の場合はそのマスターテーブル1つが1つのトランザクションとなるので,1つのマスタテーブルを1つのクラスとします。受注と受注明細など,同時に扱うのが当然と思われるものは,それらのトランザクションで1つに扱うので,まとめて1つのクラスにデータベースアクセスクラスとして分けましょう。

SQLを実行する際は,そのトランザクション単位のクラス経由でしかアクセスできないように実装しましょう。

それだけでもだいぶすっきりするはずです。それができたら,画面のロジックをViewとViewModelに分けて,データバインディングで連結しましょう。

テストコードのないプログラムのリファクタリングは怖い

テストコードのないプログラムをリファクタリングをするのは大変に怖いことです。慣れてくれば慣れてくるほど,テストコードのないプログラムを改造することの怖さを感じます。それでも古いダメダメコードは少々テストコードが書けなくても,勇気を出して改造しないといけない場合があります。つらいですが仕方ありません。

我々は,後輩に同じ思いをさせないように,保守性の高いプログラミングをしないといけません。

出来ればすべてゼロから作りたい

古いプログラムを改造する度に,ゼロから新しく作りたいという感情に襲われます。ダメプログラムが過去の自分か書いたもの場合は落ち込みはさらに増します。

その分,今の自分が成長したのだということで,良しとしていますが,そのコードを永遠に後輩にみられるかと思うとヒドイ仕事だと思いますね。ふつうは,過去のダメな時代の仕事ぶりを後輩にみられることはありませんが,プログラミングの仕事は,証拠として残ってしまうので,恥ずかしい思いにされられることがありますね。

今後はそんなことにならないように毎日少しでも勉強していかないといけません。

勉強が乗らないときは?

勉強が乗らないときはありますが,できるだけ毎日勉強したほうがいいと思っています。分厚い500ページくらいの技術書も,一気に読むことはできませんが,一日30ページでも読むことができれば,1か月もあれば読み切ることができます。

私は,1日のうちの9時半から10時半までは技術書を読む時間と決めて,毎日読むようにしました。気分が乗らないときは,1ページでも読もうなどと最初は思っていましたが,それはやめて,気分が乗らないときは「1文字読もう!」と思うようにしています。1文字なら,どんなに疲れていても読めます。そして1文字読むと,10文字くらいは読んでしまいますし,結局は1ページ読んだり,もっと読んだりします。

結局,最初の本を開くまでがエネルギーいるんですよね。

最近はKindle本をお勧めしています。でかい技術書を机に置いて読むのは結構重くて疲れますし,分厚いと読みづらいことが結構あります。

Kindleならブログを読むように読めますし,Kindle本とVisualStudioを画面に並べてサンプルプログラムを打ち込んだりすることもできます。その場合,手はキーボードとマウスのためにふさがるので,腕の下に分厚い参考書を置くのは,少しやりづらいですね。

Kindle本で技術書を買いだしてからは,可能な限りKindleにしています。一部の技術書は紙の本しかないものもあり,そういう時は仕方なく紙の本にしています。

C#を勉強する順番

というわけでいろいろ言ってきましたが,最初の結論を言っていた通り,C#を勉強する順番は次の通りがよいと思います。

  • 基礎文法
  • コーディングルール,各種作法
  • オブジェクト指向
  • デザインパターン
  • テスト駆動開発
  • リファクタリング
  • ドメイン駆動開発

何度も言っていますが,こんな感じです。
以上で第2部終了とします。第1部ではリーダブルコードを読めばよいコードになると思っていたけど,世の中はそんな単純じゃないらしい…ということがわかる第2部でした。

追伸

ここまでご覧いただいた方にだけ、Udemyの「C#でオブジェクト指向をする方法」という、2400円で販売している動画コースを無料でプレゼントします。
ぜひご覧になってみてください。

「C#でオブジェクト指向をする方法」無料クーポン

プロフィール

ピーコックアンダーソン

どうもこんにちは。ピーコックアンダーソンと申します。
20年ほどプログラマーとして活動しています。
初期の頃はいろんな現場を転々とするプログラマーで10年ほど経験をつみ,その後,大手メーカーに入社し,C#やSQLServerを中心とした製品開発にて設計,製作,保守,プロジェクトリーダー等を10年近く担当しています。

知識習得のきっかけは,現場に分かりづらいプログラムコードが散乱しており,それらをわかりやすくするために,オブジェクト指向,ドメイン駆動開発,テスト駆動開発,リファクタリング,デザインパターンの書籍などを読み漁りました。その結果,一つのドメイン駆動開発手法にいまはたどり着き,チームのメンバーに伝えていますが,この知識を大勢の方にお伝えすると,予想以上に喜んで頂けているので,私の学んだ知識をできるだけわかりやすくお伝えして,私のした遠回りをあまりしなくてもいいように,解説していきたいと思っています。