文系博士がエンジニアになって感じた「大学でやっておいてよかったこと」

# 要旨

- エンジニアとして働くにあたり，大学でやってることが色々役に立ちました
- 大学で学ぶことって役に立たないって言われがちだけど，そんなことないんだよというお話[^1]
- 大学生は勉強しましょう（せっかく大学行くんだし）

# 書いてる人

- 博士課程修了
- 専門はコンピュータサイエンスや情報系ではない（日本ではいわゆる文系に属する）
- エンジニア歴は1年ちょい
- 入社時のプログラミング経験はTeXでの論文執筆とRを必要に応じてググって使うレベル
- 今はJava中心に色々つまみ食い中（React面白いよReact

# 役に立ったもの

- 論理力（ロジック力）
- 文章力
- 抽象的に物事を捉える力
- 英語力


## 論理力（ロジック力）

- 論理力をどう定義するかは難しいですが，ある出来事Aとある出来事Bをある程度の必然性を持って（＝蓋然性の高い状態で）関係づけられる力というふうに一旦定義しておきます[^2]。
    - このように定義すると，論理が飛躍しているケースは，ある関係よりも更に蓋然性が高い関係性が見つかる場合，あるいは複数の関係性間において蓋然性の高低が判断できないケースと考えられるかと思います。

### どんなときに役立つか

- 設計時・コーディング時のロジックの組み立て
    - あるアプリ（関数でもいいです）が特定の入力を受け取って特定の出力をする場合，入力値に対して様々な処理をかけて出力をすることになると思います。このとき，入力→出力間には様々な処理が存在することになりますが，その処理同士の関係性に蓋然性が高くないとプログラムは動きません（あるいは動いても読みづらい）。
- 障害対応・調査時の調査の組み立て
    - なにか障害が起きたり，調査が必要になったときに，どこからどのように辿れば原因までたどり着けるのか，一つ一つロジックを紐解いて，仮説検証していくということが自然にできました。

### どうやって学ぶか

- 読書（ノンフィクションなど割と硬めの）
    - ある文で書かれていることが，次の文で書かれていることとどのように関係しているかを常にモニターしながら読書をするのは良い訓練になるかと思います。同様に段落と段落，章と章の間などで確認する癖をつけると，論理的に読書をする習慣が付いて良いかと思います（と同時に，論理的に書かれていない書籍を大量に見つけることになるのですが）
- レポートの執筆
    - 前提：レポートとは「筆者の意見をそれなりの根拠を持って提示するもの」とします。
    - ある主張を成立させるのには根拠が必要です。根拠は蓋然性の高い状態で主張と関係づけられていないと，根拠の説得力が乏しいものになります。
    - 例えば「すべての人は3食おにぎりを食べるべきだ」という主張に対して，「俺おにぎり好きだし」という根拠は「おにぎりは健康に良い」という主張より蓋然性が低いと評価されやすいと思います。（※この背後には「人間はインセンティブの高い行動を取りやすい」という仮定があります。）
- プレゼン
    - プレゼンは限られた時間内で主張と根拠を端的に説明しなくてはいけません。
    - 枝葉末節は省かないと時間が足りなくなるので，本質的な論理のみに集中しやすくなるという効果があります。
    - また，どう提示すれば伝わりやすいかも訓練できます。

## 文章力

- 文章力を「読み手のことを考えた読みやすい文章を書く力」と非常にゆるく定義します。
- ちなみに文章力の土台には前述の論理力が重要であることは言うまでもないです。
- この文章が読みづらい？すみません（私の）修行が足りないですね。

### どんなときに役立つか

- コードを書くとき
    - コードもドキュメントの一種です。文章を書くときに気をつけることと，コードを書くときに気をつけるときの本質は大きな差がないような気がしています。
    - 例えば，処理は関係性の高い処理をまとめてブロックにし，改行を適宜入れる，などは，段落を作るのと似ています。
- ドキュメントを書くとき
    - これはもうそのまんまですね。

### どうやって学ぶか

- 卒論・レポート執筆
    - これはもう書く経験を積むしかないです。
    - 卒論などは先生によっては結構細かくチェックしてくれる場合もあるみたいなので，活用する他ないと思います。
    - あとはいい文章を読むことかな。

## 抽象的に物事を捉える力

- プログラミングには抽象概念がいっぱい出てきますね。例えばオブジェクト指向設計やクラス。こういう抽象概念を理解する力としておきます。

### どんなときに役立つか

- 他の事柄への応用が利く
    - 抽象的に捉えることである別個の物事の類似点や共通点を理解しやすくなるので，それに基づいて理解度を向上させたり学習速度を早くすることができます。
    - 例えば，入社後の研修時の言語はPHPだったんですが，OJT以降Javaをやるということになり，Javaをざっと勉強する必要がありました。PHPでオブジェクト指向やCRUDなどの概念をしっかり理解していたおかげで，Javaを勉強する際も非常にとっつきやすかったです。確か文法をざっと把握してCLI上で動くプログラムとかで遊んでというのを2日くらいやって，あとは業務でっていう感じだった気がします。
    - オブジェクトが「現実を模倣する」とかよく書かれていますが，これ秒で理解できました。ああなるほどね，と。逆にオブジェクト指向より前ってどうしてたんだろうと思いました。（オブジェクト指向の本質が「現実の模倣」というのは賛否があるみたいですね。この辺不勉強でまだ良くわかっていませんが，取っ掛かりとしてはわかりやすかったです）
    - 上で「コードもドキュメント」と書きましたが，これはコードと一般的な文章の類似点共通点を抽出して抽象化した産物ですね。

### どうやって学ぶか

- これが一番むずかしい気がします。が，とにかく抽象概念に触れてなれておくことでしょうか。
- 日本の教育課程において抽象概念を本格的に扱うのって高等教育（大学）からだと思うので，そこで出てくる抽象概念をしっかり理解すること，抽象概念とその具体例の関係性を抑え，さらに実生活でその抽象概念が当てはまる実例を他にも見つけることでしょうかね・・・

## 英語力

- そのまんま，英語の運用能力全般ですね。読みがあるととりあえず便利だと思いますが，さらに聞く話す書くができると仕事の幅が広がるのではないでしょうか。

### どんなときに役に立つか

- アクセスできるドキュメントの幅が広がる
    - 英語で書かれてる情報のほうが圧倒的に量が多い。
    - トラブってもだいたいStackOverFlowとかに書いてある。
    - 海外の大学では情報系の学部のコースのマテリアルが公開されてたりする（例えば[これ](https://fullstackopen.com/en)）
- 命名で困らない
    - 単語の幅が広いと困らなくなります。
    - 先輩によく「この処理なんて名前がいいと思う？」と聞かれてました。
    - 逆に関数名に困ったら，英語力よりもその関数の処理詰め込みすぎじゃね？と疑うようになりました。
- オフショアチームと英語でやりとりできる
    - 基本通訳を介してコミュニケーションするんですが，英語喋れる方もいるので，その場合は直接やり取りしたほうが早かったりします。
- たまにかかってくる英語の営業電話に出れる
    - 「お電話ありがとうございます。株式会社○○の○○でございます」からの"Hello?"にビビらなくてすみます。
    - 「誰か英語対応できる？」に対応できて感謝されます。
 
### どうやって学ぶか

- とりあえず中高レベルの基本的な文法事項と単語は抑えておけば良いと思います。
- あとは英語の文章を読み慣れること。今度からググるときは英単語でググるようにしてみてはどうでしょうか。
- あとはお好みに応じて。強化するなら強化する，他にやりたいことがあればそっちをやるで良い気がします。
- 私はたまたまそっちにパラメータ振ってました。

# おわりに

- ぱっと思いつくものをなぐり書きしてみました。まだまだあると思います。逆に教えて下さい。~~（初記事なんで許して）~~
- 大学生はもっと勉強してください（元非常勤講師の悲痛な叫び）

[^1]: タイトルには「文系」というワードを入れていますが，別に文系に限らず一般的に大学で教わるであろう内容を想定しています。
[^2]: 後で読み返して，あんまりいい定義じゃないような気がしてきた・・・これだと因果関係の定義に近い・・・？とはいえこの定義に深入りすると死んでしまうのでやめておきます。