IT業界の新人さんに向けて(開発)

#はじめに
こちらのコンテンツの導入部はこちらです。
まだ読まれていない方は、はじめに、をご一読頂けますと幸いです。
[導入編](https://qiita.com/wakoit/items/7b60977f75d8e8b755b9)

#開発関連の内容
##開発の情勢と株式会社〇〇の現状
世の中ではWebが流行っています。
WebとWebをWeb APIという概念で接続し、各社のサービスが連携して動作する時代です。
Web開発がこれからもしばらくは優勢で推移していくでしょうし、今のところWebに取って代わる仕組みは世の中にはないと思います。
必然的にWebの重要度が増してきています。
Webの開発は、Web以外の開発と根本的に異なっており、考え方が全くと言っていいほど変わるものもあります。
この変革にみんなでついていきましょう。

株式会社〇〇の現状はWebサービスの開発も一部行ってはいますが、正直品質が良くありません。
今、決定的に不足していると感じるのは「スピード」です。
極端な話、バグを含んでいてもいいです。バグのないシステムを作り上げることは不可能です。
アイデアを形にする速度が足りていないと思います。
さらに、システムの応答速度、パフォーマンスという意味のスピードも足りていません。
失敗できる案件はゴリゴリ推し進め、満足できるスピードで開発が回るよう改善し続けていきましょう。

##様々な言語と株式会社〇〇で使用している言語
世の中には様々な言語があります。
VB、Java、C、PHP、Perl、Ruby、Python、Go…などなど。
それぞれの言語には向き/不向きがありますし、難易度もまちまちです。
世の中ではやっている言語は、「お手軽」な言語です。
「お手軽」な言語は総じて「遅い」のですが、インフラの進歩により遅くなくなってきました、というどころか、サーバーのスペックが余るレベルに達しています。
このため、速度は遅くてもいいから、お手軽な言語がはやっています。
この流れは今のところ覆らないのではないかと思います。

株式会社〇〇で使用している主な言語は以下になります。
VBA、VB.NET、bat(言語？)、VB Script、PowerShell…ぐらい？
あんまりはやりに乗っていません。
今後どうするかは好みの話も出てきますが、お手軽言語に乗り換えた方が良いんじゃないかなぁと思っています。

##スクリプト言語とインタープリタ言語
プログラミング言語を大きく二つに分けるとスクリプト言語とインタープリタ言語に分かれます。
違いを平たく言うと、コンパイルが要るか、要らないかです。

スクリプト言語はコンパイルが不要なので、お手軽に実行できますが、遅いです。

前述のとおり、こちらがはやっている言語です。
インタープリタ言語はコンパイルし、実行形式に変換(機械語に翻訳)しますので高速に動作します。
ですが、プログラム更新→コンパイル→実行の流れを踏まなければ動作の確認ができず、この辺りをコマンド化してもコンパイルに時間がかかったりと手軽さが損なわれます。

前述の言語をそれぞれに分けると以下のようになります。たぶん。

| スクリプト言語 | インタープリタ言語 |
|---------------|------------------|
|PHP | VB |
|Perl | Java |
|Ruby | C |
|Python | Go(こっち？よく知らない) |
|bat(この分類だとこっちかな？) | VBA |
|VB Script | VBA  |
|PowerShell | VB.NET |

並び順に意味はありません。

このほかにもオブジェクト指向だとか関数型だとかいろいろな区分がありますが、全部プログラミング言語だから、もうどうでもよくなってきました。
自分で気に入った言語が見つかると習得も早いので、色んなものに触れてみましょう。

##PowerShellでHello World
C言語でやろうか悩んだんですが、実行環境を準備する手間がPowerShellだと無いに等しいので、PowerShellで！
スクリプト言語の手軽さを感じてみましょう
デスクトップにメモ帳などで適当な空ファイルを作成し、ファイル名を「test.ps1」に変更します。
空ファイルの中に以下を記載し、上書き保存します。

```powershell:test.ps1
 'Hello, World!!'
```

次に、コマンドプロンプトを起動し、先ほどのファイルが保存されているフォルダーに移動(cd)し、test.ps1をPowerShellで実行します。

```cmd:test.ps1を実行
 cd desktop
 powershell .\test.ps1
```

コマンドプロンプトにHello,World!!と表示されたと思います。
お手軽ですね。すばらしい。

##PowerShellで感じるデータ構造
プログラムを作成していく中で、「データの持たせ方」に悩むことがあります。
これをPowerShellで少し体験してもらおうと思います。

例えば、各種フルーツとそのイメージカラーをデータで表現しようとしたとき、以下のように表現したとします。

```powershell:フルーツ
 $fruits = @(
   @( "りんご",    "赤" ),
   @( "オレンジ", "橙" ),
   @( "バナナ",    "黄" )
 )
```

変数fruitsから、りんごの色を取り出そうとすると、以下のようにアクセスすることになります。

```
 $fruits[0][1]
```

ここで、おや？と思ってください。
この例ですと、りんごの色を取り出したいのに、取り出そうとするときのアクセス方法は、りんご感が全くありません。
これ結構プログラムを作るうえでめんどくさかったりします。

このような場合にどういうデータ構造にするかというと、以下のようになります。

```powershell:りんごっぽい
 $fruits = @{
   "りんご" = "赤",
   "オレンジ" = "橙",
   "バナナ" = "黄"
 }
```

この場合に、変数fruitsから、りんごの色を取り出そうとすると、以下のようにアクセスすることになります。

```powershell:りんごの取り出し
 $fruits["りんご"]
```

先ほどの例より、だいぶりんご感が出てきました。
でも色感がありません…。
おれはりんごの色にアクセスしている感が欲しいんだよ！という場合は以下のような感じでしょうか…。

```powershell:フルーツの色
 $fruits = @{
   "りんご" = @{ "色" = "赤" },
   "オレンジ" = @{ "色" = "橙" },
   "バナナ" = @{ "色" = "黄" }
 }
```

いよいよやばくなってきましたね。
でもアクセスするときはりんごの色感がすごい出てます！すごい！

```powershell:りんごの色
 $fruits["りんご"]["色"]
```

でもでも、待ってこれって…色んな情報持てるんじゃないの！？！？

```powershell:フルーツのいろんな色
 $fruits = @{
   "りんご" = @{ "色" = "赤"; "中身の色" = "うっすーい黄色か何か" },
   "オレンジ" = @{ "色" = "橙"; "中身の色" = "橙" },
   "バナナ" = @{ "色" = "黄"; "中身の色" = "白" }
 }
```

色以外の情報も持てちゃった…。

```powershell:りんごの中身の色
 $fruits["りんご"]["中身の色"]
```

さてさて、開発経験者であれば、このだいぶ前に気づいていると思いますが、これクラス化しちゃった方がいいよね…。
PowerShellでやってみましょう！

```powershell:FruitClass
 Class fruit {
   $name
   $color
   $inner_color
 }

 $apple = [fruit]::new
 $apple.name = "りんご"
 $apple.color = "赤"
 $apple.inner_color = "うっすーい黄色"
```

なんかまだまだ発展途上のようで、色々とよくわからない…。
Class句もPowershell 5.0で増えたらしく、publicでしか定義できないとかいろいろと問題があるらしい。

```powershell:もはやりんご
 $apple
```

オブジェクト指向とか難しいし、もういいや。
と、言いつつ、そういえば、オブジェクト指向って言いながらもObjectを使っていませんでした。結果、Classを使うのと一緒ですけど。

```powershell:AppleObject
 $properties = @{
   'inner_color' = 'うっすーい黄色',
   'color' = '赤'
 }
 $apple # New-Object –TypeName PSObject –Prop $properties
```

このオブジェクトを配列化して使えば、いろいろと便利そうですね。

```powershell:完全にりんご
 $apple.color
```

完全なオブジェクト指向でもないみたいなので、色々と妥協する必要があるんですかね。

##VB系言語でHello World
スクリプト言語以外で何かやってみようと思ったんですけど…。
VisualStudioでVB.NET使ってHello Worldする例が世の中に溢れすぎているのと、画面で説明すると画像をいっぱい入れないといけないのでやめます。
すみません。

VisualStudioを使いこなしたことはないのですが、かなり優れた開発環境なので、ぜひ一度ふれてみてください。
株式会社〇〇では、WebシステムでVB.NETとVisualStudioを使用しています。

レガシーなC言語なんかを開発環境なしで使うと、真っ白で右上に最小化、最大化、閉じるのボタンのあるウィンドウを作るだけで50～100行ぐらいプログラムを書かないといけません。
VB系はMicrosoftが作っているだけあってGUIに非常に強いです。
50行ぐらい書かないといけないウィンドウの作成がドラッグ&ドロップと数クリックであっという間にできてしまいます。

##今後の株式会社〇〇の動向
Webシステムの老朽化に伴い、これらのWebシステムを0から作り直す必要が出ています。
株式会社〇〇で課題となっている開発の問題は以下になります。

- 言語仕様に縛られてやろうとしていることができない
- 言語が古く、Webの先進的な仕組みを導入できていない
- バージョン管理方法がアナログ
- リリース方法もアナログ
- データベースのパフォーマンスを考慮せず実装しているため遅い
- 開発スピードが遅い
- スピードを優先するためにセキュリティなんて意識していない
- スピードを優先するため検証(validation)も意識していなかったり

平たく言うと全面見直しが必要です。
今後、様々なサービスを実装していく必要があると思います。
社外に信頼できる開発会社を構えてもいいですが、自分たちの未来のためにも開発に向き合い続けたほうが良いと考えています。

#情報セキュリティ関連の内容
##情報セキュリティって？
情報セキュリティが何か、説明できる方はいますか？
経験上、あまり見たことがありません。
「セキュリティは…あれだよ…大事な奴だよ」とか「セキュリティは情報が漏えいしないようにするやつだよ」とか。そんなのばっかりです。

そこで便利なのが資格試験で出てくる情報セキュリティの定義です。
なるほどな。という内容なのでふんわりと理解しましょう。
以下、ググった内容のコピペです。訴えないで！

- 機密性の確保

情報資産を正当な権利を持った人だけが使用できる状態にしておくこと。
情報漏えい防止、アクセス権の設定などの対策。

- 完全性の確保

情報資産が正当な権利を持たない人により変更されていないことを確実にしておくこと。
改ざん防止、検出などの対策。

- 可用性の確保

情報資産を必要なときに使用できること。
電源対策、システムの二重化などの対策。

##情報セキュリティを取り巻く環境
情報セキュリティを大事にしましょう、ということは数年前から、ずーっと言われていることですが、さらに加速してきている感があります。
それはおそらく以下のような状況が後押ししているからだと思います。

- 攻撃者が進化した
- 守る側の知識・人数が足りない

これまで、「開発」「インフラ」と分けて説明してきましたが、情報セキュリティはその両方ともに影響を与えるものです。
インフラの情報セキュリティが堅牢であっても、開発の情報セキュリティが甘ければ攻撃を受けてしまいます。
同様に、逆もあり得ます。

どんなものでもそうであるように、情報セキュリティにも「完璧」はあり得ません。
自分が作成したシステムの情報セキュリティが完璧だと思った時点で、もういずれは突破されてしまうものとなるでしょう。

##情報セキュリティの情勢と株式会社〇〇の現状
経営計画として情報セキュリティの強化が発表されました。
過去に個人情報漏えい事故を起こしています。
この時私はそれなりに大変な目にあいました…かね…。

そこから数年経過した状態での情報セキュリティ強化、これが今の現状をよく表しています。
何が言いたいかというと、痛い目に遭い、そこから数年後にようやくやばいよね、と感じたということです。
これは個人情報を提供する側からするとあり得ないでしょうね…。

どこの会社も似たようなものだと思いますが、株式会社〇〇にも情報セキュリティの専門家はいません。
いません…。
自分たちでリスクを理解し、対策を施していく必要があるということです。

##インフラの情報セキュリティ
インフラの情報セキュリティとは具体的にどんなものがあるのでしょうか。
一番手前の予備行動として、ポートスキャンが行われることが多いと言われています。

- ポートスキャンとは？

今回の研修では内容が深くなりすぎるために端折っていますが、ネットワークを使用して通信するためには、IPアドレスとポート番号が必要となります。
このポート番号は、そのサーバーで何のサービスが稼働しているかの判断材料として使うことができ、何番のポート番号が接続に使用できる状態か、を調べることをポートスキャンといいます。

攻撃をしたことがないので素人的な発言になるのですが、以下の流れの攻撃が最も標準的な攻撃なのではないでしょうか。
- ポートスキャンする
- ポートスキャンした結果から、サーバーが提供しているサービスを特定する
- サービスを提供するソフトウェアを調べる
- ソフトウェアの既知の脆弱性や既知のバグを使用し、攻撃する
- パッチなどをあてて対策が行われていない脆弱性などをうまくつけた場合、攻撃に成功する

攻撃されている現場をつぶさに目撃したわけではないので、詳しいことは全く分かりませんが、こうしているうちにも常に攻撃を受け続けているのだと思います。

その他にも、サービスの起動ユーザーを専用のユーザーにすることは、Linuxサーバーでは標準で行われる情報セキュリティ対策の基本です。
例えば、Webサービスを提供するWebサーバーで有名なApacheは、標準でapacheユーザーでhttpプロセスを起動するようになっています。
これは万が一、Apacheの脆弱性を使用して攻撃を受け、任意のコマンドを実行できる状態とされてしまっても、apacheユーザーの権限でしかコマンドを実行できないよう、制限をかけるためです。
apacheユーザーの権限を最小に抑えておけば、乗っ取られたところでWebサービスの停止程度で済み、被害を最小限に抑えることができるかもしれません。

そのほかにも、さまざまな「当たり前」があり、google先生に聞けばいろいろと教えてくれます。
Webサーバーを立ち上げたりして、「サーバーの要塞化」について調べれば、いろいろな世界を感じることができると思います。

インフラの管理者などは強い権限を持っていることが多く、この権限を悪用した内部犯行がかなりの割合を占めるそうです。
この辺りはどうしてもモラルの問題が出てくるのですが、ICTGから攻撃者が出るような事態は避けたいです。
たとえシステムに「弱さ」を見つけたとしても、「弱さを補強しようとする」人間であってください。

##開発の情報セキュリティ
開発のセキュリティはほぼほぼインジェクション対策だと思います。
SQLインジェクション、コマンドインジェクションなどなど。
特別な意味を持つ記号をきちんとエスケープする、なかなか難しいですが、フレームワークなどの力を借りて、楽に実現できるといいですね。
クッキーポイズニングなんかも、クッキーのインジェクションという風に捉えることもできると思います。

マルウェアのリバースエンジニアリングなんかも、一応開発の領分になるんでしょうか。
一度、経験してみたいですよね。マルウェアの分析。

開発の経験が浅いので、あまり言えることがなくて申し訳ないのですが、「インジェクションを防ぐ」ことを意識するだけでもだいぶ違うんだろうと思います。

##攻撃者にならない
攻撃を受けて情報セキュリティ事故などが発生した場合、被害者が加害者となってしまうことは皆さん承知していると思います。
ですが、忘れてはいけないことは攻撃者が最大の悪であるということです。
攻撃者がいなければ情報セキュリティなんて気にしなくていいですし、みんなもっと生産的なことに頭や能力を使うことができるようになります。

つらいことがあって、悪いことを考えてしまったとしても、手を染めてしまう前に誰かに相談してください。
聞いてくれる誰かを持ちましょう。
いない人は私が聞きます。

世の中には力(権限、武器などなど)を得た途端に態度が大きくなってしまったりする人がいます。
それは、「力がすごい」のであって、「その人がすごい」わけではありません。
そんな風に言われないよう、常に変わらない対応を心掛ける必要があります。…難しいですが。

##今後の株式会社〇〇の動向
マルウェアの感染を防ぐことは不可能だと言われています。
マルウェアの感染を防ぐのではなく、マルウェアに感染してもリカバリができ、データを持ち出させないようにする仕組みを作らなければいけません。
簡単なことではありませんし、現在の状況が脆弱すぎてやることばかりが山積している状態です。

自分たちにできるところから、少しずつ改善していきましょう。

#株式会社〇〇独自の内容
##管理部門であることの理解と役割の理解
いろいろとIT技術について書いてきましたが、株式会社〇〇はIT企業ではありません。
ここでは、「管理」という部署に所属しているという事について触れていきます。

ITを生業にするグループとはいえ、管理本部という部署に所属しています。
ですので、代表電話に出たり、荷受けをしたり…、他グループが困っていると感じたら、手伝ってください。
グループは違えど、同じ組織に所属しています。
全体から言えば、株式会社〇〇に所属しているので、全部署助ける必要があります。
ですが、「管理」が一番近い存在ですので、ほかのグループよりも優先して考えるようにしてください。
身内を売るようなことはやめましょう。

たとえ、迷惑をかけることとなったとしても、まず自組織から。
ITだけではできないことは管理部で、管理部だけではできないことは全体で、というように、近い存在から迷惑をかけましょう。

わからないことは、どんどん聞きましょう。
できないことは、誰かに教えてもらいましょう。
先輩方が忙しいかどうかを決めるのは、あなたではありません。
「忙しそうだったから…」はやめましょう。
忙しそうで申し訳ないな、と思うのであれば、少しでも早く自身で巻き取れる範囲を広げましょう。
そのためにもガンガン質問しましょう。

##IT業界以外で働くということ
一般企業では、IT業界ではありえないような文化があります。
IT業界からすると、無駄であることを美徳として大事にする文化があります。

IT系の技術に対して理解がなかったり、IT = お金がっぽり、IT = あっという間にちゃちゃっと簡単、みたいなイメージがあります。
ドラマとかで若くしてお金持ちのキャラクターって大体IT企業の社長とかですしね…。
そのイメージが世の中に根強く残っており、このイメージのために心無い言葉を受けることもあると思います。

IT業界ですら心無い言葉を受けることがあるのに、文化が違うんですから、それより多くつらいことがあると思います。
グループ内で相談してください。
みんな親身に聞いてくれると思います。