はじめに
- 地方の大学に通う3年生
- 研究室でのPythonを使った開発でプログラミングに興味を持つ
- エンジニアとして働くことの難しさややりがいを知りたいと思い、インターンに応募
- Webに関してはFlaskを使って簡単なWebアプリを作ったレベル
2022年10月からの3ヶ月間ですが、すごく貴重な経験をさせていただきました。
まだインターンは続きますが、一旦これまで経験したことと反省点を整理するために振り返りたいと思います。
拙い文で、間違っているとこもあるかもしれませんが、生暖かい目で見てもらえると幸いです。
体験した業務内容
社内向けWebアプリの開発に要件定義から経験させていただきました。
インターン生同期3人で要件定義を行い、開発はそれぞれで行っています。
要件定義
これまで個人で開発するときは、なんとなくで進めて、開発途中でなんとなく機能追加というスーパーアジャイル開発を行ってましたが、もちろん実務ではそうはいきませんでした。
アプリのコンセプト・似た他社サービスにない強み・ペルソナ(アプリを使用する具体的なユーザー像)
これらを先に定義しておくことで、その後の企画・開発がスムーズに進みました。
また、一つ一つの機能の有無に対して、実装方法に対して、なぜ?と突き詰めて考え、理由づけしていくことが難しく感じました。
要件定義に対してのレビュー
インターン生3人で行った要件定義に対して、先輩社員から設計に不備がないかレビューをいただきました。
緊張に弱い僕は、先輩に意見をもらうたびに慌てふためいてました。
そうならないためのポイント
- 前提として、責められる場ではなく仕様の確認をする場
- 突っ込まれても、その設計になった理由を話す
- 突っ込まれた点に対し、詰めきれてなかったのであれば素直に認める
開発環境
データベース:MySQL
今回はdrawSQLを使ってER図を作成しました。
- 学んだこと
- 汎用的なカラム名は避ける
- 例:memo → description
- 制約について
- 外部キー制約:_id系につける(元データが消されてもデータが消されないように)
- ユニーク制約:同じデータが登録されたくないカラムに
- 複合ユニーク制約:指定したカラムの値の組み合わせが同一のデータは登録できないように
- NULLについて
- NOT NULL制約:NULL入れてもいいカラム以外には基本的につける
- テキストの型にNULLを許可すると複雑度が増すから避ける
- 通常の値と空文字とNULLの3つを扱うことになる
バックエンド:RailsでWeb APIサーバーを構築
- 使ったライブラリ、ツール
- Pry:デバック
- RuboCop: .rbファイルを検査しコードの書き方をチェックしてくれる
- デフォルトだとチェックがかなり厳しいので
.rubocop.yml
でフォーマットルールを設定
- デフォルトだとチェックがかなり厳しいので
- bullet:N+1問題を検知
- N+1:データ取得の際、データが増えるほど発行されるクエリ数が多くなる問題
- API設計
- リソースベースのルーティング
-
resources
を宣言するだけでindex
,update
などのアクションを個別で宣言する必要がなくなる - アクション名ではなく、HTTPメソッドでリソースを表現するURIが生成される
-
- RESTful APIを意識
- ファットコントローラーを避ける
- 複数のアクションで重複している処理は
before action
で定義 - 長いコードはメソッド化してモデルへ
- 複数のアクションで重複している処理は
- リソースベースのルーティング
個人的には、N+1問題が一番思い出深いですね。
ネストしたテーブルデータの扱いに苦戦し、Bulletからかなり怒られました。
ただ、この問題はアプリのパフォーマンスに直接関わるため解消に努めました💪
苦しんだところは以下記事でまとめています。
また、N+1について学ぶとき、以下の例えがとてもしっくりきました。
日常生活で例えるなら、スーパーで商品を1点ずつお会計するようなもの。
それだけ無駄なことを行なっている状態を指します。
フロントエンド:React
こちらは現在も続けています。
- 躓いたこと, 学んだこと
- ライフサイクル(処理順序)を理解して開発
- reactのstateが即時更新されない
- 原因: state更新処理が非同期だから
- コンポーネントのimport error
-
named export
,default export
の違い
-
終わりに
突っ走ってきた感じで、まだまだ詰めきれていないところばかりです。
Web開発における、フロント・バック・インフラという必要な知識量、奥深さに圧倒され続けた3ヶ月間でした。
ただ、いろいろな技術を学ばせていただけましたが、 Web開発の楽しさを知れたということが一番の収穫でした。
今後は、個人的にコードを書くだけでなくWebの仕組みの部分も勉強したいと思います。