45歳からはじめるPHPプログラミング、プログラミングを初めて16日目までの軌跡(クラスまで書けるようになったよ！)

本稿は[YYPHP Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/yyphp)の10日目の記事です。

## はじめに

YYPHPという、PHPプログラマが集まって雑談するというイベントが毎週開催されています。これまで60回以上開催されてきました。筆者はこのイベントを運営する側ではあったもののインフラエンジニアなのでプログラムを開発したことがありませんでした(Bashは書いてる)。会を重ねていく毎に熱いPHPer達に会い、僕もプログラムを書いてみたいと思うようになり勉強をはじめました。週末の時間のある時に勉強するというスタイルのため進捗はゆっくりでしたが、効率的に確実に学びを得られたと感じたので、僕なりの学びの中で学んだこと学び方や、「こういうルートをたどって勉強を進めた人もいたよ！」ということを知ってもらえたらと思い書きました。誰かの最初の加速装置に少しでもなれたら嬉しいです。

* YYPHPの参加方法を知りたい方は、[connpass](https://yyphp.connpass.com/)をご覧ください。
* YYPHPの雰囲気を覗きたい方は、[YouTube](https://www.youtube.com/playlist?list=PLpOeTEye3Bg6PodrLHHC72jWMJYZz8VbG)の動画をご覧ください。
* YYPHPの過去ログを読みたい方は、[Qiita](https://qiita.com/tags/yyphp)に投稿されたイベントレポートをご覧ください。

![](https://camo.qiitausercontent.com/62dc259d2108509953720900dd946705252944f2/68747470733a2f2f63646e2e7375696e2e696f2f71696974612f323031382d31322d30312d6566666563746976652d7068702d6c6561726e696e672f312e6a7067)

## PHPを学び始めるにあたって

* この記事は、これからPHPを学び始める初学者が、自ら学んで理解を深めていく手助けになればと思い、16日の間、何をどう学んでいったかを簡単にまとめたものです。

### はじめに

#### ツール

* PHPの開発環境はMacに `brew install php` でインストールしたPHPを使っています。いま使っているのはPHP7.1です。
* PHPを実行する時にターミナルを使います。デフォルトで入っている「ターミナル」でも良いですが、僕は「[iTerm2](https://www.iterm2.com/)」を使っています。
* ApacheとかMySQLとかは最初は使いません。純粋なPHPだけです。
* ApacheはWebサーバです。ブラウザでアクセスする場合はこれを使うのですが、Webサーバの構築のこと、通信のこと、ブラウザでのデバッグ方法などを学ばなくてはなりません。初心者、特に独学の人にはちょっと荷が重いかなと思います。ゆくゆくは必要になりますが、純粋にPHPのアルゴリズムを学ぶためには必須ではありません。
* MySQLはデータベースサーバですが、Apacheと同じ理由で最初は不要です。

#### エディタ
* Atom
    * 初学者は[Atom](https://atom.io/)で良いと思います。
    * 無料だし使いやすいです。
    * GitHubが開発したオープンソースのテキストエディタです。
    * 私はこのAtomを使っていましたが、師匠の[reoring](https://qiita.com/reoring)からコメントを貰い、いまは初心者は下記2つめのVS Codeがお薦めのようです。
* [Visual Studio Code(VS Code)](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)(2018/12/17 追記)
    * マイクロソフトが開発したエディタです。
    * 無料でオープンソース。
    * macOS、Windows、Linux で動作。
    * Node.js、Java、Python などをビルドおよびデバッグできる。
* PhpStorm
    * IDE(統合開発環境)です。
    * クラスとかを使って複雑なアプリケーションを作るとか、フレームワークを使うようになったらPhpStormをお薦めしたいです。
    * 有料ですが、誤りを指摘してくれたり、コードをレコメンドしてくれたり、関数やクラスを「コマンドキー+クリック」するとその元の場所へ飛んでくれたりするので、初学者には読み解け無いプログラムを読み解く手助けをしてくれます。
    * これだけでエラーに費やす時間を削減してくれ、仕事の品質を高めてくれます。
    * なので、IDEを使わずに費やす自分の時間を時給に換算したら安いものではないでしょうか。
    * [PhpStormを使おう](https://qiita.com/suin/items/7a11bb236b5e9eb21528)

## 動画で学ぶ

* 僕は1日目、2日目はUdemyの動画でPHPの基本を学びました。
* 動画の良いところは、講師がテキストに沿って画面操作を見せながら解説をしてくれます。画面操作が見れるので、何をやっているのかが分かり、あっそこそうやるんだ！っていうこともわかります。音声で補足も入れてくれるのでわかりやすいです。
* [PHP初級プログラミング講座　初級　その１ | Udemy](https://www.udemy.com/php-gtoa/)
* [PHP初級プログラミング講座　初級 その2 | Udemy](https://www.udemy.com/php-2-kh/)
* ちなみに、今なら2018/12/14まで限定で各コース￥1,300からで利用できるようです。僕も安いタイミングで購入しました。
* 他の動画で学ぶコンテンツもあります
    * [PHP入門 (全30回) - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_php_v2)
    * [環境構築不要！初心者でも楽しく学習できるプログラミング入門サービス【paizaラーニング】](https://paiza.jp/works)

### 動画で学ぶコツ
* 早送りを使う
    * 時間を節約できます。
    * Udemyは0.5倍速から2倍速まで調節でき、僕は1.25倍速と1.5倍速を利用しました。
* 手を動かす
    * 見てるだけでなく、先生を真似て手元で手を動かしましょう。
* 不明なところはインターネットで調べながら
    * 動画は止めたり戻したりがいくらでもできます。不明な言葉なんかも都度調べながら、[HackMD](https://hackmd.io/)などにメモしながら進めましょう。

## 課題をやってみる(PHP Quiz)

* 動画での基礎の学習が終わったら、実際に自分で考えてコードを書いてみましょう。
* 何か簡単なものからで良いです。
* 幸い、僕には課題を出してくれる[suin](https://twitter.com/suin)や[れおりん](https://twitter.com/reoring)という師匠がいて、下記のPHP Quizを出してくれました。皆さんもぜひチャレンジしてみてください。

### 課題をやるコツ
* 自分で考える
* 考えて調べる。調べまくる
* そしてわからないなりにとにかく書いてみる
* 自分の頭で悩んで考えることが大切
* var_dump($変数)を使いまくる
    * これを使うとそのタイミングで変数がどんな値を持っているのか(または持っていないのか)がわかります。

### 課題
1. 九九の表を出力する
    2. 九九ができたら20x20をやってみる
    3. 桁がずれるので合わせる
2. [45歳から始めるプログラミング PHP編 No1 多次元配列を1次元配列に変換する関数を書け！(再帰処理で)](https://qiita.com/nouphet/items/a666e359e43c6e28ef6b)
3. [カレンダーを出力する](https://qiita.com/nouphet/items/886bf5d42a5d13be1b2e#45%E6%AD%B3%E3%81%8B%E3%82%89%E5%88%9D%E3%82%81%E3%82%8Bphp%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
4. [多次元配列から要素を一撃で取り出す関数を実装する](https://qiita.com/nouphet/items/886bf5d42a5d13be1b2e#yyphp-quiz-no3-%E5%A4%9A%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%81%8B%E3%82%89%E8%A6%81%E7%B4%A0%E3%82%92%E4%B8%80%E6%92%83%E3%81%A7%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6)

* 2つ目の課題は再帰関数というもののアルゴリズムを書くのですが、これが書けるかどうかでプログラマとしての素養がわかるみたいです。最初は時間がかかっても頑張って考え抜きましょう。
* 余談ですが、「実装する！」ってなんかカッコよくないですか！w

## 自分用の便利ツールを作ってみる

* 実用性が大事です！
* 実用性あると楽しい！
* 自分が便利になるのでモチベーションが上がる〜！🔝

### 開発したもの
* 僕が最初に作ったのがこちらです。
    * [nouphet/get-connpass-member-list: コンパスの参加者リストを一撃で取得するスクリプト](https://github.com/nouphet/get-connpass-member-list)
* 最初は関数(function)を使わずに、知ってる書き方、調べてみて良さそうと思った機能や文法で思いつくまま書いてみる！
* コードが増えてきたら関数にまとめていく
    * スッキリして可読性が高くなる → 何をどこに書いたかわかりやすい！
    * 嬉しい！
* クラスにする
    * オブジェクト指向のエッセンスを学ぶ
* いまこの「クラスにする」の途中で、機能を追加しながらファイル(バージョン)を上げていっています。

### 開発中のものを誰かに見てもらう

* [GitHub](https://github.com/)にコードを上げておくと、誰か(師匠とか先輩とか)に見てもらいやすくなる。その場にいなくてもリモートで時間のある時に見てもらえるから助かります。
* Issueというのがあって、ここをこうした方が良いよって指示をもらえる。
    * 例) [Issues · nouphet/get-connpass-member-list](https://github.com/nouphet/get-connpass-member-list/issues?q=is%3Aissue+is%3Aclosed)
* ちなみに、先輩や同僚とかと一緒にペアプロするもの良さそうですよ！

## 今後の学び方

僕が16日目までで実践し学んだことは以上です。
今後、学びを深めて行くには、こういう方向性があるかなというのを挙げてみました。

* [PHPの効率的な学習法: YYPHP60回開催を通じて、先輩PHPerから得られた35の知見](https://qiita.com/suin/items/edb067f2e5df713e966d)を読む
* プログラミングコンテストに参加してみる
* 問題集をやる
    * [もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問 eBook: 増井敏克](https://amzn.to/2LfBSa4)
    * [プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問 | 増井敏克](https://amzn.to/2rzftvi)
* スクリプト開発を続けてアルゴリズムに集中する
    * 作ったやつをパワーアップしていく
    * 新しいツールを開発する
* ウェブサービスを作ってみる
    * 追加で学ぶこと
        * HTML5/CSS3を学ぶ
        * JavaScriptを学ぶ
    * まずは学びのために
        * 自分用の便利ツールでOK！
    * 次は実務で仕事を受けて
* 学び、デバッグの時間を短縮する(加速)
    * 開発ツールを使う(PhpStormなど)
    * 中級向けの動画を見る
    * xdebugを使う
* 質の良い学びを得る
    * メンターを探す
* 中級者向けの本を読む
    * [PHP中級者を目指す 〜言語を使いこなすための本〜 - このすみ堂](https://booth.pm/ja/items/1025112)
* Dockerを学ぶ
    * [#マンガでわかるDocker ① 〜概念・基本コマンド編〜 【ダウンロード版】 #技術書典 4](https://booth.pm/ja/items/825879)
    * [#マンガでわかるDocker ② 〜開発環境を作ろう編〜 #技術書典 5 【ダウンロード版】 - 湊川あいの、わかば家。](https://booth.pm/ja/items/1036317)
* 勉強会に行く
* 良いメンターを見つける
* 自ら情報や人(メンター、仲間)を探しに行く
* フレームワークを使うなら、Laravelがお薦めです
    * [Laravel - ウェブ職人のためのPHPフレームワーク](http://laravel.jp/)
    * Laravelを学ぶのにおすすめの本 → [絶対に挫折させないアプリ開発　はじめてのLaravel](https://plumsa.booth.pm/items/1048008)
* 設計を学ぶ
    * オブジェクト指向を学ぶなら[ぺちオブ](https://phper-oop.connpass.com/event/)に参加するのがお薦め！
* 他にどんな言語があるのかを知る
    * 言語によって向き不向きがある。
    * 面白い世界が広がっている。
    * [プログラミング言語図鑑](https://amzn.to/2QLL2Qv)

## 他に考えられるPHPの基礎的な課題はこんな感じ
* ifとforを使って作る系
* 多次元配列の操作
* 再帰関数
* うるう年を計算する
* 三角形
* 生年月日から年齢を計算する
* カレンダー(ウェブ版)
* BBS
    * これは割とベーシックな課題みたいです
    * 面白そう♪
* Twitterのクローンを作る
    * 仕様を真似できるやつはやりやすいため

## 心構え

一人では難しいことでも、諸先輩方の力を借りれば歩みはぐっと早くなります。可能な範囲で力をお借りするのは良いことだと思っています。ただし、力を借りまくったままでは良くないと思います。受けた恩は必ず何かで返すつもりでお願いしましょう。缶コーヒーでも、仕事で返すでも、ご飯を御馳走するでも。もし例え先輩に返せなくても後輩に受け継ぐという道もあります。良いつながりを作っていきましょう。

## 終わりに

以上ですが、いかがでしたでしょうか？

仕事でプログラムを仕上げなくてはならない場合は、考え抜いてる暇なんてなかったりすると思います。仕事は仕事でその時の最善の方法で進めて、自分のスキルアップは別軸でじっくり取り組むというのも確実なスキルアップの方法だと思います。最初はゆっくりの歩みでも、わかってくると最初に感じたわくわく感が何倍にもなり、学びのスピードも深さも喜びも大きくなっていくでしょう。頑張ってください。僕は頑張る人を応援します！！

YYPHPではPHPでの困ったことなどで聞きたいこと、伝えたいこと(想い、LTなど)、見てもらいたいこと(レビュー)など、PHPに関連することであれば何でも受け付けています。まだ参加したことのない人はぜひ一度参加してみてください！PHP歴マイナス15日の人も参加していますので(笑)、お気軽にどうぞ〜♪

最後に、出稿が遅くなったことをお詫びいたします。

![](https://camo.qiitausercontent.com/90e97f9110e96bd1ce12dd1b0ea2f59456494a1c/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f353335342f36643963653333642d663764662d626533652d363663322d3966643430373835323466352e6a706567)