今年(2021年)の4月から,工学研究科の大学院生になった。
理工系の大学院生といえば,計算やデータの解析に必要なプログラムを,
なんらかの言語を用いて書けるくらいのプログラミング能力を持っているイメージだった。
翻って自分はどうだろう。院生になったのに,全然書けないではないか。
一応C言語やPythonを勉強してきたつもりだ。だから,それらの言語についての基本的な知識はある。でも,データ解析や研究のためのプログラムを書こうとしても,何から手を付けていいかわからない。一からプログラムを組み上げる能力がまったくない。道具のように使える言語も持ち合わせていない。
これでは,今後研究で計算やデータ処理をするためのプログラムすら書けない。
実験系の研究をしているとはいえ,なにかひとつくらいは「道具」として使える言語を持ちたい。そして,ある程度「自由に」プログラムを組めるようになりたい。研究で大量の実験データを扱ったり,データを考察するための数値計算プログラムを触ったりするうちに,そう思うようになった。
そこで,これから大学院の修士課程2年間の間に,数値計算やデータ処理をするための「道具」となるプログラミング言語を身につけるためにはどうすればいいか,考えてみた。
私のプログラミング遍歴
まずは,自分が経験してきたプログラミングを時系列順に挙げてみる。
いくつか成功例(プログラムを組み上げた経験)が出てくるが,いずれの言語も「道具」として使えるレベルには至っていない。
大学1-2年:講義でC言語
大学1年後期から2年前期にかけて,講義でC言語を勉強した。
主に配列・ポインタ・構造体に関連する部分を,じっくりと勉強した。
はじめてふれたプログラミング言語ということもあり,内容を理解し,課題を解くので精一杯だった。
ここで学んだC言語は,実用に耐えうる道具にはならないまま,勉強を終えた。
ただし,プログラミングに関連する基礎的な部分を学べたのはよかったと思っている。
(あとでPythonやFortran,Arduinoを学ぶ時に理解が速かった)
大学3年(独学):Python,HTML/CSS/JavaScript
大学2年春休みから3年にかけて,大学の書籍でO’reillyの本を買って,Python(データ分析)を勉強した。半年~1年くらいかけてじっくり本を読んだ。この時期は,ちょうどデータ分析や機械学習熱が高まっていた時期でもあった(世間的にも自分の中でも)
応用として,ブログの収益に関連するCSVファイルのスライス・並び変えをするプログラムをつくった。
参考記事:【2019年】ブログ経由で売れたamazonの人気商品を調べてみた
なんとな~く理解したような気になっていた。上記のプログラムくらいは作れるようになった。この時点でもう少しいろいろ作っていたら,もうちょっと「python」が道具に近づいていたのではないかと思っている。
==
ブログの細かなカスタマイズや,自作のWebページ作成のために
HTML/CSS/JavaScriptを独習した。これも,Pythonと同様に書籍で勉強した。
半年くらいかけてじっくり取り組んだ結果,身に付いた知識は
じててつログ(当ブログ)の細かなカスタマイズに役立った。
また,鉄道の写真を集めた自作の写真館のようなWebページを作ってみた。設計が雑だったため,更新ができなくなった(風呂敷を広げ過ぎた)。そのため,このページは現在はお蔵入り状態。
大学3年(講義):数値解析手法の勉強(Scilab)
大学3年秋の講義では,数値解析の手法を勉強した。
主に解析的に解けない方程式系を,離散的に解くためのアルゴリズムを学習した(数値積分とか連立方程式,微分方程式の解き方など)。
実際のコード実装は「Scilab」というものを使った。
これは,コードを入力してプログラムを組むというよりは,あらかじめ決められているコマンドを打ち込むだけという印象が強かった。
このときに,C言語かFortranで数値計算プログラムを組む努力をしていれば,いまごろ数値計算のプログラムくらいは作れるようになっていたのかな~と思う。
大学4年(研究室配属)後:Fortran,Arduino
研究室配属後は,2つの言語に取り組んだ。
1つは,研究で使うプログラムを読むためのFortran90/95だ。
名前だけしか聞いたことがなかった。実際にコードを読むのはこのときが初めて。
C言語よりは直感的で簡潔だった。
デバッグ用のOUTPUTファイルを出力するためのコードや,計算順序を変えるためのコード修正,追記はできるようになった。この知識をえるための勉強においては,学部1-2年時のC言語の勉強経験が多いに役立った。同じコンパイル言語であり,比較的歴史がある言語でもあるからだ。
ただ,そのあとは実験に明け暮れ,プログラムは回すだけになった。
したがって,Cと同様に,「実用に耐えうる道具」にはなっていない。
(今も,研究室のデスク上には,助教の先生が貸してくださったFortranの本が置いてある)
==
2つ目は,電子工作で必要なマイコンボードの言語「Arduino」だ。
Arduinoについて詳説すると本題から逸れるので,ここでの説明は省略する。Arduinoを買ってみた動機は以下の記事を参考に。
参考記事:電気系大学生がArduino Unoを買ってみた【電子工作入門】
この言語も,大学の書籍で本を買って勉強した。
基本的な入出力ができるようになった。
勉強の成果を生かして,鉄道模型制御用の簡易パワーパックを作った。
参考記事:Arduinoでつくる鉄道模型PWMコントローラ【基板実装編】
(プログラムについてはまだ記事にまとめられていないので,今後時間を作ってまとめてみたい)
Arduinoは,これまで登場した言語の中で,もっとも「道具」に近づいた言語だと思っている。
どういうふうになりたいか
数値計算や,xlsx,csv,datファイルなど実験データの効率的な処理を,自分でプログラムを組んでやれるようになりたい。
プログラムを「道具」として,ある程度自由に使えるようになりたい。
この「道具」を,自分の中で1本の軸にしたい。
ここでいう1本の軸になるレベルとは,以下のようなイメージ
- 基本的な文法は,何も見ないでわかる
- ふつうのアルゴリズムは,何も見ないで組める
- 「とりあえず」で試しごとをしたいときに,サッと使える
なお,「道具」にする言語は問わない。
(学部1年時の化学基礎の講義で,担当の教授が「何か1つ(CでもFortranでもいい)プログラミング言語を身につけておくといい」とおっしゃっていた。この言葉が今更になって身に染みる。)
このように道具を身につけることで,研究の本質(考えること)のために時間と労力を割けるようになりたい。
うまくいった経験の共通項
プログラムを自力で組み上げた例は,先述の通りいくつか存在する。
それらに共通していることは
「つくりたいものや目的が先に合って,アルゴリズムが湧いてくる。それを参考書やWebサイトをみながら,ソースコードに起こしていく。デバッグしながら,どうにか動くようにする」
こういう流れでプログラムを組んでいるということだ。
決して,その言語全部をパーフェクトに理解しているわけではない。それは,膨大なWeb上の成功体験談に見せられた理想でしかない。
言語全部を理解していなくても,目的を達成するために使う(書く)=どうにか作品に仕上げることの方が役立つと考えられる(これは,本やWebサイトを見ながらでもよい)。
「全然組めないが,ちょっとは組めた経験もある」
こういう状態の自分が考えるに,プログラムを組むときは
アルゴリズムを人間語で組む ⇒ ソースコードに落とし込む(文法書・Webサイト等々を参考に)
という手順を踏む。これが現実だ。
自分が,「道具」としてプログラミング言語を扱い,プログラムを一から組み上げるのに足りないのは
この矢印の部分(⇒)だと考えられる。
要するに,人間語で組み上げたプログラムをソースコードに落とし込む経験が圧倒的に足りない。
プログラミングの理想と現実の乖離,これが院生になっても一向に「道具」としてのプログラム言語が手に入らない原因だ。
どうすればよいか
たとえば助教の先生は
- 1,000行以上の行列計算プログラムをFortranで組める(文献はあり)
- FFTなど,データ処理のプログラムをPythonで組める
- 今度,また新しい数値計算用プログラムを組み始めるらしい(こちらも比較的大規模?)
決して計算工学が専門ではないが,ささっとプログラムを組み上げてしまう。
大学の先生や研究者であればこれくらいできて当然なのだろう。
自分も,この助教の先生くらいには書けるようになりたい。
このように,複数言語を使いこなしていくためには,軸として1つの言語が必要。
1つの言語さえ身に付けば,以降2つ3つ目の言語を身に付けるための時間は減っていくだろう。
==
現状を顧みると,その軸となる言語の候補はPythonかFortranだろう。
前者は幅広く応用ができて,後者は数値計算分野に強い。
どちらも,基礎だけはわかっている。今後,なにかひとつ「目的」を作って,その目的を達成するためのプログラムを組んでみることが必要だと考えられる。
まとめ:PythonかFortranで何かつくる
結論としては,
「なにかひとつ自分の手で作ってみること」
これを繰り返すことで,PythonかFortranを「道具」のように使いこなせるようになりたい。
*
M1前期は講義が多くて大変だけれど,ちょっとずつやっていけたらいい。
参考記事:大学を卒業して学士(工学)を取得しました / 大学院へ入学しました