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.Từ "schism" (chia rẽ) thường được dùng trong những ngữ cảnh phù hợp, chẳng hạn như:
 "the Lemacs/FSFmacs schism"  (Jamie Zawinski, năm 2000)
 "Behind the KOffice split"  (Joe Brockmeier, Linux Weekly News, ngày 14 tháng 12 năm 2010)
 "Copyright assignment – once bitten, twice shy"  (Richard Hillesley, H-Online, ngày 6 tháng 8 năm 2010)
 "Forking is a feature"  (Anil Dash, ngày 10 tháng 9 năm 2010)
 "The Great Software Schism"  (Glyn Moody, Linux Journal, ngày 28 tháng 9 năm 2006)
 "To Fork Or Not To Fork: Lessons From Ubuntu and Debian"  (Benjamin Mako Hill, năm 2005).
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".Entry 'fork' in Online Etymology Dictionary 

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:Allman, Eric. "An Introduction to the Source Code Control System."  Project Ingres, University of California at Berkeley, 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 đó.Can somebody fork off a "net.philosophy"? (John Gilmore, net.misc, 18 tháng 1 năm 1983)

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 đó).Shattering — good or bad? (Russell Nelson, gnu.misc.discuss, 1 October 1993) Đến năm 1995, từ fork đã được sử dụng để mô tả sự chia tách của XEmacs,Re: Hey Franz: 32K Windows SUCK!!!!! (Bill Dubuque, cu.cs.macl.info, 21 tháng 9 năm 1995) và cách dùng này đã trở nên quen thuộc trong Dự án GNU vào năm 1996.Lignux? (Marcus G. Daniels, gnu.misc.discuss, 7 June 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."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()" 

 "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):Forked  (Jargon File), lần đầu được thêm vào v4.2.2 , 20 August 2000) 

David A. Wheeler ghi nhậnWhy Open Source Software / Free Software (OSS/FS, FLOSS, or FOSS)? Look at the Numbers!: Forking  (David A. Wheeler) 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í dụ.  Xem thêm  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 MySQLForked a project, where do my version numbers start?  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 OracleEnterpriseDB ), Supported PostgreSQL với hệ thống lưu trữ độc quyền ESM,Fujitsu Supported PostgreSQL  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.Netezza  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.Fear of forking  – 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

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

 Tham khảo 

Thể loại:Fork (phát triển phần mềm)
Thể loại:Quản lý dự án phần mềm