我が名はなんとか菜である!

主に技術系の記事を書きますが、ポエムも混入します。

プログラミングを学ぶにあたって詰まったことと、そこから学んだこと

mizchi.hatenablog.com

みんなも何に詰まったか、書いてみてください

わかりました。

プログラミング歴

12歳

簡単にホームページを作れるみたいなサービスを使っていた僕は、なんかとりあえずサイトを賑やかにしたくて色々探していたら「ホームページの背景に雪を降らす」というやつがあり、そのときに出てきた JavaScript というものは一体なんぞや?というところから JavaScript というプログラミング言語を知った。で、プログラミング言語を使いこなすとゲームが作れると聞いて、ゲームばっかりやっていたクソガキの僕は、早速ブロック崩しの作り方を解説しているサイトを見ながら見様見真似で作った。完成はしなかった。(理由は後述)

挫折したあと、こんなものを見つけて、あ、これも JavaScript じゃん、ということで手を出してみたりもした。これは一応動いた。

nico.ms

中学生

不登校になったあと相談室に通うようになり、そこにあったパソコンで C言語 の勉強をした。当時その教室に定期的に来てくれていた数学の先生がプログラミングが出来る人で、僕に色々なことを教えてくれた。ピラミッドを出力するプログラムが出来たときはめちゃくちゃ嬉しかった。

制御構文はこの辺ではほぼ習得できていたような覚えがある。

高校生

1年ぐらいプログラミングをしていなかった時期があったが、なぜかそのあと「C言語の次は何を学ぼっかな。おや、C++ってのがあるらしいじゃん、これやるか」という流れでVC++沼にハマった。DXライブラリというものを使うとC++でも簡単にゲームが作れるらしいと聞いて、これに手を出してみたりもした。前述の JavaScript で作ったやつをC++に移植するということもやってみた。実際にちゃんと動いた時はめちゃくちゃ嬉しかったし、何より楽しかった。

関数の概念はこの辺でようやく理解した。
あと、ついでにオブジェクト指向の考え方も分かった。

大学生

1年生の頃にようやく文字と文字列の違いを理解した。その後、C++以外にもC#JavaPHPやらにも手を出した結果、自分はなんでも作れる気分になった。

コンピューターサイエンスの基本や、Linuxの基本的な仕組みなんかはこの辺りで覚えた。 あと、MVCやらMVMやらMVVMやらといったアーキテクチャもこの辺で覚えた、確かWinFormsやらWPFやらも触っていたので。

新卒時代(1年目~2年目)

新卒で入りながらも、経験者枠ということで周りにプログラミングを教えていた。正直なところ「なんでお前らIT企業に入ってきてるのにコード書いたことがないんだ?」と思っていたが、彼らはとても頭がよかったので、1、2ヶ月で普通にコードを書けるようになっているのをみて「僕は凡人かもしれない」と思った。

研修中通して「僕はなんでも出来るぜ」って顔をしていたら、当時人が居なかったらしい新規プロジェクトでウェブフロントエンドを任されることになった。
とりあえずJavaScriptjQueryを導入してそこそこの規模のアプリケーションを作っていたが、型の付かないJavaScriptでSPAをするのはバカであるということに気が付き、途中からTypeScriptを推しまくってプロジェクトにTypeScriptとwebpackを導入することにすることに成功した。また、フロントエンドにAngular4を使っていた炎上プロジェクトにTypeScript経験者として放り込まれて、Angular4を勉強しながらパートナー社員にTypeScriptを教えたりもした。

バージョン管理の重要性にこの2年間で気がついた。

ドワンゴ時代

なんで自分フロントエンドやってんだろうな、という気持ちが拭えなかったが、とにかく前職は給料が安すぎたのでフロントエンドエンジニアとして入社した。
HTML5プレイヤーがめっちゃモダンな技術スタック(React.js, webpack, Babel.js)で色々と学びがあったが、JavaScriptで書かれていたことについて渋い顔をずっとしていたら、TypeScriptに置き換えていくことになったのでよかった。
僕が書く新機能に関しては全てTypeScriptで書かせてもらえてしあわせだった。
色々あって病気にはなってしまったが、React.jsの基礎〜発展的な使い方やFluxアーキテクチャについての理解はここで得られた。

無になってはいるが、 Docker の無限の可能性を信じて脱Windowsをしている。

学習過程で詰まったこと

JavaScript

メモ帳でやっていたので、 {} の数が合わなくて発狂していたりした。
さっき「理由は後述」とか思わせぶりなことを書いたけど、ようするにメモ帳で書いてたせいで一定以上の大きさのコードを扱うのが不可能だったせいです。
ちなみにまともなテキストエディタを導入するまでここから2年の月日が掛かりました。
ガキだったので無駄に知識の吸収力はあったせいか、特に詰まった記憶がない。
強いて言えば関数に分ける重要性はよく分かってなかったと思う。

C言語C++

C言語C++の「コンパイラ」が「複数ある」という概念がいまいち理解できていなかった。
なんで?1個でよくない???みたいな。
まあなんにせよ、自分にとってプログラミングとは黒い画面に白い文字を出して遊ぶものだったので、コンパイラの差みたいなのにはあまり興味がなかったのかもしれない。

あと、ポインタは難しいぞ、と散々脅されていたけど、言うほど難しくなかった。
関数については「このDXライブラリの初期化部分を関数にしてヘッダに書いておけば便利じゃね?」という気付きをして無事に解決しました。

コマンドラインインターフェース(CLI)

これが結構鬼門だった。
コマンドでパソコンを操作??????は????????超能力者か?????????(当然、補完があることなど微塵も思わない)という印象だった。なので、コンパイルという操作がないJavaScriptや、一度設定してしまえばボタンひとつでコンパイルから実行までやってくれるVisual Studioからしばらく離れられなかった。
昔から僕は体系づけてプログラミングを学んでいるわけではなくて、単に興味の向いたものを食べているだけに過ぎなかったので、こういう大事なところがすっぱ抜けたのだと思う。
プログラミングを始めるときは、何々言語!とか何々フレームワーク!!!じゃなくて、CLIでパソコンを操作することをまず理解していくのがよいのではないかな、と今では思う。

文字列

文字列に詰まったのは端的に言えばC言語のせいだとは思う。
C言語で文字列が分からないということは、ファイルI/Oの使い方も当然よく分からなかった。
作ったゲームのマップデータをヘッダファイルに直接書いて修正するたびにコンパイルし直してたりしてたこともあった。
配列は理解できてたんだけどね…たぶん配列と文字列が根っこの部分では同じということが理解出来てなかったのかもしれない、それに気がついたらすんなり理解できたので。

設計の重要さ

いつも頭の中で描いたゴールを単純に目指しながらコードを書いていくスタイルで作っていたけど、それは多人数開発ではまずいということに社会人になってから気が付いた。
たとえ趣味のコードであっても、最低でも大まかな状態遷移図と前提条件は決めておくべきだなと思う。

学んだこと

全ての操作は自動化が可能であるべきで、出来ないものは早急に改善すべき

これは環境構築からテスト環境を用意する過程全てに対して言える。
自動化が出来ないと必ずどこかの手順でおばあちゃんの知恵袋的な操作が入ってきてしまう余地が生まれてしまい、そういった小さな穴は気が付くと手がつけられないほどに大きくなっていたりするので、とにかくドキュメント化と自動化は同時に進行すべきである。
というか、ドキュメント化が出来るならおそらく自動化も可能であるはず(べき)なので、環境に依存するパラメータの入力は極力設定ファイルに切り出して、手順に対する解釈の曖昧さを取り除いていくのが重要である。

環境は常にポータブルであること

「このデータはここにしかない」という状況は常に避けるべきである。
なので自分は書いたコードはどんなに小さくても必ずgithubに上げているし、別にそれが恥ずかしいと思うことは最近は全くない。(最初はそういうこともあったけど)
リソースデータに関しては、それらが設定ファイルのようなものから復元ができるならそれに全部任せたり、OneDriveやDropboxと言ったクラウドストレージを利用したり、とにかく明日このパソコンが突然爆発しても(開発資産的な意味で)ノーダメージな環境作りを意識することが大切だと思う。

何かを作るときは最小ゴールを決めてとりあえずリリースする

一生ベータみたいな状態を避けたいという意味。
穴が空きまくりでもバグが出まくりでも、とりあえず自分の手元だけででも動く!!ってなったら ver 1.0.0 を出すべきだと思う。
一回ちゃんとリリースすれば、それを更新していこうっていうインセンティブが働くし、更新してれば誰かが使ってくれるかもしれないし、もしかしたらそこからフィードバックやIssueを上げてくれたりするかもしれない。
少なくとも、僕は個人開発の領域では「SIer的な作り方は悪である」と断言できると思っている。(ほんとはプロダクトのコードでもそういうふうにしたいんだけど、僕はいままでそういうことを決められる立場になったことがないので…)

テスト書きたい

書きたいよね…。

終わり

スターと仕事と名声が欲しいです!!!!