- 2021年3月8日
こんな人へ
IT業界に興味があってソフトウェアエンジニアを目指しているけれど、少し悩んでいたり漠然とした不安を感じているという人向けに、実際にITシステムがどうやって作られているのかを書いてみたいと思います。
まずは世界を知ること。これが異世界を生き抜く基本。
異世界あれこれ
IT業界と言っても色々な種類があって、それぞれ開発手法や文化があります。
業界種別をおおざっぱに列挙してみると
(※補足は個人の経験に基づきます。)
組み込み系
- 家電や工業機械なんかを制御するソフトウェアを開発。
- ある程度ハードの知識を要求される。
- ハード開発と同期してソフトウェア開発が行われるので、納期が絶対なことが多くて過酷。
アプリケーション系
- 一般的なパソコン上で動くアプリを開発。いわゆる「オープン系」と呼ばれる世界。
- Web業界に浸食されつつある。
Webシステム系
- ブラウザで見るWebページやWeb経由で利用するシステムを開発。
- 今はスマホアプリもクラウドで動いてるものばかりなので強い。
ゲーム系
- 転生希望者が多いので待遇悪いとこが多いらしい。(転生したことないのでよく知らない。)
IT業界向け派遣
- クエスト紹介してくれる冒険者ギルドのようなところ。ただし、たいていの場合どんな職場になるかはランダムガチャ。
- 派遣先が自分に合わなければ変えてもらえる利点はあるけど、希望に反して突然職場が変わることもある。
- 色んな経験を積むのには向いているけれど、メンタル強い人以外にはお勧めできない。
他にも金融システムなんかでよく使われた汎用機(メインフレーム)系とかもありますが、絶滅危惧種なので割愛します。
こういう分類にあてはめにくい、フレームワークやAIライブラリを主に開発してる会社もありますね。
錬成工程
ソフトウェア開発と言えばプログラミング(コーディング)のイメージが強いですが、コードを書くことはシステム開発工程のごくごく一部です。
また組み込み系とWeb系開発では文化が全く違ったりします。
一般的なPCアプリケーション開発時には大体以下のような工程があります。
営業/プロジェクト企画
- 営業活動でシステム開発したいお客様(クライアント)を探したり、自社開発であれば企画書を作成して「こんなシステムを作りたい!」と概要を決める。
要件定義
- 「何を実現したらこのシステムは完成と言えるのか?」を決めます。大まかな開発スケジュール(いつ納品して運用開始するか)と開発費も大切な要素です。
- 大まかなシステム設計。
- 納品物(ハードウェアやマニュアル類、設計書やプログラムコードを含めるかなど)の決定。
- 必要な作業の割り振り。ハードの購入・導入・ネットワーク設定、導入後の運用などをどこの会社が受け持つか。
- システムに望まれるものを明確にするために、とても重要。
システム設計
- システムを構成する機能の分析・開発単位の分割。
- サーバやクライアントPCなどのハードウェア配置(ネットワーク接続)、必要となるソフトウェアの配置などの決定。
外部設計
- データベーステーブル定義、ソフトウェア間の通信プロトコル定義、入出力ファイルフォーマット定義など。
ソフトウェア設計
- 開発単位となるモジュール構成や依存関係を決定。
ソフトウェア開発(実装)
- いわゆる世間一般で言う”プログラミング”。コーディングともいう。
テスト
- 一つのクラスやモジュールを対象とした単体テスト(ユニットテスト)、一つのアプリケーションを対象とした結合テスト、運用時を想定してシステム全体をテストするシステム結合テストなど。
システム導入
- サーバPCやDBの設定、必要なライブラリ/フレームワークのインストール、アプリケーションの配置・設定など。
運用/サポート
- 納品後の運用中に発生した不具合の調査や、不具合解消のためのプログラム修正など。
上にあげた工程は必ずしも順番に行われるわけではなく、個々の会社の文化や「設計手法/開発手法」によって色々な組み合わせで進められます。
また、要件定義から外部設計までを行ってコーディングは他の開発会社に委託したり、逆にソフトウェア設計やコーディング以降のみを請け負う会社もあります。
職種
ソフトウェア開発者と言えばSEという職種がよく出てきますが、主にどの工程を担当するかによって色々な肩書があります。
と言っても明確に定義されたものではなくて会社の文化によって微妙に違うのですが、よく使われる肩書とざっくりとした役割を上げてみます。
SI
System Integrator (システムインテグレーター)
いわゆるSIer。ITシステムの提案、開発・運用全般を請け負う人。
要件定義、導入・運用サポートが主な仕事。
技術営業としてSIの肩書を持つこともある。
SA
System Architect (システム設計者) / Software Architect(ソフトウェア設計者)
システム設計者は使用するサーバの選定やネットワーク構成などを決める。
要件定義の検証、システム設計書やネットワーク構成図を作成する。
ソフトウェア設計者はプログラムのモジュール構成や使用するフレームワーク、ライブラリなどを決める。
ソフトウェア配置図、外部設計書などを作成する。
PM
Project Manager(プロジェクト管理者)
プロジェクトリソース(予算、開発人員、開発工数)の管理を行う。
大きなプロジェクトで開発に直接かかわらない管理者を指すことが多い。
大抵の場合、一番偉い人。
PL
Project Leader(プロジェクトリーダー)
主にソフトウェア設計やコーディング作業全体を管理する人。
小規模プロジェクトだとPMの役割も兼ねてこう呼ばれることがある。
SE
System Engineer(システムエンジニア) / Software Engineer(ソフトウェアエンジニア)
システムエンジニアはITシステム全般の運用・保守を行う。IT業界の何でも屋。
ソフトウェアエンジニアは主にソフトウェア設計から実装作業を行う人を指すことが多い。
日本ではSEと言えばシステムエンジニアを指すことが多かったが、クラウドの普及でサーバなどの社内システムを管理する仕事が減ったこともあって、最近はソフトウェアエンジニアを意味することが多くなった(気がする)。
PG
Programmer(プログラマ)/Coder(コーダー)
プログラム(ソースコード)をガリガリ書く人。IT業界における初期クラス。
テスト工程を担当することも多い。
かつては大規模プロジェクトでコーディングだけ担当する人がいっぱいいたが、フレームワークやライブラリの発達で少ないコード量で開発できるようになったのもあって、コーディング専任の人は減りつつある。
主なものを上げてみましたが、他にもインフラエンジニアやテスターなど色んな役割があって、実際は明確な役割分担がされていない現場が多いです。
あとがき
長くなってしまうので、とりあえず今回はこのへんで。
また機会があれば、途中で少し触れた開発手法の話もしたいと思います。
ソフトウェア開発はそれぞれの役割に固有の楽しさがあるので、IT業界に入る人は自分の興味がある職種へのクラスチェンジを目指してください。