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

Trong phát triển phần mềm, **fork** () 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. 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.
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ự do và mã nguồn mở, theo định nghĩa, có thể được fork mà không cần xin phép.

## Thuật ngữ

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".

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:

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 đó.

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 đó). Đến năm 1995, từ fork đã được sử dụng để mô tả sự chia tách của XEmacs, và cách dùng này đã trở nên quen thuộc trong Dự án GNU vào năm 1996.

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.

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

Phần mềm tự do và mã 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 và Định nghĩa nguồn mở:

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". 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]]*, 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): 

David A. Wheeler ghi nhận 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:
# 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.
# 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).
# 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.
# Phân nhánh thành công, thường với sự khác biệt rõ rệt – Ví dụ: OpenBSD và NetBSD.

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). 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, Bitbucket và Launchpad 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 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ền và FreeBSD, 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), Supported PostgreSQL với hệ thống lưu trữ độc quyền ESM, 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. 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

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.

## Xem thêm
* Phần mềm tùy chỉnh
* Hack ROM

## Tham khảo