2014年6月27日
すべてのプログラマが読むべき記事10選
(2014-05-13)by Javin Paul
本記事は、原著者の許諾のもとに翻訳・掲載しております。
Javaプログラマやソフトウェア開発者として、私は「プログラマが知っておくべき…」というタイトルが付く記事から、多くのことを学びました。そういった記事は、特定のトピックに関する有益かつ詳細な情報を数多く与えてくれましたが、探し出すのが非常に困難でもあったのです。知識を探求する中でとても役に立つ記事を見つけたら、参考として何度も読み返せるようにブックマークしてきました。こういった記事を読むことは、どのプログラマにとっても有益になると思うので、私が集めた「 すべてのプログラマが知っておくべきこと 」を皆さんと共有する為にこれを書きました。
ここで紹介する記事は私が個人的にブックマークしたものです。「メモリ」、「Unicode」、「浮動小数点演算」、「ネットワーキング」、「オブジェクト指向設計」、「時刻」、「URLエンコード」、「文字列」などといった代表的なトピックについて載っています。このリストは、実用的な知識のない初心者や、新しくこの世界に入った人にとってはとても重要です。記事のほとんどが実用的な知識を基に書かれているので、初心者や中級のプログラマも多くのことを学べるでしょう。また、早いうちから基礎となる知識を身に付けることができれば、これまでに他のプログラマやソフトウェア開発者が学習の中でやってしまったミスを事前に防ぐことにもなります。記事を一度読んだだけでは、すべての知識を身に付けることはできません。浮動小数点数の細かい部分が理解できなかったり、メモリの複雑さに混乱したりするでしょう。しかし、こういったリストを手近なところに置き、状況に応じて参考にすることは大切です。
すばらしい記事の数々を楽しんでください。これらがあなたの役に立つことを祈ります。それと、まだリストに入っていない「プログラマが知っておくべきこと」についての記事があれば、その情報の共有もお忘れなく。
すべてのプログラマがメモリについて知っておくべきこと
これはメモリに関する有名な記事のひとつです。古いもの、新しいもの。すでに知られているもの、まだ知られていないもの。あらゆるメモリの情報が載っています。
プログラミングの世界では様々な分野に関わってくるものですが、すべてのプログラマがメモリに関して十分な知識を持っているというわけではありません。現代のシステムにおいてメモリの知識は、高性能アプリケーションを記述する場合には、より重要になりました。ハードウェアの設計者たちは、より高度なメモリ処理や、CPUのキャッシュといった高速化技術を考え出してきましたが、プログラマの助けなしでは最適な動作をさせることはできません。私は今でも繰り返し読んでいますが、この記事からRAMやL1キャッシュ、L2キャッシュ、異なる種類のメモリ、ダイレクトメモリアクセス、メモリコントローラの設計、それに一般的なメモリに関する知識について、どれだけ多くのことを学んだかしれません。実務の経験値に関係なく、プログラマなら必読の記事なのです。
すべてのコンピュータ・サイエンティストが浮動小数点演算について知っておくべきこと
(訳注: 翻訳は 西村恕彦氏訳 と サン・マイクロシステムズ株式会社訳 があるようです。 @t_nissieさん ありがとうございます!)
浮動小数点演算は厄介で複雑な分野なので、これを習得するのは困難です。多くのJavaプログラマは、float型の値やdouble型の値を==演算子で比較する際に起こり得る間違いについて理解していません。float型やdouble型で通貨の計算をすると、私たちはたびたびミスを犯します。この記事は、この一連の計算について書かれた貴重なもので、ソフトウェア開発者やプログラマならば必ず読むべきでしょう。経験を積んでいくと、共通の知識を細部まで理解していることを求められますが、浮動小数点演算もその一つです。Java開発の上級者ならば、float型、double型、またはBigDecimalクラスを使った通貨の計算の方法や、浮動小数点数を丸める方法などを知っておく必要があります。すでに演算の基本を理解している人でも、この記事を読めば、また新たな知識を得ることができるでしょう。
すべての開発者がUnicodeについて知っておくべきこと
文字エンコードもまた、多くのプログラマが苦戦する分野です。「The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)」は、そんな学習の手助けをしてくれます。これは記事のタイトルの全文です。プログラマ向けのQ&AサイトStack Overflowの開設者の一人、ジョエル・スポルスキによって書かれました。ジョエルがこの記事を書いたのはもう10年以上も前になりますが、現在のウェブ開発にも関連する有意義な内容です。
「Unicodeとは何か」、「文字エンコードとは何か」、「バイトでどのように文字を表現するのか」などといった、多くのことを教えてくれます。この記事のすばらしい点の1つは、分かりやすい言葉と話の流れで、Unicodeの知識がゼロだとしても、ちゃんと内容についていくことができます。プログラマ、コード記述者、ソフトウェア技術者は必読です。
すべてのプログラマが時刻について知っておくべきこと
日付と時刻というのは文字エンコードとはまた別の分野で、私を含め多くのプログラマが苦労するところです。ベテランの開発者でもGMTとUTCと夏時間で混乱しますし、うるう秒が分からなくなったりします。率直に言って、まったくミスなくタイムゾーンを扱って、さらに夏時間を加算してそれを反映するという作業は簡単ではありません。試行錯誤したところで事態は悪化するだけです。手当たり次第に試しても問題は解決しませんから。間違った方向に進む可能性は大いにあるし、誤解されていることも同じくらい多いのです。「日付にはタイムゾーンが含まれるか」とか、「UNIX時間を他のタイムゾーンに変換するには」とか考えると、混乱して頭がクラクラしてきますね。時刻の同期や遅れのことは忘れましょう。このすばらしい記事を読むことで皆さんの持っている時刻についての誤解がなくなり、しっかりした知識の基礎を築けることを願っています。
すべてのWeb開発者がURLエンコードについて知っておくべきこと
この記事は統一資源ロケータ(URL)のエンコードについて述べています。よくある誤解を紹介し、次にHTTPのURLエンコードについて分かりやすく解説し、それから頻発する問題とその解決方法を提示しています。この記事はどのプログラム言語に特化したものでもありませんが、Javaで起こる問題を例に挙げて説明し、最後にJavaや複数のレベルのWebアプリケーションで起こるURLエンコードの問題を修正する方法を解説しています。URLの文法の基礎や、HTTPやその他のプロトコルにおける一般的なURLの構文について学べます。またこの記事ではURLで陥りやすい落とし穴についても述べています。例えば文字エンコードや、URLの別の部分にある予約文字、URLのエンコードとデコードの問題です。Javaプログラマの方は、Javaのアプリケーションでの正しいURLの扱い方や、URLを構築してApache commonsのHTTPクライアントライブラリを使う方法も学べます。最後にURLを扱う場合の重要事項が紹介されていて、例えばURLを構築する時はエンコードするようにとか、UrlRewriteFilterが正しく機能しているかを確認するようにとか、他にも情報が盛りだくさんです。要するに、Web開発者やWebプログラマにとって必読の記事だということです。
すべてのプログラマがWeb開発について知っておくべきことは?
これはプログラマ同士の情報交換の場に寄せられた面白い記事です。プログラマがWebアプリケーションの技術的な詳細部分を実装しようとする場合、そのサイトを公開する前に考えるべきことが書かれています。「インターフェース設計」、「ユーザエクスペリエンス」、「セキュリティ」、「Web標準」、「パフォーマンス」、「検索エンジン最適化(SEO)」、関連技術や、他にも重要なリソースが載っています。インターネットに大きく依存した今の世の中ではプログラマも自分のサイトを持っていますから、ブログはすごく一般的なものになっていますね。この記事から得た情報は仕事だけでなく個人的なブログなどにも役立つでしょう。Web開発のカギとなる技術についての情報が満載で、例えばHTTP、HTML、XML、CSS、JavaScript、ブラウザの互換性、ロード時間の短縮、XMLサイトマップ、W3Cの仕様書への準拠のことなど、他にも様々なことが学べます。
すべてのプログラマがSEOについて知っておくべきこと
これはまた別の記事ですが、こちらもWeb開発者、プログラマ、ブロガーにはとても重要なことが書いてあります。多くのプログラマが自分のブログを持っていますし、SEOは無視できません。Googleで自分のコンテンツを見つけてもらい、他のプログラマに何かを発信するには、検索エンジン最適化の基礎を学んでおくことがとても大切です。ネット社会でどの会社もWebサイトを持っている時代ですから、SEOの重要性はさらに増してきています。立ち上げたスタートアップ企業で製品を売るなら、SEOを考えるのは必須です。どのプログラマもそうですが、特にWeb開発者にとっては、この記事から得るものがとても大きいと思います。覚えておいてください。検索エンジン最適化は日々変化していく壮大なテーマです。そしてGoogle、Yahoo、その他の検索エンジン、それぞれで最適化の方法も変わってきます。SEOをマスターするには、常に自分の知識をアップデートしていくことが必要です。
すべてのCプログラマが未定義の動作について知っておくべきこと#1/3
C言語には、「未定義の動作」という概念があります。未定義の動作は様々なニュアンスを含み、広い意味合いを持っています。Javaには未定義な動作が少なく、あまり混乱がなく安定していて安心です。これが、私がJavaを好む理由の1つです。C言語では一見正しく見えるコードが実は未定義の動作を含んでいることも多く、これがプログラムのバグの原因になっていることがよくあります。さらにC言語では、未定義の動作が処理系(コンパイラやランタイム)に、ハードディスクの初期化やまったく予期しないこと、もっと悪いことをするコードを生成させることもあるのです。このすばらしい記事を読んで、未定義の動作についてぜひ深く探求してください。
すべてのプログラマがネットワークについて知っておくべきこと
記事の冒頭にこうあります。「あなたがプログラマだとして、マルチプレーヤーゲームがどう機能するか疑問に思ったことはありますか? 2名以上のプレーヤーが同一の仮想世界に実際に一緒に存在するかのようにネットワーク上で一貫した経験を共有するのは、はたから見ると魔法のようです。しかし、私たちプログラマは、裏で実際に起こっていることは人々が目にするものとまったく異なることを知っています。すべて錯覚だということが分かっています」これはゲームプログラマ向けに書かれたネットワーキングに関する非常に面白い記事ですが、すべてのプログラマや開発者にも役に立つ内容です。
すべてのJava開発者が文字列について知っておくべきこと
これはjava.lang.Stringに関する私の記事で、Javaプログラマが知っておくべきだと私が個人的に思っていることが書かれています。文字列は日々のJavaプログラミングで非常に重要なので、Java開発者は文字列を熟知していなくてはなりません。この記事では、文字列プールや文字列リテラル、==とequals()を使った文字列の比較、バイト配列から文字列への変換、文字列が不変な理由、適切な文字列連結など、文字列に関する多くの重要な分野について触れています。上級プログラマは、すでにすべて知っているかもしれませんが、これらを復習するいい機会です。
すべてのプログラマがセキュリティについて知っておくべきことは?
これはコンピュータプログラミングの学生がStack Overflowで投げかけていた質問です。OSやアルゴリズム、データ構造、コンピュータアーキテクチャといった一般的なプログラミングの概念に関して多くを学ぶのと同じように、セキュリティについて知ることも重要です。セキュリティは、暗号化や復号から、SSL、Webセキュリティ、難読化、認証、オーソリゼーションに至るまで、幅広い内容を含むトピックですが、すべてのプログラマは最低限の基礎知識を持っておく必要があります。私自身は仕事を始めた時、セキュリティについてよく知りませんでした。サーブレット/JSPベースのJava Webアプリケーションを書き始めてから、Webセキュリティや、「SQLインジェクション」、「DoS攻撃」、「XMLインジェクション」、「クロスサイトスクリプティング」といったセキュリティ脅威について知りました。Java開発者として、今はFortifyやPMP、他の静的コード解析提供者から提供された安全なJavaコーディングプラクティスに従っています。この記事にはセキュリティに関するトピックやリンクがよく集められているので、コーディングをするかどうかにかかわらず、この記事は役に立つでしょう。
すべてのプログラマが知っておくべきレイテンシの数値
この記事はおまけですが、すべてのプログラマが読むべきです。JavaやC++といったプログラミング言語で高性能アプリケーションを記述するためには基本的なレイテンシの数値を知っておく必要があります。メモリ、L1キャッシュ、L2キャッシュ、SSDでのランダムリード、ディスクから変数を読み取るのにかかる時間や、ミューテックスでロックやロックの解除にかかる時間、データパケットをひとつの都市から別の都市へ送ったり、同じデータセンターで往復させたりするのにかかる時間です。これらのレイテンシの数値はプログラミング言語に依存せず、開発者が高頻度で低遅延のアプリケーションを記述しなければならない場合に核となる知識の一部です。この記事のいいところは、これらのレイテンシの数値が長年にわたってどのように進化してきたかについて比較分析もしてくれている点です。2006年のレイテンシの数値が現在どうなっているかが分かります。
すべてのプログラマが読むべき記事のリスト は以上です。「すべてのプログラマまたは開発者が知っておくべきこと」というタイトルが付いた記事を読むと、特定のトピックに関する深い知識を得られます。はっきり言って、プログラマには学ぶべきことが非常にたくさんあり、Javaのようなプログラミング言語の学習は氷山の一角にすぎませんが、私たちの多くは学ぶことに情熱を持っていますよね。プログラミングはやりがいのある仕事で、仕事を始めてからずっと役に立ってきたのは、「メモリ」、「Unicode」、「浮動小数点数」、「時刻」、「セキュリティ」といった基礎知識だけで、あらゆるプログラマにとって非常に重要です。Java文字列に関する私の記事や「すべてのCプログラマが未定義の動作について知っておくべきこと」のように特定のプログラミング言語に関する記事も少しありますが、それらも多くの初心者や開発者の学習に役立つでしょう。
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa