プログラミング

大学のプログラミングの授業の鬼なところ

大学のプログラミングの授業の鬼なところ

最初にC言語をやるところ

結構多くの大学のプログラミングの授業で、最初にC言語(又はJava)をやるかと思います。まずこれが鬼です。

理系であっても、プログラミングをバリバリやったことのある人は恐らく少数派だと思うので、その状況でC言語をトップバッターに持ってくるのは荷が重すぎます笑

C言語が重要な言語であることは確かですが、「最初にやる言語」として心の底からおすすめする人は少数派だと思います。

C言語の鬼なところ(初心者にとっての)

他の言語にはデフォルトで装備してある機能がない + 直感的に分かりづらい

例えば、プログラミングをやっていると、配列の長さを求めたい場合がよくあるのですが、c言語とその他の言語のコードを比較してみましょう。

list = [1,2,3]
print(len(list))

# 出力結果: 3
#include <stdio.h>

int main() {
    int array[] = {1, 2, 3};
    int array_length = sizeof array / sizeof(array[0]);
    printf("%d", array_length);
    return 0;
}

// 出力結果: 3


上がPython, 下がC言語です。配列の長さを出すだけでも4倍のコード量になってしまいます。

しかも、C言語は読みにくいです。sizeof arrayをそのまま訳せば「配列のサイズ」なのでそのまま出力すれば良さそうですが、そうはいきません。その後ろのsizeof(array[0])はもっと意味不明です。

これは、C言語に配列の長さを返すメソッドがデフォルトで存在しないのが原因です。このように、普通の言語にはデフォルトで装備されているものがCにはなかったりするのでかなり読むのに手こずります。

今回は簡単な例で示しましたが、規模が大きくなってくるとさらに複雑で読みにくくなっていきます。

ポインタ、構造体、配列が分かりづらい

ポインタと構造体はある言語とない言語に分かれます。ポインタを気にしなくても書けるような言語だとclassなんかがある場合が多いですが、classに比べて、ポインタ、構造体は難しいと思います。

ポインタが難しいと言っても、最初から難しいわけではなく、以下のようなコードについては、少し勉強すれば0ではなくて10が出力されることが理解できます。

#include <stdio.h>

int main() {
    int n = 0;
    int *p = &n;
    *p = 10;
    printf("%d", n);
    return 0;
}


ただ、ポインタ周りでは、アスタリスク(*)やドット(.)、&、->(アロー演算子)、ダブルアスタリスク(**)など色々な記号が混乱を誘います。というか、そもそも「いつポインタ(や構造体)を使うのか?」という点でつまづいたりするので、「書きにくいし読みにくい」概念になります。

さらに、プログラミングで重要な役割を持つ配列ですが、C言語は配列でポインタを結構使うので、ポインタが理解できないまま配列を弄っても大したことができません。

プログラミングは、配列やマップ(辞書型)を上手く使えれば表現の幅が格段に広がりますが、ポインタでつまづいたらいつまで経ってもしょうもないプログラムしか書けないので、挫折率が高くなりがちです。

化石みたいなエディタを化石みたいな使い方で扱う所

僕の大学のプログラミングの授業では、エディタとしてEmacsVimを紹介されました。そして大体は(僕も含め)Emacsを使っていたと思います。

別にEmacsとVimどちらを選んでも良いのですが、問題はその使い方です。

学生の95%くらいは(僕も含めて)Linuxの端末上でチマチマコードを打っていました。数行程度のプログラムならまだしも、これは21世紀におけるまともな書き方ではないと思います。


普通は以下のようなソフトウェアをインストールし、その上でコードを書いたり実行したりします。



もちろん、どちらともしっかり動き、出てくる結果も当然一緒ですが、前者のような石器時代的方法でコードを書いていた結果、様々な惨事に見舞われました。

コード補完が皆無なため、タイポを量産しプログラミングが嫌いになる

VSCodeやAtomなどのエディタは、プログラミングがしやすいように強力なコード補完機能が付いています。タイポ(タイプミス)や、セミコロンをつけ忘れたりした時は、自動的に該当箇所に波線が引かれ、コードを実行する前に修正することが容易になります。

端末上で書く場合にはそれがないため、コードの量に比例して大量のエラーが吐き出されます。いくら修正しても、別のところでタイポをしているとまたエラーが吐き出されます。もっと厄介なのが、エラーを一つ一つ潰して出力されるエラー文が少なくなっていき、最後の一箇所を直して再び実行すると、それまでの10倍の量の意味不明なエラーが吐き出されます。

また、コード補完がないと、必然的にコードを書く時間が長くなり、ストレスがたまります。

誰が見ても理解できない変数名、関数名が大量発生する

コード補完がないと、タイプミスをしないように変数や関数の名前が必然的に短くなっていきます。

そうすると、挙げ句の果てには変数名はa, b, c... 、関数名はf, g, h...みたいになって一体何についてのコードなのかがさっぱり分からなくなります。もちろん書いた本人も分かりません。

#include <stdio.h>

int f(int n){
    int m = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n + i; j++){
            for (int k = j; k < j*j; k++){
                m += k;
            }
        }
    }
    return m;
}

int g(int n){
    int m = 0;
    for (int i = 0; i < n; i++){
        m += f(i);
    }
    if (m % 3 == 0){
        return m;
    } else{
        return m*3;
    }
}

int main(){
    printf("%d\n", f(10));
    printf("%d", g(11));
}


全てが端末(ターミナル)上で完結する

プログラミングと言っても、何かロボットみたいなのを作ったり、何かのSNSのクローンを作ってデプロイしたりといった、分かりやすい成果物を作ることはありません。

全てはLinuxの端末上で完結します。コードは先ほど見せたような化石に書き、実行するときは端末上でコマンドを実行してコンパイルとランを行います。正直味気ないです。

最初から最後まで、「それ作って....どうなる?」感を払拭することはできません。せめて端末上で完結するなら、APIとか使ったら少しは楽しくなると思うのですが、それもないです。それ以前に、APIどころかサードパーティーのライブラリ自体まともに扱いません。一生#include <stdio.h>のままです。

極めつけはレポートです。大体レポートはLatexで書くのですが、それすらも端末上で書きます笑

レポート課題になった途端に難易度が2000段階上がる

ただ、なんだかんだ言って、プログラミングに対する興味が失せつつも、授業でやる簡単な練習問題についていくのはそれほど難しいことではありません。

しかし、レポート課題になった途端に難易度が極端に上がります。例えると、数学の教科書の練習問題を解いた後に急に東大や東工大の入試問題を解かされるような気分です。

その、あまりの難易度差に教室がざわつくのですが、先生は大抵決まって「まずは問題を分解して考えてみることが大事です。」というのです。これは「お腹すいた」くらい意味のない言葉です。

もちろん、ある程度プログラミングができるようになれば問題を分解して考えるのは当然なのですが、初心者にそれを言っても手は動きません。まあ、今思えば教員側はそれ以上アドバイスしてしまうと学生が考えなくなるのであれが最適解だったのかもしれません...

とりあえず、絶望の淵に立たされた僕たちはなす術がありません。初日は1行もコードが書けないなんてザラですし、仮に書けたとしてもどうせfとかgのようなふざけた関数名や変数名をつけるので、次の日には何のコードかさっぱり分からなくなります。

最終的には、僕も含め、みんな出来る人のところに集まり、「すまん!ここの部分だけ見せて!」というのを20回くらい繰り返して最終的には丸パクリに近い感じになります。

そんなこんなでコードを書く(=入手する)まではいいのですが、コードを見ても何が書いてあるのかほとんどわからないため、レポートは騙し騙し書くしかありません。

そして、レポートを書き終えて提出したら、それまでに習ったことは全て頭の中から消えます^^

  • この記事を書いた人
おととらべる

おととらべる

プログラミングで小銭を稼いだり、音楽を作ったりしている理系大学生です。 一人旅で次に行きたい国は、 エジプト、アルバニア、アルゼンチン、ボツワナ、ナミビア、オマーンです。

-プログラミング
-, , , , , ,

© 2021 おととらべる Powered by AFFINGER5