町外れにある無人の館

そこにはお化けが出るという噂があった

プログラミングについての自分語り

はじめましての方ははじめまして。そうでない方はお久しぶりです。お久しぶりでない方は毎度お世話になってます。青鬼です

なんか目新しいことしたいなって思ってとりあえずはてなブログに思いのままになんかを書き連ねてみっかと思ったので適当記事を垂れ流そうと思います。まあゆるくいきまそ。

てことで今日は大学に入ってから個人的に一番自分の中でアップデートされてるものとしてプログラミングについて自分語りしていきます。プログラミングに触れたことねえって人でも読めるようにはしたい。

<追記>

今書き終わったけど、めちゃくちゃ時間かかったしクソ長くなった。なんでや

あと、プログラミングやってない人でも読めるようにしたい言ったけど、多少プログラミング用語的なの出てきてしまってる申し訳ない、でもなんとか分かるように書いたので許してちょんまげ

1. プログラミング歴

  • 高校2年春
    当時ハマってたMinecraftでmod作ろうと思い込んでプログラミングの知識なんも無い中でJavaの開発環境を親のパソコンに入れてmod作りしてた。今考えると相当アホなんだけど、環境構築の大変さを感じられたのは良かったのかな?

  • 大学1年夏
    大学入ったらもっとmod作りできるようになりたいって思ってたのでJavaの本を購入して初めて本格的にプログラミングを学んだ。だけど、こんときはほとんど理解できてなくてなんとなーくでお試しソフト作ってた気がする。
    あと、後々俺のプログラミングに大きな影響を与えることになるSparebeat(スペアビート)| 無料音楽ゲームに出会ってしまったのはちょうどこのころ。まだまだアホだよ

  • 大学2年春
    大学の講義でプログラミングがあり、そこでめっちゃ真面目にC言語を学んだ。
    人に教わるってやっぱ違くて、Java本で読んだけどようわからんかったプログラミングの概念的なものはこの講義で初めて理解できたと思う。
    その後Java本読み直したりしてオブジェクト指向の考えをある程度理解できたのは大きかった

  • 大学2年冬
    ちょうど1年前くらいですね、Sparebeatのdiscord鯖を覗いてたら有志の方がエクセルで作ったレートシステムと段位認定を見つけた。これweb上にあったらみんなおもろいんじゃねって思ってHTML/CSS/JavaScriptの基礎をなんとなく学んでなんとなく作ってみた。
    レンタルサーバー借りてドメイン買って…みたいなのも付随してたけど、プログラミングとは関係ないので無視。
    ここで初めてweb系に触って、C言語とかとの違いにびっくりしたのは覚えてる

  • 大学3年春
    web版レートシステムと段位認定が好評だったことに味を占めた俺はC#を学んでSparebeatの譜面作るやつを作ろうと画策してしまった。
    C#ってほぼJavaなのでJavaやってたおかげか基本的な文法とかはすんなり入ってきて楽しかった。まあなんとか完成して割と好評だったんだけど、C#の仕様とか汚いプログラムのせいでバグだらけのものになってしまった。直すつもりはない。

  • 同時期
    大学の講義でPython使うってことだったんでPythonもやり始めた。本当は1年後期でちょっと触ったんだけど、ほとんど覚えてなかったからこのときから始めたってことで。
    discordのbotも作ったりしたけどPythonって「こう書けたら楽なのになあ」って記述がマジでできるからすごいなあって何度も感動したよ、まあPython嫌いなんだけどね

  • 大学3年夏
    冬に作った色々酷かったSparebeatのレートシステムをリメイクした。アカウント制にしようと思って、ログインのイロハをググって色々見てたら書籍で学んだほうがいいなってことにこれ買った。

     

    パーフェクトPHP (PERFECT SERIES 3)

    パーフェクトPHP (PERFECT SERIES 3)

     

     借りてたレンタルサーバーで使えるサーバーサイドの言語がPHPだったこともあってPHPについて学んだ。この本読んでPHPをちょっとだけ使えるようになったは良いんだけど、まだ全部読み終わってなくてパーフェクトPHPになれてるかというと20%PHPくらいにしかなれてないと思う…時間できたら読まないとね
    この本だとMySQLとかも扱ってくれてたのが良かった。といっても古い記述が多かったからSQLについてはGoogle先生に頼りながらなんとかした。
    そんでもって出来上がったのがこれですね

    sparebeat-ratesystem.com
    JavaScriptの超有名ライブラリのjQueryも一緒に学んだりして、結構いい感じに仕上げられたと思う(今思うと全然アカン記述ばっかだけど)

  • 大学3年秋
    レートシステムの更新に合わせて段位認定も作り直せやって声がちらほらあったので段位認定も作り直すことにした。このときにGoogleの技術とかに触れたりもしたけど、一番の学びはVue.jsに少しだけ触れてフレームワークの重要性に気づいたことかな。Vueも俺ほとんど理解してないのでそのうち本格的にやってみたい
    なんやかんや完成した段位認定も最初は制限とかあったけど、いつの間にか無くなったりしてなんやかんや好評を頂いてた気がする。嬉しい限りだね

  • 現在
    そんでもって今はあるものを作るためにReactのお勉強中です。フロントエンドって難しいんだよ、ぼくちんしんじゃうよ

とまあこんな感じですね。言語として今までやってきたのをまとめると

って感じ。周りの話聞いてるとC++もやらんといかんなああって思ったりはするんだけど、聞く限りメモリ周りの管理だったり書き方だったりがめちゃくちゃ嫌いだからなかなか手を伸ばせずにいるし、やれって機会ないとやんないかな~って気はしてる。

Node.js書いてないけど、あれ環境であって言語じゃないからJavaScriptの中に含まれてるって感じで。ブラウザのJavaScriptとはだいぶ違う気がするけどね。

あととりあえず2019年はめっちゃ濃かった。色々学びまくったし今後に生かしていきたいね

2. プログラミング難しくないよって話

ここまで歴を整理してきたけど、ここからは一般化してプログラミングのススメ的なものを消化していこうと思う。プログラミング難しくないよ!!!

2.1 プログラミングは誰でもできる

よくあるプログラミング始めたてで見る問題FizzBuzz問題を例に取り上げてみよう。

FizzBuzz問題ってのは以下の問題のことだ。

「1から整数を数えていって、3の倍数のときは『Fizz』、5の倍数のときは『Buzz』と出力する。3の倍数かつ5の倍数のときは『FizzBuzz』と出力する」

じゃあ下に数字並べてくから心の中で「Fizz」とか「Buzz」とか「FizzBuzz」だの言ってってほしい。いくでー

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24疲れた

倍数がわからないとちょっと厳しいが、でもだいたいの人はちゃんと言えたはずよな?例えばこれをJavaとかで実装するとこんなコードになる。

static void fizzBuzz(int num, int max) {

    String voice = "";

    if (num % 3 == 0) {

        voice += "Fizz";

    }

    if (num % 5 == 0) {

        voice += "Buzz";

    }

    System.out.println(voice.isEmpty() ? num : voice);

    if (num < max) {

        fizzBuzz(num + 1, max);

    }

}

今適当に書いたから間違ってたらアレだけど、多分合ってるとは思う。これでfizzBuzz(1, 100);とか呼び出せば多分3の倍数と5の倍数以外のときは数値が出てきて、Fizz Buzzもちゃんと叫ぶはず。

中身はどうでもいいんだけど、実際見てみると処理って結構短く簡単に書けるってことがわかってもらえるかね。

俺自身経験浅いし、他知らないから実際現場がどうなってんのかはわからんが、プログラムで書く処理の1つ1つって実はこれと同等のものがたくさんあるだけなんだよ。この処理内容が難しく感じる人って中等教育をしっかり終了してればさすがにいないよね…?いる?いるんすか?いたらごめんなさい、あなたプログラミング向いてないのでこのブログはそっ閉じしてやってください。

まあとにもかくにもプログラムの中身で記述すんのは小学生でもわかるくらいの処理内容で十分で、それをたくさん作ると大きなアプリケーションになるというわけじゃ。

なんか簡単そうじゃね?

 

2.2 難しくないのになんで人々は挫折する?

 

処理内容自体は小学生でもわかるもので十分と言った。それでも実は「プログラミングわかんない」って言う人ってかな~りいるんだよね。これ俺の大学の中での話ね。俺の大学がバカ大学なだけか。おかしいな、バカ大学とは呼ばれない程度の大学には来てるはずなんだけど…

これ俺の周りだけの話になるんだけど、プログラミングが苦手と思われる人ってだいたいこんなことを言ってくる。

「main関数で全部書く」

だいたいのプログラミング言語って関数っていうので機能を小分けすることができるんね。上で書いたやつはfizzBuzzっていう名前の関数を書いてる感じ。C言語とかJavaとかなんかだとmain関数っていう特別な関数の中の処理が実行される仕組みになってて、main関数の中に実装中に作った関数を記述してその関数を実行することができたり。

具体的にはこんな感じ。

 

public static void main(String[] args) {

    fizzBuzz(1, 100);

}

 

main関数内に直接処理書いてももちろん実行はできるからmain関数内に全部の処理を書くっていうさっきの言伝は不可能じゃないんだよ。

ただ、それやるとね、そりゃあもう巨大な処理を1から間違えずにずっと書いてかないといけないんだよ。んで、もし間違えてたらどこで間違ってるのか見当もつかない。そんでもって、いつまでも思った通りにできないから夢見りあむみたいにやむ。そしてプログラミング難しいと嘆く。

大きな処理は細かい処理に分解して1つ1つ確実に作ってから最後に合わせるみたいにしたほうがバグの除去とかもやりやすくなるから処理は分割するべき。

これってコードを書く前に全体像とそれに必要なパーツを設計する操作が抜けてるとやりがちなことなんだと思ってる。プログラミング苦手だって言う人ってだいたい課題が出てすぐプログラム書き始めるんだよ。絶対設計抜かしてるだろ。

 

つまり、プログラミングの実装に大事なのって適切に設計、分割ができるかってとこにわりとあるのよ。

これさえできればなんか適当に書いてりゃそのうちなんとかできる。リーダブルコードとか気にしたほうがいいのは確かだけど、そんなもん後だ後、動きゃいいんだよ動けば。動いたときの感動を知るとプログラミングがどんどん楽しくなって楽しくなるよ。

 

※概念の理解が難しいコンテンツ(ポインタや参照、オブジェクト指向の考え方、CSSのスタイリング等々)は確かに難しいけど、その難易度はまた別のもんだと思ってるんでここでは無視します。

3. みんなプログラミングして何か作ろうぜ!

最後になるけど、クリエイター的なプログラマーってTwitterエゴサしてもだいたい仕事でやってるか #今日の積み上げ とかいうよくわからん意識高いタグ付けしてる人間しかいなくて、インターネットオタクたちがやってるプログラマーって競プロ界隈くらいにしかいなくて寂しいんだよね。

あ、競プロってあれ数学だし俺はプログラミングとは認めてないし、これからも認めるつもりないんでそこんとこ4649

だからさ、何か作りたいものを見つけてさ、俺といっしょにプログラミング学んでいこうぜベイベー