Bir hack nedir? [kapalı]


55

İş arkadaşlarımın birbirlerine "Bu korkunç, korkunç bir saldırı" olduğunu söylediklerini sık sık duyuyorum.

Ondan alabileceğim şey, bunun iyi olmadığı. Onlara işe yarayıp yaramadığını sorduğumda "evet, ama iyi değil" diyorlar. Bu iyi bir çözüm olmadığı anlamına mı geliyor? Çalışırsa çözüm nasıl kötü olabilir? İyi uygulama nedeniyle mi? Ya da bakımsız mı? Çözümünüzün bir parçası olarak kodun bir yan etkisi kullanıyor mu?

Bir şey kesmek olarak sınıflandırıldığında benim için ilginç. Bunu nasıl tanımlayabilirsiniz?


5
Bir şey işe yarayabilir ancak yavaş, kırılgan, çalışmak için çirkin ve bakımı acı verici olabilir. Bu bir kesmek.
Trezoid

1
Getto hileli kod == hack
Garet Claborn

Bunun bir hack olduğunu söylemiyorum, ama +sezgisel taramalara dayanarak bölmek için dinamik olarak maymun yamalarını yeniden düşünmek istiyorsun .
dietbuddha

Hack'lerin kirli yara bandı olduğunu söyleyenler için, lütfen kendilerini outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ adresinden bilgisayar korsanları olarak adlandıranlar için ne anlama geldiğine bakın. ve belki de çok zaman alan, tam olarak ihtiyaç duyulanı üreten iş parçası.

1
Popüler standartlara göre veya üstünüzün standartlarına göre uygulanmayan bir özellik.
Aditya P,

Yanıtlar:


97

Büyük bir boşluklu yaraya geçici bir bant yardımı uyguluyor. Şimdilik düzeltildi, ancak daha sonra daha da fazla soruna yol açacak.

Son zamanlarda gördüğüm bir örnek: Adında bir kişinin "Jim"her zaman önce alfabetik bir listede görünmesini istersiniz . Çabucak çözmek için onu yeniden adlandırın " Jim". Bu daha sonra seni ısırmak için kesinlikle geri gelecek bir kesmek.


34
Veya ona "AAA Jim" diyebilirsin.
compman

4
Başka bir örnek, daha genişletilebilir bir çözüm yerine zaman kısıtlamaları nedeniyle bir if ... else ... else ... başka bir şeyi genişletmek olabilir.
Phil Lello

29
Ve Jim'in alfabetik listede ilk olarak görünmesini sağlamanın asıl çözümü elbette alfabeyi yeniden sıralamak.
artem

1
@artem true ve bu jzbcdefghiklmnopqrstuvwxya'ya benziyordu (alfabeyi yeniden düzenlemek, aşağı çekmek ve z getirmek istemezsiniz)
Görünen Ad

1
Proje yönetimi terimleriyle ifade etmek için: bir kesmek, geleceği zaman / insan saatleri borcu yaratabilen ve / veya en iyi uygulamalara veya standart sözleşmelere karşı gelebilecek bir çözümdür.
Gizli,

60

Her mühendislik kararı, acil maliyet ve gecikme ile sonuçta ortaya çıkan maliyetler ve teknik borç arasında bir dengedir.

Bir hack, ikincisini bir sonuç olarak kabul ederken tercih edilen bir durumdur.

Deneyimsiz geliştiriciler (kısmen mühendislik eğitim sisteminin çalışma şekli nedeniyle) öncekine odaklanır ve ikincisini gerçekten anlamak veya tahmin etmek için yeterli deneyime sahip değildir.

Deneyimli geliştiriciler bunu yapar, ancak çeşitli nedenlerden dolayı (çoğu meşru) öncekileri seçer.

Hack terimi hemen hemen her zaman bir problemi geçici olarak çözme ve "hemen sonra yapma" niyetini belirtir, ancak deneyimli geliştiriciler koddaki en kalıcı şeylerin geçici kesmeler olduğunu bilir.


13
+1 "ancak deneyimli geliştiriciler koddaki en kalıcı şeylerin geçici kesmeler olduğunu biliyor"! Bu aynı zamanda tembellikten asla doğru şekilde yapmanı engellememesi gerektiği anlamına gelir.
Matthieu M.

20

Çalışırsa çözüm nasıl kötü olabilir?

Bunu düşün

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

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

Bununla birlikte, ikinci örnek, daha iyi bir uygulamanın cehaletinden veya o zaman daha kolay/1 görünen bir varsayım ya da işi doğru yapan bir kütüphanedeki bir hatadan dolayı kullanılan hack olabilir ./1

İyi uygulama nedeniyle mi?

Hayır. Hacks "uygun" koddur. Orada üç dört nedenleri.

  • Uygun tasarım ilkelerinin cehaleti. (örneğin, KATI ilkeleri)

  • API veya dil kurgusu ile ilgili kibir (yani yanlış varsayımlar).

  • Çözülemeyen, ancak çözülen gerçek hatalar.

  • Yönetim iyi tasarım ve düzeltme varsayımlarını geçersiz kılar. "Bütçe" ortak bir gerekçedir, ancak bu teknik olmayan bir kök nedene sahip olan temel üç yukarıdaki (cehalet, kibir veya hata) biridir.

Ya da bakımsız mı?

Mesele bu. Hack, cehalet, hata veya varsayımlara dayanmaktadır.

Çözümünüzün bir parçası olarak kodun bir yan etkisi kullanıyor mu?

Bu cehalet veya yanlış bir varsayım örneği olabilir.


Müthiş cevap, ancak Kalite - Zaman - Maliyet üçgeni nedeniyle, bilgisayar korsanlarının bazen kalitenin sıkıştırılmasıyla yazıldığını dikkate almaz.
StuperUser

1
Bu oyunu müşterileri ile oynamak için kullanırım. Bir projenin en önemli iki yönünü Kalite, Zaman ve Maliyet'ten seçmelerini isterim. Neredeyse her zaman Zaman ve Maliyet seçildi ve ardından kalite pazarlığı yapıldı. Spesifik olarak, benim bir danışman olduğumu ve zamanla üç maliyet, maliyet ve üstün kaliteyi sunabilmem gerektiği gerçeğine işaret ederek. Bu senaryo Hen's Teeth'e benziyor!
OptimizePrime

1
@Optimize: Tavukların dişleri nadirdir. Bu durum nadir mi?
Matt Ellen

@Matt Ellen: "Tavuk Dişi" ifadesinin farklı bir kullanımı olabilir. "Nadir" yerine "çelişkili" anlamına gelebilir.
S.Lott

Neredeyse her zaman "yönetim geçersiz kılma" kararı olduğunu buldum.
Mark McDonald

15

Programlama bağlamında hack, ördek bandı veya ciklet ile bir şeyi sabitlemeye eşdeğerdir.

Hack, çoğu zaman kodunuzu kırarak değiştirebilecek bazı belgelenmemiş ve desteklenmeyen özellikler kullanmayı içerir. Ayrıca kodlanmış değerleri de içerebilir.

Hack tipik olarak, bazı problemleri çözmek yerine, bir kütüphane / hizmet kullanarak kod içinde geçici olarak çalışmak olabilir. Daha sonra kontrolünüz dışındaysa, kesmek onunla başa çıkmanın tek yolu olabilir.


21
Kanallar için ördek-bant kullanarak bir şarlatan olur;)
JeffO

şarlatan şarlatan şarlatan
Mateen Ulhaq

11

Terim zaman zaman "parlak bir hack" de olduğu gibi zıt çağrışımda da kullanılır. Sırf berbat bir şey yapmaktan çok daha yaygın olduğu için, berbat hack'leri duymak, harikulade hacklerden çok daha yaygındır, ancak her iki şekilde de kullanılan terimleri duydum.

Olumlu anlamda kullanılan "Hack", temelde, sorunu beklenmeyen ve özellikle akıllıca çözen zarif bir çözüm anlamına gelir. Olumsuz ve olumlu anlamlar aslında biraz yakındır çünkü zekice bir kesmek genellikle teknolojinin istenmeyen bir yönünden faydalanmayı içerir.


1
Parlak bir hack çünkü yüzeyde ne yaptığınızı görmek zor olacak, ancak daha ayrıntılı incelemelerden sonra, bunun saçma sapan zekice bir sol alan kodu olduğu açık. Seni deprem karekökü büyüsüne yönlendirebilir miyim: codemaestro.com/reviews/9
Robert Massaioli

10

Şu anda çalışan , ancak uzun vadede muhtemelen sorunlara neden olacak bir çözüm .

Örnek: bazı değerleri dinamik olarak doldurarak bir HTML belgesi oluşturmanız gerekir. Bunu yapmanın doğru yolu, Freemarker veya XSLT veya JSP gibi aslında bu amaç için tasarlanmış araçlardan birini kullanmaktır. Ama bunlardan hiçbirini kullanamazsınız veya doğru şekilde yapmaktan rahatsız olamazsınız, bu yüzden şöyle bir şey yazıyorsunuz:

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

9

Bir kesmek, çoğu zaman kullanıma hazır düşünmeye ve çevre hakkındaki beklenmedik gerçeklerden faydalanmaya bağlı olarak, bir soruna zekice bir çözümdür. Orada izleyicilerin zekice olduğu konusunda hemfikir oldukları, ancak harika ya da korkunç olup olmadığını çözemedikleri arketip hack hakkında bir söz var. Bakım onarımlarınızda istemediğiniz bir şey bu.

Bir sorunu çözen bir kesmek büyük olasılıkla çevrenin ayrıntılarına veya bir aracın belgesiz özelliklerine veya benzeri bir şeye bağlı olacaktır. Şimdi çalışan, ancak bir şey değiştiğinde kırılması muhtemel kırılgan bir çözüm olması muhtemeldir. Nasıl çalıştığını anlamak zor olabilir ve herhangi bir bakım programcısı anlaşılması zor kodlardan nefret edecektir. Şimdilik hiçbir şeye zarar vermeyen yan etkileri olabilir, ancak gelecekte çok iyi bir kod parçasında sorun çıkmasına neden olacak ve gelecekte başa çıkacak bir kabus olabilir.


9

Hack kelimesi yanlış kullanılmış. Eğer gerçekten biraz tarih almak istiyorsan, Wikipedia yapabilirsin. Bir kesmek, yapmak istemedikleri bir şeyi yapmak için işleri ince ayar sürecini tarif eden bir kelimedir. Elektrik mühendisliği bağlamında, bu iyidir. Bu konuda Wikipedia'da daha iyi bir açıklama var.

Şimdi, bilgisayar bilimleri bağlamında. Bir kesmek genellikle kötüdür. Evet, işe yarıyor ama genellikle programcının yazılımın tasarımına uymayan belirsiz bir kod parçası yazdığı ve bu kodu okumak zorunda olan her programcının kafasını karıştırdığı anlamına gelir. Elbette programcıların zamanı pahalıdır, bu yüzden bir yönetici olarak en kolay bakım yapılan yazılıma sahip olmak ister. Aynısı programcılar için de geçerlidir. Ayrıca, bilgisayar korsanları yazılımdaki başka bir şeyi bozma eğilimindedir.

Kesmeyi kabul edip etmeme kararıdır. En azından kıdemli yazılım mühendisinin hack'i onaylamasını istiyorsunuz, çünkü daha fazla deneyime sahip ve daha eğitimli bir karar alabiliyor. Kesinlikle, genç erkeklerin hack kabul etme konusunda karar vermelerini istemiyorsunuz. Biri bulabilirler ve yardımların kesmeyi sürdürmenin acısına değip değmeyeceğini kıdemli erkeklerle tartışabilirler.


6

Thereifixedit.com bulunan bu bir kesmek .

Hile

Aslında o sitedeki her şey hakkında bir hack.

Hacks, bağlam dışında bazı şeylerin ustaca ve cüretkar kullanımıdır.
Bir kesmenin güzelliği, verilen bir probleminiz ve asla çözmesi amaçlanmayan araçların olması, fakat problemi sadece bu araçlarla (doğru olanları elde etmek yerine) çözmenizdir. Zeki, hızlı ve eğlenceli. Dezavantajı ise, sonuçların genellikle yabancılar için kullanılması kırılgan ve tehlikeli olmasıdır.
Demek istediğim, sorunlarını resimdeki gibi çözmeyi seviyorsan sorun yok. Sorun, başkalarının sorunlarını bu şekilde çözdüğünüzde ortaya çıkar. Bu durumda, muhtemelen elektriğe bürünür veya yanar veya başka bir şey olur.

Yazılım geliştirmede, kodunuzun ölümcül bir yaralanmaya eşdeğer olmadan başkaları tarafından (geleceğinizi içeren) ele alınmasını istiyorsunuz. Dijkstra'nın söylediği gibi:

Yetkili programcı, kendi kafatasının sınırlı büyüklüğünün tamamen farkındadır. Bu nedenle, görevine tam bir alçakgönüllülükle yaklaşır ve veba gibi zekice numaralardan kaçınır.

Ve en akıllıca hileler arasında kesmek.

Hack'ler kodunuzda bir yerde saatli bombaları geçiyor, çünkü ortak olanlar doğal olarak çok fazla varsayımlara dayanıyor ("sadece bunu yapmak" uygun şekilde ayrılmayı tercih ediyor). Bu varsayımlar artık geçerli olmaz kalmaz, tüm sisteminiz ne olduğu hakkında hiçbir fikriniz olmadan bozulabilir.


4

Terim çok kesin değil ama muhtemelen hızlı ve kirli bir çözüme atıfta bulunarak düzgün bir şekilde çözülmesi zor olan bir soruna işaret ediyor. Söz konusu çözüm muhtemelen işe yarar , ancak muhtemelen çok iyi bir uygulama değildir, belki de ince böcekler, belki de küçük bilinen böcekler vardır ve zaman geçerse, daha sonra yeniden yapılmalıdır . Bence "kesmek" olarak adlandırdığınız şeye bazen " çamur " da denir .

Sık sık bir görevi bitirmek için çok zaman kısıtlamaları olduğunda kesmelerin gerçekleştiğini ve daha sonra düzeltilebilecekleri umuduyla KG'yi geçmek için "yeteri kadar" çalıştığı için bir kesmek çözümü uygulandığını görüyorum. Ne yazık ki, daha sonra yapılan düzeltme / temizleme her zaman gerçekleşmez :(


"Çok kesin değil" ile neyi kastettiğinizi tam olarak bilmiyorum - Çoğu programcının yazılı bir kodun kesildiğini söyleyerek ne anlama geldiğini tam olarak bileceğini söylerdim. Ancak cevabın geri kalanı yerinde, işe yarıyor ama bir nedenden ötürü (mimari, performanslar vb.) En uygun çözüm değil.
ozz

@james: Tecrübelerime göre, iki programcı bazı koda bakabilir ve bir tanesi hack diyebilir, diğeri olmaz. Bir kod parçasını kesmek olarak ölçmenin gerçek bir yolu yok. Herkesin bir saldırının ne olduğu konusunda kendi fikirleri vardır ve çoğu zaman benzerdir ancak her zaman aynı değildir. Kodunu başkaları tarafından "hackish" olarak adlandırılan ve aynı fikirde olmayan biri olarak yazılmıştır. Ve diğer insanların kodunu "hackish" olarak adlandırdım ve aynı fikirde değiller. Doğru, bunlar muhtemelen sınır durumlarıdır, ancak sınırlar zaman zaman belirsiz olabilir ...
Sinir

1
@FWFD - bu sadece bir şeyin hack olup olmadığı konusunda hemfikir değil. Birisi bazı kodları bir "hack" diyorsa, ne anlama geldiklerini bilirsiniz.
ozz

4

Öncü bir geliştirici olarak çok zaman geçiriyorum, bu yüzden hack tanımım şöyle:

Çevre derinlemesine bilgiye dayanan bir çözüm, kusurlar ve belgelenmemiş davranışlar.

Ortam sizin çerçeveniz, web tarayıcınız, veritabanınız, ATM (bankamatik), dava olabilir. Bir döngü deliği bildiğiniz ve bir sorunu çözmek için onu kullandığınız herhangi bir "kural sistemi".


4

Bir kesmek genellikle görünüşte istenen çıktıyı sağlayan bir koddur, ancak alt-optimal şekilde.

Genellikle köken sahibi tarafından istenmeyen bir şekilde belgelenmemiş veya belirsiz bir dil / kütüphane özelliği kullanıyor ve bu nedenle niyetin ne olduğunu gizliyor.

Bazen bir dil veya kütüphane hatası etrafında çalışmak için yapılır, ancak çoğu durumda ana sebep genellikle cehalettir;

Bir çekiç için her şey bir çiviye benziyor.

Genellikle hem boşlukta hem de zaman içinde verimsiz bir şekilde yapılan, ancak sonuçta istenen çıktıyı üreten, ancak test edilebilecek ve bakımı yapılamayan, maliyet ve olası bilinmeyen kenar durumları ile sonuçlanan şeyler. Genellikle, temel mantık veya dil deyimlerinin anlaşılmamasından kaynaklanır . Ayrıca "zor yoldan" bakın.

Genellikle kod, uygun deneyime sahip bir kişinin yapmayı düşünmeyeceği, ya da ele geçirdikleri hack turu kadar karmaşık ve verimsiz hale getirmek için uzun ve zor düşünmesi gereken bir şeydir.

Örnekler

Vista Düzeltme

E-posta Doğrulama Geçerliliği

Yazılım Birimleri

Deterministik olmayan karma


+1 Suboptimal için. Ve en çok oy alan kesmek için hackler gerekli değildir çünkü.
rlb.usa

2

Kel bir lastik çalışır ancak kimse onu delinmek için ideal bir çözüm olarak nitelendirmez. Çizgiden daha kötü sorunlar yaratabilir.

Genelde bir kesmeyi, acil bir soruna hızlı ve kirli bir çözüm olarak düşünürdüm. Genellikle bir programlama mağazasında normal programlama uygulamasına uymayabilir (örneğin, çok fazla kodlama kullanın). Küçük bir düzeltme olabilir.

Kötü olmasının en önemli nedenlerinden biri a) tahmin edilemeyen sonuçlara neden olabilmesidir b) söz konusu kodun bakım sorunlarına neden olacak orijinal tasarımına uymayabilir. Tecrübelerime göre, hack'ler de genellikle çok kötü bir şekilde belgelenmiştir.


2

Duyduğum ve saygı duyduğum kısa bir tanım:

“Her durumda sorunu tamamen çözmeyen bir semptoma çözüm”

Çirkin kod kesmek olabilir veya olmayabilir. Başka bir cevabın 2 + 2 örneği kesmek değildir, çirkin bir kod çözümü ve kod anlama açısından kötüdür, ancak her durumda doğru çözümü üretir. Matematikte faktörlü bir denklem düşünün - davranış / ilişki her iki versiyonda da aynı ve doğru, ancak form farklı. Hmm, denklem faktörü, refaktör denklemi, refaktör kodu ... hayır, benzerlik yok Eminim :)

İlk adı "Jim" olarak değiştirmeyle ilgili diğer cevaplardan birindeki örnek bir kesmek: belirtiyi çözüyor (listedeki ilk isim Jim), ancak sorunu tam olarak çözmüyor (liste sıralanmıyor) veya tüm girişler için geçerli olan herhangi bir şekilde önceliklendirilmiş).


1

Bir kesmek beklenen sonucu veren bir şey yapmaktır, ancak bunu garip bir şekilde yapar (genellikle bir performans vuruşuna neden olur).

Örneğin:

Görev : İki Katlı Bir Tamsayı Değişmek

Çözüm : Cast Operator kullanın. Yani: dblVar = CType (intVar, Çift)

Hack : Bir Çifte Böl. Yani: dblVar = intvar / 1.0


Yıldız örneği için +1. Eski AS400 kodunda, Avrupa tarihlerini Amerikan tarihini çıkaran bir tuhaf ondalık ile çarparak göreceğim. Bazı kodlayıcılar bunu bizim .Net kodumuza sızdırmaya başladıklarında problemler başlıyor.
Morgan Herlocker

0

Bacağınıza virüs bulaştığını ve hayatta kalmak için kaldırılmaları gerektiğini hayal edin. Doktorun bir baltayla hızla kesmesini mi, yoksa problemi inceledikten ve uygun aletleri, prosedürü vb. Seçtikten sonra cerrahi olarak çıkarmasını mı tercih edersiniz? Aynısı yazılım için de geçerlidir.


Saldırganın beynime girmesi için bir şansı olmadan onu kesmesini istiyorum.
Mateen Ulhaq

Ya sadece birkaç dakikanız varsa?
StuperUser

0

Bir bilgisayar korsanı, kodlayıcı sorumlu "geri döneceğim ve daha sonra düzelteceğim" ilan ettiğinde doğduğunu gösteriyor.

Ciddi bir notta - OP bağlamında bir kesmek istenen sonucu elde eden bir şeydir, ancak bunu yapmak için geçici veya güvenilmez bir yöntem kullanır.

Diğer yaygın tanım, platformdaki sınırlamaları / önlemleri atlatmak için son durum davranışlarından yararlanan bir tekniktir.

İkinci bağlamda Hack "maverick" (okuma: tehlikeli) kahraman kodlayıcılar arasında belirli bir önbellek vardır ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.