インタプリタ系の言語に慣れてきたらコンパイル系の言語を学ぼう
Windowsを操作するマイナーなスクリプト言語からJavaScriptとRubyを学び、 PythonとPHPは実務を通して身につけ、ゲームやアプリ制作を通してC#やJava/Kotlin/Swiftを学んできました。
いわゆるWeb系の言語に部類されるものを中心にやってきたということになります。
そして仕事にはまだまだできませんが最近ではC++とRustを学び始めています。
理由としてはWeb屋ではなくてシステム屋の方面に行きたいと思っているからです。
35歳になってからでは遅いかと思いますが、意外とそうでもないことに気付けたので頑張っています。
昨今ではPHPを使わなくてもクラウドサーバーを使用すればJavaScriptだけでサーバーもフロントもできる時代になってきてはいますが、 やはりプログラミングのスキルをあげるとなるといろんな言語を触ってみたほうがいいなと感じています。
特にインタプリタ系、つまり1行ずつ実行していくタイプの言語を中心に学んできたため C++やRust、Goといったコンパイルしてから実行するタイプの言語を触ると 自分ってこんなにも未熟なんだなと再認識させられます。
コンパイル系の言語を学ぶ際にC++は難易度が高いと感じたら Go言語は比較的優しいのでそこから始めるのをオススメします。
環境構築も簡単ですし色んな面でスッキリとしたコンパイル系言語です。
人気も有るのでC++やRustを学ぶ前にちょっと触ってみるのもいいかも知れません。
JavaScriptで3Dを扱うと途端にスキル不足を感じた
あまり詳しくは言えませんが、センサーから別の言語を通して取得した3次元のデータを 別の言語に送信して再構築して描写させるといった練習をしていたときに JavaScriptでは基本扱わないようなバイナリデータを直でさばいたりして 自分のスキル不足を頭の天辺から足の爪先まで実感しました。
Three.jsというブラウザで3Dを扱う便利なライブラリを使ったのにもかかわらずです。
一応JavaScript歴は一応10年、実務は6年以上あるのに、 プログラミングのプログぐらいまでしか理解できてないって感じでしたね。
実務でそんな高度なJavaScriptを使う人ってそんなに多くはないと思いますが(笑)
私が今までやってきたプログラミングはただの積み木遊びみたいなものでした。
もちろん積み木で組み上げたものは売り物にもなるレベルではありましたが それでも全然判ってなかったんだなぁってハッとさせられました。
コンパイル系の言語は2つ以上身につけておくべき
現代ではお仕事でお金を稼ぎたいだけであればWeb系の言語を中心にすべきだと思いますが 人間贅沢なものでそれより上に行きたいなと考える生き物です。
おそらく目的がお金の人は作る側から考える側に回ってしまいます。
いわゆるエンジニア上がりの社長みたいな感じですね。
しかし私の場合はどこまでいってもエンジニアなんだろうなってここ最近感じています。
そういうタイプの人は同じ畑で耕し続けるのではなく、 少し隣の畑に行っていろんな知識を身に着けて 自分の畑に戻って周りがやってないようなことをやるべきです。
そして、隣の畑1つではなく前後左右と様々な畑に現地調査に赴き 並行して学んでいくと視野がとても広がります。
私はゲーム制作に使えそうなC++と、C++の後継とも言える存在の Rustを学び始めました。
Go言語も学んだりしていますが、触った感じC++を覚えてからじゃないと 色々見えてこないんじゃないかと感じたのでまずは昔からずっとあり、 今でも現役を走り続けているC++を学ぼうと決意しました。
そして私の性質上、何かを覚えるときは1つだけを学ぶよりも似たような2つ並行して学んだほうが 力になることを知っているのでC++とRustを選択しました。
環境構築が一番むずかしい罠
C++は何度かチャレンジしたことが合ったので 少し苦戦しつつもなんとか環境を構築することが出来ました。
Rustに至ってはインストーラーだけで使えるようになったのでめちゃくちゃ楽でしたね。 流石新しい言語って感じがしました。
C++は良くも悪くも古臭いやり方のままかわらないなって感じです。
C++とRustの共通点として、外部ライブラリの導入が面倒くさいってのがめちゃくちゃ感じました。
node.jsとかやってるとほしいものをコマンドを打ち込んでインストールできる パッケージマネージャーがすごく優秀なので楽に外部ライブラリを使えますが、 C++に至ってはパスの指定のやり方が分かりづらかったりしてそこを乗り越えるのが一番時間がかかりましたね。
Rustは一応パッケージマネージャーがあるのですが、 コンパイル言語のせいかnode.js程気軽にライブラリを導入出来る感じではなかったです。
.tomlというファイルでパッケージをコピペしてはっつけてきて、 対応のライブラリをDLして該当のライブラリディレクトリにコピペするような感じです。
一応npmと同じようにcrate.ioに集まっているものからcargo installで入れられるらしいのですが、 調べているとnpmほどなんか気軽に使えないような感じがしました。
node.jsなんかはぽんぽんと必要なライブラリを気にせずいれてますが、 Rustそうでもない感じがしましたね。
まだ触り始めて数日なので慣れてきたらnpmみたいな感じに使っているかも知れません。
準備さえ出来てしまえば後は基本構文を駆使したり関数を呼び出してコードを構築していくだけです。
なのでC++もRustも作り始める前の環境構築が一番難しかったです。
コンパイル系言語を学ぶとインタプリタにも強くなる
JavaScriptだとなんとなーく使ってたことが、コンパイル系の言語を学ぶと そういうことだったのか!ってなることが結構あります。
特にJavaScriptの自由すぎる型を厳密にするために作られたTypeScriptをやると え?まぢいみわからん……ゃむ……みたいな感じの語彙力ない状態に陥りました。
TypeScriptはC++のようにヘッダファイルとスクリプトファイルを分けて作っていくタイプなので C++ユーザーはこれを使わないとJavaScriptを使いたくないというのをよく聞きます。
JavaScriptも、もとを辿ればC言語で組まれています。
そしてWebブラウザでも3Dの表現が普通になってきたので 高速化をするためにWebアセンブリというWeb用のアセンブリ言語があります。
JavaScriptだけではさわれないような部分にアクセスできたりするので、 より複雑で高速な表現ができるようになりますが、 アセンブリというだけあって本家アセンブリ言語並に意味不明です。
C/C++やRust、Go言語といったコンパイルメインの言語から Webアセンブリに変換出来る仕組みができあがっているので Web系言語のスキルを高めるには結局の所コンパイル系の言語のスキルが必要になってきます。
おそらくNode.jsオンリーでもそれができるようになる時代もそう遠くはないのですが 結局の所それもC++等の言語を元に作られてたりするので 学んでおいて損はないということです。
最初の方にもいいましたが、少しでも興味が湧いた人は Web系言語と連携しやすいGo言語をとてもおすすめします。
Go言語はLaravelやRailsのようなAPIサーバーを立てたり、 電子工作をするためにも便利なライブラリがたくさん開発されており Web系寄りの人も組み込みよりの人も気にいるような言語になっているので一度触ってみてはいかがでしょうか。
案件目線でみるとまだまだ少ないのですが、覚えておいて損はないという言語でもあります。