旧帝国大学理系学部中退がプログラミングを始めて半年でPaizaのスキルチェックでAランクとるまでのぽえむ


~学ぶことへの喜びを取り戻すまでの道程~

意外と自分と同様のタイプの学歴コンプレックスに苦しんでる方が沢山いるかも, と思ったのでPaizaスキルチェックでAランクをとれた喜びを共有, そしてこれからの自分の学習の指針を改めて明示的にしたいと思ったので, 思い切って記事を書いてみようかと思いました.

緩い自己紹介

高校の頃は数学が得意でした. 某旧帝国大学の理学部に入りました. そのあと研究というものへ一切の興味を失い, 勿論プログラムなんかも全く学習せずに文字通り何も学ばずに4年生で中退しました. 以後とあるきっかけでソフトのテスターの職に就くまで完全にサイエンスとは縁のない生活を送っていました.そんな自分がプログラミングを通してサイエンスを生きる喜びと感じ, 一つの実力の指針であるPaizaスキルチェックAランクを"Hello World"から半年で身につけれたお話です.

~1月~きっかけはExcelのマクロでした

テスター業務はExcelでの単純作業が非常に多かったです. 当時の自分にとっては意外だったのですが, 想像以上に半角・全角関連の"バグ"が多く, またリーダーの方がテスターの書いたレポートの半角・全角その他の書式を統一するVBAマクロを使っており, プログラムでの"オートメーション"に興味を強く持ちました.
以後業務で暇な時間はVBAマクロの学習に充てていたのですが, メモ帳へログを毎日出力するマクロ, 簡単なTodoアプリを作った辺りでこの言語必ずしも今のホットな(当時はスクレイピングに強く惹かれていました)技術に適してないことを感じ言語の乗り換えを考えました.

~2月~天使(Python)にふれたよ

個人で使っている環境(MacOS)でのVBAの出来の悪さで乗り換えを決意しました. 初めはC#を試したのですが(今は好きな言語の一つです, unity等絡めて創作に用いたい), これも環境設定が当時の自分にとっては難しく, オブジェクト指向でかつ多くの人がオススメしているという理由からpythonの学習を始めました.

~3月~私はRaspberry Piの夢を見る

pythonの初歩はProgateで学びました. とりあえず動く, 綺麗なコードを写経するというのはいい体験でした. また, HTML, JavaScript, SQL等今のエンジニアにとっては避けて通れない技術を体系的に学べたのもよかったです. この頃に実家に置いてあったRaspberry Pi2を親から貰い, Linuxの世界を初めて知りました. CUIでほとんど完結する世界に自分はめんどくさがりやの究極のミニマリスト的美を感じ惹かれていました. Raspberry Piを手にしたからにはLチカにも手を出したのですが,

main.py
def main():
    pass
if __name__ == '__main__':
    main()

の意味がどうしても理解出来ず, pythonのより細かい仕様を理解したいと思ってからみんなのpythonを買い読み始めました.
またVimの世界には驚きました. こんな効率厨の極みみたいな考えが30年前からあったのには素直に感動を感じました.

~4月5月~プログラミングと数学の関係

命題 プログラミング能力と数学の学力は無関係だ. がありますが, これが自分にとって軽い悩みのタネでした. なぜならば自分は受験までの数学ならばできる, より高度な内容となった瞬間わからなくなるというとこもあり, 正常にこの命題を考えることができないみたいなのがあったからです. 緊急事態宣言が出て仕事も自宅待機となってしまい, やや消極的な理由とはいえ今まで以上にプログラミングの学習に時間を割いていました. しかしイライラを一番感じてたのもこの時期です. ウェブフレームFlask等で当たり前のように出てくるデコレータ, 複雑怪奇に感じたクラスの継承, 等は残念ながらProgateでは納得できる理論を学べませんでした. 新鮮だったのは再帰を用いたフィボナッチの導出等. 変数名にそのまま数学の用語を使える算数の問題は当時難解に感じたオブジェクト指向の一筋の光に感じました.
今は自信をもっていいます. プログラミングへの適正と数学のセンスには明白な相関があります.自分の場合の話ですけれども, ここから先学んだ抽象度の高いプログラミングの概念は全て数学の問題に置き換えることで消化していけました. ここから先それについて話していきます.

~6月~Paizaデビュー

Progateの次となるEラーニングの題材を求め, Paizaを始めました. 音速でPaizaのPythonコースを終え(Progateより難易度は高いと思う), しかしFlaskコース, AIコースはとても難易度が高くやり応えを感じました.スキルチェックはコースを進めている内に進められたので手を出しました. まさかスキルチェックを等して内包表記, フォーマット, ラムダ式等発展的な内容を学べるようになるとは知らずに.
よくある話ですが, スキルチェックは標準入力の難易度の高さにいきなり壁を感じました. 今は整数値の取得には以下のような関数を用いることが多いです.

input.py
# input 23 34 43 1 34
def input_line():
    line = input().split()
    return [int(i) for i in line]

※2020/08/02追記
上記の関数はラムダ式を用いたら以下のように書くことができ, 更に記述量を減らせました

lambda_input.py
def int_input():
    return [int(i) for i in (lambda x: x.split())(input())]


※2020/09/21追記
これも少し冗長な記述でした、 他の方のブログを参考にして今は以下のように記述してます

int_input.py
def int_input():
    return [int(i) for i in input().split()]

# もしくは
a, b = map(int, input().split())

ラムダ式なんかを使いこなせたらもっと簡潔に書けそうです. しかし幸いにして受験数学とスキルチェックで使われてるアルゴリズム, 必要な抽象思考が似ている部分もあり割と楽しみながらB問題あたりまでは解けるようになりました. この部分は地味に共有したい感覚です. 多くの人が躓いていることを自分にはわかるという体験は自信に繋がりました(ほんとうに東大数学を解いてたころを思い出します).
出てくる問題には行列の考え, 漸化式の考えなんかがいかせる問題が多く楽しいです(どうやらNumPyは使えるみたいです).
下記のような問題を行列計算に置き換える作業はなんか楽しいです.

'.'と'#'で作られた長方形のアスキーアートを反時計回りに90度回転させることを考える
..##.
.##.#
##...
matrix.py
'''
input
..##.
.##.#
##...
'''

import numpy as np

map = []
for n in range(3):
    map.append(input())

map_array = np.zeros((3, 5), dtype='int32')

for x in range(3):
  for y in range(5):
    if map[x][y] == '#':
      map_array[x][y] = 1

map_array = map_array.T
print(map_array)

'''
output
[[0 0 1]
 [0 1 1]
 [1 1 0]
 [1 0 0]
 [0 1 0]]
'''

転置行列をこんなに簡単に作れるとは中々に楽しいです. 面積計算, 自己相似問題なんかはNumPyが本当に強力に感じました.

~7月~Aランク取得

オブジェクト指向という概念が楽しくなってきました.pythonという言語の考え方も好きです. 明示的に記述することを𠮷とする考えは自分は好きです.
そして7月23日

Aランクを取得できました. 正直ランクをそこまで意識してたわけでもなかったのですが, 特に苦痛を感じずに半年でAランクをとれたということは素直に嬉しかったですし, モチベーションにもなりました. そしてなによりも厳しくもオープンなプログラミングの世界に感謝しています. 何もかもが不自由なコロナ時代の今, 仮にプログラミングを学んでいなかったらと考えるだけでグロテスクな気もちになります.

終わりに

とにかくQiita, Progate, Paizaへは深く感謝しています. これらがなければモチベーションを維持することは難しかったと思ってます. 現在は機械学習・AIの技術を学び, 音楽の構造の解析なんかをできたらいいなとぼんやりと将来像を描いてます.
この話はみなに共感してもらえる話でないこと, 自分自身まだ何もやり遂げていないこと, それらはわかっているのだが, だからこそありのままの今の心境の記述に価値があるのではと思ったのが当記事を書こうと思った動機です. つまりは受験数学で一度でも成功したものはもしかしたらこれくらいすんなりとプログラミングを学べるのではないのかな, というだけの話です. もちろん受験数学は一例です, しかしアルゴリズムを生み出すには数学の問題を解くのに非常に近い思考が必要だと強く感じました. 一つの可能性についての話として捉えて頂けると幸いです.

追記

先日9月19日にSランクを取得しました。 BとAの差よりはAとSの差の方が小さく感じたかもですが、 がむしゃらに解いてるだけではとれないなとも感じました(アルゴリズムを学ぶ上で競技プログラム界隈で有名な『プログラミングコンテストチャレンジブック』通称蟻本の第一章にAランクとSランクのギャップを埋めるエッセンスが詰まってるように感じました。)。 Sランクの問題でも基本的にifとforの組み合わせで解けるのだなというのは実際の問題を通して実感しました。 オブジェクト指向やアルゴリズムの基本を押さえるだけでSは取得できると思います(基本がもっとも人間の心理的にキツいところだとも思ってます)。 Paizaからくるスカウトもかなり豪華になったのでけっこうテンションあがってます。