レガシー開発環境を今風の開発に近づけるために一年やってきたこと

#自己紹介
@pugiemonn　といいます。
オンラインサロンプラットフォームを手掛けるシナプス株式会社で開発とマーケティングを担当しています。

![シナプス画面](https://qiita-image-store.s3.amazonaws.com/0/1624/08e87f88-2575-6876-ea2a-57fc2af5a25b.png)

---

#今日の話
1年前にレガシー環境に参加したメンバーがレガシーな問題に対して、どのような取り組みを行ってきたかお話します。

---

#開発チームメンバーゼロ問題 :no_good:

---

#社長１人で3年開発していた
* １人で走るのはつらい
* 突然ユーザー数が増加しはじめピンチに

![LGTM_tamuken.png](https://qiita-image-store.s3.amazonaws.com/0/1624/581d5e03-712b-9e3d-7a66-3f68cade5f20.png)

---

#求人がんばった結果 :blush:
チームメンバー10名（インターン生含む）になりました✨

![DSC_4888.jpg](https://qiita-image-store.s3.amazonaws.com/0/1624/c5061bb7-9ad6-d0cd-25ce-07fa73e1d667.jpeg)


---

# バージョン管理されてない問題 :no_good:

---

#1人だったのでバージョン管理など無かった

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/57c61a64-1621-6fd4-8eb1-3e3fe715e66a.png)


---

# GitとGithubを導入した結果 :blush:
* まずはSourceTreeから :sparkles:
* 作業ログがわかるようになった :sparkles:
* 問題発生箇所の調査が容易に :sparkles:


---

#作業がチケット化されていない問題 :no_good:

---

#1人だったのでチケットなど無かった  
* 何のタスクかわからない :poop:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/8a9822be-4b2c-7c4c-98fb-3d416de2b90e.png)



---

# チケット管理した結果 :blush:
* 何の作業かわかるようになった :sparkles:
* 現在はBacklogを使用 :sparkles::sparkles:
* Githubとの連携で調査が容易に :sparkles::sparkles::sparkles:

---

#デプロイがSFTP問題 :no_good:

---

#FTPクライアントTransmitでアップロード
* ちょっときつい😓😓😓😓😓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/7f686208-fca3-0cac-f420-65e59111dbce.png)


---

# デプロイの自動化を進めた結果 :blush:
* ひとまずgit pullでデプロイするように✨
* 後にシェルを作ってデプロイ✨✨

次はElastic Beanstalkかも✨✨✨

---

#ローカル開発環境が存在しない問題 :no_good:

---

#当時は本番環境が開発環境
* 本番のEC2のコードをそのまま修正

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/f1bf8334-2a76-8370-8724-b0c9bb3421c5.png)

---

#開発環境をVagrantで作成した結果 :blush:
* ローカル開発環境が誕生✨
* 開発環境をチームで統一化✨✨
* 開発環境の自動化✨✨✨

ちょっとずつ改善されています😘


---

#１つのEC2インスタンスに全部乗っている問題 :no_good:

---

# LAMPが１つのEC2インスタンスに全部入っている
* MySQLもストレージも全部入っている
* 10GBのHD使用率が90％越え
* HDが溢れてしょっちゅう止まる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/3f6e0d7f-5d63-dc57-394c-0b727d8152fb.png)

---

#AWSのサービスに分散 :blush:

* S3を使用することで、HDが溢れて止まることがなくなる ✨✨✨

![s3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/1624/e273a777-a8f3-e727-5f32-e5d2bb0254ed.jpeg)

---

#DBを手動バックアップ問題 :no_good:

---

# 手動でたまにdump
* EC2インスタンスが壊れたりするとまずい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/e3d6175e-2071-d7fa-8e2a-9e8fb39d76d8.png)


---

#MySQLをRDSに変更 :blush:
* もしものときも復帰可能に！

![rds.png](https://qiita-image-store.s3.amazonaws.com/0/1624/6a4067ca-9f49-28a0-24cc-07de4a904c92.png)

---

#1人でがんばっちゃう問題 :no_good:

---

#３日くらい徹夜すればできるはず
* チーム開発経験が少ない
* １日は72時間あるから大丈夫など迷言増加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/05c270af-2eac-9e0c-ad42-5a53fc971e49.png)


---

#大変なときはチームを頼ろう :blush:
* 徹夜作業の減少✨
* 負債の減少✨✨

チームに共有する文化ができてきました😘

---

#無駄なコード多すぎ問題 :no_good:

---

#過去のチャレンジの負債
* CMSが何個もリポジトリに :poop:
* １つのコントローラが1万行以上 :poop::poop:

![nayami_thumb.jpg](https://qiita-image-store.s3.amazonaws.com/0/1624/81d5dda8-368d-dedd-52c1-a84340c94bf4.jpeg)

---

#不要なものを削除したり分割中 :blush:
* 不要なコード、CMSやライブラリを削除 :sparkles:
* コントローラを分割 :sparkles::sparkles:

徐々に見やすくなってます😘

<img width="501" alt="237万行削除" src="https://qiita-image-store.s3.amazonaws.com/0/1624/ca9f02f4-c562-8f4b-f337-eb1096b0aa06.png">

---

#命名適当すぎ問題 :no_good:

---

# 読んでもわからないコード
* `s`、`test1` のようなアクション名 :poop:
* `wpprpayment` のような謎の変数名 :poop::poop:

![headache.jpg](https://qiita-image-store.s3.amazonaws.com/0/1624/c71176d3-94f2-b82b-e42b-b15f1ada1466.jpeg)

---

#コーディング規約を入れたり勉強会した結果 :blush:
* PSR-2を導入 :sparkles:
* リーダブルコードの内容を一緒に勉強 :sparkles::sparkles:

　少しずつ読みやすくなっていますす😘

---

#型が適当すぎ問題 :no_good:

---

# 何でもテキストで判定
* Stringをキーにして判定 :poop:
* Trueの代わりに1という文字列が返る :poop::poop:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/4677c37b-c2cd-3cce-cab6-913a38599102.png)

---

#APIで返す型だけは担保 :blush:
* JsonSchemaを導入 :sparkles:

　APIの不具合が減少😘

参考 : [JSON SchemaとPHP](https://www.slideshare.net/hinakano/json-schema)

---

#DB管理と設計が適当すぎ問題 :no_good:

---

# 開発の度にカラムを足していた
* １テーブルのカラム数多すぎる :poop:
* 型が適当で正規化されていないテーブル :poop::poop:
* 必要なカラムだがぱっと見で意味不明なカラム名 :poop::poop::poop:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/56d59167-029c-edac-28ab-d161fa19669b.png)


---

#正規化して型を指定 :blush:
* 正規化してテーブルを分割 :sparkles:
* 命名を変更、型変更や制限を追加 :sparkles::sparkles:

日々の改善でだんだんわかりやすく😘😘😘

---

#PHPやライブラリ古すぎ問題 :no_good:

---

# バージョンが古い問題
* 遅いだけでなくいろいろ大変　:poop:
* 新しいライブラリが入れられない :poop::poop:

![php.png](https://qiita-image-store.s3.amazonaws.com/0/1624/860b2efb-9afd-1f95-f7f2-9ba6681f7961.png)

---

#PHPもSDKもバージョンアップ :blush:
* `array()` いらずなど :sparkles:
* パフォーマンスも改善 :sparkles::sparkles:



---

#CakePHP古すぎ問題 :no_good:

---

# CakePHP1.3系がメインだった
* 1.3 :poop:

![cake.jpg](https://qiita-image-store.s3.amazonaws.com/0/1624/2f39f9ea-9833-2d83-9b31-3fff08c9c611.jpeg)

---

#APIに切り出してCake2系に :blush:
* 既存ソースを使いたかったのでCakePHPを選択
* APIで主要機能を切り出しCakePHP2.X系に

---

#バグ多すぎ問題 :no_good:

---

# とにかくバグ多すぎ
* 土日にSlackへ緊急対応依頼がとぶ
* 手動テストの限界？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1624/83043475-20a1-c814-b9ff-65a8b228c816.png)

---

#CIでテストを実行した結果 :blush:
* CircleCIを利用 :sparkles:
* PHPUnitとSeleniumでカバー :sparkles::sparkles:

休日の緊急依頼が減少 😘😘😘

---

#色々ありました

---

#まだまだレガシー感あります

---

#１人で走るのは大変だったけど

![IMG_2573.jpg](https://qiita-image-store.s3.amazonaws.com/0/1624/b0bf1e14-51bc-ea6f-d9d3-57125447e078.jpeg)

---

#チームで走ればなんとかなるかも :blush:

---

#すこしずつ楽になっています

---

# 一緒に環境をよくしてくれる人募集しています:sparkles:
シナプス株式会社 http://corp.synapse.am/recruit
![_DSF8486.jpg](https://qiita-image-store.s3.amazonaws.com/0/1624/49c1b740-2024-fcd4-a5e2-1925b7345e03.jpeg)

---

#ありがとうございました

---


このスライドは [第103回 PHP勉強会＠東京](https://phpstudy.doorkeeper.jp/events/47217) でLTとして発表予定のスライドです。