「単純なまねる」から「自身の思っているように実装する」状態に移行
どういうものを実装するか.という話から始めるとしましょうか.「プログラミングで実装するもの」を一般化すると,やはり
という「入出力処理」に該当するのではないでしょうか.バックエンドにはフロントエンドからのデータを受け取る処理を実装することになるはずです.例えば
のような,HTTPを利用した入出力が存在しますよね.
今まで学んできた教材では,これら「処理」を真似てきた.ということだと思いますが,そこに関して自分で考える力を身に付けたい.というのが今回の要件だと定義してしまいましょう.
そのとき,入出力のみが与えられた環境があるとどうでしょうか.自身で処理を考え,有り得る入力に対して,返さなければならない処理結果が存在する.だけど処理のコードは自分で書かないといけない.そういった状態です.
プログラムを考えて書く/プロダクトを考えて作るという行為は全て,ここに帰結すると言っても過言ではないのでしょうか.ユーザの要望を実現する入出力処理を記述することになるはずです.
例えばTwitterとか
みたいなデータベース書き込み処理があるでしょう.ただ,Twitterはアカデミーで学ぶような単純なデータベース書き込みが許されるサービスではありません.秒間あたりのクエリ数は1億にも上るとされており,この膨大な処理を捌くためのコードが必要なわけです.
ここでも「考え得る入力」とそれに対して「返すべき出力」が最初に定義され,それを満たす処理を考える.といったプロセスになっていると思います.
さて,ここで入出力条件を満たす処理を実装する力をつけることのできるサービスを次に紹介します.
これらサービスで基本的に扱う題材はアカデミックに言うと「アルゴリズムとデータ構造」という分野に関する内容になっており「競技プログラミング」に関する界隈になります.これらサービスでは与えられる入出力条件を満たす「アルゴリズム」を自身で記述,提出することで即時採点され合否がわかるものになっています.
簡単なものでは「標準入力で与えられる文字列S
を左右反転しなさい」や「標準入力で与えられる整数a
からb
までの値の総和を求めよ」というものから,難しいもので数学的性質を用いた計算量改善を含むコードを記述させられたりします.
コード例
標準入力で与えられる文字列S
を左右反転しなさい
という要件であれば
とできるような処理を記述する必要がありますね.Rubyなら一行で
と書けます.
標準入力で与えられる整数a
からb
までの総和$\sum_{i=a}^{b}i$を求めよ
という要件なら
とできるような処理を記述する必要があります.Rubyでfor文を用いて
a, b = gets.split(' ').map(&:to_i)
ans = 0
for i in a..b do
ans += i
end
puts ans
と書いたり,等差数列の和の公式を利用して
a, b = gets.split(' ').map(&:to_i)
def sum(x)
return x * (x + 1) / 2
end
puts sum(b) - sum(a - 1)
と書けます.
上記サービスでの提出物は,ここで求まる値や解ではなく,これらソースコードになっています.コードの合否を判定することになっており,どれぐらいの実装力/アルゴリズム"ちから"があるか計測されると考えて良いでしょう.ちなみに和を求める例で言うと,等差数列の和の公式を利用した後者のコードが処理時間が短くて「良いコード」とされています.
将来個人的にSNSとマッチングアプリを作りたい
マッチングアプリで人と人を繋ぐことをする際にどのような采配をするのが最適か考えたことありますでしょうか.この「アルゴリズムとデータ構造」の世界では「二部グラフ」というデータ構造を用いた「最大二部マッチング問題」を解くことになっています.
上記サービスでこの問題も出題されています.探してみると良いでしょう.マッチングアプリですら,アルゴリズムとデータ構造の知識が必要不可欠な中で,これらの知識なしに自身が思ったようにコードを書いて実装する姿が思いつかないのは当然のことと思います.
Udemyの教材で,基本情報も持っているようですね,その中にアルゴリズムとデータ構造に関して題材があるはずなので最初にこちらから取り組まれると良いでしょう.
その次にコーディングを伴いながら学べるRubyとPHPに関して教材の多いPaiza Learningを推奨しますが,AtCoderの方が問題数は遥かに多く,実践力はこちらで身につけることができるでしょう1.学習は前者で,習得は後者で,という具合で利用されると良いと思います.
はっきり申し上げて,実務レベルを考えるとAtCoderにおけるBeginner Contest(通称ABC)におけるA問題とB問題は最低限解けるべきです.C問題までを時間内に解けると茶色のレートが割り振られるところ,サービス設立者観点でこの茶色のレートは「派遣で来たプログラマがAtCoder茶色だったら結構安心する,
エンジニアとしてアルゴリズム面においての安心感があるかと言われたら、正直物足りない」程度でしかないです.
ちなむと先述のマッチング問題は水色のレートが割り振られたりします.
これらサービスを利用することで,与えられた入出力の要件から,自分でコードを書いて要件を満たすことができるようになれば,質問に書かれていた課題は解決されると思います.
まずは次のページを読まれてアルゴリズムとデータ構造の重要さを把握してモチベを上げると良いでしょう.