Hack là gì? [đóng cửa]


55

Tôi thường nghe đồng nghiệp nói với nhau: "Đó là một vụ hack khủng khiếp, khủng khiếp".

Những gì tôi có thể lấy đi từ đó là nó không tốt. Khi tôi hỏi họ có hoạt động không thì họ nói "có, nhưng nó không tốt". Điều đó có nghĩa là nó không phải là một giải pháp tốt? Làm thế nào là một giải pháp xấu nếu nó hoạt động? Có phải do thực hành tốt? Hoặc không thể bảo trì? Có phải nó sử dụng một tác dụng phụ của mã như là một phần của giải pháp của bạn?

Nó thú vị với tôi khi một cái gì đó được phân loại là hack. Làm thế nào bạn có thể xác định nó?


5
Một cái gì đó có thể làm việc nhưng chậm, mong manh, xấu để làm việc và đau đớn để duy trì. Đây là một hack.
Trezoid

1
giả mạo

Tôi không nói đó là một vụ hack, nhưng bạn muốn suy nghĩ lại một cách linh hoạt việc vá khỉ +để phân chia dựa trên phương pháp phỏng đoán.
dietbuddha

Đối với tất cả những người tuyên bố rằng hack là các thiết bị hỗ trợ băng bẩn, vui lòng xem ý nghĩa của những người tự gọi mình là tin tặc tại outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ và có lẽ rất tốn thời gian, một tác phẩm tạo ra chính xác những gì cần thiết.

1
Một tính năng không được triển khai theo tiêu chuẩn phổ biến hoặc theo tiêu chuẩn cấp trên của bạn.
Aditya P

Câu trả lời:


97

Đó là áp dụng một hỗ trợ ban nhạc tạm thời cho một vết thương hở lớn. Hiện tại nó đã được sửa, nhưng nó sẽ gây ra nhiều vấn đề hơn sau này.

Một ví dụ gần đây tôi đã thấy: Bạn muốn một người được đặt tên "Jim", luôn xuất hiện đầu tiên trong danh sách theo thứ tự bảng chữ cái. Để nhanh chóng giải quyết nó, bạn đổi tên anh ta thành " Jim". Đây là một hack chắc chắn sẽ quay lại cắn bạn sau này.


34
Hoặc bạn có thể gọi anh ấy là "AAA Jim".
compman

4
Một ví dụ khác sẽ được mở rộng nếu ... khác ... khác ... khác do hạn chế về thời gian, thay vì một giải pháp mở rộng hơn.
Phil Lello

29
Và giải pháp thực sự để khiến Jim xuất hiện đầu tiên trong danh sách theo thứ tự chữ cái, tất nhiên, là sắp xếp lại thứ tự bảng chữ cái.
artem

1
@artem đúng, và nó trông giống như jzbcdefghiklmnopqrstuvwxya này (bạn không muốn phải sắp xếp lại bảng chữ cái, để đưa xuống một và đưa lên z)
Display Name

1
Để diễn đạt nó theo thuật ngữ quản lý dự án: hack là một giải pháp có thể tạo ra một khoản nợ thời gian / giờ làm việc trong tương lai và / hoặc đi ngược lại các thực tiễn tốt nhất hoặc các quy ước tiêu chuẩn.
Ẩn danh

60

Mỗi quyết định kỹ thuật là một sự đánh đổi giữa chi phí tức thời và sự chậm trễ và chi phí hậu quả và nợ kỹ thuật.

Hack là một tình huống mà cái trước được ưa thích trong khi chấp nhận cái sau là hậu quả.

Các nhà phát triển thiếu kinh nghiệm (một phần là do cách hệ thống giáo dục kỹ thuật hoạt động) tập trung vào cái trước và không có đủ kinh nghiệm để thực sự hiểu hoặc ước tính cái sau.

Các nhà phát triển có kinh nghiệm làm, nhưng vì nhiều lý do (nhiều hợp pháp) chọn cái trước.

Thuật ngữ hack hầu như luôn bao hàm ý định giải quyết vấn đề tạm thời và "thực hiện ngay sau đó", nhưng các nhà phát triển có kinh nghiệm biết rằng những thứ lâu dài nhất trong mã là hack tạm thời.


13
+1 cho "nhưng các nhà phát triển có kinh nghiệm biết rằng những thứ lâu dài nhất trong mã là các bản hack tạm thời"! Điều đó cũng có nghĩa là sự lười biếng không bao giờ ngăn cản bạn làm điều đó đúng.
Matthieu M.

20

Làm thế nào là một giải pháp xấu nếu nó hoạt động?

Xem xét điều này

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

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

Tuy nhiên, ví dụ thứ hai có thể là hack được sử dụng do không biết cách thực hành tốt hơn hoặc giả định có /1vẻ đơn giản hơn vào thời điểm đó hoặc lỗi trong thư viện khiến /1công việc hoạt động chính xác.

Có phải do thực hành tốt?

Không. Hacks là mã "expedient". Có ba bốn nguyên nhân.

  • Vô minh của các nguyên tắc thiết kế thích hợp. (tức là các nguyên tắc RẮN)

  • Sự kiêu ngạo (nghĩa là các giả định sai lầm) về API hoặc cấu trúc ngôn ngữ.

  • Các lỗi thực tế không được giải quyết nhưng được khắc phục.

  • Quản lý ghi đè lên các giả định thiết kế tốt và hiệu chỉnh. "Ngân sách" là một biện minh phổ biến, nhưng về cơ bản, đây là một trong ba lý do trên (thiếu hiểu biết, kiêu ngạo hoặc lỗi) với nguyên nhân gốc phi kỹ thuật.

Hoặc không thể bảo trì?

Đó là điểm. Việc hack dựa trên sự thiếu hiểu biết, lỗi hoặc giả định.

Có phải nó sử dụng một tác dụng phụ của mã như là một phần của giải pháp của bạn?

Đó có thể là một ví dụ về sự thiếu hiểu biết hoặc một giả định sai lầm.


Câu trả lời tuyệt vời, nhưng không tính đến việc hack đôi khi được viết với chất lượng bị chèn ép do tam giác Chất lượng so với Thời gian so với Chi phí.
StuperUser

1
Tôi sử dụng để chơi trò chơi đó với khách hàng. Tôi yêu cầu họ chọn hai khía cạnh quan trọng nhất của dự án từ Chất lượng, Thời gian, Chi phí. Hầu như luôn luôn Thời gian và Chi phí được chọn, và sau đó họ mặc cả về chất lượng. Cụ thể, trích dẫn thực tế tôi là một nhà tư vấn và có thể cung cấp cả ba theo thời gian, chi phí và chất lượng vượt trội. Kịch bản này giống như Răng của Hen!
OptimizePrime

1
@Optizes: Gà mái rất hiếm. Tình trạng này có hiếm không?
Matt Ellen

@Matt Ellen: Nó có thể là một cách sử dụng khác của cụm từ "Răng của Hen". Nó có thể có nghĩa là "mâu thuẫn" thay vì "hiếm".
S.Lott

Tôi thấy rằng hầu như luôn luôn là quyết định "ghi đè quản lý".
Đánh dấu McDonald

15

Hack trong bối cảnh lập trình sẽ tương đương với việc sửa một cái gì đó bằng băng keo hoặc kẹo cao su bong bóng.

Hack rất thường liên quan đến việc sử dụng một số tính năng không có giấy tờ và không được hỗ trợ, có thể thay đổi trong tương lai phá mã của bạn. Chúng cũng có thể liên quan đến các giá trị được mã hóa cứng.

Hack thường có thể là công việc tạm thời xung quanh trong mã bằng cách sử dụng một số thư viện / dịch vụ, thay vì giải quyết vấn đề tiềm ẩn. Nếu sau này nằm ngoài tầm kiểm soát của bạn, hack có thể là cách duy nhất để đối phó với nó.


21
Sử dụng băng keo vịt cho ống dẫn sẽ là một lang băm;)
JeffO

quack quack quack
Mateen Ulhaq

11

Thuật ngữ này đôi khi được sử dụng với ý nghĩa ngược lại, như trong một "hack tuyệt vời". Chỉ bởi vì nó rất phổ biến để làm hỏng việc hơn là làm một điều gì đó xuất sắc, việc nghe về những vụ hack khủng khiếp hơn là những vụ hack tuyệt vời, nhưng tôi đã nghe thấy thuật ngữ này được sử dụng theo cả hai cách.

"Hack" được sử dụng theo nghĩa tích cực về cơ bản có nghĩa là một giải pháp tao nhã giúp giải quyết vấn đề theo một cách bất ngờ và đặc biệt thông minh. Ý nghĩa tiêu cực và tích cực thực sự gần gũi vì một vụ hack xuất sắc thường liên quan đến việc lợi dụng khía cạnh ngoài ý muốn của công nghệ.


1
Đây là một bản hack tuyệt vời bởi vì thật khó để nhìn thấy những gì bạn đã làm trên bề mặt, nhưng khi kiểm tra chi tiết hơn, rõ ràng đây là mã trường trái thông minh lố bịch. Tôi có thể hướng bạn đến ma thuật căn bậc hai trận động đất: codemaestro.com/reviews/9
Robert Massaioli

10

Một giải pháp hoạt động ngay bây giờ , nhưng có thể sẽ gây ra vấn đề về lâu dài.

Ví dụ: bạn cần tạo một tài liệu HTML, điền vào một số giá trị động. Cách thích hợp để làm điều này là sử dụng một trong những công cụ thực sự được thiết kế cho mục đích này, như Freemarker, hoặc XSLT hoặc JSP. Nhưng bạn không thể sử dụng bất kỳ thứ nào trong số đó, hoặc bạn không thể bị làm phiền đúng cách, vì vậy bạn viết một cái gì đó như thế này:

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

9

Hack là một giải pháp khéo léo cho một vấn đề, thường phụ thuộc vào suy nghĩ ngoài luồng và lợi dụng những sự thật bất ngờ về môi trường. Có một câu nói ngoài kia về vụ hack cổ điển mà người xem đồng ý rằng nó thật tài tình, nhưng không thể biết liệu nó tuyệt vời hay khủng khiếp. Đây là loại điều bạn không muốn trong bản sửa lỗi bảo trì của mình.

Một bản hack khắc phục sự cố rất có thể sẽ phụ thuộc vào các chi tiết của môi trường hoặc các tính năng không có giấy tờ của một công cụ hoặc một cái gì đó tương tự. Nó có thể là một giải pháp dễ vỡ, hoạt động ngay bây giờ nhưng có khả năng bị phá vỡ khi có gì đó thay đổi. Có thể khó hiểu cách thức hoạt động của nó và bất kỳ lập trình viên bảo trì nào cũng sẽ ghét mã khó hiểu. Nó có thể có tác dụng phụ không gây tổn hại gì trong thời gian này nhưng sẽ gây ra vấn đề ở những đoạn mã hoàn toàn tốt trong tương lai và đó có thể là một cơn ác mộng phải đối phó.


9

Các từ hack bị sử dụng sai. Nếu bạn muốn thực sự có được một chút lịch sử, bạn có thể Wikipedia nó. Hack là một từ để mô tả quá trình điều chỉnh mọi thứ để làm điều gì đó mà họ không có ý định làm. Trong bối cảnh kỹ thuật điện, điều này là tốt. Có một mô tả tốt hơn trên Wikipedia về điều này.

Bây giờ, trong bối cảnh khoa học máy tính. Một hack nói chung là xấu. Vâng, nó hoạt động nhưng thông thường nó có nghĩa là lập trình viên đã viết một đoạn mã mơ hồ không tuân thủ thiết kế của phần mềm và điều đó sẽ gây nhầm lẫn cho mọi lập trình viên phải đọc mã đó. Tất nhiên thời gian lập trình viên rất tốn kém, vì vậy người quản lý muốn có phần mềm dễ bảo trì nhất. Điều tương tự là hợp lệ cho các lập trình viên. Ngoài ra, hack có xu hướng phá vỡ một cái gì đó khác, trong phần mềm.

Đó là một cuộc gọi phán xét có chấp nhận hack hay không. Ít nhất bạn muốn kỹ sư phần mềm cao cấp chấp thuận hack, vì anh ta có nhiều kinh nghiệm hơn và có thể đưa ra quyết định có học thức hơn. Chắc chắn bạn không muốn các đàn em đưa ra quyết định về việc chấp nhận hack. Họ có thể đến với một người và thảo luận với những người đàn ông cao cấp rằng liệu những lợi ích có xứng đáng với nỗi đau của việc duy trì vụ hack hay không.


6

Đây là một hack, như được tìm thấy trên thereifixedit.com .

Gian lận

Trên thực tế về tất cả mọi thứ trên trang web đó là một hack.

Hacks là cách sử dụng khéo léo và táo bạo của một số thứ trong bối cảnh của họ.
Vẻ đẹp của hack bao gồm trong thực tế, bạn có một vấn đề nhất định và các công cụ không bao giờ có ý định giải quyết nó, nhưng bạn giải quyết vấn đề chỉ bằng những công cụ đó (thay vì nhận đúng). Họ thông minh, nhanh chóng và vui vẻ. Nhược điểm là, kết quả thường dễ vỡ và nguy hiểm khi sử dụng cho người ngoài.
Ý tôi là, nếu bạn thích giải quyết vấn đề của mình như trong hình thì không có vấn đề gì. Vấn đề xảy ra, khi bạn giải quyết vấn đề của người khác như thế. Trong trường hợp này, họ có thể sẽ bị điện giật hoặc bị đốt cháy hoặc một cái gì đó.

Trong phát triển phần mềm, bạn muốn rằng mã của bạn có thể được xử lý bởi những người khác (bao gồm cả bạn trong tương lai của bạn) mà không tương đương với một chấn thương gây tử vong. Như Dijkstra đã nói:

Các lập trình viên có năng lực hoàn toàn nhận thức được kích thước hạn chế của hộp sọ của chính mình. Do đó, anh tiếp cận nhiệm vụ của mình với sự khiêm nhường hoàn toàn, và tránh những mánh khóe thông minh như bệnh dịch hạch.

Và hack là một trong những thủ thuật thông minh nhất.

Hacks đang đánh dấu những quả bom hẹn giờ ở đâu đó trong mã của bạn, bởi vì những cái phổ biến vốn đã dựa trên quá nhiều giả định ("chỉ cần làm điều đó" được ưu tiên để tách riêng). Ngay khi những giả định đó không còn tồn tại, toàn bộ hệ thống của bạn có thể bị hỏng mà bạn không biết chuyện gì đã xảy ra.


4

Thuật ngữ này không chính xác lắm nhưng có lẽ nó đề cập đến một giải pháp nhanh chóng và bẩn thỉu cho một vấn đề khó giải quyết đúng đắn. Giải pháp trong câu hỏi có thể hoạt động, nhưng có lẽ không phải là một triển khai tốt , có thể có các lỗi tinh vi, có thể một số lỗi nhỏ đã biếtnên được làm lại sau, nếu thời gian cho phép. Tôi nghĩ rằng những gì bạn đang nghe được gọi là "hack" đôi khi cũng được gọi là " bùn ".

Tôi thường thấy các vụ hack xảy ra khi có những hạn chế về thời gian rất chặt chẽ để hoàn thành một nhiệm vụ và một giải pháp hack được triển khai vì nó hoạt động "vừa đủ" để vượt qua QA, với hy vọng rằng nó có thể được sửa chữa sau này. Thật không may, việc sửa / dọn dẹp sau này không phải lúc nào cũng xảy ra :(


Tôi không chắc ý của bạn là "không chính xác" - Tôi nói rằng hầu hết các lập trình viên sẽ biết chính xác ý nghĩa của việc nói một số mã được viết là hack. Nhưng phần còn lại của câu trả lời là tại chỗ, nó hoạt động, nhưng vì một số lý do (kiến trúc, biểu diễn, v.v.) nó không phải là một giải pháp tối ưu.
ozz

@james: Theo kinh nghiệm của tôi, hai lập trình viên có thể xem một số mã và một người sẽ gọi đó là hack, người còn lại thì không. Không có cách nào thực sự để định lượng một đoạn mã là hack. Mọi người đều có ý tưởng riêng về việc hack là gì và thường thì chúng giống nhau nhưng không phải lúc nào cũng giống nhau. Được viết như một người đã có mã của mình được gọi là "hackish" bởi những người khác và không đồng ý. Và tôi đã gọi mã của người khác là "hackish" và họ không đồng ý. Đúng, đó có thể là các trường hợp ranh giới, nhưng đôi khi các ranh giới có thể bị mờ ...
FrustratedWithFormsDesigner

1
@FWFD - đó chỉ là không đồng ý về việc có thứ gì đó là hack hay không. Nếu ai đó "nói" một số mã là một hack, bạn sẽ biết ý nghĩa của chúng.
ozz

4

Tôi dành nhiều thời gian làm nhà phát triển front-end, vì vậy định nghĩa của tôi về hack là:

Một giải pháp dựa trên kiến ​​thức chuyên sâu về lỗ hổng môi trường và hành vi không có giấy tờ.

Môi trường có thể là khung của bạn, trình duyệt web, cơ sở dữ liệu, ATM (máy rút tiền), vụ án. Bất kỳ "hệ thống quy tắc" nào, nơi bạn biết một lỗ hổng và khai thác nó để giải quyết vấn đề.


4

Một hack thường là một số mã rõ ràng không cung cấp đầu ra mong muốn, nhưng theo cách tối ưu phụ.

Nó thường sử dụng một số tính năng ngôn ngữ / thư viện không có giấy tờ hoặc tối nghĩa theo một cách nào đó mà người sáng lập không lường trước được và do đó làm xáo trộn ý định đó là gì.

Đôi khi nó được thực hiện để khắc phục một số lỗi ngôn ngữ hoặc thư viện nhưng trong hầu hết các trường hợp, nguyên nhân chính thường là do sự thiếu hiểu biết;

Để một cái búa mọi thứ trông giống như một cái đinh.

Những điều được thực hiện theo vòng về cách thức không hiệu quả, thường là cả về không gian và thời gian, nhưng cuối cùng tạo ra đầu ra mong muốn, nhưng với chi phí, và các trường hợp cạnh không thể biết có thể không có khả năng kiểm tra và không thể bảo trì. Thường xuất phát từ sự thiếu hiểu biết cơ bản về logic hoặc thành ngữ ngôn ngữ. Cũng xem "cách khó".

Thông thường mã là thứ mà một người có kinh nghiệm thích hợp thậm chí sẽ không cân nhắc thực hiện hoặc sẽ phải suy nghĩ lâu dài và khó để làm cho nó phức tạp và không hiệu quả như vòng về hack mà họ đã phát hiện ra.

Ví dụ

Bản sửa lỗi Vista

Hiệu lực của Email

Đơn vị phần mềm

Hash không xác định


+1 Đối với tối ưu. Và bởi vì hack không cần thiết "tạm thời" là thứ được bình chọn nhiều nhất.
rlb.usa

2

Một chiếc lốp hói hoạt động nhưng không ai gọi đó là một giải pháp lý tưởng cho việc đâm thủng. Nó có thể tạo ra vấn đề tồi tệ hơn xuống dòng.

Thông thường tôi sẽ coi hack là một giải pháp nhanh chóng và bẩn thỉu cho một vấn đề tức thời. Nó thường có thể không phù hợp với thực hành lập trình thông thường trong một cửa hàng lập trình (ví dụ: sử dụng nhiều mã hóa cứng). Nó cũng có thể là một sửa chữa nhỏ.

Một lý do chính khiến nó tệ là vì a) nó có thể gây ra kết quả không thể đoán trước b) nó có thể không phù hợp với thiết kế ban đầu của mã được đề cập sẽ gây ra vấn đề bảo trì. Theo kinh nghiệm của tôi, các vụ hack thường được ghi chép lại rất kém.


2

Một định nghĩa ngắn mà tôi đã nghe và tôn trọng:

"Một giải pháp cho một triệu chứng không giải quyết được hoàn toàn vấn đề trong mọi trường hợp"

Mã xấu có thể hoặc không thể là một hack. Ví dụ 2 + 2 trong một câu trả lời khác không phải là hack, đó là một giải pháp mã xấu và xấu theo quan điểm hiểu mã, nhưng nó tạo ra giải pháp chính xác trong mọi trường hợp. Hãy nghĩ về một phương trình bao gồm trong toán học - hành vi / mối quan hệ là giống hệt nhau và chính xác trong cả hai phiên bản, nhưng hình thức là khác nhau. Hmm, yếu tố một phương trình, tái cấu trúc một phương trình, mã tái cấu trúc ... không, không có sự tương tự tôi chắc chắn :)

Ví dụ trong một trong những câu trả lời khác về việc thay đổi tên đầu tiên thành "Jim" là một hack: nó giải quyết được triệu chứng (tên trong danh sách là Jim), nhưng không giải quyết được hoàn toàn vấn đề (danh sách không được sắp xếp hoặc ưu tiên theo bất kỳ cách nào hoạt động cho tất cả các mục).


1

Một hack đang làm một cái gì đó trả về kết quả mong đợi, nhưng làm như vậy theo một cách kỳ lạ (thường phát sinh một cú đánh hiệu suất).

Ví dụ:

Nhiệm vụ : Để truyền một số nguyên biến thành một đôi

Giải pháp : Sử dụng Toán tử đúc. Tức là: dblVar = CType (intVar, Double)

Hack : Chia đôi. Tức là: dblVar = intvar / 1.0


+1 cho một ví dụ xuất sắc. Trong mã AS400 cũ, tôi sẽ thấy các ngày ở Châu Âu nhân với một số thập phân lập dị, tạo ra ngày ở Mỹ. Các vấn đề bắt đầu khi một số lập trình viên nhất định bắt đầu rò rỉ mã đó vào mã .Net của chúng tôi ... thật tuyệt!
Morgan Herlocker

0

Hãy tưởng tượng nếu chân của bạn bị nhiễm trùng và phải cắt bỏ để bạn sống sót. Bạn có muốn bác sĩ nhanh chóng hack nó bằng rìu, hoặc phẫu thuật loại bỏ nó sau khi kiểm tra vấn đề và chọn các công cụ, thủ tục thích hợp, v.v.? Áp dụng tương tự cho phần mềm.


Tôi sẽ cho anh ta hack nó trước khi kẻ tấn công có cơ hội hack vào não tôi.
Mateen Ulhaq

Nếu bạn chỉ có vài phút thì sao?
Người sử dụng Stuper

0

Một vụ hack báo hiệu nó ra đời khi lập trình viên chịu trách nhiệm tuyên bố "Tôi sẽ quay lại và sửa nó sau".

Một lưu ý nghiêm trọng - một vụ hack trong bối cảnh của OP là một cái gì đó đạt được kết quả mong muốn, nhưng sử dụng một phương pháp tạm thời hoặc không đáng tin cậy để làm như vậy.

Định nghĩa phổ biến khác là một kỹ thuật khai thác các hành vi trường hợp cạnh để tránh các hạn chế / biện pháp bảo vệ trong nền tảng.

Hack trong bối cảnh thứ hai có một bộ đệm nhất định trong số các lập trình viên anh hùng "maverick" (đọc: nguy hiểm) ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.