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

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

thumb|upright|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 () 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ở: 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.

👁️ 2 | 🔗 | 💖 | ✨ | 🌍 | ⌚
thumb|upright|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** ()
**Jenkins** là một phần mềm tự động hóa, mã nguồn mở và viết bằng Java. Dự án được tách ra từ dự án ban đầu là Hudson, sau khi xảy ra sự tranh chấp với
**Proton** là một lớp tương thích để chạy các trò chơi Windows trên các hệ điều hành thuộc họ Linux. Proton được phát triển bởi Valve cùng với các nhà phát triển từ CodeWeavers. Proton
**Docker** là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa. Docker cung cấp một lớp trừu tượng và tự động
**Bitcoin** (ký hiệu: **BTC, XBT, **) là một loại tiền mã hóa, được phát minh bởi một cá nhân hoặc tổ chức vô danh dùng tên Satoshi Nakamoto dưới dạng phần mềm mã nguồn mở
**WebKit** là một engine trình duyệt nguồn mở cung cấp các thành phần cần thiết để xây dựng một trình duyệt web. WebKit được Apple Inc. chính thức nhận từ thư viện phần mềm KHTML
**youtube-dl** là một phần mềm tự do nguồn mở giúp người dùng tải xuống video và âm thanh từ YouTube và hơn 1.000 dịch vụ lưu trữ video khác. youtube-dl được phát hành theo giấy
**Ethereum** **(ETH)** là một nền tảng điện toán có tính chất phân tán, công cộng, mã nguồn mở dựa trên công nghệ Blockchain. Nó có tính năng hợp đồng thông minh (kịch bản), tạo thuận
**Safari** là trình duyệt web đồ họa mã nguồn mở một phần dựa trên WebKit do Apple phát triển. Nó xuất hiện lần đầu tiên như một phần của Mac OS X Panther trên Mac
**Hệ thống file nhật ký ext4** hoặc **Hệ thống file mở rộng thứ tư** là một hệ thống file nhật ký cho Linux, được phát triển như là sự kế thừa cho ext3. Đây là
**VisualBoyAdvance** (thường được viết tắt là **VBA**) là trình giả lập miễn phí của các máy chơi game cầm tay Game Boy, Game Boy Color và Game Boy Advance cũng như của Super Game Boy
**Netflix Inc.** () là dịch vụ truyền dữ liệu video theo yêu cầu trên toàn cầu và cho thuê DVD trả phí tại Hoa Kỳ, nơi DVD và đĩa Blu-ray được gửi thông qua thư
**Redis** (/ˈrɛdɪs/; từ viết tắt của **Remote Dictionary Server**) là một cơ sở dữ liệu phân tán trong bộ nhớ, được sử dụng như một cơ sở dữ liệu đệm lưu dữ liệu dạng cặp
**Bộ gõ tiếng Việt** là một loại phần mềm hỗ trợ soạn thảo văn bản bằng tiếng Việt trên máy tính, thường cần phải có phông ký tự chữ Quốc ngữ đã được cài đặt
**HarmonyOS (HMOS)** _(Hệ điều hành Harmony)_ () là hệ điều hành phân tán do Huawei phát triển cho điện thoại thông minh, máy tính bảng, TV thông minh, đồng hồ thông minh, máy tính cá
**Zcash** là một **tiền kỹ thuật số** tập trung vào quyền riêng tư được phát triển từ mã nguồn của Bitcoin, với sự đổi mới chính là bổ sung một sổ cái được mã hóa
thumb|Minh họa mã nguồn [[Java (programming language)|Java với comment **mở đầu** được biểu thị bằng màu **đỏ** và comment **nội dòng** bằng màu **lục**. **Mã chương trình** là bằng màu **lam**.]]Trong lập
Trong lập trình, **minification** (còn được gọi là **minimisation** hoặc **minimization**) là quá trình loại bỏ các ký tự không cần thiết từ mã nguồn hoặc chương trình thông dịch hoặc ngôn ngữ đánh dấu