文系でもソフトウェアエンジニアになれますか？

# 目次

[はじめに](#はじめに)
[想定読者](#想定読者)
[WHO AM I](#WHO AM I)
[文系でもソフトウェアエンジニアになれるのか](#文系でもソフトウェアエンジニアになれるのか)
[まず何をするべきか](#まず何をするべきか)
[どういう学習をするべきか](#どういう学習をするべきか)
[どういう立ち回りをするべきか](#どういう立ち回りをするべきか)
[おわりに](#おわりに)

# はじめに
こんにちは odmishienです。この記事は[DeNA 21 新卒 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dena-21-shinsotsu)の4日目の記事です。ひょんなことから内定をいただき、4月からソフトウェアエンジニアとしてDeNAで働くことになりました。

さて。修論執筆でパンク寸前の中、何を書こうとウンウン唸っていました。技術的な話を書きたい気持ちもあったのですが、他の同期がとても優秀な記事を書いてくださるだろうという甘えと、もしかして大学も大学院も文系である私がDeNAでソフトウェアエンジニアになることは少し珍しいのでは？と思い、結果としてこんなタイトルになりました。かなりポエミーというか、技術的な話はほとんど出てこないのですが、よろしければお付き合いください。


# 想定読者
- 文系だけどソフトウェア開発に興味がある方
- (理系ではあるが)非情報系だけどソフトウェア開発に興味がある方
- お暇な方


# WHO AM I
まずは簡単に私の経歴をお話しします。(割とどうでもいいので飛ばし読みしてもらって構いません)

中学・高校時代からPCを触ったりゲームをしたりするのは好きでしたが、自分がそれを作ってみよう！などとはつゆも思わず。数学がありえないほど苦手だったのもあり、大学入試は小論文と英語だけで乗り切りました。特に興味のある学問もなかったので、特定の分野(法学/経済学など)はやめて、ぼんやりと広く学べそうな教養系っぽい学部を選んだのを覚えています。大学に入学してからも3年生になるまではヨーロッパの政治だったり、ジェンダー問題についての講義を受けたりしていました。アルバイトもフレンチ料理屋さん、コンビニ、スイーツ工場など、プログラミングのプの字も出てこないようなものを転々としていました。

プログラミングに初めて触れたのは学部の3年生の時のとある講義だったと記憶しています。現在修士の2年生なので、一応プログラミング歴は3年と少しということになります。教養系なので「情報コミュニケーション」というコースが存在していて、そこの単位がチョロいらしいという不純な動機で履修した講義でした。Pythonの文法を一通りやってから、簡単なWebアプリを作ってみようというような内容だったと思うのですが、なんだかとてもワクワクしました。気付いたらかなりのめり込んでしまって、講義以外でもプログラミング学習サイトでPythonを読み書きしていました。

それからは自分の生活を豊かにするためのコーディングをよくやっていました。簡単なリマインダーをしてくれるLINEBotを作ったり、クレジットカードの引き落としを通知してくれるスクリプトを書いたり。本来なら学部の3年生なので就活をするものなのですが、合同説明会やサマーインターンなどもあまり気乗りせず、休みの日にするコーディングの方が私の心をワクワクさせてくれました。4年生になって配属されるゼミでは社会システム科学というものを扱うところに配属されました。情報技術を使って、社会学/統計学/心理学などをやりましょう！という文理学際的なゼミです。とはいえ情報科学や計算機科学にはほとんど触れません。ITパスポートを取るとえらい！基本情報技術者を取るとすごい！みたいな世界線をイメージしてくださるといいかと思います。

ある日、ゼミの教授と飲んでいて、「大学院おいでよ〜」と軽いノリで言われました。(おそらく教授は酔っていてほとんど覚えていないと思われる。) それは文系の私にとってはかなり盲点でした。「大学院に行けばもっとコードを書けるのでは！？」とはしゃいで帰ったのを覚えています。早速就活を中断し、願書を用意することにしました。この頃には開発のバイトも始めたりしていたと思います。

大学院に無事合格し、入学までの間にも大きな転機がありました。割と有名なWeb系の会社のアルバイトの面接に合格し、アプリケーションエンジニアとして働くことになったのです。著名なOSSのコミッターやあのツールを作った方なんですか！？みたいな方と一緒にお仕事をできるということでワクワク半分、恐ろしさ半分で初出社したのを覚えています。

そこでの経験も積んで、修士の1年生の夏にエンジニア向けのサマーインターンに初めて参加しました。それに関しては[色々書いた記事が別にあるので、もし興味があればどうぞ](https://odmishien-zakki.hatenablog.com/entry/2019/07/31/123543)。弊社もサマーインターンに参加したことをきっかけに採用面接も受けたという流れです。とても刺激的な夏でした。


# 文系でもソフトウェアエンジニアになれるのか
結論から言うと、**文系でもソフトウェアエンジニアにはなれます**。結局文系/理系なんぞ、日本の教育システムが生み出した構造にすぎないし、アルバイト先にも「本当に文系出身か？」というようなツヨツヨな方もいます。ただ、これは生存者バイアスとも言い切れません。実際私の場合も、開発のアルバイト先での環境がとても良かったり、ある程度自律的に学習を継続することができたというのが大きく寄与しているとは思います。

とは言うものの、私の持論として<u><b>「何かを知りたいならとにかくサンプル数(N)を増やせ」</b></u>というものがあります。数多の「こういうことが役に立ちました」「こういう意識を持つとよいのかもしれません」というものの中に意外と自分にしっくりくるtipsが転がっているかもしれないからです。そんなNのうちの1つになれば幸いです。


# まず何をするべきか
よく聞かれるのが<b>「まず何から始めたらいいですか？」</b>という問いです。この問いには様々な考え方や答えがあると思います。私がプログラミングを学び始めて1年の間にやったことを振り返ってみると、大きく分けて3つのことをやったと記憶しています。

## 1. とにかく1つ言語を選んで学習教材を一周する
ここで自分のプログラミング学習への適性(?)のようなものが分かる気もしています。純粋に黒い画面に何やら意味の分からないコードを打つのが楽しい、よく分からないけどハッカーのような気分になれて嬉しい、などと思える方は適性ありです。私の場合は言語は<b>Python</b>、学習教材には[paizaラーニング](https://paiza.jp/works/python3/primer)を使いました。

ここで注意すべきなのは以下の点です。

- <b>言語は1つに絞ること</b>

様々なプログラミング言語がありますが、学習を始めたての頃にいくつも学ぶ必要は<b>全くありません</b>。1つの言語をある程度書けるようになれば、第2・第3の言語を習得するのはさほど時間がかからないので、まずは1つの言語の文法や仕様を理解することに注力しましょう[^1]。

- <b>教材を1つに絞ること</b>

私の場合は無料のオンライン講座を教材に選びました。これが良かったのか悪かったのかは分かりませんが、動画でかわいい声優さんが教えてくれる点やインタラクティブに教材が進んでいく点は、個人的に合っていたと思います。教材は書籍でもオンライン講座でも構いませんし、課金することが苦にならないならプログラミングの教室に行っても構いません。とにかく<b>1つの教材を完全に終わらせること</b>を目標にして、あれこれと手を出さないようにしておきましょう。

## 2. 作りたいモノを作る
なんだか突然話が進んだような気もしますが、1つ言語をマスターすれば次は作りたいモノを作りましょう。あくまでもプログラミング言語はソフトウェアを開発するツールであり、それを駆使してモノを動かしてみないことにはあまり意味がありません。サンプルプログラムやインターネットに落ちているプログラムをとにかくいじり倒してみましょう。決して綺麗なコードである必要はありません。まずは<u><b>動けばいい</b></u>の精神で臨みましょう。また、いくつかモノを作っていると様々な問題に直面します。こうした問題を自分で調べて解決する力[^2]は実際にソフトウェアエンジニアとして働くようになってからも、とても重要なスキルの1つだと思うので、とにかく手を動かしましょう。

という話をすると<b>「特に作りたいモノがないです....」</b>と言われたことがあります。そういう場合は <b>他人の欲しいモノを作る</b>のがオススメです。

「他人の欲しいモノを作る」というのは別に全世界に最高のアプリを公開しましょう、という話ではなく、<u><b>家族や友人との生活のなかで「こういうのあったら便利だよな〜」という声を聞き逃さないようにしましょう</b></u>という意味です。例えば私の場合は「飲み会の日程調整するのが面倒！」と言っている友人のために「ランダムな日付で起動して"飲み会しよや！"と発言してくれるLINE bot」を作ったり、「サークル活動で班分けをいちいち考えるのが面倒！」と言っている友人のために「人の名前のリストを指定した人数のグループに分けてくれるスクリプト」を作ったりしました。

決して完璧なソフトウェアを作る必要はありませんし、万バズするようなソフトウェアである必要もありません。自分やその身の回りにいる人が少し助かるようなモノで構いません。この時期に作ったモノが、今でも私のソフトウェア開発の原動力でもあり、ソフトウェアエンジニアを志すきっかけとなりました。

## 3.作ったモノをエンジニアに見てもらう
ここまでくれば、「ソフトウェアエンジニアです！」と名乗ってもよさそうなくらいです。しかし、個人で作ったプロダクトと世の中で動いている大規模なプロダクトとの間にはいくつもの差があります。リッチなフロントエンド、大量のデータを格納しても問題の発生しないDB設計、大量のトラフィックに耐え得るサーバー構成...。挙げるとキリがないですが、やはりプロが作るようなモノを一朝一夕で作れるようにはなりません。

プロになるには実際にプロに教えを乞うのが1番です(もちろんプロでなくても自分より詳しい先輩でも構いません)。ただ、彼らも0から手取り足取り教えてくれる訳ではありません。そこで役立つのが<b>「作ったモノ」</b>なのです。ソフトウェアエンジニアは基本的に「モノづくり」が大好きで、動いているモノがどう設計されたのか/どう実装されているのかという話をするのが好きで好きでたまりません。誰でも初めはビギナーなので、恥ずかしがらずに汚いソースコードを見てもらいましょう。きっと、「こう設計した方が綺麗だ！」とか「こう実装した方が美しい！」とか「俺だったらこうする！」とか色々と耳寄り情報を与えてくれるでしょう。

という話をすると、<b>「周りにコンタクトを取れるエンジニアがいないです....」</b> と言われたことがあります。この辺りで私は運が良く、自分よりもソフトウェア開発に関して詳しい方と話す場が多かったと思います。
あなたが学生であれば、どの大学にもプログラミングサークル的な団体が存在すると思うので、勇気を出してそのドアを叩きましょう。また自分の大学の情報系学科の教授にコンタクトを取ってみるのも良い手かもしれません。心優しい教授であれば、きっと快くお話ししてくれると思います。

学生じゃないので無理だ....という方も諦めないでください。エンジニアが集まる場所は他にもいくつかあります。その中でもおすすめなのがconnpassなどで開催されている勉強会です。
中には[「初心者・学生に優しい」というカテゴリ](https://connpass.com/category/%E5%88%9D%E5%BF%83%E8%80%85%E3%83%BB%E5%AD%A6%E7%94%9F%E3%81%AB%E5%84%AA%E3%81%97%E3%81%84/)が用意されていて、一緒に切磋琢磨できる仲間や色々と教えてくれる先輩エンジニアを見つけることができるかもしれません。

この辺りはコミュ力というか、フットワークというか、そういう力が求められるのでちょっとツラいですが、ソフトウェアエンジニアは様々な人とコミュニケーションを取る必要のある職業だと思うので、訓練だと思って頑張りましょう。ご時世的にオンラインでのイベントも増えているので参加しやすいとも思います。



# どういう学習をするべきか
次によく聞かれるのが<b>「独学でどういう学習をしたんですか？」</b>という問いです。これも個人差があると思いますし、まだまだ私も日々勉強中の身です。そんな中でボンヤリと思っていることを書いてみます。

## 付け焼き刃をどんどん大きくして使える刀にしていく
「付け焼き刃」という言葉はあまりいい意味で使われる言葉ではありません。しかし(賛否両論/適性などあると思いますが)個人的には初期のプログラミング学習において、この「付け焼き刃」のような勉強に良い点があると考えています。あなたが情報系学徒のように体系的に学ぶ場の用意されていない非情報系であるなら、尚更です。

プログラミング学習で最も大きな壁になるのは<b>モチベーションの低下</b>だと思っています。これを維持することができず、頓挫しました....というのも珍しくないと思います。やはり人間なのでゴールの見えない道のりに立たされるとゲンナリしてしまうものです。そこで、<u><b>とにかくゴールを小さく設定しましょう。</b></u>

例えば初めから体系的に「Webとは何か」を理解する必要はないと思います。「そういうものがあるんだな」「よく分からないけどこうしたら動くんだな」というような付け焼き刃をどんどんやっていきましょう。まずは動かす。動かすためにググる。よく分からないけどコードを貼り付けたら動いた。それでいいのです。

こうやって勉強を進めると、コードが実際に動く喜びをこまめに感じることができます。

## ある程度刀が大きくなるとどこかで刀が折れてしまうので今度はきちんと鋳型に入れてみる
とはいえプロになっていったソフトウェアエンジニアが「よく分からないけど動いている」状態のままボーッとしているかというと、もちろん違います。<u><b>体系的な学習や理解を疎かにしてはいけないが、後回しにはしていい</b></u>というのがこの例えの趣旨です。大きくなった付け焼き刃はいつかどこかで折れてしまいます。でもその頃にはきっと折れた刀を溶かして鋳型に入れれば、きちんとした刀が作れるはずです。どこまで体系的にやれるか、というのは非情報系学生の永遠の課題ですが、網羅的な書籍や公式ドキュメントなどを読む癖を徐々につけていきましょう。徐々に、で構わないと思います。インプットばかりでツラくなったら、また作りたいモノを作って発散しましょう。



# どういう立ち回りをするべきか

最後に立ち回りという言葉が正しいかどうか分かりませんが、こういうことをやっていたのは良かったなというものを紹介します。

## 自分が「ソフトウェアについて1番知らない環境」と「ソフトウェアについて1番詳しい環境」のどちらにも身を置いてみる

これは本当にオススメで、可能ならぜひこれからも続けたいなと思っていることの1つです。私にとって「自分がソフトウェアについて1番知らない環境」が今のアルバイト先で、「自分がソフトウェアについて1番詳しい環境」が在籍している研究室やもう1つの学生主体で運営しているアルバイト先かなと思っています。

学習していくにあたって、<u><b>インプットとアウトプットのバランス</b></u>というのは重要だと思います。しかし、1つの場所でその両方の質を確保するのは難しいでしょう(初学者であれば尚更)。ならば、<u><b>インプットする場所とアウトプットする場所を分けてみればよい</b></u>のです。

アルバイト先では基本的に社員さんの多いチームで働いていて、周りにあまり学生がいませんでした。隣のチームにいる学生のアルバイトの方も相当優秀で、日々圧倒されています。そうした場所でもらうコードレビューやソフトウェア開発に臨む姿勢みたいなものはとても質が高く、得るものも多いです。とはいえこうした場所でアウトプットまでやろうとするには、そこまで手が回らなかったり、釈迦に説法だな...などと思ってしまって遠慮がちになってしまったりしがちでした。

反対に研究室や学生主体のアルバイト先では、後輩がたくさんいて、色々と分からないことや困っていることを聞いてくれる機会が多いです。もちろん知っていることを答えるというのは、自分の中での理解を進めることがあったり言語化する力が付いたりと良いことづくしです。また知っていると思っていたことを、いざ他人に説明するとなると<b>「あれ、これってどうなっているんだっけ？」と再確認するきっかけ</b>にもなります[^3]。

## とにかくメモを残しておく

人間とは愚かなもので、たくさんのことを忘却していく生き物です。プログラムを書いていても「なんかこのエラー前も見たな...なんだっけ...」とGoogle検索を叩くということを何度もやっています。そこで役に立つのがメモです。個人的なおすすめはScrapBoxですが、後から検索する術があるものであればなんでも(OS標準のメモ帳でも)構いません。

とにかく色々なこと(麻雀など趣味のことも)を書き殴っています。

![スクリーンショット 2020-11-13 19.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205979/4ccffa53-226f-ecac-49bd-05adac2e1c32.png)


網羅的で先進的な技術ブログみたいに書く必要はなく、あくまでも自分用のメモだと思って書くと、些細なことでも残す癖がつきます。これは実際にアルバイト先でも役に立っている習慣の1つで、

- 同じミスや問題をすぐに解決することができる
- どうしても分からないことがあればメモを元にして識者と会話ができる
- (もしそのメモが社内でアクセスできるものであれば)同じ問題で躓いている人の助けになるかもしれない

など、良いことづくしです。

## 原点を忘れないでおく

最後に突然の精神論ですが、個人的に大切なことは自分が<b>ソフトウェアエンジニアになろうと思った原点</b>だと思います。私自身何度も「コーディングをやりたくない」「自分よりも優秀な人はごまんといるのだから私がやる必要がない」などと悩んだことがあります。その度に思い出すのが、初めて自分が作ったソフトウェアが動いた日の感動であり、初めて自分が作ったソフトウェアを人に褒められた時の喜びです。

- なぜ自分がコードを書く必要があるのか
- 何がソフトウェア開発の喜びなのか
- ソフトウェア開発のどこが好きなのか

こうしたことを自分の中で言語化するのは、明確な動機にも繋がると思います。

もちろん言語化していく中で「やはり私はエンジニアにならなくてもいいのでは」「ソフトウェア開発は好きだけど別に”コーディング”は好きではないな」など様々な気付きもあると思います。そういう時はエイッとプログラミングから距離を置いてみるのも手です。道は決して1つではないし、コードを書かずともソフトウェア開発に関われる仕事はたくさんあります。自分を大切にしましょう。



# おわりに

気付いたらちょっとしたレポートくらいの長さになってしまいました。この筆の勢いのまま修論を提出して、無事に4月から社会人になりたいと思います。最後までお付き合いいただきありがとうございました。もし何か聞きたいことや物申したいことがあれば、 [Twitter](https://twitter.com/odmishien) などでご連絡ください。またどこかでお会いしましょう!!

# 宣伝

この記事を読んで「面白かった」「学びがあった」と思っていただけた方、よろしければ Twitter や facebook、はてなブックマークにてコメントをお願いします。
また [DeNA 公式 Twitter アカウント @DeNAxTech](https://twitter.com/DeNAxTech) では、 Blog記事だけでなく色々な勉強会での登壇資料も発信してます。ぜひフォローしてみて下さい。チョー有益です。

<a href="https://twitter.com/intent/follow?screen_name=DeNAxTech">Follow @DeNAxTech</a>

[^1]: 個人的なおすすめはPython/JavaScriptあたりでしょうか
[^2]: 私はGoogle力と読んでいます
[^3]: 先日はCORSについて聞かれて自分がぼんやりとしか理解していないということを痛感したりしました...