私は(ロジックの)優れたプログラマーではありません。どうすれば修正できますか?[閉まっている]


50

さて、ここに私の問題があります:

私は大企業で働いていますが、なんとなく仕事を見つけました(率直に言って、面接が簡単だったからです)。私は自分のものを知らないわけではなく、Javaを理解するのがかなり得意です。ライブラリなどです。

しかし、ロジックの問題を解決しようとすると、解決策を見つけるのが非常に困難になります。

たとえばconversion of decimal to roman、解決策を見たとき、それは簡単な問題であることがわかりました。しかし、1〜2時間試してから実装できませんでした。

私は愚かで、ソフトウェアエンジニアになる価値はないと感じています。パズルを解く能力は、優れたプログラマーにネイティブに備わっている必要があります。しかし、いくつかのパズルを解こうとすると、解決策を見つけることができず、ただグーグルアップしてしまいます!....それが嫌いです!

仕事で問題(xyz機能を実装するなど)が与えられたとき、私はそれを非常にすばやく理解し、職場で尊敬していますが、私はそれについてまったく誇りに思っていません。数学的にも論理的にも挑戦的な問題を解決しようとすると、私は手探りするからです。私は今でも(エンジニアとして)私がやっていることを愛していると感じていますが、友人が思いつくいくつかの難しいロジックの問題を解決できないことを本当に悲しんでいます。

私は意気消沈したと感じます:(

TL; DR:実用的な観点(製品に機能を実装すること)で物事を理解していますが、ProjectEulerからの問題に取り組むとき、私はひどく吸います!そして、私は私の脳を研ぐ必要があります!

だから、私の質問は:

  1. 修正するにはどうすればよいですか?プロジェクトのオイラー問題を解決することから始める必要がありますか?いくつかの基本的な問題を解決するのに何時間もかかっても
  2. または、基本に戻っていくつかの基本的な数学を勉強する必要がありますか?
  3. パズルを解く楽しさはあまりありません。しかし、私は自分のためにそれを楽しくしたいです!そして、それらをより良く理解できれば、それが好きになると思います!

PS:私はCSで教育を受けたことはありませんでした(私の学部生は選挙でした)。しかし、それは嫌な開発者であることの言い訳ではありません。

ありがとう!


3
それはあなたのためのパズルを解いて楽しいではない場合、なぜ気にします!
V4Vendetta

3
私はそれを解決するのに苦労しているので、それは面白くありません。私はそれが得意なら、私はそれが好きになると確信しています!
ジョン

1
あなたは、常に試みることができるこの(警告、あなたがあれば真剣に中毒性のあるパズルを解くには)
Benjol

2
ネイティブには何もありません。最も基本的なスキルであっても学習が必要です。必要な能力を訓練するための遊び場として、微積分学と古典力学をお勧めしますが、他の多くの科目(完全に非数学を含む)でも同じことができます。
SKロジック

3
@John確認済み。それは難しい問題でした。5分以内に解決できない場合でも、気分を悪くするべきではありません。ローマ数字に関するWikiを読んだ後、その結果を別の実装の結果と比較するだけで、バグを修正することができました。私は(他の多くの人と同様に)ILは有効な数字だと思っていました。違う。XXXIXは正しい番号です。さらに、他の実装を見て最適化する必要がありました(II、III、XX、XXXなどを事前にキャッシュしていましたが、それは役に立ちません)。気分を悪くしないでください!
ザナトス

回答:


24

まず、これがスキルの弱さだと思うのは素晴らしいことです。あなたは実際にどこを改善する必要があるかを知っているので、改善するのがはるかに簡単になり、あなたが思っているよりも優れていることを示しています。

私が以前に何度も見たあなたの主な問題は、あなたが「問題解決ツールセット」を持っていないことだと思います。問題に直面したとき、あなたは何をしますか?どのように解決しますか?私は数学が遅いです、数学の小さなツールを一緒に使用する方法を知っているので、私は微積分学を使いました。

そのため、問題解決に取り組むだけでなく、その際にどのツールとスキルをテーブルにもたらすかを検討する必要があります。職場で新しい機能を使用する場合は、IDE、デバッガ、ドキュメント、インターネット、ソースコードなしで座っているだけですか?もちろん違います!

問題を解決するためのツールがありますが、あなたはそれらを知りませんウィキペディアの記事には、問題解決手法へのリンクがいくつかあります。しかし、最も重要なツールは科学的方法です。ウィキペディアの記事には、実用的なアプローチが含まれています。

  1. 質問を定義する
  2. 情報とリソースを収集する(観察)
  3. 説明仮説を立てる
  4. 実験を実行し、再現可能な方法でデータを収集して、仮説をテストします
  5. データを分析する
  6. データを解釈し、新しい仮説の出発点となる結論を導き出します
  7. 結果を公開する
  8. 再テスト(他の科学者が頻繁に行う)

この方法ですべての問題を解決できます!ただし、多くの人はこれらの手順を実行しません。コードをテストすることを拒否する開発者のようなものです。まったく。バグが存在するかどうかを判断するのに問題が発生します。

最後に、問題解決のためのもう1つの主要なツールは、簡単な手順でそれを分類することです。たとえば、プロジェクトオイラーの例の最初の問題:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

ここには2つの事実と問題があります。ファクト1は、10未満の3または5の倍数を定義する方法を示しています。3* 1,3 * 2,3 * 3,5 * 1はすべて有効です。5 * 2は10に等しいからではありません。そして、事実2は23を得るためにそれらを合計することを教えてくれます。

そのため、すでに値を見つける方法があり、それらを加算して合計を取得できます。もちろん、事実を見て、順序の単純な逆を適用できます。3、5、6、および9は3または5の倍数です。つまり、3%3、5%5、6%3、9%3はすべてmodがゼロになります。そのため、別のアプローチとして、999から1を通過し、各数値を3と5でモジュラスします。値のリストを収集し、それらを加算します。

プログラミングの世界で小さなツールを使用する優れた例として、Unixプログラミングの芸術をお勧めします。それらを連結すると、非常に複雑な問題を解決することができ、これらの概念が私を助けた回数を数えることはできません。


19

多くのプログラマーも当然の「パズルソルバー」ですが、プログラミングにはそれ以上のものがあります。すべてのプログラマーが興味深いアルゴリズムの問​​題を解決することに集中している場合、クールな問題を解決することができるソフトウェアの負荷と負荷がありますが、それらのどれも使用可能または保守可能ではありません。

私の仕事には「パズル解決」タイプのチャレンジが比較的少ないことがわかりました。課題のほとんどは、古いコードの学習、新しいAPIの学習、3年以内に人々がそれを誓わないような方法でコンポーネントのアーキテクチャを設計することです。これらはすべて挑戦的ですが、ロジックパズルの種類ほどではありません。一方、私はほとんどの時間をコンパイラーの最適化アルゴリズムについて考えており、それが得意な同僚がいます。

プログラマーが「自分のやっていることをどうやって良くすることができるか」を常に考えることは重要だと思いますが、優秀なプログラマーであることは必ずしもパズルを解くのが得意であることを要求しません。

個人的には、「ミステリージオキャッシュ」を解決することでパズル解決の修正を取得しています。


しかし、ホットスタートアップの多くは、パズルを解くスキルにのみ重点を置いています。Facebookを利用してください。パズルを解くのが苦手なら、そこに応募する資格さえありません!
ジョン

6
Facebookには、数千ものCVをふるいにかけることを避けるための最初のチェックとしてパズルロボットがあります。FBで働きたいのであれば、そのような問題を解決できる必要がありますが、他にもたくさんの良い場所があります。
JesperE

素晴らしい答え。私も安心します... =]
ハートリーブロディ

9

あなたが知っているほど、あなたがほんの少ししか知らないことに気付くように、あなたに警告させてください。

それによってがっかりしないでください。学習を続け、不足していることに気付いた分野に取り組みましょう。

それでは、あなたの質問にお進みください。私の提案は、project eule rの問題に取り組むことです。

私の理由は簡単で、最も一般的な質問から始めましょう。これらは通常、解決しやすい問題です。

問題に直面したとき、それを試して解決し、自分で作業して、さまざまなアプローチを試してください。プロジェクトオイラーの仕組みにより、回答を確認およびテストできます。

この問題を解決できないと判断した場合、問題の調査を開始します(答えを探しません)。再試行しません。

問題を解決すると、プロジェクトオイラーには、各言語実装のベストアンサーを示すセクションがあります。あなたの好みの言語で彼らの答えを調べ、彼らの解決策とそれに入った考え方を理解してください。

今、彼らが提供した答えを閉じ、あなたが再びそれを解決するまで、自分でもう一度やり直してください。

十分に練習すれば、これらの問題を解決するためのロジックと思考がより簡単になります。


4

ほとんどのプログラミングジョブは、多くのロジックを必要としません。しかし、これらはあなたが好きな仕事ではないかもしれません。

一般的なガイドラインとして、アルゴリズムと構造を学習してみてください。SkienaのThe Algorithm Designマニュアルをアドバイスできます。これらがわかったら、問題の分類を開始します。これは巡回セールスマンの問題によく似ています。ここではツリーを使用でき、ここではバイナリ検索を使用できます...

Project Eulerにはさまざまなパズルがあります。これらの多くは、基本的な数学の知識があれば簡単に実行できます。他のアルゴリズムは、これらのアルゴリズムのいくつかを知っていれば簡単に解決できます。


2

私はあなたがプログラミングの旅から始めたばかりだと非常に信じているので、まずそれを把握して正しくするのに時間がかかるなら、それは問題ではないようです。それが作る唯一の違いは、試行ごとにWoWのようなものを学ぶことです!!私が最後にしたことはまったく意味がありませんcoz私は10進数が必要であり、2倍ではありません

パズルを解くことに興味がない場合は、そのために頭を探すことは避けてください。コードベースを知ったら、他の論理的な問題が浮かんできます。 。(あなたが何らかの過ちを犯しても心配しないでください、あなたの方法論が間違っている理由を知るのに役立つので、熱心なオブザーバーと適切なリスナーになります)

落ち着くまでに少し時間がかかります。その後、すべてのシリンダーで発砲するかもしれません。言うまでもなく、GoogleやSOでソリューションを検索する衝動を避け、最後から努力して、疑わしい場合やまったく無知な場合にのみブラウザを起動してください。


1

何よりもまず、自分の弱さを知ることは実際の強さであるため、より良いゲームを手に入れるには何を学ぶべきかを知っています。

私のアドバイスは、ロジックの問題を解決する多くのコードを読むことです。誰もがパズルを解くのに独自のスタイルを持っているので、コードを読むことで、これをどのように学べるかを教えてくれるかもしれません。さらに、コードを理解できると、問題を説明する数学的理論も示される可能性があるため、その過程で基礎となる問題についても学習します。

乾杯、カルロ


1

これに追加する必要があると思います。

選択した答えがすでに述べているように、あなたの弱さを知ることは大きな利点であり、問​​題解決のテクニックを学ぶためのいくつかの基本的なツールがあります。しかし、答えに欠けていると思うのは、単に難しい問題を実践する方法を見つけることです-多くのことです。試行するすべての問題を完全に解決することに頑固です。問題解決のテーマに関する本を読むのと同じように、多くのコードのコードを読むことは良いことですが、コードを書くことはほとんどより重要です。

いくつかの点で、私たちは同じ弱点を共有しています(ただし、それはあなたが考えるほど悪くはありません)。私の問題解決スキルを練習するために、私は常にプロジェクトEulerまたはHackerRankの問題に取り組んでいます。簡単な問題であれば、7つのプログラミング言語を選択し、すべての言語で解決しようとします。より難しい問題については、問題に費やす時間を合理的に保つために、互いに非常に異なる3つの言語を選択する場合があります。すべての問題について、解決策を思いついたら、他の人が思いついた解決策を探し、それらを理解していることを確認します。何らかの解決策を理解していない場合は、いつでもStackOverflowに投稿するか、おそらくプログラマーのStack Exchangeなどに投稿することができます。サイトには質問に答えられる人がいると確信しています(そうでないことはめったにありません)。

ただし、基本的には、読んでいるだけでなく練習していることを確認し、たくさん練習してください。スポーツと同じように、明確な思考には時間と労力がかかります。

問題についての考え方を支援するためにできるもう1つのことは、最初に解決する問題のテストスイートを作成することです。問題を完全に理解しないと、問題の良いテストを書くことはできません。異なる言語でこれを行うと、異なるテスト手法を同時に教えることができるという利点があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.