障害者支援施設の職員がPHPとLaravelで社内Webシステムを作るまでに勉強した話

#障害者支援施設の職員がPHPで社内Webシステムを作るまでに勉強した話


##はじめに
はじめまして。
障害者支援施設の職員として勤務している者です。

少し前の話になりますが、色々あり障害者支援施設の職員をしつつPHPで社内（法人内）のWebシステムを作ることになったので、その際に勉強したことなどを自分の振り返りもこめて投稿してみます。

Qiitaへの記事投稿は初めてなので、読みづらい部分が多いかと思いますがご了承ください。


##投稿者はどんな人？

* **年齢**：ギリギリ30代のおじさん。
* **職歴**：障害者支援経験10年以上で、いくつかの障害者支援施設（放課後等デイサービスや児童発達支援、グループホーム、生活介護）に勤めてきました。

* **お仕事**：普段の業務としては障害を持った方の支援、送迎、支援者や行政との打ち合わせ、利用者や職員のスケジュール調整、請求業務などを行っています。

* **PC経験**：ワードやエクセルは簡単な帳票を作ったり出来る程度。
Webに関しては自分のブログをWordPressで立ち上げたり、学生の頃にHTML手打ちでテーブルレイアウトの個人ホームページを作った経験有り。そのため幸いな事にHTML、CSS、JavaScriptがどういうものか程度の知識は有りました。



##システムを自分で作ろうと思ったきっかけ
* 障害福祉業界はいまだに紙ベースの業務で、同じことの繰り返し作業が多く、システム化して業務改善やペーパレス化に繋げたい。
* コンサルを頼んだりシステム屋さんに開発を委託しようとしても、福祉施設の売り上げではその予算を作ることが出来ない。
* kintoneやグループウェアなどの汎用的なものでは業務に対応させることが難しく、職員のITレベルではそれらの操作自体も困難。

現在所属している法人の代表や役員さんも、上記の事を法人全体の課題として考えており、ITに明るい（と思われてる）私に無茶ぶりとも思える指名が来たのがきっかけです。

無茶振りではあるものの、上の人たちがITへの理解があるのは幸いです。

##作ったシステムについて
作ったシステムについての概要が有るとより分かりやすいとご指摘をいただいたので、簡単ではありますが機能を紹介します。
※この項目については2020年7月21日に追記しました。


* 利用者、職員、事業所等のマスタ
* 利用者と職員のスケジュール調整機能
* 利用者のプロファイルシートや電子カルテ
* サービスの提供内容と実績の登録
* 各種帳票の作成と表示
* kintoneやGmailとの連携
* 法令を違反していないかのシステム的なチェック
（サービス提供回数の上限や、職員数の不足がないか等）

基本的には紙ベースの部分やExcel管理、目視や読み合わせでのチェックしていた箇所をシステム化しています。

なお、これらの機能は当初から1度に作りこんだわけではなく、何度か段階に分けて作成しており、現在も改善点を見つけたり職員さんの要望を受けて改修や機能の追加を行っています。



##システム開発のための勉強について
いざWebシステムを開発といっても、昔のHTML以外はさっぱりなので、暫く通常業務を続けながら帰宅後や土日を使っての勉強を開始します。


###使用言語の選択
社内システムを作るといっても、Webの基礎知識しかないためウインドウズアプリやスマホアプリの開発は無理です。そのため自動的にWebアプリでの開発を目指します。

Webアプリを作るにあたって無難そうな言語を選ぶと、PHP、Java、Python、Rubyが出てきたので、大きな本屋へ行きそれぞれの言語の入門書をいくつかパラパラと眺めます。
ちなみに自宅の買い物圏内に大型書店が数軒あったので、後々も含めてかなり助けられます。

いくつか眺めていく中でPHPの構文が一番理解しやすかったのでPHPでの開発を選びます。自分のWordPressサイトのカスタマイズ（ソースコードをコピペですが）なども行ったことが有ったのもイメージを持ちやすかったです。


###PHPの勉強
PHPの勉強にはインターネット上で評判の良かった**「パーフェクトPHP」**を購入し、実際にいちからプログラムを書きながら学んで行きます。
<img src="https://image.gihyo.co.jp/assets/images/gdp/2014/978-4-7741-6756-5.jpg" width="200">
ローカルマシンにPHPを実行する環境の立ち上げに少し手こずりましたが、本の序盤はスムーズに進みます。大昔のJavaScriptの知識で、変数、配列、ループ、条件分岐、関数の概念が有ったので助かりました。

しかし、5章のクラスとオブジェクトで理解が出来なくなります。
インターネットで「オブジェクト指向」などを検索して調べても、概念や使用するメリットなどが全く分からず。

とりあえず実際の理解は後回しで、本の内容を打ち込んでサンプルコードを動かし「このような書きかたも有る」程度の理解にして先に進みます。

なお、オブジェクト指向についてはこの後に出てきますが、別の本を買うことでなんとなくのイメージが持てるようになります。


その後の自作フレームワークとブログアプリの作成では合計で3週間ぐらいかけて作成します。
自作フレームワークとブログアプリの作成で主に苦労した点としては以下

* Mysqlとデータベース処理関連。
* オブジェクト指向を理解していないので、コア部分の作成と処理の流れの理解。
* 買った本の版が古かったので、本の記載ミスが有って躓く。

とりあえずは本どおりにプログラムを書き写し、エラーや動かない部分が出た場合には検索して調べたり、echoやvar_dumpで変数の中身を表示しながら地道にデバッグして作っていきました。

内容については少し調べても分からない場合は、完全な理解よりもとりあえず完成させることを優先させました。


その次のセキュリティに関しては、サンプルのプログラムを書いて実行させながら「こんな問題があるのか」ぐらいの認識で軽く行います。これはセキュリティを軽く見ているのではなく、セキュリティ部分に関しては別に学ぶ予定が有った為です。

その後の項目も軽く流して「パーフェクトPHP」を終了。


その次はPHPのもう少し細かいところと、「パーフェクトPHP」はPHP5ベースで内容も古いとの事で、新しいPHP7の技術を知りたいため**「レベルアップPHP ～言語を理解して中級者へ～」**を購入。
<img src="https://nextpublishing.jp/wp-content/uploads/2019/04/N00863.jpg" width="200">



「レベルアップPHP」では新しい記述方法や便利な機能を学びます。

また派生としてテンプレートエンジンのSmartyを軽く弄ってビューの分離による可読性の向上を意識したり、フレームワークLaravelの利用についても興味を持ちます。

Laravelの学習については後述。



###JavaScript
JavaScriptは基本が分かる（分かってるつもり）から、何とかなるとか思っていましたが、20年に書いてものと現在のものは構文も出来ることの範囲もかなり変わっている様子です。さらにインターネット上のサンプルを見ても分からないことばかりだったので、JavaScriptも勉強しないとと思い**「JavaScript本格入門」**を購入します。

<img src="http://image.gihyo.co.jp/assets/images/cover/2016/9784774184111.jpg" width="200">

変数、関数、制御構造など基礎的な事はスムーズに理解できたので、現在の書き方（ECMAScript 2015）を中心に覚えます。

それと、Webアプリケーションで必要となるであろう、DOMの操作とイベント処理。
DOMの操作とイベント処理は実際にWebアプリを作る際にフォームの入力チェックや各種アラート表示、リアルタイムでの描画などでかなり使用しました。

JavaScriptのオブジェクト指向についてはPHP同様理解が出来ないので、一通り読んでプログラムを書き写して動かす程度ですませます。

その後はJavaScriptのフレームワークということで、一番導入が簡単そうなvue.jsにも手を出してみますがこちらは途中でストップ中。

jQueryも少し触り、サンプルを改造する程度で画像のライブラリや非同期通信処理などを行ってみました。




###セキュリティ
セキュリティについては**「安全なWebアプリケーションの作り方」**を購入し勉強。

<img src="https://wasbook.org/wasbook.png" width="200">

600ページを超える分厚い本だったので買った際は圧倒されましたが、サンプルのソースコードがPHPで書かれていたので比較的スムーズに進めることが出来ました。

入力と出力、データベースへのアクセスは特に意識を高めないとと思いました。



###SQL
SQLについては特に本は買わず、インターネット上の情報と実際にDBを作って基礎を勉強。
一通り以下のSQLのコマンドを打って動きを理解します。

* **テーブル関係**
CREATE TABLE、DROP TABLE、ALTER TABLE

* **レコード関係**
INSERT、SELECT、UPDATE、DELETE

* **条件や絞込み**
ORDER BY、WHERE、LIKE、BETWEEN、IN、AND、OR

* **その他**
トランザクション、結合、サブクエリ、基本的な関数関連、インデックス、ビュー

なお、この程度で済ませてしまったので、実際の開発でテーブル設計をする際に大きくつまずくことに・・・。


###Laravel
実際の開発用にはPHPのフレームワークであるLaravelを勉強することにしました。

勉強には**「PHPフレームワーク Laravel入門」**を購入しサンプルを実際に打ち込みながら学んでいきます。
<img src="https://www.shuwasystem.co.jp//images/book/425684.jpg" width="200">

それにしてもフレームワークは必要な機能が全部そろってるので便利ですね。Laravelを学ぶ前に勉強用として簡単なWebアプリを作っていましたが、Laravelだと全て機能がそろっているので、自分で作りこまなくても良いのがとても楽でした。
逆にWEBのやPHPやSQLの基礎を知らず、いきなりLaravelから入ってたら・・・と思うと怖かったです。

「Laravel入門」を終えた後は、実践的な開発をというとで、こちらの**[「入門Laravelチュートリアル」](https://www.hypertextcandy.com/laravel-tutorial-introduction "「入門Laravelチュートリアル」")**で、TODOリストを作りながら必要な機能の実装方法を学びました。

その後「Laravel入門」の続編である**「PHPフレームワーク Laravel実践開発」**が出ていることを知ったので、こちらも購入。

<img src="https://www.shuwasystem.co.jp//images/book/471334.jpg" width="200">
Configクラス、ファイルシステム、リクエストとレスポンスなどは後にアプリを作る際にとても約に立ちました。




###オブジェクト指向
PHPとJavaScriptの本を学んだ中で、理解が困難だった部分がオブジェクト指向の概念。

クラスを作る、継承や実装、カプセル化などはそれぞれはなんとなく分かりますが、実際の使いどころやメリットなどはいまいちパッとせず。

そこでオブジェクト指向を学ぶために**「オブジェクト指向でなぜつくるのか」**を購入しました。

<img src="https://cdnshop.nikkeibp.co.jp/0000/catalog/P81950/P81950_common_pc.jpg" width="200">

まだ開発の経験が少ないためか残念ながら本質の理解はできませんでした。ですが、ありがちな「動物クラスを継承して犬クラスと猫クラス・・・」という考え方よりも、機能的な面で「処理や機能をまとめる」「部品の独立性を高める」「コードの重複を減らして汎用性を高める」ために、クラス化やカプセル化、継承や多様性が必要と割り切って覚えることにしました。



###デザイン
デザインについては基本的にセンスが無いので勉強は断念。
ただし、Bootstrapなるcssフレームワークがあることを知ったので、Bootstrapの基本的な使い方をいくつかのサイトを見ながら弄ってみます。

ちょっと触った程度なので、デザインはいかにもBootstrapになってしまいます。でも社内用システムなので、最低限の見た目と、レスポンシブWebデザインになれば問題ありません。なので、デザイン面はBootstrapに丸投げすることに。


###アルゴリズム
アルゴリズムと言うのかどうかは不明ですが、**[「paiza」](https://paiza.jp/ "「paiza」")**に登録し時間があるときにゲーム感覚で問題を解いて遊んでいます。とりあえずランクはBまで上げることが出来ました。

本としては**「アルゴリズム図鑑」**を買い、一通り読んだ後にソートや探索のいくつかのアルゴリズムをPHPの標準関数を使わずに実装したりしました。
<img src="https://www.shoeisha.co.jp/static/campaign/book/algorithm/images/hyoushi.png" width="200">


###開発
実際の開発に関しては**「ずっと受けたかったソフトウェアエンジニアリングの新人研修」**を購入。
<img src="https://www.seshop.com/original/images/product/22039/L.png" width="200">
設計や開発の手法、必要なドキュメント、テストなどを学びました。設計については今現在も行き当たりばったりで、後々困ることも多いですが、経験を積んで効率良い方法をとって行きたいです。

　

　
開発関連では**「トラブル知らずのシステム設計」**も購入。
<img src="https://cdnshop.nikkeibp.co.jp/0000/catalog/264020/264020_common_pc.jpg" width="200">
戻るボタン対応、データベースへのアクセス速度等、実際の開発で問題になる事例と対策方法が学べました。

　

　
ソース管理については**「いちばんやさしいGit＆GitHubの教本」**を購入。
<img src="https://img.ips.co.jp/ij/18/1118101036/1118101036-520x.jpg" width="200">
とりあえずパソコン内にGitをインストールしVisual Studio Codeと連携してローカルで管理をしています。

　

　
プログラムの書き方については**「リーダブルコード」**で学習し、読みやすいプログラムを意識するようにしています。
<img src="https://www.oreilly.co.jp/books/images/picture978-4-87311-565-8.gif" width="200">

今は変数や関数のわかりやすい名前、的確で分かりやすいコメント、シンプルな処理、1つの処理に機能を盛り込みすぎない、複雑や長いものは分割するという事を意識しています。


###その他
開発やプログラムの勉強とは実質関係無いのですが**「ひとり情シス」**という本も購入。
<img src="https://str.toyokeizai.net/files/topics/147_ext_01_0.jpg" width="200">

実際既にプリンタやパソコンのトラブル、場合によってはトラブルで無いようなものでも（Excelでセルが結合できない、ワードに図を入れたいなどでも）その都度呼ばれたりするので結構共感することも多かったり。

さらには今後システムを開発して運用していく上で、意識しなくてはいけないことなども学びました。



##最後に
というわけで、障害者支援施設の職員がPHPで社内Webシステムを作るまで勉強した話を書きました。さらっと書くつもりが、ダラダラと長いものになってしまいました。

ここで紹介した以外にも本を何冊も買っていたので、勉強期間は合計で半年ほどかかったと思います。

ここまで勉強する上でとても恵まれていたのが、自宅の近くに大型の書店が数店舗あり、思い立ったら直ぐに買いに行けた点です。Amazonなどで高評価の本などを注文しても、実際読むと自分には難しすぎる事などがありましたが、実際に書店で流し読みすることで自分のレベルに適した本か判断しやすかったのが良かったです。

今現在も業務の一環で社内システムを作ったり修正していますが、自分ひとりなのでこの作り方が正しいのか間違っているのかが分からないのは不安です。それとまだまだ勉強しなくてはいけない事も多いので、今後も頑張っていきたいです。

作ったシステムの内容についてはそのうちに書くことが出来たらと思っています。

最後まで読んでいただき、ありがとうございました。