オリジナルアプリケーション開発ブログ 【がっこうにっき】 幕間 ~ エンジニアのモノの見方 ~
はじめに
私は2023年12月より、内定直結型エンジニア学習プログラム「アプレンティス」に3期生として参加しています。
現在、アプレンティスの課題として、オリジナルアプリケーションの開発を行っています。
目次
- 第1章 アプリのコンセプトと要件定義
- 第2章 はじめてのAWSでインフラ構築
- 幕間 エンジニアのモノの見方 <= 今コレ!
幕間: エンジニアのモノの見方
オリジナルアプリを開発していく過程で、ふと「テーブル同士の関係が、1対多なのか、多対多なのか、よく分からなくなるときがあるなあ…」と今更ながら感じていました。そのことをメンターさんに相談した結果、アドバイスをいただいたことで、私の細胞に衝撃が走ったので、今回は「エンジニアのモノの見方」についてお話ししたいと思います。日常生活や仕事での問題解決に役立つ視点を、エンジニアの観点から探ってみましょう!今回も、身近なモノで例を挙げながら、エンジニアの視点で物事を分解して考えていきます。
例1: Zoomなどの映像音声会話アプリ
コロナ禍のリモートワークなどで大変お世話になったアプリです。「離れている人と顔を見て会話したい」というニーズに応えるために、このようなアプリが登場したのでしょう。の機能をエンジニアの視点で分解してみます!
【基本機能(コア機能)】
- 顔を見て会話するための映像と音声の送受信機能
- 電源ボタン
当初のニーズを満たすだけならば、以上の機能さえあれば充分でしょう。一方で、「使いやすさ」を向上させるのであれば、次のような機能も考えられます。
【追加機能】
- 音量調節機能
- 仮想背景・ぼかし機能
- チャット機能
このように、アプリケーションは、ユーザーのニーズに応じて機能を追加していくことができます。また、各機能は【関数】や【メソッド】として実装され、アプリ全体がより使いやすく、便利になります。
※【関数】については、以前私が別のブログで解説していますので、良ければぜひ!
例2: 図書館の貸し出しシステム
次に、図書館の貸し出しシステムを例に考えてみましょう。現実の図書館では、本、利用者、貸し出しの情報をどのように管理しているのでしょうか?
データベースの「テーブル」とは?
この後登場する、データベースの「テーブル」について説明します。テーブルは、データを整理して保存するための表のようなものです。エクセルやスプレッドシートを思い浮かべてください。行と列があり、各セルにデータが入っています。データベースのテーブルも同じように、行と列で構成されており、各行(横)が一つのレコード(データのまとまり)を表し、各列(縦)がデータの属性(フィールド)を表します。
【本(Books)テーブル】
現実世界では
図書館では、各書籍の基本情報(タイトル、著者、出版社など)を管理するためのリストがあります。これは、各書籍の情報を把握し、検索や管理を容易にするためです。
本テーブルの目的
書籍の基本情報を一元管理するためのテーブルです。本テーブルは各書籍に関する情報を扱います。
主なフィールド
- ID(主キー)
- タイトル
- 著者
- 出版社
ID | タイトル | 著者 | 出版社 |
---|---|---|---|
1 | 君の名は。 | 新海誠 | 角川文庫 |
2 | プラチナデータ | 東野圭吾 | 幻冬舎文庫 |
3 | 終末のフール | 伊坂幸太郎 | 集英社文庫 |
【利用者(Users)テーブル】
現実世界では
図書館では、各利用者の基本情報(名前、住所、会員番号など)を管理するためのリストがあります。これは、利用者一人ひとりの情報を把握し、貸し出し管理を行うためです。
利用者テーブルの目的
利用者の基本情報を管理するためのテーブルです。利用者テーブルは各利用者に関する情報を扱います。
主なフィールド
- ID(主キー)
- 名前
- 住所
- 会員番号
ID | 名前 | 住所 | 会員番号 |
---|---|---|---|
1 | 本多 借太郎 | 西京都古宿区 | 100-1000000 |
2 | 動画 観太郎 | 西京都渋川区 | 101-1000001 |
【貸出し(Checkouts)テーブル】
現実世界では
図書館では、どの利用者がどの書籍をいつ借りたのか、また返却期限などの情報を管理しています。
貸出しテーブルの目的
貸出しの情報を管理するためのテーブルです。貸出しテーブルは、利用者がどの書籍を借りたのかを記録します。
主なフィールド
- ID(主キー)
- 利用者ID(外部キー)
- 本ID(外部キー)
- 貸出し日
- 返却期限
ID | 利用者ID | 本ID | 貸出し日 | 返却期限 |
---|---|---|---|---|
1 | 1 | 1 | 2024/6/24 | 2024/7/5 |
2 | 1 | 2 | 2024/6/24 | 2024/7/5 |
2 | 2 | 1 | 2024/7/6 | 2024/7/14 |
3 | 2 | 3 | 2024/7/6 | 2024/7/14 |
テーブル同士の関係
主キー (Primary Key)
各テーブルにおいて、各行を一意に識別するためのフィールドです。例えば、利用者テーブルでは「ID」が主キーです。これにより、各利用者を一意に識別できます。
外部キー(Foreign Key)
他のテーブルの主キーを参照するフィールドです。これにより、テーブル間の関係を構築します。例えば、貸出しテーブルでは「利用者ID」が外部キーとして利用者テーブルの「ID」を参照します。
貸出しテーブルと他のテーブルとの関係
貸出しテーブルが扱うデータは、次の通りです。
- 【誰】が => 【利用者テーブル】と関係する
- 【どの本】を => 【本テーブル】と関係する
- 【いつ】借りたか
- 【いつまで】に返すか
これを踏まえて、【利用者テーブル】【本テーブル】との関係を見ていきましょう。
利用者テーブルと貸出しテーブルは、【一対多】の関係
【利用者テーブル】に登録された利用者は、【唯一無二】の存在です。
ID | 名前 | 住所 | 会員番号 |
---|---|---|---|
1 | 本多 借太郎 | 西京都古宿区 | 100-1000000 |
この利用者が、複数の本を借りたとします。このとき【貸出しテーブル】には
ID | 利用者ID | 本ID | 貸出し日 | 返却期限 |
---|---|---|---|---|
1 | 1 | 1 | 2024/6/24 | 2024/7/5 |
2 | 1 | 2 | 2024/6/24 | 2024/7/5 |
という情報が保存されます。
また、【利用者テーブル】に登録されたもう一人の利用者も、【唯一無二】の存在です
ID | 名前 | 住所 | 会員番号 |
---|---|---|---|
2 | 動画 観太郎 | 西京都渋川区 | 101-1000001 |
この利用者が、複数の本を借りたとします。このとき【貸出しテーブル】には
ID | 利用者ID | 本ID | 貸出し日 | 返却期限 |
---|---|---|---|---|
2 | 2 | 1 | 2024/7/6 | 2024/7/14 |
3 | 2 | 3 | 2024/7/6 | 2024/7/14 |
という情報が保存されます。つまり、【貸出しテーブル】には、【複数の利用者】の情報が登録されることになります。これが、【一対多】の関係です。
本と貸出しテーブルの関係は、【一対多】の関係
【本テーブル】に登録されている本は、【唯一無二】の本です。
ID | タイトル | 著者 | 出版社 |
---|---|---|---|
1 | 君の名は。 | 新海誠 | 角川文庫 |
2 | プラチナデータ | 東野圭吾 | 幻冬舎文庫 |
3 | 終末のフール | 伊坂幸太郎 | 集英社文庫 |
このうち1冊の本が、複数回借りられたとします。すると、【貸出しテーブル】には次のようにデータが保存されます。
ID | 利用者ID | 本ID | 貸出し日 | 返却期限 |
---|---|---|---|---|
1 | 1 | 1 | 2024/6/24 | 2024/7/5 |
2 | 2 | 1 | 2024/7/6 | 2024/7/14 |
つまり、【貸出しテーブル】に【複数の本】の情報が登録されることになります。こちらも、【一対多】の関係となります。
プログラミングの基本操作(衝撃が走ったつながりで)
最後に、プログラミングの基本操作について考えてみましょう。プログラミングにおける基本的な動作は、「順次進行」「条件分岐」「繰り返し」の3つしかありません。
順次進行
コードは上から下へ順番に実行されます。例えば、料理のレシピのように、手順を順番に進めていくことを想像してください。
条件分岐
特定の条件に基づいて異なるコードが実行されます。例えば、交通信号機の動作を考えてみましょう。赤信号の場合は停止し、緑信号の場合は進むというように、条件によって異なる動作が行われます。
繰り返し
同じコードを何度も繰り返し実行することができます。例えば、ジムでのトレーニングを考えてみましょう。同じ運動を一定回数繰り返すことが効果的なトレーニングになります。
これを知ったのは、プログラミングの学習を始めた半年前でした。プログラミングの根本的なシンプルさと、それにもかかわらず様々な機能を実現できる可能性に感動しました。
まとめ
エンジニアのモノの見方は、問題を分解し、その構成要素を理解することにあります。これにより、より効率的で効果的な解決策を見つけることができます。皆さんもぜひ、この視点を日常生活や仕事に取り入れてみてください。
この記事が、読者の皆さんにとって役立つものとなることを願っています。もし追加したいポイントや変更したい部分があれば、お知らせください。
Discussion