Bước tới nội dung

Fork (phát triển phần mềm)

Bách khoa toàn thư mở Wikipedia
Biểu đồ dòng thời gian cho thấy sự phát triển của các bản phân phối Linux, với mỗi nhánh rẽ trong sơ đồ được gọi là "một fork".

Trong phát triển phần mềm, fork (tiếng Việt: phân nhánh) là mã nguồn được tạo ra bằng cách sao chép một mã nguồn hiện có và thường được chỉnh sửa độc lập so với bản gốc. Phần mềm được xây dựng từ một bản fork ban đầu sẽ có hành vi giống hệt như phần mềm gốc, nhưng khi mã nguồn được chỉnh sửa nhiều hơn theo thời gian, phần mềm kết quả có xu hướng hoạt động khác biệt dần so với bản gốc.[cần ví dụ] Fork là một hình thức phân nhánh, nhưng thường liên quan đến việc lưu trữ các tệp fork ở nơi tách biệt với bản gốc, không nằm trong cùng kho lưu trữ. Các lý do phổ biến để fork một mã nguồn bao gồm: sở thích cá nhân, việc phát triển phần mềm gốc bị đình trệ hoặc ngừng lại, hoặc có sự chia rẽ trong cộng đồng phát triển.[1] Việc fork phần mềm sở hữu độc quyền (chẳng hạn như Unix) bị luật bản quyền nghiêm cấm nếu không có sự cho phép rõ ràng, trong khi phần mềm tự domã nguồn mở, theo định nghĩa, có thể được fork mà không cần xin phép.

Thuật ngữ

[sửa | sửa mã nguồn]

Từ tận thế kỷ 14, fork đã được sử dụng với nghĩa "phân nhánh, tách ra theo các hướng khác nhau".[2]

Trong bối cảnh phát triển phần mềm, từ fork được Eric Allman sử dụng với nghĩa tạo ra một nhánh trong hệ thống quản lý phiên bản từ sớm nhất là năm 1980:[3]

Tạo một nhánh sẽ "tách ra khỏi" một phiên bản của chương trình.

Thuật ngữ fork đã được sử dụng trên Usenet vào năm 1983 để chỉ quá trình tạo ra một nhóm con nhằm chuyển các chủ đề thảo luận sang đó.[4]

Mặc dù từ fork chưa được biết là đã được sử dụng với nghĩa "chia rẽ cộng đồng" trong giai đoạn khởi đầu của Lucid Emacs (nay là XEmacs, năm 1991) hay các bản phân phối phần mềm Berkeley (BSD, 1993–1994), Russ Nelson đã dùng thuật ngữ "shattering" (vỡ vụn) với ý nghĩa này vào năm 1993 (và cho rằng John Gilmore là người đã dùng trước đó).[5] Đến năm 1995, từ fork đã được sử dụng để mô tả sự chia tách của XEmacs,[6] và cách dùng này đã trở nên quen thuộc trong Dự án GNU vào năm 1996.[7]

Từ fork cũng được sử dụng theo cách tương tự trong lệnh gọi hệ thống fork(), vốn khiến một tiến trình đang chạy tách làm hai – thường là để cho phép chúng thực hiện các tác vụ khác nhau song song.[8]

"Fork" phần mềm tự do và phần mềm mã nguồn mở

[sửa | sửa mã nguồn]

Phần mềm tự domã nguồn mở có thể được fork hợp pháp mà không cần sự cho phép trước từ những người đang phát triển, quản lý hoặc phân phối phần mềm, theo cả Định nghĩa Phần mềm Tự doĐịnh nghĩa nguồn mở:[9]

Quyền tự do phân phối các bản sửa đổi của bạn cho người khác (tự do số 3). Bằng cách làm điều này, bạn có thể mang lại lợi ích từ những thay đổi của mình cho toàn thể cộng đồng. Việc truy cập mã nguồn là điều kiện tiên quyết cho quyền này.

— Định nghĩa Phần mềm Tự do[10]

Tác phẩm phái sinh: Giấy phép phải cho phép chỉnh sửa và tạo ra các tác phẩm phái sinh, và phải cho phép phân phối chúng theo cùng điều kiện với giấy phép của phần mềm gốc.

Trong lĩnh vực phần mềm tự do, các bản fork thường xuất phát từ sự chia rẽ do bất đồng về mục tiêu hoặc mâu thuẫn cá nhân. Trong một bản fork, cả hai bên thường bắt đầu từ cùng một mã nguồn gần như giống hệt nhau, nhưng thông thường chỉ nhóm lớn hơn, hoặc bên nào kiểm soát trang web chính thức của phần mềm đó mới giữ được tên gốc đầy đủ và cộng đồng người dùng đi kèm. Do đó, việc fork thường đi kèm với một "hình phạt danh tiếng".[9] Mối quan hệ giữa các nhóm phát triển sau khi fork có thể thân thiện hoặc rất căng thẳng. Ngược lại, một friendly fork (fork thân thiện) hoặc soft fork (fork mềm) là một bản tách không nhằm mục đích cạnh tranh, mà hy vọng sẽ hợp nhất trở lại với dự án gốc trong tương lai.

Trong bài tiểu luận Homesteading the Noosphere,[12] Eric S. Raymond đã viết rằng: "Đặc điểm quan trọng nhất của một bản fork là nó tạo ra các dự án cạnh tranh không thể trao đổi mã nguồn với nhau sau này, từ đó chia tách cộng đồng lập trình viên tiềm năng". Ông cũng lưu ý trong Jargon File (Từ điển tiếng lóng lập trình):[13]

Forking bị xem là một điều tệ — không chỉ vì nó ngụ ý sẽ có nhiều công sức bị lãng phí về sau, mà còn bởi vì các bản fork thường đi kèm với rất nhiều xung đột và cay đắng giữa các nhóm kế nhiệm, xoay quanh các vấn đề như tính chính danh, quyền kế thừa và định hướng thiết kế. Có một áp lực xã hội nghiêm trọng chống lại việc fork. Vì vậy, những bản fork lớn (như sự chia tách giữa Gnu-Emacs và XEmacs, sự phân rã của nhóm 386BSD thành ba dự án con, hay sự chia tách ngắn ngủi giữa GCC và EGCS) hiếm đến mức từng bản được giới hacker ghi nhớ riêng biệt như truyền thuyết.

David A. Wheeler ghi nhận[9] bốn kết cục có thể xảy ra đối với một bản fork, kèm theo các ví dụ minh họa:

  1. Fork chết yểu – Đây là trường hợp phổ biến nhất. Việc tuyên bố tạo một bản fork thì dễ, nhưng duy trì phát triển và hỗ trợ độc lập lại đòi hỏi rất nhiều nỗ lực.
  2. Hợp nhất trở lại – Ví dụ: egcs được "công nhận chính thức" trở thành phiên bản mới của Bộ trình dịch GNU (GCC).
  3. Bản gốc lụi tàn – Ví dụ: X.Org Server thành công, trong khi XFree86 dần bị bỏ rơi.
  4. Phân nhánh thành công, thường với sự khác biệt rõ rệt – Ví dụ: OpenBSDNetBSD.

Các công cụ quản lý phiên bản phân tán (DVCS) đã làm phổ biến hóa một cách sử dụng ít cảm tính hơn của thuật ngữ "fork", làm mờ ranh giới giữa "fork" và "branch" (nhánh).[14] Với các công cụ như Mercurial hoặc Git, hiện cách phổ biến để đóng góp cho một dự án là trước tiên tạo một nhánh cá nhân từ kho lưu trữ, độc lập với kho chính, rồi sau đó đề xuất hợp nhất các thay đổi của mình vào kho gốc. Các nền tảng như GitHub, BitbucketLaunchpad cung cấp dịch vụ lưu trữ DVCS miễn phí, hỗ trợ rõ ràng cho các nhánh độc lập. Nhờ vậy, các rào cản kỹ thuật, xã hội và tài chính đối với việc fork một kho mã nguồn đã được giảm đi đáng kể – và GitHub cũng dùng chính thuật ngữ "fork" cho phương thức đóng góp này.

Các bản fork thường khởi động lại số hiệu phiên bản từ đầu, với các con số điển hình như 0.0.1, 0.1 hoặc 1.0, ngay cả khi phần mềm gốc đã ở các phiên bản cao hơn như 3.0, 4.0 hoặc 5.0. Tuy nhiên, đôi khi có ngoại lệ — khi phần mềm được fork nhằm mục đích thay thế trực tiếp (drop-in replacement) cho dự án gốc, như MariaDB thay cho MySQL[15] hoặc LibreOffice thay cho OpenOffice.org.

Giấy phép BSD cho phép các bản fork trở thành phần mềm sở hữu độc quyền, và những người ủng hộ bản quyền đối ứng cho rằng các động lực thương mại khiến việc thương mại hóa gần như là điều tất yếu. (Tuy nhiên, giấy phép copyleft vẫn có thể bị lách thông qua hình thức cấp phép kép, với quyền sở hữu độc quyền được trao thông qua Thỏa thuận Cấp phép của Người đóng góp – Contributor License Agreement.) Ví dụ bao gồm: macOS (dựa trên NeXTSTEP, phần mềm độc quyềnFreeBSD, phần mềm mã nguồn mở), Cedega và CrossOver (các bản fork thương mại của Wine, dù CrossOver vẫn theo sát Wine và có nhiều đóng góp), EnterpriseDB (một fork của PostgreSQL, bổ sung các tính năng tương thích với Oracle[16]), Supported PostgreSQL với hệ thống lưu trữ độc quyền ESM,[17] và bản dẫn xuất thương mại có khả năng mở rộng cao của PostgreSQL do Netezza phát triển[18]. Một số nhà cung cấp trong số này có đóng góp trở lại cho dự án cộng đồng, trong khi số khác giữ lại các thay đổi như một lợi thế cạnh tranh riêng.

"Fork" phần mềm độc quyền

[sửa | sửa mã nguồn]

Trong phần mềm sở hữu độc quyền, bản quyền thường thuộc về tổ chức tuyển dụng, chứ không phải các lập trình viên cá nhân. Mã nguồn độc quyền do đó thường chỉ được fork khi chủ sở hữu cần phát triển hai hoặc nhiều phiên bản khác nhau, chẳng hạn như phiên bản giao diện cửa sổ và phiên bản dòng lệnh, hoặc các phiên bản dành cho các hệ điều hành khác nhau, như một trình xử lý văn bản cho máy IBM PC tương thích và máy Macintosh. Thông thường, những bản fork nội bộ như vậy sẽ tập trung vào việc duy trì cùng giao diện, cảm nhận, định dạng dữ liệu và hành vi giữa các nền tảng để người dùng quen với một nền tảng có thể dễ dàng làm việc hoặc chia sẻ tài liệu trên nền tảng còn lại. Đây gần như luôn là một quyết định kinh tế nhằm mở rộng thị phần và từ đó bù đắp chi phí phát triển bổ sung do việc fork tạo ra.

Một ví dụ nổi bật về fork phần mềm độc quyền không thuộc kiểu này là các biến thể khác nhau của hệ điều hành Unix thương mại — gần như tất cả đều bắt nguồn từ AT&T Unix theo giấy phép và đều được gọi là "Unix", nhưng ngày càng không tương thích với nhau.[19]

Tham khảo

[sửa | sửa mã nguồn]
  1. ^ Từ "schism" (chia rẽ) thường được dùng trong những ngữ cảnh phù hợp, chẳng hạn như:
  2. ^ Entry 'fork' in Online Etymology Dictionary Lưu trữ ngày 25 tháng 5 năm 2012 tại Wayback Machine
  3. ^ Allman, Eric. "An Introduction to the Source Code Control System." Lưu trữ ngày 6 tháng 11 năm 2014 tại Wayback Machine Project Ingres, University of California at Berkeley, 1980.
  4. ^ Can somebody fork off a "net.philosophy"? (John Gilmore, net.misc, 18 tháng 1 năm 1983)
  5. ^ Shattering — good or bad? (Russell Nelson, gnu.misc.discuss, 1 October 1993)
  6. ^ Re: Hey Franz: 32K Windows SUCK!!!!! (Bill Dubuque, cu.cs.macl.info, 21 tháng 9 năm 1995)
  7. ^ Lignux? (Marcus G. Daniels, gnu.misc.discuss, 7 June 1996)
  8. ^ "Thuật ngữ fork bắt nguồn từ tiêu chuẩn POSIX dành cho các hệ điều hành: lệnh gọi hệ thống được sử dụng để một tiến trình tạo ra bản sao của chính nó được gọi là fork()" Robles, Gregorio; González-Barahona, Jesús M. (2012). A Comprehensive Study of Software Forks: Dates, Reasons and Outcomes (PDF). OSS 2012 The Eighth International Conference on Open Source Systems. doi:10.1007/978-3-642-33442-9_1. Lưu trữ (PDF) bản gốc ngày 2 tháng 12 năm 2013. Truy cập ngày 20 tháng 10 năm 2012.
  9. ^ a b c Why Open Source Software / Free Software (OSS/FS, FLOSS, or FOSS)? Look at the Numbers!: Forking Lưu trữ ngày 5 tháng 4 năm 2006 tại Wayback Machine (David A. Wheeler)
  10. ^ Stallman, Richard. "Định nghĩa Phần mềm Tự do". Quỹ Phần mềm Tự do. Lưu trữ bản gốc ngày 14 tháng 10 năm 2013. Truy cập ngày 15 tháng 10 năm 2013.
  11. ^ "Định nghĩa nguồn mở". Sáng kiến nguồn mở. ngày 7 tháng 7 năm 2006. Lưu trữ bản gốc ngày 15 tháng 10 năm 2013. Truy cập ngày 15 tháng 10 năm 2013.
  12. ^ Raymond, Eric S. (ngày 15 tháng 8 năm 2002). "Promiscuous Theory, Puritan Practice" [Lý thuyết phóng khoáng, thực hành khắt khe]. catb.org (bằng tiếng Anh). Lưu trữ bản gốc ngày 6 tháng 10 năm 2006.
  13. ^ Forked Lưu trữ ngày 8 tháng 11 năm 2011 tại Wayback Machine (Jargon File), lần đầu được thêm vào v4.2.2 Lưu trữ ngày 14 tháng 1 năm 2012 tại Wayback Machine, 20 August 2000)
  14. ^ ví dụ. Willis, Nathan (ngày 15 tháng 1 năm 2015). "An "open governance" fork of Node.js" [Một bản fork của Node.js theo mô hình “quản trị mở”]. LWN.net. Lưu trữ bản gốc ngày 21 tháng 4 năm 2015. Truy cập ngày 15 tháng 1 năm 2015. Forks are a natural part of the open development model—so much so that GitHub famously plasters a "fork your own copy" button on almost every page. [Fork là một phần tự nhiên trong mô hình phát triển mở — đến mức GitHub nổi tiếng vì gắn nút "fork bản sao của bạn" trên hầu như mọi trang.] Xem thêm Nyman, Linus (2015). Understanding Code Forking in Open Source Software [Hiểu về fork mã nguồn trong phần mềm mã nguồn mở] (PhD). Hanken School of Economics. tr. 57. hdl:10138/153135. Where practitioners have previously had rather narrow definitions of a fork, [...] the term now appears to be used much more broadly. Actions that would traditionally have been called a branch, a new distribution, code fragmentation, a pseudo-fork, etc. may all now be called forks by some developers. This appears to be in no insignificant part due to the broad definition and use of the term fork by GitHub. [Trước đây, các nhà phát triển thường có định nghĩa khá hẹp về fork, [...] nhưng hiện nay thuật ngữ này dường như đang được sử dụng theo nghĩa rộng hơn nhiều. Những hành động vốn từng được gọi là branch (nhánh), bản phân phối mới, phân mảnh mã nguồn, pseudo-fork (fork giả)... nay có thể đều được một số lập trình viên gọi chung là fork. Việc sử dụng rộng rãi và định nghĩa cởi mở của GitHub về từ fork dường như đóng vai trò không nhỏ trong sự thay đổi này.]
  15. ^ Forked a project, where do my version numbers start? Lưu trữ ngày 26 tháng 8 năm 2011 tại Wayback Machine
  16. ^ EnterpriseDB Lưu trữ ngày 13 tháng 11 năm 2006 tại Wayback Machine
  17. ^ Fujitsu Supported PostgreSQL Lưu trữ ngày 20 tháng 8 năm 2006 tại Wayback Machine
  18. ^ Netezza Lưu trữ ngày 13 tháng 11 năm 2006 tại Wayback Machine
  19. ^ Fear of forking Lưu trữ ngày 17 tháng 12 năm 2012 tại Wayback Machine – Một bài luận về việc fork các dự án phần mềm nguồn mở bởi Rick Moen