Câu trả lời này có phạm vi bảo hiểm tuyệt vời và các liên kết về lý do tại sao các ngôn ngữ khác nhau có thể cung cấp lợi ích khác biệt cho một dự án. Tuy nhiên, có khá nhiều hơn một chút về sự phù hợp ngôn ngữ liên quan đến lý do tại sao các dự án kết thúc sử dụng nhiều ngôn ngữ.
Các dự án kết thúc bằng nhiều ngôn ngữ vì sáu lý do chính:
- Lợi ích chi phí của việc tái sử dụng mã được viết bằng các ngôn ngữ khác;
- Sự cần thiết phải bao gồm và chứa mã kế thừa;
- Sự sẵn có của các lập trình viên cho các ngôn ngữ cụ thể;
- Sự cần thiết phải có ngôn ngữ đặc biệt cho nhu cầu đặc biệt;
- Xu hướng ngôn ngữ kế thừa; và
- Quản lý dự án kém (sử dụng đa ngôn ngữ ngoài kế hoạch).
Lý do 1-4 là lý do tích cực theo nghĩa là giải quyết trực tiếp chúng có thể giúp dự án kết thúc nhanh hơn, hiệu quả hơn, với sản phẩm chất lượng cao hơn và hỗ trợ dài hạn dễ dàng hơn. Lý do 5 và 6 là tiêu cực, các triệu chứng chống lại sự thay đổi cần thiết, kế hoạch kém, quản lý không hiệu quả hoặc một số kết hợp của tất cả các yếu tố này. Những yếu tố tiêu cực này không may là nguyên nhân phổ biến của việc sử dụng đa ngôn ngữ "tình cờ".
Lý do 1 , lợi ích chi phí của việc tái sử dụng, đã trở thành một lý do ngày càng mạnh mẽ để cho phép sử dụng nhiều ngôn ngữ trong một dự án do cả vai trò lớn hơn của phần mềm nguồn mở và khả năng cải tiến để tìm các thành phần mã phù hợp trên web. Triết lý "hãy mã hóa tất cả nội bộ" trong những thập kỷ qua tiếp tục mờ nhạt khi đối mặt với thực tế kinh tế và về cơ bản không bao giờ là phương pháp hiệu quả nhất về chi phí cho bất kỳ dự án mới nào. Chính điều này làm cho các cơ hội thực thi nghiêm ngặt việc sử dụng một ngôn ngữ trong một dự án ít phổ biến hơn.
Đặc biệt trong trường hợp dự án sử dụng lại các thành phần nguồn mở được quản lý tốt, việc sử dụng nhiều ngôn ngữ có thể mang lại lợi ích tổng thể rất lớn vì các thành phần được sử dụng lại đều ẩn sau các giao diện được thiết kế tốt và được duy trì độc lập bởi các nhóm bên ngoài có chi phí bằng không. Trong các trường hợp tốt nhất, việc trộn các ngôn ngữ thông qua loại tái sử dụng này không gây tốn kém hơn cho dự án so với việc sử dụng các thành phần của hệ điều hành. Tôi biết không có ví dụ nào tốt hơn về giá trị của phương pháp này so với việc áp dụng phần mềm nguồn mở quy mô lớn của Microsoft trong trình duyệt của họ.
Lý do 2 , nhu cầu chứa mã kế thừa, bị bỏ qua trong tình trạng nguy hiểm của bất kỳ dự án lớn nào. Tuy nhiên, rất nhiều rắc rối mã di sản có thể gây ra, ngây thơ cho rằng nó có thể được thay thế dễ dàng bằng mã mới trong một ngôn ngữ mới có thể rất rủi ro. Mã kế thừa, thậm chí mã kế thừa xấu, thường bao gồm số tiền cho một "hợp đồng" ngầm của các tính năng được cộng đồng mong đợi sử dụng sản phẩm cũ. Cộng đồng đó khá thường xuyên là một nguồn thu chính cho một công ty, hoặc mục tiêu chính của hỗ trợ cho phần mềm chính phủ. Đơn giản chỉ cần loại bỏ hợp đồng ngụ ý có thể đuổi theo khách hàng nhận biết và có thể phá sản công ty chỉ sau một đêm nếu có sẵn các lựa chọn khác.
Đồng thời, không thay thế mã cũ bằng ngôn ngữ cũ có thể nguy hiểm như thay thế bán buôn. Một ví dụ tồi tệ nhất là Cơ quan Cựu chiến binh Hoa Kỳ, nơi có một số lượng lớn các hệ thống quan trọng được mã hóa bằng ngôn ngữ gọi là MUMPS (không đùa) được thiết kế bởi các bác sĩ y khoa, không phải các nhà khoa học máy tính. Không ai muốn học MUMPS, và những người biết điều đó thực sự đang chết dần. Do đó, các lập trình viên phải điều chỉnh MUMPS ngay cả khi họ cố gắng chuyển sang sử dụng các ngôn ngữ phổ biến hơn, mạnh hơn và được duy trì tốt hơn.
Loại sử dụng đa ngôn ngữ này đòi hỏi lập kế hoạch cẩn thận. Kế hoạch đó phải điều hướng cạnh dao giữa việc mất hàng thập kỷ kiến thức của khách hàng và mặt khác mất khả năng hỗ trợ phần mềm. Các kỹ thuật cô lập mã cũ đằng sau các giao diện được xác định rõ và cho phép mã mới mạnh hơn để thay thế mã cũ sau khi các hành vi của nó đã được ghi lại tốt, có thể giúp ích. Nhưng kịch bản di sản này không bao giờ dễ dàng, và đã (và sẽ tiếp tục) là nguyên nhân dẫn đến sự sụp đổ của nhiều công ty và tổ chức trên một phạm vi rộng.
Lý do 3 , sự sẵn có của các lập trình viên cho các ngôn ngữ khác nhau, là một yếu tố thực dụng mà các dự án bỏ qua lúc nguy hiểm. Tuy nhiên, nhiều người tổ chức dự án có thể cảm thấy (chính xác hoặc không chính xác) rằng một ngôn ngữ cụ thể là tốt nhất cho mục tiêu của họ, nếu ngôn ngữ đó mâu thuẫn với nhóm chuyên gia ngôn ngữ có sẵn cho họ, cả lịch trình và chất lượng sản phẩm sẽ bị ảnh hưởng từ việc học cong các lập trình viên cố gắng học một ngôn ngữ mới.
Một cách tiếp cận hợp lý hơn là phân tích nhu cầu ngôn ngữ của dự án dựa trên các khu vực chức năng. Ví dụ, xem xét kỹ dự án có thể chỉ ra rằng chỉ có một "đỉnh" nhỏ của mã giá trị cao, ví dụ để thực hiện một số thuật toán độc quyền, đòi hỏi phải có chuyên môn về mã hóa trong một ngôn ngữ ít được sử dụng. Các phần khác của bất kỳ dự án lớn nào thường dễ dàng được cung cấp bởi các ngôn ngữ phổ biến hơn hoặc (thậm chí tốt hơn) bởi các sản phẩm nguồn mở được quản lý tốt. Do đó, phân tích một dự án theo nhu cầu ngôn ngữ có thể cung cấp một cách tiếp cận thực tế và hiệu quả hơn về việc thuê hoặc thuê chuyên môn đặc biệt trong các ngôn ngữ đặc biệt và cũng có thể giúp làm sắc nét các giao diện giữa các ngôn ngữ trong một dự án.
Lý do 4 , sử dụng các ngôn ngữ khác nhau cho các nhu cầu khác nhau, ngay lập tức và thuận lợi từ việc thực hiện loại phân tích nhu cầu dự án đó. Cũng nên sử dụng cẩn thận trong trường hợp này, vì việc chọn quá nhiều ngôn ngữ để hỗ trợ trong một dự án có thể gây ra sự bùng nổ phức tạp cả về hỗ trợ và giao diện giữa các thành phần. Cách an toàn nhất về chi phí là luôn luôn tìm cơ hội tối đa để tái sử dụng trước tiên, đặc biệt nếu có các gói tốt có thể đáp ứng nhu cầu của dự án thông qua ít hơn là tùy chỉnh. Tiếp theo, một số loại quyết định nên được đưa ra đối với một số lượng nhỏ ngôn ngữ có thể giải quyết phần lớn các nhu cầu đã xác định. Trong phát triển tái sử dụng chuyên sâu, đây thường sẽ là một loại mã keo.
Nói chung, không nên chọn nhiều ngôn ngữ có khả năng rất giống nhau chỉ vì một số thành viên của dự án thích một ngôn ngữ khác. Tuy nhiên, nếu có tập hợp năng lực được xác định rõ, được xác định rõ sẽ có lợi từ các kỹ năng ngôn ngữ đặc biệt, đó có thể là một lý do chính đáng để sử dụng nhiều ngôn ngữ để phát triển mã mới.
Lý do 5 , khả năng chống lại những thay đổi cần thiết trong các ngôn ngữ được sử dụng, có thể là nguyên nhân của sự gián đoạn nghiêm trọng của dự án và xung đột nội bộ. Là người dùng Daveochỉ ra trong một nhận xét về câu trả lời này, thay đổi có thể rất khó khăn đối với một số nhân viên dự án. Đồng thời, khả năng chống thay đổi không bao giờ là vấn đề đơn giản, đó chính là lý do tại sao nó có thể gây ra nhiều xung đột. Sử dụng các kỹ năng ngôn ngữ kế thừa có thể là một sự thúc đẩy mạnh mẽ cho năng suất của dự án nếu ngôn ngữ kế thừa đủ mạnh mẽ và có thể dẫn đến một sản phẩm có chất lượng tuyệt vời trong một nhóm hoạt động trơn tru và tôn trọng chất lượng. Tuy nhiên, các kỹ năng ngôn ngữ cũ phải được cân bằng với thực tế là nhiều ngôn ngữ cũ không còn có thể hoàn thiện với các ngôn ngữ gần đây hơn về các tính năng nâng cao, tính sẵn có của thành phần, tùy chọn nguồn mở và hỗ trợ bộ công cụ thông minh.
Cả lúc đó và bây giờ, đối số phổ biến nhất (và trớ trêu thay, thường đúng nhất) để tiếp tục sử dụng ngôn ngữ kế thừa yếu hơn, ít đọc hơn hoặc kém năng suất hơn là ngôn ngữ cũ cho phép sản xuất mã hiệu quả hơn. Đây là một lập luận cũ, một cuộc tranh cãi từ những năm 1950 khi những người sử dụng ngôn ngữ lắp ráp bực bội, thường cay đắng, sự xuất hiện của lập trình trong FORTRAN và LISP. Một ví dụ mà ngay cả bây giờ có thể thấy đối số hiệu quả mã có thể có hiệu lực trong mã chuyên sâu xử lý, chẳng hạn như nhân hệ điều hành, trong đó C vẫn là ngôn ngữ được lựa chọn so với C ++ (mặc dù vì lý do vượt quá hiệu quả đơn giản).
Tuy nhiên, trong môi trường dự án được hỗ trợ bởi máy toàn cầu và được hỗ trợ mạnh mẽ trong thiên niên kỷ mới, hiệu quả mã là đối số chính để chọn ngôn ngữ dự án đã phát triển thậm chí còn yếu hơn. Sự bùng nổ tương tự của phần cứng máy tính và mạng đã cho phép tiếp thị đại trà các ứng dụng trí tuệ nhân tạo cũng có nghĩa là chi phí lập trình của con người có thể dễ dàng giảm bớt những vấn đề thực thi mã không hiệu quả trên phần cứng và phần mềm đám mây giá rẻ. Khi điều đó được kết hợp với tính khả dụng cao hơn đối với các ngôn ngữ gần đây hơn của các thư viện thành phần, tùy chọn nguồn mở và bộ công cụ thông minh tiên tiến, số trường hợp chỉ giữ ngôn ngữ vì lý do hiệu quả trở nên rất hẹp. Ngay cả trong trường hợp nó được áp dụng,
Một lý do thuyết phục hơn cho một dự án ở lại với các ngôn ngữ cũ xảy ra khi vì bất kỳ lý do gì một dự án có ít hoặc không có tùy chọn để thay đổi nhân viên của mình. Điều này có thể xảy ra ví dụ khi một dòng sản phẩm chính được mã hóa hoàn toàn bằng ngôn ngữ mà chỉ có nhân viên hiện có là thông thạo. Trong những trường hợp như vậy, dự án phải tiếp tục con đường cố gắng lập trình bằng ngôn ngữ cũ hoặc cố gắng đào tạo nhân viên hiện có về cách sử dụng ngôn ngữ mới.
Đào tạo nhân viên ngôn ngữ kế thừa trong một ngôn ngữ mới có thể là một mối nguy hiểm của chính nó. Tôi vẫn nhớ một trường hợp một thành viên của một dự án vừa được đào tạo và chuyển đổi từ C sang C ++ đã phàn nàn với tôi bằng tất cả sự chân thành rằng anh ta chỉ không hiểu những lợi thế của phương pháp hướng đối tượng. Khi tôi xem mã của anh ta, anh ta đã chuyển đổi 103 hàm C trước đó của mình thành 103 phương thức cho một lớp đối tượng C ++ duy nhất ... và đúng là không thấy điều đó giúp được gì.
Thông điệp sâu xa hơn là khi mọi người đã lập trình theo một ngôn ngữ và phong cách ngôn ngữ duy nhất trong nhiều năm hoặc nhiều thập kỷ, khó khăn trong việc khiến họ "suy nghĩ" theo những cách mới có thể trở nên gần như không thể vượt qua, ngay cả với các chương trình đào tạo tốt. Trong một số trường hợp có thể không có lựa chọn nào khác ngoài việc đưa vào các nhà thiết kế và lập trình viên trẻ, những người đồng điệu hơn với các xu hướng và phương pháp hiện tại.
Lý do 6 , quản lý dự án kém, nói cho chính nó. Lựa chọn và sử dụng ngôn ngữ trong một dự án phải luôn luôn được xem xét và đánh giá một cách rõ ràng và không được phép xảy ra chỉ do tình cờ. Ít nhất, lựa chọn ngôn ngữ có thể tạo ra sự khác biệt lớn trong số phận dài hạn và chi phí hỗ trợ của một dự án, và do đó, luôn phải được tính đến và lên kế hoạch. Đừng trở thành một MUMPS!