Skip to content

Instantly share code, notes, and snippets.

@kenji0x02
Last active January 27, 2016 15:47
Show Gist options
  • Save kenji0x02/1518fcabe766233318e8 to your computer and use it in GitHub Desktop.
Save kenji0x02/1518fcabe766233318e8 to your computer and use it in GitHub Desktop.
Webアプリケーションを設計するときに注意しないといけないことまとめ。

Webアプリケーション設計指針

アプリケーションを設計するときに注意しないといけないことをまとめておきます。

API設計

バージョン設計

メソッド設計

GET&query stringとPOSTの違い

シングルクウォーテーション、ダブルクウォーテーション問題

  • APIの戻り値としてjsonを渡すことが多いけど、jsonはダブルじゃないといけない。
  • JavaScriptの文字列はシングルでもダブルでもどっちでもいい。統一さえしておけばいい。
  • HTMLタグの属性はシングルでもダブルでもどっちでもいいが、ダブルが推奨。jsonでHTMLタグを渡すときは、ダブルだとエスケープできないのでシングルで書く(tword-frontend)
  • ちなみにScalaではStringはダブルで、Charがシングル。

DB設計

基本方針

DB設計はモデルやパフォーマンスと直結するので、開発の初期段階に綿密に設計しないといけない。 リリース前にDBの設計変更とか泣けるので。。 なお、DB設計時には、運用後に想定される状況を明確に想定しておかないといけない。

ALTERという地獄

製品リリース後にデータベース構造を変更すると、DBをALTERしなければいけないので辛い。 やったことなんですけど、この話はよく聞く。

RDBはツリー構造苦手というけど

アンチパターンのトップバッターとして取り上げられるほど有名な命題だけども、 実際のところはシンプルな設計をしていることが多いようですね。

要件を満たせるうちは、シンプルな設計を採用する方が良いと考えています。必要になったら閉包テーブルや入れ子集合に移行すれば良いですよね。

わざと正規化しないという正義

正規化しちゃうと結合に時間かかるじゃん。

バッチ処理を考慮したテーブル分割

バッチ処理中にDBがロックされてアクセスできないケースが発生しないように、 バッチ処理で頻繁にアクセスするDBはテーブルを分けておくとよろし。

コネクションプール

スペック的に必要なの?そこまで求めないの? Play Frameworkだと、hikariPCとか使えばいい。

どのDB使うの?

開発段階ではオンメモリー。本番環境ではファイルに保存かサーバー建てるか。

デフォルト値の登録問題

ConfigをDBで登録しているような場合、開発時に必要な設定、本番環境では初回起動時に一回しか使わないであろう処理(DBはマイグレーションするから)はどう扱うか問題。

エラーメッセージ設計

失敗するときは、可能な限り早い段階で表示させる。 「AやってBやってCまっでやって失敗」とか泣ける。

ユーザに見せるエラーメッセージは、「ユーザが次に何をすればいいのか」を書いておくこと。 エラーが起きてる現象について説明されてもユーザーにはno infomation。

エラーメッセージのリソースは大抵一箇所で集中管理しているので、 共通化したりして状況にあわない雑なものになる傾向がある。 また、編集者によって表現のばらつきが大きくなる傾向がある。

リファレンス

多言語設計

i18n等を使う。 できるだけ、英語から書き始めること。 リリース直前でテンパってるときに、日本語なら工数よめるけど、英語だとよめないから。

アカウント設計

ソーシャルログイン

自前でアカウント管理

アカウント管理

セキュリティ設計

パフォーマンス設計

ダウンロード高速化

圧縮問題。

永続化設計

プロセスの永続化

肥大化対策

メモリー肥大化

DB肥大化

ログ肥大化

システム全体構成

モノリシックvsマイクロサービス

モジュール依存性

小さく作っておいた方が、互換性がなくなったときに対応しやすい。 規模が大きくなると、あるところのバージョンをあげると、他のところのバージョンが合わなくなったりして辛い。

リファレンス

@kenji0x02
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment