最初にPaizaで問いた回答を見返すことで、プログラミング開始3日目の自分の思考を考察してみた


公に出すと赤っ恥

この記事は最後になって投稿者が力尽きた、いわゆるタイトルだけのゴミ記事です。
誰か同じ内容で同じような記事書いてください...

どうも、最初に書いた記事が思ったより反響が大きくてびっくりしています。
hashimotoです。まさかトレンドに乗るまでとは思っても見ませんでした。やっぱりプログラミングの参入障壁の高さを、大なり小なりみなさん感じているのでしょうか。初心者向けの記事という点だけでは、ここまで伸びなかったと思っています。

少なくとも、
 『PCとwifiだけあればプログラミングなんて始められるよww始められないのは君の根性と気持ちの問題だよねww』
なんて思っている熟練者や、
『は?プログラミングを学ぶ上で目的意識持って言語を選び、記事を探すとか当然じゃん。そんなことも知らないで始めようとしていたの?バカなの?』
とか考えている天才初心者はあんな記事読まないと思ってますので、私と同じ感想を持った人が多いと感じて、少しホッとしております。
そして自分のゴミみたいな文章で1000人以上の方の貴重な時間を取ってしまったと痛感しています。文章力がホシイ...

クソみたいな自分語りは程々にし、本題へ。

みなさんは自分が最初に書いたコードって残っていますか?

 私は残っていました。そう、タグにもある、Paizaってサイトに...
私は研修の一環として、.installやPaizaを使用しての研修をしました。流れとしては、

.installでPHP3分studying無料版を全て視聴(3日間かけて)→Paizaでのコーディング特訓(Cランククリアするまで)

でした。最初web系のこういったのって結局有料にリンクが飛ぶだけなんじゃ無いの?って思っていましたが、そんなことありませんでした。
 私は上記のサービスでとっても楽しくコーディングを学ぶことができました。実際に力もついて、ある程度基礎を学ぶことができたと感じてましたし、この経験がなければその後の研修サイトはもっと時間がかかったと思います。

で、最近、研修用のFAQサイトを完成させて思ったんです。
あれ、今結構普通にPHPを書いているけど、最初から比べたらどれくらい進んだんだろう?って。

そして、
もし、まだできなかったあの頃の気持ちがわかるうちに自分の最初のコードを見直せば、本当の本当の初心者がどう考えてコーディングして、プログラミングでのどういった点があやふやなままで書いちゃうのか、分かるのでは?

ということで、最初に自分の書いたコードと、その時の思考を赤裸々に見せることで、私の恥と初心者が陥りがちなミス、そしてその背景に迫れたらと思います。(ただしサンプル数n=1ですが...)

早速いってみよう

初心者が陥るミス

ここではその分類を大きく4つに分けて見ましょう。

a. 関数を多く知らない知識不足
b. 関数などの用途がわかっていない
c. 構文ミスや可読性によるもの(;抜けなど)
d. 引数と返り値(の型)を意識していない

他にも多くあるかと思いますが、まずはこれで行きたいと思います。

最初に書いたコード

下記のコードが、本当に最初に自分が書いたコードです。
所要時間は約6分。でした。

sample.php
 <?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    $input_lines = fgets(STDIN);
    echo ($input_lines*($input_lines-1))/2;
?>

もっとクソみたいなごみコードかけよ...割と普通だった。
なんか「?>は消そう」「fgetsするときはtrimかけとくと間違いないよ」「input_linesそのまま使うのかよ」とかツッコミどころは多数あるものの、そこまででもなかったです。
ちなみにこの問題ですが、多分等差数列の和が解法となる問題のようでした。

 『なんだ、この試みは失敗か、2回目にしてネタ切れじゃん...しゃあない。この記事はボツにしようか』
 と会社の昼休みにpaizaの自分が解いた問題の履歴を見ながら思っていたんですが......
きちんとありました。いい感じの変なコードが

お前...explode知らなかったんだな...

問題のコードはこちら

sample.php
<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    $input_lines = fgets(STDIN);
    $a = $input_lines;
    $b = strpos($a, " ");
    $ndrunk = substr($a, $b+1);
    $drunk = substr($a, 0, $b);
    $sum = $drunk*6000+$ndrunk*4000;
    echo "$sum";
?>

なんだこれ...何がしたいのかも何してんのかもわかんねえよ...

頑張って解読していきましょう。
まず問題を知らないと何やりたいかわからないですよね。
と言っても問題名を明記するのはPaizaの規約に違反するかと思いますので、標準入力のデータと、死体処理を書きます。

入力値(1行のみ)
x y

xyそれぞれに対して、
x*4000、y*6000
として、最終的に合計する
という問題です。
これから最初のコードにコメントをつけていくと

sample.php
<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

//標準入力値取得
    $input_lines = fgets(STDIN);

//変数名付け替え??
    $a = $input_lines;

//このとき、$b === 1
    $b = strpos($a, " "); 

//$aの、3番目の文字を、取得。$ndrunk === yってなった
    $ndrunk = substr($a, $b+1);

//$aの、最初の文字を取得。$drunk === xってなった
    $drunk = substr($a, 0, $b);

//  x*6000+y*4000として出力
    $sum = $drunk*6000+$ndrunk*4000;
    echo "$sum";
?>

なるほど。確かに動く。動くが、あまりにも可読性が低すぎないですか?
当時の私はやってやったぜ。という思いでちょっと誇らしげだったの覚えてます。穴があったら入りたい...

よく研修担当の上司笑わなかったなこれ

ひとまず、このコードから、どんな点が3日目の私には不足していたかを考察していきたいと思います。

コードの問題点

まずはこれを列挙してみます。ちなみに当時の私が分かるように書くので、説明過多のきらいがあります。ご了承ください。また、私もPHPマスターと言えるような人間でもないので、間違いは罵倒してください。
では指摘します。

  1. fgetsをtrimで囲っていない(文末の改行が悪さをするのを防いでいない)
  2. 変数名がおかしい(変数を新たな変数名で直すなら、可読性を高めてほしい)
  3. まずもって知識が足りていない。文章=>配列にするexplodeを知っていればもっと楽になったと思われる。
  4. substr関数で文字列の一部を取ってくるなら、書き方を統一すること
  5. 最後の?>はなくすこと。でないと意図しない結果となるバグの可能性が残る

指摘力のない私を許してください...
これくらいしか思いつきませんでした。
まあ、5つあれば、なんとかなるのでは?
ということで、何故これらの問題点があったのでしょうか?
上記の分類に照らし合わせて見ましょう。

分析結果

 といっても、実は分析とかって苦手なんですが
 今回のミスは、上記の分類で分けると、こうなります。

a. 関数を多く知らない知識不足  によるもの

まずもって知識が足りていない。文章=>配列にするexplodeを知っていればもっと楽になったと思われる。

b. 関数などの用途がわかっていない  によるもの
今回該当なし 

c. 構文ミスや可読性によるもの(;抜けなど)  によるもの

変数名がおかしい(変数を新たな変数名で直すなら、可読性を高めてほしい)
substr関数で文字列の一部を取ってくるなら、書き方を統一すること

d. 引数と返り値(の型)を意識していない  によるもの

fgetsをtrimで囲っていない(文末の改行が悪さをするのを防いでいない)
最後の?>はなくすこと。でないと意図しない結果となるバグの可能性が残る

想定としては、a,cが多くなるのかなと思っていましたが、そうでもありませんでした。
特に、dは初心者が思い至らないミスなのでは?と感じます。
むしろ、関数自体に関してとか、構文ミスなどに関しては今後すぐわかってくるものなので、ぱっと見初心者からは違いがわからない引数、返り値の問題が大きいのでは?と思います。

結論

 PHP初心者にとって、やはり引数、返り値問題は鬼門だと思います。
認識が甘くても特に問題にならないため、放置されやすく、あとあと困るからです。私とかそうです。現在var_dumpを挿入することが日課です。
 もう少し、参考データがあれば、もっと分かるのではと思います。
現在良い先生とされている方々の、感覚で持っている初心者への教え方をデータ化するのは難しいと思いますが、初心者が陥りがちなミス、そしてその思考回路は、この方法で多少わかるのでは?
と思います。

 特に初心者の書いたコードとかいっぱい持っていそうなところとかがこれを機械学習でデータ採りすれば、なんか良い感じのデータになりそうな気がする。将来性は見えてきそうです。

願わくば誰かこれでなんか作ってくれることを祈ります。(他力本願)
すでにやっているところありそうですけどね。

まとめ

・昔の私(現在もですが)は引数と返り値に理解が乏しかった
・分析するにはn=1では流石に厳しい。
・二番煎じっぽいけど今の所こんな記事書いた人少なそうだから誰かこの話題膨らませてほしい

あとがき

現在夜中の2時。

一つの記事にかかる時間が3時間以上(下書き保存期間は一週間以上)というこの遅筆さを直したい。