タグ付けされた質問 「language-agnostic」

このタグは、プログラミング言語または環境に固有ではない質問用です。

30
すべてのプログラマが知っておくべきことは何ですか?
使用するプログラミング言語、オペレーティングシステム、またはそれらが開発する環境に関係なく、すべてのプログラマは何を知っておくべきですか? 背景: できる限り最高のプログラマになることに興味があります。このプロセスの一環として、私はわからないことを理解しようとしています。「[プログラミング言語を挿入]開発者が知っておくべきこと」という行に沿ってたくさんのリストがありますが、特定の言語に限定されない類似したものをまだ見つけていません。 また、この情報は他の人にとっても有益であると期待しています。

20
「ブレーク」と「継続」は悪いプログラミング慣行ですか?
私の上司は、下手なプログラマーがループ内で使用しているbreakとさりげなく言及していcontinueます。 それらが理にかなっているので、私は常にそれらを使用します。インスピレーションをお見せしましょう: function verify(object) { if (object->value < 0) return false; if (object->value > object->max_value) return false; if (object->name == "") return false; ... } ここでのポイントは、最初に関数が条件が正しいことを確認してから、実際の機能を実行することです。IMOループにも同じことが適用されます。 while (primary_condition) { if (loop_count > 1000) break; if (time_exect > 3600) break; if (this->data == "undefined") continue; if (this->skip == true) continue; ... …

18
短い変数名の言い訳はありますか?
これは、現在作業しているコードベースに大きな不満を感じています。変数名の多くは短く、説明的ではありません。私はプロジェクトに残った唯一の開発者であり、それらのほとんどが何をするかについてのドキュメントがないため、それらが表すものを追跡するために余分な時間を費やす必要があります。 たとえば、光学面の定義を更新するコードを読んでいた。開始時に設定された変数は次のとおりです。 double dR, dCV, dK, dDin, dDout, dRin, dRout dR = Convert.ToDouble(_tblAsphere.Rows[0].ItemArray.GetValue(1)); dCV = convert.ToDouble(_tblAsphere.Rows[1].ItemArray.GetValue(1)); ... and so on たぶんそれは私だけかもしれませんが、それが何を表しているのかを本質的に教えてくれなかったので、コードをさらに理解するのが難しくなりました。私が知っていたのは、それがどこか特定のテーブルから特定の行を解析する変数であることだけでした。いくつかの検索の後、私はそれらが何を意味するかを見つけました: dR = radius dCV = curvature dK = conic constant dDin = inner aperture dDout = outer aperture dRin = inner radius dRout = outer radius 本質的にそこにあるものに名前を変更しました。それはいくつかの線を長くしますが、私はそれが公正なトレードオフだと感じています。ただし、この種の命名スキームは、多くのコードで使用されています。古いシステムで作業して学んだ開発者の成果物なのか、それともより深い理由があるのか​​はわかりません。このように変数に名前を付ける正当な理由はありますか、それとも変数に出会ったときにそれらをよりわかりやすい名前に更新することは正当ですか?

10
ガベージコレクションを強制するのはいつですか?
だから私は、C#ガベージコレクターを強制的に実行することについての質問を読んでいた。ほとんどすべての回答が同じである。残念ながら、そのようなケースについて詳しく説明している人はいません。 ガベージコレクションを強制するのは、実際にはどのようなシナリオで良いまたは合理的なアイデアであるかを教えてもらえますか? 私はC#固有のケースではなく、ガベージコレクターを備えたすべてのプログラミング言語を求めています。Javaのようなすべての言語でGCを強制することはできませんが、できると仮定しましょう。

11
エラー処理を実行する最新の方法…
私はしばらくこの問題を熟考してきましたが、絶えず警告や矛盾を見つけているので、誰かが次の結論を出すことを望んでいます。 エラーコードよりも例外を優先する 私が知っている限りでは、業界で4年間働いて、本やブログなどを読んでから、エラーを処理するための現在のベストプラクティスは、エラーコード(必ずしもエラーコードではなく、エラーを表すタイプ)。 しかし-私にはこれは矛盾しているようです... 実装ではなく、インターフェースへのコーディング 結合を減らすために、インターフェイスまたは抽象化にコーディングします。インターフェースの特定のタイプと実装を知りませんし、知りたくありません。では、どの例外をキャッチする必要があるのか​​をどのようにして知ることができますか?実装は10種類の例外をスローすることも、何もスローしないこともあります。例外を確実にキャッチするとき、実装について仮定しているのでしょうか? 場合を除き-インターフェイスが持っています... 例外仕様 一部の言語では、開発者は特定のメソッドが特定の例外をスローすることを宣言できます(たとえば、Javaはthrowsキーワードを使用します)。 しかし-これは...を示唆しているようです 漏れやすい抽象化 インターフェイスでスローできる例外を指定する必要があるのはなぜですか?実装が例外をスローする必要がない場合、または他の例外をスローする必要がある場合はどうなりますか?インターフェイスレベルでは、実装がスローする例外を知る方法はありません。 そう... 結論する ソフトウェアのベストプラクティスに矛盾するように見える(私の目には)のに、なぜ例外が優先されるのですか?また、エラーコードが非常に悪い場合(およびエラーコードの悪徳で販売する必要がない場合)、別の選択肢がありますか?上記のベストプラクティスの要件を満たしているが、エラーコードの戻り値をチェックする呼び出しコードに依存しない、エラー処理の現在の(またはまもなく)技術の現状は何ですか?

13
ソースコードの代わりに構文ツリーを保存しないのはなぜですか?
プログラミング言語はたくさんあります。すべての言語が解析され、構文にチェックされてからコードに変換されるため、抽象構文ツリー(AST)が構築されます。 この抽象構文ツリーがあります。ソースコードの代わりに(またはソースコードの隣に)この構文ツリーを格納しないのはなぜですか? ソースコードの代わりにASTを使用する。チーム内のすべてのプログラマーは、このツリーを(適切な文脈自由文法を使用して)必要な言語にシリアル化し、終了したらASTに解析して戻すことができます。そのため、コーディングスタイルの質問({と}の配置場所、空白、インデントなどの配置場所)に関する議論がなくなります。 このアプローチの長所と短所は何ですか?

30
プログラミングにおける有害な誘惑
ちょうど好奇心が強い、プログラミングでどんな誘惑があなたのプロジェクトで本当に有害であることが判明しましたか? 何かをしたいという衝動を実際に感じて、それがプロジェクトに利益をもたらすと信じているとき、または信じられないように自分をだまして、1週間後に実際の問題を解決していないが、代わりに新しい問題を作成した、または、最良の場合、目に見える影響なしにあなたの内なる獣を喜ばせました。 個人的には、悪いコードをリファクタリングしないのは非常に難しいと思います。私は多くの悪いレガシーコードを扱っていますが、リファクタリングが何も壊さないことを証明するためのテストがないとき、それに触れないようにするには深呼吸が必要です。 ユーザーインターフェイスのもう1つの悪魔は、UIレイアウトの変更を楽しんでいるという理由だけで、文字通り何時間もUIレイアウトの変更に費やすことができることです。時々私はユーザビリティに取り組んでいると自分自身に言いますが、真実はボタンを動かすのが大好きです。 あなたのプログラミングの悪魔とは何ですか?また、どのように回避しますか?

1
コールバックとPromiseの間に根本的な違いは本当にありますか?
シングルスレッドの非同期プログラミングを行うとき、私がよく知っている2つの主なテクニックがあります。最も一般的なのは、コールバックを使用することです。つまり、コールバック関数をパラメーターとして非同期に動作する関数に渡すことを意味します。非同期操作が終了すると、コールバックが呼び出されます。 jQueryこのように設計されたいくつかの典型的なコード: $.get('userDetails', {'name': 'joe'}, function(data) { $('#userAge').text(data.age); }); ただし、このタイプのコードは、前のコードが終了したときに追加の非同期呼び出しを次々に行いたい場合、面倒で高度にネストされる可能性があります。 2番目のアプローチはPromiseを使用することです。Promiseは、まだ存在しない可能性のある値を表すオブジェクトです。値にコールバックを設定できます。コールバックは、値を読み取る準備ができたときに呼び出されます。 Promiseと従来のコールバックアプローチの違いは、非同期メソッドがクライアントがコールバックを設定するPromiseオブジェクトを同期的に返すようになったことです。たとえば、AngularJSでPromiseを使用した同様のコード: $http.get('userDetails', {'name': 'joe'}) .then(function(response) { $('#userAge').text(response.age); }); だから私の質問は次のとおりです。実際に本当の違いはありますか?違いは純粋に構文上のようです。 ある技術を他の技術よりも使用する深い理由はありますか?

7
短絡評価、それは悪い習慣ですか?
私がしばらく知っているが、考慮されていないことは、ほとんどの言語では、順序に基づいてifステートメントで演算子を優先することができるということです。私はよく、これをヌル参照例外を防ぐ方法として使用します。例えば: if (smartphone != null && smartphone.GetSignal() > 50) { // Do stuff } この場合、コードは最初にオブジェクトがnullでないことを確認し、次にこのオブジェクトが存在することを知って使用します。言語が賢いのは、最初のステートメントがfalseの場合、2番目のステートメントを評価しても意味がないため、null参照例外がスローされないことがわかっているためです。これはandand or演算子でも同じように機能します。 これは、インデックスが配列の境界内にあることを確認するなど、Java、C#、C ++、Python、Matlabなどのさまざまな言語でこのような手法を実行できるなど、他の状況でも役立ちます。 私の質問は次のとおりです。この種のコードは悪い習慣を表していますか?この悪い習慣は、隠れた技術的な問題から生じますか(つまり、最終的にエラーになる可能性があります)、または他のプログラマーにとって読みやすさの問題につながりますか?紛らわしいですか?

18
就職の面接で優秀なプログラマーを見分ける最善の方法は何ですか?
インタビューの設定では:誰かがあるときに確実に識別するための最良の方法は何である優秀なプログラマは。これにより、彼はスペクトルの低域に向かって彼の仲間よりも10-15倍効率的/迅速/優れている人の一人であることを意味します。 私たちの多くは、FizzBu​​zz問題を弱いものを取り除く方法として聞いています。確かに、その問題を解決するのに5〜10分かかることは、申請者が弱い候補者であるという重大な指標です。私は、良い指標があなたが書くことができる限り早くそれを解決することができると仮定します。ただし、これでは十分ではないようです。 それは、彼に適度に複雑なバグのあるプログラムを与え、彼がそれをどれくらい速く調べて、それに関するすべての問題を特定できるのか、というようなことでしょうか?

6
ガベージコレクションは、ネイティブにコンパイルされた言語でどのように機能しますか?
スタックオーバーフローに関するいくつかの回答を参照した後、ネイティブコンパイルされた言語の一部にガベージコレクションがあることが明らかです。しかし、これが正確にどのように機能するかは私には不明です。 ガベージコレクションがインタプリタ言語でどのように機能するかを理解しています。ガベージコレクターは、単にインタープリターと一緒に実行され、プログラムのメモリから未使用および到達不能なオブジェクトを削除します。両方が一緒に実行されています。 しかし、これはコンパイルされた言語でどのように機能しますか?私の理解では、コンパイラがソースコードをターゲットコード(特にネイティブマシンコード)にコンパイルすると、完了します。その仕事は終わりました。それでは、コンパイルされたプログラムをどのようにガベージコレクションするのでしょうか? 「ガベージ」オブジェクトを削除するためにプログラムが実行されている間、コンパイラは何らかの方法でCPUと連携しますか?または、コンパイラは、コンパイルされたプログラムの実行可能ファイルに最小限のガベージコレクタを含めますか。 Stack Overflowに関するこの回答からの抜粋により、後者のステートメントは前者よりも妥当性があると思います: そのようなプログラミング言語の1つがEiffelです。ほとんどのEiffelコンパイラは、移植性の理由でCコードを生成します。このCコードは、標準Cコンパイラによってマシンコードを生成するために使用されます。Eiffel実装は、このコンパイルされたコードに対してGC(および場合によっては正確なGC)を提供します。VMは必要ありません。特に、VisualEiffelコンパイラーはネイティブのx86マシンコードをフルGCサポートで直接生成しました。 最後のステートメントは、プログラムの実行中にガベージコレクターとして機能するプログラムを最終的な実行可能ファイルにコンパイラが含めることを意味するようです。 ネイティブにコンパイルされ、オプションのガベージコレクタを備えたガベージコレクションに関するD言語のWebサイトのページも、ガベージコレクションを実装するために元の実行可能プログラムと一緒にバックグラウンドプログラムが実行されることを示唆しているようです。 Dは、ガベージコレクションをサポートするシステムプログラミング言語です。通常、メモリを明示的に解放する必要はありません。必要に応じて割り当てるだけで、ガベージコレクターはすべての未使用メモリを利用可能なメモリのプールに定期的に返します。 この方法は、上記の場合はされて使用され、どのように正確にそれが働くだろうか?コンパイラは、ガベージコレクションプログラムのコピーを保存し、生成する各実行可能ファイルに貼り付けますか? または、私は私の考えに欠陥がありますか?その場合、コンパイルされた言語のガベージコレクションを実装するためにどのメソッドが使用され、どのように正確に機能しますか

7
アーリーバインディングとレイトバインディングは何ですか?
アーリーバインディングとレイトバインディングについてよく耳にしますが、それらが何であるかはわかりません。私は理解できない次の説明を見つけました: アーリーバインディングとは、設計時に変数に値を割り当てることを指し、レイトバインディングとは、実行時に変数に値を割り当てることを指します。 誰かが2つのタイプのバインディングを定義して比較できますか?

17
「賢い」コードを書かないように自分を訓練する方法は?[閉まっている]
s で新しいトリックを披露したり、3つの異なる手順を一般化したりする必要があるときの気持ちを知っていExpressionますか?これはArchitecture Astronautの規模である必要はなく、実際に役立つかもしれませんが、他の誰かが同じクラスまたはパッケージをより明確で率直な(そして時には退屈な)方法で実装することに気づかずにはいられません。 私はしばしば問題を過剰に解決することによってプログラムを設計することに気づきました。時には故意に、時には退屈から。どちらの場合でも、反対の証拠を見るまで、私のソリューションは非常に透明でエレガントであると正直に信じていますが、通常は手遅れです。また、コードの重複よりも文書化されていない仮定を好み、単純さよりも賢いことを好む私もいます。 何をするために行うことができ、「cleverish」のコードを記述する衝動に抵抗してたときにベルリングをすべきであること、私はそれは間違ってやっていますか? 私は今、経験豊富な開発者のチームと協力しているため、問題はさらに押し進められています。スマートコードを書くという私の試みは、時間が優雅さの幻想を払拭した後でも自分にとっては愚かに思えます。

10
可能な場合、除算を乗算に置き換えるのは良い習慣ですか?
条件チェックなどの除算が必要なときはいつでも、除算の式を乗算にリファクタリングしたいと思います。たとえば: 元のバージョン: if(newValue / oldValue >= SOME_CONSTANT) 新しいバージョン: if(newValue >= oldValue * SOME_CONSTANT) 回避できると思うから: ゼロ除算 オーバーフローoldValueが非常に小さい場合 そうですか?この習慣に問題はありますか?

16
私たちのコードが悪いことを経営陣に伝える正しい方法は何ですか?
私たちのコードは悪いです。常に悪いとは考えられていなかったかもしれませんが、悪いことであり、下り坂になっています。私は大学を卒業してから1年も経たないうちに、コードの多くの部分が信じられないほど困惑しました。最初は、新しい人として、コードベースについてもう少し学ぶまで口を閉ざしておくべきだと考えましたが、それが悪いことを知っていることはたくさんありました。 ハイライトのいくつか: まだフレームを使用しています(クエリ文字列から何かを取得してみてください、ほとんど不可能です) VBScript ソースセーフ .NETを「使用」します。つまり、COM DLLを呼び出す.netラッパーがあり、簡単にデバッグすることはほとんど不可能です。 すべてが基本的に1つの巨大な機能です コードは保守できません。各ページには、新しいページが作成されるたびに作成される複数のファイルがあります。メインページは基本的にResponse.Write()を何回も実行してHTMLをレンダリングします(runat = "server"?方法はありません)。その後、クライアント側(VBScript)に多くのロジックがあり、最終的にページはそれ自体に送信し(多くの場合、多くの情報を非表示フィールドに保存します)、そこで保存などの処理を実行できる処理ページに投稿しますデータベースへのデータ。 私たちが得た仕様は笑えます。多くの場合、フィールドYまたはフィールドZを選択するタイミングを指定せずに、「フィールドYまたはフィールドZのいずれかを使用してフィールドXを自動入力」などを呼び出します。 これのいくつかはソフトウェア会社に雇われていないことの結果だと確信していますが、ソフトウェアを書いている人は少なくともコードの品質に注意を払うべきだと思います。期限が迫っているので、何かがすぐに行われるということを考えたとしても、想像もできません。しかし、私たちは悪いコードを書き続け、悪い慣行を使い続けています。 私に何ができる?どうすればこれらの問題を持ち出すことができますか?私のチームの75%が私に同意し、過去にこれらの問題を提起しましたが、何も変わりません。

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