2年ぐらい前にIT系学生になってから今までのシステム作りでの猛省点

# イントロ
この記事はOIC ITCreate Club Advent Calendar 2016 22日目の記事です。

http://www.adventar.org/calendars/1484

お疲れ様です。がっちゃんこと古賀です。
どこぞの羽生えた赤ちゃんみたいにｸﾋﾟﾎﾟｰ！って言ったり家食べちゃったりはしないです。
平仮名でがっちゃんです。

はい、行数稼ぎの自己紹介もこれぐらいにして本題に入って行きましょう。(3回目)

割と今回はポエム的要素が強めだと思います。

###【ここ以降 ポエム的要素が多分に含まれます。そういったものを読むためにQiitaを読んでいない方はブラウザバックを推奨します】

# まずは自分のことについてちょっと紹介

私のIT系（プログラマ）の勉強を始めたのは2014年のちょうどこのぐらいの時期だったと思います。

専門学校に入ることにしたので、早くから勉強しようと思って HTML/CSS の勉強と Java でゲームを作るために http://www.gamecradle.net/document/main/content/doki/introduction.html このサイトを参考に勉強をしていました。

そこから丸2年ほど経って、これまでにいろんな作品やプロダクトに関わって色々ソースコードとかを書いてきたのですが、今まででぶち当たった壁は数知れず。

でも、その経験を忘れてしまったら自分でももったいないと思うし、 ITCreateClub ( http://itc.moe ) の後輩たちも同じような壁にぶち当たった時の糧になってくれればと思うので、つらつらと書いていきたいと思います。

# 初めて PHP で作ったお問い合わせフォーム

当時 1年生の12月ぐらい…？に同じクラスでインフラ系が超好きな謎のクラスメートに、持っているサーバに乗せるお問い合わせフォームが欲しくて、PHPを使って作って欲しいと依頼されました。
PHPは使ったこともなく、大したWebの知識もなかったのですが、技術力を着けるためと思って快諾。実装が始まりました。

## 問題1 そもそもまともな HTML が書けない

Webサイトで独学で勉強をしていただけなので、それぞれの**タグの意味は知っているけど、どう使うのかがわからない** ということに陥って、後々見返すとひっどいマークアップをしていました。

```html
<form>
  <div> <!--　←この div なんやねん。なんでも囲ったらええってもんやないぞ-->
    <label for="name">名前</label>
    <input name="name" type="text" />
  </div>
  <div>
    <!-- 省略 -->
  </div>
</form>    
```

ここから学んだのは、基礎的なこと（タグや構文の意味の勉強）は独学でもなんとかなるけど、それが**どう使われるか、どう使うのが一般的なのか？**は、独学でやるよりも先人に教えてもらいながらやるほうが、プログラミングで大事な「**相手が見てもきちんと読むことが出来るソースコードを書く力**」などが身につくということがよぉくわかりました。

## 問題2 コピペ実装しても動かない
PHPを使ったことをないので、Webサイトで調べながら実装をしていました。
そのプロダクトには メール送信機能やPHPからクッキーを操作する機能だったり、JSでユーザエージェント情報取得して貼り付けてあげる必要があったりと、いろんな機能を盛り込む必要があって、当時の自分の技術力を超えたことをやらないといけなかったのです。

そのため、Webサイトで公開されているソースコードを拾ってきて実装したりもいろいろやってました…ｗ

でも、それで何が困ったかと言うと、**コピペ実装でも動かない**ことがあるということです。
そのソースコードが間違っている場合もあるし、バージョンの差異によって動かなかったり、周りの環境が整っていないので動かなかったり、いろいろな要因で動かないのです。

その実装を理解せずに使うコピペ実装だと、ただただ動かないという事実しか受け止めることができず、それを修正する方法がわからないので、別のソース元を探すということしかできなくなります。

最終的に使うことができたソースコード：

```php
// SMTPサーバー設定
    // Gmailの場合は「安全性の低いアプリのアクセス」の許可が必要
    // https://www.google.com/settings/security/lesssecureapps
    $mail->isSMTP(); // SMTP利用宣言
    $mail->Host = 'smtp.gmail.com';  // SMTPサーバー
    $mail->SMTPAuth = true;  // SMTPユーザー認証の有無
    $mail->Username = SEND_ACCOUNT; // SMTPアカウント
    $mail->Password = SEND_PASSWORD;    // SMTPパスワード
    $mail->SMTPSecure = 'ssl';   // SMTPプロトコル(SSLまたはTLS)
    $mail->Port = 465;   // SMTPポート番号(SSL:465, TLS:587)

    // メール内容設定
    $mail->CharSet = "UTF-8";    // 文字セット(デフォルトは'ISO-8859-1')
    $mail->Encoding = "base64";  // エンコーディング(デフォルトは'8bit')
    $mail->setFrom(SEND_ACCOUNT, 'お問い合わせフォーム');   // 差出元
    $mail->addAddress(TO_ADDRESS, '送信先');  // 宛先
    $mail->Subject = $subject; // メール件名
    $mail->Body  = $content; // メール本文
    $mail->AddAttachment($_COOKIE['file']);   // 添付ファイル
```

これぐらい自然言語でコメントがあると何とか使うことが出来るのですが、そうでない場合、まるごと使ってみて動かないということしかわからなくなります。

コピペ実装のことで学んだのは、コピペ実装は1機能まるごとしてしまうと、自分の力で何とかできないので、**使うとしても小さな部分（文字列の簡単なバリデーション処理など）だけにとどめておくほうが良い**ということです。

# jQuery と CSS で制作を手伝ったブラウザゲーム

ロジックというよりもデザイン関係で関わった作品で、HTMLの構造づくりや jQuery/CSS を使ってアニメーションさせたり、する部分が印象に残ってる作品です。

## 問題1: 計画時に壮大な夢を語りすぎた

とあるイベントで展示するために作った作品で、計画時にはたくさんの機能（複数のパターンでゲームが出来るなどなど）を付ける予定で、楽しいゲームをつくうとしていました。

しかし、技術力が伴っておらず、**１つの機能の実装にかなり時間がかかってしまいました**。

そのため、たくさんの**やりたいと思っていた機能はほとんど実装することができず**、締切日になってしまったので、かなりの後悔が残っています…。

このことから学んだのは、 プロダクトの**機能の優先度を最初に決めておいて実装することの大切さ**です。
優先度をなんとなく口頭で決めていただけだったので、実装に時間がかかって時間がないという状況に陥った時に、あわててコーディングしながら決めることになってしまったので、もったいないことをしたなーとすごく思います。
なので、1時間ぐらいで決めちゃっていいので、**優先度を簡単にスプレッドシートに（チームで開発する場合も）記録しておくこと**はめっちゃ重要です

# システム開発演習という授業でのチーム開発
私の通っている学校 (大阪情報コンピュータ専門学校)では、2年次後期から5〜8人まででチームを組んで、**実際の業務を想定**（笑）したシステム開発を行います。

そこで私達はWebサービスを作ることにし、チームの中でフロント処理を実装するチームとサーバ処理を実装するチームの２つに分けて作業を行っていました。

で、そこでの問題が一番大きかったです。

## 問題1: 分業したのはいいけど、疎結合のための設計がうまくできていなかった

上で話したように、チーム作業を分業して実装するようにしたのですが、**分業に適した設計**を作る経験がなかったため、なんとなくの設計でなんとなくのドキュメント起こしだけで実装に入ってしまったのは大きな問題点だったなと思いました。

これから学んだのは、分業で実装する場合、**最低限分業したチームがお互いに疑問点がない状態にまで設計しておく必要がある**ということです。
当然、実装中に疑問点も出てくるかとは思いますが、そこを解決するためにもきちんと基本思想は定義して、ドキュメントに起こしておく必要があると思います。

## 問題2: 初期に言っていたことが思い出せない

これは問題1 と関連があるのですが、分業をしたり、チームでプロダクトを作ると、どうしても口頭でのコミュニケーションが生まれると思います。
口頭でのコミュニケーションは素早く情報共有と意思疎通が出来て、とても効率の良いコミュニケーション方法の１つです。
しかし、人間の脳は話したことを事細かに全て覚えていることは非常に難しいので、**必ず口頭だけでした話というものは忘れてしまいます**。

それを解決するために、きちんと議事録や書いた図などの写真は残しておく必要があります。

私達のチームでは、最初のうちにフロントチーム・サーバーチーム関係なく全員でシステムの要件をホワイトボードなどを使って口頭で定義していたのですが、それの議事録をあまりきっちりと残しておらず、

後々、実装時に「これってこうやっけ？」「そんなことを言うてたような気がする…」

のような会話が多発するようになってしまいました。

このことから学んだのは、本当に**ドキュメントって大事。設計って大事。**ということだけです。
みなさんも設計したものはきちんと見える化しておきましょう。本当に後で辛くなりますよ。

# まとめ

以上、いろいろつらつらと書いていたのですが、、、思い出せば思い出すほど、まだまだ出てきそうで途中で思い出すのを辞めたくなりましたｗ

まだまだ反省点だったり、これはやっておいてよかったなということはいろいろあるので、こういう記事ではなく、LTだったり飲み会の話であったりで話そうと思いますｗ

で、近々参加するLT大会でもそんな話しようかなーと思ってます！

## LT 参加のお知らせ！

https://connpass.com/event/46806/

じゅんじゅん( https://twitter.com/konojunya )に教えてもらって参加するのですが、関西の学生エンジニア限定、学校対抗のLT大会になっているので、他大学・他専門学校の人との交流もできてめちゃめちゃ楽しい大会になると思います…！

見学枠もまだまだあるので（2016/12/22現在）ぜひ見に来てください！よろしくお願いします！


ではでは、ポエムと自分の宣伝を最後まで読んで下さり、ありがとうございました！
良いお年を！！