すべてのプログラマーがプログラミングについて知っておくべきことは何ですか?


52

技術的な問題とどまり、行動、文化、キャリア、政治的な問題を避けください。


7
これも参照してくださいstackoverflow.com/questions/132798/...
pramodc84

この種の質問は本当に私を困らせます。それは世界を白黒で見ている人の心からのみ湧き出ることができます。すべてのプログラマーが同じ仕事をしているわけではなく、もしそれがあなたが探している最小の共通分母であるなら、以下の答えはあなたがただのピートのリストに終わることを示しています。
キャプテンセンシブル

回答:


92
  1. バグはであるあなたのコードではなく、コンパイラやランタイムライブラリ。

  2. 発生する可能性のないバグが見つかった場合は、プログラムを正しくビルドおよび展開したことを確認してください。(特に、煩雑な詳細を隠そうとする複雑なIDEまたはビルドフレームワークを使用している場合、またはビルドに多くの手動ステップが含まれる場合)

  3. 並行/マルチスレッドプログラムは、記述が難しく、適切にテストするのが困難です。同時実行ライブラリとフレームワークにできる限り委任することをお勧めします。

  4. ドキュメントの作成は、プログラマーとしての仕事の一部です。「他の誰か」に任せないでください。

編集

はい、私のポイント#1は誇張されています。最高の設計されたアプリケーションプラットフォームでさえ、バグのシェアを持っています。そして、あまり良く設計されていないもののいくつかは、それらであふれています。しかし、そうであっても、常に最初にコードを疑い、コードに誤りがないという明確な証拠がある場合にのみ、コンパイラ/ライブラリのバグを非難し始めてください。

C / C ++開発を行った頃、オプティマイザーの「バグ」が原因であることが判明した場合や、言語仕様に記載されていることを行った他のプログラマーが未定義の結果をもたらした場合を覚えています。これは、Javaのような安全性の高い言語にも当てはまります。たとえば、Javaメモリモデルをじっくりと見てください(JLS 17章)。


17
ランタイムライブラリのバグに何度か出くわしたので、「バグはおそらくあなたのコードにある」と言いたいです。ただし、コンパイラのバグにまだ遭遇していません。とにかく+1。
チンメイカンチ

29
コンパイラーに正真正銘のバグを発見したことがないのであれば、コーディングについてはほとんど冒険的ではありません。;)
メイソン・ホイーラー

8
@ Chinmay、@ spudd86、@ Mason-はい...そして、30年以上のプログラミングでコンパイラとライブラリのバグのシェアを見つけました。しかし、私の経験では、バグの99%以上が(少なくとも部分的に)私のコードのせいであることが判明しました。私の答えは、あなたが常に最初にコードを疑うべきであるという点を理解するために、これを意図的に誇張しています。
スティーブンC

5
私は、人々がマルチスレッドプログラミングを使用しているという不合理な恐怖を感じません。私は、この見方を永続させ、多くのマルチスレッドコードをプログラミングしない人々を疑っています。そんなに難しくない。ただし、他のすべての場合は+1。
スティーブンエバーズ

4
コンパイラで作業している場合、バグはおそらくあなたのコードとコンパイラの両方にあります;)
Legooolas

84
  • 他の人のコードを読む方法。
  • バージョン管理システムでチェックされていない場合、コードは存在しません。

8
バージョン管理コメントができたら+10000。履歴と変更ログは絶対に不可欠であり、最初からすべてをバージョン管理する必要があるのはこのためです。
レグーラ

2
...そして、リポジトリが少なくとも1つの他の場所に同期されました。DVCSでは重要ですが、集中型VCSでも重要です。

さらに言えば、開発者にコードの作成を許可するワークアイテムが存在しない限り、コードは存在しません。
ジェシーC.スライサー

2
他の人のコードの読み方を学ぶために1つ加えます。私たちのほとんどが気づくのはもっと難しいですが、成功するプログラミングの重要な部分です。
ボギーミン

さらに、他の人のコードの読み方を学ぶための1つ。
itsaboutcode

76

浮動小数点計算は正確ではありません



誰かが私が話していることを知らない場合は、@ Adamのリンクを読んでください。浮動小数点計算の落とし穴の優れた要約です。
チンメイカンチ

1
そして、彼らが知らないなら、彼らは毎日stackoverflowで尋ねる人々のセットの中にいることができます。
ブライアンR.ボンディ

1
@ブライアン:そうですね。浮動小数点演算によって説明される質問を特定する方法があればいいのにと思います。毎日異なる浮動小数点の質問を表示するStackアプリを作成できます!
アダムペインター

63

学習をやめないでください。


1
関連:信じることをやめないでください。
フィッシュトースター

3
関連:明日について考えるのをやめないでください。
オコド

7
関連:音楽を止めないでください。
adamk

1
関連:movin 'を止めないでください!それはあなたの人生です、動き続けて、それを正しくしてください、あなたはそれを正しく取得する必要があります!
オコド

44

コードの品質と保守性を向上させるためにできる一番のことは、重複を削減することです。


4
乾いた、はい!どうすれば忘れられますか?;-)
マニエロ

これは非常に重要で、私はそれで再び答えまし

私はむしろ言いたい:条件を減らす。while / if / forはそれぞれ潜在的なバグです。
zvrba

1
DRYの面白いところは、どこでも繰り返されることです。:) +1
ビリーONeal

39

トラブルシューティングとデバッグのスキル

彼らは私が受講したどのプログラミングコースでもこのトピックにほとんど時間を費やしておらず、私の経験では、プログラマの生産性の最大の決定要因の1つです。好むと好まざるとにかかわらず、アプリのメンテナンス段階では、新しい開発段階よりも多くの時間を費やします。

私は、問題を見つけるための戦略なしに、ランダムに変更することによってデバッグする非常に多くのプログラマーと協力しました。この会話は何十回もありました。

他のプログラマー:修正されるかどうかを確認する必要があると思います。
私:さて、それはそれを修正すると仮定します。それは、問題の原因がどこにあるのかを教えてくれますか?
他のプログラマー:わかりませんが、何か試してみる必要があります


2
これを投稿しようとしていました。プログラマの仕事の多くはバグを修正することであり、多くの人はそうすることができない傾向があります(特に他のコードでは)。
ドブ

+1私はjavascript / phpからC#に移行し、コードのステップ実行に夢中になりました。動的に型付けされた言語がこれをはるかに良くできることを望みます。
エヴァンプライス

もう1つの奇妙な動作は、プログラマーが自分のプログラムのすべての部分が正しいと主張する一方で、結果に欠陥がある場合です。「-上記の行はarray.sort()であるため、ソートされているかどうかを確認するためにコンソールに配列を印刷する必要はありません。」「-まあ...それは機能していません。どこかに問題があるはずです。この時点でコードを守ることはできません!」
ガウィ

2
あなたのプログラム全体であなたの仮定を検証するためのデバッグのポイントだと思います。時々、手がかりを求めて釣りに行く必要があります。これは体系的に行われなければなりません。何か新しいことを伝えるかもしれない何かを試すことは完全に有効です。私はよくやります。
ガウィ

37
  1. 賢くならないでください。明確にしてください。
  2. 再利用の前に使用してください。
  3. 名前は重要です。
  4. 関数は1つのことを行い、それをうまく行います。
  5. 小さい方が大きいよりも優れています。

2
「再利用前に使用」を明確にできますか。聞いたことはありません。
-Tjaart

34

基礎。現在、プログラマは概念ではなく技術を学びます。それは間違っています。


はいといいえ。あなたは、私が大学にいたすべての教授のように聞こえます...誰もが生涯ソフトウェアをなめたことはありませんでした。私たちの職業では、スキルのない知識は役に立ちません。
スティーブンエバーズ

4
+1、そう本当。はい、これはアイボリータワーのようなタイプの言葉ですが、trenchにいる私たちのほかの人にとっては真実ではありません。
MAK

2
綴りのような基本?たとえばであるIts wrong必要がありますit's wrong
コネラック

2
いいえ、次のような基本はタイプミスではなく、プログラミングの問題です。
clrod

5
何かをするための手順を学ぶのは簡単であり、多くの場合、いつ使用すべきか、そしてもっと重要なのは使用すべきだがすべきではないことを見つけるのは難しいです。教科書は、方法を示すのが特に苦手ですが、理由を示すことはできません(なぜそうでないか)。
HLGEM

27

すべてのプログラマーは、「この数値は正で有限である」、「このコードは一瞬のうちに常にサーバーに接続できる」など、常にコードに仮定を置いていることを知っている必要があります。

そして、彼は、それらの仮定が破られたときに備えなければならないことを知っているべきです。


6
明確にそれらを述べassert()ます-どこでも。 assert()あなたの仮定を文書化し、間違っているときにあなたを救うのに役立ちます。
ダスティン

@Dustin +1すべての仮定を覚えておく方法はありません。それらをプログラムで文書化すれば、間違った仮定になったときに正確に通知されます。
スキルドリック

1
... NDEBUGでコンパイルしない限り。


17

概念を学ぶ。Google構文を使用できます。


Googleは特定の構文を見つけるのがひどいことを除いて、理論的には良いです。「オブジェクト参照」や「this」のような用語を検索すると膨大な結果が得られ、「$?」のようなイディオムを検索できます。結果がまったくありません。
l0b0


14

単体テスト。これは、コードの使用方法に関する前提を体系化するのに最適な方法です。



13

それはあなたが思うより難しいです。

通常使用時に機能する何かをまとめるのは簡単ですが、誤った入力、すべてのエッジおよびコーナーケース、起こりうる障害モードなどに対処するのは時間がかかり、おそらく最も難しい部分です。

次に、アプリケーションの見栄えも良くする必要があります。


3
私はこれが古いことわざの源であると思います。'90%の作業には90%の時間がかかります。最後の10%が「時間の他の90%を取る
GSto

多くの人が複雑さを常に過小評価する傾向があると思います。「Xはどれだけ難しいのでしょうか?」-有名な最後の言葉:/
ロマン・スターコフ

@GSto私は時間の180%を働きたくありません、100%は私で大丈夫です!
adamk



11

ポインタ、明らかに。:)


3
ポインターは、タスクのごく一部の言語のサブセットでのみ本当に必要です。ほとんどのタスクでは、ポインタの概念が存在しないかのようにプログラムできます(そしてできるはずです)。
チンマイカンチ

14
@Chinay Kanchi No.ポインタは誰もが理解する必要があります。
代替案

5
それは本当にポインタの意味に依存します。あなたが操作できるCスタイルのポインターを意味する場合(これは私が仮定したものです)、Java / C#/ Pythonプログラマーはそれらについて何も知る必要がないと主張します。Javaの「参照」のようにポインター、つまり、いじることのできないポインターを意味する場合、はい、あなたが滑らないようにするためだけに、それらの知識が必要です。
チンメイカンチ

@mathepicポインタに関する最初の事柄を理解していないCS学生が毎年何人卒業するかを知ると、あなたは核心に揺さぶられるでしょう。毎年夏にプレースメントを取るために外に出ていなかったら、CのポインターやJavaの参照についても教えられなかったでしょう…
マイクB

5
@Chinmay:ポインターの概念を理解していないPython / Java / C#プログラマーは失われます。 L = [[]] * 2; L[0].append(42) 異なる言語は異なる名前を使用しますが、間接指定はどこでも不可欠です。

11

コード完了2-カバーツーカバー


プログラムにお金を受け入れる前に、これを本当に知っておく必要があります。知らないことを見つけた場合は、キャリアを変えるか、集中的な自主学習のいずれかを検討してください。そして同僚に謝罪します。そして、それはプログラミングの基本のみをカバーしています。
ティムウィリスクロフト

11

データはコードよりも重要です。

データがスマートな場合、コードは愚かになる可能性があります。

ダムコードは理解しやすいです。スマートデータも同様です。

私がこれまで経験したほとんどすべてのアルゴリズムの悲嘆は、データが間違った場所にあるか、その真の意味を濫用したことが原因です。データに意味がある場合は、その意味を型システムに入れてください。


2
「型システム」と言うまで、ずっと私がいました。


10

分割統治。通常、スケジューリングからデバッグまで、あらゆるタイプの実用的な問題を解決するための最良の方法です。


8

真のスキルは、複雑なデザインを機能させることではなく、シンプルなデザインをうまく実行する能力に反映されます。

このスキルは、不可解なものをマスターするのではなく、基本をよりよくマスターすることから生まれます。優秀なプログラマーは、他の人ができないこと(高レベルの機能、高度な機能プログラミング、what-have-youを使用)をコーディングする能力によって定義されるのではなく、完全にありふれたコーディングを洗練する能力に定義されます。クラス間の機能の適切な分解の選択。堅牢性の構築; 防御的なプログラミング手法を使用します。そして、より多くの自己文書化につながるパターンと名前を使用して、これらは高度なプログラミングの基本です。

自分または他の誰かが1週間、1か月、または1年で戻ってくることができ、そのコードを使用、変更、強化、または拡張する方法を理解できる適切なコードを書くことが重要です。時間と精神的な労力を節約できます。それはあなたが前につまずいたはずの障害を取り除くことで生産性の車輪に油を差します(おそらくあなたの思考の流れを中断したり、おそらく他の仕事から数時間または数日努力を払うなど)困難な問題に集中するのを容易にします、場合によっては難しい問題がなくなります。

一言で言えば、エレガンス。すべてのクラス、すべてのメソッド、すべての条件、すべてのブロック、すべての変数名:優雅さのために努力します。


8

よりクリーンなユーザーエクスペリエンスまたはより良いドキュメントで修正できるものをユーザーに非難しないでください。多くの場合、プログラマーは、問題が全体的なエクスペリエンスの低下またはコミュニケーションの欠如である場合、ユーザーは正しく何もできないバカだと自動的に想定します。プログラムは使用されることを意図しており、ユーザーを軽して扱うことは、そもそもプログラミングのポイントを見逃すことです。


6

すべてのプログラマーは、デバッガーの使用方法と、デバッガーの適切な使用方法を知っている必要があります





4

機能の実装にかかる時間を正確に推定する方法。さらに重要なことは、その見積もりを提出するときに強気でないことを伝える方法です。


2
または、うまくゲスト化する方法を学び、ゲスト化していないことを伝えます;;)
ビリークーバー

4

コーディングスタイルが重要:

  • 一貫したインデントの問題、
  • 空白の一貫した使用(例:オペレーターの周り)、
  • {}の事項の一貫した配置、
  • 適切に選択された識別子が重要です。

...そして良いデザインが重要です。

理想的には、プログラマはこれらのことを最初のコードレビューの前(またはその最中)に学習します。最悪の場合、上司が恐ろしいコードに重要な変更を急いで行うように命じると、プログラマはそれらを学習します。

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