プログラミングをしたいんです
プログラミングを始めてからのいろいろな出来事を書いていきたいと思います。
みんなどのように勉強してどのように技術獲得しているのかが気になっています。もしかしたらこの記事のような内容って需要があるのかな?と思っています。
@MINOの情報はあまり役には立たないかと思いますが、暇つぶしくらいにはなるかもしれません。
ある程度の間隔で更新していきたいと思いますので、思い出した時に閲覧してもらえたら嬉しいっす。
勉強し始めた技術に★が付いていますが、これは(@MINOにとって)導入難易度をあらわしています。5段階評価で★が多いほど取っ掛かりがむずかしかったという意味になります。参考までに。
芽生え
0ヶ月目
- ブログを作りたい
- WordPress ★
最初の動機はブログを作りたいからでした。ここがプログラミングを始めるきっかけになっています。
初めての言語
〜1ヶ月目くらい
- WordPressテーマをカスタマイズしたい
- PHP ★★
- JavaScript ★★★
- jQuery ★★★
- CSS ★
- HTML5 ★
WordPressはPHPで書かれているので、テーマをカスタマイズするには必然的にPHPを学ぶ必要があります。記念すべき初めての言語です。
同時にページを作るためにはHTMLやCSSも覚える必要がありました。
さらに昨今のwebではJavaScriptが必須になることを知り、最初はJavaScriptを簡単に扱うことのできるライブラリであるjQueryを学び始めました。
簡単だと言われているPHP・JavaScript(jQuery)ですが、簡単ですかね?
他の言語をやっている人なら簡単に思えるかと思いますが、@MINOにはかなり難しく感じました。
何度書きなおしてもエラー出まくりで死にそうになりました。
ほんとにみんな簡単にやっているの?疑問でいっぱいです。
初めてのIDE
〜3ヶ月目くらい
- 効率よくプログラミングしたい
- Eclipse ★★
- NetBeans ★★
最初の数カ月はWordPressの管理画面のテーマ編集画面でプログラミングしていました。シンタックスハイライトも補完も何もない、メモ帳でプログラミングしているのと変わりありませんでした。
あまりに非効率的で、とてつもない不便さを感じいろいろ調べたところ、統合開発環境というものを知りました。
最初はWebでたくさん情報のあったEclipsを使おうと思ったのですが、バージョンがよくわからず、また日本語版のインストールが難しく感じ(何度も失敗した)、結局インストールしやすかったNetBeansを使うことにしました。
格段にプログラミングがしやすくなり、とても感動したのを覚えています。
このあたりからプログラミングやるんならやっぱ英語が必要なんだなと思いはじめました。うへぇ…。
Windowsとの決別
〜3ヶ月目くらい
- CLI環境に慣れたい
- デスクトップ環境をWindowsからLinux(debian)に変更 ★★★★★
次の項目と多少前後しますが、PHPでいろいろプログラミングをしていると関係するツールやライブラリなどをインストールしたくなることが増えました。
しかしそれらはMacやLinuxでは扱いやすいですが、WindowsだとCygwinなどのコマンドライン環境を整える必要があることを知りました。
やはりMacかLinuxでプログラミングする方がのちのち良いのではないかと感じ、お金がなかったので速攻でLinux(debian)を選択、Windowsと決別することになりました。
Linuxはデスクトップ環境などが整っていて、導入は簡単そうに見えましたが、ちょっと深いことをしようとすると、直ぐにコマンドラインからの操作になることに最初はとても苦しめられました。
…今もですが。
難易度を★5にしているのはコマンドラインのせいです。GUI環境はgnomeですが、不満はありませんでした。
仮想環境との出会い
〜3ヶ月目くらい
- 仮想環境を扱いたい(開発環境を作りたい)
- VirtualBox ★★★★
- Vagrant ★★★
レンタルサーバを借りてプログラムを動かしていたりしていたのですが、これが規約上良くないことだと知り、別途プログラムを動かす環境が欲しくなりました。
いろいろ調べていると仮想化という技術がある、仮想マシンというものがローカルに作れることがわかりました。しかもVirtualBoxというソフトなら無料とのこと。
でも正直非常に導入難易度が高かったです。といのも結局Linuxサーバを立てるのと変わらないので、そこら辺の知識が無いと簡単には行かないわけです。
そこら辺のことを簡単にしてくれるVagrantというソフトのことも知りましたが、結局Linuxサーバの設定からは逃れることはできないと覚悟し、Linuxサーバの知識を付けるべく勉強を開始しました。辛く厳しい時代の幕開けです。
さらに追い打ちをかけられたのが、CPUの仮想化対応の有無。何故か@MINOの環境では64bitOSのインストールができず、何度も何度もやり直ししました。結構長い期間解決できずにとりあえず32bitOSはインストールできたのでそれでしのいでいました。
しばらく情報収集をしていたところ、そもそもCPUの仮想化対応がないと仮想マシンを立てることができないという噂を目にしました。
おそるおそるインテルのCPU情報を確認してみると@MINOのパソコンのCPUは
仮想化対応無し
とのことでした。
……。
安いパソコン買うもんじゃないな…。お金欲しいな…。
次はきっとMacを買おうと決意した瞬間でした。
恐怖のLinuxサーバインストール・設定
3ヶ月目〜4ヶ月くらい
- サーバ環境を必要に応じて組めるようになりたい
- OSインストール ★★★
- インストール後の設定 ★★★★★
- SSHの設定 ★★★★
- シェルの設定 ★★★★
- 必要なソフトウェアのインストール ★★★★★
- iptableの設定 ★★★★★
- ネットワーク関係の設定 ★★★★★
- などなど
何もかもが辛い日々でした。なんでこんなに難解なんだろう。Windowsって優しかったんだな。ウンコとか言ってごめんね。
ともかくLinuxサーバのインストールや設定は初心者にとってはちんぷんかんぷんでした。意味が分からない。うまく設定できない。動かない。元に戻せない。心が折れること数十回。
ああ、おそらくここでみんなプログラミングを断念するんだな、と思いました。
でもなぜか諦めずに続けることができました。心は折られましたが、どこかで楽しいとも感じていたのも事実です。変態なのかもしれません。
今でもこの辺は鬼門ですが、やるとやっただけ血肉になっている気がします。
黒い画面が好きになる
4ヶ月目〜5ヶ月くらい
- プログラミング環境をCLI(仮想端末エミュレータ)へ
- Vim ★★★★
- vimrc設定 ★★★
- VimScript ★★★★
心を折られすぎて強くなったのか、ある程度時間がたつと黒い画面が好きになっていました。
むしろGUIって必要最低限以外は必要なくね?とか思い始めていました。変態なんでしょう。
IDEも便利でよかったのですが、深みにハマり始めたCLI環境でプログラミングをするために、噂に名高いVimを使ってみることにしました。
…なんだこれ。
変なエディタでした。今まで使ったことのあるエディタアプリケーションのどれとも違う独特すぎる操作感。
こんなんみんな本当に使いこなしているのか?
うそだろ?
モードの概念が最初まったく慣れず、四苦八苦したことを覚えています。
でもvimrcでのカスタマイズを覚えたあたりからVimに抵抗を感じなくなりました。
ライブラリの管理
4ヶ月目〜5ヶ月くらい
- ライブラリをちゃんと管理したい
- Composer ★★★
- npm ★★
- gem ★★
- pip ★★
すこしずつプログラミングにも慣れ始め、既存のライブラリを使う機会も増えました。
いろいろな言語にいろいろなパッケージ管理システムがあることを知りました。最初はjavascriptのnpmからだったと思います。
ライブラリを引っ張ってくるシステムなので基本的には難しくなかったのですが、PHPの場合Composerでオートロードというクラスなんかを読み込む機構があり、そのための規約が存在していることを知り、難しくて心が折れました。
ベンダーの名前空間ってなんだよ。 完全修飾クラス名ってなんだよ。
名前空間という概念をこの時初めて知りました。順をおってみるとそれほど難しくない概念だったのですが、Composerのオートロードが何回やってもうまく行かず、俺ってバカなんだなと半泣きしたのを覚えています。
結局Composerが出力するオートロード用のファイルの中身を全部みて理解した次第です。(クラスファイルのパスを全部追った)
バージョン管理
5ヶ月目〜6ヶ月くらい
- コードを管理したい
- Git ★★★
- GitHub ★★★
これらを使う動機はどちらかというとバックアップの為というのが大きかったです。ローカルだけで作業しているとどうしてもコードをバックアップしないと不安です。
そんなわけでいろいろ調べていたらGitを知りました。バックアップだけでなく履歴も残せるなんてなんて便利なんだろう。
このソフトはLinuxを作ったリーナス氏謹製と知り、ああ能力のある人はなんでもつくれるんだなと思いました。
この頃にはCLI環境にもまったく恐怖感を感じなくなっていたので導入は気軽でした。それほど苦労せずに使い始められた記憶があります。
GitHubに関してはリモートバックアップという用途の他に、他人のコードが山ほどあるという素晴らしいサービスであることに気が付きました。
未経験独学でプログラミングをやっているとどうしても他人のコードに触れる機会が少ないのですが、 GitHubのおかげでコード読み放題です。
これはとても勉強になりました。
テスト駆動ってなにさ
6ヶ月目〜7ヶ月くらい
- テストを行いたい
- PHPUnit ★★★★
日々いろいろな情報を得ようとwebサイトをふらついていましたが、よく目にするのが「テスト」という工程の話。
バグを少なく、保守性の高いプログラミングを行うにはテストが必要だと。
人生もバグがたくさんの@MINOとしては、テスト、やらねばならないことだと思いました。
でもこれプログラミング自体にかなり造形が深くないとうまいテストを組めないんですね…。
アサーション?スタブ?モック?
いろいろな未知の概念がぶわっと襲ってきて、久しぶりに心を折られました。
今のところなるべくテストも書いていますが、躊躇してプログラムが進まなくなるという本末転倒な状態になるよりは、テストを書かないでプログラムを量産して経験値を積むもの大事かと思ってやっていマス。
継続的インテグレーションと自動化
6ヶ月目〜7ヶ月くらい
- 自動的に処理をおこないたい
- jenkins ★★★★
- slack ★
継続的インテグレーションという言葉をよく目にしていました。テストが済んだ箇所を持続的にくっつけていき、バグをつぶしながら進む開発手法だそうで、そのために使うjenkinsというソフトがあるのを知りました。
よくよく調べるとjenkinsはなんらかの処理を自動化するためにもかなり使えるということを知りました。
継続的インテグレーションはまだ@MINOには早いので、自動化の方面でjenkinsを使うことにしました。
GitHubとの連携やファイルのコピーなど今まで自動化できると便利だなと思っていたことがjenkinsで実現でき、感動しました。
導入難易度は結構高かったです。なんにでも使える便利な執事なので、jenkins本体の設定もいろいろ、プラグインも膨大、各サービスとの連携設定もいろいろ、ともかくいろいろ調べまくった記憶があります。
特にjenkinsにサーバへ自動ログインしてもらい何らかの作業をシェルスクリプトで行ってもらうのが難しく、うまく行くまでにかなり時間がかかったと思います。
ssh通信・ポートフォワーディングなど、そのへんの知識をかなり得られたと思います。
slackは通知のために使いました。友達も同僚もいないので誰ともチャットする必要もないのですが、流行りみたいだし。
@MINOのslackはjenkinsさんの画像でうめつくされています…。
それはそうとjenkinsで調べると、北朝鮮に亡命していたジェンキンスさんの情報が出てくるんですね。 佐渡のおみやげ屋さんで働いているそうで…。
はじめて単一の開発でプログラムが1000行を超える
7ヶ月目〜8ヶ月くらい
今まで作っていたのは自分発注の数行〜数百行の小さいプログラムばかりでしたが、ひょんなことから仕事をお願いされ、スクレイピングシステムを作ることになりました。
時間は結構余裕をいただけたので、徹夜しながら…とはならなかったのですが、ともかく1つのものを完成させる苦労というのはなかなか大変なんだなと思いました。
結局このシステムはコメント抜きで6000行(PHPだけでなくjavascriptやHTMLを含めて)を超えるものになり、自分でもよく書いたなと思いました。
一応うまく稼働しているのでお金をもらうこともできました。
完成までに一ヶ月近くかかりました。時間がかかったのは進めていくとどこかで不具合がたまり設計を変えざるを得ないこと自体に数回出くわしたからです。
この時、最初の見通しや設計の重要性に気が付きました。
またプログラミング自体の効率性の確保やツールなどの活用・習熟、さらなる自動化、テストの実施など足りない部分もいろいろ露呈しました。
プログラミングを仕事にするのは大変だな…。
いい経験になりました。
コンテナ型仮想化技術
8ヶ月目〜9ヶ月くらい
- コンテナ型仮想化技術を使いたい
- Docker ★★★
- Docker Compose ★★★
開発環境をさらに効率よくするにはどうしたら良いか悩んでいたところコンテナ型仮想化技術というものを知りました。
VirtualBoxよりも簡単に仮想マシン(コンテナ)を立てることができる、コンテナ設定をテキストファイル化できる、本番環境でも使える、など美味しそうな技術であることがわかりました。
このころではもう、「何事も慣れ」という境地にあり、最初はまったくDockerのことを理解できませんでしたが、ゴリ押しでいろいろいじっているうちになんとか使える様になりました。
導入難易度が低めに感じたのは経験の集積もある程度関係しているかも。
ともかくこのDocker、@MINOとしてはめちゃめちゃ性にあっている技術でした。できるだけ環境を汚したくない傾向が強い@MINOですが、コンテナは使い捨てがいくらでもできるので、開発環境を使い捨てにできることにとても魅力を感じています。
またDockcerfileはLinux設定のテクニックの塊で、とても勉強になりました。最初はDockcerfileに苦手意識が(シェルスクリプトがうまく読み解けない)ありましたが、最近ではDockcerfileを読み解くが楽しくなっています。
今では開発環境・本番環境ともにDockerを使っていろいろ経験をためています。
まだまだ続くよ
To be continued…