Tính tiền trong nhà hàng kiểu Googler

Hôm nọ tôi đi ăn sushi với một ông bạn đang làm việc ở hệ thống Android bên Google tôi quen từ khi còn trên ghế nhà trường. Đây là một người thông minh vui tính hiếm có trong thiên hạ, tiếc rằng không độc thân. Sau khi chén no nê xong chúng tôi có đề nghị chia tiền bữa ăn đều nhau cho mỗi người để thanh toán bằng thẻ tín dụng. Vì ông này đi với bạn gái nên ông tính hai phần, mỗi người còn lại tính một phần. Em gái phục vụ bàn sau khi nghe yêu cầu, em đứng ngẫm nghĩ một lúc rồi đề nghị  ai muốn trả bao nhiêu thì ghi ra giấy để em chạy số. 
Chúng tôi có một hoá đơn giá tiền X, tống cộng có Y người, vậy mỗi phần là X/Y đô la. Ông bạn ghi lại phần tiền cho những người độc thân rõ đến từng cent. Sau rồi đến lượt ông tính phần cho mình. Ông viết công thức dài loằng ngoằng ra ứng dụng máy tính tay. Tôi, bạn gái ông, và tất cả những người cùng bàn hoảng quá bảo "Ê M., sao không nhân đôi phần ông đã tính có phải nhanh không?" Ông thủng thẳng đáp: "Thế sẽ sai." 
Tôi chợt nhận ra ông bạn mình đang làm gì:
Để tiện minh họa, ví dụ bạn có sáu người. Bốn người trả một phần, một người được bao, người còn lại trả hai phần. Hoá đơn, cho ví dụ, là 20 đô, như vậy một phần là 20/6 = 3 đô và 33 cents. Nếu như người còn lại trả gấp đôi, 6 đô 66 cents, thì nhà hàng sẽ nhận được 3.33*4+6.66=19.98 đô, chứ không phải là 20 đô. Lưu ý là ngay cả khi bạn không làm tròn mà tính 3.[3..]*2=6.[6..]. để làm tròn lên thành 6.67 đô thì bạn vẫn lệch 1 cent.  Để tính ra được người cuối cùng phải trả, thì cách làm đúng là nhân rồi trừ số tiền mọi người đã trả trên tổng hoá đơn.
Ông bạn giải thích thêm, việc chia rồi làm tròn không có thuộc tính hoán đổi các đối tượng trong tập hợp (tiếng Anh là monoid). Việc này rất quan trọng trong việc tính toán dùng dấu chấm động. Nếu bạn có một phép tính, chẳng hạn như 2^60 + 1/2^60 + 1/2^60 + 1/2^60 + 1/2^60 +... thì thứ tự bạn làm ra sao rất quan trọng. Khi bạn làm theo cách cộng từ trái sang phải, thì bạn sẽ ra kết quả khác với việc làm từ phải sang trái, vì số lớn sẽ "nuốt" số bé và làm tổng bớt chính xác đi theo thời gian khi bạn cộng lại. Khi bạn làm từ phải sang trái, bạn sẽ được kết quả chính xác hơn. Nếu bạn muốn làm xử lý song song với MapReduce, việc kết hợp hai số nào để tính trên từng nhánh rồi "gộp lại" như thế nào là một việc rất quan trọng.
Sau đó đi ra ngoài tôi có nghĩ không phải tự nhiên mà người này đang làm việc cho Google. Khi mình suy nghĩ được một phần thì họ đã suy nghĩ được hai ba phần, và để ý đến từng ngóc ngách nhỏ của vấn đề, xem cách làm của mình có thể sai ở chỗ nào. Việc này không chỉ đòi hỏi kiến thức lý thuyết, mà còn đòi hỏi kinh nghiệm và những va chạm thực tế. Người cầu toàn chính xác như thế, bất kể bằng cấp nào đều chắc chắn sẽ làm được nhiều việc đòi hỏi chất lượng cao. Còn khi một người không chịu nghĩ, bắt người khác nghĩ hộ, hoặc cái gì cũng xuề xoà sai tí không sao, thì sẽ phải làm công việc nặng nhọc về chân tay hơn, ví dụ lái taxi như tôi hoặc chạy bàn như em gái bồi bàn.
78
2087 lượt xem
78
4
4 bình luận