ハックとは何ですか?[閉まっている]


55

同僚が「それは恐ろしい、恐ろしいハックだ」と言っているのをよく耳にします。

私がそれから奪うことができるのは、それが良くないということです。うまくいくかどうか尋ねると、彼らは「はい、でも良くない」と言います。それは良い解決策ではないということですか?それが機能する場合、ソリューションはどのように悪いですか?それは良い習慣によるものですか?または、メンテナンスできませんか?ソリューションの一部としてコードの副作用を使用していますか?

何かがハックに分類されると、私にとって興味深いです。どうすれば識別できますか?


5
何かが動作する可能性がありますが、動作が遅く、壊れやすく、扱いが面倒で、保守が苦痛です。これはハックです。
トレゾイド

1
ゲットーが装備したコード==ハック
ガレットクラボーン

私はそれがハックだと言っているわけではありませんが、あなたは動的にモンキーパッチ+を再考して、ヒューリスティックに基づいて分割したいと考えています。
-Dietbuddha

ハッキングは汚いバンドエイドであると述べているすべての人については、outpost9.com / reference / jargon / jargon_23.html#TAG824-2 . /n./ で、ハッカーと呼ばれる人にとって何が意味するのかを見てください。 、そしておそらく非常に時間がかかる、必要なものを正確に生成する作業。

1
一般的な標準または上司の標準に従って実装されていない機能。
アディティアP

回答:


97

大きな隙間のある傷に一時的なバンドエイドを適用しています。今のところ修正されていますが、後でさらに多くの問題を引き起こすでしょう。

私が最近見た例:、という名前の人"Jim"を常にアルファベット順のリストの最初に表示したいとします。すばやく解決するには、彼の名前をに変更します" Jim"。これはハックであり、後で戻ってくることは確実です。


34
または、「AAA Jim」と呼ぶこともできます。
コンプマン

4
別の例は、より拡張可能なソリューションではなく、時間の制約のためにif ... else ... else ... elseを拡張することです。
フィルレロ

29
そして、ジムをアルファベット順のリストの最初に表示するための実際の解決策は、もちろん、アルファベットを並べ替えることです。
アルテム

1
@artem true、およびこのように見えたjzbcdefghiklmnopqrstuvwxya(アルファベットを並べ替え、aを押してzを
表示

1
プロジェクト管理の用語で表現すると、ハッキングとは、将来的に時間/工数の負債を発生させる可能性のあるソリューション、および/またはベストプラクティスや標準的な慣習に反するソリューションです。
シークレット

60

すべてのエンジニアリングの決定は、即時のコストと遅延、および結果として生じるコストと技術的負債の間のトレードオフです。

ハッキングは、前者が好まれ、結果として後者を受け入れる状況です。

経験の浅い開発者(一部は工学教育システムの動作方法が原因)は前者に焦点を当てており、後者を真に理解または推定するための十分な経験がありません。

経験豊富な開発者が行いますが、さまざまな理由(多くの正当な理由)で前者を選択します。

ハックという用語は、ほとんどの場合、問題を一時的に解決して「すぐにそれを行う」という意図を暗示しますが、経験豊富な開発者は、コードの最も永続的なものが一時的なハックであることを知っています。


13
+1「ただし、経験豊富な開発者は、コードの最も永続的なものが一時的なハックであることを知っています」!これはまた、怠lazがあなたの正しい行動を妨げることは決してないということを意味します。
マチューM.

20

それが機能する場合、ソリューションはどのように悪いですか?

このことを考慮

2 + 2 <-- Correct.  Elegant.  Simple.

(2/1 + 2/1) * 1/1 <-- Also Correct.  Lots of useless weird code.  

ただし、2番目の例は、より良いプラクティスや、当時/1より単純に思われた仮定の無知、または/1正しく動作するライブラリのバグのために使用されるハックかもしれません。

それは良い習慣によるものですか?

いいえ。ハックは「便利な」コードです。3つの4つの原因があります。

  • 適切な設計原則の無知。(すなわち、固い原則)

  • APIまたは言語構造に関するAr慢(つまり、誤った仮定)。

  • 解決されていないが回避されている実際のバグ。

  • 優れた設計および修正の前提に対する管理のオーバーライド。「予算」は一般的な正当化ですが、これは本質的に上記の3つ(無知、慢、またはエラー)の1つであり、非技術的な根本原因があります。

または、メンテナンスできませんか?

それがポイントです。このハッキングは、無知、バグ、または仮定に基づいています。

ソリューションの一部としてコードの副作用を使用していますか?

これは、無知または誤った仮定の例です。


いい答えですが、品質対時間対コストの三角形のために、品質がピンチされた状態でハックが記述される場合があることを考慮していません。
StuperUser

1
私はクライアントとそのゲームをプレイするために使用します。プロジェクトの2つの最も重要な側面を、品質、時間、コストから選択するようにお願いします。ほとんどの場合、時間とコストが選択され、その後、品質に妥協します。具体的には、私がコンサルタントだったという事実を引用して、3つすべてを時間、コスト、および傑出した品質で提供できるはずです。このシナリオは、ヘンの歯のようなものです!
OptimizePrime

1
@Optimize:鶏の歯はまれです。この状況はまれですか?
マットエレン

@Matt Ellen:「Hen's Teeth」というフレーズの別の使い方かもしれません。「まれ」ではなく「矛盾」を意味する場合があります。
-S.ロット

ほとんどの場合、それは「管理オーバーライド」の決定であることがわかります。
マークマクドナルド

15

プログラミングコンテキストでのハックは、ダックテープまたはバブルガムで何かを修正することと同じです。

ハッキングには、ドキュメント化されておらずサポートされていない機能の使用が含まれることが非常に多く、将来的にコードが破壊される可能性があります。また、ハードコーディングされた値も含まれる場合があります。

通常、ハックは、根本的な問題を解決する代わりに、何らかのライブラリ/サービスを使用するコードで一時的に回避することもできます。後で制御できない場合は、ハックが唯一の対処方法かもしれません。


21
ダクトにダックテープを使用すると、いんちきになります;)
JeffO

いんちきいんちき
Mateen Ulhaq

11

この用語は、「華麗なハック」のように、逆の意味で使用されることがあります。素晴らしいことをやるよりも台無しにする方がはるかに一般的だからといって、素晴らしいハックよりも恐ろしいハックについて聞く方がずっと一般的ですが、私はこの言葉が両方の方法で使われていると聞きました。

肯定的な意味で使用される「ハック」は、基本的に、予期しない、特に賢い方法で問題を解決するエレガントなソリューションを意味します。ネガティブな意味とポジティブな意味は実際には近いものです。なぜなら、素晴らしいハックはしばしば、テクノロジーの意図しない側面を利用することを伴うからです。


1
あなたが表面上で何をしたかを見るのは難しいでしょうが、それはさらに詳細な検査で、これがばかげて巧妙な左フィールドコードであることは明らかなので、素晴らしいハックです。地震の平方根の魔法について説明します:codemaestro.com/reviews/9
ロバートマサイオリ

10

現在は動作するソリューションですが、おそらく長期的には問題を引き起こすでしょう。

例:いくつかの値を動的に入力して、HTMLドキュメントを生成する必要があります。これを行う適切な方法は、Freemarker、XSLT、JSPなど、この目的のために実際に設計されたツールの1つを使用することです。しかし、あなたはそれらのどれも使用することができません、またはあなたはちょうどそれをきちんとすることに煩わされることができないので、あなたはこのような何かを書きます:

public String getGreetingPage(String name) {
    return "<html><body>Hello, "+name+"!</body></html>";
}

9

ハックは、問題に対する独創的な解決策であり、多くの場合、すぐに使える思考に依存し、環境に関する予期しない事実を利用します。視聴者はそれが独創的であることに同意するが、それがすばらしいか恐ろしいかを理解できないという、典型的なハックについての発言があります。これは、メンテナンスの修正に不要な種類です。

問題を修正するハックは、環境の詳細、文書化されていないツールの機能、またはそのようなものに依存する可能性が非常に高くなります。これは脆弱なソリューションになる可能性が高く、現在は機能していますが、何かが変更されると壊れる可能性があります。それがどのように機能するかを理解するのは難しいかもしれません。また、メンテナンスプログラマは理解しにくいコードを嫌います。とりあえず何も害を与えないが、将来的にはかなり離れたコードの完全な部分で問題を引き起こす副作用があり、対処するのは悪夢です。


9

ハックという言葉は誤用されています。ちょっとした歴史を知りたい場合は、Wikipediaにアクセスしてください。ハックとは、意図していないことを行うために物事を微調整するプロセスを説明する言葉です。電気工学の文脈では、これは良いことです。これについては、ウィキペディアでより良い説明があります。

今、コンピューターサイエンスのコンテキストで。ハックは一般的に悪いです。はい、それは動作しますが、通常は、プログラマーがソフトウェアの設計に準拠しておらず、そのコードを読まなければならないすべてのプログラマーを混乱させる曖昧なコードを書いたことを意味します。もちろん、プログラマーは時間がかかります。そのため、管理者としては、最も簡単にメンテナンスできるソフトウェアが必要です。プログラマーにも同じことが当てはまります。また、ハッキングはソフトウェアの別の何かを破壊する傾向があります。

ハッキングを受け入れるかどうかの判断はコールです。少なくとも、上級ソフトウェアエンジニアがハックを承認してほしいと思っています。彼はより多くの経験を持ち、より教育された決定を下すことができるからです。間違いなく、後輩たちがハッキングを受け入れるかどうかを決定するのは望ましくありません。彼らは1つを思い付き、利点がハックを維持する苦労に値するかどうか上級者と議論できます。


6

これはthereifixedit.comにあるようなハックです

ハック

実際、そのサイトのすべてについてはハックです。

ハックは、文脈から外れたあるものの独創的で大胆な使用です。
ハックの美しさは、特定の問題とそれを解決することを意図していないツールを持っているという事実にありますが、(正しいものを取得するのではなく)それらのツールだけで問題を解決します。彼らは賢く、速くて楽しいです。欠点は、結果がしばしば壊れやすく、部外者に使用するには危険なことです。
つまり、写真のように問題を解決したいのであれば、問題はありません。そのような他の人の問題を解決すると、問題が発生します。この場合、おそらく感電したり、やけどしたりするでしょう。

ソフトウェア開発では、致命的な傷害に相当することなく、コードを他の人(将来のあなたを含む)が処理できるようにする必要があります。ダイクストラが言ったように:

有能なプログラマーは、自分の頭蓋骨のサイズが限られていることを完全に認識しています。したがって、彼は謙虚に仕事に取り組み、疫病のような巧妙なトリックを避けます。

また、ハッキングは最も巧妙なトリックの1つです。

ハックはコードのどこかで時限爆弾を鳴らしています。これは、一般的なものが本質的にあまりにも多くの前提に基づいているためです(適切なデカップリングよりも「やるだけ」が望ましい)。これらの仮定がもはや成り立たなくなると、システム全体が破壊され、何が起こったのか分からなくなります。


4

この用語はあまり正確ではありませんが、おそらく適切に解決するのが難しい問題に対する迅速で汚い解決策を指しているのでしょう。問題の解決策はおそらく動作しますが、おそらく非常に良い実装ではなく、おそらく微妙なバグ、おそらくいくつかの小さな既知のバグがあり、時間が許せば後でやり直す必要があります。あなたが聞いている「ハック」と呼ばれるものは「クラッジ」とも呼ばれると思います。

タスクを完了するための非常に厳しい時間制約がある場合にハックが発生することがよくあります。ハックソリューションは、QAに合格するのに「十分に」機能するため実装されます。残念ながら、その後の修正/クリーンアップは常に行われるとは限りません:(


「あまり正確ではない」とはどういう意味かわかりません-ほとんどのプログラマーは、記述されたコードがハックであると言うことの意味を正確に知っていると思います。しかし、答えの残りはスポットオンであり、動作しますが、何らかの理由(アーキテクチャ、パフォーマンスなど)で最適なソリューションではありません。
オズ

@james:私の経験では、2人のプログラマーがコードを見ることができ、1人はそれをハックと呼び、もう1人はそうではありません。コードの一部をハックとして定量化する実際の方法はありません。誰もがハックとは何かについて独自の考えを持っています。多くの場合、それらは似ていますが、常に同じとは限りません。他の人から「ハック」と呼ばれるコードを持っている人として書かれ、反対しました。そして、私は他の人のコードを「ハック」と呼びましたが、彼らは同意しませんでした。確かに、これらはおそらく境界の場合ですが、境界時々あいまいになることがあります
...-FrustratedWithFormsDesigner

1
@FWFD-何かがハックかどうかについては意見が一致しません。誰かが何らかのコードをハックした場合、その意味を理解できます。
オズ

4

私はフロントエンド開発者として多くの時間を費やしているので、ハックの定義は次のとおりです。

環境の欠陥と文書化されていない動作に関する詳細な知識に基づいたソリューション。

環境は、フレームワーク、Webブラウザー、データベース、ATM(現金自動預け払い機)、裁判などです。ループホールを知っており、それを悪用して問題を解決する「ルールのシステム」。


4

ハックは通常、明らかに望ましい出力を提供するコードですが、次善の方法です。

通常は、文書化されていない、またはあいまいな言語/ライブラリ機能を、発信者が意図しない何らかの方法で使用しているため、意図がわかりにくくなっています。

時折、いくつかの言語またはライブラリのバグを回避するために行われますが、ほとんどの場合、主な原因は通常無知です。

ハンマーにとっては、すべてが釘のように見えます。

通常は空間と時間の両方で非効率的な方法でラウンドで行われますが、最終的には望ましい出力を生成しますが、コストがかかり、テスト可能性や保守性のない未知の可能性のあるエッジケースが発生します。通常、論理または言語イディオムの基本的な理解の欠如に起因します。「難しい方法」も参照してください。

通常、コードは、適切な経験を持っている人が実行することすら考えていないか、発見したハックについてのラウンドと同じくらい複雑で非効率にするために長くて難しいと考えなければならないものです。

Vistaの修正

メール検証の有効性

ソフトウェアの単位

非決定的ハッシュ


+1次善の場合。そして、ハッキングは、最も多くの票が投じられたように「一時的」ではないためです。
rlb.usa

2

はげたタイヤは機能しますが、パンクの理想的な解決策とは誰も言いません。将来的にはより悪い問題を引き起こす可能性があります。

通常、私はハックを当面の問題に対する迅速で汚い解決策と見なします。通常、プログラミングショップでの通常のプログラミング慣行に適合しない場合があります(たとえば、多くのハードコーディングを使用します)。それは小さな修正かもしれません。

それが悪い主な理由は、a)予測できない結果を引き起こす可能性があるb)メンテナンスの問題を引き起こす問題のコードの元の設計と一致しない可能性があるということです。私の経験では、ハッキングは一般的に非常に不十分に文書化されています。


2

私が聞いて尊敬するようになった短い定義:

「すべての場合に問題を完全に解決できない症状の解決策」

glyいコードはハッキングである場合とそうでない場合があります。別の答えの2 + 2の例はハックではなく、いコードソリューションであり、コード理解の観点からは悪いですが、すべての場合に正しいソリューションを生成します。数学の因数分解された方程式を考えてください。振る舞い/関係は両方のバージョンで同一で正しいですが、形式は異なります。うーん、方程式を因数分解し、方程式をリファクタリングし、コードをリファクタリングします...いいえ、類似性がないと確信しています:)

名を「Jim」に変更することに関する他の回答の例は、ハックです。症状を解決します(リストの名はJimです)が、問題を完全には解決しません(リストはソートされません)または、すべてのエントリで機能する方法で優先順位付けされます)。


1

ハックとは、予想される結果を返すことですが、奇妙な方法で実行することです(通常、パフォーマンスヒットが発生します)。

例えば:

タスク:整数変数をdoubleにキャストするには

解決策:キャスト演算子を使用します。すなわち:dblVar = CType(intVar、Double)

ハック:ダブルで割る。すなわち:dblVar = intvar / 1.0


星の例では+1。古いAS400コードでは、アメリカの日付を出力するヨーロッパの日付に奇妙な10進数を掛けたものが表示されます。問題は、特定のコーダーがそれを.Netコードにリークし始めると始まります...
モーガンハーロッカー

0

あなたの足が感染し、あなたが生き残るために除去しなければならないと想像してください。医者にtheで素早くそれをハッキングさせるか、問題を調べて適切なツール、手順などを選んだ後、外科的にそれを除去しますか?ソフトウェアにも同じことが当てはまります。


攻撃者が私の脳をハッキングする機会を得る前に、私は彼にそれをハッキングさせておくでしょう。
Mateen Ulhaq

数分しかなかったらどうしますか?
StuperUser

0

ハッカーは、責任のあるコーダーが「後で戻って修正します」と宣言すると、それが誕生であることを知らせます。

深刻な注意点-OPのコンテキストでのハックは、望ましい結果を達成するものですが、一時的または信頼できない方法を使用してそうします。

もう1つの一般的な定義は、エッジケースの動作を利用してプラットフォームの制限/セーフガードを回避する手法です。

2番目のコンテキストでのハックには、「マーベリック」(読み取り:危険)ヒーローコーダーの間で特定の名声があります...

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