新人プログラマの時に知っておきたかった1年目に本当に勉強すべきこと
MMMサーバサイドエンジニアの柳沼です。お世話になっております。
今日は新人プログラマのときに知っておきたかったシリーズ第2弾です。
1弾はこちらを御覧ください。
はじめに
筆者は2年目のエンジニアです。最近仕事をしていて、こういうことはもっと早くから勉強しておくべきだったな〜と思うことがよくあったので、それについてまとめてみます。読者は、新卒エンジニアを想定しています。技術書も併せて紹介するので、読みましょう。技術書最高!
エンジニアが身につけるべき技術についての基本的な考え方
自分が身につけるべき知識がなにかを知るためには、次のように考えてみてください。
「低レイヤーの知識から身につける」
技術には、レイヤーがあります。例えば、Webアプリケーションはサーバの上にあります。ユーザは、インターネット経由でサーバに接続します。この例で言えば、レイヤーは上から アプリ -> サーバ -> インターネット になります。
何故下から勉強するか?
低レイヤーの知識は「汎用的」だからです。エンジニアは、短期間でたくさんのプロジェクトに関わることが珍しくありません。一生懸命勉強したRubyの知識は、次のプロジェクトでは役に立たないかもしれません。
しかし、低レイヤーの技術の知識はどこに行っても使います。どこに行っても使える技術から身につけるほうが、順番的に正しいです。
1.ネットワーク
ネットワークはどんなプロジェクトでも確実に出てきます。IPアドレス、サブネットマスク、CIDRなどの概念は、とっつきにくくて曖昧な知識のまま時間が経過しがちです。また、経験上、先輩はこのへんの基礎知識について、「知ってる前提で話しかけてきがち」です。
とりあえず、「IPアドレス」「ポート番号」「DHCP」「DNS」「グローバルアドレスとプライベートアドレス」あたりはおさえましょう。その後は、「HTTPとHTTPS」「SSHとは」あたりも勉強すると良いです。SIer系なら「FTP」「LDAP」とかも使うかなあ…
こちらは、マスタリングTCP/IPで勉強しましょう。非常に有名な本です。
2.データベース
データベースを使わないアプリケーションは今ほとんどありません。データベースと一言で言っても、MySQL、Oracle、SQL Serverなどいろいろあるので、汎用的な知識を身に着けましょう。
SQLの書き方は、書いてれば覚えるので大丈夫です。それよりも、
「インデックス」「キー(プライマリキー、複合キー、外部キーなど)」「トランザクション」「トランザクション分離レベル」「実行計画」などについて勉強しましょう。この辺がわかっていないと、データベース設計ができませんし、パフォーマンスチューニングもできません。致命的です。
こちらは、理論から学ぶデータベース実践入門が良書です。余裕があればSQLアンチパターンも読みましょう。
3.UNIX(Linux)
アプリケーション開発はWindowsやMacを使用するかもしれませんが、
最終的にデプロイする先のサーバのOSについても勉強しておきましょう。
基礎的なコマンドは使いこなせないと、黒い画面の前で固まってしまいます。
アプリケーションのデプロイ作業や、障害時のログ調査もサーバに入って
行うことになると思います。
こちらについては、自前のマシンに構築してみるのが一番いいです。
書籍では新しいLinuxの教科書が良書です。
サーバという視点では、サーバ/インフラを支える技術が間違いないです。
「シェルスクリプト」「bash/tsh/zsh」「シェル芸」などはまだわからなくて大丈夫です。
4.オブジェクト指向
オブジェクト指向の考え方は、JavaやRubyのエンジニアはもちろん、オブジェクト指向言語以外を使うエンジニアも勉強すると良いと思います。
基本的な文法は書いてるうちに覚えますが、根本にある考え方を学ばないと正しいプログラムは書けません。プログラムは、大きいものだと数年かけて作っていたものがめちゃくちゃになったりするので、うまく設計しないと本当に辛くなります。頑張りましょう。
個人的な考えですが、オブジェクト指向の解説はネットに非常に多くあるものの、本当にわかりやすいもの、正しいものは非常に少ないです。一番いい方法として、熟練者の書いたプログラムを読んでみるほうが理解が早いです。Javaのソースコードを読んでみたりしてみてください。
入門としては、オブジェクト指向でなぜつくるのかが良いでしょう。
より高度な内容としては、オブジェクト指向入門が非常に良い本です。最高に分厚く、難しいですが、この本を理解できればもうオブジェクト指向はOK、というくらいの名著です。
5.システムパフォーマンス
遅いシステムは本当につらいです。開発効率も悪くなります。パフォーマンスチューニングではどうにもならない問題もありますが、どうにかなることは多いです。
チューニングは、本当にコンピューターのことを理解してないとどうにもできないことが多いです。しかし基礎として、「キャッシュの使い方」「データベースチューニング」の基礎は知っておきましょう。
とりあえず、「計測して」「ボトルネックを見つけて」「改善する」の考え方ができれば大丈夫です。あとはツールの問題なので。
ちょっと内容は難しいですが、詳解 システム・パフォーマンスはおすすめです。ISUCONの解説ブログなどを読むのもいいと思います。
最後に
これらは筆者の実体験に基づいて「これをやっとけばよかったな〜」というものです。
小手先のテクニックよりも、しっかりとした基礎を身に着けて、一流のエンジニアになりましょう!