プログラマー/SEをめざす方へ

##なんでこんな記事を作ったのか
未経験からプログラマーになってみたい人向けに、伝えることを整理したかった。
新人教育用資料としての位置づけで内容をまとめている。

自分が業務系SEとして仕事をしたり、趣味で開発をしてきた経験を基にしているため、
業界全体に当てはまる話ではなく、私見も含まれている点に注意していただきたい。

これからプログラマー、またはSEになりたい人にとって、何らかの指針になれば幸いである。

## はじめに
はじめに、自身に問いかけてもらいたい。
どうしてプログラマーになろうと思ったのか。
どんなプログラムを書きたいのか。
将来はどんな技術者になりたいのか。

プログラムが好きだから？
リーダーやマネージャーになって、顧客が喜ぶ顔が見たい？
単純にお金を稼ぎたい？
趣味でゲームを作りたい？

もちろん理由はなんでもよいが、目的を決めておくことは大事である。
高校野球で例えるならば、甲子園出場を目的とするから、毎日部活で練習し、家に帰ってから自主練習もする。
友達と草野球でただ楽しみたいだけならば、毎日練習しなくともよいだろう。

技術者としてどのようなキャリアパスを描くのか、どうなりたいのかによって、必要な努力量も方向性も変わる。

以下はあくまでも一例に過ぎないが、何かしら目的を決めておくとよいだろう。

## 方向性の例
・ゲームやモバイルアプリを作ったり、技術を極めたい！

・プログラムは好き、でもリーダーはしたくない！

・リーダーやマネージャーもしたい！

・他にやりたいことがあるので、仕事と割り切ってやる！

## ３つの大事なこと
###１：継続して開発する
筋トレもダイエットも、継続するから結果が出る。
スポーツでプロの世界を目指すなら、部活の練習だけで終わりとはせず、
家に帰ってから自主練習をする人が結果を作る。
プログラマーの世界も一緒だ。

プログラミングの力を付けようと思うのなら、家に帰ってからも何かしら作ってみる。
作るものはなんでもよい。
仕事の時間だけで一人前になるには、相当な時間がかかるだろう。
もちろんこれは、どんな仕事でも同じである。
仕事に自分のスキルを合わせていくものだ。

「忙しい」「時間がない」「他にやることがある」などと口にするのは簡単だ。
しかし、時間は誰かが用意してくれるものでも、偶然できるものでもない。
自分で作り出すものである。

###２：一つ以上得意分野を作る
特定のプログラム言語かもしれないし
テストの技術、DBの技術、数学、何かの技術分野かもしれない。
はたまた、コミュニケーション能力や英語を読む技術、仕事の速さかもしれない。

人間は完璧ではないから、もちろん苦手分野もある。
その分、得意分野で勝負すればよい。
自分の苦手分野を、逆に長所とする人がフォローしてくれるだろう。
次は自分がフォローする側に回ると良い。

###３：プログラムが学べる環境に自分から足を運ぶ
学校に行けば勉強をするし、部活の練習がきつくても、
苦楽をともにする仲間がいると耐えらえるものだ。

世の中には独学で学べる書籍もあれば、オンライン講座もある。
あなたが自分一人でやり切れる人ならもちろんよいが、できれば誰か相談できる人を決めてやるとよい。
職場の尊敬できる上司や先輩かもしれないし、同僚かもしれない。
会社の枠を飛び出した、外の世界のエンジニアかもしれない。

できればオンラインだけではなく、オフラインでもつながりがあるとよいだろう。
世の中にはもくもく会や、勉強会、様々な形態のエンジニアのコミュニティが存在する。
自分より高い技術を持ったエンジニアと触れ続けることが、自己の成長につながる。

##お勧めの読み物
今プログラマーである人も、これからプログラマーを目指す人も。

###最初の心構え
[社会人になってからプログラムを始める人へ](https://qiita.com/n_slender/items/4d97744e572a1823e2f1)

###仕事の考え方
[プログラマの心の健康](http://www.hyuki.com/kokoro/)

[教えてクン養成マニュアル](http://www.redout.net/data/osietekun.html)

[ハッカーになろう](https://cruel.org/freeware/hacker.html)

###プログラマーになったら
[なぜ訓練と勉強を間違えるエンジニアが多いのか](https://qiita.com/ymasaoka/items/df226e39356b047c4b35)

[初めまして、単体テスト](https://qiita.com/mikimaromomose/items/ef12e3823d81bf537c10)

[エラーメッセージの読み方と対処, 検索や質問の原則](https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5)

[新米エンジニア(アプリ・インフラエンジニア問わず)に知っておいてほしいトラブルシューティング入門 はじめの一歩編](https://qiita.com/keigodasu/items/a9af6512bf0ae942ca9f)

##システム開発の流れ
どこの職場に行っても、だいたいやることは同じである。
それぞれいつまでに何をやらないといけないのかは決まっていることが多いので
以下の流れで仕事が動いている、ということを大まかに理解しておくとよい。

１：要件定義
２：基本設計
３：詳細設計
４：コーディング
５：単体テスト
６：結合テスト
７：システムテスト

参考文献[SDEM](https://www.fujitsu.com/downloads/JP/archive/imgjp/jmag/vol63-2/paper15.pdf)
※職場を統括する元請のベンダーによって、各開発工程の名称や略称、分割単位は異なるので頭の隅に置いておくこと。

##職場で求められるスキル
###１：データベース(DB)の知識
作ったシステムで、データを保存したいとする。
それは注文データかもしれないし、クレーム対応の電話履歴かもしれない。
こういったデータは、データベースという専用のシステムで保存する。
[Oracle](https://www.oracle.com/jp/index.html)、[MySQL](https://www.mysql.com/jp/products/community/)、[PostgreSQL](https://lets.postgresql.jp/map/intro)など様々な種類があるが、
基礎となる考え方は同じなので好きなものを一つ選んで勉強するとよい。

DBに接続してデータを確認する方法、
データの登録(Create)、登録(Read)、更新(Update)、削除(Delete)のやり方は最低限抑えておくべきである。

###２：プログラミングの知識
職場に入ると、最初は既存システムの調査を依頼される事が多い。
ここで、プログラムのソースコードを読み、仕様を理解する技術が求められる。
職場によって使われる言語は違うが、どれか一言語で基礎を抑えると
あとは細かな仕様や文法の違いなので応用が利く。
※もちろん、新機能もあるので、相応の学習コストが必要である。

また、言語とセットで覚えておきたいのが[フレームワーク](https://www.otsuka-shokai.co.jp/words/framework.html)である。
職場では何かしらのフレームワークが導入されており、
何もないところからプログラムを書くことは少ない。
※中にはフレームワークを一切使用していないシステムも存在するが。

有名どころについては事前に学習しておくと仕事に入りやすい。

大手ベンダーから出てくる案件は[Java、VB.Net](https://min-ten.com/guide/guide_2186/)が多い。
すぐに仕事を受けたいのならば、どちらかを選ぶとよいだろう。
・[Java](https://adoptopenjdk.net/) + [Spring Framework](https://spring.io/)
・[VB.Net](https://docs.microsoft.com/en-us/visualstudio/get-started/visual-basic/?view=vs-2019) + [.NET Framework](https://docs.microsoft.com/ja-jp/dotnet/framework/)
※[PHP](https://www.php.net/manual/ja/intro-whatis.php)も案件が多いが、自分に経験がないため、詳しく知りたい方は他の記事を参照して頂きたい。

また、各言語に適した開発環境が存在する。
Javaを使うなら[Eclipse](http://mergedoc.osdn.jp/)を、VB.Netを使うなら[VisualStudio](https://visualstudio.microsoft.com/ja/vs/)の使い方に慣れておくとよい。

###３：Excelの知識
設計書や資料はたいていExcelで作成されているものである。
データの入力、レイアウト設定、書式設定など、体裁を整えるためのスキルが求められる。
入力規則、データの並び替え、オートフィルタ、条件付き書式が扱えるとベストである。
ピボットテーブルやVBAマクロが扱えるとなおよい。

Excelを持っていないなら、LibreOfficeやWPSなどの互換ソフトでもよい。

###４：ソースコードの管理
一度作ったソースコードや設計書は、修正され、随時更新される。
後になって追加した機能に不具合が発覚して、過去のバージョンに戻す場合もある。
設計書も、変更前と変更後でどう変化したのかを追跡する事がある。
バージョン管理システムを扱えるよう、事前に学習しておくとよい。

職場では[SVN](https://tortoisesvn.net/)または[Git](https://git-scm.com/)どちらかのバージョン管理システムが使われていることが多い。

資料の追加、コミット、比較、履歴の確認、差分確認、
バージョンを過去に戻す、マージの主要機能について理解しておこう。

###５：相談する力
解らないことがあれば、職場のリーダーや同僚にすぐ相談するとよい。
15分考えてわからないことは、人に聞いたら解決することが大半である。
このとき、大事なのは教えて貰ったことをしっかりとメモする事。
いずれ、自分が教える側となる。

また、納得がいかないことや、理解できないことについては
わかったふりをせず素直に質問するとよい。
自分の意見をきっちりと伝えることが評価につながる。
もちろん、すべての意見が採用されるとは限らないので、意見が通らなくても不貞腐れない事。
引き際が肝要である。

## Do
なにから手を付ければよいか？
これは相談できる人と話して決めるのが一番だが、一例として紹介する。

###１：PCを買う
まずPCがないと自主練習ができない。
職場に時間外で残って学習するという手もあるが、時間に限界があるのでお勧めしない。

デスクトップPCでもノートPCでもよいが、
もし外部での勉強会に参加したいと思うなら、持ち運びができるノートPCがよいだろう。

スペックは自由に決めるとよいが、できればCPUはCore i5以上、メモリは8GB以上をお勧めする。
あとは持ち運びのしやすさや予算、使いやすさや好みで決めるとよい。

###２：DBの知識を得る
CRUD、内部結合・外部結合、インデックスの知識があるとよい。
余裕があれば、DB毎に用意された専用のプログラム言語を学んでおくとベストである。
(oracleならPLSQL、postgreSQLならpg/PLSQLなど)

[PostgreSQLチュートリアル](https://www.postgresql.jp/document/11/html/)

なお、DBのデータ確認には何らかのソフトウェアを用いることが多い。
[SQL Developer](https://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html)や[A5:SQL mk-2](https://a5m2.mmatsubara.com/)など。
何か一つ、この手のソフトウェアを使って操作に慣れておくとよい。

###３：プログラムを書く
文法など基礎的な部分を学ぶにあたっては、言語ごとに異なるので別途本や記事を探すこと。
個人的には以下の本をお勧めする。
・[独学プログラマー(日経BP社刊)](https://shop.nikkeibp.co.jp/front/commodity/0000/C92270/)

Python言語を題材として、基礎文法からプログラミング全般の知識がしっかりとまとめられている。
この一冊で勉強をすれば、他のプログラム言語を扱う時にも通用するスキルが手に入るだろう。

出来たプログラムは、SVNやGitを使ってバージョン管理の練習をするとよい。
Gitについては、以下の本をお勧めする。
・[わかばちゃんと学ぶGit使い方入門(シーアンドアール研究所)](http://www.c-r.com/book/detail/1108)

書籍を見なくてもプログラムが書けるようになって来たら、以下の本をお勧めする。
・[リーダブルコード(オライリー・ジャパン)](https://www.oreilly.co.jp/books/9784873115658/)
※英語版もあるのでネットで買うときは注意すること。

読みやすいソースコードとは何かを具体例をもって教えてくれる良書である。

作りたいものは興味があるものならなんでもよい。
・ポケモン関連の最新情報を自動で集めてくる
・好きな野球チームの過去の対戦成績を読み込んで、勝率を計算する
・Linebotを作る
・パズドラ的なゲームを作る

###４：アウトプットする
作成したプログラムは、相談できる人にチェックしてもらうとよい。
よりよい実装方法や、自分では気づかなかった不具合について意見をもらえるかもしれない。

また、QiitaやTwitterやブログなど、好きな媒体でよいので情報をどんどん発信するとよい。
そこでも色んな意見やフィードバックが得られる。
※中には攻撃的な意見もあるだろうが、深刻に受け止めず、笑って受け流すとよい。

人に伝えようとすると、情報を整理し、まとめる力が身につく。
また、ミスや誤情報がないように事前に検証も行う。
これが、最大の学習効果を生み出す。

###５：勉強会に参加する
苦手という人に強制はしない。
しかし、参加する事によって多くの学びを得られる。

最新のフレームワークや開発手法、プログラム言語の最新仕様など手に入る情報は多岐に渡る。

自分とは異なる専門分野を持ったエンジニアや、
高い技術を持ったエンジニアと出会った場合はどんどん質問するとよい。
時には自分が質問を受けることもあるだろう。

ただし、勉強会は内容も質もまばらなので、
どのコミュニティがよいかは実際に足を運んで自分で判断するしかない。
[connpass](https://connpass.com)などを使い、まずは自分が興味がある分野やプログラミング言語の勉強会に参加してみるとよい。

##おわりに
自分もまだまだ技術力が未熟なため、日々邁進中の身である。

しかしながら、社内勉強会等に講師として参加する中、
ゼロからプログラマーを目指す人にもプログラミングを教える必要性が出てきた。
そこで伝えたい情報を整理するために、記事としてまとめ上げた。

なにか意見などあれば改善のため、ご教示いただければ幸いだ。

優れた記事は他にもあり、プログラミング入門や新人SE向けの書籍も多数存在する。
ぜひ自分の気に入ったものを見つけて、プログラマーへの道を踏み出してほしい。