web-dev-qa-db-ja.com

私は(ロジック上)良いプログラマではありません。どうすれば修正できますか?

わかりました、ここに私の問題があります:

私は大企業で働いています。面接が簡単だったので、なんとなく仕事に就いた人もいます。自分のことを知らないというわけではありません。Javaやライブラリなどを理解するのはかなり得意です。

しかし、論理的な問題を解決しようとすると、解決策を見つけるのが非常に難しくなります。

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

私は馬鹿げていると感じ、ソフトウェアエンジニアとしての価値はありません。 パズル解決能力 は、優れたプログラマーが本来持っているはずです。しかし、私がいくつかのパズルを解こうとすると、解決策を見つけることができず、ググってみます!

職場で問題(xyz機能の実装など)が与えられたとき、私はかなり迅速に対応し、職場でそれを尊重していますが、私はそれをまったく誇りに思っていません。数学的または論理的に賢い挑戦的な問題を解こうとすると、私はあちこち探します。私は今でも(エンジニアとして)自分のしていることが好きだと感じていますが、友達が思いついた難しいロジックの問題を解決できないのは本当に悲しいです。

私は意気消沈しました:(

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

だから、私の質問は:

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

PS:私はCSで教育を受けたことはありませんでした(私の学部生はエレクトリックでした)。しかし、それは厄介な開発者であることの言い訳にはなりません。

ありがとう!

50
John

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

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

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

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

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

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

最後に、問題解決のための他の主要なツールは、simpleステップで分解することです。たとえば、 project Euler's examples の最初の問題:

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プログラミングの芸術 を提案します。それらをチェーン化すると、非常に複雑な問題を解決できます。これらの概念が役に立った回数を数えることはできません。

24
Spencer Rathbun

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

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

プログラマーは常に「自分の仕事をもっと上手にするにはどうすればよいか」を常に考えることが重要だと思いますが、優れたプログラマーであるには、パズルを解くことに長けている必要はありません。

個人的に、私は "mystery geocaches" を解決することによって私のパズル解決修正を取得します。

19
JesperE

警告させてください、あなたが知っているほど、あなたはあなたがどれだけあなたが知っているかを知るだけです。

それによってがっかりしないでください。学習を続け、不足していることに気づく領域に取り組みます。

それではあなたの質問に移りましょう。私の提案は project eule rの問題に取り掛かることです。

これの私の理由は単純です。最も人気のある質問から始めます。これらは通常、解決しやすい問題です。

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

この問題を解決できないと判断した場合は、問題の調査を開始してください(答えを探していません)。再試行する必要はありません。

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

ここで、彼らが提供した答えを閉じ、もう一度解くまで自分でやり直してください。

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

9
SetiSeeker

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

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

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

4
Carra

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

パズルを解くことに興味がない場合は、そのために頭を探し回る必要はありません。コードベースがわかったら、他の論理的な問題が浮かびます。それらに取り組み、メンターまたはリードに提案された編集を提示することを選択できます。 。 (あなたがいくつかの失敗をしても彼らがあなたの方法論が間違っている理由を知るのに役立つので心配しないでください、それで鋭い観察者と適切なリスナーになります)

落ち着くまでに少し時間がかかり、すべてのシリンダーで発砲する可能性があります。言うまでもなく、GoogleまたはSOで解決策を検索するという衝動を避け、あなたの側からいくつかの努力をし、疑わしいまたは完全に無知である場合にのみブラウザを起動してください

2
V4Vendetta

これに加えるべきだと思います。

選ばれた答えがすでに述べたように、あなたの弱点を知ることは大きな利点であり、問​​題解決技術を学ぶためのいくつかの基本的なツールがあります。しかし、私が答えに欠けていると思うのは、単に難しい問題を実践する方法を見つけることだけです-たくさん。あなたが試みるすべての問題を完全に終えることについて頑固になってください。コードを読むこと、たくさんのコードを読むこと、問題解決についての本を読むことは良いことですが、コードを書くことはほとんど重要です。

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

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

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

1
Josiah

第一に、あなたの弱点を知ることは実際の強さなので、より良いゲームを得るために何を学ぶべきかを知っています。

私のアドバイスは、ロジックの問題を解決する多くのコードを読むことです。誰もがパズルを解くのに独自のスタイルを持っています。コードを読むと、これを行う方法を学ぶ方法がわかるかもしれません。さらに、コードを理解できるということは、おそらく問題を説明する数学的理論も示しているので、その過程で根本的な問題についても学ぶことができます。

乾杯、カルロ

1
Carlo Kuip