見出し画像

プログラミングだけがエンジニアの役割ではない

こんにちは。re:shineギグパートナーの青木(@hirofumi_aoki)です。
(エンジニア兼アドバイザーです。)

この記事は、非エンジニアと一緒に仕事をしていて、エンジニアの役割を十分に理解してもらえず悶々としている方には、共感ポイントがあるかもしれません。

この記事では、プログラミング以外の領域にフォーカスして、エンジニアの役割と、その重要性を整理していきたいと思います。

非エンジニアの方々に、エンジニアの役割をご理解いただくためのツールになれば幸いです。

エンジニアには、プログラミング以外の役割がたくさんある

前回の記事でも紹介しましたが、一般的にシステムはこのような流れで開発します。

開発フロー2

開発の大まかな進め方は、ウォーターフォール型やアジャイル型といった手法などがあり、プロジェクトの特性によって変わりますが、基本的には、要件定義と設計、実装(プログラミング)、テスト、リリースといった流れでシステムを開発します。

つまり、プログラミングは、システム開発における「実装」工程の作業であり、エンジニアが携わる作業は、他にもたくさんあります。

なお、システムという言葉をもっと馴染みのある表現に置き換えると、アプリやWebサイト、Webアプリケーションになります。(厳密には違う部分もありますが。)

実装(プログラミング)以外におけるエンジニアの役割をイメージしていただくために、この記事では、「要件定義」と「設計」にフォーカスして、エンジニアの役割を紹介していきたいと思います。

要件定義における役割

要件定義とは、システムに必要な機能や性能、品質などを洗い出し、整理する作業です。

システム開発の目的を達成する手段として、機能を洗い出し、機能に求める性能や品質を含めて整理することで、目的に沿ったシステムを作れるようにします。

システム開発の目的には、

・業務を効率化する
・アプリやWebサービスを有償提供することで収益源を作る

など、事業の目的が何かしら設定されます。

要件定義という言葉は、SIerなど、システムを受託開発する場合に主に使われる言葉ですが、自社サービスのシステム開発でも、基本的には同じ作業が必要になります。

なお、自社サービスの場合は、チームの規模やビジネスフェーズによっては、企画の一環で行なってしまったり、要件定義と設計を同時に行う場合もあります。

要件定義の内容を具体的にイメージしやすいように、一つ例をあげます。

例えば、アパレルメーカーが、自社商品である洋服をオンラインで販売するために、ECサイトを作ることになったとします。

そして、ECサイトを作る目的は、

売上の60%をEC化し、
顧客の属性や嗜好データを蓄積し、
自社顧客に合った商品開発を効果的に実施できるようにすること

だったとします。

この場合、システムに必要な機能は、一般的なECサイトに求められるカート機能や決済機能などに加えて、下記などが考えられます。

・登録会員の性別や年齢、好みのブランドなどを登録する機能
・身長や体重などの体型を登録する機能
・SNS連携機能
・顧客の属性や嗜好データを分析する管理画面

せっかくECサイトを作っても、これらの機能がなければ、「顧客の属性や嗜好データを蓄積し、自社顧客に合った商品開発を効果的に実施」という目的は達成できません。

目的をきちんと明確にし、理解したうえで、目的に沿った機能を漏れやズレなく整理することが、要件定義では重要です。

SIerなど、システムを受託開発する企業であれば、営業やSE(システム・エンジニア)などが、自社サービスとしてシステム開発する企業であれば、事業開発者やエンジニアが要件定義を行うことが多いです。

エンジニアが要件定義を一緒にやる理由は、技術的に実現可能かどうか判断しながら機能を検討する必要があるからです。

例えば、

「AIを使って、顧客の属性や嗜好データから、その顧客の好きそうな新しい洋服を自動でデザインして提案できる機能を作ろう」

となっても、技術的にできるかどうか、AIの知識があるエンジニアが判断する必要があります。

技術的にできるかどうかを判断せず、システムを開発し始めて、途中で「実現不可能」となったら、それまでかかったコストが無駄になるわけです。

また、技術を知っていることで機能案が生まれることもあり、エンジニアの発想が要件定義にいかされることもあります。

例えば、

◯◯というAI技術を使えば、顧客の属性や嗜好データから、好みの洋服の形状を推測できるので、商品開発に活かせる

といった感じです。

また、性能や品質に関しては、システムに専門性のあるエンジニアが整理する必要があります。

例えば、ECサイトで、EC化率60%を達成するためには、一日あたり約2万人程度のユーザーにECサイトで購入してもらう必要があったとします。

その場合、一日あたり約2万人のユーザーがサイトにアクセスしても、サイトが止まったり、遅延することなく使える性能にする必要があります。

システムに求められる性能を定義すると、

一日あたり約2万人のユーザーのアクセスに耐えられる性能

となります。

実際の要件定義では、もっと厳密に、レスポンスタイム(応答時間)やスループット(処理能力)といった指標を使って、システムに必要な性能を定義します。

おそらく、システム開発に馴染みのない方は、これらの言葉を聞いて、頭に「?」が浮かんだのではないでしょうか。

つまり、要件定義では、非エンジニアには理解しづらい指標を使って、専門性のあるエンジニアが整理する必要があるのです。

このように、システムに求められる機能や性能、品質などを整理する作業において、エンジニアは重要な役割を担うのです。

要件定義では、システムの知識だけでなく、システムを作る目的となる事業の戦略や計画を理解するために、ビジネスの知識やリテラシーも必要となります。

つまり、要件定義を行えるエンジニアは、プログラミングに関する知識やスキルがあるだけでなく、ビジネスの知識やリテラシーも備えており、知識やスキルの幅が広い、ハイスペックな人が多い傾向にあります。

設計における役割

設計では、要件定義で整理した、機能や性能、品質を実現するために、具体的にどんなアプリやWebサイトを作れば良いか、検討します。

設計の種類を大きく分けると、基本設計と詳細設計があり、それぞれの設計内容は下記の通りです。

基本設計
・画面設計(&UIデザイン)
・機能設計
・データ設計

詳細設計
・クラス図
・シーケンス図
・システムアーキテクチャ
・API設計
など

あまり細かく説明すると冗長でわかりづらくなるため、この記事では、具体的な作業をイメージしやすい画面設計をピックアップして説明します。

画面設計(&UIデザイン)

画面設計(&UIデザイン)では、主に下記の設計を行います。

・画面が切り替わる流れ(画面遷移)
・各画面に表示する情報(文字、画像など)とレイアウト
・各画面のパーツの配色や造形のデザイン(UIデザイン)
・各画面でできること(商品購入できる、会員情報登録できる、など)

画像2

画面設計の良し悪しで、システムを簡単に使えるかどうかが大きく変わります。

特に、一般消費者向けのシステムでは、使い方がすぐにわかるかどうかで、

・ユーザーがシステムを使ってくれるか
・ユーザーがシステムを意図通りに使ってくれるか

が大きく左右されます。

システムが意図通りに使われなければ、事業の目的を達成する手段として機能しませんから、画面設計は、目的達成のためにも非常に重要な設計となります。

ECサイトの例だと、

・会員登録が手軽にすぐできる
・欲しい商品をすぐに見つけられるようにする
・購入がワンクリックで簡単にできる

などを実現するために、画面を設計します。

画面設計を担当する人は、企業によって違いますが、デザイナーや事業開発者、エンジニアなどが、連携して設計するケースも多いです。

連携して設計する場合、明確な分担はないものの、エンジニアからは、下記のような技術的な視点からの設計案が出やすいです。

・購入時の決済に時間がかかるから、決済待ち中の画面を出した方が良い
・ユーザーが商品詳細を見た商品は、履歴に残せるので、商品一覧に閲覧履歴として出した方が良い

また、システムの使い勝手は、

・画面が見やすい
・画面の切り替えがわかりやすい

といった見た目の設計・デザインだけでなく、

・サクサク動いて使いやすい
・自分に合った商品がおすすめされて、好きな商品を見つけやすい

など、技術で実現する必要がある「使い勝手の良さ」もあります。

つまり、使い勝手の良いシステムを作るには、エンジニアのアイディアや技術力も必要となります。

このように、画面設計など、システムの目的を達成する手段を考える場においても、エンジニアは重要な役割を担います。

特に、システムの目的を達成するためには、「システムをユーザーに意図通り使ってもらう」ことが必須になるため、ユーザーのことを理解して、意図通りに使ってもらえる設計をする必要があります。

システムの目的やユーザーのことを理解した上で、目的が達成できる具体的な手段に落とし込む能力もエンジニアには求められるのです。

目的を具体的な手段に落とし込む役割

要件定義と設計におけるエンジニアの役割から

「単にプログラムを書くだけがエンジニアの役割ではない」

ということが、お分かりいただけたのではないでしょうか。

要件定義と設計におけるエンジニアの役割を改めて書くと下記の通りです。

要件定義

システムを作る目的を正しく理解し、システムに求められる機能や性能、品質などを洗い出し、技術的視点で実現可能性の判断や整理を行う

設計

システムを作る目的やユーザーのことを理解し、目的が達成できるように、機能を具体化する

つまり、プログラミングを書くだけでなく、システムを作る目的を正しく理解し、具体的な実現手段に落とし込むこともまた、エンジニアの重要な役割なのです。

要件定義

創造的にシステムを作り上げるのもエンジニアの役割

この記事の冒頭で、システム開発は下記の流れで行うと説明しました。

① 要件定義
② 設計
③ 実装(プログラミング)
④ テスト
⑤ リリース

しかし、実際には、

要件定義や設計、実装(プログラミング)を並行して行ったり、

一度作ったものをテストして、再設計して、作り直したりします。

イメージ的には、こんな感じになるかと思います。

開発イメージ

要件定義と設計を繰り返しながら、具体的な機能に落とし込む。

機能をさらに具体化しながら、プログラミングをする。

作ったアプリやWebサイトを試しに操作して、使い勝手が悪かったり、目的にそぐわなければ、再設計して、またプログラミングする。

こんな感じに、思考(要件定義・設計)と作業(プログラミング)を繰り返しながら、期待に沿うシステムを作り上げていく。

これがリアルなシステム開発の流れになります。

そして、思考と作業を行ったり来たりしながら、良いシステムを創造的に作り上げることもまた、エンジニアの重要な役割になります。

最後に

少し長めの記事になってしまいましたが、最後までお読みいただきありがとうございました。

非エンジニアの方々にも、エンジニアの役割を正しくご理解いただくことで、コミュニケーションや仕事の連携がしやすくなればと思い、この記事を執筆いたしました。

昨今、官民共にDXが必須であるという機運の高まりもあり、IT技術はより一層、社会全体にインフラとして強く根付くことになると思われます。

この流れに伴い、今までシステム開発と無縁だった方々が、突如として、システム開発に関わることとなるケースも増えてくると予想されます。

そのような方々が、システム開発に対する解像度を高め、デジタル化された社会における業務に、スムーズに移行できることを願っております。

その為に役立ちそうなネタがあれば、また記事にしたいと思います。

この記事が気に入ったらサポートをしてみませんか?