Skip to content

Instantly share code, notes, and snippets.

@kaosf
Last active January 16, 2020 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kaosf/dfe88f3922a97201e126770ccdfd8107 to your computer and use it in GitHub Desktop.
Save kaosf/dfe88f3922a97201e126770ccdfd8107 to your computer and use it in GitHub Desktop.
プログラミングでつまづいてきたこと

プログラミングでつまづいてきたこと

インスパイア元

歴史を思い出して書いてみる.

BASIC

元々HTMLとCSSを直書きしサイトを運営していたのとそもそも早くからインターネットに接続出来る自分のPCを持っていたという背景がある.

数学Aの教科書にBASICが載っていた時代の人間でありそれを紙の上でシミュレートしていたのがプログラミングの原体験である.実際にBASICを動かせる環境は整え方を知らなかったし今でも知らない.

数学は好きだったので教科書のそこだけ授業では触れないというので自分で読もうとした.そもそもPCにも慣れていたのとRPGツクール(主に3)が過去に流行っていてそれをやっていたこともあり,上から下に命令が流れ条件分岐をするものでゲームは動いているということは理解していた.

変数に値を保存しておく,ひとまとまりの処理はサブルーチンとして切り分けることが出来る,ということは特に苦もなく理解出来た覚えがある.ちなみにサブルーチンの話なのでここではまだ関数の理解は無い.

そこで唯一躓いたのは,割り算の筆算のアルゴリズムの理解である.普段自分がやっていることをプログラムを書いて機械にやらせるには,なるほどこんな細かいところまで思考のステップを分割して考えなければならないのか,確かに自分は割り算の筆算を行う時にこのループを繰り返しているのだ,ということを理解するのにしばらく時間を要した.というかBASICばっかりやってるわけにもいかないので一旦放置していて,後になってから理解した覚えがある.

C, C++, Java

C言語

少しBASICの話と前後するところもあるが,次に,というより最初にまともに触れたプログラミング言語はC言語である.

まずここで最大限につまづいたのは,C言語のコンパイラを使えるようにすることである.全く分からない.何も分からない.そもそも2003年頃(だったはず)にWindows 98を使っていたため,Windows 2000やXP向けに書かれている解説がことごとく分からない.

本当に何も理解していないまま,苦労の末,ほとんど偶然,Borland C++ Compilerという無料のコンパイラとCPad for BCCという無料のエディタを使ってHello worldをするまでは漕ぎ着けた.

この後も,開発環境の構築という点では色んな知識が欠落していたことから常につまづく人生を歩むことになる.Direct X分からん,Visual C++買ってみたけどGUI作るの全然分からん,Perlのインストール分からん,Rubyのインストール分からん,などなど.

なおお気付きの方は居るかもしれないが,実はここで自分が触っていたのはC言語ではなくC++の方であった.その違いを意識出来るようになったのも相当後になってからである.

そして開発環境の構築というのは,実際未だに苦労をする点である.ハッカソンイベントを何回か主催したこともあるが,他人のそれでも苦労する.環境構築が出来ればイベントは9割成功だと思っている.

C言語そのものの話でつまづいた点はいくつもある.ただしつまづきを大まかに分類すると,ポインタや配列の話とコンパイラそのものということになる.

まずつまづいたのは配列を引数に渡す方法である.配列を使うだけというのは入門書などでも出てくるので分かる.しかしそれを関数に渡したいとなったとき,途端にC言語は牙を剥く.ポインタである.最初はここが本当に何も分からず,何かよく分からんがこうしたらいける,みたいなのでフワっとやってた.この時点ではまだ何か実際に役に立つものを作ってたりはしなかったので,出来ないことは出来ないでいいや,で放置していた.

後になってポインタ,配列,メモリ,スタックマシンの概念を説明してくれている本に出会うまで本当の意味では何も理解していなかった.

若い人はこんな苦労しなくていいと本当に思う.C言語はアセンブリ言語のシンタクスシュガーとはよく言ったものである.勉強することは止めないがこれで何かアプリケーションなど作ろうと思わないことである.さすがに2020年にそういう人も居ないと信じたい…

もう一つつまづいたのがソースファイルの分割方法である.C言語やC++は,聞いたことがある人も居るかもしれないがソースコードをコンパイルした後にリンカで結合して実行可能なファイルを作る(その間にも色々細かい処理はあるが面倒なので言及しない).コンパイルされるためは後でリンクされるために必要な情報を持つ必要があり,そのために関数のプロトタイプ宣言を定義とは別にしかもソースコード中で使う時点よりも先立って行わなければならない,という非常に面倒くさい話が存在する.この辺が初学者に本当に理解出来るとお思いか?この辺りの話が分かっていないとヘッダファイルとは何なのかが理解出来ないことになる.このため私はやはり長い間,自力でソースコードを分割する術を知らなかった.IDEに突っ込んどけばなんか知らんがその辺は全部面倒見てくれるらしい,というので実際に面倒を見てもらって,それを使わなければソースコードの分割が出来ない人間として人生をそれなりの期間過ごしていた.もちろんそんなわけなのでまだ何も役に立つものを作ってたりはしなかった.

この辺りはMakefileの勉強などをする頃には段々理解出来るようになってきた.

あと私は基本的にIDEが無いと何も出来ないという状況には反対の立場をとっている.よく言うのだが「出来ないからしない」は基本的にダメで,「出来るけどしない」になることが絶対に必要であるという考えでいる.既にポエム度合いが非常に高い文書を書いているなという自覚はあり,それをここでこれ以上高めるのは避けたく,これ以上言及はしない.

ただこの辺,ファイル分割云々の話,2020年においても実はIDEおよびそれに準ずるツールに解決させる,が最適解だと思う.原理はもちろん知っておく必要はあるだろうというのは先述の通り.ただその辺は深く突っ込まない人生を過ごしたので,automakeとか何かそういうのはよく知らない.あとそもそもC言語でアプリケーションを作ろうとしない(大事なことなので2回言いました).

C++

C++0x が出るぞ出るぞと言われ続けて実際に出たのは C++09 じゃなくて C++11 でしたドヒャーというのを生で見てきた自分ではあるが,つまり実際に触っていたC++は C++03 である.

分からなかったのはBoostライブラリだった.スマートポインタが扱えるようになるらしい,無名関数が書けるようになるらしい,などと色々魅力的なあれこれを非常に活用したいと思ってはいたのだが,まだこの時代自分は環境構築が上手くいかない状態で,Boostを使えるようにする方法も確立出来なかった.これはC++11の登場によって結果的に何もしてないが解決するという流れになる.

ただ,C++自体をそもそも使わなくなってしまうので,自分のC++はC++11止まりである.そんなこんなしてるうちにRustなんてものまで出たので次なんか低レイヤーなことをやるならもうRustだな…となっている.

ちなみにC++03のSTL辺りまでの理解は大体出来た.TMPは「なるほど人類は頭おかしい人がたくさんいるんだな」ということを理解させてくれた.圧倒的感謝.

STLでつまづいたのはファンクタとバインドで,最初よく分からなかったな.

Java

JavaでつまづいたのはReflectionである.あと謎のアノテーション地獄.何がそんなに嬉しくて謎の仕様を自分から増やして行くんだろうかと,ここは未だに分からない.とか言いつつRSpecのDSLにもう慣れたりしているので,結局は慣れなんだろう.

ただこの頃になってくるともう言語仕様が分からないということは起こらなくなってくる.一つ言語を理解したら他は簡単だよ,なんてのが分かってくる.ただし,これはその後Lisp,OCaml,Haskellに出会いそんなものは幻想であると知る.

Javaは他にはJavaで躓いたというより,やはりこれもライブラリのインストールやEclipseのプラグインの設定などで躓いていた覚えがある.

Javaも何だかんだで触らないようになってしまったので何も解決していない.

クロージャとレキシカルスコープ

クロージャとレキシカルスコープでつまづいた記憶がある.まず用語の意味が分かってない.

クロージャはメソッドが1つしかないクラスだよ,って言う説明は意味が分からなかった.

この2つはペアにして理解しないと理解が出来ない気がする.

そしてクロージャは無名関数というか関数をその場で作れるということが理解出来ていないと無理だと思う.ただしこれはC言語系のプログラムの経験がウェイトの多くを占める人の,つまり古い人間の場合だ…

この理解が出来るようになるためにLuaやSquirrelでの経験が役に立ったような気もするしそうでない気もする.

RubyやJavaScriptを普通に使うようになってきて,気付くと割と当たり前のものだなと認識出来ている自分がいるようになっていた.

VCS

Subversionのブランチとタグが使いこなせないまま,Gitを覚えた.MercurialではなくGitにBETしていて得した人生であった.

今Gitなしで何か開発に携わる業務を行うことは考えられない.

まとめ

やはりポエムになってしまった.

とにかく初学者の最大の敵は環境構築であるという信条がこの人生では形成されてしまっている.人格にも大いに影響を及ぼしていることだろう.

なのでそこで詰まってしまう人を減らすべく頑張れることを頑張っていきたいという思いがあるが,案外それすら時間が解決してくれるのかもしれない.

大きな歴史の流れの前に個人の力はちっぽけである.

あと,最初に苦労したことというのはよく覚えているものだなぁと感心しつつも,いくらか自分でも気付かないような捏造もしているんじゃないか?という気もしてくる.過去の日記とか漁ればいいんだろうけど,うーん,それは面倒くさい,という思いと,そもそもそんなに律儀に記録してないので参考にもならんだろうなという思いとがある.

今つまづいていること

k8s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment