Hotline

Nó không phải là bug, nó là một tính năng!

Đâu là những ví dụ tốt nhất về việc khi bug (lỗi) trở thành tính năng (hay còn được gọi là misbug)?

Bug thể hiện sự thiếu sót trong một phần mềm, mặc dù trong một số trường hợp, người dùng lại thích sử dụng những thứ có vẻ khiếm khuyết mà developer lúc đầu không hề nghĩ đến đó. Một số bug biến thân, từ một thứ thiếu sót, khiếm khuyết thành một một tính năng chính thức và được hỗ trợ đầy đủ. Đâu là những ví dụ tốt nhất về việc đó trong lịch sử phần mềm?

1. Câu trả lời của Jeff Darcy

Bởi Tracy Chou, kĩ sư phần mềm của Pinterest và Priya Ananthasankar, Full stack developer Theo như Rob Pike, mẫu hành vi UNIX của việc ẩn những file có tên bắt đầu bằng dấu chấm thật ra là một sai lầm. Một bài học ngắn gọn. Từ lâu về trước, khi mà thiết kế của hệ thống file Unix vẫn đang được  nghiên cứu, những đề mục (entries) . và .. xuất hiện, để làm việc điều hướng trở nên dễ dàng hơn. Tôi không chắc nhưng tôi tin là .. bắt đầu xuất hiện trong lúc viết lại Version 2, khi hệ thống file trở nên phân cấp dần (thời ban đầu nó có một cấu trúc rất khác).  Khi một người gõ ls, những file này lại xuất hiện, khi đó hoặc Ken hoặc Dennis đã thêm một bài kiểm tra đơn giản vào phần mềm. Lúc đó thì nó được viết bằng Assembler, nhưng đoạn code đang được nhắc tới lúc này thì nó tương đương với một thứ như thế này: if (name[0] == '.') continue; Câu lệnh này đã bị rút ngắn, đáng lẽ nó phải là: if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue; Nhưng thôi, cái đầu ngắn hơn. Hai điều đã xảy ra. Đầu tiên, một sự kiện tồi đã được định ra. Rất nhiều những lập trình viên lười biếng đã tạo ra bug bằng cách làm cùng một câu lệnh rút gọn đó. Những file thực sự bắt đầu với dấu chấm thường bị bỏ qua khi mà đáng lẽ chúng nên được chú ý đến. Thứ hai, và tồi tệ hơn, ý tưởng về một file “ẩn” và file “dot” đã được tạo ra. Như một hậu quả, nhiều lập trình viên biếng nhác bắt đẩu rải rác các files vào thư mục home (Home Directory) của mọi người. Tôi không có nhiều mấy thứ đó cài đặt trong máy mà tôi sử dụng để đánh máy dòng này lắm, nhưng thư mục home (Home Directory) của tôi có tầm khoảng gần một trăm file dot và tôi thậm chí còn không biết phần lớn chúng là gì hoặc chúng có cần thiết không. Tất cả các ước lượng tên file mà đi qua thư mục home của tôi đều bị chậm lại bởi cái mớ bèo nhèo này. Tôi khá chắc là khái niệm file ẩn là một kết quả không được dự tính trước. Nó dĩ nhiên là một sai lầm. Đã có bao nhiêu lỗi và chu trình CPU bị lãng phí và gây ra bao nhiêu nỗi thất vọng của con người (chưa nhắc đến việc thiết kế tồi) đã là kết quả của một cái câu lệnh rút gọn từ 40 năm trước hả? Hãy nhớ lấy điều đó lần sau bạn muốn rút gọn code. (Đối với những người phản đối là file dot có phục vụ cho một số mục đích, tôi sẽ không tranh luận mà phản bác rằng dạng file thì nó có phục vụ mục đích chứ không không phải cách đặt tên của nó. Chúng có thể dễ dàng được viết là $HOME/cfg hoặc $HOME/lib, đó là thứ mà chúng tôi làm trong Kế hoạch 9 - không có file dot. Những bài học có thể được rút ra.) https://plus.google.com/10196072…

2. Câu trả lời của Clarence Leung, Kĩ sư YUI/Mojitot tại Yahoo!

quote-it-s-not-a-bug-it-s-an-undocumented-feature-anonymous-299189 Tôi không biết nếu bạn có thể thực sự gọi nó là một bug, nhưng JSONP là một trình duyệt khai thác có hiệu quả được phát triển thành một kỹ thuật được tiêu chuẩn hóa. Các chính sách cùng một nguồn gốc (same-origin policy) cho các ngôn ngữ lập trình duyệt của phía khách hàng đã được thực hiện tất cả các cách từ thời LiveScript trong Netscape Navigator 2 , và vì một lý do tốt đẹp là bạn không muốn mọi người chạy các trang web khác thực hiện bất cứ JavaScript tùy ý họ muốn trên website của bạn. Khi Internet trở nên rộng lơn hơn, và việc chia sẻ thông tin tài liệu giữa các website trở nên ngày càng quan trọng, điều này trở thành một trở ngại hơn là tiêu chuẩn bảo vệ.  Developer bắt đầu thiết kế các phương pháp vượt qua trở ngại này, và JSONP đã bắt đầu nở rộ lên. Thẻ <script> trong HTML không cần phải tôn trọng chính sách cùng một nguồn gốc (same-origin policy), và developers cho đó là một cách để vượt qua vấn đề và sử dụng phương pháp DOM để thêm các node <script> với dữ liệu từ xa vào trang.  Tuy nhiên, bạn không thể tự dưng thêm bất cứ thứ gì ở giữa những thẻ script đó, ví dụ đơn giản là chỉ cần đặt một object JavaScript bình thường như thế này:

  1. {
  2.   "id": "123",
  3.   "name": "Clarence"
  4. }

Sẽ dẫn tới kết quả một syntax error hoặc không được gán cho bất kì biến nào, tùy thuộc vào trình duyệt.  Thay vào đó, giải pháp sẽ là như thế này:

  1. parseUserData({
  2.   "id": "123",
  3.   "name": "Clarence"
  4. });

Bằng cách bao bọc dữ liệu trong một function đã tồn tại trên trang, bộ diễn dịch JavaScript cơ bản là gọi function đó với dữ liệu từ xa ngay khi thẻ <script> chứa nó đã được vào DOM. Điều này đã tử mở chính nó tới một một loạt các lỗ hổng cross-site scripting (XSS), nhưng về lý thuyết thì nó sẽ hoạt động chỉ khi người điều khiển server trả lại dữ liệu và người điều khiển website với script từ phía client tin tưởng lẫn nhau, và mọi người đều cảm thấy thỏa mãn với kết quả. Vào 2005, JSONP trở thành một phương thức tiêu chuẩn, và ngày này, hầu hết mọi website lớn (Facebook, Twitter, vv.) đều cung cấp một data service hỗ trợ nó. Hiện không có một phương thức mới hơn nào mà không cần tới mánh này, giống như CORS, nhưng JSONP vẫn đang là cách tốt nhất sử dụng cho những trình duyệt cũ không hỗ trợ nó. Tuy vậy, web developers mà sử dụng JSONP đang đặt lòng tin cao vào những nhà cung cấp tài nguyên này để không thực thi lệnh JavaScript tùy ý trên trang web của họ, nhưng đó là một vấn đề của lòng tin thôi. JSONP là một thủ thuật nhanh gọn, nhưng ít ra nó là một thủ thuật nhanh gọn có hiệu quả.

3. Câu trả lời của Harvey Green, Software Developer

Đây là từ một giai thoại của Ken Demarest, một trong những nhà phát triển ban đầu của Wing Commander I trên máy tính ... ... Chúng tôi đã nhận được một ngoại lệ từ bộ quản lý bộ nhớ  EMM386 của chúng tôi khi chúng tôi muốn thoát ra khỏi trò chơi. Chúng tôi muốn xóa màn hình và rồi thường thì sau đó có một dòng chữ được in ra, nhìn giống như  là "lỗi quản lý bộ nhớ EMM386. Blah blah blah." Chúng tôi phải chuyển hàng càng sớm càng tốt. Vì vậy, tôi đã sửa các lỗi trong quản lý bộ nhớ riêng để chúng in ra màn hình là "Cảm ơn bạn đã chơi Wing Commander!"

4. Câu trả lời của Christopher Reiss, Người sáng lập pagequake.com.

MySpace chưa bao giờ có ý định để cho phép người dùng "bling ra" các trang của họ với nhiều màu sắc, phông chữ, thẻ nhấp nháy, thậm chí hay cả các plug-ins. Một lỗi đã cho phép người dùng thêm bất kỳ thẻ HTML. Mọi người thấy yêu thích nó và bắt đầu phát rồ vì nó. Sự tự do này đã giúp thúc đẩy sự thành công ban đầu của MySpace. Nó nhanh chóng vượt ra khỏi tầm kiểm soát, và sự trải nghiệm đó trở thành một cảm quan của nhiều màu sắc, bố cục, âm thanh và popup. Rồi Facebook ra đời: trầm lặng, đơn giản, và nhất quán. Và rồi mọi người đều chuyển sang facebook.

5. Câu trả lời của Noah Bloom, mobile startups and bike racing

Ước tính có khoảng 8 nghìn tỷ tin nhắn văn bản được gửi vào năm 2011. Thậm chí là nghìn tỷ. mạng GSM được thiết kế để tối ưu hóa cho các cuộc gọi thoại. Để thiết lập và ngắt các cuộc gọi là một mạng lưới tín hiệu hỗn hợp. Vào đầu những năm 1980, các nhà nghiên cứu bắt đầu gửi tin nhắn văn bản ngắn trên mạng, trong thời gian không sử dụng trên các mạng truyền tín hiệu để không có thêm chi phí. Nguyên bản là có những 128 byte, sau đó được cải thiện đến 140 byte (160 ký tự bảy-bit). Tin nhắn văn bản vẫn bị tính phí 25 cent một tin nhắn, về cơ bản với chi phí gần 1.900 $ cho mỗi megabyte (2 triệu $ / GB). Ngày nay, rất nhiều tin nhắn được chuyên chở như dữ liệu qua mạng dữ liệu, cho dù bạn nhận thưc được nó (sử dụng iMessage, WhatsApp, vv) hay không (tàu sân bay thực hiện SMS trên dữ liệu) Điều này là không hẳn là một lỗi, nhưng việc sử dụng hoàn toàn ngoài ý muốn của mạng lưới tín hiệu đã biến thành một hiện tượng lớn, một con gà đẻ trứng vàng cho các nhà khai thác di động, và có lẽ là nỗi ám ảnh của thế giới hiện đại với những thông điệp phù du và nhiều lỗi chính tả.

Người dịch: Phương Thảo.

Nguồn: quora.com.