概要
こんにちはLionです
2023年 3/7~3/16の間の8日間にPIXIV SPRING BOOT CAMP 2023という就業形のインターンのピクシブ百科事典コースに参加してきました!
とても楽しいインターンだったのでここに記事を残しておきます😊
参加経緯・コース選択
3年生になると、いよいよ就活を考えなくては行けないので時間のある春休みにどこかしらのインターンに参加しようと思ったのが始まりでした。
そしていろいろ調べている時にTwitterで見つけて詳細を見てみてると、コースがたくさんあり興味のあるものが多かったのと、「対面・交通費支給・宿泊施設用意・日当1万」という超破格の待遇だったので「応募するしかない!」と思い応募しました。
コースに関してはWeb関連でPHPを学べるコースが良いと思い、百科事典コースを第一志望にしました。
コース説明ページに書かれていた「独自フレームワーク」「HTTP」「開発者が利用しやすい設計」という文言に見事に釣られました。
Day 1
初日!オフィスビルのエレベーターを降りて、まず初めに飛び込んで来たのがこれでした!
思っていた通りクリエイティブなオフィスでした... しかし、オフィス見学をしてみると想像の何倍もクリエイティブで面白さのあるオフィスであるということがわかりました。 気になる人は是非インターンなどに参加して見学してみてください!!😆
さてさて、初日はまず人事の方からいろいろ説明があり、その時にノベルティを貰いました。
ドドン!!
めちゃめちゃ豪華なんですよ!もうこれ見た時点で満足しちゃってこの日は顔がフニャ~ってなってました。
index.phpを読んでいく!
そしてメンターのtadsanと合流し、セットアップを終わらせた後、早速百科事典のコードを見ていきました。
まずはindex.php
を読んで行ったのですが、何やらヨクワカラナイことをいろいろしてました。ただ、関数名がわかりやすかったりメンターさんの説明がとてもわかり易くなんとなくは理解することができました。
この日はウォームアップと言った感じにソースコードを読み、全体像を理解すると共に既存のフレームワークとの違いや足りないもの・欲しい物を考えつつ課題を設定していきました。
Day 2
2日目には早速機能追加を行っていきました。
初めに取り組んだのは「開発者用コンソールにエラーを意図的に起こせるボタンを作ろう」という課題でした。
昨日の時点では「どこでルーティングしているのか」「Controller内部の構造」「パラメータの受け取り場所」などがわかっていなかったのですが、この課題大まかな部分は理解することができました。
実際に出来上がったのがこちらです
このボタンをポチッと押すだけでエラーが発生しエラーログが流れます。そしてエラーログはSlackに@channelで通知されます!
そうなんです。分かる人にはわかる... 凶器を作ってしまったというわけです...
実際にはエラーログのデバッグやエラーが起きたときの挙動を確認したいときに使えるちょっと便利なボタンとなりました。実際にインターン中にも何回か押してデバッグしました!
Day 3
3日目は「エラー修正を行う」という課題に取り組みました。
これは、特定の条件を満たしたときにアサーションの部分で引っかかってしまいエラーが流れてしまうという問題の解決でした
エラーが起きた箇所はログを見ればすぐに分かったのですが、百科事典の仕様を理解していなかったので、なぜアサーションに引っかかってしまうのかを読み解くのが難しかったです...
解決してみれば「なんだ...そんなことだったのか...」という感じでした。
Day 4
4日目はこのインターンの中でも一番大きい成果をあげた日でした!
この日の課題は「フィルタリングのコードを書く回数を減らす」というものでした
課題の簡単な説明
まず、もとのコードでは以下のようにコントローラーに直接フィルタリングのコードを書いていました。
(例コードになります)
$user = $request->getAttribute('user');
if (!$user instanceof LoggedIn) {
throw new BadRequestException();
}
1つのコントローラーに1度書くくらいなら問題は小さいのですが、同じフィルターを必要とするコントローラーが増えたときなんかは 面倒です。特に「ログインしているかどうか」というフィルターなんかは何度も使うことになりそうですよね。
さて、ここでLaravelと比べてみましょう。
Laravel8.xでは以下のように書くことでミドルウェアでの処理をかけることできます。
Route::get('/', function () {
//処理
})->middleware('auth');
また配列で渡すことで複数のミドルウェアにかけることもできます。とても便利ですよね
Route::get('/', function () {
//処理
})->middleware(['auth', 'isAdmin']);
そうです。これを何かしらの方法で実装しようというわけです!
実装していく!
方法はいろいろあったと思うのですが、ルーティングの段階でミドルウェアを指定する方法にしました
そして何よりまずはフィルタリング部分の切り分けですね。コントローラーに含まれていた部分を切り出して新しいミドルウェアとして作成しました。
切り分けたあとに、コントローラーでミドルウェアを指定してフィルタリングできるようにしました!
実際にはルーティングの部分で以下のようなコードを追加することで任意のミドルウェアを単体、または複数で指定し、通すことができます!嬉しい!
'filters' => [
HogeCheck::class,
HugaCheck::class
]
Day 5
休み明けの5日目は「定数を減らそう」という課題でした
どの言語でも定数の利用は避けられていることが多く、
今回はindex.php
に書かれている定数を減らしていくというものでした。
流れとしては
1: 定数が利用されている場所を調べる
2: 改善方法を考える (今回だと別クラスに切り分ける)
3: 改善!!!
という感じでした。
そこまで難しくはなかったのですがPHP-DIの使い方を学んだり、lazy loadingについて知る必要があったのでドキュメントを見つつ、教えてもらうという感じで、一部苦戦したりしました。ただ、DIコンテナが最強すぎて終始「すげえぇ」となってました。
Day 6
6日目は「flash機能をより使いやすくするという」課題でした
まずflash(フラッシュデータ、フラッシュメッセージ)というのは、「次のHTTPリクエストの間までにセッションに保持されるデータ」のことです。
よくブログサイトなどで記事を投稿すると次のページで「投稿されました」「正常に保存されました」などというメッセージが飛びますよね。あれがflashで、ページへ遷移したときに何かを伝える役割として良く使います。
Laravelだとflashメソッドを使って利用することができます。
$request->session()->flash('status', '処理が完了しました');
return redirect('/');
このflashの機能がある特定の抽象クラスを継承したクラスのみしか利用できないという問題がありました。
そのためどこからでも利用できるように別クラスとして定義し、かつ現在利用している部分はあまりに多いので、すべて置換するのではなくこのクラスのラッパーとしてそのまま動かせるようにしようということでした。
さてさて、文字だけだと簡単に思えますよね...
1: flash機能を持ったクラスを見て、新しくクラスを定義する
2: すでに実装されているクラスのflash機能は新しく定義したクラスのメソッドのラッパーとして利用する
しかしながら、僕の知見が狭すぎてflashの仕組みや流れについて全く理解していなかったので、シーケンス図を書いてフレームワーク全体の流れを理解するとともに機能の実装を行っていきました。
Day 7
明日はスライド作成になるので実質今日が最終日!!
この日は「ADRを書く課題」「CSRFの対策の課題」を行いました。
ADR
ADRとは何かというと、アーキテクチャ・デシジョン・レコードと言ってアプリやインフラなどで何かしらの設計上の選択を行うとき、にその理由を説明するために書くものです。
今回はDay 4で行った変更について、その変更の理由と利点などを書きました。
ADRには「proposed (提案中)」「accepted (承認)」「rejected (否認)」「deprecated (廃止)」「superseded (保留)」などのステータスがあり、今回は「proposed (提案中)」としてメリットや提案内容などを書きました。
こういうのも個人開発では絶対に書かないので存在を知れただけでも大きな回収だな...と思いました
CSRF対策
CSRFに関しては、もちろん百科事典には記事投稿や編集などの機能にCSRF対策は行われているので、対策しなくても問題ない部分にCSRF対策を追加して独自フレームワークでの対策方法を学びました
このCSRF対策ではセキュリティ対策についていろいろと学びました。 CSRF対策を1つとっても手段は複数あり「それらのメリット・デメリットを理解し選択を行う大切さ」「現在のアプリケーションの仕様を理解し、変更に柔軟な選択を行えるようにすること」などなど...
それらを学び実装をした上でこれに関してもADRを書きました
Day 8
最終日!!
成果発表
この日は5時から成果発表があったのでずっとそのスライド作成を行ってました。 成果発表は社内にあるスタジオで行われ、その配信を社員の方が配信を覗きに来るという形式です。そして、#インターン実況チャンネルというSlackのチャンネルにコメントが飛んできて、ワイワイすると言った感じです!
そして実際に発表をしたのですが、思いの外多くの方が見ていたので緊張しました...(汗) 緊張のあまりミュートを外すのを忘れており冒頭30秒ほどをやり直しとなりました...ahaha..
さて発表が終わり自分の番が終わったあとにSlackを見ると、ありがたいお言葉や、共感のお言葉をいろいろ頂いており感謝の限りでした。
またその後にお偉い方に感想の言葉を頂いたのですが、発表をしっかりと見ており、かつ技術的な部分についても幅広く理解されている方だったので普通にすごいなと思いました。 この日の発表は3人で、かつそれぞれが全く異なる分野の発表であったにも関わらずそれについてかなり詳しい意見や成果に関してのコメントをされていたので本当にすごかったです。いやまじで
最終作業
発表も終わりあとは残ったものをデプロイし、引き継げるようにするだけ!! 残り短い時間でデプロイしてなかったものをデプロイし、無事本番環境で動き始めました!
いやー、自分で書いたコードが実際に今も動いていると考えると感慨深いですね...
これからはピクシブ百科事典の一部を開発したという実績を背負って生きていきたいと思います グヘヘ
まとめ
技術関連
ここまで課題に関していろんなことを書きましたが、課題関連以外にもいろんなことを知り、学びました。
・PHPStanという静的解析ツールの使い方
・Gitのすごい使い方
・テストの書き方
・デプロイ時の自動化処理の特徴
・責任の極小化の話
・PSR-7やPSR-15について
・わかりやすいコミットメッセージの書き方
・CSSの特徴
などなどですね。他にもいろんなことを学んだのですべて書きたいくらいです...
実はCSSに関して、ちょっとした改善も行いました。百科事典を操作して開発する上で気になる点があったので、その話をすると「じゃあ改善しよう!」となり改善することになったのです🤩
そしてそのCSSにもいろいろおもしろい特徴があるのですが、またこの話は今度ということで...
会社関連
技術関連だけでなくピクシブ社についても多くのことを知りました。
・水曜日に全社会という会社全体の配信があること
・その後にラジオがあること
・zチャンネルという趣味関連のチャンネルのこと
・お茶会という交流会が定期的にあること
・いろんなバックグラウンドを持つ人が多いこと
特に最後に関しては9日の木曜日には歓迎会的なものがあり、多くの社員さんと話したので過去にゲームを作っていた人や小説が好きでpixivに就職し、小説チームに来た人、もともとGoogleで働いていた人などなど色んな人がいました。
そして何より個人の個性とか多様性を認め合える人が本当に多く、僕みたいな異端児でもすぐに溶け込めました
おわりに
さてさて、ここまで長くなりましたが本当に楽しく新しい事との出会いが多い8日間となりました。
なんにもできなかった自分に最後の最後まで優しく教えてくださったメンターのtadsanには感謝してもしきれないくらいです。
そしてこの機会をくださったピクシブ株式会社様にも感謝です。
この経験を生かして1人前のエンジニアになれるようにこれからも頑張っていきたいと思います!
人事の方、メンターさん、その他話してくださった方々、8日間本当にありがとうございました!