現状

今の職場では、明らかにアプリケーション層でC++を使った方が効率がいいのに、C言語しか使えない人が多くてC言語を使ってる。
C言語では名前空間が無いから、あるファイルのファイル内変数と他のファイルのグローバル変数が同じ名前で誤解の元になったり、Prefixつけまくりで関数名や変数名がめちゃめちゃ長くなったり、モジュール分けがファイル単位でしか出来ないから1つ1つのファイルがでかくなって内容を把握しきれなくなってる。
中身が違っても構造が全く同じコードがあちこちに大量にある。それどころか、static変数を使ったモジュール化ではマルチインスタンスが難しいので、完全に同じコードがあちこちにある。たとえば、

class LoopCounter {
public:
  LoopCounter(int N) : N_(N), i(0) {};
  void next() { i_ = (i_+1) % N_; };
  int get() { return i_; };
private:
  int i_, N_;
};

とすれば良いものを、必要なところすべて(数十箇所)で、

int hogehogeCounter; //グローバル変数.
void foo(void) {
   i = (i+1) % 2;
   nanika_suru( nanika_resource[i] ); // nanika_resourceは2個あり、交互に使う.
}

void bar(void) {
   i = (i+1) % 2;
   nanka_suru( nanika_resource[i] );
}

見たいな感じのコードがいたるところにある。
中身が違うだけで構造が同じswitch文が大量にある。switch文が占めるコードの比率がおかしいくらい高い。
関数単位でテストしてるけど、バグは関数と関数の間で起きる(1つの関数を正しく書くのは簡単だけど、関数を組み合わせて正しく動くプログラムを書くのは難しい)から、全く意味無い。
状態の管理責任をclass単位に割り振れないから、数万行のソースコードで、100個を超えるグローバル変数を、不整合が起きないように気をつけて更新していかないといけない。もちろん、そんなの人間の記憶力じゃムリだから、確実に漏れる。そして関数テストでは見つからない。

なのに、OOPが判らない人は、これがおかしいと感じなかったり、おかしいとは思っても「じゃぁどうすればいいか」が判らない。
OOPは現代プログラマの基礎教養だ。OOPができなくてプログラマ名乗ってるんじゃねぇよ。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。