TaskArai
@TaskArai (Task Arai)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

プログラミングに触れて一か月の初心者です。プロダクトを作れる未来が見えません。みなさんの経験を教えて下さい。

 初めまして、TaskAraiと申します。
 新卒枠で、4月からweb系未経験プログラマとして働く予定です。

 現在、progate、udemyを用いて、HTML、CSS、Ruby、PHP、Docker、Heroku、AWS cloud9に触れることが出来た状態です。正直、動画コンテンツ外のことはまるで分かりません。

 様々な記事やUdemyの動画を見ていて、自身が思ったようにコードを書いて実装する姿が想像できません。今は、Udemyの動画を見て、写経しながら、書いてあるコードの理解に努めることが限界です。一日5時間から10時間は、何か勉強している最中になります。

 みなさまは、どのように「単純なまねる」から「自身の思っているように実装する」状態に移行できましたか?また、それにはどのくらいの期間がかかり、どれだけ挫折しましたか?そのエピソードをお聞かせいただけないでしょうか。

 また、今はまだUdemyを続けて、数か月後に〇〇をした方が良い。いや、すぐにやめて、to do listを作成した方が良い。など、簡単な指針を教えて頂けると幸いです。

 目指している方向性は、バックエンドの方向性です。配属などは決定してないので、詳細には決定してません。
 それとは別に、将来個人的にSNSとマッチングアプリを作りたいと夢があります。そちらに関するどうやったら作れるなどの情報もありましたら教えてくださると幸いです。30人に1人と言われる精神障害者のためのコミュニティを作ろうと考えています。
 ふわっとした質問ですが、宜しくお願いします。

 下にUdemyで買った教材を載せておきます。どれからするべき、などご意見もありましたらお願います。現在はPHP関係のものをやって、1週間から2週間後にLaravelに入門しようと思っています。
image.png
image.png

0

2Answer

「単純なまねる」から「自身の思っているように実装する」状態に移行

どういうものを実装するか.という話から始めるとしましょうか.「プログラミングで実装するもの」を一般化すると,やはり

という「入出力処理」に該当するのではないでしょうか.バックエンドにはフロントエンドからのデータを受け取る処理を実装することになるはずです.例えば

のような,HTTPを利用した入出力が存在しますよね.
今まで学んできた教材では,これら「処理」を真似てきた.ということだと思いますが,そこに関して自分で考える力を身に付けたい.というのが今回の要件だと定義してしまいましょう.

そのとき,入出力のみが与えられた環境があるとどうでしょうか.自身で処理を考え,有り得る入力に対して,返さなければならない処理結果が存在する.だけど処理のコードは自分で書かないといけない.そういった状態です.

プログラムを考えて書く/プロダクトを考えて作るという行為は全て,ここに帰結すると言っても過言ではないのでしょうか.ユーザの要望を実現する入出力処理を記述することになるはずです.

例えばTwitterとか

みたいなデータベース書き込み処理があるでしょう.ただ,Twitterはアカデミーで学ぶような単純なデータベース書き込みが許されるサービスではありません.秒間あたりのクエリ数は1億にも上るとされており,この膨大な処理を捌くためのコードが必要なわけです.

ここでも「考え得る入力」とそれに対して「返すべき出力」が最初に定義され,それを満たす処理を考える.といったプロセスになっていると思います.

さて,ここで入出力条件を満たす処理を実装する力をつけることのできるサービスを次に紹介します.

これらサービスで基本的に扱う題材はアカデミックに言うと「アルゴリズムとデータ構造」という分野に関する内容になっており「競技プログラミング」に関する界隈になります.これらサービスでは与えられる入出力条件を満たす「アルゴリズム」を自身で記述,提出することで即時採点され合否がわかるものになっています.

簡単なものでは「標準入力で与えられる文字列Sを左右反転しなさい」や「標準入力で与えられる整数aからbまでの値の総和を求めよ」というものから,難しいもので数学的性質を用いた計算量改善を含むコードを記述させられたりします.

コード例

標準入力で与えられる文字列Sを左右反転しなさい

という要件であれば

とできるような処理を記述する必要がありますね.Rubyなら一行で

puts gets.chomp.reverse

と書けます.

標準入力で与えられる整数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茶色だったら結構安心する,
エンジニアとしてアルゴリズム面においての安心感があるかと言われたら、正直物足りない
」程度でしかないです.

ちなむと先述のマッチング問題は水色のレートが割り振られたりします.

これらサービスを利用することで,与えられた入出力の要件から,自分でコードを書いて要件を満たすことができるようになれば,質問に書かれていた課題は解決されると思います.

まずは次のページを読まれてアルゴリズムとデータ構造の重要さを把握してモチベを上げると良いでしょう.

  1. 解説はC++,Pythonコードのみ(コードがないこともある)であることに注意してください.ただし,コンテスト時間外は他人の投稿したコードを全て閲覧することができます.PHPやRubyに絞ってどのように書くのがベストか,参考にすることは十分に可能です.

4Like

Comments

  1. @TaskArai

    Questioner

     初めに、ご親切に細かく回答下さり有難う御座います。
     何をすればよいのか、方向性すら見えてきていなかったため、大変助かりました。

     図解やコード、引用まで記述下さり有難う御座います。

     中身を拝見させて頂きましたが、先述のようにプログラミングに触れて一か月なものですから、朧気な理解すらままならない箇所もありました。
     印刷して、精読してみたいと思います。
     有難う御座いました。

写経、私も新しいプログラミング言語なんかを覚えるときにチュートリアル見ながらやりますね。

私の場合、ここを変えたらどうなるか等を予想し、実際に変更してみて予想通りになるか確認するといったことも同時にやっていきます。

チュートリアル+上の予想と確認が終わったら、それらを使って簡単に出来るようなプログラムを作ってみます。

ここまで出来るようになったら、まあその言語は多少は使えるかなと考えます。

その後は、その言語で作られた良質なコードを読みまくって他者の技術を盗んで覚えていく、他者のプログラムを自分の思う通りに書き換えて見る、といった感じで学んでいってます。

2Like

Comments

  1. 基本的に時間は気にせず、こういうことがやりたいからこれを覚える。やりたかったことが出来るようになったから次へ行く、を永遠とやってます。
  2. @TaskArai

    Questioner

     回答有難う御座います。
     実際に変更してみて、予想通りになるかを試すことは、確かに理解の観点から良さそうですね。
     最後の文を読ませていただく限り、やはり、写経は一定以上の効果があるのですね。
     有難う御座います。

Your answer might help someone💌