1 điểm bởi GN⁺ 2025-09-29 | 1 bình luận | Chia sẻ qua WhatsApp
  • Tác giả định sắp xếp các tệp ảnh theo thứ tự alphabet, nhưng kết quả sắp xếp của hệ điều hành và trình quản lý tệp lại khác nhau
  • Trong ls trên Linux, các tệp được sắp xếp đúng như mong đợi, nhưng hầu hết GUI file manager như Windows, Google Drive, KDE Dolphin lại áp dụng “natural sort” (sắp xếp tự nhiên), tức diễn giải tên tệp có chứa số theo giá trị số
  • Vì vậy, có thể xuất hiện kết quả khác với cách sắp xếp chuỗi truyền thống, chẳng hạn file-10.txt đứng trước file-9.txt
  • Nguyên nhân thực sự là do hai điện thoại dùng quy tắc đặt tên tệp khác nhau: một bên gắn mili giây ngay sau phần giây, bên còn lại tách bằng dấu gạch dưới, khiến tiêu chí sắp xếp thay đổi
  • Cuối cùng, cách giải quyết chỉ có thể là thống nhất quy tắc đặt tên tệp hoặc chỉnh các thiết lập ẩn của từng trình quản lý tệp; tác giả tiếc nuối về “thời đại mà máy tính ưu tiên phỏng đoán hơn là làm đúng theo chỉ thị của người dùng”

Bối cảnh và tình huống vấn đề

  • Tác giả đi leo núi cùng cha, mỗi người chụp ảnh bằng điện thoại Android của mình rồi lưu toàn bộ ảnh vào cùng một thư mục
  • Quy tắc tên tệp ảnh là IMG_YYYYMMDD_HHmmss hoặc có thêm số phía sau trước .jpg
  • Vì tên tệp đã được sắp theo thứ tự năm-tháng-ngày và thời gian, tác giả cho rằng chỉ cần sắp theo alphabet (thứ tự từ điển) là ảnh sẽ tự động xếp theo thời điểm chụp
  • Nhưng khi dùng Windows PC, Google Drive, KDE Dolphin..., các tệp theo cùng quy tắc lại không được xếp đúng thứ tự
    • Ví dụ: một bức ảnh chụp lúc 5:54 bằng điện thoại của cha lại xuất hiện trước ảnh 9:20, rồi còn nằm sau ảnh 12:11, cho thấy thứ tự bị sai
  • Gnome và các trình quản lý tệp khác trên điện thoại thông minh cũng cho ra kết quả tương tự
  • Trong khi đó, lệnh ls trên Linux vẫn giữ đúng thứ tự, càng làm mọi chuyện thêm khó hiểu

Phân tích nguyên nhân

  • Ban đầu, tác giả nghĩ rằng một trong hai điện thoại đã dùng ký tự lạ thay cho dấu gạch dưới (_), nhưng khi kiểm tra bằng lệnh ls trên Linux thì thứ tự vẫn hoàn toàn bình thường
  • Trên nhiều bản phân phối Linux khác nhau, cũng như trên máy chủ OpenBSD, ls đều sắp xếp đúng theo alphabet
  • Trái lại, nhiều GUI file manager như Windows, Google Drive, KDE Dolphin... lại so sánh phần số trong tên tệp theo đúng độ lớn số học
    • Tức là mặc định dùng natural sorting thay vì thứ tự alphabet thuần túy
  • Natural sort sẽ so sánh các chữ số trong chuỗi không phải như ký tự đơn lẻ, mà như giá trị số
    • Ví dụ: file-9.txt < file-10.txt → đúng theo kỳ vọng của con người
    • Nhưng trong cách sắp xếp truyền thống, vì 1 < 9 nên file-10.txt lại đứng trước
  • Tuy nhiên, các trình quản lý tệp hiện nay nếu thấy có “phần số” thì sẽ ép phần đó được hiểu là giá trị số thực tế để 9 luôn đứng trước 10
    • Điều này có thể khác với thứ tự mà người đặt tên tệp thực sự mong muốn

Nguyên nhân thực tế và cách giải quyết

  • Điện thoại của cha gắn luôn phần mili giây ngay sau phần giây, còn điện thoại của tác giả thì tách bằng dấu gạch dưới
    • Điện thoại của cha: gắn mili giây ngay sau phần giây → con số trở nên lớn hơn và bị đẩy về sau
    • Điện thoại của tác giả: tách bằng dấu gạch dưới → được xử lý như một chuỗi riêng
  • Cách xử lý là sắp xếp lại tên tệp của một trong hai bên theo cùng một mẫu thống nhất
  • Với KDE Dolphin, có thể chọn tùy chọn sắp xếp theo alphabet thuần túy trong phần cài đặt, nhưng thiết lập này bị ẩn nên khá phiền
  • Vì mỗi chương trình có tính năng khác nhau, có thể phải chỉnh riêng từng nơi

Kết luận của tác giả

  • Dù đã chỉ định “thứ tự alphabet”, tác giả vẫn phê phán việc phần mềm tự đoán ý người dùng rồi áp dụng một kiểu sắp xếp khác
  • Tác giả nhớ thời mà máy tính chỉ đơn giản làm đúng theo những gì được yêu cầu

1 bình luận

 
GN⁺ 2025-09-29
Ý kiến trên Hacker News
  • Tôi nghĩ cách sắp xếp mà Microsoft, Google và KDE áp dụng trực quan hơn và bao quát các trường hợp dùng phổ biến hơn, còn tình huống của tác giả là cực kỳ hiếm; phần lớn mọi người thường muốn “10” đứng sau “9” hơn nhiều, môi trường desktop cũng ghi là sắp xếp “theo tên” chứ không phải “theo bảng chữ cái” nên không gây hiểu nhầm; dù tôi không thích việc máy tính cố đoán ý người dùng, nhưng giống như tính năng tự động lưu, những thứ như vậy lại hữu ích trong đời sống thực; sẽ tốt nếu có thêm tùy chọn sắp xếp đúng theo thứ tự chữ cái, nhưng để mặc định thì việc chọn trường hợp phổ quát và trực quan hơn là hợp lý

    • Bản thân tôi cũng đủ hiểu rằng theo thứ tự chữ cái thì “10” đứng trước “9”, nhưng trong trình quản lý tệp tôi vẫn muốn “10” đứng sau “9”; tôi cũng không thích thêm số 0 ở trước các số một chữ số, và nếu sau này cần tới ba chữ số thì lại phải đổi tên một lần nữa, rất phiền; khi chia file audiobook theo từng chương, vì biết không phải trình phát nào cũng sắp xếp đúng, tôi dùng định dạng “Chapter 01.mp3” hoặc “Chapter 001.mp3”; tôi còn viết cả script tự động hóa, nhưng trông vẫn xấu và là việc thừa thãi; sẽ tốt hơn rất nhiều nếu mọi thiết bị đều nhận diện số đúng cách
    • Tôi không đồng ý; nếu chỉ có một cách duy nhất và phổ quát để biểu diễn số dưới dạng ký tự thì còn có thể chấp nhận được, nhưng trên thực tế có quá nhiều biến thể trong cách nhập số, nên tôi cho rằng chức năng “đoán ý định” chỉ hoạt động đúng trong một số trường hợp; dấu thập phân, dấu phân tách hàng nghìn, ký pháp khoa học... đều là những ngoại lệ phức tạp, và nếu xem kỹ các yêu cầu thì sẽ thấy rất khó triển khai theo cách đáng tin cậy
    • Tôi thấy lập luận cho rằng việc thêm sẵn số 0 là tự nhiên và quen thuộc với mọi người là không thực tế; ví dụ khi chuyển từ phiên bản 5.9.17 sang 5.10.0, không ai quay lại đổi toàn bộ tên thư mục cũ thành 5.09.17 cả; cách sắp xếp tiêu chuẩn ngày nay không hề mơ hồ mà rất trực quan, còn sắp xếp thuần ký tự nghiêm ngặt thì không phù hợp với giao diện người dùng
    • Vấn đề là kiểu thay đổi này khác với cách sắp xếp chữ cái “ngu ngốc” ngày xưa, nên khiến mọi người ngạc nhiên và bối rối; sẽ tốt hơn nếu cách “thông minh” mà đa số muốn và cách “đúng thứ tự chữ cái nghiêm ngặt” được tách thành hai tùy chọn riêng; chỉ cần cho phép chọn tùy chọn một cách đơn giản, rõ ràng thì ngay cả người không chuyên cũng không bị rối trải nghiệm
    • Có người nói trường hợp muốn “10” đứng trước “9” là phổ biến hơn, nhưng có lẽ họ định nói ngược lại; và xin lưu ý rằng tên chính thức của kiểu sắp xếp “theo tên” là “Natural sort order”
  • Chủ đề này làm tôi nhớ đến tranh luận “Worse is better”; kiểu sắp xếp đơn giản dựa trên ANSI/Unicode mà tác giả đòi hỏi thật ra lại là tính năng chỉ một số ít lập trình viên cần, còn trong thực tế 99% người dùng GUI muốn cách sắp xếp trực quan; việc xác định người dùng chính có ảnh hưởng rất lớn đến thiết kế sản phẩm; tính năng tốt hơn có thể phù hợp với sản phẩm, nhưng với hệ thống thì sự đơn giản đôi khi lại phù hợp hơn cho việc phát triển và tiến hóa

    • Mô hình tư duy trong đầu lập trình viên là xử lý một cách ngây thơ, thuần túy các tên có trộn số, trong khi người dùng phổ thông thì thấy việc 10 đứng sau 9 là tự nhiên; không thể ép lối suy nghĩ riêng của lập trình viên lên tất cả mọi người
    • Tôi tò mò những người cho rằng cần cách “tệ hơn” thì nghĩ sao về cách sắp xếp chữ hoa chữ thường; sẽ làm đúng kiểu ASCII/Unicode theo thứ tự codepoint, hay sẽ chuẩn hóa về một ký tự duy nhất để gộp chữ hoa và chữ thường lại với nhau
    • Dùng cái cớ “tệp người dùng mục tiêu” để không thêm tùy chọn là không thuyết phục; cung cấp cả hai cách không phải việc khó; phần mềm thật sự tốt là phần mềm chấp nhận các nhu cầu đa dạng, kể cả phải để trong chế độ nâng cao; giống như quy tắc 80/20, những tính năng chỉ một số ít người dùng vẫn có chỗ đứng; tôi thấy mệt mỏi với thực tế là nhiều chức năng hiển nhiên lại bị bỏ qua nhân danh một tầm nhìn người dùng hoàn hảo nào đó
  • Khi tìm các file được đặt tên bằng hash, sắp xếp tự động là thứ gây khó chịu nhất; trên Windows đây là một trong số ít tùy chọn tôi tắt ngay bằng Registry; tôi thường nhớ thời máy tính chỉ làm đúng thứ mình bảo; bây giờ có cảm giác nó không chỉ “đọc ý người dùng” mà còn “muốn thay đổi cả cách nghĩ của người dùng”, nên tôi rất dị ứng; kể cả trong mã nguồn mở, tôi cũng khó chịu với tư duy độc đoán kiểu “người dùng sai rồi” này

    • Vấn đề này không chỉ xảy ra với hash đơn thuần mà còn gây rối hơn với nhiều loại định danh có những con số vô nghĩa chen giữa; khi phải tìm file chứa các cụm số như user ID, Unix time..., việc các tên như abcd89764237 và abcd683426834 nằm ở vị trí rất kỳ quặc khiến tôi mất rất lâu mới hiểu ra lý do
  • Nếu ai cũng khẳng định mình hiểu nhu cầu của người dùng trung bình, vậy tại sao lại chẳng thấy ai đề xuất để máy tính tự động đổi luôn tên file theo ý nó? Nếu đã không bắt buộc sắp xếp theo ASCII thì cũng đâu cần bám chặt vào tên file có cả phần mở rộng; thực tế người dùng không quan tâm lắm jpg hay png, cũng chẳng để ý chữ hoa chữ thường; trên hệ Windows người ta dùng phần mở rộng nhiều chủ yếu vì tương thích cũ; thật khó hiểu khi cứ ép “tên file kiểu máy tính” nhưng lại cố tình phá vỡ “cách sắp xếp kiểu máy tính”; vì chẳng ai biết chắc người dùng muốn gì, nên đừng khẳng định như thể mình biết rõ

  • Tôi thấy trong đa số trường hợp cách sắp xếp dựa trên phiên bản như bài viết mô tả là tốt hơn; hiển thị theo thứ tự chữ cái còn khiến tôi thấy như là lỗi; theo tôi, vấn đề không nằm ở khái niệm sắp xếp mà nằm ở cách gắn nhãn

    • Thực ra nó không được mô tả là “theo bảng chữ cái”; tác giả đã hiểu nhầm “theo tên” thành “theo bảng chữ cái”
    • Cách hoạt động được mô tả là hữu ích, nhưng tốt nhất vẫn là báo trước cho người dùng hoặc cho họ chọn tùy chọn
    • Lệnh sort trên Linux hiện cũng hỗ trợ sắp xếp theo phiên bản (sort -V); tôi không rõ chi tiết cơ chế bên trong, nhưng nó hoạt động tốt trong hầu hết tình huống; quan trọng hơn cả là có thể bật/tắt rất dễ
    • Kiểu sắp xếp được nhắc trong bài là “lexical”, nhưng nhìn chung mọi người không phân biệt được giữa “lexical” và “alphabetic”
  • Điều người dùng yêu cầu không phải là sắp xếp file “theo bảng chữ cái” mà là sắp xếp “theo tên”, nên cách diễn giải có thể khác nhau tùy hệ điều hành; tôi nghĩ đa số hệ thống đã chọn cách diễn giải phù hợp hơn với phần lớn người dùng dựa trên logic và dữ liệu; có lẽ trong tương lai sẽ có thêm quy tắc như nếu nhóm số có số 0 ở đầu thì dùng thứ tự chữ cái gốc, hoặc sẽ có tùy chọn cho người dùng tự chọn

    • Nếu số có số 0 ở đầu thì coi là bát phân, và chỉ hoạt động khi các chữ số phía sau nằm trong khoảng 0~7, nghe có vẻ trực quan đấy
    • Nhưng sự thay đổi trong cách diễn giải này đã diễn ra từ 10~20 năm trước rồi; trước kia ở các trình quản lý file, “theo tên” gần như đồng nghĩa với “theo bảng chữ cái/thứ tự từ điển”
  • Trong macOS Foundation, NSString.localizedStandardCompare() được cung cấp chính thức để Finder dùng cho việc sắp xếp; Windows cũng có StrCompareLogical, tức là tiêu chí sắp xếp theo tên, hay nói cách khác là natural sort, đang được chuẩn hóa chính thức trên từng nền tảng

    • Tôi thấy thú vị vì cứ nghĩ nó sẽ khác với lệnh ls, và giờ tôi lại thấy cách này tốt hơn; trong ứng dụng ảnh thì thường sắp theo timestamp, còn nếu thực sự cần sắp file đúng theo tên thì tôi sẽ sắp theo ngày tạo hoặc tự chuẩn hóa lại tên file
  • Báo cáo Unicode nói rất rõ rằng cách sắp xếp thay đổi theo ngôn ngữ và ngữ cảnh; ví dụ nếu sắp xếp “A-10” theo bảng chữ cái mà không nhận diện số, thì “A-10” sẽ đứng trước “A-2”; tuy phức tạp, tôi vẫn nghĩ việc các trình duyệt file chọn natural sort vì lý do này là hợp lý

    • Nhưng nếu -10 nhỏ hơn -2 thì chẳng phải thứ tự sẽ không bị đảo lại sao?
  • Việc sắp xếp để “foo9” đứng trước “foo10” chính là “natural sort”; gần đây tôi mới biết cách làm natural sort bằng 2 dòng Python và rất hài lòng, xin giới thiệu đoạn mã Stack Overflow liên quan

    • Lệnh sort(1) cũng hỗ trợ natural sort (-V); nếu tạo các file ảnh rồi chạy ls | sort -V thì sẽ sắp xếp đúng; kết quả du -sh * cũng có thể sắp bằng tùy chọn sort -h
  • Tôi không hề nhớ nhung kiểu sắp xếp lộn xộn như “Image-1.jpg, Image-11.jpg, Image-2.jpg”; đúng là từng có lúc natural sort khiến tôi thấy lạ, nhưng khi Windows chuyển sang sắp theo giá trị số thì mọi thứ trở nên rất tiện; các file được sắp tự nhiên hơn và tôi khá hài lòng

    • Nhưng cũng có ý kiến cho rằng với một số người thì chính thứ tự đó mới là điều họ mong đợi, nên rốt cuộc còn tùy từng người