読者です 読者をやめる 読者になる 読者になる

paiza開発日誌

paiza(http://paiza.jp)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

ITエンジニアを不幸にする「多重下請け構造」が抱える問題点

ITエンジニアのキャリア ITエンジニアの転職

f:id:paiza:20161207115650j:plain
Photo by Camdiluv ♥
f:id:paiza:20140916135428p:plainこんにちは、谷口です。

日本のIT業界について語られる際、蔓延している「多重下請け構造」について取り上げられることがよくあります。

この多重下請け構造は、企業側や発注者にとっては大変都合のよい仕組みです。

ただ、構造の下の方で実際にシステムを開発している人々にとっては苦労が多く、決して「現場の開発業務をやりやすくするための仕組み」とは言えません

本来、ITエンジニアは技術を駆使し、スキルを活かしてシステム開発をするのが仕事のはずです。しかし、多重下請け構造の中では、エンジニアの高いスキルも飼い殺されてしまうことが珍しくありません

今回は、多重下請け構造」にはどんな問題があるのかを考えて行きたいと思います。

多重下請け構造とは

f:id:paiza:20161207120046j:plain
Photo by m-louis .®
多重下請け構造」とは、受託システム開発において、発注元企業から直接仕事を請け負った元請企業が、その仕事を分割して下請け企業に下ろし、一次請け、二次請け、三次請け、四次請け……と下請け企業がさらにその下請けに仕事を分割して下ろしていく、ピラミッド型の構造のことです。

業務の分割については、元請け企業は要件定義や設計等のいわゆる上流工程とされる業務を行い、実装やテスト等の下流工程は、分割されて下請けに委託されていく……というのが多いパターンです。

ITに限らず、どんな仕事でも「自分たちでやるより専門の業者へ委託しよう!」というのは、よくあることだと思います。例えば、仕事でイラストが必要になったけど、社内に描ける人がいない…という場合は、道具を揃えて社員に絵の描き方を学ばせるよりも、イラストレーターに外注をした方が、早く質の高いイラストを手に入れられるでしょう。

では、IT業界の多重下請け構造は、一体何が問題なのでしょうか?

多重下請け構造の問題点

f:id:paiza:20161207120218j:plain
Photo by teens4unity

◆下の層に行くほど給与が安くなる

n次請けに及ぶまでの下請け企業に仕事が下りてくるのは、「開発技術を見込まれて」ではなく「とりあえず作る人の頭数を集めるため」な場合がほとんどです。

発注する側も、安く作ってもらえるならその方がいいですし、下請けも「うちは他社より安く作れますよ!」とアピールをし、価格競争を招いてしまいます。

そもそも多重下請けの場合、中間の企業はマージンを抜いてから下層の下請け企業に業務を委託していくため、下層になるほど、下りてくる金額は安くなっていくのです。

これが横行すると、末端で開発をする技術者にもしわ寄せが来ます。

たとえ同じようなものを開発したとしても、中間にどれぐらい上位請け企業が入っているかで受ける金額が変わる上、価格競争まで発生しているため、下層に行くほど、現場の技術者が受け取る賃金は安くなってしまい「技術に対して正当な対価」が支払われない状況を招いてしまうのです。

◆技術者が交換可能な頭数として換算される

受注された開発業務は、技術力がそれほどない人でも作れるように細分化されていきます。業務量が多くて間に合いそうになければ、下請けから作業者がどんどん投入されていきます。

それで開発業務が滞りなく進んでいけばよいのですが、システム開発下請け企業を増やして頭数さえ増やせば必ずうまくいく……というものではありません。それでうまくいくなら、みずほ銀行のシステムも今ごろ無事にできあがっているはずです。

itpro.nikkeibp.co.jp

多重下請けの場合、業務が増えて人が必要になったら下請けから増やす、運用に入って不要になったら契約を切る……といった感じで、技術者は交換可能な頭数として換算されている状態ですが、人海戦術で大規模システムを開発しようとすると、付随して下記のような問題も頻発してしまいます。

◇下請けが増えると責任問題が曖昧になる

プロジェクトの規模が大きくなると、その分多くの下請け企業が介在することになります。

すると、大小さまざまなトラブルが生じた際に「うちはこの部分だけ作る契約ですから他は知りません」「このバグはうちのせいではありません」などと、責任の所在がどこにあるのかわからない……といったことになりがちです。

◇常駐によるトラブル

受託開発の場合、下請けの技術者は、上位層の企業に常駐して開発をしなければならない場合が多くあります。

もちろん労働環境のよい常駐先もたくさんありますが、複数企業から派遣されてきたレベル感の全然わからない人同士で開発を進めていかねばならない、まだ技術的に未熟なのに一人で常駐先に派遣されてしまって相談できる人がいない、自社ではなく常駐先の労働条件に沿って働かなければならない……などなど、常駐開発によるトラブルは絶えません。

◆エンジニアの技術が育たない

先ほども言いましたが、多重下請けで開発を進めていく場合、技術レベルが高くない人でも作れるように、開発業務は分断されていきます。

末端の作業者に下りてくる仕事はシステム内でどう使われるのかわからないレベルにまで細分化されていて、「何のためのシステムを作っているか知らない」「いま作ったものが誰にどう使われるのかわからない」といったパターンもよくあります。

また、実装中に何か問題や改善点が発覚しても、手戻りが許されず「仕様」として設計通りに作らざるを得ないことも多いです。

さらに、チーム共通で使う開発ツール等は、全員が問題なく使えるように、レベルの低い人に合わせた環境が採用されてしまいがちです。この場合、「もっと便利なもの」があると知っていたとしても、「みんなが使えて、過去に実績がある技術」「客先に指定された技術」しか使えずスキルが高い人がいても、それを活かした高い生産性を発揮しづらい環境になってしまいます。

こうして、多重下請け構造の中では、エンジニアとして核であるはずの技術を磨くことが難しくなってしまうのです。

■技術を磨きたいエンジニアはどうすべき?

f:id:paiza:20161207120305j:plain
Photo by Wim de Jong
金融系や官公庁等の巨大システムが社会にとって必要なものですし、多重下請けによる開発手法がなくなることはないでしょう。

ただ、上記のように末端の作業者が使いつぶされ、技術を磨くのも困難な環境が、技術を磨いていきたいエンジニアに向いているとは思えません

日本のIT産業は、かつては事務処理等のシステム化目的で発注される受託開発の割合が高く、「ITはコスト削減のための裏方的な仕事」といった傾向がありました。そのため、「利益を上げるための業務ではないので、いかに安くそれなりに作るか」が重要なポイントで、エンジニアの地位もあまり高いものとは言えず、「技術を磨く」「革新的なシステムを作る」といったことは二の次の扱いでした。

しかし現在では、自社でサービスの開発や人工知能等の新しい分野の技術も台頭し、品質の高いサービスを開発することで、技術者自身が利益を生み出せる時代となっています。IT技術が好きで自分の開発スキルを伸ばしていきたい人の願いが叶いやすい企業も増加していますから、現状に不満がある人は「このままこの仕事を続けるべきか」というところから考え、必要があれば動き出した方がよいでしょう。

■まとめ

受託開発の現場では、こうした多重下請け構造が根幹にあるせいで、個々の企業では改善が難しいレベルで、末端のエンジニアにしわ寄せが行く環境ができあがっています。

ただ昔に比べると、受託でもこの構造にあてはまらない開発手法をとる企業や、自社サービスの開発をしている企業も増えてきているので、望めばよりよい環境に移動することは可能な時代となっています。

日本のITエンジニア全体の評価には、まだまだ伸びしろがあります。paizaも、もともと「エンジニアの技術力がきちんと評価され、またそれを活かせる職場を探せるプラットフォームが必要だ!」といった想いから作り始めたサービスです。

エンジニアの負担が少しでも減らせるよう、そして地位も向上させられるよう、paizaが考えていくべきことは多いと感じます。

paiza.jp




paizaではスキルのあるエンジニアがきちんと評価されるようにし、技術を追い続ける事が仕事につながるようにする事で、日本のITエンジニアの地位向上を図っていければと考えています。特にpaizaではWebサービス提供企業などでもとめられる、システム開発力や、テストケースを想定できるかの力(テストコードを書く力)などが問われる問題を出題しています。

テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp

美少女エンジニア育成プログラミングゲーム『もし次の常駐先が、女子エンジニアばっかりだったら』公開!

イベント告知/レポート

f:id:paiza:20161205181100j:plain
paizaでは、12月6日(火)より美少女エンジニア育成プログラミングゲームもし次の常駐先が女子エンジニアばっかりだったら(略してもし女)を開始いたします。

paiza.jp

■「もし次の常駐先が女子エンジニアばっかりだったら」概要

f:id:paiza:20161205182558j:plain
開催期間:2016年12月6日(火)~2017年1月3日(火)
参加資格:だれでも何回でも参加可能
プレゼント:ゲーム内のツイートボタンからハッシュタグ「#もし女」を付けてつぶやいてくれた方の中から、抽選で1名に1万円分、50名に500円分のAmazonギフト券をプレゼント
対応言語:Swift、C、C++C#Objective-CJavaPerlPython(2.x系)、Python(3.x系)、RubyPHPScala、Go、HaskellErlangBash、R、JavaScriptCoffeeScriptCobolVB、F#、Clojure、D
計24言語

もし次の常駐先が女子エンジニアばっかりだったら」は、ITエンジニアの夢をかなえる楽しく華やかな環境での業務シミュレーションを行いながら、さまざまな難易度のプログラミング問題を解くゲームです。ITエンジニアを目指す学生の方にも、開発業務を疑似体験いただける内容になっております。

■女子エンジニア育成シミュレーション × プログラミング × スキルアップ

f:id:paiza:20161205181822j:plain
プログラミング問題に正解するごとに、開発現場へ新たな女子エンジニアが投入されます。開発メンバーを増やしながら案件を成功させて女子エンジニアたちを育成していくと、遊び心のあるオフィスや女の子たちの可愛い衣装が解放されていきます。

f:id:paiza:20161205181828j:plain
プログラミング問題はやさしいものから高難易度なものまで多数用意。最高難易度の【霧島京子からの挑戦状】は、ゴール到達までの最小手数を競うランキング問題としてもお楽しみいただけます。

■あらすじ

f:id:paiza:20161205182641j:plain
ITエンジニアとして働くあなたが新しい常駐先を訪ねると……そこは女子エンジニアだらけの開発現場だった!

助けを求める女子エンジニアたちへ救いの手を差し伸べていけば、あなたを慕った彼女たちはどんどんチームのメンバーとして仲間になって…!?

案件炎上、メンバー離脱……さまざまなトラブルを乗り越えながら案件を成功させ、可愛い女の子たちが成長していくと――。

最高の開発現場を作れるかどうかは、あなたのプログラミングスキルと采配次第!

■プログラミング力が試される!人のコードが見れる!

f:id:paiza:20161205182651j:plain
「同じ課題に対し、他の人はどういうコードを書くんだろう?」という思いのもと、もし女は気軽に参加できて、他の人のコードが見れて、楽しく勉強になるイベントを目指しています。

そのため、これまでのpaizaオンラインハッカソン同様、問題内容や回答コードについてブログ等で公開してもOK!!という形をとっています。(むしろ公開していただけますとpaizaとしても大変嬉しいです!!)

たくさんの方からのご参加をお待ちしております!!!!

paiza.jp




paizaではスキルのあるエンジニアがきちんと評価されるようにし、技術を追い続ける事が仕事につながるようにする事で、日本のITエンジニアの地位向上を図っていければと考えています。特にpaizaではWebサービス提供企業などでもとめられる、システム開発力や、テストケースを想定できるかの力(テストコードを書く力)などが問われる問題を出題しています。

テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp

JavaScriptライブラリを使った超簡単チェスゲーム開発入門!ブラウザ上でCPU対戦が可能!

Webサービス紹介 プログラミング初心者 プログラミング学習 開発ネタ

f:id:paiza:20161202161825j:plain
どうも、まさとらん(@0310lan)です。

今回は、JavaScriptによる簡単なゲーム作りに挑戦するため、「チェス」をテーマにした開発チュートリアル記事となっています。


「なんだか難しそう…」と思うかもしれませんが、簡単な手順で実現できるJavaScriptライブラリを活用するので誰でも最後まで楽しめると思います。

また、後半には「CPU対戦」機能も組み込んでいくので、チェスやゲーム開発にご興味ある方は、ぜひトライしてみてください!

■必要なファイルを準備しよう!

まずは、チェスの骨組みを簡単に構築する方法として「chessboard.js」というJavaScriptライブラリを使ってみましょう。

chessboard.js

f:id:paiza:20161202162139j:plain
chessboard.jsを使うと、チェスで遊ぶための「駒」や「ボード」を簡単にWeb上へ描画することが可能で、駒を動かす際のアニメーションやマウスによるドラッグ&ドロップなどのイベント処理も充実しているのでとても便利です。


まず最初に、サイトへアクセスして必要なファイルをダウンロードしておきましょう!
f:id:paiza:20161202162158j:plain
ファイルの中には、「chessboard.min.css」と「chessboard.min.js」が入っているので、これをHTMLファイルから読み込むようにすればOKです!

<!-- index.html -->


<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>チェスゲーム</title>
    <link rel="stylesheet" href="css/chessboard.min.css" />
  </head>
  <body>
    
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script src="js/chessboard.min.js"></script>
    <script src="js/game.js"></script>
  </body>
</html>

「chessboard.js」はjQueryをベースに作られているので、一緒に「jquery.min.js」を読み込んでおくのを忘れないようにしましょう。

(「game.js」は、これから作っていくJavaScriptファイルになります)


ちなみに、ダウンロードしたファイルの中に「img」フォルダがあると思いますが、これはチェスの「駒」画像になるので、そのまま「index.html」と同じディレクトリに配置しておきます。


ここまでのフォルダ構造は以下のとおり!
f:id:paiza:20161202162344j:plain
これで必要なファイルが揃ったので、いよいよ「チェスゲーム」の開発に挑戦してみましょう!

■「チェスボード」を作ってみよう!

チェスで遊ぶには「駒」と「ボード」が必要ですが、「chessboard.js」を使って簡単に描画してみましょう!


まずは、HTMLファイルに「ボード」を描画するための領域を「divタグ」で指定します。

<!-- index.html -->


<body>


  <!-- ボードの描画領域 -->
  <div id="board" style="width: 400px">




  <!-- 以下省略 -->
</body>

インラインでCSSの「幅(width:400px)」を指定していますが、もちろん外部スタイルシートに記述しても問題ありません。


次に、JavaScriptファイルの「game.js」に、先ほど作った「divタグ(#board)」を指定してボードを描画してみましょう!

// game.js


var config = {


  // チェスの駒を初期位置にする
  position: 'start'


};


// divタグ「board」を指定して「config」を設定する
var board = ChessBoard('board', config);

初期設定用のオプション「config」を「ChessBoard()」から参照するだけでOK!


これで、index.htmlをブラウザで開くと立派な「チェスボード」が表示されるはず!
f:id:paiza:20161202162954j:plain
ただし、このままだと駒が表示されるだけで、自由に動かすことができません。


そこで、駒をマウスで自由に動かせるように、先ほどの設定オプション「config」に「draggable」を追記します。

// game.js


var config = {


  position: 'start',


  // マウスで駒を動かせるようにする
  draggable: true


};


これだけで、駒を自由にドラッグ&ドロップで動かすことが可能になります!
f:id:paiza:20161202163027j:plain
実は、すでに相手の駒を取る動作も可能になっているので、対人戦であればこの状態でも遊ぶことは出来るでしょう。

■「ゲームロジック」を構築しよう!

さて、ここまでのプログラミングで、チェスを遊ぶための骨組みは完成しました。


ただし、今の状態だと「駒」をどこにでも動かせるし、どちらの手番なのかも不明なうえ、ゲームが終了したかどうかの判定もできません。

つまり、チェスという「ゲームロジック」が必要になるのですが、普通にプログラミングすると膨大な時間と労力が掛かってしまいます。


そこで、このロジック部分を提供してくれるJavaScriptライブラリが公開されているので、こちらを利用してみたいと思います!

chess.js

f:id:paiza:20161202163110j:plain
jQueryと同じく、こちらもCDN経由で手軽に利用することが出来るので、以下のスクリプトをHTMLファイルに追記すれば準備完了です!

<!-- index.html -->


<script src="https://cdnjs.cloudflare.com/ajax/libs/chess.js/0.10.2/chess.min.js"></script>

「chess.js」を使う上で重要なポイントは、「駒の状態監視」と「駒が動ける場所」を常に把握しておくという点です。

// gameインスタンスを作成
var game = new Chess();


// 駒の状態監視
game.move();


// 駒が動ける場所
game.moves();

それぞれの使い所は以下のとおり!

  • 「game.move()」:駒がルールに沿って移動したかどうかを確認する
  • 「game.moves()」:相手の動ける駒の場所をすべて配列で取得する


このライブラリと「chessboard.js」と組み合わせることで、手軽にロジックを組み込んだ「チェスゲーム」が構築できるわけです。


そこで、設定オプション「config」に、駒が移動した後のイベント処理を追記します。

// game.js


var config = {


  position: 'start',
  draggable: true,


  // 駒が移動した後にonDrop関数を実行する
  onDrop: onDrop


};

「onDrop」を追記することで、駒を移動してボードに置いた瞬間に発動するイベント処理を書くことが出来るようになります。


この時に実行する関数として、「onDrop」を作成します。

// game.js


// 関数
var onDrop = function(source, target) {


    // 処理内容を書く


};

「config」に追記した「onDrop」は、引数として「駒を移動する前の位置」と「駒を移動した後の位置」を受け取ることが可能なので、それぞれの位置を「source」「target」に割り当てています。


そして、先ほどご紹介した「game.move()」を組み込むことで、ルールに沿った移動ができているかをチェックし、問題があれば元の位置に戻すようなプログラミングをしていきます。

// game.js


var onDrop = function(source, target) {


  // 駒の移動パターンをチェックする
  var move = game.move({


    from: source,  // 移動元の位置
    to: target         // 移動後の位置


  });


  // 駒の移動に問題があれば元の位置に戻す
  if (move === null) return 'snapback';


};

「game.move()」は、駒の移動に問題があったら「null」を自動的に返すようになっているので条件分岐が書きやすいですね。
ちなみに、「null」が返ってくるパターンとしては…、

  • ルールで動かせない場所に移動した場合
  • 取ることが出来ない駒を取ろうとした場合
  • 自分の手番じゃないのに駒を動かした場合

…など。

ゲームを遊ぶ上で最低限のロジックを兼ね備えているので便利です。


また、「game.moves()」は相手の動ける駒の場所をすべて配列で取得できるわけですが、逆に言うと「もう動けない…」という状況になったら配列は空っぽの状態ということになります。

これを利用すれば、ゲームの終了判定も簡単にプログラミングできるのが分かります。

// game.js


var playerMove = game.moves();


// 配列の中身が0になったらゲームを終了する
if (playerMove.length === 0) {


    alert('終了');


}

■「CPU対戦」機能を組み込もう!

f:id:paiza:20161202163402j:plain
最後に「CPU対戦」ができる機能を簡易的に組み込んでみましょう!
実は、これまでに学んできた内容で十分に実現できる機能なので、難しい処理を構築する必要はありません。


まず、「CPUプレイヤー」の駒を自動的に動かす方法ですが、すでにご紹介したように「game.moves()」で相手の駒が動かせる場所をすべて配列で取得することが出来るようになっています。

そこで、乱数を使ってこの配列の中から1つ選んで、そこへ駒を移動させるようにしてみましょう!

// game.js


var game = new Chess();


// CPUプレイヤーの移動処理
var makeCPUmove = function() {


    // CPUが動ける場所を変数に代入
    var cpuMoves = game.moves();


    // 駒が動かせる場所をランダムに1つ選ぶ
    var randomNum = Math.floor(Math.random() * cpuMoves.length);


    // 選択した場所へ駒を動かす
    game.move(cpuMoves[randomNum]);


    // チェスボードの描画を更新する
    board.position(game.fen());
}

プログラミングしやすいように、CPUプレイヤーの移動パターンを管理する「makeCPUmove()」という関数を作りました。

中身は単純で、CPUが動ける場所を取得し、乱数を使って次に動く場所を決めて移動するだけの処理です。


ポイントは「game.move()」と「board.position()」の使い方です。

これまで「game.move()」は、ルールに沿った駒の移動ができているかのチェックに使っていましたが、実はボードの位置を指定するとそこへ移動させることも可能です。

また、CPUプレイヤーの駒が移動した後は、一度ボードの描画を更新する必要があるので、「board.position()」を使ってすべての駒を再描画しています。


あとは、自分の駒をボードへ置いた後に、「makeCPUmove()」関数を実行させれば「CPU対戦」機能の完成です!

// game.js


var onDrop = function(source, target) {
  
    // 一部省略
  
    
    // CPUプレイヤーの移動処理を実行
    makeCPUmove();


};

ぜひ、以下のリンクからチェスゲームを遊んでみてください!
(PCブラウザ推奨)
チェスゲーム サンプルデモ


また、今回のサンプルの全ソースコードコチラから確認できます!
サンプルコード

■開発シミュレーションプログラミングゲーム「もし次の常駐先が、女子エンジニアばっかりだったら」が2016年12月6日(火)から公開!!

f:id:paiza:20161205165335p:plain
paizaでは、開発シミュレーションプログラミングゲーム「もし次の常駐先が、女子エンジニアばっかりだったらの公開を予定しています。

最高の開発現場を作れるかどうかは、あなたのプログラミングスキルと采配次第!2016年12月6日(火)から、ぜひ挑戦してみてください!

■まとめ

今回は、「chessboard.js」に画面の描画を担当してもらい、「chess.js」にゲームロジックを任せてみました。

このように便利なライブラリを活用することで、本格的なチェスゲームを短時間で制作することが出来るのでとても便利だと思います。


それぞれの公式ドキュメントには、さらなるカスタマイズ方法も記述されており、ゲームの結果を「FEN形式」で書き出したりも可能なので、ご興味ある方はぜひトライしてみてください!


<参考>




paizaではITエンジニアとしてのスキルレベル測定や、動画によるプログラミング学習コンテンツ(paiza Learning)を提供しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp