web-dev-qa-db-ja.com

逆プログラミングを学ぶ、または「私はFizzBu​​zzテストに失敗しました。では、何をしますか?」

少し背景

私は今日28歳で、ソフトウェア開発の正式なトレーニングを受けたことはありませんが、広報の学士号とプロジェクト管理に焦点を合わせたエグゼクティブMBAに相当する2つの高等教育学位を取得しています。私はそれらの分野で合計約6年間働いており、その2、5年前に仕事を辞め、方向を変えることにしました。

1か月後に物事を考えた後、WordPressで小さなWebサイトの開発をフリーランスで始めることにしました。私は自分の方法を学びました。今日、私はクライアントのためにテーマとプラグインを一から開発する謙虚で成功したキャリアを実行していると言えます。主に代理店が中規模/大規模のウェブサイトの開発作業の一部をアウトソーシングしています。

しかし、数学を十分に勉強していなかったり、物事を正式に理解していなかったりすると、経験豊富な開発者と競争したり作業したりするときに本当に遅れをとるように感じることがあります。私は常にもっと学ぶ方法を探していますが、基本に欠けているようです。

残念ながら、現在コンピュータサイエンスでさらに4年を過ごすことは選択肢ではないので、本やオンラインリソースからできる限りのことを学ぼうとしています。この方法では、NASAが私を雇うことはありませんが、今は本当に気にしません。私の目標は、まずバーを通過し、自分を本物のプログラマと呼ぶことができるようにすることです。

私は現在、暇な時間を使って Java For Programmers (誰もが難しい/要求の厳しい言語を把握するため)に抜粋 Code Complete (取得するベストプラクティスの保持)および コード:コンピュータハードウェアおよびソフトウェアの隠された言語 (コンピュータの内部動作を把握するため)。

TL; DR

だから、私の現在の状況はこれです:私は基本的にPHP(Googleといくつかの本の助けを借りて)で)完全なシステムを書くことができ、Ajax、SQLなどを統合し、そして多分関係するすべての研究のため、経験豊富な開発者が期待するよりも少し遅いです。

しかし、私はif($n1 % $n2 == 0)を持っていなかったため、FizzBu​​zzテストの解決策を(Googleではなく)見つけようとして昨日立ち往生しました。 方法 係数演算子が記憶されます。

このジレンマを解決する良い方法として何を提案しますか?どの問題/本を勉強すれば、問題をより早く解決できますか、おそらく「プログラマーの方法」でより多くの問題を解決できますか?

[〜#〜] edit [〜#〜]-FizzBu​​zzを解決するために私が知らなかったことについて、いくつかの混乱があったようです。

多分私は自分を正しく表現しなかったかもしれません:私は問題を解決するために必要なステップを知っていました。私が覚えていなかったのは、モジュラス演算子です。問題は、基本的な数学をプログラムに置き換えることであり、基本的な数学を知ることではありませんでした。

コーディングホラー について読んだ後、楽しみのためにテストを受けました。私と正式に訓練された開発者との間の優れた比較基準であると判断しました。

これは、以前にコンピューター環境で数学を扱っていなかったために、単純な問題を解決するために、モジュラス演算子などの基本的なものを探すのに時間がかかるという例として使用しました。

94
moraleida

あなたの場合、あなたは独学していて、学習のための優れた健康的でBSのないアプローチと思われるものをすでに持っているので。まだいくつかの提案...

練習は完璧を作る

次のようなプログラミング演習に飛び込む必要があると思います。

あなたの周りの有名な大学、またはローカル(またはリモート)プログラミングコンペティションの過去の試験問題をつかむこともできます。たとえば、志望する高校のプログラマーのためにフランスで素敵なものがあります Prologin と呼ばれ、毎年頭を悩ませるパズルのシリーズを提供しています(おそらくフランス語だけですが、申し訳ありませんが、そういう意味です)。

詳細: プログラミングパズルと課題はどこにありますか?

古典的な本と参考文献

amazingbooks の非常に長いリストをお勧めすることもできますが、Zenの答えは、啓蒙への正しい方法は1つではないということです。

どれがリストの一番上にあるかを伝えるのは難しいでしょう。ですから、多くのことを読み続けて、回避しなければならない一般的な落とし穴と従うべきベストプラクティスを学んでください。

詳細:

限界を押し上げる

また、次のような頭を引っかく素材を探します。

必ずしも現在の例として取り上げられる必要はありませんが、そこで何が起こっているのかを理解することを試みる価値があります。

ピアシステムはやる気を起こさせる

また、次のコミュニティに潜んでいる(そして関与している)ことで、他の人と向き合うことでスキルを段階的に向上させることもできます。

パートタイム教育

別の4年間のコースまたは同様の何かに取り組む時間や動機がない場合は(とにかく必要ないか、報われることはなく、費用もかかるかもしれません)、オンラインで教材を探すことを検討してください。もちろん、これらはコンピュータサイエンスに限定されません。

元の MIT OpenCourseWare のおかげで、現在 それに続く大学の数 があり、多くの大学レベルのコース資料を無料で見つけることができます。自分でナビゲートして読み通すのは必ずしも簡単ではありませんが、かなりうまくできているものもあります。ゼロから始めてかなり高いところに行くには、 カーンアカデミー も検討することを検討してください。

少し進んで実際のオンラインコースを無料で提供するコースもあります。このコースでは、コースの資料にアクセスできますが、ペースの合った講義と定期的な自己評価も提供されます。たとえば、 Coursera または dacity にアクセスします。

上記のほとんどは、講義をYoutubeまたはiTunesUで公開していることが多いため、以前のすべてのリンクで知識への渇望がまだ解消されていない場合は、たくさんの資料が見つかります。

「本当の」大学により近い体験を提供するものが必要な場合は、遠隔大学を検討することもできます。これにより、パートタイムでの作業も可能になりますが、ペースに従って、自己評価と終了の両方を行う必要があります。 OpenUniversity およびその国際版と同様に、年次試験(場合によってはオンサイト).

情熱はあなたを続ける

  • ペットプロジェクトを見つける:独自のプロジェクトを作成するか、1つ以上の既存のソフトウェアプロジェクトに参加して貢献します。
  • コード、コード、コード。そして、さらにコーディングします。

(そして、あなたのコードを見て、あなたを批判し、異なる視点を見るのに十分な目玉を得る)

フランス人は言う:

C 'en engeant que l'on devient forgeron。

自分がやっていることを続ければ、最終的には専門家になります。時間と仕事がかかります。

他にも提案があります 私は問題を抱えています を参照してください。


PS:面接には非常に物議を醸すツールであり、良い候補者を特定するのに役立ちませんが、私はよく使用しますFizzBu​​zzは少なくとも信じられないほど「悪いもの」を取り除きます。だから、この実践的なことに気を取ってください! :)

144
haylem
I didn't have the if($n1 % $n2 == 0) method memorized.

私は長い間コーディングをしていませんが(約27か月前にSQLを学び始め、約20か月前にPerlでコーディングを始めました)、上の引用は以前の学生から聞いたことのように聞こえます:

すべての問題に使用する統合手法をどのように記憶するべきですか?

確率を追加するか乗算するか、「nを選択」または階乗を使用するかを覚えていません。

ちょっと待って!あなたはxが昨日2に等しいと言った!ゼロになりましたか?!

さて、最後の1つはおそらく少し厳しいでしょう...しかし、私が作ろうとしている点は、問題解決は暗記ではないです。もしそうなら、天才はコンピュータをプログラムしてすべての問題を解決することができ、私たちの誰も二度と考え直す必要はありません(なんて地獄のような世界でしょう...)。

さて、どんな知的努力も少なくとも少しは暗記からなるというのは事実です。特に、PHPでコーディングする場合は、基本的なデータ型(数値、文字列、配列)、それらを使用して実行できる基本的なこと(数値の場合:加算、減算、乗算、除算、およびモジュラス;文字列の場合:連結、部分文字列、置換、および少なくとも正規表現のいくつかの知識;配列の場合:連結、要素へのタッキング、要素のスプライシング、ループ、要素のカウントなど)、および使用できる基本的な論理構造(if/then/elseステートメント、foreachループ、whileループなど)。

次に、問題が発生したら、その問題を使用して、必要なツールのコンテキストを提供します。 FizzBu​​zzの場合、数値が3、5、または15で割り切れる時期を通知する必要があります。では、数値を扱います。ある整数が別の整数で割り切れる場合に、どの基本的なツールで通知できるのでしょうか。まあ、モジュラス演算子。それで、それを使ってください。 (もちろん、あなたの番号が$nである場合、$nの最後の数字が0または5であるかどうか、および/または$nの数字が3で割り切れるものですが、割ってしまいます...)1から100までの数値ごとにこれを行う必要があるため、心皮トンネルが発生しないようにするには、foreachループを使用します。

物語の士気は、一方で「私は基本的にPHPで完全なシステムを書くことができる」と言い、他方でFizzBu​​zzをコーディングできない場合、最初のアサーションは正しくないということです。私の以前の微積分学の学生の中には、概念を理解していると上下に揺さぶったものの、試験の問題、または宿題の問題、またはクイズの問題を実行できませんでした。彼らは彼らの理解についても間違っていました。

言い訳をするのをやめて、基本を学びましょう。

60
user11946

FizzBu​​zzはおもちゃの問題だと思うかもしれません。実際のプログラムで係数演算子を使用する必要があるのはいつですか。しかし、本当にあなたはいつもそれを使います。 3つの一般的な例:

  1. テーブルを表示していて、行ごとに背景色を交互にしたい。行が偶数かどうかを確認します(row_number % 2 == 0)と偶数行と奇数行の1つの色を表示します。
  2. ループしているオブジェクトのコレクションがあり、行ごとにN個のオブジェクトがあるテーブルを印刷したいとします。次に、いつ改行を追加するかの基準は(item_number%N == 0)です。私は実際にSOこれに関する質問 正確な動作 がありましたが、そのテンプレート言語では条件if item_number % N == 0は同等のもの(if item_number|divisbleby: N)。
  3. 効率上の理由でグループが特定のサイズに達したときにのみコミットされるトランザクションにグループ化するいくつかの操作を実行しています。おそらく、GoogleデータAPIを使用していて、操作ごとに新しいトランザクションを作成するためにHTTPヘッダー/認証のオーバーヘッドが必要ないので、それらを50の操作のグループにまとめてバッチ処理しています。または、データベースにレコードを保存していて、妥当なサイズのトランザクションをコミットしたい場合。何かのようなもの if cur_item_number % 50 == 0 then commit_data

確かに、これらすべてを行う他の方法があります。しかし、モジュラス演算子を使用したり、浮動小数点除算を整数除算と比較したりせずに、fizz buzzを実行できます。たとえば、FizzBu​​zzの場合、次の疑似コードのようなことができます。

div_by_3_rem = 0
div_by_5_rem = 0
for(i = 0; i< 50; i++) {
    if(div_by_3_rem == 0 && div_by_5_rem == 0) {
       print "FizzBuzz"
    } Elif(div_by_3_rem == 0) {
       print "Fizz"
    } Elif(div_by_5_rem == 0) {
       print "Buzz"
    } else {
       print i
    }
    div_by_3_rem += 1
    div_by_5_rem += 1
    if(div_by_3_rem == 3) {
       div_by_3_rem = 0
    }
    if(div_by_5_rem == 5) {
       div_by_5_rem = 0
    }
}

結論として、もしあなたが素晴らしいプログラマーになりたいのなら、言語の本を学ぶことに飛び込んではいけません。はい、PHP/Javaブックでは、google/stackoverflowおよびハーフワーキングプログラムからの回答を何よりも速く得ることができます。しかし、品質の最適なプログラムの書き方を実際に知ることができ、プログラマーのように考えるには、実際のCSブックに触れる必要があります。

プログラミング言語とCSの背景を紹介するCSの本から始めて、有名な例 コンピュータプログラムの構造と解釈 (Scheme-LISP方言を教える)またはおそらく何か他のもの- Think Pythonコンピュータサイエンティストのように考える方法 (私はまだ読んでいません。)どちらもオンラインで無料です。

最終的には、優れたアルゴリズムの本を読む必要があります CLRSのアルゴリズム (無料ではありません)。ただし、この無料のオンライン アルゴリズムの本 は、低コストの代替品になる可能性があります(ただしCLRSを購入できます)。アルゴリズムブックでは、コンピュータの問題を解決するための考え方、およびさまざまなデータ構造(配列/リンクリスト/ヒープ/バイナリツリー/ Bツリー/ハッシュテーブル)と、最適な使用方法を知る必要がある重要なアルゴリズムを紹介します。 。すべての証明を暗記したり、すべてのアルゴリズム(フィボナッチヒープを使用する人)を完全に記述する方法を知っている必要はありません。しかし、2つのネストされたforループがO(N ^ 2)であることが直感的にわかるはずです。比較ソートは最高でO(N​​ lg N)、バイナリ検索はO(lg N)、中央値はO(N)を見つけることができる、ハードディスクデータベースはB-Treeを使用する理由など)。少なくとも、アルゴリズムブックに関する強力な知識があれば、google/facebookの技術的なプログラミングインタビューに答えることができます。プログラミングの本を読むときは、ただ読み飛ばすだけではありません。例や問題を通して作業/コード化し、ロジックを通して積極的に考えれば、はるかによく学ぶことができます。

また、CSとアルゴリズムの本を読み終えたら、ソフトウェアエンジニアリング(コードコンプリートまたはプラグマティックプログラマー)に関する本もお勧めします。 ;コードをまとめる;必要に応じてリファクタリングする;バージョン管理を使用する;など)。

27
dr jimbob

しかし、if($ n1%$ n2 == 0)メソッドを覚えていなかったので、昨日FizzBu​​zzテストの解決策を(グーグルではなく)解決しようとして立ち往生しました。

誰もそれを記憶しません。あなたは自分でそれを思いつくはずです。モジュラス演算子を知っていて、それが何をするか知っているなら、それはFizzBu​​zz問題に非常によく適合します。

ここで外に出て、一般的に問題はPHPであることを示唆します。 Javaはこれまでに設計された最悪の言語であり、 PHPはこれまでで最悪の言語) であると言いたいのは、その作成者でさえ、設計されたことがないことを認めているからです。環境が実際にどのようにnotであるかの定義である場合に、優れたソフトウェアエンジニアリングプラクティスを学ぶこと。そして、すべてを実行するためのフレームワークによっては、たくさん。

私は現在、暇な時間を勉強していますJavaプログラマー向け(誰もが難しい/要求の厳しい言語を理解するために)

Javaは現存する最も簡単で最悪の言語の1つです。ガベージコレクションされた手動継承という1つだけがあります。友人やアドバイザーがJavaは難しい場合は、新しい友人を見つけてください。C++は、多くの概念を含む難しい言語であり、それ誰も論争することはありません。少なくともsomeジェネリックとラムダを持つC#を使用することもできます。

あなたの言語がコーディングできない人々によって設計および実装され、あなたが行うすべてのことをフレームワークに依存しているとき、あなたはどのようにしてコーディングを学びますか?

22
DeadMG

私はなぜFizzBu​​zzを理解しようとして立ち往生していたのかをしっかりと検討する必要があると思います。そのため、$nを指定すると、それが数値で割り切れるかどうかを通知する演算子があることを思い出したとします。そして、あなたはそれが何であるかを忘れる運が悪い。いいでしょう、他の方法でやってみませんか?コードについて何か知っていれば、それを行うためのその他の多くの方法を見つけることができるはずです。それらのいくつかは奇妙に見えるかもしれません-例えば、5の倍数をすべて配列に入れて、$nがそれらの中にあるかどうかをチェックするようなものです-それは悪い解決策ですが、それでも解決策になるでしょう。しかし、あなたはあなたが何も持っていなかったと言っています、あなたは行き​​詰まっているだけです。より大きな問題の症状である可能性があります。

プログラミングには、2つのことを学ぶ必要があります。

  1. トリックのバッグ。 PHPでファイルを読み取る方法、JavaでXMLを解析する方法、Pythonでデータベースに接続する方法。一部の人はそれを覚えていますが、実際には、これらを毎日使用する場合にのみこれらのことを覚えておく価値があります。それ以外の場合は、ドキュメントにアクセスして調べます。これらのものには、その文字通りの形を除いて実質はありません-特定の魔法の呪文がどのように聞こえ、どのような結果になるかを知る必要があるだけです。
  2. マインドセット。これは最も重要なことです。これはあなたがプログラムする方法であり、これは暗記とは何の関係もありません。コンピュータに実行したいことを説明する方法、それを実行する方法、および特定のケースで使用する方法を理解する必要があります。さて、最新のツールと最新のドキュメントがあれば、CMS全体をPHP "bag of tricks"アプローチを使用して書くことができますが、既製のタスクがない場合は解決策、あなたは「行き詰まっている」。

あなたからの説明は、あなたが最初の部分から始めたように見えますが、2番目の部分にはいくらか欠けています。通常、優れたCSコースはそれを支援しますが、唯一の方法ではありません。さまざまな問題を解決し、これらの問題をどのように解決する必要があるかを読み、ここに引用されている基本的な本を読んでください。プログラマーの考え方を理解したら、新しいトリックのバッグを使用することはそれほど問題にはならないことに気付くでしょう。もちろん、あちこちグーグルする必要がありますが、立ち往生することはありません。

11
StasM

あなたは他の何かを得意とする方法で、開発を上手に得る:実践。プログラミングの世界には code kata と呼ばれる素晴らしい概念があります。これは基本的に、比較的小さな問題の解決策をコーディングし、良い点と悪い点を分析し、すべてを破棄して、もう一度実行する演習です。 FizBuzzはそれ自体がカタです。だから、それを実行してください。あまり良くないと思われたり、うまくいかなかったりするものを見つけたら、調査して徹底的に調べます。 Q&Aサイトで質問したり、記事やブログを読んだり、他の人がこれをどのように処理したかを確認したり、学んだことを実践したりできます。

この練習を行う過程で、必要となる可能性のある追加の数学/理論的背景がいくつあるかを学習します。頭を回すことができない概念にぶつかった場合は、それらとそれらの前提条件に関する知識を読み、コースを拡大したいか、何を持っているかをケースバイケースで決定してください。理論的背景。

9
Erik Dietrich

... if($ n1%$ n2 == 0)メソッドを覚えていなかったため。

私はそれを意味すると解釈している、あなたはモジュラス演算子について知らなかった、および/または覚えていなかった。この場合、開始する場所は、使用している言語の言語構成を確認することです。 「寒さ」がわからないものは何でも復習し、わからないことはすべて学んでください。

8
John MacIntyre

コーディングを続け、学習を続けます。最終的には、十分な献身をもって、FizzBu​​zzを見て、なぜそれについて考えなければならなかったのか不思議に思うでしょう。多くの企業がFizzBu​​zzスタイルの質問を面接の非常に早い段階で行っているため、一度失敗すると、少なくとも採用プロセスについて何かを学んだことになります。

コードを書き、プロジェクトのアイデアを思いついて、研究し続けるだけです。

5
joshin4colours

Java、C++の前にJavaScriptを学ぶことをお勧めしますか?あなたの理由:

  1. フロントエンド設計で使用(jQuery、一部のWordPressプラグイン、Twitterフィード、バックエンド作業がほとんどまたはまったくないJSON経由でのデータベースへのデータベースのロード、フォーム検証など))
  2. Node.jsを介してサーバー側で使用できます
  3. IOS、Android、Win8などのハイブリッドアプリの構築に使用できます
  4. JSを勉強すると、さまざまなブラウザーやデバイスでのWebページのパフォーマンスをよりよく理解できます
  5. JSは、初心者向けに設計されています
  6. あなたはすでにHTMLとCSSを知っています(;願っています;)、それがJSに役立ちます

無料の初心者向けリソース

http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
さらに10件のリンクがありましたが、10人の担当者に達するまで、SEはそれらを投稿させません。

C++やJavaなどの学習も役に立ちますが、IMHOはフロントエンドとバックエンドの両方で使用できるため、JSのようにWebプログラミング全体に影響を与えるわけではありません。楽しんで!

4
tomByrer

あなたは他の人を見つけて助けることができます。 giving.code (開示:私のサイト)または アメリカのコード または何でも。これは、PHP以外のWebページを作成する問題にさらされ、気分が良くなる優れた方法です。

解決すべき問題がある場合、または解決を支援するか、単に理解する場合、コードの選択は自然に行われます。目標を持つことは、何かを学ぶための最良の方法です。

3
Will

次の条件が満たされていれば、モジュラス演算子であることを知らなかったため、誰かを雇うよう勧めることを拒否することはないと思います。

  1. 彼らはそれがある種のオペレーターであることを知っていました。
  2. 彼らが私に彼らを促したとき、彼らは「係数」が何であったかを私に言うことができました。

いつも(通常は)%とは限らず、一部の言語は奇妙です。そして地獄、10年後、私はすべてのPerl演算子を知っていると(そして、宇宙船がまた何をしているのか)正直に言うことはできません。私はそれらを必要とすることさえ何でもしたので、それは数年になります。

私が誰かを勧めることをためらっているのは、それが彼らにその質問/テストの欠落に対する何らかのパニック攻撃を引き起こした場合でしょう。それは私に彼らが少し緑がかった印象を与えるかもしれません(それが非常にエントリレベルのポジションでない限り)。それらのことを記憶する(または必要性を感じる)人を誰も必要としない。はるかに広い概念を理解できる人が必要です。グーグルで調べても誰も気にしませんが、インタビューでは、%が大したことではないこと、そして簡単なグーグルを行うときに「演算子」をキーワードとして使用することを知っていることを確信する必要があります。探す。

また、これは単なるアイデアです...しかし、地元のコミュニティカレッジにcompsciプログラムがある場合、他の単位はすべて転送され、2年間の学位で必要な単位数は約20になります。ほぼ学期にそれを終えることができました。彼らはあなたにデータ構造のコース、そしてうまくいけばアルゴリズムをやらせてくれるでしょう...あなたを少し強くするかもしれません。

0
John O

したがって、FizzBu​​zzの問題を解決できませんでした。大したことだ。できるようになりました。無数の方法を忘れることはないでしょう。あなたが頭の上の1つの愚かな問題を解決できなかったからといって、自分を悪いプログラマーとしてブランド化しようと熱望しないようにしてください。

それが一つの問題です。もう1つは、プログラミングの学習曲線に少し遅れを感じているように見えることです。他の人が言ったように、コーディングを続け、読み続けてください。やればいけないほど、より良い結果が得られます。それはそれと同じくらい簡単です。あなたがあなたのバックグラウンドで最大の穴であると感じるものから始めて、そこから進んでください。

0
Nick Spreitzer