IT業界での就業を目指す方は、日ごろ「システムエンジニア」や「プログラマ」という言葉を当たり前のように耳にしているかと思います。これらはIT業界の黎明期から今まで長く存在している代表的な職種ですが、では「システムエンジニア」や「プログラマ」という職種はそれぞれどのような役割を担っている職種なのでしょうか。またこの二つの職種には、どのような違いがあるのでしょうか。
ここではそれぞれの職種の特徴を、開発プロジェクトを例にして担当する作業内容や、その範囲、そして誰もが気になる報酬面について、できるだけ初心者の方にも理解できるよう説明いたします。
システムエンジニアの仕事について
「システムエンジニア」とはIT業界における代表的な職種の一つであり、簡単に言えば主にコンピュータシステムの設計・開発・保守・運用を担当する職種のことです。
同じように代表的な職種の一つに「プログラマ」というものがありますが、プログラマが基本的にはプログラム言語を使ってプログラムを作成する作業がメインであるのに対し、
システムエンジニアはクライアントからのシステム化に関する要求の分析や、システム化する業務の決定、及びそれを実現するための各種機能を基本設計する等のいわゆる「上流工程」から、各種機能の詳細な設計やプログラマが担当するプログラム製造や開発したシステムのテストといった下流工程までをも含めてコンピュータシステム化を実現するための一連の工程を幅広く担当します。
プログラマの仕事について
前述しましたとおり、プログラマは基本的には主にシステムエンジニアがまとめた設計書に沿ってプログラム言語を駆使しながらプログラムを作成する作業がメインになります。もちろん作成したプログラムが設計された仕様どおりに動くかどうかの(プログラム単体レベルでの)テストも担当します。
また各企業や各プロジェクトによっては、単にプログラムの作成やプログラム単体テストレベルの作業にとどまらず、システムエンジニアレベルの作業までをもカバーする場合もあります。
システムエンジニアという職種について
一口に「システムエンジニア」と言っても、実際の開発現場では様々な分け方や役割などの考え方が存在します。加えて「システムエンジニア」という呼称だけではなく、それらに関する別の呼称も存在していますので、実際の開発現場での就労経験がない人にとっては、なかなか理解しづらいものがあります。
厳格な取り決めがあるわけではありませんが、以下にIT業界においてよく見受けられる「システムエンジニア」に関する区分け等の考え方を説明します。
汎用機系システムエンジニアとオープン系/WEB系システムエンジニア
システムエンジニアの分け方の概念の一つに「汎用機系システムエンジニア」と「オープン系/WEB系システムエンジニア」というものがあります。これは基本的には扱うコンピュータの大きさや種類を基準にした場合の分け方の概念になります。
まず「汎用機系システムエンジニア」ですが、これは主に大型の汎用コンピュータやオフコン(オフィスコンピュータ)を使用したシステムの開発・保守・運用等に携わっているシステムエンジニアのことを指します。
次に「オープン系システムエンジニア」ですが、これは主にwindowsやUNIX(含Linux等)などのパーソナルコンピュータを使用したシステムの開発・保守・運用等に携わっているシステムエンジニアのことを指します。
またその中でもサーバーやインターネットを利用したWEB系のシステムやコンテンツの開発・保守・運用等に携わっているのであれば、その場合は「WEB系システムエンジニア」と呼ばれたりします。
3つともシステムエンジニアであることには違いありませんが、それぞれで特化した部分が多々あるため、例えば汎用機系システムエンジニアからWEB系システムエンジニアに変わるには、WEB系システムに関する相応の技術や知識なりを修得する必要があります。
業務アプリケーション系システムエンジニア
システムエンジニアの分け方のもう一つの概念として「業務アプリケーション系システムエンジニア」と「組込系システムエンジニア」というものがあります。これは扱うシステムの性質を基準にした場合の分け方の概念になります。
まず「業務アプリケーション系システムエンジニア」ですが、これはクライアントの業務内容に深く関わるシステム(アプリケーションソフト)を扱うシステムエンジニアのことを指します。そのため技術的な知識だけでなく、クライアントと同等の業界知識や業務そのものの知識を保有していなければなりません。
(例えば商品受発注システムであれば、クライアントと同等の商品知識と受発注業務そのものの知識が必要とされます。)
組込系システムエンジニア
「組込系システムエンジニア」ですが、これは主に使用するハードウェアに関わるシステムを扱うシステムエンジニアのことを指します。よって業務そのものよりも、対象となるハードウェアにて業務を実現させるためには、そのハードウェアをどう制御するか、という技術や知識を保有していなければなりません。
プロジェクトマネージャーとプロジェクトリーダーについて
「プロジェクトマネージャー」や「プロジェクトリーダー」という言葉も、よく目にしたり耳にしたりすると思います。これらはIT業界における代表的な職種の一つではありますが、基本的には「システムエンジニア」であるという前提の上に成り立つ職種です。
ただ、職種ではありますが、それよりもシステムエンジニアにおける上級役職の呼称と考えた方が実際にはしっくりくるでしょう。
まず「プロジェクトマネージャー」ですが、一般的な役職で考えると「部長」と似たようなポジションになります。
具体的には複数のプロジェクトに対する進捗管理や関連機関との調整、人的配置調整、総予算や売上の管理、対顧客折衝といった業務を主に担当します。
また「プロジェクトリーダー」は、一般的な役職で考えると「課長」や「係長」クラスにあたり、担当するプロジェクトのスケジュール管理、進捗管理、仕様管理、人員管理、予算管理、対顧客折衝などを担当します。
いずれもプログラマやシステムエンジニアとしての豊富な経験がなければ務まりません。
プログラマという職種について
「プログラマ」に関しては「システムエンジニア」に見られるような区分けの概念や別の呼称は、あまり見受けられません。しかしながらやはり扱うシステムによって開発環境やプログラム言語が、その概念からして違うものであったりする場合がありますので、すべてを一概に「プログラマ」という一語で理解するのは難しいでしょう。
ここでは扱う領域やプログラム言語という観点からプログラマという職種について説明します。
プログラマの種類
「プログラマ」には「システムエンジニア」に見られるような、様々な観点からの区分けや別呼称のようなものは、あまり見受けられません。
強いて区分けするとすれば、扱うコンピュータの大きさや種類、またシステムの属性などを基準にして「汎用機系プログラマ」、「オープン系プログラマ」、「WEB系プログラマ」といった程度のものになるでしょう。
なおプログラミングの際に使う開発言語(プログラム言語)は、今のコンピュータというものが元々は大型汎用コンピュータのテクノロジーが基礎となって発展していったのと同様、元をたどれば同じ概念から生まれたり枝分かれしたりして発展してきたものですので、基本となる考え方は汎用機系の言語であれオープン系の言語であれWEB系の言語であれ大きくは変わりません。
しかしながらいくら基本となる考え方に大きな違いがないといえども、扱うシステムや使用するプログラム言語、その開発環境や開発手法など詳細な部分では、大きく相違する部分が多々あるため、例えば汎用機系プログラマとしての経験が豊富であるからと言って、必ずしもすぐにオープン系やWEB系のプログラマとして活躍できるものでもありません。やはりそれぞれの環境で相応の知識や技術力を修得していくことが必須になります。
代表的なプログラム言語
前述しましたとおり「プログラマ」といえども扱うシステムによって、使用するプログラム言語は違ってきます。
以下に前述しました区分けを例に、現在それぞれでよく使用されているプログラム言語を示します。
・汎用機系……… COBOL、アセンブラ、PL/1など
・オープン系…… VB.NET、C#、C、C++、VC++など
・WEB系……… PHP、Java、HTML、CSS、Ruby、JavaScriptなど
他にもOffice系ではVBAが今でも広く使われています。またiPhone系ではObjective-CやSwiftなどがあります。更にはデータベース系ではOracleのPL/SQLやSQLSERVERのTransact-SQL (T-SQL)がよく使われています。
開発プロジェクトにおける工程と各職種の関わり
ではシステムエンジニアとプログラマは実際のプロジェクトでは、どう関わっているのでしょうか。
ここでは一般的な開発プロジェクトにおける工程と担当している職種を示します。
要求分析
クライアントから、業務上どこをどうシステム化したいのか等をヒアリングして、その要求を分析していきます。
主にプロジェクトマネージャーやプロジェクトリーダークラスのシステムエンジニアが担当します。
要件定義
要求分析工程で洗いだしたクライアントからの要求をコンピュータシステムにおける機能要件としてまとめていきます。
主にプロジェクトマネージャーやプロジェクトリーダークラスのシステムエンジニアが担当しますが、詳細な技術面に話が及ぶ場合はプログラマ(上級レベルのプログラマ)が参画することもあります。
基本設計
要件定義工程にてまとめられた機能に関しての基本となる設計を行います。
主にシステムエンジニアが担当しますが、プログラマ(上級レベルのプログラマ)が参画する場合もあります。
詳細設計
基本設計工程にて設計された内容をもとにして各機能に関する詳細な設計を行います。また機能に対してどのようなプログラムをどれくらい作成するか、データベースはどのような構成とするか、どのようなシステム運用とするかなど、開発するシステムに関する細かな設計を行います。
主にシステムエンジニアが担当しますが、プログラマが参画することも珍しくありません。
製造(プログラム作成)
詳細設計工程で設計された内容をもとにして実際のプログラムを作成します。またプログラム単体レベルでのテストを行います。
主にプログラマが担当しますが、予算や工数が厳しい場合などはシステムエンジニアも担当することが珍しくありません。
テスト
製造したプログラムを機能単位にまとめてテストを行う「結合テスト」や、システム全体を対象とした「総合テスト」、運用面を重視した「運用テスト」などを行います。また本番稼働を意識した各種テストをも行います。
主にシステムエンジニアが担当しますが、プログラマが参画するケースも多々見られます。
納品、本番導入(本番リリース)対応
開発完了となったシステムのクライアントへの納品作業を行います。納品物としては一般的には作成した各種設計書、プログラムソース、プログラム実行体、テスト仕様書、テスト結果エビデンス(検証結果資料)、取扱説明書などがあります。
またクライアント環境へのシステムインストール作業なども行い、本番リリース(本番稼働)時の対応も行います。
主にシステムエンジニアが担当しますが、プログラマが参画するケースも多々見られます。
運用・保守
契約にもよりますが、開発したシステムの本番運用や各種バグ(不具合)対応、機能追加などの保守作業を行います。
ケースによって様々ですが、たいていの場合はシステムエンジニアだけでなくプログラマも参画します。
システムエンジニアとプログラマの気になる給料について
ではシステムエンジニアとプログラマという職種の給料は、それぞれでいったいどれくらいなのでしょうか。
公的な比較結果
以下に政府統計である「平成27年賃金構造基本統計調査」の「職種別第1表 職種別きまって支給する現金給与額、所定内給与額及び年間賞与その他特別給与額(産業計)」上の「企業規模計(10人以上)」におけるシステムエンジニアとプログラマそれぞれの給与金額等(男女計)を示します。
比較項目 |
プログラマ |
システムエンジニア |
決まって支給する現金給与額 |
299,100円 |
400,600円 |
年間賞与その他特別給与額 |
494,300円 |
1,116,100円 |
年収(※) |
4,083,500円 |
5,923,300円 |
平均勤続年数 |
6.2年 |
11.8年 |
超過実労働時間数 |
17時間 |
21時間 |
※:年収は(「決まって支給する現金給与額」× 12 )+「年間賞与その他特別給与額」にて算出。
統計では各項目共にプログラマよりもシステムエンジニアの方が、値が高くなっていることがわかります。
実際どっちの方が収入が高いか
前出した公的な統計上ではシステムエンジニアという立場にある方が、プログラマという立場よりも報酬は高くなっていました。これは日本におけるIT系企業、特にソフトウェア開発会社等に「システムエンジニアの方がプログラマよりも上級職種」という考え方が今も根強くあるからです。しかしながら実際に業務を遂行しているとプログラマとシステムエンジニアの境界線に確固たる定義がなく、かつすべての企業が報酬や評価の判定をプログラマやシステムエンジニアといった職種で行っているわけでもありませんから、この統計が本当に実態に合ったものであるとは言い切りにくいでしょう。
逆に同じプロジェクト内であるにも関わらず、プログラマの方がシステムエンジニアよりも報酬が高くなるケースもあります。というのも日本におけるシステム開発プロジェクトの形は、建設業における大手ゼネコンの建設プロジェクトの形と似たような構造になっているからです。
例えば日本のIT業界でよく見られるケースですが、クライアントが大手システム開発会社にシステム開発を発注した場合、受注した大手システム開発会社は、それを自社だけで行うのではなく子会社や協力会社(つまり下請け会社)に部分的に仕事を振ったり、もしくはそれらから多くの技術者を集めたりして仕事をさせるのです。下請け会社は実質上、二次下請け会社や更には三次下請け会社がある場合も珍しくなく、言ってみれば大手システム開発会社を頂点としたピラミッド構造のようになっていて、下層に行けば行くほど中間業者が増えて利益が減り、低い報酬でたくさん働く、という構図になっています。
このような構図下では、例えば一次下請け会社クラスのプログラマと三次下請け会社クラスのシステムエンジニアが同じプロジェクトにて仕事をすることも珍しくなく、そのような場合、(あくまでも職種面だけに着目した場合ですが)技術者に支払われる実質的な報酬は、やはり所属する会社の規模に左右されてしまいますので、現実的には一次下請けクラスの会社に属する「プログラマ」という職種である技術者の方が、三次下請け会社に属する「システムエンジニア」という職種である技術者よりも高いという事象が発生するケースが多々あるのです。(「賞与」になると、その傾向は更に顕著になると言えるでしょう。)
よってそのようなケースが珍しくないことから「プログラマとシステムエンジニア」というような職種レベルで報酬の多い少ないを比べるという考え方をするのではなく、「システムエンジニアになるためには必ずプログラマとしての経験を積む必要がある」という事実をも踏まえた上で、「あのシステム開発会社と、このシステム開発会社とでは、様々な面でどちらの方が待遇がいいか」というように、会社という対象で比べるという考え方を持った方が賢明と言えるでしょう。
なお、前出した公的な統計上の超過実労働時間数については、実態としては少なくともこの倍はあるものと考えていた方が無難でしょう。
どんな人が向いているか
プログラマ、システムエンジニアになるためには、それぞれで様々な能力が必要ですが、その前にどんな人がプログラマやシステムエンジニアといったIT技術者に向いているのでしょうか。
論理的思考ができるか
コンピュータは基本的には「0」と「1」の二進数の世界で、言ってみれば「Yes」か「No」を基準にした選択条件が延々と続く世界です。例えば、入力された値が複数の選択条件を通過した場合、結果としてどのような値になるか、というようなことを論理的に考え、かつ説明できる能力が必要です。
もしこのようなことに対して「楽しい」とか「面白い」と感じられるのであれば、プログラマやシステムエンジニアに向いていると言えるでしょう。
イメージを具現化できるか
総じてコンピュータシステムを開発するということは、実は「作る」のではなく「創る」ということであり、基本的には今存在しないものをゼロから開発するということです。もちろん過去の前例があって、それを模倣したりカスタマイズしたりするというケースも多々存在しますが、それでもすべてが流用できるわけではなく、必ず「無」から創出しなければならない部分が発生します。そしてそれらの元が「言葉」や「イメージ」、「思い」といった抽象的な考えや概念であることが往々にして見受けられます。
例えば普段の日常生活においてでも抽象的な考えや概念を、より具体的な事物へと展開することができるような人であれば、プログラマやシステムエンジニアになる資質を持っていると思えます。
集中力が持続できるか
プログラマにしろシステムエンジニアにしろ、IT技術者の仕事というものは簡単に、すぐに、できるというものではありません。状況を把握する、意図を理解する、考える、話す、手を動かす等々、常に意識を集中して行う必要があり、時にはそれが数時間に及んだりします。(特に本番障害に対するリカバリー業務を行う場合などは一時も気が抜けません。)
また様々な技術や知識は与えられるものでなく自ら習得するという姿勢が求められます。そしてその際にも集中力が必要です。集中力に欠如していたり飽き性である方は、IT技術者には不向きと言えます。
体力があるか
一日中椅子に座ってディスプレイと対峙し続けているので、「体力的に楽な仕事」と思われがちであったり「頭脳労働」と言われたりしますが、実際のところプログラマもシステムエンジニアも体力の有無が大きくものを言います。
案件にもよりますが、IT業界は他の業界と比べて労働時間が長時間になることがあります。毎晩終電時刻まで残業したり徹夜して更に翌日も通常どおり仕事をしたり、というようなこともあります。更には例えば仕事に遅れが発生している場合などは休日出勤をするというようなことも多々あります。
このようにいくら椅子に座って行う仕事であっても、その長い労働時間に耐えうる必要最低限の体力が必要ですので、そういう意味では健康面や体力面で不安のある方には、あまり推奨できない職業と言えますが、逆に健康で相応の体力を有している人であれば基本的には問題ないと言えるでしょう。
気分転換や頭の切り替えが上手か
近年、業界や業種に関わらず、仕事においてメンタル面で痛手を負う方が珍しくありません。それが酷くなって統合失調症やうつ病等の精神的な病に罹患してしまうケースも多々見受けられます。
残念ながらIT業界においてもそれは例外ではありません。最近では少ない予算、多くの作業、たりない人手、短い納期、減らないクレーム、といった環境下でプロジェクトを遂行することもあり、そのためメンタル面で辛い目に遭うことも多くなっています。そのような状況下では、例えば気分転換がうまくできずに辛い気持ちばかりに固執してしまうと、いずれ精神が持たなくなってしまいます。もちろんメンタル面が強ければ、それに越したことはありませんが、それにしてもやはり限度というものがあります。
よってメンタル面が弱い方には、あまりお勧めできませんが、逆にメンタル面が強い人であれば向いている可能性がありますし、更に気分転換などで頭の切り替えが上手にできる人であれば資質は充分持っているのではないかと思われます。
まとめ
以上、プログラマとシステムエンジニアの違いを、種類や仕事内容、報酬面などの観点から説明しました。しかしながら日本のIT業界における職種や役割などは、IT関連技術の目まぐるしい進歩と共に現在も絶えず変化しています。
例えば今は「プログラマ」、「システムエンジニア」というような職種として分かれてはいますが、かつて「コーダー」(指示された内容に沿ってプログラムコードを書くだけの人)や、「パンチャー」(紙面に書かれたプログラムコードをコンピュータに入力していく人)という職種が存在していたものの、技術や機器の進化と共にそれらが「プログラマ」という職種に内包されていったように、近い将来「プログラマ」という職種は「システムエンジニア」に内包されてしまうかも知れません。
また、人の手でプログラムコードを書いたりコンピュータに入力したりしていたことが、コンピュータ自体でできるようになったのと同様に、今は人間が行っているプログラミング自体がコンピュータによってなされるようになって、「プログラマ」という職種自体が不要になるかもしれません。もちろん「システムエンジニア」という職種がこのまま永遠に残るという保証もありません。
そういう意味では日本という国でIT技術者の仕事に携わるのであれば、職種という枠には固執し過ぎずに大局的にIT業界というものを見ていくべきだと言えます。