気をつけよう:プログラミングのキャリアの話 – 前編

プログラミングの森の奥で道に迷わないために

私がプログラミングの仕事を始めたばかりのころの悩みの種は、どの言語や技術を選ぶべきか、でした。何を学び、何から始めればいいのか。プログラマとしての初仕事を獲得するために知っておくべきことは何か。そのころ(ほぼ10年前)、CourseraやUdemyやSoloLearnは、ありませんでした。いい職に就くための確実な方向、完璧な道筋がどんなものなのか、私にはわかりませんでした。高給で、満足できて、優遇される、21世紀の宇宙飛行士、つまりプログラマの仕事を得るには。

問題は今でも相変わらず同じです。ビギナーは選択の段階でつまずき、優れたプログラマになるための近道はなく、コミュニティは「Pythonっていう言語は簡単ですか?」というような新入りの質問を歓迎するほど温かくもありません。プログラマとして成功するための道筋は、むしろ以前よりも見えにくくなっています。あなたは(あなたがビギナーだと仮定して)、C++/C++11/C++14/C++17、Java、C#、Kotlin、PHP(何だって?)、Python、Node.js、JavaScript(ちょっと待て、Angularで?それともReactかVueで?)、などの中から言語を選ばなくてはなりません。

言語か、技術か、技能か?

あなたの一番知りたいことに答えるには、まず、私から質問があります。何をやりたいのですか? モバイルアプリを作りたいのか、ウェブサイトを作りたいのか。それはFacebookのようなサイトなのか、Mediumのようなサイトなのか。それとも、Photoshopのようなデスクトップアプリケーションを作りたいのか。もしかしたら、ゲームを開発したくてたまらないのかも。そのゲームはモバイルか、デスクトップか。

「ハイテク企業でソフトウェア技術者として雇用されるために知っておくべきことは何か」という問いへの最も知的な回答は、技術面接に合格するためにマスターすべき主要スキルを見つけ出すことです。でもまずは、ものごとを整理しておかなければなりません。プログラミングの世界に飛び込んで、その中の田舎と都会、文化と争い、損得について調べてみましょう。気の短い人は、途中を飛ばして「コーディング面接の準備」のセクションに進んでも構いません。

プログラミングの世界を探検すると、3つの主要なプラットフォームが現れます。
1. ウェブ(Google検索、Facebook、Amazon、Twitterなど)
2. デスクトップ(Dropbox、Photoshop、Visual Studio、Skypeなど)
3. モバイルSoloLearn、Instagram、Uberなど)

各プラットフォームの項目として挙げたサービスのほとんどは、たいてい他のプラットフォームにもあります。例えば、Skypeにはデスクトップとモバイルとウェブのアプリケーションがあり(ウェブ向けはプアですが)、Twitterにはウェブとモバイルのアプリケーションがあります。

ウェブ

ウェブとは、この文脈では非常に大きな概念で、きちんと理解するには、いわゆるフロントエンドとバックエンドに分けて考える必要があります。私は個人的にはバックエンドが好きです。フロントエンドは目に見えるもの、バックエンドは、目に見えるものを見るために必要なものです。つまり、フロントエンドとは見て感じることのできる、いわゆる「ルックアンドフィール」であり、バックエンドは、ユーザリクエストの処理やデータベースのクエリの取り扱いなどといったアプリケーションを動作させるサーバです。

フロントエンド ルックアンドフィールをマスターしたければ、つまり、ユーザが惚れ込むような美しいウェブサイトを構築したいなら、HTML(ルック)、CSS(ルックとフィール)、JavaScript(フィール)について知らなければなりません。ただし、それだけでは足りません。今は純粋なJavaScriptを使うだけでは不十分なので、適切なフレームワークを選ぶ必要があります。最近は、AngularやReact、Vueが人気です。どれを選ぶかは、あなたが一番好きな会社によって決まります。Googleですか? Facebookですか? Googleが好きならAngular、Facebookが好きならReactにしましょう。どちらも好きではないのなら(変わり者ですね)、Vueにしましょう。簡単な選択ですね。それ以外に、HTTPの内部的な働きなどの基本概念をある程度マスターし、ウェブサーバに慣れておくべきです(少なくともApacheやNginxの名前を聞いただけで怖がったりしない程度には)。フロントエンドの開発者であるということは、レンダリング(ユーザのための「美」)の対象のデータをバックエンドから受け取ることを意味するので、APIとは何か、JSONとは何か(そして、それがXMLより優れている理由)についての最低限の理解は必須です(この話について行けない人は、この記事の最後にあるリファレンスのセクションをチェックしてみてください)。

これは、ウェブで私が気に入っているミームで、フロントエンドとバックエンドの違いを説明しています。

バックエンド 表面上はわからない真実、語られない裏話です。昔は、バックエンド開発者を名乗るにはPHPを知っていれば十分でした。それから、MicrosoftはASP.NETを導入しましたが、その後Node.jsが登場します。両者はどちらが最高かを争い、Node.jsがASP.NETにとって代わることになりました。こうして、イベント駆動型のプログラム開発における概念のいくつかは、Node.jsに最も適したものになっているのです。そのため、プロジェクトにとっては、Node.jsを採用することが好ましいと言えます。

バックエンドをややこしくしているのは、使える言語の多様性と言えるでしょう。ええ、バックエンドでは、使いたい言語を何でも使えるのです。ただし、「バックエンド」とは、つまり「データベースにクエリを発行し、データの処理を行い、クライアントに応える、という動作をできる限り効率的に行うもの」です。ですから、そのために「適切な」言語、技術、データベースを選ぶとなると、ある程度限られてきます。MySQLやPostgreSQLのようなリレーショナルデータベースを利用する開発者もいますが、最近ではダークサイドとでも言うべきNoSQL(CassandraやMongoDBなど)を選択する開発者もいます。実際に何を選択するかはあなた次第ですが、私はシンプルに決めています。データには厳密なスキーマがあり、それは近い将来、大きく変更されることはないですか? そういう場合は、リレーショナルデータベースを選びます。1分間に100万回以上の訪問がありますか? その場合はNoSQLに変更します(痛みを伴いますが)。プロダクトは急速に変化しますか? この場合もNoSQLですね。では、あなたがこのNoSQLを選んだとして、どのような具体的な技術を選んだらよいのでしょうか? Microsoftが好きで、Windowsサーバをお持ちですか? それならMsSQLにします。Oracleが好きならOracleにしますし、OracleはいいのだけれどMicrosoftが嫌という場合はMySQLにします。私は誰も傷つけたくないだけ、というのでしたら、PostgreSQLを選びます。

NoSQLはくせ者です。これは、サービスとデータアーキテクチャによって違ってきます。単にドキュメントファイルだけがあり、そのドキュメント間の結び付きは弱いものですか? そういう場合はMongoDBを選びます。膨大な量のキー値のペアを格納する必要がありますか? それならRedisです。グラフのような構造(Facebookの友達のグラフやGoogleのナレッジグラフなど)を扱うならNeo4jを。本当に必要になるものが何か、はっきりわかってはいないものの、こうしたものがいずれも必要だと感じるなら、ArangoDBにします。

データベースには必要なデータがすべて格納されていますから、クライアントがデータベースに対し要求し、読み込み、書き込みができるようにAPIを定義する必要があります。ここで最も便利な選択肢と言えばNode.jsですが、PHPやASP.NET、Ruby、あるいはPythonを使うこともできます。個人的にはNode.jsがオススメなのですが、そう、Facebookはバックエンドやそうした類のものでPHPを使っています。彼らはPHPの大部分をC++で書き直しました。Pythonを使う人もいれば、Rubyを好む人もいます。例えば、GoogleがC++、Java、Python(Goと一緒に)を使っているように、バックエンドでほとんどの言語を使うことができます。細かいレベルのデータ処理や、ユーザの友達推薦を更新するといったバックグラウンドのジョブになると、C++が最適ですが、Javaも良い選択です。データ解析や自然言語処理、あるいは最近普及しているAI関連のタスクなら、おそらくPythonにするでしょう。

ここでも、さまざまな言語、フレームワーク、バックエンドのデータベースに加え、いくつかマスターすべき、核となる概念があります。

  • キャッシング CPUレベル(さまざまなレベルで)から、ブラウザレベルに至るまで、あらゆる場所で使われています。Google検索やFacebookといった高負荷のサービスには、極めて必要性の高いものです。

  • サーバ サーバと聞いて、ハードウェア関連のものと思うかもしれません(複数のコンピュータをセットアップし、データの格納と処理を行える1つのシステムとして機能させる方法を理解していることは素晴らしいと思います)。ですが、バックエンド開発者としては、サーバと言うとウェブサーバのことを意味します。最近普及しているウェブサーバはNginxで、セットアップや設定方法を知っていると、これからの取り組みの中で高く評価されるでしょう。

  • ソケット ネットワークプログラミングの基礎です。ネットワークを介して送受信するものは、すべてソケットによって行われます。ソケットプログラミングについて、より詳細まで知っていると、スキルズインベントリー(従業員のスキル情報)で思いがけない加点がつくことでしょう(TCPソケット、UDPソケットがWebSocketとどう違うのかを知っていると、大きなプラスになるでしょう)。

  • データベース設計 どのDBMSを選択、あるいは操作することになっても、データを取り扱うことは主なタスクの1つになります。プログラミングの実務を重ねていく中で、全体像を把握し、データユニット間のデータと結び付きを視覚化するスキルをマスターしていくことでしょう。

  • セキュリティ 先述した概念の他、これも非常に広い範囲に渡るものです。完全にマスターすることはできませんが、少なくとも、プレーンテキストではなくパスワードハッシュの保存などのベストプラクティスには慣れておく必要があります。APIトークンによるリクエストの確認、リクエストごとのユーザ権限の確認などもそうです。