2008-10-25

プログラマになれません

私は今某社でWebアプリ開発の補助をするアルバイトをしている。一応少しはコードを書く。でも、自分はプログラマじゃないな、と思う。素敵なアルゴリズムを考えたりもしない。アプリの設計は当然社員さんがやる。私がやることと言えば、機能追加のための簡単なコードを書いたり、簡単なWebアプリフレームワーク勉強しつつ書いて、見た目をCSSで整えて、そんなことだ。

やりがいを感じないわけではない。やっぱり自分の書いたコードが上手く動けば嬉しい。でも、プログラマの壁を読むと、何となく自分はコーダーになれてもプログラマにはなれないような気がしてくる。一応FizzBuzzは解ける。以下、そのコード。※追記参照

#include <stdio.h>

int main(void){
  int i;

  for(i=1; i<=100; i++){
    if((i % 3 == 0) || (i % 5 == 0)){
      if(i % 3 == 0)
        printf("Fizz");
      if(i % 5 == 0)
        printf("Buzz");
      printf("\n");
    }
    /* 以下二行と返り値追記 */
    else
      printf("%d\n", i);
  }
  return 0;
}

アルゴリズム自体は多分2分足らずでもやっと思いつき、書いてる途中で脳内もやっとを形にできた。でもCの文法を忘れていて、コンパイルを通すのに独習Cを調べつつ、5分くらいかかった。

その時に、(i mod 3 = 0)とか書いてて、なんか自分はやっぱりダメなんじゃという気にさせられた。代入と比較の区別がついてない。そういえば先日も、編集してるファイルが違ってたとかカンマをつけ忘れてたとかでエラーがでてるのに、それになかなか気がつかなかったり、if文の条件が成立する場合としない場合を逆に考えてしまったりと、そんなぼんくらミスばかりしている。

そんなときに、「ああ、自分ってプログラマ向いてないのかも」と感じさせられる。

そしてなにより自分がプログラマに向いていないと思うのは、知的探求心の問題だ。プログラマを志していたがその道を諦めた友人に、なぜプログラミング勉強をやめたのか?と聞いたとき、彼から帰ってきた答えはこうだった。「この道に進んだら一生勉強しなきゃいけないから。自分にはそんなことはとても無理だと思った」この答えを聞いたとき、でもプログラミング勉強だったら楽しくないのかな?と思った。しかし自分を省みたとき、私自身もそう熱心にプログラミング勉強をしているわけではないことに気がついた。Macに入っている一通りの言語でとりあえずHello!World!を書いたりしたが、だからといってそれらの言語の得手不得手がはっきりわかるまで勉強したわけではない。文法だって忘れてしまった。アルゴリズムを熱心に勉強したことはないし、なにより自分は最も唾棄すべき「とりあえず動けばいい」と思っている人間だ。エラーがでてそれを直しプログラムが動いたとき、なぜそのエラーが出なくなったのか?なぜ動くようになったのか?そうしたことを納得がいくまで調べることは滅多にない。なんとなく、ああいう理由なのかな?と考えて、それだけですませてしまう。もう一度書くが、自分が書いたプログラムが思った通りに動いたときは楽しい。でも、そこで止まってしまうのだ。なぜ動いたのか?それを徹底して考え、理解してはいない。

今のバイト先の開発チーフには、いつもこの点を注意される。なぜそれでいいのか徹底的に考えろ、ドキュメントをちゃんと読め、関数の挙動がわからなかったらソースを読め、と。でも正直、動いてくれたらそれでいい。さすがにライブラリドキュメントを読む癖は多少ついてきたが、けれどもそのソースを読むところまでは正直頭が、気持ちが回らない。

だから、自分はプログラマになれないと思う。いつまでたってもコーダーのままだろう。

プログラミングはとても特別な才能がいる仕事だと思う。それは、アルゴリズムデータ構造オブジェクト指向などといった抽象的なものごとを理解し、それを具体的なソースコードに落とす頭だけではなく、ものごとについてとことん考える知的探求心も必要だ。その二つを満たす人こそがプログラマなのだと、一コーダーなりに私は思う。

だから私は、プログラマになれません。

【追記】

さすがに仕様を満たしていないのは恥ずかしいので直しました。こういう間抜けなミスをするところがなぁ…orz

mainについて熱くなっている方々の話にはいまいちついていけないのですが、私はこれをCで書いたつもりですし、戻り値がないことにも警告はありませんでした。コンパイラgcc version 4.0.1 (Apple Inc. build 5465)です。

  • main(void)とか、intの関数のくせにreturn値なしとか、ふざけてるの?死ぬの? とか思ったがそれは置いといて。 アホか。 勉強しなきゃならないのはどんな職業でも一緒だよ。そんなのバイ...

    • C99及びC++では値を返さなければ0を返したことになるんだな。 死んじゃうのはあなたのほうかもしれないよ。

      • 嘘言うな。 X3010 105頁 6.8.6.4、79頁6.6.3 2節には 「戻り値の型がvoid(値を返さない)と定義されている場合を除いて、式の省略はできない」 と書かれてるぞ。 おい、お前の言ってる0を返すっ...

        • まず、1999年版を見てるよな?C90じゃなく。 で本題だが、main関数についての特例があるからもっとよく読んでご覧。

          • 補足。C++(14882:2003)だと、3.6.1の5に書いてある。 Cはいま手元にないので自分で探してね。

          • ソース出せという問いに、その反応で満足するやつはプログラマじゃないな。 で、俺は思うんだが元増田がC99あるいはC++であるという根拠は全く無いし、業界標準であるgccだってC99準拠...

            • やれやれ、面倒くさい子だね。Cのpdfを眺めてみたよ。9899:1999の5.1.2.2.3に載ってるから確認してくださいな。 GCCについてはここを見てね。http://gcc.gnu.org/c99status.html 鼻息荒いからからかっ...

              • 別増田なんだけど、戻り値無くてもいいとは言われても、世に出てるコンパイラの殆どが警告出すんじゃないの? gccもVC++も出すよね。 警告無視派?「linuxカーネルなんて何百行警告出る...

                • 警告無視派じゃないよ。むしろ警告をエラーとして扱う派。 int main() {} については、g++だと-Wall -Wでも警告なし、gccだと警告あり、gcc -std=c99だと-Wall -Wでも警告なし、ですね。

                  • ええええええーー じゃあ、gccで警告出るんだから、エラー扱いしろよ。 何擁護してるの?バカなの、やっぱり死ぬの?

                    • だからね、あなたにとっては古いCが世界の全てかもしれないけれど、世の中全てのひとがそうじゃないんだよ、前提はいろいろなんだよ、と言ってるわけ。 多様な前提を許容していない...

                    • だからね、あなたにとっては古いCが世界の全てかもしれないけれど、世の中全てのひとがそうじゃないんだよ、前提はいろいろなんだよ、と言ってるわけ。 多様な前提を許容していない...

  • 向いてないことに早めに気付けて、よかったんじゃないの 自分の適性にあわないことを続けてもねぇ。。。

  • あの…、なんかmain()の仕様で熱くなってる人が居るところ申し訳ないんですけど このFizzBuzz、仕様満たしてないようなきがするんですけど、そこは突っ込まないんですか。

    • すばらしい指摘すぎて全俺が泣いた。 Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of bot...

  • これはwwwww。 mainで議論してるやつ恥ずかしいwwww なんで気づかないのm9(^Д^)

  • そして元増田はDNBK

  • http://anond.hatelabo.jp/20081025202001 トラックバック熱いなーw

  • まあトラバが示しているようにどうでもいい事で悩みこむ性格じゃないとダメだから、むしろなれないほうがいいかもね。 あと、別にコーダでも会社や社会の役に立つし、優秀なプログ...

    • ただ、コーダとなると、韓国人やらインド人やらが幅を利かせてるから、日本人じゃそもそも仕事が取れないわけで。 最低でもプログラマにならないと、そもそも仕事ないんだよ。 特に...

  • http://anond.hatelabo.jp/20081025202001 のコード見ると 3と5の除余判定を2度やってるでしょ。これって1回にまとめられないかな。 いや、別に2回処理やっても良いんだけど、 「3じゃなくて4に...

    • #include &lt;stdio.h&gt;int main(){ int i, j = 0; for(i=1; i&lt;=100; j = 0, i++){ if(i % 3 == 0) { printf(&quot;Fizz&quot;); j = 1; } if(i % 5 == 0) { printf(&quot;Buzz&quot;); j = 1; } if (j) { printf(&quot;&#92;n&quot...

      • フラグを導入するっていうのは一つの手だけど 今度はプログラム中でフラグを管理する必要が出てくるじゃない。 プログラムの中で管理する「状態」は極力減らせっていう鉄則 (何に書...

        • じゃぁ再帰で。 int fizz_buzz(int i, int j) { if(i % 3 == 0 &amp;amp;&amp;amp; j % 3 != 0) { printf(&quot;Fizz&quot;); return 1+ fizz_buzz(i / 3, j * 3); } if(i % 5 == 0 &amp;amp;&amp;amp; j % 5 != 0) { printf(&quot;Buzz&quot;); r...

          • さっきのはあまりに汚かったのでちゃんと書いたよ!! static int do_fizz_buzz(int num, int rem, const char* str, int print) { if (num % rem == 0) { return do_fizz_buzz(num / rem, rem, str, 1); } if (print) printf(&quot;%...

            • printf("%s", str); printf(str);又はputs(str); "%s"をパースする時間がもったいない とかどうでしょうか?

              • 後者がいいんじゃないかな。前者だと一部コンパイラだとセキュリティ警告が出ると突っ込まれるかもしれない。 この流れだとw

              • Thanks. 確かにそうなんだけど、putsだと勝手に改行が出力されてしまうので一ヶ所しか使えなかった。DRY、forなし、ifなし(:?使ってるのでインチキだけど)、main以外に関数なし風味。これで...

                • for を再帰で代替するなんて、どういうメリットがあるの?

                  • for を再帰で代替するなんて、どういうメリットがあるの? 逆だよ。ループ構文が再帰の一種なの。 だから代替するってのはちょっと違う。

                    • ループが再帰処理の一種・・・? 再帰処理って処理を停止して新しい処理を行い、終了後に停止していた処理に戻ることじゃない? 処理A -&gt; 処理B -&gt; 処理A が再帰処理の名前の由来で...

                • http://anond.hatelabo.jp/20081026002746 ステートマシン大好きっ子としては書かずにいられない もう少しがんばればforも無くせるな fsmの中身ってDRYなの?的な話もあるだろうが,こんなもの他の...

                  • FizzBuzz続き Cにもlambdaがあればいいのに #include &lt;stdio.h&gt;#include &lt;unistd.h&gt;#define FALSE 0#define TRUE !FALSEtypedef struct state_t { int state; int num; int max; int outputted;} state_t;typedef struct fsm_t { ...

                    • なんでここまで簡単な要求を、ここまで複雑に書く必要があるのか、サッパリ理解できません。 それがプログラマというもの? だったら僕はプログラマになんかならなくてもいいや。

                    • じゃ、少しだけ本気出してみたよ。要求仕様にかなうといいんだけど。 #include &lt;stdio.h&gt;int main(void) { puts(&quot;1&quot;); puts(&quot;2&quot;); puts(&quot;Fizz&quot;); puts(&quot;4&quot;); puts(&quot;...

    • 全然DRYじゃないけど、 #include &lt;stdio.h&gt;#define FIZZ 3#define BUZZ 5int main(void){ int i; for(i=1; i&lt;=100; i++){ if((i % FIZZ == 0) || (i % BUZZ == 0)){ if(i % FIZZ == 0) printf(&quot;Fizz&quot;); if(i % BUZZ =...

  • javascript ではこうか、こうでいいのか? window.onload = function() { for(var ix = 0; ix &lt; 100; ix++) { var p = document.createElement(&quot;p&quot;); var text = ix + &quot; : &quot; + fizzBuzz(ix); var textNode = document.cre...

    • いいけど、ifなしforなしfunctionなしで書けたらもっとカコイイ

      • function はなしにできるけど、可読性のためにあったほうがいい。 私なら内部関数にしてでも切り離す。 if なしは以下でできるけど、これは if でやっても変わらないのでは。 text = (counter...

  • プログラマになれません http://anond.hatelabo.jp/20081025202001 今のバイト先の開発チーフには、いつもこの点を注意される。なぜそれでいいのか徹底的に考えろ、ドキュメントをちゃんと読め...

  • いまさらだがFizzBuzz。 1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね? というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。 定数計...

    • ん?ん? なんだ・・・? そんなの計算するまでもなく writeln("Fizz"); writeln("Buzz"); とか記述していけばいいだけの話で、改行コードもあわせて出力しちゃえば1行でいけるぜ! みたいな...

      • まあネタなんだけど(笑) マジな要素を抽出するとしたら、 1から100までコードをべた書きするのが実行速度的には効率的なんだけど、 それを手で書くのはバカらしいので、 コンパイル...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん