自分の技術(プログラミング)を深く理解するために習得すべきプログラミング概念は何ですか?[閉まっている]


13

重要な順序で、そうすることが可能であり、そうでない場合、プログラム方法を知るための最も重要な基礎は何ですか。アルゴリズム、反復、再帰など?

私がどこに置くかなどは私の質問のあるところです。私は最近、10人のプログラマーのうち9人がプログラムをあえぎできないと言っているインターネットの投稿を読みました!

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

プログラミングの際に実際に達成しようとしていることについて深い知識と、自由に使える基本的なツールの徹底的な理解が必要です。基本的に私は風のすべての色でペイントできるようにしたい。


3
ジェフ・アトウッドの投稿は、実際には深いプログラミング知識に関するものではありません...多くの人々がプログラミングに関する基本的で基本的な洞察を欠いているという現実と、それらの基本的な洞察の欠如が重要なプログラミングスキルの開発を妨げる方法についてです。
ロバートハーベイ

2
この質問が閉じられた理由がわかりません。これは5回スターが付けられた質問であり、多くの有益な回答があります。これは私が知りたい種類の情報です-単純な答えがないからといって、その情報が価値のないものではないというわけではありません。
ロックラン

@LachlanB再開に投票しました...成功するためにさらに4票が必要です
マイケルブラウン

これは良い質問だと思いますが、このサイトの形式には妥当な答えが長すぎます。優れた大学のカリキュラムはこれらの概念をカバーしますが、そのようなカリキュラムは数年の熱心な研究と実践を必要とし、実際のプロジェクトでさらに数年を要するという事実は、答えがここに収まらない理由を明らかにする必要があります。
ジョルジオ

回答:


18

このリストは出発点です...あなたは大きな質問をしています!

  • 顧客が望むものを明確にし、書き留める方法(「要件」)。これはそれ自体が芸術です。これができれば、プログラミングの仕事はずっと良くなります。
  • 計画の見積もりとプロジェクトの方法。人々はあなたに見積もりを求め、準備します。
  • 他の人のコードを建設的にレビューする方法。
  • デザインパターン。これは大きなものです。しかし、そのために熱心に使用しないでください。
  • バグ、問題、機能リクエストの違いを学ぶ
  • フレームワーク/ライブラリを最新の状態に保ちます。あなたはそれらを使用する必要はありませんが、彼らが何をし、彼らの長所/短所を知っている必要があります。何かが難しいと思われる場合は、おそらく(できれば)はるかに簡単な方法があります。
  • 複雑なアルゴリズムをフローチャートで文書化する方法、または英語で書き出す方法。誰かがコードをリバースエンジニアリングしようとして2日間を費やすことを期待しないでください。
  • 誰でも理解できるようにコード構造を整理する方法
  • コードをコメントする方法
  • 単体テストの書き方
  • ボンネットの下で何が起こっているかを把握します。たとえば、Webサービスの呼び出し-実際には何をしているのでしょうか?
  • ロジックをクラスに抽象化する方法。
  • コードをリファクタリングする方法
  • かなりの数のプログラミング言語の要点を学んでください。他の分野から学べることに驚くでしょう
  • 他のプログラマに何を書くかを伝える方法。
  • あなたが何をしているのか、そしてその理由を経営陣に説明する方法。
  • ピーターが言ったように、デバッグ方法。私は彼が言うことすべてに同意します、本当のプログラマーは推測するだけでなくデバッグします。
  • マニアックを扱う方法。それらの多くはそこにあります。
  • スタッフを取得する方法。あなたが何かを成し遂げられないなら、世界のすべての理論はあなたを助けません。

ここで、同様の内容(同様の内容)に沿って別の質問に答えました。

プロのコードをレンダリングするためのヒント、ガイドライン、覚えておくべきポイントは?


1
+1:GET STUFF DONE!数年前、私はこれがエンジニアの特徴であると言った暴言を投稿しました。時々それはきれいではありません、そして時々あなたは戻ってそれをやり直さなければなりませんが、一日の終わりに彼らは仕事を
ピーター・ロウェル

@PeterRowell:これは興味深い読み物だと思うかもしれません:brandonsavage.net/when-to-write-bad-code
Marjan Venema

残念ながら、この質問は実際にはQ&Aの哲学とサイトの形式に適合するものではありませんが、回答の価値を最小化するものではありません。それを拡張し、各ポイントに少し説明を加えたい場合は、コミュニティブログの素晴らしいブログ投稿になります。
ヤンニス

@MarjanVenema:はい、私は彼に完全に同意します。80年代に戻って、私はコーディングを開始する前に承認される新しいエディターの仕様を書くことを任されました。私は理解できない何かを説明する方法を見つけようとして、1週間以上、そのひどい空白の画面を見つめていました。私のマネージャーは、私の進歩がないことに不満を表明しました。3日間の週末の後、彼は自分の机の上に下書きを持っていました。彼は何が起こったのかと尋ね、私は週末にエディターを書いたと言って、それから単に私が働いていたものの仕様を書いた。コードの一部を書き直しましたが、ほとんどはリファクタリング/クリーンアップでした。
ピーター・ロウェル

1
@YannisRizos-これに関するブログを書くことに興味があります。ガイドラインを記載したメールを私に送信しますか、それとも何かを書き上げる必要がありますか?
ロックラン

22

etc.などの見出しの下には、時間の50%以上を簡単に費やすことができるものがあります。

デバッグ方法を学びます。

これは、科学的方法を学ぶことを意味します。本当に学んでいるということです。そして、残忍な自己正直でそれを適用します。あなたが知っていることは真実、あなたが知っていることは真実でない、そしてあなたが知らないことを正確に述べる方法を学びましょう。アイテムを誤って誤ったカテゴリに割り当てると、人生がずっと難しくなります。

「知っている」の代わりに「思う」と言うことを学びます。何かが真(または偽)である「考える」場合にのみ「I know」と言うことができ、それを証明します!

多くのバグは些細なものですが、コードがどうあるべきかを「知っている」ため、見にくい場合があります。それを説明する友人を見つけてください。あなたのコードを知らないが、あなたがBSを吹き飛ばすことができないことを知っている人:「専門家のばか」であることを彼らに依頼してください。彼らにそれを説明している最中に突然立ち止まって、「そして…あなたは…それを見て…それを見て…ありがとう。」と言っても驚かないでください。

自明でないバグには、多くの技術が必要です。タイミングに関係しないほとんどのバグをすばやくスポットできるクラシックは、アラスカのウルフフェンスです。アラスカのどこかにオオカミがいます。状態を半分に切るフェンスを構築します。オオカミはどちら側にいますか?その辺を半分に切ります。泡立て、すすぎ、繰り返します。これをコード内の適切に選択された場所で20回行うと、バグ(オオカミ)が存在する可能性のある領域が1/1048576に減少します。そのオオカミを殺します。

ヒント:物理的、精神的、またはその他の種類のハンドウェーブを探します。あなた(またはあなたの同僚)がコードの一部に注意を向ける/迂回する/注意を最小化するとすぐに、完全に狂暴になります。何時間も何日もd * mnを探して、それでも見つけられないにもかかわらず、バグを知っているだけの領域はありえないからです。誰も「さようなら」をもらわず、誰も(マシン、OS、コンパイラー、またはあなたを含む)いかなる種類の「正当な敬意」ももらえません。バグがあります。限目。文の終わり。さあ、d * mnを殺してください。

デバッグをそれ自体の主題として教える学校はありません。IMNSHO、これは彼ら(大学/教授)があなたにプログラマーであることを教えていないという最も明白な証拠かもしれませんが、彼らはあなたに彼らのように教えているのですか... 厳しい?おそらく。本当?自分で決めてください。今それを証明します。


あなたがに興味がある可能性がありサフスクイーズ、技術はテストとデバッグのためのリファクタリングを使用していますケント・ベックによって記述:ヒット「日、高、ヒット」日低:回帰テストとケントベック、スリーリバーズ研究所サフスクイーズ(要約:への欠陥を効果的に隔離し、システムレベルのテストから始めて、欠陥を実証する可能な限り最小のテストになるまで徐々にインラインおよびプルーニングを行います。
ヨルグWミットタグ

1
すばらしい答え-誰でもコードを書くことができ、実際のプログラマーはデバッグする。
ロックラン

@JörgWMittag:私は自動回帰テストの大ファンです。80年代半ばに検索エンジンプロジェクトで最初に使用しましたが、無害なコードの一部に「マイナーな」変更が生じたように見えるものが落ちてくることにショックを受けました。(注:これはCの200,000以上のSLOCであり、メモリ管理の問題は私たちの存在の悩みの種でした。)
ピーターロウェル

3

優先順位の高いリストが必要な場合は特に、これは決定的または正式に答える人にとって非常に大きな質問になると思います。そこには多くのプログラマがいて、彼らは非常に異なることに取り組んでいます-確かに、基本は同じままですが、メモリでアクティブに保つために必要なものは本当に異なる可能性があり、実際にあなたがきれいに滞在できる多くのタスクがあります深く行くことなく高レベル。

しかし、あなたはただの商売ではなく、より良い開発者になる方法を本当に心配しているようです。私はそれを称賛に値し、プログラミングの方法を学ぶのに役立ったいくつかのことを共有できます。

ほとんどすべてのプログラミングは、アルゴリズムとデータ構造に要約されます。これらは、より大きな疑問の例です。現実の世界の物やプロセスを、コンピューターが理解できるようにどのようにモデル化するのでしょうか。始めたばかりの場合は、データ構造とアルゴリズムの実装に慣れるために、高レベルのプログラミング言語(Java、Pythonなど)を使用すると便利です。

ある時点で、データ構造とアルゴリズムをいじくり回した後、「しかし、コンピューターに何をすべきか、実際にそれを行うコンピューターに指示することからどのように進むのでしょうか?」次に、コンピューターが実際に計算する方法-メモリとCPUがどのように連携して命令を実行するか、オペレーティングシステムがハードウェアを抽象化して、特定の低レベルにコーディングせずにファイルを開くプログラムを作成する方法を調べることができますハードドライブインターフェイス。

これはおそらく、開始するのに適したポイントです-アルゴリズムとデータ構造が実際の問題をどのようにモデル化するか、コンピューターが実際に計算を実行する方法。後者を知ることは、オブジェクト指向やスクリプト言語よりもはるかに少ない煙とミラーを利用するCのような低レベル言語を習得するのに非常に役立ちます:)


2

YAGNI:「実際に必要なときは常に実装し、必要なことを予見するときは決して実装しない」

私の経験では、「プログラマー」が将来多くのケースを予測し、それらを予測するためにコードを追加することでコードを「改善」しようとするのが一般的です!ほとんどの場合、彼らが追加したコードはコードを膨張させ、コードを複雑にします。


1

プログラマーであることについて知っておくべき最も重要なことは、コードを書くことは骨の折れることであり、あなたが生産するために支払われているものを生産するための職人のような「ブルーカラー」態度は、難解な学習よりもあなたを遠くに連れて行きます。

ゾーンに入ることを学ぶ。それは、あなたがあなたの仕事だけに集中していて、頭の中に非常に多くのものを保持し始めることができ、それらが一度に相互運用する方法を始めるときの精神状態を意味します。ゾーンに自由に入ることができるようになったら、残りについて心配し始めます。ある種のコードが何かを打ち砕くようにコードを打ち砕くことができるまで、残りは事実上役に立たない。

編集:

もしあなたがこれを信じず、あなたが私を支持しなかったら、私はあなたが20年間それをする決心があるかどうかわからないと信じています。私はこれを受け入れるからそうすることを知っています。;)


0

これに何らかの形で関連する最近の質問とAnswerに は、このブログへのリンクがあり、同じ問題を異なる角度から議論しています。

おそらく、開発者にとって最も重要な概念は「謙虚さ」です。...すべてを理解していないことに同意すると、ソリューションを探求することになります。プログラミングに関するブログを書いている人のほとんどはトップパーセンタイルであり、問​​題は多くがまだ自己陶酔的な傾向を制御していないことです。暴言を無視

リンクされたブログはほんとうに暴言に過ぎません-すべての業界で、最近の卒業生は役に立たないことが一般的であり、有用で生産的になるには何年もかかると文句を言います。おそらく問題は、これらの自称グルが実際にあまりにも多くを期待しており、一度FizzBu​​zzを解決できなかったことを忘れていたことです。全員が上位10パーセンタイルにいるわけではありません。定義上、プログラマーの半分は平均以下です......


私は人々が大いに非難することに同意しますが、上記のリンクの投稿のポイントは、FizzBu​​zzを解決する方法を知らなかった人々がプログラミングの仕事応募していたことだと思いますプログラミングのイディオムの周りのあなたの頭。謙虚さについてはあなたの意見に同意しますが、多くの人はそれが何であるかを知らないようです。
-RuslanD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.