0:前節
こんばんは、新卒1年目エンジニアの越です。
2年目になる日まで残り2週間になりました。
1年間エンジニアをやっていて、プログラミングの複雑なところにずっと悩みながら過ごしてきたことを書いてみます。
今回はどうやって複雑なことを学んで行ったらよかったのか、気づきを書いてみます。
1:経験した問題
プログラミングを学んでいきたいが、どうやって学んでいくべきかを決められずにいました
(原因):物事を分解する力の欠如
解決へのきっかけ:モデリング(計算機)
モデリングができるようになると、複雑な事象を整理することができるようになります。
→複雑なことは実は単純なことの集まりであることを発見したことを書いていきます。
2:実践
2−1:とても簡単な例
入力は文字列1+1=とし、計算を計算機に行わせます
頭の中だけで解決するぐらい単純ですね!
とくにモデリングも必要ないので先へ進みます。
2−2:2−1を少し複雑にしたこと
入力は文字列1+1*2=とし、計算を計算機に行わせます
*と/の演算子は計算の優先順位が上位にくるので、1−1よりは複雑ですね。
これも単純例なので、とくにモデリングはせずに先へ進みます。
2−3:複雑にした例
入力は文字列(1+1)*2=とし、計算を計算機に行わせます
計算式自体はそれほど複雑ではありませんが、括弧の処理を計算機に行わせるにはどうしたらよいか?
という点で複雑になります。
今回は逆ポーランド記法とスタックを使ってこの複雑性に対処をしてみます。
まずはモデルと各モデル間の関係を洗い出してみます。
モデルに絞って考えてみる。計算式、演算子、数字、スタックで計算機に内包されています。
逆ポーランド記法:1 1+2*=
以下は、今回試したスタックを使って逆ポーランド記法を解決するアルゴリズムです。
アルゴリズム
- 数値だったらスタックへpushする
- +、ー、*、/の演算子がきたら2回popする
- 計算したら結果をスタックへpushする
- =がきたら1回popして出力する
2ー4:かなり複雑なことへの対処
入力は文字列((6+4)*2ー4)/2=とし、計算を計算機に行わせます
逆ポーランド記法:6 4+ 2*4−2/=
問題は複雑になりましたが、先ほどの図に新たに変更を加える必要はないため、システム要件が複雑になっても対応出来ます。
3:まとめ
複雑なことでも、分解して単純化することができれば、諦めることなく、問題を解決することができるという1つの学びの経験です。
プログラミングの学習をするのに算数?
と思うかもしれませんが、この計算式に変数を使用したり、括弧の部分を関数に置き換えれば、よく見かける構造に見えてきます。
この先はプログラミングの関数呼び出しの際に実際にメモリ上でスタックがどのように使用されているかを考えたり、浮動小数点を考えたりいろいろ広げて勉強できそうです。
勉強のきっかけは単純なことへ分解して考えることから!
という学びを持って1年目の締めくくりとさせていただきます。
それではまた。