炎上(残業)しないために。難しくなりがちなプログラムの紹介。
ソフトウェアのエンジニアはしばしば「これどれくらいでできる?」と聞かれる立場にあります。
スクラムだとプランニングポーカーで見積もったりして安心感がありますが、それでも大抵、オーバーして痛い目を見ます。
長年プログラムを書いたり、教育してきて、僕が感じる難しくなりがちなケースを紹介します。
ウェブアプリケーションを例に書きますが、バッチやスマホなどでも同様と思います。
育てる系ドキュメントのつもりなので時々更新します。
登場人物が3以上
人間は同時に複数のことを考えるのが苦手です。
AさんからBさんに1000円貸して、BさんからCさんに500円貸す、とかもう図を書かずには整理できませんよね。
(僕が馬鹿なだけかもしれませんが…)
例えばウェブアプリの場合、最初から登場人物は少なくとも2であることが多いです。
(のでウェブアプリは難しいんです!)
- データベース
- アプリケーションのプログラム(フロント、バックエンド)
これだけでも結構難しいのですが、RailsやLaravelを使っていると
うまくブラックボックスにしてくれて、すんなり書けるようになるかもしれません。
しかし、3人目が登場すると途端に難しくなります。
例えば以下です。
- キャッシュ
- 外部API
- ファイル入出力
- NoSQL
3人目は以下のような役割を持つことが多いです。
- 処理速度改善
- 状態を覚えておく
- 他システムとの連携
3人目とのやり取りはフレームワークはカバーしてくれないことが多く自分でカバーする必要があります。
すると以下のようなことを考える必要があります。
- 3人目が死んでいたら
- 3人目に何を渡せばいいの?(しきい値は? 異常系は?)
- 3人目は何を返すの?
どうでしょうか。なんか冷や汗が出てきませんか?
状態を管理する必要がある
ウェブアプリケーションでよくあるのは
- ログインしている時
- ログインしていない時
なのですが
- 有料会員の時
- xxを設定済みの時
などなどどんどん条件が複雑になりがちです。
人間は同時に複数のことを考えるのが苦手なので難易度が上がります。
ページをまたぐ
ウェブアプリケーションで、入力、確認、完了の画面を設けることはよくありますね。
しかし、ウェブアプリケーションで使用されるHTTPでは状態を管理しません(ステートレスという)。
自分でなんとかして状態を覚えておく必要があります。
例えば以下があります。
- Session(Cookieやmemcached)
- DB
- HTTPパラメータで渡していく
すると「状態を管理する必要がある」と同様の問題になります。
期間を扱う
期間を扱うのも難しいです。
- 期間前、期間中、期間後の状態を管理する必要がある
- そもそもカレンダーは難しい。今日の1ヶ月後はいつ?(次の来月の同一の日付? 31日後? 仕様確認した?)
- あっ、月をまたいだ場合は…とかあるある。
文字コードを扱う(Excelが絡む)
今どきはUTF-8を使っておけば大抵安心な気はするのですが、みんな大好きExcelが絡むとSJIS、改行コードCRLFが登場します。
SJISを扱うのは簡単かもしれませんが、大抵以下のような問題がおきます。
- Excelで出したCSVをxxで開いて保存したらエラーになった(そもそもExcelでUTF-8なCSVを吐くのが難しい問題)
- ファイル名を .xlsx から .csv に変えたんだけど…
がっつりエラーチェックをするか、これらをカバーするライブラリを導入するか検討すべきでしょう。
個人的なおすすめはUTF-8、LFのみ受け付けます、にするか、CSVをやめてウェブのインタフェースを用意することです。
セキュリティ、認証、認可
難しい上に検証方法もつらい場合が多い。
仕組みを理解するときに3人目(OAuth〜、認証局などなど)が登場しがち。
一括処理
「xの処理をn回繰り返すだけでしょ?」と言われがちですが以下を考慮する必要があります。
- 同期処理の場合、処理時間は問題ないか(ex: ウェブアプリで複数チェック入れてsubmit!)
- システムへの負荷
- 本番データで問題がないか
経験が少ないとこれらの考慮が及ばず「動けば良い」プログラムを書きがちですが、いざ本番にリリースしてから大問題になることがあります。
ファイルアップロード
- multipartのHTTPリクエストは難しい(この辺はフレームワークが吸収してくれる事が多いが)
- 何MBまで受け付ける?
- どこに置く?
- 加工する?
- サーバのディスク大丈夫?
- サーバが複数台になっても平気?
まだまだありそうですが、今夜はこんなところで…。
この記事が気に入ったらサポートをしてみませんか?