プログラミング初心者が中・上級者になるための近道

      2017/01/21

プログラミング初心者

初心者と中級者、上級者の違いとは何でしょうか?

初心者は
・知識が少ない
・開発したソフトウェアの数が少ない

中級者・上級者はその逆で
・知識が多い
・開発したソフトウェアの数が多い

その結果生まれる実質的な差は、

「初心者は簡単なものしか作れないけど、中級者・上級者は難しいものを作れる」

ということです。ですから、初心者が中上級者になるには難しいソフトウェアを作るのに役立つ知識を身につければ良いわけです!

難しいソフトウェアとは
・ロジックが複雑で難しい
・規模が大きい
・性能要件が厳しい
・納期が短い
など、いろいろな難しさがあります。

これらに対抗するのに必要な知識・技術について紹介します。

規模が大きいソフトウェアを作るための技術

規模が大きいソフトウェアを作るための技術には以下のようなものがあります。

  1. モジュール分割
  2. アプリケーションアーキテクチャ
  3. フレームワーク
  4. プログラミング作法
  5. リファクタリング

1. モジュール分割

規模が大きいソフトウェアを作るためにはモジュールを上手に分割する必要があります。モジュール分割とは簡単に言えば、ソースコードを役割毎に分けて整理することです。

規模が大きいと、上手に分割整理しないとソースコードが管理不能になってしまいます。例えばすべてのソースコードを一つのディレクトリに入れた場合とでは、ソースコードを探す手間が格段に異なります。

ですから、モジュールごとにディレクトリを分けて整理します。では、どのようにモジュール分割すればいいでしょうか?

アプリケーションアーキテクチャを決めればモジュール分割の指針が生まれます。

2. アプリケーションアーキテクチャ

例えば、「MVCアーキテクチャでこのソフトウェアを作る!」と決めたら、この時点でModel、View、Controllerの3つにモジュールを分けることが出来ます。

これらのディレクトリを作成してその中にソースコードを格納するようにすれば、Modelのコードを探す時にはModelディレクトリの中を探せば良くなるので見つけやすくなります。

この3つに分けた中でさらに必要であればディレクトリを掘っていきます。例えばModelディレクトリの中をさらに分類していきます。ブログシステムの場合だったら、Model/UserとかModel/Articleなどと分けていきます。するとソースコードを適切に分割整理することが出来ます。

3. フレームワーク

アプリケーションアーキテクチャを具体的に実装したものがフレームワークです。

例えばRuby On RailsはMVCアーキテクチャを実装したフレームワークです。Ruby On Railsの規則に従ってソフトウェアを開発すれば、自然とMVCアーキテクチャによるモジュール分割が出来ます。


4. プログラミング作法

大規模なソフトウェアを開発するにはたくさんのプログラマーが必要です。プログラムの書き方はプログラマーによって千差万別です。

100人プログラマーがいて100通りの書き方をされた場合、ばらばらの書き方がされてしまって、読みにくく、メンテナンスが大変です。そこで、ソースコードの書き方に対する指針が必要です。その指針となるものがプログラミング作法なのです。

そのものずばりなタイトルの「プログラミング作法」という書籍があります。

C言語で有名なカーニハンとロブパイクの共著です。この本では良いソースコードの3原則として

  • 簡潔性
  • 明瞭性
  • 一般性

を挙げています。

簡潔性 ~コードは重複なく短く書きましょう!

「簡潔性」とはソースコードを出来るだけ短くことです。短く書くために重複したコードを共通化する必要があります。

同じことを何度も書いたらソースコードが長くなってしまうからです。よって、共通化は必須です。

コピペコードを書いていたら簡潔性を満たせません。

明瞭性 ~コードは分かりやすく書きましょう!

「明瞭性」とは、分かりやすさのことです。そのコードが何をしているかが一目でわかるように書かれているコードが明瞭な良いコードです。

明瞭なコードを書くには、名前の付け方が重要です。変数名やメソッド名が適切な名前のコードは一目で何をやっているコードなのかが分かります。

逆に名前の付け方が適切でない場合、いくら読んでも何をやっているコードなのかわからない、あるいは、誤読してしまうことになりがちです。

例1と例2を見比べてください。これらは同じ処理をしています。

例1

例2

例1だと名前の付け方が適切でない為、何をやっているコードなのか分かりにくいですが、例2のように適切な名前が付けられていれば一目で何をやっているかがわかります(価格を合計しています)。

また、例2であればプログラムを読めば、何をやっているかが分かる、つまりコードが意図を語るコードとなっています。このようなコードにはコメントを書く必要がありません。コードが意図を語っているからです。

それに対して例1はコードが意図を語っていません。それを補うためにコメントを書いたとしても、それでは解決にはなりません。コードが意図を語っているかを意識して書くことが大切です。

例えば、以下のようにコメントを書けば、何をやっているコードかを説明することは出来ますが、コメントとコードがかけ離れているため誤解が生まれやすくなっています。それにあとでソースコードを変更した際にコメントを変更し忘れるリスクも生まれます。

このようなコードを書くよりも以下のように名前の付け方を工夫したコードを書けばコメントがなくても意図が伝わります。

コメントがなくてもコードが意図を語る明瞭なコードを書くことが出来るのです!

一般性 ~他人と同じようなコードを書きましょう!

「一般性」とは奇をてらったコードを書かずに一般的なコードを書くというものです。

プログラマーの中には自分の能力の高さをアピールしたいがあまり、わざと難しいコードを書く人がいますが、それはプロジェクトにとってマイナスです。

趣味で一人でコードを書く場合にはそれでもいいのですが、大人数で一つのソフトウェアを開発する場合、仕事が一人では完結せず他人が書いたコードを読む必要があり、その際に、いくら技術的に優れていても難しく多くの人が読み解けないコードはマイナスでしかありません。

なので、コードを書く際には、「一般的にはどうやって書くかな?」ということを意識して書くと良いでしょう。

一番意識しやすいのは名前の付け方です。例えばユーザーのEメールアドレスを格納する変数名を何にするかを考えてみます。

等、人によって変数名の付け方は変わりますが、どれが一番一般的で誤解がないものでしょうか?

emailAddressかemailでしょう。emaのように単語を省略しすぎてしまうと、何の変数なのかがわからなくなってしまいます(本人を除いて)。また、省略の仕方も個人個人で差が生まれやすくなります。よって、単語を省略する際には注意が必要です。省略を絶対にしてはいけないというものではありません。

あまりに長い識別子だとプログラムが読みにくくなってしまいます。変数名の長さはケースバイケースでバランスを考えたうえで一般的で誤解がない名前になっているかを意識すると良いでしょう!

このようなプログラミング作法について書かれた本としては「プログラミング作法」の他に「リーダブルコード」があります。

リーダブルコードはGoogleエンジニアが書いた本です。プログラミング作法はもちろんいい本ですが、出版されてから10年以上経っており、内容が少々古く読みにくさがあるのですが、リーダブルコードはそれよりだいぶ後に書かれた本なので、読みやすい内容となっています。

5. リファクタリング

良いコードを意識して書くことは重要ですが、納期が迫っていて時間に余裕がない時には、良いコードを書くことよりも、早く完成させることが求められる場合があります。

その場合はその場しのぎの汚いコードであっても早くコードを書いた方がいい時もあります。一旦その場しのぎの実装をしておいて、後で時間がある時にコードを分かりやすいものへと書き換えればいいわけです。これを リファクタリングと言います。

また、良いコードを心がけて書いたコードであっても、改修を積み重ねていく内に分かりにくいコードになってしまう場合は多々あります。よってリファクタリングはタイミングを見計らって定期的に行えるといいでしょう。

テストの自動化もセットで取り組もう!

 リファクタリングをしてソースコードをきれいな形に改編したら、そのコードが以前の仕様と同じように動くかテストする必要があります。その時に、手動でテストをしてもいいのですが、プログラムをテストをするプログラムを作っておくと便利です。プログラムをテストをするプログラムを作って実行することを「テストの自動化」と言います。テスト自体をプログラムにやらせるわけです。

テストの自動化をすると

  • テストする手間が減る(プログラムがテストしてくれるから)
  • テストを間違うことがない(プログラムがテストするからテストの手順を間違えることがない)

というメリットがあります。

ロジックが複雑で難しいソフトウェアを作るための技術

以下のようなものがあります。

  1. 関心毎の分離
  2. デバッガ
  3. ログ出力

1. 関心毎の分離

人間が一度に考えられることには限界があります。複雑なロジックの場合、考えなければならないことが多すぎるので、それらを関心毎の単位で分離していく適切な大きさに分割することができます。

例えば、以下のようなユーザー登録のコードがあるとします。

このコードは関心事が分離されていません。

コードを読み解くと内容は以下の3種類に分類できます。

  • 入力チェック
  • DBアクセス
  • 画面表示

それらが分離されず一体になっています。今回はメソッドに切り出して関心事を分離してみます(クラスを分けるやり方もあります)。

このように関心事を分離すると、ソースコードが読みやすく理解しやすくなるし、実装する時にも分離した小さい単位のロジックに集中できるため、コードを書きやすくなります。

複雑で難解なロジックも関心事の単位に分離していけば、最終的には、小さい簡単なロジックの集まりとなります。そこまで分離していけば、後はその一つ一つの小さくて簡単なロジックを実装していけばいいだけです。

2. デバッガ

プログラムを書いて動かしたら、思った通りに動かないということはよくあります。その場合、デバッガを使います。大抵のIDEにはデバッガがついていてソースコードの指定した位置にブレークポイントを張ることができます。ブレークポイントとはプログラムを途中で止める位置(コードの行番号)のことです。

ブレークポイントを張った状態でプログラムを実行するとブレークポイントを張ったコードの行でプログラムを一時停止することが出来ます。一時停止した状態でその時の変数の値を確認することが出来ます。

また、ブレークポイントで止めた位置から一行ずつコードを実行することも出来ます。なので、プログラムの挙動を一つ一つ確かめることが出来ます。一行ずつ実行することが出来ることはメリットでもありますが、時間が掛かります。例えば1万回のループを一行ずつステップ実行したらむちゃくちゃ時間が掛かってしまいます。そこで次に紹介するログ出力の手法が役に立ちます。

3. ログ出力

ログ出力とは変数の値を確認したい箇所にその変数を出力するログ出力命令を書くことによって、プログラムの挙動を確認する方法です。

例えばこんな感じのコードです。

・元コード

・ログ埋め込み後

ログ出力させているコードはこの部分です↓
logger.info(i + "見目のデータ price=" + result.price);
配列のインデックス番号とデータの中身を出力させています。

ログ出力のいいところは結果の確認が早いことです。この例でいうとresults配列の個数が1万件あったとしてもプログラムの実行は一瞬です。実行後、出力されたログを確認すればいいわけです。実行も確認も早くできるのですが、デメリットもあります。

それは、いちいちログ出力のコードを書かなければならないということです。どこにログ出力を入れてどの情報を出力させるかは自分で決めなければなりません。無意味な場所にログを仕込んでも問題は解決できません。

そのため、どこにログを仕込めばいいかが分からないくらい、コードの動きが把握できていない場合はデバッガを使った方が良いでしょう。また、見たい情報の項目が多い場合、ログにも出力項目をたくさん書かなければなりません。この場合もデバッガの方がいいでしょう。

まとめると以下のようになります。

デバッガを使うべき時 ログ出力を使うべき時
見たい情報が決まっていない時にも使える 見たい情報が決まっている時
見たい情報の項目数が多い時 見たい情報の項目数が少ない時
回数の多いループの中は見ない時 回数の多いループの中を見たい時

状況に応じて使い分けるのがいいでしょう!

性能要件の厳しいソフトウェアを開発する技術

性能要件が厳しい場合に役立つ技術には以下のようなものがあります。

  1. アルゴリズム
  2. 並列化

1. アルゴリズム

性能の良さというのは2つの尺度があります。

A. 使用するメモリー量が出来るだけ少ないこと
B. 出来るだけ短い時間で処理が完了すること

性能を測る尺度としてオーダーという概念があります。

オーダーとは解に達するまでに必要な操作回数のことを言います。

たとえばデータ探索のアルゴリズムの場合、前から順番に辿っていく線形探索の場合オーダーはn回です。これをO(n)と書きます。nは要素の個数です。これは要素の個数が増えると計算量も比例して上がっていくので大量個数を処理する場合、計算量が
思いっきり上がってしまうため良い性能が出ません。

それに対して二分探索の場合、O(log2n乗)なので、要素数が増えても計算量はそれほど上がりません。

アルゴリズムによってオーダーや使用するメモリー量の特性が分かるので、システムの性能要件に合ったアルゴリズムを選択すると良いでしょう!

2. 並列化

いくら速いアルゴリズムを選択したとしても、一台のコンピュータで出来ることは限られています。一台のコンピュータでは求められる性能が出せない場合も処理を分散して並列に処理することが出来れば、求められる性能を出すことが出来る場合があります。

また、最近のCPUはCPUコア一つにおける性能が限界に達していて、コアを複数にすることで性能向上させています。マルチコアCPUの性能を引き出す時にも処理をコアごとに分散して並列処理させる必要があります。よって、現代のプログラマーにとって、並列化は重要な課題です。

マルチコアについてはコードの未来という書籍でRuby開発者のまつもとゆきひろさんがとてもおもしろいことを書いていました。

  • 今までは一度ソフトウェアを作って数年たったらCPUの性能が上がって何もしなくてもソフトウェアの実行速度は勝手に上がった。つまりフリーランチがあった(プログラムを改善しなくてもハードウェアの力で性能が上がったという意味)
  • 現在はCPUの1コア単体の性能向上が限界に達したため、マルチコア化して性能向上させるようになった。
  • そのため、ソフトウェアがマルチコアを活かすように作っていないとCPUが性能アップしてもソフトウェアの性能が向上しない。つまりフリーランチはなくなった

っという話です。とても楽しく読めて、勉強になった本なのでおすすめです。

納期が短いソフトウェアを開発する技術

納期が短いソフトウェアを開発するには生産性を高める必要があります。生産性を高める技術として以下のようなものがあります。

  1. 抽象度の高いプログラミング言語
  2. IDE

1. 抽象度の高いプログラミング言語

例えばある数値配列の中から値が4以上の要素を集めるという処理を書く場合(v7までの)Javaで書くと

となるのがRubyなら

で済みます。
Javaだと7行必要な処理がRubyだと2行で書けています。

Javaもバージョン8からストリームAPIというものが実装されてRubyに近い書き方が出来るようになったので、以前よりは簡潔に書けるようになりました。

言語によって、1行で書ける処理の量が大きく違います。少ない行数でたくさんのことが出来る言語を選んだ方が当然生産性は上がります。

一度覚えた言語をずっと使い続けて極めるのも良いですが、他により良い言語はないかに関心を払って良いものを見つけたら、積極的に使っていくといいでしょう!

2. IDE

IDE(統合開発環境)とはエディタやコンパイラなどの開発に必要なものを統合し使いやすくして提供されたツールのことです。
有名なものだとEclipseやVisualStudioといったものがあります。

IDEに付属しているエディタを使うとコード入力の支援を受けられます。
例えば、Eclipseで
String.
と打つとStringクラスが持っているメソッドやフィールドが一覧表示されます。一覧から呼び出したいメソッドを選択すると、そのメソッドがコードに足されます。なので、クラスのメンバーを暗記しなくても済みますし、コードをタイプする手間が省けます。
このようなプログラマーを支援する機能がIDEにはたくさん備わっています。しかもIDEはどんどん進化していて、以前ならば自分の手で打ち込んでいたコードがどんどん自動入力されるようになっています。

また、IDEによって、実装されてる機能は異なるので、言語同様、慣れているものばかりずっと使うのではなく、より良いものはないか探して、良いと思ったものを積極的に使っていくと良いでしょう!

一つ一つ取り組めば、それほど難しくない!

いろいろと紹介しましたが、どれも一つ一つはそれほど難しいものではなく、やっていけばマスターできるものばかりです。それらを一つ一つ取り組んでいったら、ある時、自分も上級者になっていたというものなんだと思います。ってなわけで、紹介したものの中に知らないものがあった人はぜひ取り入れてみてください!

っで、「この記事書いてるお前は中上級者なのか?」ってつっこまれそうですが、私自身はITエンジニア10年以上やってるので少なくとも中級者以上だということにさせてください!

10年程、業務システム開発をやってきたんですけど、その後Webサービス、ゲーム開発の仕事へと転身することができました。スキルを他分野に応用できたのですから、上級者だと言っていいですよね?

それで思い切って転職してみたら、「やっぱり自分が興味ある仕事をするのが一番だな!」と実感してます。毎日が新鮮で楽しくなりました!

ですから、使ってみたい技術があるんだけど、今の会社ではそれが出来ないという方はぜひ転職にチャレンジしてみてください。きっと、やりたい仕事ができる会社が見つかると思います!

転職はやってみると思ってたより簡単!

私自身3回ほど転職してるんですが、思ってたより簡単で、転職エージェントを使ったらあっという間でした。

エージェントが応募先候補の選出から、面接の日程調整までやってくれるので、こちらから動かなくても半分くらい自動的に進む感じで楽でした。しかも今は好景気で売り手市場なので転職するのにちょうど良い時期です。

レバテックキャリアっていうエージェントがおすすめです。

このサービスを運営しているレバレジーズという会社はシステム開発もやっているので、現場の仕事をよくわかってくれてますし、ヒカ☆ラボというIT系の勉強会なども主催していたりteratailというプログラマー専用の質問サイトを運営してて好感が持てます。求人案件もWebやスマホの面白い仕事が多いのでいいと思います。

あとホームページ見ると分かるんですが、若くて美人の担当者が多いのもナイスなんです!私の場合(たぶんあなたも)、担当者が美人だと転職活動のモチベーションめちゃ上がりますからね笑

なので、レバテックキャリアのホームページ見てみてください。「ホントだ、美人じゃん♪」ってきっと思うはずです笑

地方在住や、エンジニア未経験の人にも使える転職エージェントがある!

レバテックキャリアは東京・大阪近郊のエンジニア経験者向けサービスなので、地方在住の方や、エンジニアの仕事が未経験の方には、DODAがおすすめです。

未経験の人はサポート対象外のエージェントが多いんですけど、DODAは未経験者の転職も支援してくれます。以前エンジニア未経験の友達にDODAを教えてあげた所、ちゃんと登録できて未経験可の求人を紹介してもらえました。未経験の人こそエージェントから職務経歴書の作り方や面接の仕方のレクチャーを受けた方がずっとうまくいくと思います。

DODAは全国に拠点があるので地方在住の方もご利用いただけます。

人脈がなくてもフリーランスになれる!

フリーランスになりたい方にはギークスジョブがおすすめです。人脈がなくてもギークスジョブに登録するだけで案件を紹介してもらえます。案件の希望(どんな技術を使っているか、残業が少ないこと)等も聞いてくれるので、やりたい仕事が出来ます。対象地域は東京・大阪・名古屋・福岡近郊です。

「派遣社員」なら正社員とフリーランスのいいどこ取り!

フリーランスになりたいけど、確定申告とかめんどくさいなという方には派遣社員がおすすめです。

派遣ってネガティブなイメージありますが、ITエンジニアの派遣社員ならやりたい仕事を選べて、給料も悪くないですし、確定申告や年金、健康保険も派遣会社が入ってくれるのでいいと思います。

私の先輩でフリーランスになった後、派遣社員になった人がいるんですが「自由かつ煩わしい手続きがなくて最高」って言ってました!パーソルテクノロジースタッフに登録するだけで簡単に派遣社員になれます。

私(やまろう)への相談メールも募集中

転職や仕事術、勉強法等について質問や相談がありましたら、以下のメールフォームからぜひご連絡ください。
経験者から見れば簡単に解決できる相談って多いのでお気軽にどうぞ!こう書いてもなかなかメールくれる人って少ないのでホント気軽にメールしてくれると嬉しいです。

メールアドレス (必須)

相談内容

たまに間違ったメールアドレスを入力されていて返信できない場合があります。一週間経っても返信がない場合、メールアドレスを確認の上、再度送信をお願いします。

エージェントを使った方が転職活動は楽です

東京・大阪近郊のイケてるIT企業に転職したい人には『レバテックキャリア』

 東京・大阪近郊のエンジニア経験者向け転職サービスです。

このサービスを運営しているレバレジーズという会社はシステム開発もやっているので、現場の仕事をよくわかってくれてますし、ヒカ☆ラボというIT系の勉強会なども主催していたりteratailというプログラマー専用の質問サイトを運営してて好感が持てます。求人案件もWebやスマホの面白い仕事が多いのでいいと思います。

あとホームページ見ると分かるんですが、若くて美人の担当者が多いのもナイスなんです!私の場合(たぶんあなたも)、担当者が美人だと転職活動のモチベーションめちゃ上がりますからね笑

エンジニア未経験の方や地方在住の方にはDODAというエージェントをおすすめします。

エンジニア未経験の方や地方在住の方には『DODA』

全国の求人を扱っていて、しかもITエンジニア未経験の人にも転職支援をしてくれるエージェントです。

未経験の人はサポート対象外のエージェントが多い中、DODAは未経験者を支援し転職を成功させています。未経験の方こそエージェントから職務経歴書の作り方や面接の仕方のレクチャーを受けた方がずっとうまくいきます。

フリーランスになりたい人には『ギークスジョブ』

フリーランスエンジニアになるには人脈が必要と思われがちですが、ギークスジョブに登録して希望条件を伝えれば、自分に合った案件を紹介してもらえるんですよ!思ってるより全然簡単にフリーランスってなれるもんなんです。

東京・大阪・名古屋・福岡の案件を紹介してもらえます。

 - 勉強法