派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】エンジニアだからこそ、今さら聞けないアルゴリズムの基本

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年5月30日のイベントは「話題の人気アプリの作者が登場!エンジニアだからこそ、今さら聞けないアルゴリズムの基本」を開催。

エンジニアなら誰もが耳にしたことがある「アルゴリズム」。なんとなく知ってはいるけれど、細かく学んではいないという人も多いのではないでしょうか。2018年5月現在で100万ダウンロード越えを達成、2016年のApp Store「今年のベストApp 10選」に選出されたアプリ「アルゴリズム図鑑」の作者である石田保輝さんを講師にお迎えして、楽しくアルゴリズムの基礎の基礎を教えていただきました。

f:id:itstaffing:20180719122112j:plain

■今回のイベントのポイント

・アルゴリズムとは
・具体的なアルゴリズムのご紹介
・アルゴリズムと計算量
・アルゴリズムの理論


【講 師】石田 保輝さん
▲【講 師】石田 保輝さん
東京在住のフリーランスエンジニア。2011年、京都大学大学院修士課程修了。いくつかのベンチャー企業を渡り歩いたのち、フリーランスとして独立。2016年、個人で制作したエンジニア向け学習アプリ「アルゴリズム図鑑」をリリース。世界100万DLを達成。「Appleの選ぶ2016年のベストアプリ」に選出される。

アルゴリズムとは

アルゴリズムとは、ある問題を解決するときの計算の厳密な手順で、例えるなら料理のレシピのようなもの。たとえばカレーを作るレシピならば、玉ねぎを炒める、肉を炒める、野菜と水を入れて煮込む、ルーを入れるという手順が一般的です。しかし、ルーを使わずスパイスを調合して本格的に作るなど、その他のレシピも存在します。同じ料理を作るにも、いくつかのレシピがあるように、アルゴリズムも、同じ問題を解決する複数のアルゴリズムがあるそうです。

また、ソート(バラバラに並んだ数字を小さい順に整列させる)や探索(多数のデータの中から目的の値に一致するデータを探す)など、さまざまな問題を解決するアルゴリズムがあるそうです。

f:id:itstaffing:20180719122118j:plain
▲カレーを作る手順がレシピ、問題を解決する手順がアルゴリズムということに納得しました

近年ではコンピュータと人間の将棋の対戦が注目されていました。十年前はコンピュータが人間に勝てなかったのですが、今はコンピュータが圧勝しています。「これは将棋のアルゴリズムが、ここ十年で格段に進歩したからなのです」(石田さん)

具体的なアルゴリズムの紹介

ここで、アプリ「アルゴリズム図鑑」を使って、バブルソートやリスト探索のアルゴリズムをデモンストレーションしてくれました。

f:id:itstaffing:20180719122122j:plain
▲バブルソートのアルゴリズムが動きでわかるスマホアプリ「アルゴリズム図鑑」

アプリ「アルゴリズム図鑑」は、アニメーションを使って説明が行われるため、リスト探索では線形探索と2分探索の考え方の違いだけでなく、両者の処理時間の差もよくわかりました。

f:id:itstaffing:20180719122125j:plain
▲中央値で2つのグループに分け、探索する値が含まれていないグループをバッサリと切り捨てていく2分探索のアルゴリズムは、正直、目からウロコでした

次に暗号のアルゴリズムについてです。石田さんは「いるぎなえ」という文字列を示し、これはどういう意味かと問います。実は、あいうえお順に1文字ずつ前にずらすと「ありがとう」という文字列になります。昔からある「シーザー暗号」と呼ばれるアルゴリズムですが、暗号は、このように元の文に戻す(復号)方法を相手が知らなければ通用しません。

コンピュータのデータは数値なので、暗号アルゴリズムでは、ある数を別の数に変換します。このときに鍵(何らかの関数)を使います。暗号化と復号化に同じ鍵を使う暗号方式を「共通鍵暗号」と呼び、前述のシーザー暗号のほかにも、AES、DESなどのアルゴリズムが知られているそうです。

共通鍵暗号方式の課題は、鍵を相手にどう渡すかということ。ネット経由で送ると、途中で鍵そのものが盗まれてしまう危険性がありますし、(メモリカード等にコピーして)直接受け渡しするとなると、相手が手渡しできる人に限定されてしまいます。

そこで登場するのが鍵交換プロトコルや、公開鍵暗号というアルゴリズムです。公開鍵暗号は、暗号化に使う公開鍵と復号化に使う秘密鍵という、2つで一組の鍵を使います。そして、公開鍵や暗号化されたデータから、秘密鍵を割り出すことができません。

f:id:itstaffing:20180719122128j:plain
▲ペアとなる公開鍵(P)と秘密鍵(S)でそれぞれ暗号化と復号化を行う

つまり、公開鍵で暗号化したデータは、秘密鍵を持つ人にしか元に戻せません。そのため公開鍵を文字通り公開し、それを使って暗号化したデータを送ってもらい、自分だけが持っている秘密鍵で復号します。公開鍵暗号方式ではRSA暗号が有名だそうです。

また、ハッシュ関数についての解説もありました。ハッシュ関数は、データを通すと元の状態が失われバラバラになり、また、どのようなデータを入力しても、出力値の桁数(ビット数)が同じになります。しかも、同じデータを入力すると同じ結果になる一方で、1ビットでも違うデータを入力すると全く違う結果になります(ただし、ごく稀に別のデータでも同じ結果になることもあるそうです)。そのため、ハッシュ値から元の状態を推測することはできません。

ハッシュ関数は、パスワードの保存やハッシュテーブル、仮想通貨のマイニングなどにも利用されているそうです。

f:id:itstaffing:20180719122132j:plain
▲ハッシュテーブルはどこかで聞いたことがあるような……

ハッシュテーブルは「連想配列」とも呼ばれ、最新のプログラミング言語には漏れなく実装されていて、rubyならば次のように記述します。

fruit_colors = {"apple" => "red", "banana" => "yellow"}

上の例ではfruit_colorという配列で「apple」や「banana」という文字列のハッシュ値を添え字にして、色の名前を格納します。もし、同じハッシュ値になる場合は、色名をリストとして保存し、アクセス時は線形探索をするそうです。

f:id:itstaffing:20180719122135j:plain
▲ハッシュ値が同じときは、線形リストとして保存する

ハッシュテーブルは、要素数が増えても、一般に、配列に比べて、速くアクセスできるという特長があるのだそうです。

アルゴリズムと計算量

「バブルソートの計算量は?」と問われたときに、何と答えれば良いでしょうか。「1秒」「1000回」「10Mバイト」という答えは、ハードウェアの処理速度やデータ量により異なるため、いずれも意味がありません。

アルゴリズムにおいては、入力量が変わると実行時間がどのように変化するかが重要で、この変化量を表すためにオーダーという考え方を用いるそうです。たとえば入力量nに対してn~2(nの2乗)に比例して実行時間が増える場合はO(n^2)と記述します。

主要なアルゴリズムの計算量は次の通りだそうです。

f:id:itstaffing:20180719122139j:plain
▲上から順に、入力量nが増えると重くなることを示しているそうです

線形探索はO(n)で、プログラミングにおいて配列を列挙するのは線形検索と同じなので計算量はO(n)となります。ただし、これを二重ループにしてしまうとO(n^2)となり、処理がとても重くなってしまいます。

f:id:itstaffing:20180719122142j:plain
▲データ量が増えたときの計算量の増加パターン。O(n)に対するO(n^2)の上昇率に注目

したがって大量の要素数になるプログラムでは、極力、配列の二重ループを避けるべきだそうです(意図せず二重ループになっていることもあるので、注意が必要)。

f:id:itstaffing:20180719122147j:plain
▲for文で配列にアクセスしている部分は意識しやすいが、forループの中に無意識のうちに線形探索を使っていることもある

これを回避するには、前述のハッシュテーブルを使うと良いとのことです。ハッシュテーブルの計算量はO(1)で、入力量nに依存せず、定数的な処理ができるため、入力量の増加に伴って急激に処理が重くなるということはなくなります。

石田さんによれば、あらかじめnが小さいことがわかっているならば、人が見てわかりやすい、実装が単純なアルゴリズムを選ぶというのもありなので、状況に合わせて選べば良いということでした。

アルゴリズムの理論

最後に、アルゴリズムでは解けない問題や、アルゴリズムで解くのが難しい問題についても解説してくれました。

その中でも有名な「巡回セールスマン問題」では、計算量nが指数になってしまいます。「オーダーが指数になると、コンピュータで解くのは現実的でなくなる」のだそうです。

f:id:itstaffing:20180719122152j:plain
▲アルゴリズムについて深く考えたことがなかったので、とても勉強になりました

アルゴリズムという言葉はよく聞きますし、プログラミングの入門書でもほんの少しだけかじったことがあるものの、計算量がこれほど違うということを知らなかった方も多いのではないでしょうか。大規模なプログラムを開発するときには、本当に大切なことなのですね。また、アルゴリズム図鑑のアプリは、動きで説明してくれるので、とてもわかりやすいです。皆さんもダウンロードしてみてください。

【イベントレポート】エンジニアが生き残るためのテクノロジーの授業 [第2回]「プログラミングとアルゴリズムの学び方」

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年5月18日のイベントでは「エンジニアが生き残るためのテクノロジーの授業」の第2回目として「プログラミングとアルゴリズムの学び方」を開催。

常に学ぶことが求められるエンジニアですが、何を学んだらよいのかが見えないという状態に陥りやすいもの。そんな状態を打破するために、今回は、増井さんならではの視点から、技術の学び方や最低限の知識を考えるきっかけを教えてもらいました。

▼第1回のイベントレポートはこちら
https://www.r-staffing.co.jp/engineer/entry/20180608_1

f:id:itstaffing:20180710110320j:plain

■今回のイベントのポイント

・プログラミングを学ぶ前に
・プログラミング言語を選ぶ
・どうやってプログラミングを学ぶか
・なぜアルゴリズムの勉強が大切なのか


【講 師】増井 敏克さん
▲【講 師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』(以上、ソシム)がある。

プログラミングを学ぶ前に

「エンジニアが生き残るためのテクノロジーの授業」の第2回は、「学び方」を中心に紹介してくださりました。

まずは会場の参加者に対するアンケートからスタート。「作りたいソフト、ありますか?」という質問です。選択肢は「既に作っている」「作りたいものはある」「まずは勉強してから」「まったく思い浮かばない」の4つ。最も多かった回答は「まずは勉強してから」でした。

このうち「作りたいものはある」という人は、すぐにアクションを起こすべきだそうです。しかし「まずは勉強してから」という人は、問題があるとのこと。これを選ぶ人は、言語を選ぶまでに悩み、環境を作るのに悩み、始めた後も少し難しいことが出てくると投げ出してしまう傾向にあるそうです。プログラミングはあくまでも手段であり、目的をしっかり持つことが重要だと説きます。

f:id:itstaffing:20180710110327j:plain
▲「まずは勉強してから」は本末転倒。まずは目的を持つことが先決

増井さんによれば、世の中には「今からプログラミングを勉強してどうするの?」という懐疑的な人もいるそうです。しかし、増井さんの第1回イベントでも紹介があったように、エンジニアのキャリアパスは一直線ではありません。プログラミングの知識を養うことでキャリアパスが多彩に広がります。では、いつ学べば良いのでしょうか?やはり、歳をとってから学ぶよりも、今のうちに学んでおいたほうが良さそうです。

プログラミング言語を選ぶ

では、プログラミングを始めるにあたって、どのプログラミング言語を選べば良いのでしょうか?
これからプログラミングを始める人にとって、一番気になるテーマでしょう。

増井さんはポイントを次のようにまとめてくれました。

・必ずしも新しいものが良い、というわけではない
・これを学んでおけば絶対という言語はない
・最終的には2~3種類の言語を学ぶべき

趣味でプログラミングを行うならば自分の好きなものが選べます。このとき、自分の目的とするアプリやサービスが、どのような言語で開発されているかを調べると良いそうです。

f:id:itstaffing:20180710110330j:plain
▲趣味ならば、目的に合わせた言語を自由に選べる

次に開発環境を考えます。現在はIDE(統合開発環境)が普及しており、コーディング~コンパイル~実行~デバッグといった一連の作業を同一環境内で行えます。また、さまざまなフレームワークや自動化ツールの登場により、工数のかかる開発も効率良く行えるようになっています。

f:id:itstaffing:20180710110333j:plain
▲言語を選ぶ際、開発環境も考えておく

環境構築で悩みたくなければ、手軽に利用できる言語を選ぶという方法もあります。JavaScriptは、Webブラウザさえあれば実行できるので、すぐに始めたい人に向いており、VBAはPCにExcelが入っていれば使えます。PHPはレンタルサーバーを借りると、概ねどのサービスでも用意されているそうです。

どうやってプログラミングを学ぶか

言語が決まれば、次はどう学ぶかです。

まずは、最も一般的な書籍で学ぶ方法から。増井さんのお勧めは3種類の本で学ぶこと。最初は基礎を理解するための入門書、次はより深く理解するための詳しい解説書、そして最後は、実際にプログラムを作成するときに役立つ逆引き書だそうです。また、サンプルコードをコピー&ペーストでなく、自身で入力していくことも大切とのことです。

いっぽう、IDEや自動化ツールなどの使い方については動画を見るのがお勧めで、動画サイトで検索すると、見つかるそうです。

また、プログラミングそのものもオンラインで学ぶ方法もあります。

f:id:itstaffing:20180710110336j:plain
▲「ドットインストール」「Schoo」のほか、予備校や放送大学を利用するという手も

そのほかにも、勉強会で学ぶという方法があります。また、継続するには仲間を作るというのも大切なこと。勉強会に行って友達を作れれば一石二鳥ですね。

注意したいこと

プログラムにバグがあるのは論外ですが、予期せぬ脆弱性があると攻撃の対象とされてしまう危険性もあります。そのため入念なテストが必要ですが、近年では、端末の多様化、タッチパネルの普及、位置情報を使ったアプリケーションなど、テストが困難になりつつあります。

その点、公開されているライブラリならば大勢の人の手でテストも行われているため、セキュリティの確保には、そうしたライブラリを積極的に利用するのも有効です。

f:id:itstaffing:20180710110339j:plain
▲欲しい機能はライブラリにすでにテスト済みのものが存在する可能性も高い

なぜアルゴリズムの勉強が大切なのか

アルゴリズムがしっかりしていないと、良いプログラムはできません。たとえば、データが一定量を超えると、急に処理時間が増えるようなアプリケーションは、最適なアルゴリズムを使っていない可能性があるそうです。

「アルゴリズムは、一度勉強すると、ずっと使え、どのような言語にも応用できます。アルゴリズムは永久に不滅です」(増井さん)

f:id:itstaffing:20180710110342j:plain
▲アルゴリズムを自分で実装すると理解が深まる。ただし仕事ではライブラリを使うのがお勧め

また、「アルゴリズムを楽しむ」ことも重要だそうです。アルゴリズムの解説書などを参考に、自分で実装してみたり、オンラインで問題を解くサイトにチャレンジしてみたりするのも面白いそうです。

セミナーの締めとして、増井さんはプログラミングを学ぶ上での4つのポイントを紹介してくれました。

・プログラミングを目的にしない
・複数のプログラミング言語を学ぶ
・基本となるアルゴリズムは知っておく
・アルゴリズムを楽しみながら学ぶ

質問タイムでは、会場から「もし、増井さんが今からプログラミングの勉強を始めるとしたら、どの言語を選びますか?」という質問が寄せられました。

f:id:itstaffing:20180710110345j:plain
▲会場から、増井さんならどの言語を選びますか?という質問も

増井さんは、少し考えてから「私ならJavaScriptを選びます」と答えてくれました。その理由は、前述のように環境構築が楽なこと、そしてJavaScriptは、今やサーバサイドプログラミング(Node.js等)や、iOSやAndroid OS用のネイティブアプリ開発を可能にする各種フレームワークも登場しており、応用が利くこと、だそうです。

今回のイベントで、JavaScriptから始めてみるのもいいなと思いました。でも、プログラミングは手段であり、まずは目的。作りたいプログラムを見つけることが先決かもしれません。

【イベントレポート】初心者がつまずきやすいポイントを解説!PHP入門

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。2018年5月11日のイベントでは「10年使える最大効率の学習法~PHP学習から基礎作りの大切さを考える~」を開催。

プログラミングを学ぶための複数の環境が整いつつあるなかで、レガシーな書き方で無駄に回り道をしないためには、どうすれば良いのでしょうか。『PHPしっかり入門教室 使える力が身につく、仕組みからわかる。』の著者でもある小原隆義さんが、PHPの学習を題材に、効率的な学習方法を詳しく紹介してくださいました。

f:id:itstaffing:20180625105141j:plain

■今回のイベントのポイント

1. どれが正解?コードの書き方
2. 最大効率の学習法
3. キャリアの積み上げ方


【講 師】小原 隆義さん
▲【講 師】小原 隆義さん
塾講師として働いた後、独学でプログラミングを学びエンジニアに。その時の苦戦した経験をもとにプログラミングスクールのオンラインチューターを立ちあげる。長い間の教育経験からITにおける教育方法に疑問を持ち、一からカリキュラムを構築。現在は株式会社トレノケートでプログラミングからデータベースまでの企業研修を担当。著書に『PHPしっかり入門教室 使える力が身につく、仕組みからわかる。』(翔泳社)。

どれが正解?コードの書き方

小原さんは、最初に次のようなクイズを出しました。

f:id:itstaffing:20180625105154j:plain
▲あなたはどれに頼る?

会場内でAを選ぶ人は6割り近く、Bを選ぶ人は1割程度、Cを選ぶ人はチラホラという感じでした。小原さんはCを選ぶそうです。その理由として、80%外れるなら、70%当たるよりも予測が的確と言えるからだそうです。

しかし、小原さんは「では、本当にCなのか?」とさらに疑問を投げかけます。もし、これが商品ならば「80%も外れるって、どういうことなの?」と、メーカーの姿勢を疑うこともできますし「後々、バージョンアップされることを考慮すれば、Aが最も信頼できる」という考え方もできます。したがって、正解は無いのだそうです。

次は、どちらのコードが正しいか? という問題です。

f:id:itstaffing:20180625105158j:plain
▲どちらも3つのメッセージのうちの1つがランダムに表示される「おみくじ機能」を持つWebページ

大きな違いとして、Aは「おみくじ機能」を実装したPHPのコードが上のブロックにくくり出されているのに対して、BはHTMLのコード中に「おみくじ機能」を記述しています。

これはAが正解。なぜでしょうか?

Aは、ページデザインを変える人はHTMLブロックを見れば良いし、おみくじ機能を変えたい人はPHPブロックを見れば良い。つまり、立場の違う複数の人が手を入れる際に合理的だからです。

さらに言えば、次のように「おみくじ機能」を別ファイル(functions.php)に収め、それをWebページを記述しているファイル(fortune.php)に読み込むようにしておくのが望ましいそうです。

f:id:itstaffing:20180625105201j:plain
▲「おみくじ機能」を別ファイルにくくり出しておく

ファイル数も増え、コードの記述も増えますが、リファクタリング(改善)を考慮すれば、こちらが断然合理的です。

たとえば、新たに別ページを作り、そちらにもおみくじ機能を持たせる場合を考えましょう。後から「メッセージを4つに増やして」と言われたときに、毎度各ページを修正しなくとも、functions.phpの中身を修正すればよいからです。

この「一度作ったものを使いまわす」という考え方が重要で、それこそがプログラミングの歴史を形成しているのだそうです。

最大効率の学習法

では、こうしたプログラミングをどのように学んでいけば良いのでしょうか。まずは、書籍等の教材選びから。

会場の参加者からは、教材選びの基準として「ジャケ買い(表紙の見た目)」「通販のランキングを参考にする」という意見が挙げられました。小原さんがお勧めするのは「著者のプロフィール」だそうです。

f:id:itstaffing:20180625105204j:plain
▲異なるプロフィールの著者Aと著者B

著者Aが執筆する書籍は、ページ数も少な目な傾向にあり「理解するために最初に読む本」としておすすめだそうです。一方、著者Bが執筆する書籍は、ページ数は多い傾向にあるものの、現場で求められるコードの書き方をしていることが多いです。したがって「業務に入る前に1冊は読んで欲しい本」として、小原さんはおすすめします。

書籍以外に、ビデオ学習など、インターネットサービスを利用した学習方法もあります。小原さんはおすすめするサービスとして次のものを挙げました。

「ドットインストール」( https://dotinstall.com/
「Schoo」( https://schoo.jp
「Udemy」( https://www.udemy.com/jp/

Udemyは有料サービスですが、プロのエンジニアが講師を務めているのが特徴とのことです。

f:id:itstaffing:20180625105207j:plain
▲小原さんが実際に試したものの中からお勧めのサービスを紹介

勉強していくうちに「エラーが出たが直せない。どうすれば?」という状況に陥ったら、エンジニアの質問サイト「Teratail」( https://teratail.com )で質問するのもおすすめ。また、エンジニア向けブログサイト「Qiita」( https://qiita.com )で「こういうコードを書いたが、これでいいのだろうか?」と記事を掲載すると、経験豊富なエンジニアがアドバイスをくれることも多いそうです。

また、「ストアカ」( http://street-academy.com )で自分に合うセミナーを探す方法や、クラウドソーシングを使ってプロジェクトマネージャーを1時間雇い、質問しまくるという勉強法も紹介してくれました。

教材のサンプルコードは一部を書き写し、あとは、ひたすら読むのが良いそうです。コードを試して疑問に思ったことを調べ、検索する習慣を身につけていきます。このとき、PHP付属のドキュメントを読む習慣を付けることが大切だそうです。

f:id:itstaffing:20180625105210j:plain
▲ドキュメントには、PHPのステートメントの凡例や、プロのエンジニアが書いたサンプルコードが載っている

「実務でドキュメントを参照しながらコードを書く」ためにも、ドキュメントを読むクセを付けておきましょう。

キャリアの積み上げ方

小原さんは「この先も、ずっと使い続けられる技術は無い」と考えるべきだといいます。

その上で「一つの技術を専門レベルまで身につけることが大切」だと提言します。決して、いろいろな言語を学ぶのがダメというわけではなく、むしろ、いろいろな言語を習得するためにも、どれか一つを深く理解しておくべきだそうです。

f:id:itstaffing:20180625105213j:plain
▲PHPを深く理解しておけば、他言語にもすぐに移行できる

たとえば、PHPの基礎を勉強した後は「オブジェクト指向」について勉強し、その後、PHPで機能拡張が可能なCMS「WordPress」について勉強したり、PHPの「アプリケーションフレームワーク」について勉強したりして、段階的に掘り下げて勉強していくのだそうです。

また、実践を意識した技術を持つことが大切です。たとえば、バージョン管理ツール「Git」や、継続的インテグレーションツール「Jenkins」など、開発実務で使われる周辺技術についても幅広く知っておくべきだと言います。

最後に小原さんは「基礎を築くには最初の一歩が大事です。何をどう学んでいくかは人それぞれですが、常にいろいろな選択肢を考えながら学習を進めてほしい」と締めくくりました。

f:id:itstaffing:20180625105216j:plain
▲基礎を築くには最初の一歩が大事です

今回のイベントで、現場で求められるコードの書き方を学ぶ重要性と、「いろいろな言語を理解するために、まず一つを深く理解しておく」という考え方が、とても印象的でした。ぜひ、皆さんの学習にも採り入れてみてください。

【イベントレポート】今こそ、Pythonや人工知能の基礎知識を学ぼう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年4月27日のイベントは「一度は挫折しかけた、そんなあなたに贈るPythonプログラムの超入門」を開催。

今回は「やさしくPythonを知りたい超入門者」「一度は挫折しかけたけど、やっぱりPythonをやってみたい人」「Pythonで人工知能がどんな風に作られているのか興味のある人」に贈る、Pythonプログラムの超入門。書籍『Python 1年生』の著者、森 巧尚さんをお迎えして、講義形式で解説していただきました。

f:id:itstaffing:20180613130647j:plain

■今回のイベントのポイント

・Pythonってなに?
・Pythonプログラムの基本
・プログラムはどんな感じで作る?
・人工知能ってなに?


【講 師】森 巧尚さん
▲【講 師】森 巧尚さん
WebコンテンツやiPhoneアプリなどの受託開発を行うフリープログラマ。プログラミング書籍の執筆業、関西学院大学非常勤講師、PCN大阪プログラミング講師なども務める。パソコン黎明期からゲームソフト、音楽ソフト、教育ソフト、3Dソフトなど、様々な開発に携わる。著書は『Python 1年生』(翔泳社)『作って学ぶ iPhoneアプリの教科書』(マイナビ)『なるほど!プログラミング』(SBクリエイティブ)『小学生でもわかるiPhoneアプリのつくり方』(秀和システム)など30数冊。

Pythonってなに?

まずはPythonについての基礎知識から。Pythonは「YouTube」や「Dropbox」といったインターネットサービスの開発、お馴染みのロボット「Pepper」のアプリケーション開発などで知られているほか、NASAの研究開発や、Pixer社の映画のCG制作などにも使われているそうです。ビッグデータや人工知能分野でよく利用されるプログラミング言語としても知られています。

f:id:itstaffing:20180613130656j:plain
▲言葉を選んで解説してくださるので、プログラミング経験のない人にも分かりやすい

最近よく耳にするようになったPythonは、新しい技術かと思ったら、誕生は1991年(27年前)。理想的なプログラムを書くことを目指して作られたのですが、理想が高過ぎたために、当時のコンピュータでは処理が重く、一般には普及せず、主にコンピュータリソースの豊富な研究分野で使われてきたそうです。そのため、人工知能や大量のデータ処理が得意。ところが近年、コンピュータの性能が向上したため、一般でも利用できるようになりました。

Pythonは、構文がとてもシンプル。文のひとまとまり(ブロック)は、インデント(字下げ)で表し、他のプログラミング言語に比べて記述に必要な文字数が少ないという特徴があります。

f:id:itstaffing:20180613130700j:plain
▲構文がとてもシンプル

扱えるデータ型にはint(整数)、float(小数)、str(文字列)、bool(ブール)があります。文字列はシングルクオートとダブルクオートのどちらで括ってもOK。他の言語同様、計算は「+-* /」の演算子を使います。

変数の型は、宣言をせずとも、値を代入すると自動判別されます。あらかじめ型を宣言しなければならないJavaに比べると手軽な感じがします。

f:id:itstaffing:20180613130703j:plain
▲変数の型は自動的に判別される

Pythonプログラムの基本

次にPythonのプログラミングの基本を教えてもらいました。

Pythonのプログラムは上の行から順に処理されます。順に処理するだけでは複雑な処理ができないので、if文により条件に応じて処理を分岐させたり、for文により条件を満たすまで反復させたりすることができます。書式が少し違うだけで、他のプログラミング言語と同じです。

f:id:itstaffing:20180613130707j:plain
▲for文でリスト(配列)の内容を表示させる。リストも代入時に型が判別される

頻繁に使う処理は、何度も書かなくて済むようにdef文で関数としてまとめておき、場合によってはモジュールとして別のファイルに保存しておき、import文で読み込みます。

f:id:itstaffing:20180613130710j:plain
▲関数といっても数学に出てくるものと違い、定型の処理をまとめておくもの

こうして先人たちが、よく使う処理をまとめてくれた関数の集まりが標準ライブラリです。標準ライブラリが充実しているのもPythonの大きな特長だそうです。

プログラムはどんな感じで作る?

具体的なプログラムの例も、詳しく紹介してくださいました。

最初はウィンドウを作る標準ライブラリtkinterをつかったおみくじプログラム。ウィンドウの上にメッセージとボタンを表示させ、ボタンを押すたびに運勢を表示させるものです。

f:id:itstaffing:20180613130714j:plain
▲おみくじプログラムの例

次は、画像をファイルから読み込んでウィンドウ表示させるプログラムを作成。

f:id:itstaffing:20180613130717j:plain
▲画像を読み込んで表示するプログラム例

Pythonでは、コマンドをドット(.)でつなげられ、たとえば「画像ファイルを開いて」「リサイズをする」という2つのコマンドの間に「画像をモノクロ化する」というコマンドを挟む、といったこともできます。

ここでは読み込んだ画像をモノクロ化して、一度16×16ピクセルの解像度にリサイズし、再度300×300ピクセルに拡大するという処理をします。結果は、画像の情報量が減り、モザイク表示のようになりました。

f:id:itstaffing:20180613130721j:plain
▲画像を読み込みモノクロ、モザイク表示にするプログラム例

この時点では、このプログラムにどのような意味があるのかわかりませんでした。しかし、後で、このプログラムが活躍します。

人工知能ってなに?

いよいよPythonの得意分野である人工知能について。

人工知能(機械学習)には「教師あり」「教師なし」「強化学習」という3つの学習方法があります。

教師あり学習は「問題と答えのペア」を大量に見ることで特徴を学習させる方法で、学習すると「これはなにか」を予測できるようになります。身近なところでは手書き文字や音声の認識などに使われています。

教師なし学習は「問題と答えのペア」のないデータを調べます。こちらは答えを見つけるための学習ではなく、似たデータをまとめて特徴を抽出したり、グループ分け(クラスタリング)をしたりするときに使います。

強化学習は「問題と答えのペア」は教えないけれど、よい結果が出たときに強化していく学習方法で、答えのない問題で、よりよい方法を見つけることができるようなります。人間を負かしたことで話題になった、将棋や囲碁のソフトでも利用されています。

f:id:itstaffing:20180613130724j:plain
▲いよいよ人工知能のプログラムをPythonで作る

Pythonで人工知能を作るには、人工知能ライブラリを利用します。ここで利用するsklearnというライブラリには、学習用にあらかじめ手書き数字のデータも用意されています。これを基に、新たなデータがどの数字を手書きしたものかを予測するプログラムを作成します。

サンプルデータは、容量を減らすため解像度の粗いものが使われています。新たに予測させるデータも同様に解像度を下げますが、このとき先ほど作ったモザイク化の処理が活躍します。

最終的なプログラムは次のようなものになりました。

f:id:itstaffing:20180613130727j:plain
▲手書き文字を予測するプログラム。思った以上に短いことにびっくり

今までは機械学習といっても雲をつかむような感じでしたが、森さんが丁寧に噛み砕いて解説してくださったので、どのようなことをしているのか、その一端を垣間見ることができました。勉強しようと思いつつ、まだ手を付けられていない方、『Python 1年生』から、はじめてみませんか。

【イベントレポート】エンジニアが生き残るためのテクノロジーの授業 [第1回]「ITエンジニアに求められるスキルと、業界のトレンドを知る」

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年4月18日のイベントでは「エンジニアが生き残るためのテクノロジーの授業」を開催。

技術士の資格を持ち、著書に『エンジニアが生き残るためのテクノロジーの授業』(翔泳社刊)を持つ増井敏克さんが、同書をベースに、エンジニアが生き残るためのテクノロジーについて、6回に分けて解説します。今回はその第1回目です。

f:id:itstaffing:20180607124720j:plain

■今回のイベントのポイント

・ITエンジニアを取り巻く環境の変化
・ITエンジニアのキャリアと求められるスキル
・ビジネス目線でITを考える
・IT業界のトレンド(人工知能/IoT/こどものプログラミング教育)


【講 師】増井敏克さん
▲【講 師】増井敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』(以上、ソシム)がある。

ITエンジニアを取り巻く環境の変化

増井さんは、手始めに、いくつかの調査結果についてグラフを示してくれました。「世界のICT市場の推移」という調査では、今後もICT市場は右肩上がりで成長していくことが予測されています。ICT市場の成長は、IT人材の不足という切実な問題を生じます。IPAの「IT人材の“量”に対する過不足感」という調査では、IT人材が明らかに足りていないと感じている企業が年々増え続けています。

f:id:itstaffing:20180607124728j:plain
▲右肩上がりで成長するICT市場とIT人材不足。エンジニアは環境の変化に対応しなければ生き残れない

では、そうした人材をどう調達するか。案としては、社内で調達する(別部署から確保し新たなスキルを身に付けてもらう)、社外から調達する(中途採用)、外部に委託するという3つが挙げられます。面白いことに、ユーザー企業とIT企業では「社内調達」が40%以上を占め、ネット企業では「中途採用」が55%近くを占めています。

いずれにせよ、エンジニアが生き残るためには、新たなスキルを身に付け、環境の変化にいち早く対応していく必要があるのです。

ITエンジニアのキャリアと求められるスキル

では、どのようなスキルを身に付けていけば良いのでしょうか。増井さんは「時代が変わっても、変わらない知識を持っておくことが大切」と強調します。

これまでは、大企業における典型的なエンジニアのキャリアパスといえば、プログラマからSEへステップアップしていくというものでした。しかし、現在は役割も細分化・専門化され、必要な知識やスキルは大きく異なります。

f:id:itstaffing:20180607124731j:plain
▲これまでと違い、現在のキャリアパスは多様化している

IPAの調査でも、変化に不安を感じているエンジニアが半数前後を占めているという結果が出ています。そのため、新しい技術やスキル習得に自主的に取り組む必要があります。

一方で、企業の経営者が今後エンジニアに求めていくものとして「事業全体の技術を俯瞰し、全体を設計する能力」「ビジネスアイデア構想力」が挙げられています。

つまり、個々の技術よりも、経営者が求めているのは全体を見る能力だということ。特にビジネス目線は外せない要素となりつつあります。

ビジネス目線でITを考える

たとえば、Webで収益を上げるには、どうすれば良いでしょう? すでにいくつかのモデルがあります。たとえば、サービスの提供(サービス利用料を徴収する)、広告を入れる(広告収入)、Webと連動したWeb以外のサービスから得る、人と企業のマッチングを図る(人材紹介)などです。

f:id:itstaffing:20180607124735j:plain
▲マネタイズもエンジニアが考えていく時代へ

これからの時代は、どうやってマネタイズするかということも、エンジニアが考えていかなければなりません。

たとえば情報を収集するセンサーは、自動販売機、自動改札、POSレジなど、すでに私たちの暮らしのいたるところで利用されています。今年はビッグデータ利活用元年と言われており、そうしたセンサーで収集・蓄積されたデータの利活用が本格的に始まろうとしています。

「従来は課題を解決するために、新たな技術を生み出してきました。しかし、今はそうではありません。技術も一通り出そろっており、あとは、それらをどう組み合わせて課題を解決していくか――そんな発想が求められていきます」(増井さん)

f:id:itstaffing:20180607124744j:plain
▲課題解決のために技術を生み出すのではなく、これからは技術を組み合わせて課題を解決する

IT業界のトレンド

第1回の締めくくりは、今後注目すべきIT業界のトレンドについて紹介してくれました。

まずはAIです。「AIに関わらずにいられるのは、ここ10年ぐらい。今後は、必ず何らかの形で関わることになる」(増井さん)とのことでした。

AIを根本から学ぶには高度な数学の知識が必要ですが、実際には数学を知らなくても、Pythonがわかれば、豊富なライブラリを使って簡単にAIの応用システムを構築できるそうです。

f:id:itstaffing:20180607124748j:plain
▲Pythonと豊富なライブラリを使えば、たった10行で機械学習を実装できてしまう

次にIoTです。IoTは、すでにさまざまなところで活用されており、最近、各社がリリースしているスマートスピーカーもIoTの応用製品の一つです。では、IoTの基礎は、どうやって学べば良いのでしょうか。

増井さんのお勧めは超小型PC「Raspberry PI」です。各種センサーを接続してIoTの基礎を学ぶのに最適な製品だそうです。「数千円で購入できるので、仕事でIoTに携わる機会がないという人も、自宅で触れてみると良いでしょう」(増井さん)とのことでした。

f:id:itstaffing:20180607124753j:plain
▲Raspberry PIを手に「仕事でやっていないから」ではなく、まずは自分でやってみることが大切とアドバイス。

もう一つ、面白かったのが、こどものプログラミング教育の話。2020年に小学校でもプログラミング教育が開始されます。しかし「プログラミング」という教科が増えるのではなく、各教科に「プログラミング的思考を取り入れる」とのこと。算数なら、三角形を描く手順を、プログラミング的思考で考えさせるということです。まさに不変のITスキルだと感じました。ただし、現状では教えられる教員がいないという課題もあり、そこにも何らかの形でエンジニアの活躍の場がありそうです。

AIやIoTは、すでに実務でも使われ始めています。「知らない」「まだ早い」は通用しません。「まずは自分でやってみるべき」というのが増井さんのアドバイスでした。

AIもIoTも興味はあるものの、忙しさを理由に、なかなか手を付けられません。しかし、今回のセミナーを聞き、そんなことは言っていられません。まずはPythonをインストールするところから始めてみようと思いました。

【イベントレポート】ネットワーク機器の基本的な仕組みを理解しよう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。2018年4月12日に開催したのは、Geneさんによる、「ネットワーク機器」の基本を学ぶイベント。 近年ますます需要が高まるネットワークに関する知識を基本からじっくり解説しました。

■今回のポイントは

・ネットワーク機器の理解で押さえるべき「用途/役割」「転送範囲」「転送の仕組み」
・レイヤ2スイッチは「全体でひとつのネットワーク」
・ネットワークを相互接続するルータの仕組み
・レイヤ2スイッチとルータをあわせた「レイヤ3スイッチ」


【講 師】Geneさん
▲【講 師】Geneさん
2000年よりメールマガジン、Webサイト「ネットワークのおべんきょしませんか?」を開設。「ネットワーク技術をわかりやすく解説する」ことを目標に日々更新を続ける。2003年CCIE Routing & Switching取得。2003年8月独立し、ネットワーク技術に関するフリーのインストラクター、テクニカルライターとして活動中。

ネットワーク機器の理解で押さえるべき「用途/役割」「転送範囲」「転送の仕組み」

ネットワークを構成する基本的な機器は、「レイヤ2スイッチ」「ルータ」「レイヤ3スイッチ」の3種類があります。まず、これらの機器を理解するためには

・用途/役割
・データ転送範囲
・データ転送の仕組み

の3つのポイントを押さえることが大事だとGeneさんは言います。

f:id:itstaffing:20180522143456j:plain

普段データを送受信しているものといえば、PCやサーバなどを想像するかもしれませんが、通信の主体はアプリケーションです。主に、Webブラウザや電子メールなどのコミュニケーションツールを指します。

そのアプリケーションが動作するPCやサーバをつなぎ、データを転送する役割を持つのが、ネットワークです。アプリケーション間でデータを送受信するためには、階層ごとに通信経路を作っています。

「ネットワークは『誰に使わせるネットワークか?』という観点で分類されます。社内ネットワークなど、限られたユーザが使うプライベートネットワークや、いろんな会社や、個人ユーザのPCやサーバが繋がり、ユーザを限定しないインターネットがあります。これらはセキュリティをどの程度確保するかに応じて、考える必要があります」(Geneさん)

ネットワークを構成するものは、大きくわけて機器、ケーブルや電波などの伝送媒体、それらを接続して構成するリンクがあります。今回は、機器のなかでも、ルータやスイッチといったネットワーク機器を中心に解説します。

f:id:itstaffing:20180522143459j:plain

レイヤ2スイッチは「全体でひとつのネットワーク」

レイヤ2スイッチは「ひとつ」のイーサネットを利用したネットワークを構成するのが主な役割です。私たちが、普段ネットワークに接続するときの行動は、実際にはPCなどをレイヤ2スイッチに接続していることになります。

データを転送する範囲は同じネットワーク内であることがポイントだとGeneさんは言います。何台繋げても、全体でひとつのネットワークです。

また、転送する際に、判断に利用する情報をMACアドレスといいます。これは、LANのポートに最初から付帯するアドレスで、これでポートを特定します。

ここで、どのようにデータを転送しているか、下記の図を見てみましょう。まず、送信元AのMACアドレスをレイヤ2スイッチが記憶し、送り先Cに送ります。もし、送信先がわからない場合は、一旦全部の送信先に送られる、フラッディングという方法がとられますが、送信先が違った場合は5分程度で自動的に破棄されます。

転送は双方向に送ることができます。CからAに送る場合、送信元CがMACアドレスを記憶し、同様に送ります。何度も転送すると学習するので、次第に必要なところのみに送られるようになります。

f:id:itstaffing:20180522143502j:plain

レイヤ2スイッチで先ほど説明した、「ひとつのネットワーク」というのは、ルータやレイヤ3スイッチで区切られる範囲とも言えます。レイヤ2スイッチはイーサネットを利用した、ひとつのネットワークであることを押さえておきましょう。

ネットワークを相互接続するルータの仕組み

ネットワーク同士を相互接続するのが、ルータの役割です。データの転送範囲はネットワーク間やルータによるネットワーク間のデータの転送を行うルーティングになります。また、これらのデータを転送する上で判断に利用する情報はIPアドレスやルーティングテーブル です。

「ネットワークに接続する」ということは、電気信号など物理的な信号をやりとりする物理的な接続と、インタフェースにIPアドレスを設定する論理的な接続の2つを考える必要があります。単にネットワークに接続するだけであれば特に考える必要がありませんが、仕事として携わる場合は、理解していたほうがいいとGeneさんは言います。

IPアドレスは、ネットワークアドレスとホストアドレスの2つのパートから構成されます。注意するのは、この2つの区切りがわかりづらい点です。区切り方としては、A~Cのアドレスクラスというものがあります。しかし、ホストアドレスの数など、使用する上で無駄な面も多く、今ではクラスによらずに、サブネットマスクで、ネットワークアドレスとホストアドレスの区切りが明確化されています。

ここで、ルータによるネットワークの相互接続を確認しましょう。今回は、1つのルータで3つのインタフェースを持ち、2つのルータで5つのネットワークを接続する例を考えます。まずはルータ1ですが、インタフェース1を物理的に接続し、IPアドレスを設定することで、ネットワーク1と接続します。他も同様です。ルータはネットワーク間のデータの転送をするので、IPアドレスが異なるものでも、接続することができます。

f:id:itstaffing:20180522143505j:plain

ルータでは、データを転送することをルーティング、ルート情報を保持するデータベースのことをルーティングテーブルと呼びますが、ルーティングでは、どのようにルーティングテーブルを作成し、管理するかがとても重要です。ルーティングテーブルに登録するルート情報を登録するには、「直接接続」「スタティック」「ダイナミック」の3種類があり、これらを組み合わせていきます。

もしルーティングテーブルに登録されていないネットワーク宛てだと、データは破棄されます。レイヤ2スイッチの場合は、送信先がわからない場合は一旦送信しますが、ルータは、わからない場合は破棄します。データにはMACアドレスだけでなくIPアドレスも登録されます。

「障害発生時におけるルーティングテーブルのルート情報の切り替えや更新をすることを、コンバージェンスといいます。起動時や障害発生時に発生する作業のため、コンバージェンスにかかる時間は、できるだけ短く、正確にすることが求められます」(Geneさん)

f:id:itstaffing:20180522143509j:plain

ルーティングでは、ネットワーク上のすべてのルータが必要なルート情報をルーティングテーブルにひとつひとつ登録されていることが重要です。規模が大きくなればなるほど、この作業は難しくなります。インターネット上のルータのルーティングテーブルはだれでも見ることができます。ぜひ確認してみてください。

▼手順は以下のWebサイトにまとめています。
http://www.n-study.com/att_looking_glass/

レイヤ2スイッチとルータをあわせた「レイヤ3スイッチ」

レイヤ3スイッチを理解するために、先に少しだけVLANについて触れます。VLANとは、仮想(バーチャル)のLANのこと。レイヤ2スイッチでネットワークの分割をするのがVLANの役割です。

レイヤ2スイッチはひとつのネットワークをつくるものですが、それを2つ以上にわけたいときに使用します。VLANはスイッチの内部で作成するものなので、スイッチを仮想的に分割し、それぞれのVLANとポートがどのように繋がっているかをイメージすることが大切です。また、分割したネットワークは、実際には繋がっていないので、注意しましょう。

あわせて、ひとつのポートを複数に分割することができるトランクポートも押さえておきましょう。今回は詳しく触れませんが、一般的にはタグVLANとも言われます。

f:id:itstaffing:20180522143512j:plain

ようやくレイヤ3スイッチの説明に入っていきます。レイヤ3スイッチはレイヤ2スイッチとルータをあわせた機能を持ちます。VLANでわけたネットワークを、再び相互接続する役割を持っており、ルータよりも高速なネットワーク間の通信ができます。データの転送範囲も、ネットワーク内とネットワーク間です。

例えば、社内ネットワークをVLANで部署ごとにわけたとします。そのままでは、部署間の通信ができないので、レイヤ3スイッチを使って、相互接続します。

VLAN同士を繋ぐことはVLAN間ルーティングと呼ばれます。かつてはルータで行っていましたが、VLANで分割した数だけルータのインタフェースが必要になるため、拡張性に乏しくなります。レイヤ2スイッチの内部にルータの機能を統合したレイヤ3スイッチを使うと便利なのです。

f:id:itstaffing:20180522143515j:plain

レイヤ3スイッチでネットワークの相互接続をするには、IPアドレスの設定が重要です。 方法は2通りあります。内部に仮想的なインタフェース(SVI)を作成することで、IPアドレスの設定をする方法か、物理的なポート(ルーテッドポート)にIPアドレスを設定する方法です。

レイヤ3スイッチの例としては、ブロードバンドルータが挙げられます。皆さんが家庭でネットワークを接続する際は、レイヤ3スイッチを使って、ネットワークに接続していることになります。

f:id:itstaffing:20180522143518j:plain

今回は、ネットワークを理解するために、機器を中心に解説しました。普段ネットワークを利用する上では、仕組みまで理解する必要はありませんが、エンジニアの皆さんはじめ、何らかの形でネットワークに携わる方は、基礎知識を理解する必要があるでしょう。本イベントレポートを足掛かりに、学んでみてはいかがでしょうか。

 

【イベントレポート】派遣エンジニアとして働くために知っておくべき「スキル」とは?

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。3月28日に開催したのは、高橋裕之さんによる、リアル版『派遣エンジニアとして働くために知るべき「スキル」を理解する』イベント。“エンジニアスキルの全体像”を知っておくだけで、これからの行動が変わるはずです。

■今回のポイントは

・モチベーションとスキルの相関関係を知る
・ハードスキル、ソフトスキル、メタスキルの違いを知る
・固定思考と成長思考の違いを理解する

いくつかのワークを交えながら、スキルについて理解を深めていきました。これからの自分の行動にもよい影響があることでしょう。

【講 師】ウイングアーク1st株式会社 高橋裕之さん
▲【講 師】ウイングアーク1st株式会社 高橋裕之さん
ウイングアーク1st株式会社 技術本部SVF・SPA統括部 ソフトウェアエンジニアリング部 部長。ITエンジニアとして10社を超える現場、いくつものプロジェクトに参画。次第にIT業界の影に潜むプロセス、マネジメント、人間系の問題に気付き、日々その解決のために活動している。派生開発推進協議会(AFFORDD)役員。認定スクラムマスター(CSM)、認定スクラムプロダクトオーナー(CSPO)、認定スクラムプロフェッショナル(CSP)。

モチベーションとスキルには相関関係がある

高橋さんは、IT業界29年目。さまざまな企業や業種業態を経てきました。まず、その経緯をグラフにしたものをスライドに映します。アップダウンが激しく揺れ動いているグラフです。

「スキルのスタートから今までのモチベーションをグラフにしたものです。皆さんにもこういうグラフを書いてもらいます。スキルとモチベーションには、相関関係があると思っているからです」

高橋さんは、転職のタイミングや、結婚、子どもの誕生といったライフステージの変化、リーマンショックなどの社会環境の変化などをグラフにプロットしながら、モチベーションの変化を解説していきました。

その後、参加者にワークとして取り組んでもらいます。スキルのスタートを左端に、現在を右にして時間軸を置いたら、それ以外は比較的自由に書いてよいとのこと。モチベーションの高いとき、低いときにどんなことがあったのか、どんなイベントがモチベーションに影響を与えたかを書いてもらいました。さらには、書いたものを隣の人とシェアします。

f:id:itstaffing:20180510111157j:plain

「スキルを手に入れるときには、モチベーションが上がっている」と高橋さんは言います。スキルを手に入れているからモチベーションが上がっているのか、モチベーションがあるからスキルが手に入るのか、因果関係は定かでないにしろ、相関関係があるのは確かなようです。

エンジニアのスキルとは「ハードスキル」「ソフトスキル」「メタスキル」に分けられる

「エンジニアのスキル」とひとことで言っても、さまざまな種類があると高橋さんは説明します。大きく分けて「ハードスキル」「ソフトスキル」「メタスキル」の3種類。

それぞれの詳しい内容は、高橋さんのコラムで詳しく紹介されています。
https://www.r-staffing.co.jp/engineer/archive/category/高橋 裕之

f:id:itstaffing:20180510111200j:plain

ハードスキルには、書籍やインターネットなどで学べる「自習可能ハードスキル」と、特定の組織に入ることで得られる「組織固有ハードスキル」があります。求人要項で「◯◯の業務知識があると尚可」のように書かれたときは「組織固有ハードスキル」を指すことが多いようです。

ですが、あまり怯む必要はないと高橋さんは言います。なぜなら、もともと組織の中で身に着けるスキルのため、求人側は入社してから覚えてもらえば良いと考えているからです。

むしろ「入社後、ちゃんと勉強してくれるだろうか?」といった普段の学習意欲が問われるので「自習可能なハードスキル」を普段からどのように身に着けているか?が問われる事でしょう。

ソフトスキルはヒューマンスキルとも呼ばれます。そのひとつに「コミュニケーション」スキルがありますが、その仕組みを理解しているか否かでソフトスキルの伸びには差が生まれます。

送り手が「情報」「感情」「意思」「価値」を他人に伝える場合、コンテキスト(文脈)がきちんと合っていれば齟齬は発生しません。ところが現実のコミュニケーションでは情報の送り手/受け手の双方が、人生のなかで得た文化や知識、信念、哲学などを持っています。メールやチャットといったメディアに乗せて情報を送るとき、これらが邪魔をすることが多く必ずしも送り手の意図したメッセージが相手に意図通りに伝わるとは限りません。

このように、情報の伝達にはさまざまな処理が介在するため、もともと質が高いコミュニケーションとは難しいのです。如何に努力してコンテキストをお互いに合わせるか?が重要で、これをコミュニケーション・マネジメントと呼びます。コミュニケーションスキルを伸ばすためには、このような前提を知っておく必要があるのです。

f:id:itstaffing:20180510111203j:plain

ほかに、送り手の情報を非言語メッセージと共に読み取る手法「アクティブ・リスニング」や、価値観の違いによる摩擦や対立を解消する手法「コンフリクトマネジメント」と言ったスキルがあります。これらを学ぶことはソフトスキルの向上にとても有効でしょう。

メタスキルはすべての応用スキル

メタスキルとは、スキルを使いこなすスキルだと言えます。たとえば次のようなものです。

・問題の発見力
・問題の形成力(大局的に現象を把握し、仮説を組み立て対策する力)
・問題の解決力
・チームワーク力
・プロセス改善能力

メタスキル習得の大部分は、「自分の仕事経験」から身に付くと高橋さんは言います。よってメタスキルを得るための重要な鍵は、「自分の思考がどの様なマインドセットを持っているか?」です。

ここで、キャロル・S・ドウェック博士の、モチベーション分野での研究(*1)を紹介しました。マインドセットにより「固定思考の人」と「成長思考の人」を分け、比較したものです。それぞれのマインドセットは次のように説明できます。

・固定思考の人
人は生まれながらにして何かについて得意か不得意であり、その状態は変わらないと思っている

・成長思考の人
努力と練習によって能力は身につき、向上していくと考えている

*1 Carol Dweck, Mindset: The New Psychology of Success(New York: Ballantine Books, 2006).

f:id:itstaffing:20180510111206j:plain

メタスキルを伸ばすためには、成長思考のマインドセットが必要です。そのためには、次のような言葉を普段自分が発していないか注意したほうがいいそうです。

「それ、私の仕事じゃありません」
「私、その手のツール使ったことがないので」
「自分はこれまでもこうしてきたので」
「社員のAさんより、よっぽど私の方ができます」
「それ、やる意味あるんですか?」

このようなセリフは固定思考の現れです。成長思考の人は難しい問題を「学習の機会」としてとらえますので、当然新しいスキルや知識がアップしていきます。

メタスキルは、履歴書やレジュメで表現しにくいものの、仕事の現場で重宝されることは間違いありません。つねに成長思考のマインドセットを持ち、経験と実践を経てメタスキルを向上させるよう心掛けるとよいでしょう。

自らを成長思考にするため、パフォーマンス目標を作るワークを最後に行いました。アジャイル開発でよく使われる「ユーザーストーリー」を活用。次のようなテンプレートに記入していきます。

・今日の日付
・「(誰/役割)として(何を/アクション)したい。それは(なぜ/理由)のためだ」
・どうなれば目標に近づいたと言えるか(Acceptance Criteria:受け入れ基準)

次のような記入例が紹介されました。

『ITエンジニアとしてコミュニケーションスキルを身に着けたい。それはもっと職場の人と打ち解けていろいろと教えていただくためだ』
Acceptance Criteria:
f:id:itstaffing:20180510120827j:plain コミュニケーションに関する書籍を1冊完読する
f:id:itstaffing:20180510120827j:plain 打ち合わせでは必ず3回以上発言できている
f:id:itstaffing:20180510120827j:plain ほかの人から自然とアドバイスをもらえるようになっている

f:id:itstaffing:20180510111210j:plain

時間を取って、それぞれシートに記入してもらいました。それにより、それぞれの目標と理由、やるべきことが明らかになっているはずです。

自分のスキルを伝えるタイミングは転職や職場訪問など多々あります。来るべきときに備え、普段からスキルの棚卸しや、スキルを伸ばすための方法を知っておくとよいでしょう。