Apa itu retas? [Tutup]

55

Saya sering mendengar rekan kerja berkata satu sama lain, "Itu peretasan yang mengerikan, mengerikan."

Yang bisa saya ambil dari itu adalah bahwa itu tidak baik. Ketika saya bertanya kepada mereka apakah itu berhasil, mereka berkata "ya, tapi itu tidak baik". Apakah itu berarti itu bukan solusi yang baik? Bagaimana solusi buruk jika berhasil? Apakah ini karena praktik yang baik? Atau tidak bisa dirawat? Apakah ini menggunakan efek samping kode sebagai bagian dari solusi Anda?

Sangat menarik bagi saya ketika ada sesuatu yang diklasifikasikan sebagai hack. Bagaimana Anda bisa mengidentifikasinya?

dustyprogrammer
sumber
5
Sesuatu mungkin bekerja tetapi lambat, rapuh, jelek untuk diolah dan menyakitkan untuk dirawat. Ini adalah retasan.
Trezoid
1
Ghetto-rigged code == hack
Garet Claborn
Saya tidak mengatakan ini adalah hack, tetapi Anda ingin memikirkan kembali secara dinamis patch-monyet +untuk dibagi berdasarkan heuristik.
dietbuddha
Untuk semua orang yang menyatakan bahwa peretasan adalah band-aids kotor, silakan lihat apa yang menjadi arti bagi mereka yang menyebut diri mereka peretas di outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Yang sangat bagus , dan mungkin sangat memakan waktu, pekerjaan yang menghasilkan apa yang dibutuhkan.
1
Fitur yang tidak diterapkan sesuai standar populer atau dengan standar atasan Anda.
Aditya P

Jawaban:

97

Ini menerapkan bantuan band sementara untuk luka menganga besar. Ini sudah diperbaiki untuk saat ini, tetapi akan menyebabkan lebih banyak masalah lagi nanti.

Contoh yang baru-baru ini saya lihat: Anda ingin seseorang bernama "Jim", selalu muncul pertama kali dalam daftar alfabet. Untuk menyelesaikannya dengan cepat, Anda ganti namanya menjadi " Jim". Ini adalah retasan yang pasti akan kembali menggigit Anda nanti.

JD Isaacks
sumber
34
Atau Anda bisa memanggilnya "AAA Jim".
perusahaan
4
Contoh lain adalah memperluas if ... else ... else ... selain karena keterbatasan waktu, alih-alih solusi yang lebih dapat diperluas.
Phil Lello
29
Dan solusi nyata untuk membuat Jim muncul pertama kali dalam daftar alfabet adalah, tentu saja, untuk menyusun ulang alfabet.
artem
1
@artem benar, dan itu terlihat seperti jzbcdefghiklmnopqrstuvwxya ini (Anda tidak ingin harus menyusun ulang alfabet, untuk mencatat a dan menampilkan z)
Nama Tampilan
1
Untuk mengatasinya dalam istilah manajemen proyek: peretasan adalah solusi yang dapat menciptakan masa depan hutang waktu / jam kerja, dan / atau bertentangan dengan praktik terbaik atau konvensi standar.
Incognito
60

Setiap keputusan teknik merupakan pertukaran antara biaya langsung dan penundaan dan biaya konsekuensial dan utang teknis.

Retasan adalah situasi di mana yang pertama disukai sementara menerima yang terakhir sebagai konsekuensinya.

Pengembang yang tidak berpengalaman (sebagian karena cara sistem pendidikan teknik bekerja) fokus pada yang pertama dan tidak memiliki pengalaman yang cukup untuk benar-benar memahami atau memperkirakan yang terakhir.

Pengembang berpengalaman melakukannya, tetapi karena berbagai alasan (banyak yang sah) pilih yang pertama.

Istilah peretasan hampir selalu menyiratkan niat untuk menyelesaikan masalah sementara dan "lakukan segera setelah itu", tetapi pengembang yang berpengalaman tahu bahwa hal yang paling permanen dalam kode adalah peretasan sementara.

Uri
sumber
13
+1 untuk "tetapi pengembang yang berpengalaman tahu bahwa hal yang paling permanen dalam kode adalah peretasan sementara"! Yang juga berarti bahwa kemalasan tidak boleh mencegah Anda melakukannya dengan benar.
Matthieu M.
20

Bagaimana solusi buruk jika berhasil?

Pertimbangkan ini

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

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

Contoh kedua, bagaimanapun, mungkin hack yang digunakan karena ketidaktahuan tentang praktik yang lebih baik atau asumsi yang dibuat /1tampak lebih sederhana pada saat itu atau bug di perpustakaan yang membuat /1pekerjaan dengan benar.

Apakah ini karena praktik yang baik?

Hacks adalah kode "bijaksana". Ada tiga empat penyebab.

  • Ketidaktahuan tentang prinsip-prinsip desain yang tepat. (yaitu prinsip SOLID)

  • Arogansi (yaitu asumsi keliru) tentang API atau konstruksi bahasa.

  • Bug aktual yang tidak dipecahkan tetapi sedang dikerjakan.

  • Manajemen mengesampingkan asumsi desain dan koreksi yang baik. "Anggaran" adalah pembenaran umum, tetapi ini pada dasarnya adalah salah satu dari tiga di atas (ketidaktahuan, kesombongan atau kesalahan) dengan akar penyebab non-teknis.

Atau tidak bisa dirawat?

Itulah intinya. Peretasan ini didasarkan pada ketidaktahuan, bug atau asumsi.

Apakah ini menggunakan efek samping kode sebagai bagian dari solusi Anda?

Itu bisa menjadi contoh ketidaktahuan atau asumsi yang salah.

S.Lott
sumber
Jawaban yang bagus, tetapi tidak memperhitungkan bahwa peretasan kadang-kadang ditulis dengan kualitas terjepit karena segitiga Kualitas vs Waktu vs Biaya.
StuperUser
1
Saya gunakan untuk memainkan game itu dengan klien. Saya akan meminta mereka untuk memilih dua aspek paling penting dari sebuah proyek dari Kualitas, Waktu, Biaya. Hampir selalu Waktu dan Biaya dipilih, lalu mereka tawar-menawar soal kualitas. Secara khusus, mengutip fakta saya adalah seorang konsultan dan harus dapat memberikan ketiganya dalam waktu, biaya dan dengan kualitas luar biasa. Skenario ini seperti Gigi Hen!
OptimizePrime
1
@Optimasi: Ayam betina jarang. Apakah situasi ini jarang terjadi?
Matt Ellen
@ Matt Ellen: Ini mungkin perbedaan penggunaan frasa "Hen's Teeth". Ini mungkin berarti "kontradiktif" dan bukan "langka".
S.Lott
Saya menemukan bahwa itu hampir selalu merupakan keputusan "manajemen menimpa".
Mark McDonald
15

Hack dalam konteks pemrograman akan sama dengan memperbaiki sesuatu dengan bebek-tape atau permen karet.

Peretasan sangat sering melibatkan penggunaan beberapa fitur yang tidak terdokumentasi dan tidak didukung, yang mungkin berubah saat melanggar kode Anda. Mereka mungkin juga melibatkan nilai-nilai hard-coded.

Peretasan biasanya bisa juga merupakan penyelesaian sementara dalam kode menggunakan beberapa pustaka / layanan, alih-alih memecahkan masalah mendasar. Jika nanti di luar kendali Anda, peretasan mungkin satu-satunya cara untuk mengatasinya.

vartec
sumber
21
Menggunakan bebek-tape untuk saluran akan menjadi dukun;)
JeffO
quack quack quack
Mateen Ulhaq
11

Istilah ini kadang-kadang digunakan dengan konotasi yang berlawanan, seperti dalam "hack brilian." Hanya karena jauh lebih umum untuk gagal daripada melakukan sesuatu yang brilian, jauh lebih umum untuk mendengar tentang peretasan yang mengerikan daripada peretasan yang brilian, tetapi saya telah mendengar istilah itu menggunakan kedua cara.

"Retas" yang digunakan dalam arti positif pada dasarnya berarti solusi elegan yang memecahkan masalah dengan cara yang tak terduga dan khususnya pintar. Makna negatif dan positif sebenarnya agak dekat karena peretasan yang brilian sering melibatkan mengambil keuntungan dari aspek teknologi yang tidak diinginkan.

jhocking
sumber
1
Ini adalah hack yang brilian karena akan sulit untuk melihat apa yang Anda lakukan di permukaan tetapi bahwa, setelah diperiksa lebih lanjut, jelas bahwa ini adalah kode bidang yang sangat pintar. Bolehkah saya mengarahkan Anda ke magic root kuadrat gempa: codemaestro.com/reviews/9
Robert Massaioli
10

Sebuah solusi yang berfungsi saat ini , tetapi mungkin akan menyebabkan masalah dalam jangka panjang.

Contoh: Anda perlu membuat dokumen HTML, mengisi beberapa nilai secara dinamis. Cara yang tepat untuk melakukan ini adalah dengan menggunakan salah satu alat yang sebenarnya dirancang untuk tujuan ini, seperti Freemarker, atau XSLT, atau JSP. Tetapi Anda tidak dapat menggunakan salah satu dari itu, atau Anda tidak dapat diganggu untuk melakukannya dengan benar, sehingga Anda menulis sesuatu seperti ini:

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

Retasan adalah solusi cerdas untuk suatu masalah, sering kali bergantung pada pemikiran yang tidak biasa dan mengambil keuntungan dari fakta-fakta yang tidak terduga tentang lingkungan. Ada pepatah di luar sana tentang peretasan tipikal bahwa pemirsa setuju bahwa itu cerdik, tetapi tidak tahu apakah itu indah atau mengerikan. Ini adalah hal yang tidak Anda inginkan dalam perbaikan pemeliharaan Anda.

Retasan yang memperbaiki masalah kemungkinan besar akan tergantung pada detail lingkungan, atau fitur alat yang tidak terdokumentasi, atau sesuatu seperti itu. Ini mungkin menjadi solusi yang rapuh, bekerja sekarang tetapi kemungkinan rusak ketika sesuatu berubah. Mungkin sulit untuk memahami cara kerjanya, dan setiap programmer pemeliharaan akan membenci kode yang sulit dipahami. Ini mungkin memiliki efek samping yang tidak menyakiti apa pun untuk saat ini tetapi akan menyebabkan masalah dalam potongan kode yang sangat baik agak jauh di masa depan, dan itu bisa menjadi mimpi buruk untuk dihadapi.

David Thornley
sumber
9

Kata hack disalahgunakan. Jika Anda ingin benar-benar mendapatkan sedikit sejarah, Anda dapat Wikipedia. Retasan adalah kata untuk menggambarkan proses mengutak-atik hal untuk melakukan sesuatu yang tidak seharusnya mereka lakukan. Dalam konteks teknik elektro, ini bagus. Ada deskripsi yang lebih baik di Wikipedia tentang ini.

Sekarang, dalam konteks ilmu komputer. Peretasan umumnya buruk. Ya, itu berfungsi tetapi biasanya itu berarti bahwa programmer menulis beberapa kode ambigu yang tidak sesuai dengan desain perangkat lunak dan itu akan membingungkan setiap programmer yang harus membaca kode itu. Tentu saja waktu programmer mahal, sehingga sebagai seorang manajer ingin memiliki perangkat lunak yang paling mudah dirawat. Hal yang sama berlaku untuk programmer. Juga, peretasan cenderung merusak sesuatu yang lain, dalam perangkat lunak.

Ini adalah panggilan penilaian apakah akan menerima retas atau tidak. Setidaknya Anda ingin insinyur perangkat lunak senior menyetujui peretasan, karena ia memiliki lebih banyak pengalaman dan mampu membuat keputusan yang lebih terdidik. Tentunya Anda tidak ingin para junior membuat keputusan tentang menerima peretasan. Mereka dapat memunculkannya dan berdiskusi dengan para senior apakah manfaatnya sepadan dengan rasa sakit mempertahankan hack.

Erion
sumber
6

Ini adalah retasan , seperti yang ditemukan di thereifixedit.com .

Retas

Sebenarnya segala sesuatu di situs itu adalah peretasan.

Hacks adalah penggunaan beberapa hal secara cerdik dan berani di luar konteksnya.
Keindahan hack terdiri dari fakta, bahwa Anda memiliki masalah dan alat yang tidak pernah dimaksudkan untuk menyelesaikannya, tetapi Anda memecahkan masalah hanya dengan alat-alat itu (alih-alih mendapatkan yang tepat). Mereka pintar, cepat dan menyenangkan. Kelemahannya adalah, hasilnya seringkali rapuh dan berbahaya untuk digunakan oleh orang luar.
Maksud saya, jika Anda suka menyelesaikan masalah Anda seperti pada gambar, tidak ada masalah. Masalahnya terjadi, ketika Anda memecahkan masalah orang lain seperti itu. Dalam hal ini, mereka mungkin akan tersengat listrik atau terbakar atau semacamnya.

Dalam pengembangan perangkat lunak, Anda ingin agar kode Anda dapat ditangani oleh orang lain (yang mencakup masa depan Anda) tanpa cedera yang setara. Seperti yang Dijkstra katakan:

Pemrogram yang kompeten sepenuhnya menyadari ukuran tengkoraknya yang terbatas. Karena itu ia mendekati tugasnya dengan penuh kerendahan hati, dan menghindari trik pintar seperti wabah.

Dan hack adalah beberapa trik yang paling pintar.

Hacks menandai bom waktu di suatu tempat dalam kode Anda, karena yang umum secara inheren didasarkan pada terlalu banyak asumsi ("just do it" lebih disukai daripada decoupling yang tepat). Segera setelah asumsi-asumsi itu tidak lagi berlaku, seluruh sistem Anda dapat runtuh tanpa Anda tahu apa yang terjadi.

back2dos
sumber
4

Istilah ini tidak terlalu tepat tetapi mungkin merujuk pada solusi cepat dan kotor untuk masalah yang sulit dipecahkan dengan benar. Solusi yang dimaksud mungkin berhasil, tetapi mungkin bukan implementasi yang sangat baik , mungkin memiliki bug halus, mungkin beberapa bug kecil yang diketahui , dan harus diulang kemudian, jika waktu mengizinkan. Saya pikir apa yang Anda dengar disebut "retas" juga kadang-kadang disebut " kludge ".

Saya sering melihat peretasan terjadi ketika ada batasan waktu yang sangat sempit untuk menyelesaikan tugas, dan solusi peretasan diimplementasikan karena berfungsi "cukup" untuk melewati QA, dengan harapan dapat diperbaiki nanti. Sayangnya, perbaikan / pembersihan nanti tidak selalu terjadi :(

FrustratedWithFormsDesigner
sumber
Saya tidak yakin apa yang Anda maksud dengan "tidak terlalu tepat" - Saya akan mengatakan sebagian besar programmer akan tahu persis apa yang dimaksud dengan mengatakan beberapa kode yang ditulis adalah hack. Tetapi sisa jawabannya tepat, itu bekerja, tetapi untuk beberapa alasan (arsitektur, pertunjukan dll) itu bukan solusi yang optimal.
ozz
@james: Dalam pengalaman saya, dua pemrogram dapat melihat beberapa kode dan satu akan menyebutnya hack, yang lain tidak. Tidak ada cara yang nyata untuk mengukur sepotong kode sebagai peretasan. Setiap orang memiliki ide mereka sendiri tentang apa itu hack, dan seringkali mereka mirip tetapi tidak selalu sama. Ditulis sebagai seseorang yang memiliki kode yang disebut "diretas" oleh orang lain, dan tidak setuju. Dan saya menyebut kode orang lain "retas" dan mereka tidak setuju. Benar, mereka mungkin kasus batas, namun batas-batas dapat menjadi kabur di kali ...
FrustratedWithFormsDesigner
1
@ FWFD - itu hanya tidak setuju apakah sesuatu ADALAH hack. Jika seseorang "mengatakan" beberapa kode adalah peretasan, Anda akan tahu apa artinya.
ozz
4

Saya menghabiskan banyak waktu sebagai pengembang front-end, jadi definisi saya tentang peretasan adalah:

Solusi yang didasarkan pada pengetahuan mendalam tentang kelemahan lingkungan dan perilaku tidak berdokumen.

Lingkungan dapat berupa kerangka kerja Anda, browser web, database, ATM (mesin ATM tunai), kasing pengadilan. Setiap "sistem aturan", di mana Anda tahu loop-hole dan memanfaatkannya untuk menyelesaikan masalah.

mefisto
sumber
4

Peretasan biasanya adalah beberapa kode yang tampaknya memang memberikan hasil yang diinginkan, tetapi dengan cara yang tidak optimal.

Biasanya menggunakan beberapa fitur bahasa / perpustakaan tidak terdokumentasi atau tidak jelas dalam beberapa cara yang tidak diinginkan oleh pencetus dan dengan demikian mengaburkan apa tujuannya.

Kadang-kadang ini dilakukan untuk mengatasi beberapa bahasa atau bug perpustakaan tetapi dalam kebanyakan kasus penyebab utama biasanya ketidaktahuan;

Untuk palu semuanya terlihat seperti paku.

Hal-hal yang dilakukan dalam putaran tentang cara yang tidak efisien, biasanya dalam ruang dan waktu, tetapi pada akhirnya menghasilkan output yang diinginkan, tetapi dengan biaya, dan kemungkinan kasus tepi yang tidak diketahui tanpa testabilitas dan tanpa perawatan. Biasanya berasal dari kurangnya pemahaman mendasar tentang logika atau idiom bahasa. Lihat juga "jalan yang sulit".

Biasanya kodenya adalah sesuatu yang seseorang dengan pengalaman yang sesuai bahkan tidak akan mempertimbangkan untuk melakukannya, atau harus berpikir panjang dan keras untuk menjadikannya rumit dan tidak efisien seperti putaran tentang peretasan yang telah mereka temukan.

Contohnya

Perbaikan Vista

Validasi Validasi Email

Unit Perangkat Lunak

Hash Non deterministik

user7519
sumber
+1 Untuk suboptimal. Dan karena peretasan tidak perlu "sementara" sebagai yang paling banyak dipilih.
rlb.usa
2

Ban gundul bekerja tetapi tidak ada yang menyebutnya solusi ideal untuk tusukan. Ini dapat menciptakan masalah yang lebih buruk di telepon.

Biasanya saya akan mempertimbangkan peretasan sebagai solusi cepat dan kotor untuk masalah langsung. Ini biasanya tidak sesuai dengan praktik pemrograman normal di toko pemrograman (misalnya, gunakan banyak hardcoding). Ini mungkin perbaikan kecil.

Alasan utama buruknya adalah bahwa a) dapat menyebabkan hasil yang tidak terduga b) mungkin tidak cocok dengan desain asli dari kode yang bersangkutan yang akan menyebabkan masalah pemeliharaan. Dalam pengalaman saya, peretasan biasanya didokumentasikan dengan sangat buruk.

temptar
sumber
2

Definisi singkat yang saya dengar dan hormati:

"Solusi untuk gejala yang tidak sepenuhnya menyelesaikan masalah dalam semua kasus"

Kode jelek mungkin atau mungkin bukan hack. Contoh 2 + 2 dalam jawaban lain bukanlah peretasan, ini adalah solusi kode yang jelek dan buruk dari sudut pandang pemahaman kode, tetapi menghasilkan solusi yang benar dalam semua kasus. Pikirkan persamaan faktor dalam matematika- perilaku / hubungan itu identik dan benar di kedua versi, tetapi bentuknya berbeda. Hmm, faktor persamaan, refactor persamaan, kode refactor ... tidak, tidak ada kesamaan saya yakin :)

Contoh di salah satu jawaban lain tentang mengubah nama depan menjadi "Jim" adalah hack: ia memecahkan gejala (nama depan dalam daftar adalah Jim), tetapi tidak sepenuhnya menyelesaikan masalah (daftar tidak diurutkan atau diprioritaskan dengan cara apa pun yang berfungsi untuk semua entri).

segera
sumber
1

Peretasan adalah melakukan sesuatu yang mengembalikan hasil yang diharapkan, tetapi melakukannya dengan cara yang aneh (biasanya menimbulkan hit kinerja).

Misalnya:

Tugas : Untuk Melemparkan Variabel Integer ke Dobel

Solusi : Gunakan Operator Cast. Yaitu: dblVar = CType (intVar, Double)

Hack : Divide by a Double. Yaitu: dblVar = intvar / 1.0

Onion-Knight
sumber
+1 untuk contoh bintang. Dalam kode AS400 lama saya akan melihat tanggal Eropa dikalikan dengan beberapa desimal aneh, yang menampilkan tanggal Amerika. Masalahnya dimulai ketika coders tertentu mulai membocorkannya ke dalam kode .Net kami ... bleh!
Morgan Herlocker
0

Bayangkan jika kaki Anda terinfeksi dan harus dilepas agar Anda bisa selamat. Apakah Anda lebih suka dokter cepat-cepat melepaskannya dengan kapak, atau secara operasi menghapusnya setelah memeriksa masalah dan memilih alat, prosedur, dll yang sesuai? Hal yang sama berlaku untuk perangkat lunak.

Josh Smith
sumber
Saya ingin dia mencabutnya sebelum penyerang mendapat kesempatan untuk meretas otak saya.
Mateen Ulhaq
Bagaimana jika Anda hanya punya waktu beberapa menit?
StuperUser
0

Sebuah retas menandakan kelahirannya ketika pembuat kode yang bertanggung jawab menyatakan "Saya akan kembali dan memperbaikinya nanti".

Pada catatan serius - peretasan dalam konteks OP adalah sesuatu yang mencapai hasil yang diinginkan, tetapi menggunakan metode sementara atau tidak dapat diandalkan untuk melakukannya.

Definisi umum lainnya adalah teknik yang mengeksploitasi perilaku kasus tepi untuk menghindari batasan / perlindungan dalam platform.

Peretasan dalam konteks kedua memiliki cap tertentu di antara pahlawan kode "maverick" (baca: berbahaya) ...

sunwukung
sumber