【質問#65】40歳からのプログラマ入門

質問・悩み相談の回答です。

質問

はじめまして。「プログラミング中級者に読んでほしい良いコードを書くための20箇条」というページから、このサイトにたどり着きました。

現在40歳。新卒から少し前まで、一貫インターネットマーケティング関連の業務をしてきました。BtoC企業で、集客・プロモーション・ブランディング・広告・ランディングページ・SNSみたいなキーワードを使った仕事がメインで、たまに紙やCMなど、という感じでした。

少し前から、社員6人ほどの小さなゲーム開発会社で働いています(社長は昔からの友人)。いわゆるソシャゲーを作っています。私に求められている役割は、マーケティングとビジネス面なのですが、しばらく働いてボトルネックはエンジニアにあることに気づきました。1名優秀なエンジニアがいるのですが、彼の負担が大きすぎるのです。

新規のゲーム企画もありつつ、すでにリリースしたゲームの運用業務(ソシャゲなので運用と言いつつ、毎週のように新規イベントとそれにともなう開発が発生します)もある状態で、彼の踏ん張りでかろうじて回っている感があります。もちろん採用活動はずっとおこなっているのですが、エンジニアは売り手市場でなかなかうまくいきません。足りないリソースは提携企業で補っているのですが、未来の勝機は内製か否かにあるというのが、私の見立てです。

こうなったら、私がエンジニアになってしまおう、と覚悟を決めました。エンジニアの仕事を甘く見ているわけでは全くありません。ただ、20年近くマーケティングをやってきて、40歳で全く新しい領域にチャレンジするのはわくわくすることです。我々の世代は70歳、下手すれば死ぬまで働かないといけないわけで、まだ30年あるわけですから。Π(パイ)型人材という言葉があるようなのですが、それになろうと決めました。

ご相談したいのは、このような人間が、プログラミングスキルを上げていくための道標です。すでに見習いエンジニアとして開発に入っているのですが、なんというか自分の中にプログラマとしての幹がないまま、上っ面の知識だけついているような気がして、、、。

なんでも結構です。40歳の新米プログラマがステップアップしていくための学ぶ順序をご教示いただけるとありがたいです。残念ながら非効率な実践を繰り返していく時間はありません。現実問題として体力はだいぶ落ちてきましたし、子どもは三人。家族サービスこそが生きがいでございます。

なおわずかながらあるスキルとしては、
・HTML、CSS(これはかなりガッツリと学び&手を動かしてきています)
・Javascript(なんとなく書いていることがわかるレベル。ついJQueryに頼ってしまう)
・PHP(wordpressのテーマを多少いじれる程度)

いま開発・運用しているのはネイティブアプリではなくブラウザゲームでPHPで作成されています。そのソースを読んでちょっと作り変えてみたり、というような仕事から入っています。

私の知識では、Java=オブジェクト指向、ということだったのですが、プログラミング言語は関係なく、オブジェクト指向をまず学び血肉化することが幹になるのかな、と「プログラミング中級者に読んでほしい良いコードを書くための20箇条」を拝見して感じました。いかがでしょうか?

回答

私も(私も、と書くのはおそらく質問者様も同じ考えをお持ちと想像しているからですが)何かを始めるのに年齢は関係ない、遅すぎと言うことは無いと信じています(ちなみに私は最近ピアノを始めました)。とくに40歳という年齢から新しいことを始めるのはとても素晴らしいですね。私が40歳になったときも、そのように活力に満ちていたいものだと思います。

ご質問内容をまとめますと、

 - 短時間でプログラミングスキルをステップアップさせたい
 - 既にあるスキルとしてはHTML, CSS, JavaScript, WordPress, PHP
 - 現在の開発はPHPで行っている

といった感じですね。

こういう状況であれば、「オブジェクト指向をまず学び血肉化すること」から始めてしまうと、時間が掛かってしまう割に得られるものが少ないように思います。ですから、得た知識が即活用できるPHP/JavaScriptを学習することが良いのではないでしょうか。

と、言いますのもこれは反省でもあるのですが、前述の記事(プログラマ中級者に読んでほしい…)はC#やJavaを使うような業界を前提としているからで、今回のようにPHPを使ってスピーディーに開発を進めているというケースは想定していないからです。そのあたりも書いておくべきでした。

それぞれの言語にはそれぞれ得意としているビジネス領域があります。たとえば、JavaScript、PHP、Rubyといったあたりはスタートアップで素早い開発が求められるシーンや、少ない手間でそれなりのものをパパッと構築するようなシーンでよく使われます。Javaはエンタープライズ系でよく使用されますね。C#も基本的にはエンプラな気がしますが、一般的なWindowsアプリ開発やWebゲームなどでも使用されています。PythonやRはデータサイエンスと機械学習の領域ですね。ソーシャルゲームとなると、最近ではScala, Go, JavaScript(AltJS), Java(というかAndroid), Swift, PHP, Rubyあたりになってくるのでしょうか。

今回のようなケースで使用されるPHPやJavaScriptでもオブジェクト指向設計の考えは役に立ちますが、必ずしも必須の知識であるというわけでもない気がします1。PHPやJavaScript、Ruby、Pythonなどの軽量言語にはそれぞれの流儀があり、実装をこなしつつそれらを感じ取るスタイルで学習を進めたほうが速いと思います。

PHP/JavaScriptがある程度わかってきたら、今度はその他にもう一つくらい何か言語を学習出来て別の選択肢を用意すれば良いのかなと思います。そして、その言語は将来的に開発に使用するという前提があるとなお即実践できるので良いかと思います(人様の会社の開発プロセスにまで踏み込むのはちょっとアレな感じがしますが)。

もう一つ加える言語としては、私はScala, C#, Swift, Kotlinあたりの軽量言語でない言語(というか静的型付言語)がお勧めします。静的型付言語は大人数での開発に向いていて、コンパイル時により多くのエラーを見つける(型で縛ってヒューマンエラーを未然に防ぐ)という思想で作られています。

Scalaはユーザーが最近になって増えた比較的新しい言語(登場時期は古い)で、広告系や自社Webサービスを提供するようなベンチャーでよく採用されています。Scalaはオブジェクト指向と関数型プログラミングの二つを融合した言語です。ちょっとしたプログラムの製作から大規模なシステム開発までそつなくこなす言語で、軽量言語の使い勝手にも近いです。ただ、他の言語と比べると記述が複雑に見えてしまう面もあり、他の言語でつぶしが効くような知識もそこまで無いので、Scalaを選ぶ何か明確な目的が無い限りは選択しない方が良いかも?しれません(自分で一番目に挙げておきながら…)。

C#は2000年に登場した比較的古い言語ですが、Javaとは違って新しい言語仕様を積極的に取り入れている言語です。もともとMicrosoftの製品でしたが、現在では無償の開発環境が提供されているほか、オープンソース実装もありWindowsだけでなくLinuxでも動作します。ゲームや広告、人工知能関連の会社でC#を使っている企業をたまに見かけます。C#の良いところは基礎から最新のトレンドまで一つでしっかり学べるところだと思います。C#はCやJavaライクな構文が多く、学習も進めやすいと思います。

SwiftやKotlinはモバイルアプリ開発で使用できるため(かつ、軽量言語でないため)という理由です。

ちょっとだらだらと書いてしまったので一旦まとめますと、今回のようなケースでは現在使用されているJavaScript / PHPの学習をどんどん進めると同時に、C#, Scala, Swift, Kotlinあたりを勉強していければプログラマとしてステップアップできるような気がします。

私が最近思うのは、良いプログラマとは引き出しが多いプログラマではないかと思います。ビジネスを回すのに必要なシステムを最小限の労力で構築するためには、その対象に適したプログラミング言語やフレームワーク、ハードウェアを使用する必要があります。反対に、単一の言語で何でもかんでもやろうとする人も居ます。よく目にするのはExcel VBAを使って複雑なGUIを作ったりする人ですかね。やりたいことに適していない言語や方法で実装するのは、適した方法で実装するよりも何倍も時間がかかってしまいます。例えるならば、彫刻を作るのに丸鋸やチェンソーを使ったりするようなものでしょうか。

プログラミング言語にはそれぞれの文化や流儀といったものがあります。特定の言語ばかり使用していると、どんどん知識が偏っていき、つぶしの利く汎用的な知識は得られません。これはΠ型人間の片方の足が極端に短い状態、みたいなかんじでしょうか。この状態が質問者様がおっしゃる「プログラマとしての幹が無く上っ面の知識だけついているような気がする」状態なのだと思います。

色々な言語を学び、どの言語でも共通する概念がプログラマの根幹をなす幹で、何かを求められたときにパッとそれを構築するための引き出しが葉にあたります。葉っぱだけ多くて幹が細くてはダメですし、その逆でもよくありません。

なんだか、抽象的な話になってきてしまったので一旦ここで締めます。以降は、プログラマとして成長していくのに学習すると良いと思われる言語を列挙してみたいと思います。専門用語もふんだんに使用していますが、学習を進める際のキーワードとして活用して頂ければと思います。

Linux

言語ではないですが、Linuxもプログラマとは切っても切り離せない道具の一つです。プログラミングを勉強するには遅かれ早かれLinuxが必要になるでしょう。早いうちに古いノートパソコンか何かにUbuntuをインストールしておき、日常的に使えば自然と知識がつくはずです。MacでもLinuxと同等のことが出来るので良いと思いますが、Linuxを覚えておくとインフラや運用周りの知識も増えるのでお得です。

アセンブラ

結局、プログラマというのは「現実の問題を計算機(コンピュータ)に解かせる形に落とし込んで計算機を働かせる」仕事なので、プログラマはコンピュータの事を知らなければなりません。メモリやCPUとは何なのかを理解するために、ほんの少しだけアセンブラを触ってみると良いと思います。レジスタやキャッシュ、CPUの命令セットといったものは長らく使用され続けますから、覚えているとずっと使い続けられる知識になります。たとえば、現在のPCの主流となっているx86プロセッサの命令セットは1978年に発表されたものです。

アセンブラが理解できればBrainfuck系の言語がなぜ動くのかが理解できるようになるはずです。

C言語

プログラムとメモリの関係を知るのに適しています。ソートアルゴリズムや、キュー、スタック、連結リスト、配列といったデータ構造を一通り実装してみるとかなり役立つ知識が得られると思います。malloc/calloc/freeを使いこなせて、頭の中でメモリの構造がイメージできるようにまでなれば完璧です。また、ここで計算量や記憶量の概念も学習できるとプログラマとしてはさらに成長できると思います。プログラマにとってオーダ記法は理解していて当然の知識だと思うのですが(情報工学系の学部では必ず習います)、意外に知らない人がたくさんいます。このあたりに知識はプログラマにとっての「幹」であるとはっきりと断言できます。

余裕があれば、マイコンにプログラムを書きこんでなにかのハードウェアを制御してみるといったことをやっても面白いかもしれないですね。組込みOSやマイコンでのメモリ管理などを学習すれば、OS全般の知識(メモリ管理、セマフォ、割り込み、プリエンプション、etc)も得られると思います。

C#

先ほど述べたように、プログラミングを学習するには非常に優れた言語であると思います。これでクラスと継承、インタフェースの使い方などを学習できるとオブジェクト指向の学習としては十分ではないかと思います。一通りそれが学習出来たら、今度はコレクションクラスを使ってみてパフォーマンスの差を比較してみたり、LINQ(高階関数とラムダ式)を使ってみたり、Thread/Task/async/awaitを使ってみたり、MVVMでGUI開発してみたりすると良いと思います。ちなみにC#でモバイルアプリを製作することも可能です。

Python

なんだかよくわからない変な言語です。記述が簡単でプログラミングが苦手でもそれなりに使えてしまうためか、昔からデータ分析や機械学習、人工知能などといった科学技術全般の分野でよく利用されていました。現在では、機械学習・人工知能の分野ではもはやPythonは避けて通れない言語となっています。

CSVから大量のデータを読み取って加工する…などというちょっとした処理を組むときは大変便利な言語です。

Scala

Scalaはオブジェクト指向言語に慣れたプログラマが関数型プログラミングのスタイルを学習していくのに適した言語ではないかと思います。関数型プログラミングのスタイルは従来オブジェクト指向設計ではモデル化が難しかったような部分をいとも簡単に記述できたりします。今後はオブジェクト指向に関数型プログラミングのエッセンスを組み込んだScalaのような言語が人気になるのではと考えています(Swiftが好例)。


  1. より正確に言うと、オブジェクト指向設計をしたほうが良いかどうかは言語に何を採用するかというよりは、実装対象のドメインがどういう領域に所属しているかという方に強く依存します。ゲームに関しても、場合によってはむしろオブジェクト指向設計をしたほうが良い場合もあるかもしれません。このあたりは実際に対象を分析してみないとなんとも言えず、今回は半ば勘でオブジェクト指向は必須ではない気がすると回答しました。ただ、もし現在の開発でオブジェクト指向設計を取り入れていたとしても、私の回答はやはりPHPやJavaScriptを勉強するほうが近道ということに変わりはありません。理由はPHPやJavaScriptでもオブジェクト指向設計は可能だからです。