発芽米ぱんだのTechblog

フロントエンドエンジニアを目指す発芽米ぱんだのTechblog

新米文系エンジニアのための数学のすゝめ

ーーー

■この記事の要旨

・新米エンジニアは、日々の業務(今回はコーディング、プログラミング)でわからない箇所をわからないまま考えて行っていては時間の無駄(考えることが悪いわけではないので誤解なきよう!)

・効率的な思考プロセスを得るために、数学はうってつけ

ーーー

 

ブログはじめました。

最初は数学についてです。え、数学?そう、数学です。あ、ちょっと待って、少しでも読ん(ry

 

マークアップエンジニア、フロントエンドエンジニア、サーバサイドエンジニア…世界中の多くのエンジニアが、業務内容は違えど、日々あらゆる問題(マイナスな意味だけでなく)に立ち向かっていることと思います。

しかし、僕のようにWebの世界に飛び込んで数年のペーペーエンジニアは、往々にして業務が非効率になりがちで、しかも間違いに気付かずに突き進んでいる、なんてことも…あり…(超冷や汗)

特に僕のように文系出身のエンジニアさんは、感覚で前に進んでしまう恐ろしさを、よくご存知なのではないかと思います。

 

「まぁでも、なんとかなってるし、作ったものも一応ちゃんと動いているし?」わかります。ものすごくわかりますその気持ち。僕もずっとその気持ちでした。

 

でも、新米エンジニアが感覚で業務をこなすのは、色んな意味でかなりリスキーです。

 

文系出身ペーペーがわかったようなことを言ってめちゃくちゃ恐縮なのですが、理系出身の皆さんは、割と論理的な考え方が得意なのではないかと思います。

コンピュータは全て論理の上で動くので、論理的に考えられて作られたスマーーートなコードは、コンピュータに優しく、他の人が見てもわかりやすく、無駄がなく、破綻しづらいです。そしておそらく、とても効率的に作られているはずです。

そう、僕が作るような継ぎ接ぎだらけのコードは、コンピュータにいらぬ負担をかけ、他の人が見ても意味不明で、無駄だらけで…(言ってて辛くなってきた)

 

文理を問わずとも、ベテランと新米の一番の大きな差は、経験ではないかと僕は思います。つまり、こなしてきた数が全然違う。業務を行う上で見ているもの、考えていることが全然違うということです。

 

じゃあ経験のない感覚派新米文系エンジニアはどうすればいいのか。

何とかしなければいけません。

「教えてもらえばいいや〜」では、いつまでも足手まといのままです。

 

前座がかなり長くなりましたが、そんな時、僕がオススメするのが数学です。つまり、思考の訓練として、数学を使うということです。

経験が無いのは当たり前。じゃあせめて、うまく業務をこなしていくための、ある程度のノウハウぐらいは身につけましょう。

 

Web業界に飛び込んで早2年の僕が感じている数学の魅力。それが少しでも皆さんに伝わればいいなと思います。

ーーーーー

さて皆さん、いきなりですが問題です。数学の問題です。


$l ≦ m ≦ n$ であって、 [ rac{1}{l} + rac{1}{m} + rac{1}{n} = rac{3}{2} ]を満たす自然数の組$(l, m, n)$をすべて導きなさい。(2004年明治薬科大)


ちなみに、自然数とは、1から始まる、正の整数のことです。0は今回は含みません。マイナスの数字は自然数ではありませんのでご注意を。

是非、今回だけでも良いので、実際に解いてみてください。特に新米文系エンジニアの皆さんには、ググらず、正解が出るまで、ねばってみていただきたい!

結構頭の体操になりますよ。

解いてくださってる方は、時間も測ってみてください。あ、でも決して早く解いてくださいということではありません、じっくり解いてみてください。

 

・・・・・・

 

いかがでしょうか。

僕はこの問題を解くのに1時間もかかりました(こんな記事を書いておきながら、数学の問題を解くのは超久しぶりです、てへぺろっ)

僕がどういう思考回路でこの問題を解いていったか、小馬鹿にしながらご覧ください。

(1)分数のままだと気持ち悪いので、綺麗な式に直す

(2)変数が3つもあるのが気持ち悪いので、変数$ l $を1から代入していく

(3)変数$ l $を1から3ぐらいまで代入していって、今度は100ぐらいの極端な数字を代入して、それぞれ得られた$ m $と$ n $の式に規則性がないか見出そうとする

(4)$ m $と$ n $だけになってもごちゃごちゃなので、αとβに置き換える

…以下略

アホです。自ら蟻地獄にハマっています。

 

これが実際の業務であったとしたら、正解を導き出せたから多少は良いものの、非効率極まりないです、はい。すみませんでした。

 

解答が知りたい方は、以下のURLの「整数問題」の2番目を。うわっ、こんなやり方があったか〜!ってなるかもしれません(笑)

大学入試数学の問題

じっくり時間をかけて考えてくださった方ほど、「整数問題」の3番目が瞬殺であることに、きっと感動してくれるはずです。

 

果たして、僕は何がいけなかったのでしょうか?

この問題においてですが、まず一番に、条件式(不等式など)を導き出すことに主眼を置くべきだった、と思います。

「すべて導きなさい」と問題にあることから解答が複数あることが考えられるので、条件式を導く出すことは、必須と言って過言ではありません。

たった数行、しかしヒントは全て問題の中に隠されています。

しかし、知識・経験が無いと、こうも、がむしゃらに一つ一つ数字を代入しようとしてしまうのか…(答えが百個もあったらどうするつもりなのか)

 

プロセスさえわかってしまえば、驚くほど効率化できるものなんです。

これって、意外とコーディング・プログラミングに共通すると思います。

 

最初のうちは、経験がないので、わからなかったり時間がかかっても当然です。

また、仮に、ある程度の知識はあったとしても、知識はあくまでもツールの一つなので、うまく使いこなせなければ意味がありません(例えば数学なら、いくら公式を丸暗記しても、解けない問題ってたくさんありますよね)。

 

難しい数学の問題を解いている時は、難しい仕様を実装しようとしている時に似ていると思います。私だけでしょうか。ど〜でもい〜ですよ〜(これわかる人はきっと同世代)

 

数学楽しい〜〜〜!!! 

それではまた!

 

ちなみに、問題の答え。

$(l, m, n) = (1, 3, 6), (1, 4, 4), (2, 2, 2)$

 

最後のまとめ:この記事は、新米文系プログラマが全員数学を勉強しなければいけないと言っている訳ではないです。日々の業務をこなす為のヒントが、数学に隠されているよ、というのが僕の言いたいことです。念のため。