Posted on 

Myプログラミング遍歴

自分がどのような経緯でプログラミングに興味を持ったのか振り返ってみました。

小学校

機械いじりはやたらと好きだった記憶はある。
電子ブロック(学研「大人の科学」の付録)で電子工作に触れる。

中学校

機械に興味があったが、プログラミングには触れていなかった。
数学が好きだったために。地域の数学キャンプみたいなのに参加してみたところ、自分より遥かに頭のいい小学生がいて絶望した。
彼は今何してるんだろうか…

スーパーマリオメーカーの3DS版が出たのをきっかけにマリオメーカーにはまる。コース作成の拡張性の高さから、四六時中コースのギミックを考えていた。全然関係ない話と思われるかもしれないが意外と計算機科学に関係あったりもする。

スーパーマリオメーカーはチューリング完全 @第15回日曜数学会
詳しくは、ニコニコ動画で「マリオメーカー学会」と検索して欲しい。

高校

1年生

Geogebraのアプリを意味もなく触り、ひたすら関数のグラフを動かしていた。
↓ 代表作

1
y=tan(((1)/(2)) sqrt(x^(2)+y^(2)) π+a) x

(螺旋がぐるぐる回る)

2年生

「理数科」に入る。みんなそれぞれ好きなものを持っていて、数学とか物理とか化学とか何をとってもすごい人がいた。いまだにこのクラスの人たちとは仲良くさせていただいている。

課題研究

理数科では「課題研究」という活動があり、その中でプログラミングに触れた。

最初はRaspberryPiを使って音声認識デバイスを作ろうと考えていたが、挫折する。
(その後ラズパイは自分がいじってる間に壊してしまいました。すみません)

研究テーマを「ディープラーニングを用いた硬貨の判別」に変えて、PythonTensorFlowを利用して硬貨の分類を行うAIの開発を目指した。今考えるとあまり出来は良くなかったが、機械学習に関してある程度の知識を身につけられたことは非常に有意義だった。
この活動を通じてプログラミングに興味を持ち、情報系を志望するようになる。
友達とカラオケにこもってひたすらデータセットの作成とコーティングをしていたのはいい思い出。

その後

特に新しい言語を始めることもなく、競プロとかKaggleとかにも手を出していなかったのでひたすらPythonに打ち込む。できることがかなり多い言語なのでネタには困らず、matplotlibでグラフのアニメを作ったり、スクレイピングをしたりとさまざまなライブラリを試してみた。
いろいろと作っているうちに、プログラミングの本質とかアルゴリズムとかに興味を持つようになる。

3年生

受験生になってもプログラミング熱は冷めず、勉強の息抜き(現実逃避)としてプログラミングを続けていた。

休校期間

志望を名古屋大学情報学部に定める。この話はまた別の機会に。
この頃はO’Reillyのゼロから作るDeepLearningでディープラーニングの実装を勉強していた。この本は結構面白いのでおすすめ。読んでみたい方にはお貸しいたします。

その後

物理で勉強した電場と磁場のシミュレーションをやってみようと思い立つ。苦節の末生まれたのがこれ。

面接の際にこのことを話したから、この経験はかなり役に立ったんじゃないかと思う。

大学生

春休み

Pythonによるアルゴリズム入門でアルゴリズムとデータ構造の勉強を始める。推しソートはマージソート

1年生

今まで、基本的に独学だったので、プログラミングができる友達ができたのは大きなモチベーションになった。

NUOCW

「名大の授業」のバイトを始め、web系に携わるようになる。サイトを作った経験は全くなかったので、非常に勉強になる。

今までgit cloneくらいしか使ったことのなかったgitや、プログラミングで最もめんどくさい「環境構築」を一瞬で出来るdockerとか色々な技術を学んだ。

LaTeX

授業の課題で触れたのだが、Wordの弱いところ(数式が書けない、見た目の微調整のためにスペースを使うと違う環境で閲覧した時にレイアウトが崩れるなどなど)をうまく補えるため、始めて使った時は感動した。

環境構築がめんどくさかったり、エラーメッセージがわかりづらかったりと不満も多いが、理系ゴコロをくすぐられるかっこいいドキュメントは一度知ってしまうとやめられない。

AtCoder (C++, Python)

今まで勇気が出ずにやってこなかった競プロを始めてみる。これを機にC++を勉強してみようと、C++入門 AtCoder Programming Guide for beginnersを進める。基本的な文法は分かったが、ポインタとかの概念はいまだにあまり掴めていない。

その後、書き慣れたPythonにもどって修行している。現在はAtCoder 版!蟻本 (初級編)の問題を少しづつ進めている。

Wolflam言語

Wolfram言語が使えるようになった!(mac編, ビッグバネイト)

上の記事を参考に、憧れのWolframを手に入れた。Pythonもデータ分析には強いけど、Wolflamはさらに色々なことができて感動。

今後使い道が増えそう。

Haskell

夏休みに入って新しく始めた言語。関数型言語には前から興味があったが、手をつけられていなかったため初挑戦。(Wolflamも一応関数型だけど)今までやってきた手続き型言語とは全く異なり、文を書く順序に全く影響されないコードは新鮮だった。書き方は全然違っていても、最終的に生成されるバイナリの挙動はCなどと変わらないというのも不思議。

PythonとHaskell、実装比較

Pythonでの実装(手続き型での一般的な実装)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def merge(arr1, arr2):
result = []
while arr1 and arr2:
val1, val2 = arr1[0], arr2[0]
if val1 <= val2:
result.append(arr1.pop(0))
else:
result.append(arr2.pop(0))
result += arr1 + arr2
return result

def merge_sort(array):
if len(array) == 1:
return array

sep = len(array) // 2
left, right = merge_sort(array[:sep]), merge_sort(array[sep:])

return merge(left, right)

Haskellでの実装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
merge :: (Ord a) => [a] -> [a] -> [a]
merge x [] = x
merge [] y = y
merge (x:xs) (y:ys)
| x <= y = x : merge xs (y:ys)
| x > y = y : merge (x:xs) ys

mergeSort :: (Ord a) => [a] -> [a]
mergeSort [] = []
mergeSort [x] = [x]
mergeSort x = merge (mergeSort left) (mergeSort right)
where half = length x `div` 2
left = take half x
right = drop half x

今後やってみたいこと

  • RaspberryPiでIoT開発
  • コンピュータシミュレーション・数値計算
    • 微分方程式の勉強
    • JuliaとかRとかを使ってみたい
  • 圏論(Haskell関係で)
  • 計算機科学
    • いろいろなアルゴリズムの勉強
    • 最適化? (いまだにどういうことなのか分かってない)
  • Kaggleでデータ分析(まだチュートリアルしかやってない)

最後に

今後もさまざまなことに興味を持って精進してまいりたいと思います。

触発されたサイト↓


このページはHexoStellarを使用して作成されました。