1 điểm bởi GN⁺ 2025-03-17 | 1 bình luận | Chia sẻ qua WhatsApp
  • Điểm khởi đầu là trải nghiệm tạo trình đọc truyện tranh cá nhân Fiew vào mùa hè năm 2006, từ đó tác giả hiện thực hóa Fedit, một trình chỉnh sửa ảnh tương tự Photoshop, bằng C++ và Windows API như một dự án luận văn tốt nghiệp
  • Fedit hoạt động dưới dạng một tệp thực thi duy nhất, không cần trình cài đặt, tệp nén, khóa registry hay runtime bổ sung, nên có thể chạy ngay trên PC bị giới hạn quyền hoặc từ USB
  • Giao diện được thiết kế để mô phỏng quy trình làm việc của Photoshop cổ điển, bao gồm các cửa sổ công cụ nổi, bộ chọn màu, quản lý layer, lịch sử hoàn tác, bộ lọc ảnh và bộ lọc dịch chuyển pixel tùy biến
  • Khó khăn lớn nhất là tái hiện giao diện người dùng; việc triển khai cơ chế snap/unsnap của bảng thiết lập công cụ cùng bộ chọn màu và bộ chọn công cụ đã tốn rất nhiều thời gian
  • Dự án dẫn đến việc hoàn thành thành công luận văn và nhận bằng cử nhân kỹ thuật, đồng thời gây ấn tượng với CTO của GoldenLine, từ đó mở ra một công việc C++ xây dựng ứng dụng WinAPI để tải lên hàng loạt hình ảnh

Từ trình đọc truyện tranh Fiew đến trình chỉnh sửa ảnh Fedit

  • Vào đầu mùa hè năm 2006, điểm khởi đầu là sự không hài lòng với các ứng dụng đọc ảnh hiện có
    • Đặc biệt, việc không thể điều khiển việc đọc chỉ bằng chuột khiến tác giả phải liên tục với tay tới bàn phím, rất bất tiện
  • Khi đó tác giả vừa hoàn thành khóa học C++/Windows API ở trường đại học và đã tự phát triển một trình đọc truyện tranh lý tưởng trong kỳ nghỉ hè
  • Trình đọc truyện tranh này có tên là Fiew
  • Đầu mùa thu năm 2006, tác giả phải chọn đề tài luận văn tốt nghiệp, và vì việc phát triển trình xem ảnh diễn ra thuận lợi nên đã cho rằng mình cũng có thể làm một trình chỉnh sửa ảnh
  • Vì khi đó đang sử dụng Adobe Photoshop rất nhiều, mục tiêu trở thành một trình chỉnh sửa tương tự Photoshop

Cách triển khai Fedit và các ràng buộc khi phân phối

  • Fedit là một Advanced Image Editor được viết bằng C++, sử dụng Windows API và thư viện đồ họa GDI+
  • Để có hình thức phân phối thuận tiện cho người dùng, tác giả tuân theo năm quy tắc
    • Không có trình cài đặt
    • Không có tệp nén
    • Không có khóa registry
    • Không có runtime bổ sung
    • Một tệp thực thi duy nhất
  • Kết quả là một chương trình có thể chạy ngay không cần cài đặt, hoạt động được trên các hệ thống có quyền hạn chế hoặc từ USB, đồng thời dùng ít tài nguyên

Giao diện và tính năng gần với Photoshop

  • Giao diện được xây dựng cẩn thận để trông giống Photoshop cổ điển và bao gồm các tính năng thường dùng
  • Các tính năng chính như sau
    • Cửa sổ công cụ nổi tự do
    • Bộ chọn màu
    • Quản lý layer dễ dàng
    • Lịch sử cho phép hoàn tác theo từng bước
    • Nhiều bộ lọc ảnh
    • Giao diện ma trận cho phép tự mã hóa bộ lọc dịch chuyển pixel
  • Ứng dụng cũng bao gồm trình xem thư viện ảnh quy mô lớn được mang sang từ dự án trước là Fiew
    • Có thể cuộn qua một lượng lớn ảnh một cách nhanh chóng và dễ dàng

Quá trình phát triển phải tự mình gỡ lỗi

  • Dù đã tham khảo rất nhiều MSDN và Experts Exchange, các vấn đề quá cụ thể nên phần lớn vẫn phải tự phân tích và gỡ lỗi
  • Vì phải kịp hạn chót nộp luận văn cử nhân, trong hai tháng cuối tác giả đã làm việc 14 tiếng mỗi ngày
  • Phần khó nhất là giao diện người dùng
    • Tác giả muốn quy trình làm việc giống Photoshop nhất có thể
    • Đặc biệt khó là hành vi snap và unsnap tự do của bảng thiết lập công cụ
    • Việc tái hiện bộ chọn màu và bộ chọn công cụ cũng không hề dễ
  • Đến gần cuối dự án, tác giả đã khá kiệt sức và thậm chí nảy sinh ác cảm với WinAPI

Kết quả sau luận văn và tài liệu công khai

  • Luận văn thành công và tác giả nhận bằng Bachelor of Science in Engineering tại Warsaw University of Technology
  • Fedit nhận được một số bài đánh giá tích cực trên mạng, nhưng tác giả không quảng bá tích cực
  • Sau đó, Fiew và Fedit đã gây ấn tượng với CTO của GoldenLine, dẫn đến công việc C++ xây dựng một ứng dụng WinAPI hiệu quả cao để tải lên hàng loạt hình ảnh cho một bản sao Flickr
  • Tài liệu công khai

1 bình luận

 
GN⁺ 2025-03-17
Ý kiến trên Hacker News
  • Đọc câu “năm quy tắc có lợi cho người dùng: không trình cài đặt, không tệp nén, không khóa registry, không runtime bổ sung, một tệp thực thi duy nhất” khiến tôi cảm thấy ấm áp và hạnh phúc
    Tôi hiểu vì sao registry tồn tại, và vì sao hệ sinh thái phần mềm Windows ngày nay vận hành như vậy, nhưng tôi thật sự nhớ thời hầu hết phần mềm desktop từng đơn giản như trước đây
    Dạo này nếu có thể tôi dùng bản cài đặt portable, và ước gì cách này phổ biến hơn. Thời gian, sự bất tiện và cảm giác không chắc liệu có thể khôi phục hoàn toàn cấu hình hay không khiến tôi chủ động né việc cài lại Windows

    • Trình cài đặt cũng làm nhiều việc hữu ích, và khá nhiều người dùng cuối thực sự muốn có chúng. Ví dụ như thêm shortcut vào Start Menu để có thể tìm thấy hoặc tìm kiếm, liên kết định dạng tệp, đăng ký vào danh sách chương trình của Windows, v.v.
      Trước đây tôi rất thích phần mềm portable, nhưng dạo này nếu có cả hai lựa chọn thì tôi lại thích trình cài đặt hơn. Nếu không, muốn tìm kiếm được thì phải tự thêm vào Start Menu
      Tuy nhiên tôi ghét khóa registry. Vì chúng thường biến mất khi cài lại hệ điều hành. Tôi chỉ muốn cấu hình được lưu trong %appdata%
    • Vì vậy tôi thích Go. Một tệp thực thi duy nhất khiến người khác dễ dùng công cụ hơn
      Một phương án khác là dùng NSIS để đóng gói thành một tệp thực thi duy nhất rồi giải nén toàn bộ vào thư mục tạm trước khi chạy
      Tôi xem Windows Registry gần như là một mớ hỗn độn thiếu nhất quán và được thiết kế tệ. Để so sánh, registry của Gnome được thiết kế tốt. Những thứ như mô tả khóa, các lựa chọn giá trị có giới hạn, hiển thị giá trị mặc định là thiết kế giao diện người dùng tốt
      Chỉ cần nhìn vào Group Policy của Windows và cách ánh xạ với registry cũng thấy cùng một cấu trúc logic nhưng mỗi chỗ một kiểu, lại còn có cả phủ định kép trong khóa
    • Mục đích ban đầu của registry là để COM nhìn GUID rồi tìm vị trí tệp DLL. Khi đó COM có thể tạo instance của đối tượng
      Hiện vẫn có thể thấy dấu vết đó trong HKEY_CLASSES_ROOT
      Về mặt kỹ thuật, vẫn có thể tạo đối tượng mà không cần registry. Chỉ cần nạp DLL, rồi gọi hàm được export để tạo đối tượng Factory, sau đó dùng Factory đó để tạo instance. Bản thân COM cũng làm việc theo cách đó
    • Thiết kế đơn giản và nhẹ nhàng như vậy cũng chạm đến tôi
      Bài viết cũng là một hồi tưởng thật tuyệt. Tuy nhiên tôi ước tác giả đi sâu hơn vào những khó khăn đã được gợi ý nhẹ ở phần đầu. Dù vậy đó chỉ là bắt bẻ nhỏ, bài viết rất hay và công việc thực tế trông khá ấn tượng
    • Tôi không rõ con đường tốt nhất để tạo ứng dụng một binary duy nhất mà không biên dịch tĩnh các thư viện vào trong là gì. Vì vấn đề giấy phép, việc này thường trở nên khó gánh
  • Photoshop có rất nhiều tính năng, nên chỉ vài bộ lọc ảnh thì khó gọi là tái hiện

    • Nhưng làm đúng giao diện người dùng là việc cực kỳ khó và cực kỳ quan trọng
      GIMP năm 2006 cũng có cực nhiều tính năng, nhưng so với giao diện của Photoshop thì thật sự kinh khủng
    • Dù vậy, với một đồ án bậc đại học thì vẫn rất, rất ấn tượng
    • Tôi không nghĩ ở đây nên hiểu “tái hiện” theo nghĩa đen
    • Đúng vậy. Tôi xem Photopea là nỗ lực sao chép gần nhất, nhưng nó cũng thiếu nhiều tính năng
    • Nếu nói “tôi đã làm một trình chỉnh sửa ảnh cơ bản” thì tất nhiên nghe sẽ không ấn tượng đến vậy. Nhìn cách bài viết bắt đầu như thế này thì cũng không ngạc nhiên

      As I’m getting older I look back on all the things I’ve done as a creative developer, and I see so many cool projects!
      Khiêm tốn ghê…

  • Cũng nên có liên kết đi thẳng tới dự án tuyệt vời này
    https://github.com/f055/fedit-image-editor

  • Đoạn “Tôi không quảng bá nó. Vài tháng sau tôi kiếm được một công việc C++. Rốt cuộc, mọi nỗ lực đó đã được đền đáp” khá thú vị
    Theo bản năng, chúng ta biết rằng việc đã bỏ công vất vả nên được đền đáp, nhưng thật đáng tiếc là các nhà phát triển mã nguồn mở, đặc biệt là những người đổ nhiều công sức vào mã được dùng rộng rãi trong production, lại quá thường xuyên gần như không nhận được phần thưởng thực tế nào
    Vì vậy có lẽ họ tìm kiếm phần thưởng về danh tiếng, hoặc NPM thêm tính năng kiểu “bạn có muốn quyên góp cho tác giả thư viện này không”, và GitHub tạo tích hợp Patreon
    Chúng ta cần một mô hình tốt hơn hiện nay, không lợi dụng những nhà sáng tạo trẻ ngây thơ nhưng chăm chỉ

  • Đầu những năm 2000 có một dự án tên pixel32, về sau là Pixel Studio Pro. Nó trông thật sự khá ổn và được bán dưới dạng early access
    Nhưng cuối cùng nó trở thành vaporware, những người đã trả tiền rất tức giận, và người tạo ra nó nhanh chóng chuyển từ anh hùng thành kẻ phản diện
    https://discuss.haiku-os.org/t/pixel-studio-pro-in-past-call...

  • Tác giả nói đã tốt nghiệp Warsaw University of Technology, nơi này ở đây luôn được xem là một trong những trường khá tốt
    Ngoài chuyện đó, cũng đáng chú ý là luận văn thời đó khác hiện nay đến mức nào. Gần đây tôi viết luận văn ở một trường đại học kỹ thuật tại một thành phố lớn khác, và 90% luận văn kỹ sư của chúng tôi có chất lượng khá thấp, bao gồm cả của tôi

    • Tôi không chắc ngày nay khác nhiều. Theo tôi biết, mục tiêu không phải là phát triển lĩnh vực, mà là chứng minh với những người cấp bằng cử nhân hoặc thạc sĩ rằng bạn có thể tạo ra một sản phẩm đầu ra dưới dạng luận văn
      Có thể có những luận văn nổi bật, nhưng phần lớn có lẽ khá nhàm chán
  • Vì vậy tôi thích Windows. Có cực kỳ nhiều phần mềm nhỏ, mã nguồn mở, đáp ứng rất tốt các ngách cụ thể
    Trước đây tôi thường lang thang tìm kiếm ở sourceforge.net và freshmeat, hình như tên là vậy

  • Một người bạn làm ở Phonegap, sau khi bị Adobe mua lại khoảng 10 năm trước, đã nhanh chóng port Photoshop sang JavaScript cho vui

    • Tôi không định phàn nàn về downvote, nhưng khá lạ khi câu chuyện này có vẻ là thứ Hacker News sẽ ghét
      Tôi đã nghĩ câu chuyện về một dự án hack nội bộ của kỹ sư phần mềm sẽ thú vị, nhưng thôi biết sao được
  • Có những thứ người ta làm ra rồi không nói cho thế giới biết. May mà nó đã được đưa lên GitHub, và thật sự ấn tượng