プログラミングする際に意識していること
はじめに
走り書きポエムです。
プログラミングの基本
プログラミングの基本は1970年代の構造化プログラミングが提唱された頃から発展してない。関心の分離を意識して凝集度が高くて結合度が弱くなるように作る。これが基本。そのための手法としてモジュール化やカプセル化、各種パターンが考えられてきた。
オブジェクト指向の基本
オブジェクト指向ではオブジェクト同士が有機的に繋がるのをイメージして開発する(アランケイは生物学を学んでいた)。オブジェクト内部の動きを見せないようにする(隠蔽)のがオブジェクト指向。そのためのカプセル化。
アクションと計算を分離する
オブジェクトのメソッドではアクションと計算を分けるのを意識する。アクションは副作用があり、計算は純粋に計算だけのメソッド(関数)。計算とはつまり入力に対して出力が一意に決まり何度実行しても同じ入力なら同じ出力が返ってくること。
副作用とはデータベースへの保存であったりメールの送信であったり外部のAPIとやり取りしたりと何かしらのやり取りがある。計算とは異なり入力に対して出力が定まらない、というより状態が変化する。
問題を分ける
システムは入力に対してどう出力するかの集まり。システムの開発が難しく感じるのは、その「どう」の部分が未知の問題が多い場合。まず問題を小さく分割する。小さくした問題のうち未知と既知を分類する。未知の中で過去の経験に似たものがあるかそうでないかに分類する。未知の部分を小さくしていく。あとは入力はわかっているはずなので未知の条件に合わせて計算すれば出力は求まる。
妄想する
どんなシステムにするか妄想するの大事。頭の中で利用しているユーザーをイメージできるかどうか。
顧客の期待を妄想するの大事。
期待->現状のシステムとその問題点->変更内容の必要性->新システムの構想->業務運用のシナリオ->新システムが及ぼす影響->新システムの効果、を提示する。
顧客を巻き込む
プロジェクトを成功させるには顧客の協力が必要不可欠なのは明白なので一緒にやりましょう。顧客を巻き込むの大事(アジャイル開発宣言もDDDもコミュニケーション重視してる)。
システム開発はいつ終わる?
システムは本番機にリリースして終了ではない。本番機で稼働してからがスタート地点。システムが稼働し続ける限りゴールはない。家でも車でもメンテナンスし続けるでしょ?家の壁剥がれたら補修するでしょ?車検切れの車に乗らないでしょ?ソフトウェアも一緒でメンテナンスし続ける必要がある。
ドキュメントの重要性
コードからわかるのはコードが書かれているっていう事実だけで、それがどこかサーバーとかで動作している場合は動作しているっていう事実だけ。コードだけだと仕様や設計が正しいかどうかはわからない。わかりにくいところはコメント書きましょう。ドキュメントも書きましょう。
おわりに
とりあえずここまで。追記するかもしれない。
Discussion