技術的な問題に留まる、行動、文化、キャリア、政治の問題は避けてください。
バグはyourコードにあり、コンパイラやランタイムライブラリにはありません。
発生する可能性のないバグが見つかった場合は、プログラムが正しくビルドおよびデプロイされていることを確認してください。 (特に、複雑なIDEまたは乱雑な詳細をユーザーから隠そうとするビルドフレームワークを使用している場合...または、ビルドに多くの手動ステップが含まれる場合。)
並行/マルチスレッドプログラムは作成が難しく、適切にテストすることが困難です。並行処理ライブラリとフレームワークにできるだけ多くの権限を委任することをお勧めします。
ドキュメントを書くことは、プログラマーとしてのあなたの仕事の一部です。 「他の誰か」に任せないでください。
[〜#〜]編集[〜#〜]
はい、私のポイント1は誇張されています。最高の設計のアプリケーションプラットフォームでさえ、バグのシェアがあり、あまりよく設計されていないものの一部がそれらに満ちています。それでも、常にコードを疑って最初に、コンパイラ/ライブラリのバグを非難するのはがあるときだけにしてくださいclearコードに問題がないことの証拠。
私がC/C++開発を行った当時、オプティマイザの「バグ」が原因であることが判明したのは、私/他のプログラマが言語仕様に規定されていない結果をもたらしたためです。これは、Javaのようにおそらく安全な言語にも当てはまります。例えばJavaメモリモデル(JLS 17章))をよく見てください。
浮動小数点の計算はnot正確です。
学習を止めないでください。
コードの品質と保守性を向上させるためにできる一番のことは、重複を減らすことです。
トラブルシューティングとデバッグのスキル
私が受講したどのプログラミングコースでも、このトピックに時間を費やすことはほとんどなく、私の経験では、プログラマーの生産性を決定する最大の要因の1つです。好むと好まざるとにかかわらず、アプリのメンテナンスフェーズでは、新しい開発フェーズよりも多くの時間を費やします。
私は問題を見つけるための戦略なしで、物事をランダムに変更してデバッグする非常に多くのプログラマーと協力してきました。私は何十回もこの会話をしました。
その他のプログラマ:修正されるかどうかを確認する必要があると思います。
Me:さて、それで修正されると仮定します。それは問題の原因がどこにあるかについて何を教えてくれますか?
その他のプログラマ:わかりませんが、何かを試さなければなりません。
基礎。現在、プログラマーは概念ではなく技術を学びます。それは間違っています。
すべてのプログラマーは、コードに仮定を常に入れていることを知っている必要があります。 「この数は正で有限です」、「このコードは瞬く間にいつでもサーバーに接続できます」。
そして彼は、それらの仮定が破られたときに備えるべきだと知っているべきです。
すべてのプログラマーはテストについて知っておくべきです。
学ぶ概念。構文をグーグルできます。
重要かつ論理的な思考。それなしでは何もできません。
ユニットテスト。これは、コードの使用方法に関する想定を体系化する優れた方法です。
領域知識。仕様が100%になることはありません。開発に使用している実際のドメインを知ることは、常に製品の品質を向上させます。
それはあなたが考えるよりも難しいことです。
通常の使用時に機能するものを組み合わせるのは簡単ですが、誤った入力に対処すると、すべてのEdgeとコーナーのケース、考えられる障害モードなどに時間がかかり、おそらくジョブの最も難しい部分になります。
次に、アプリケーションも見栄えよくする必要があります。
明らかに、ポインタ。 :)
コードよりもデータの方が重要です。
データがスマートな場合、コードは馬鹿げている可能性があります。
ダムコードは理解しやすいです。スマートデータも同様です。
私がこれまでに経験したほとんどすべてのアルゴリズムの悲しみは、データが間違った場所にあるか、その真の意味を悪用されていたことが原因です。データに意味がある場合その意味を型システムに入れます。
コード完了2 -カバートゥカバー
仕事に最適な言語と環境。そして、それはいつもあなたのお気に入りではありません。
分割統治。これは通常、スケジューリングからデバッグまで、あらゆるタイプの実用的な問題を解決する最良の方法です。
真のスキルは、複雑な設計を機能させる能力ではなく、単純な設計をうまく実行する能力に反映されています。
このスキルは、秘術を習得するのではなく、ファンダメンタルズを習得することで得られます。高水準のプログラマーは、他の人がコーディングできないもの(より高いレベルの関数、高度な関数型プログラミング、何を持っているかを使用して)をコーディングする能力ではなく、完全に平凡なコーディングを洗練する能力によって定義されます。クラス間の機能の適切な分解を選択する;堅牢性の構築;防御的プログラミング手法を使用する。そして、より多くの自己文書化につながるパターンと名前を使用して、これらは高品質のプログラミングの基本となるものです。
あなたまたは他の誰かが1週間、1か月、1年で戻って、そのコードを使用、変更、拡張、または拡張する方法を理解できる優れたコードを書くことは非常に重要です。それはあなたの時間と精神的な努力を節約します。これは、以前につまずいたはずの障害を取り除くことで生産性のホイールに油を差します(おそらく、思考の流れを中断したり、他の作業から数時間または数日を費やしたりすることになります)。難しい問題に集中しやすくなります。 、そして時にはそれは困難な問題を解消します。
つまり、エレガンス。すべてのクラス、すべてのメソッド、すべての条件、すべてのブロック、すべての変数名:優雅さを追求します。
よりクリーンなユーザーエクスペリエンスまたはより優れたドキュメントで修正できることをユーザーのせいにしないでください。多くの場合、プログラマーは、問題が全体的なエクスペリエンスの低下またはコミュニケーションの欠如である場合、ユーザーが正しく何もできない馬鹿であると自動的に想定します。プログラムは使用することを意図しており、ユーザーを軽蔑して扱うことは、そもそもプログラミングのポイントを逃すことです。
すべてのプログラマーは、デバッガーの使用方法と、その使用方法を知っている必要がありますwell。
Googleの使い方
データ構造
ショートサーキット評価ですが、ブール演算子について最初に教えます。
ユーザーのミスはありません。それらはユーザビリティの間違いです:
rm
を示しています。これはstillがごみ箱では機能しません。rm
、もう一度。GNUツールまたはGNOMEを具体的に選択するわけではありませんが、これらは思いつくのに最も簡単な例でした。
機能の実装にかかる時間を正確に見積もる方法。さらに重要なのは、その見積もりを提出するときに、どのように伝えるかはだまされていないということです。
コーディングスタイルが重要:
...そして良いデザインが重要です。
理想的には、プログラマーは最初のコードレビューの前(または最中)にこれらのことを学びます。最悪の場合、上司が急いでいくつかの恐ろしいコードに自明ではない変更を加えるように指示すると、プログラマーはそれらを学びます。
ここで商用ソフトウェア開発者といえば...明らかに、DODセキュリティシステムやヘッジファンドクアンタムには適用されない可能性があります。
あること-
1)OO(オブジェクト指向)を超えた他のプログラミングパラダイム)2)Visual Studioを超えた他のより優れたIDE(これは特に、WindowsとMSテクノロジのみで作業したプログラマー向けです)
コンピュータ本当にのしくみ、言語の基礎、アルゴリズム/データ構造、アルゴリズム分析、および複雑性理論のいくつかの測定。
これが言及されていないなんて信じられない
すべてのプログラマの価値は、saltが 世界対応ソフトウェア を生成できる必要があることです。
これは、すべての文字列を外部化するなどの基本的な国際化の原則に従うことを意味します。
製品が翻訳されたときに、ハードコードされた英語の文字列や、文字列が切り捨てられたダイアログなどを何度も目にしたことがありません。
単体テストは特効薬ではありません。あなたはまだバグを導入したり、間違ったテストを書いたりすることができます、そしてそれはあなたがする唯一のテストの形式ではありません。
コンピュータは意味論を理解していません。これがあるとします:
var ferrari = new Ferrari();
ferrari.DriveTo(Places.Seattle);
コンピューターには、別のタイプ名を使用して、次のように使用することもできます。
var mxEEcceqs = new safHBBdueWE();
mxEEcceqs.HYBbQAW(n3dNm.pDojeW);
名前を付けることは非常に重要ですが、タイプを「Ferrari」またはメソッドを「DriveTo」と命名したからといって、コンピューターが「意味」を知っていると誤解しないでください。
実行の順序。
驚いたことに、プログラマーと、コードを見たことのない人やコードに触れたことのない人や、ふりをするプログラマー*に話しかけると、実行順序がわかりません。制御構造を理解できない人に出会った場合は、最初にこのアイデアを頭に入れてください。その後、彼らはより速く学習することがわかります。
*はい、プログラマーとして仕事を得ることができる人たちですが、最も簡単な技術的な質問をすると、彼らは頭がおかしくなります。
すべてのプログラマーは、コンピューターサイエンスの「科学」(デザインパターン、アルゴリズム、オブジェクトなど)を知っている必要があります。それを習得できれば、任意の言語を使用してプログラミングできます。これは、構文に慣れるだけのことです。
字句解析と構文解析とは何か、漠然とした概要で十分です。さらに良いことに、少なくとも1つのパーサージェネレーターフレームワークに精通しています。
私が見た中で最も恐ろしいWTFのほとんどは、人々のカスタム解析ルーチンです。最初にコードを書くのはひどい、維持するのはもっと悪い。
プログラマは、自分が書いたステートメントがどのように評価されるかを知っている必要があります。 a(line.of(code) is aSequenceOf(evaluations))
そして、その評価の各ステップの後でその行がどのように見えるかを理解していない場合、言語機能を利用する能力はプログラマーとして非常に制限されます。
基本的なことだけではありません
if (bool == false):
return true
else:
return false
もちろん、これは単にreturn !bool
で置き換えることができます。
私はまた、あなたがこのようなものを思い付くことができるようになるまであなたの言語を理解する能力について言及しています:
string[] thingsToOutput;
for(int i = 0; i <= thingsToOutput.Length; print(thingsToOutput[i++]));
そのような発言を初めて見たとき、それは私の心を少し吹き飛ばしました。このような方法でforループを活用することはできませんでした。その声明を書いた人は彼らに利用できる可能性をより完全に理解しました-彼らは私よりも多くの開かれた扉を見たので、彼らはコードを設計する彼らの能力により多くの自由と力を与えました。
さて、それがgoodコードであるかどうかは問題です-これらのドアのいずれかshouldが開かれるかどうかは、議論の余地があります。 大きな力には大きな責任が伴いますのままです。
この質問に対する答えを知っていても、プログラマーになるわけではありません
ソフトウェアライセンスの基本
クローズドソース対応のApacheと非ウイルス性のMS-PL/MS-RLと比較した場合の「ウイルス性」のコピーレフトライセンス(GPL)の違い。
LGPLを使用する必要がある場合と使用しない場合。
ライセンスの互換性。たとえば、最新のApacheライセンスのライブラリをGPLv3コードにリンクできますが、GPL 1または2にはリンクできません。
ソースコード全体を所有している場合は、必要な数の(または少ない)ライセンスで公開できます。
S.O。への注意コミュニティ:
必要に応じて、この回答を自由に編集してください...主に以下のコメントセクションに適さない情報について。
暗号化。独自の暗号化アルゴリズムを作成できる必要はありませんが、暗号化、メッセージ認証、およびPKIのしくみについて基本的な知識が必要です。私はこの分野で盲目的な試行錯誤に長きにわたって苦労してきました。最近、「Cryptography Engineering」(ファーガソン、シュナイアー、河野)の本を手に入れました。それは本当の目を開かせました。
Windows/Linux/Android/iOSなどをコーディングする場合は、OSを学ぶことから始めます。あなたがウェブのような何か他のものをターゲットにするならば、同じことがそこに行きます。
人のためのコードを書いてください!
もうマジックナンバーはありません!
すべてのコードを1行で記述しないでください。
起こりえないバグなどはありません。
「Hello world」は完全なアプリケーションではありません。出力が実際に「Hello world」であるという実証された/プログラムによるアサーションがないためです。ユニットテストが完了するまで、コードは完成しません。
これらのいくつかはすでに投稿されていますが、これが私のリストです:
コード、テスト、ソフトウェアパッケージを適切にデプロイする方法を学びます。
私が業界で見た開発者の最悪の習慣の1つは、ソフトウェアを他の人の手に渡す方法についての一般的な無知です。ここにいくつかの悪い兆候があります。
新しい開発環境-itus:
バージョン-itus:
Binary-only-itus:
マルチコアITU:
ハードコードされた機能-itus:
シンプルさ、明快さ、一般性。 http://www.math.harvard.edu/computing/programming/rules.html
「最も効果的なデバッグツールは、慎重に検討され、慎重に配置された印刷ステートメントと相まって」 BWK
選択したプラットフォームでセキュリティがどのように機能するかについての知識が多ければ多いほど、効果的です。
ジョブに適したツールを使用します。
プログラマーは重要な要素であり、言語とツールは問題に基づいて選択されるべきです。新しい言語やプロジェクトを恐れないでください。
プログラミングに泣き声はありません!
FizzBuzzプログラムの書き方。
アプリケーションを配布したり、Webサイトを会社の境界外で本番環境に配置したりする必要がある場合は、重要ではないと考えていたすべてのことを行います。
コードは、本来あるべきことを実行する場合にのみ美しくなります。
コードを修正するには、最初に同じコードを書くよりも多くのインテリジェンスが必要です。
したがって、賢さの限界でコードを記述した場合、定義上、壊れたときに修正するほど賢くはありません。
最初にデータ構造を記述します。つまり、データベーススキーマからスウィズリング/シリアル化メカニズムまですべてを意味します。
ほとんどのプロジェクトは、データをフォーマットAでポイントAからポイントBに格納および移動することを目的としています。
すべてが言われ終わったら、コードの約90%はフォーマットを行うためのロジックになりますが、本当のキラーは、データにアクセスして書き込むフォーマットを持っているだけです。データアクセス用のAPIを取得したら、必要に応じて書式設定をいじることができますが、ストレージAPIを使用して本番環境を開始すると、失敗したことに気付かなくなる可能性があります。
Steve Yeggeの電話スクリーンに関する5つの重要な質問では、インタビュー対象者が次の基本的な知識を持っていることを確認しようとしています。
http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions
彼がこれを書いたとき、彼はアマゾンにいたが、現在Googleで働いている(そしておそらくインタビューを行っている)。これは単に画面を通過するだけです。これが彼が探していたものを説明する方法です:
ここで私が探しているのは、これらの領域の1つに完全な真空があることです。彼らが少し苦労して、それを理解しても大丈夫です。マイナーなヒントやプロンプトが必要な場合は問題ありません。錆びていても遅くても構いません。あなたが探しているのは、問題の領域についてまったく無知であるか、ひどく混乱している候補者です。
ドキュメントは非常に重要です。ゼロから何かを構築する場合はさらにそうです。コードを書く前にアイデアを文書化するのに役立ちます。
私はこれを難しい方法で学びました。
まだコメントはできませんが、「テストとデバッグのスキル」のトピックに関して、Ned Batchelderによる this little gem は必読です。 (それから、デバッグとアサーションに関して彼が言わなければならないことの多くは検討に値します。)
すべてのプログラマーは、彼/彼女が知っている唯一のことは彼女/彼女が何も知らないということであることを知っているべきです。学ぶべきことがたくさんあります。
すべてのプログラマーは、FindNextSelectedおよびFindPreviousSelectedアクション(ビジュアルスタジオ)をキーボードのキー(できればF4およびF2)にバインドする必要があります。あなたはそれから2つのことを得る:
条件付きグループ化を含む基本的な正規表現構文を理解している。ライブラリ固有の正規表現コマンドアドオンを使用したり、これらの部分をコメントアウトしたりしないでください。
どうやってするの。
... 15文字が必要だとはどういう意味ですか?
保守性を考慮したプログラム。
すべてのプログラマーは、プロセッサーの仕組みを知っている必要があります。
BeMasterof Somethingですが、BeAwareof Everything !!!!
ここには非常に良い提案がいくつかありますが、Ulrich Drepperによる優れた一連の記事に言及した人がいないことに驚いています: すべてのプログラマーがメモリについて知っておくべきこと 。
すべての問題コンピュータサイエンスでは、別のレベルの間接参照で解決できます。
コードを設計し、マネージャーがRAD=スタイルのアプローチを使用したい場合は、できるだけ多くの詳細を取得してください。次に、機能を追加するときに、既存のコードを書き換えられるかどうかを試してください。より多くのコードを積み重ねると、家ではなく高層ビルになってしまいます。
すべてのプログラマーは、ソフトウェアエンジニアリングと、システム分析/設計および情報システムの概念をしっかりと理解している必要があります。このように、彼らがシステム分析/設計および/または情報アーキテクチャに実質的に貢献するように要求された場合、彼らは知識+意見の立場になります。通常、それは通常単に代わりに単に個人的な好みに由来する単なる個人的な意見のようです最高の問題解決の。ソフトウェアエンジニアリングを測定するのは少し難しいですが、必要な知識はそこから入手でき、適切な大学の学位コースでは、コードをまとめる方法以上のものを教えます。とにかく、これは否定的な意味ではありません。主な精神は改善であるからですが、ITの知識がまったくないか、コード化して再コード化している「スクリプトキディ」がいる一部の人々と協力してきました(そして選択した言語)とすべての問題を以前に適用されたソリューション(そのコーダーによる)の繰り返しとしてのみ見るので、プログラマーがソフトウェアエンジニアリング(SSADM)の観点からより大きな視野に集中し、問題を機会として見た方がはるかに好ましいクライアントのためにより良いことをする。
最初に、コードまたはロジックを頭または紙で実行します。それをテストするためにコンパイルと実行コマンドを実行するために急いではいけません。
それは数文字で成り立っています。
わかりました、私は単純化しすぎていますが、基本的にあなたがかなり独学で学びに止まらず、少し完璧主義者であるなら、あなたは良いプログラマーになるための基盤を持つべきです。
それを超えるものは、特定の役割やテクノロジーに固有のものになります。
何かがうまくいかない場合は、それが起こります。最悪のケースを想定
作成しているソフトウェアを使用する人のことを忘れないでください。
問題が発生する可能性のあるものはすべて問題が発生することを認識してください。コードを書く時間はほとんどありませんが、一般的なパターンを認識して再利用します。コードを常にリファクタリングして、理想的な設計を実現します。
すべてのデータはどこかに存在する必要があります。よく見ると見つけられます。
彼らはクロージャーの力について知って、それらを使い始める必要があります。
16進表記。また、ビットフィールド-ANDing、ORing(包括的および排他的)、補完(1および2)、ビットシフト。
私の最初の投票は命名規則です。
誰かが何かを作るように頼んだとき、覚えておいてください:彼らはあなたにそれを維持することも求めています。おそらく、永遠に。
どのようなプログラムでも、機械にどのように作業を行うかを伝えるだけでなく、人間の作業をどのように行うかを最も明確に示す方法です。