94-リンカは魔法のプログラムではない

プログラマが知るべき97のこと」の94個目のエピソードは、リンカに関する話です。最近はJavaを初めとしてコンパイルは行われてもモジュール(ライブラリ)は動的に解決されたり、スクリプト言語のようにそもそも動的に実行される言語が多くをしめており、リンカと聞いても教科書レベルの知識しか持ち合わせていないプログラマは増えていると思います。

コンパイルが必要な言語においては、ソースコードを静的にリンクされた実行ファイルに変換するプロセスが発生します。愕然とするのは、そのプロセスについてごく浅い知識しか持っていないプログラマが意外に多いと言うことです。

自分もまさにそんなプログラマの1人です。あえて言い訳をするならば、C,C++などは学生時代に単一モジュールで済む程度のプログラムしか書いたこともなく、業務では扱ったことがないからです。
これは結構難しい問題です。プログラミング言語もソフトウェアの分野も幅が広くなってきている為、まったく解らない分野の技術が出てくることは避けられません。学習をしていくにしても、限られたリソースの中でスキルを身につける必要があるため、あまり自分の興味や仕事と離れている分野は優先度が低くなるのは仕方ないことでしょう。しかし、一方でプログラマとして最低限はしらなければならない事は確実にあります。それも、たくさんあるのです。やりたいこと、覚えたいことはたくさんあるけどリソースが足りないというジレンマを抱えざるを得ません。
自分としては3つの基本方針を立てています。1つ目は、基礎は基礎ということで疎かにしないことです。このエピソードで書かれているように自分はリンカについて詳しくは知りません。ですが、リンカを使う機会は今のところは低いと言えます。とはいえ、基礎的な技術ですので、最低限の知識はなければ、必要になったときに困ってしまいます。また、「知っている事が前提で」書かれている別の技術もあるでしょう。したがって、最低限の知識を取得することは価値のある投資です。どの程度までが最低限なのかは難しい所ですが、自分の中では最低限その分野の入門書を読んでみるというのを1つの基準としています。おそらくは全く足らないと思いますが、調べようとしたときに調べられるだけのキーワードを頭に入れておくのです。2つ目は、自分の得意と言える分野を2つ以上選択してスキルを伸ばすという事です。1つではないのは、リスク分散をしたいからです。興味を持ってやってみたい技術というのはたくさんありますが、どれもこれもやっていく時間はありません。なので、ある程度は絞り込まなければなりませんが、それが1つですと情勢が変わった時に自分の強みがなくなってしまう可能性があります。例えば、自分は今Google App Engineを1つの強みとして伸ばしていますが、Googleのさじ加減で何時無くなってしまうかも解らない技術です。なので、それだけをやっているのは大きなリスクです。
きのこ本のエピソードの中ではこのエピソードはやや特殊で、特定の技術に関して書かれています。とはいっても、アルゴリズムやデータ構造のように「リンカ」というのは普遍的で基礎的な技術でしょう。アルゴリズムなどと同様にスペシャリストとなる必要は全員にはないかと思いますが、「自分がその分野で仕事をするとなった時に最低限でも困らない程度の知識」はつけておく必要があると思います。同じようにデータベース・基本設計・テスト・インフラ・ネットワークなど基礎的な部分は重要です。そういう意味では、普遍的で基礎的な知識を補完するために、情報処理試験などを勉強してみるのもいいのかもしれません。

プログラマが知るべき97のこと

プログラマが知るべき97のこと