プログラマーが「より良い人生」を送るためにはどうすればいいかーーそのためのノウハウやスキルを紹介する「SOFT SKILLS」という本があります。
この本の内容を一言でいえば、プログラマーのための人生マニュアル。コードの書き方や最新テクノロジーの話はほとんど出てきません。
書かれているのはキャリアの築き方、自分の売り込み方、生産性の高め方といった仕事で成功する方法から、恋人の作り方、財産の築き方、心身の鍛え方など、プログラマーが人生全般をより良く生きる方法まで。本では以下の全7章に沿って説明しています。
・キャリアを築こう
・自分を売り込め!
・学ぶことを学ぼう
・生産性を高めよう
・お金に強くなろう
・やっぱり、体が大事
・負けない心を鍛えよう
2014年12月に英語版が発売。米Amazonには200件以上のコメントが寄せられ、そのうちの90%が5つ星と高い評価を得ています。Twitter米国本社で働く日本人エンジニアの箕輪太郎さんが自身のブログで絶賛し、日本のエンジニア界隈でも話題になりました。2016年5月には日経BPが日本語版を発売しました。
著者のジョン・ソンメズ(John Z. Sonmez)は、ソフトウェア開発者向けサイト「シンプルプログラマー」の設立者。同サイトでは「複雑な問題を単純なソリューションに変換する」という自身のビジョンを伝えるべく、記事やPodcast、動画を日々更新しています。
そんなジョン・ソンメズが2012年9月、「ソフトウェア開発者にとって重要な4つのスキル」と題したブログを自身のサイトで公開。「SOFT SKILLS」のトピックを簡潔にまとめた入門編ともいえる内容で、日本のエンジニアにも参考になりそう。そこで今回、著者の許諾を得て日本語訳を紹介します。
ソフトウェア開発者にとって重要な4つのスキル
世の中には多くのテクノロジー、プログラミング言語、プラットフォームがあふれている。そのような状況のなか、ソフトウェア開発者たちは自分の貴重な時間をどの分野に割くべきか決めかねているのではないだろうか。
私はよく、優れたプログラマーになるためにはどうすればよいのかと聞かれることがある。
そういった質問の多くは、ある特定のプログラミング言語やテクノロジーに彼らの時間を投資するべきかどうかという質問だ。
その質問の答えを探しているうちに、ある4つの重要なスキルにたどり着いた。その4つのスキルは、いったん習得すれば色あせることはない。そして、それを習得した優秀なソフトウェア開発者のキャリアは明るいものになるだろう。
第1のスキル:問題解決力
私は以前にも、問題解決力の重要性についての記事を執筆したことがある。それだけではなく、その能力を身に付けるための学習ステップについても執筆したことがある。すべてのソフトウェア開発者にとって、このスキルは不可欠だと信じているからだ。
ソフトウェアの開発とは、問題を解決することなのだ。
問題が存在しなければ、ソフトウェアを開発する意味もない。
すべてのソフトウェアは、ユーザーが抱える問題を解決するためにデザインされている。また、その使命を達成するためにも、その大きな問題を構成する小さな問題をひとつずつ解決していくことが必要だ。
どのプログラミング言語を使うのか、どのテクノロジーを使うのかは関係ない。問題を解決できない人はソフトウェア開発者には向いていないのだ。
驚くべきことに、多くのソフトウェア開発者がこの問題解決力を持ち合わせていない。
ソフトウェア開発者の採用面接の際に出題される問題が難しすぎるという不満をよく耳にすることがある。
それに対して私は、採用面接は難しければ難しいほど良いのだと話している。なぜなら、それはディベロッパーの問題解決力を測るためのものだからだ。
この点に関して、多くのディベロッパーがいまだに反対意見を持っていることは知っている。開発スキルを磨くために「TopCoder」のようなウェブサイトが役に立つ理由も、彼らには分からないだろう。しかし私は、TopCoderで身に付けた問題解決力こそが、私のキャリアを大きく変えてくれたことを身をもって理解している。
大工を例にしてみよう。大工として成功するためには、上手に木材を加工する技術がおそらく必要だろう。いろいろな加工技術を試すべきだし、多種多様なツールを試してみるべきだろう。
木材の加工が上手くできなければ、大工としての経験の豊富さも、家具をデザインするセンスも意味のない物になってしまう。
木材の加工技術は、大工として最も基本的なスキルである。そして、ソフトウェア開発における問題解決力は、大工にとっての木材の加工技術のようなものなのだ。
第2のスキル:独学力
学習するための技術ほど、人生において重要なスキルはないだろう。
変化の激しい業界に身を置くソフトウェア開発者にとって、このスキルは特に重要なものだ。
この業界にいる限り、すべての知識を習得するのは不可能である。ある1つのフレームワークやテクノロジーを完全に習得するために時間を割くこともできない。この業界の変化は速すぎるのだ。
その代わりにディベロッパーに求められるのは、目の前のタスクに必要な知識を素早く習得するための能力だ。
ソフトウェア開発というキャリアの中で成功を収めたいのであれば、独学力を身に付けるべきなのだ。
このスキルを磨くためには、実際に行動あるのみ。一見すると必要のないものに見える新しいプログラミング言語やテクノロジーについても、それを学ぼうとするしかない。それまでのキャリアで既にプログラミングの基礎はできあがっているだろうから、たとえそれが新しい言語だとしても素早く習得できるだろう。
ソフトウェア開発業界、テクノロジー、プラットフォームの激しい変化に素早く適応できる開発者は、業界から常に必要とされるのだ。
素早く独学する技術についてTim Ferrisが書いた「4-Hour Chef」という本がある。彼の主張には同意できない部分もあるが、この本の内容は素晴らしいものだ(私も、このトピックについて本を出版したかった)。
第3のスキル:ネーミング力
私の日課は何かと聞かれれば、私はこう答える。「他人が考えたネーミングの例を調べたり、実際に何かに名前を付けたりしている」。
まあ、実際にはそんな質問をしてくる人もいないし、その質問に対して私がこのように答えることもないだろう。だが、これは実際に私が日課としていることだ。
ソフトウェア開発は、形而上学的な性質を持っている。私たちの創造物は目に見えないものが多いが、それを表現する必要があるからだ。
ユーザー認証機能や、その他諸々の機能を取り入れながら、そのソフトウェアが創り出す世界を、すべて心の中で構築していかなければならない。
コーディングするということは、何かに名前を付けるということでもある。誰かが書いたコードを読むとき、そのコードに書かれている「名前」が貴重な情報源となるのだ。
メソッド、変数、クラスに付けられた名前を見れば、私はそのコードを書いた開発者の力量を正確に測ることができる。
あるコンセプトやデータに対して適切な名前を付けられない開発者は、直訳しかできない翻訳者のようなものだ。たとえ、その名付ける対象を理解していたとしても、それを正確に説明できなければ意味がない。
このスキルを磨くためには、ネーミングを繰り返していくしかない。私がコードを見直すとき、理解度を高めるために、私はよくメソッドの名前を付け直すことがある。そのメソッドに対する理解度が深くなればなるほど、それに見合った適切な名前を付けられるのだ。私の場合、コードの見直しの際にロジックにはなんの変更も加えず、名前だけを変更することもあるくらいだ。
適切な名前をつけることを常に心がけていれば、センスも磨かれてくるだろう。
また、変数などに付けられた名前は目で見ることができるものだ。コードを見ただけでは、それが無駄のないもので、正しく動作するものなのかを判断することは難しい。しかし、コードを読んでその内容を理解することができるのであれば、そのディベロッパーの腕が確かなものだと判断することはできる。
第4のスキル:人間関係力
私がこの記事で紹介した4つのスキルの中で、このスキルが一番重要だといっても過言ではない。
人との関わり合いを避けて通ることは難しいのだ。
自宅で働き、1人だけでソフトウェアの開発しているのでもなければ、周りの人が多かれ少なかれキャリアに影響を与えるだろう。
私は以前にも、他人を批判するべきではないという主旨の記事を書いたことがある。だが、それだけでは人間関係力を語ったことにはならない。
私が人間関係について考えるとき、いつもデール・カーネギーが著した「人を動かす」を見返すことにしている。人間としての成功を考えるうえで、この本ほど重要な示唆を与えてくれる本はないからだ。
以前にも述べたことではあるが、人間関係について学びたいのであれば、まずはこの本を読むべし!
人間関係におけるさまざまな問題は、人間はロジカルな生き物ではなく、感情的な生き物であるという点に起因する。もちろん、自分は論理的なのだと信じたい気持ちは理解できる。しかし、現実には私たちの判断の多くは論理ではなく、感情によって支配されていることが多い。
ソフトウェア開発者にとっても、このことは重要な意味を持つ。他人であるマネージャーや、周りの開発者たち、そして顧客と上手く付き合っていかなければ、たとえ素晴らしい能力やアイデアを持っていたとしても、つねに問題と背中合わせで仕事をしなければならない。
ソフトウェア開発のコミュニティに積極的に関わっていくことも、キャリアにいい影響を与えてくれるだろう。それによってコネクションを増やすことができるだけでなく、ディベロッパーとして自分の名前を売り出すことにもなるからだ。良い行いは必ず自分にも返ってくる。「情けは人のためならず」なのだ。
これらの事を心がけることによって、人間関係力を磨いていくことができるだろう(人間関係力を磨く近道は何かって? 単純だ。人に優しくなろう!)。
実践的なスキルについては?
私がこの記事で紹介したスキルは、特定のテクノロジーに関することでもなければ、ウェブ開発やモバイル開発に関するものでもないことにお気づきだろうか?
テクノロジーに関する知識を身に付けることはもちろん重要なことだ。しかし、この記事で紹介した4つのスキルを磨くことは、それよりも遥かに重要なことなのだ。
長期的にみれば、問題解決力を身に付け、独学力を磨き、ネーミング・センスを高め、周りの人間と上手く付き合うことができるディベロッパーは、ある特定のテクノロジーに関する知識を完全に身に付けた、どんなディベロッパーよりも重宝されるだろう。
もちろん、1つか2つのプログラミング言語に深く精通していることは重要であるに違いない。だが、その言語の選択において極端に道を踏み外すことがなければ、ここで紹介した4つのスキルを身に付けていれば心配はないはずだ(C++を選択したとしても問題はない!(^_-))。
(記事翻訳/木村拓哉)


