Очень часто мы слышим вокруг, что использование Open Source кода — это хорошо и правильно, это развивает ИТ-индустрию, это позволяет накапливать знания, а не тратить время разработчиков, создавая очередной «велосипед». Но давайте разбираться, так ли дело обстоит на самом деле, какие трудности будут нас преследовать на пути распространения Open Source продуктов, и как их преодолеть.
Для чего разработчики выбирают Open Source? Во-первых, чтобы сделать продукт доступнее, понятнее для конечных пользователей (ведь тоже могут быть разработчиками, и им проще будет пользоваться продуктом, если они будут представлять основные принципы его работы). Во-вторых, для возможности внесения изменения в сам продукт (модификаций или улучшений). В-третьих, для возможности позволить эти изменения, добавленные сторонними разработчиками, внести в основной продукт без потери авторских и других прав. Тут надо сразу оговориться, что под Open Source продуктом понимается не свободное программное обеспечение (freeware), и не код, доступный публично, а опубликованный в общем доступе код с оговоренными правилами лицензирования.
Все права, оговориваемые Open Source лицензиями, можно условно разделить на авторское право (собственно, copyright), право на использование (выполнение) кода, право на демонстрацию или изучение (открытых исходные тексты продукта), право копирования, право внесения изменений в исходный код, право распространения (без или с изменениями) и право изменения лицензии или включения в свой продукт.
Если расположить градации лицензий по увеличению количества прав, первым будет закрытый код, который обычно сохраняет только авторское право, но очень часто право выполнения и демонстрации ограничено или является даже платным (как в случае с Windows).
Следующими, как ни странно, идут GPL и LGPL-лицензии. Исходный код, единожды открытый под GPL, уже не может быть закрыт (поскольку любой, кто его получил, может продолжить его распространение), лицензия не может быть изменена, и его использование является абсолютно свободным. Однако, при распространении необходимо прикладывать исходные коды продукта и саму лицензию.
Более свободным вариантом (также с необходимостью поставлять продукт вместе с исходными кодами) является семейство GPL-совместимых лицензий. Здесь авторы могут изменить лицензию исходного кода внутри группы без каких-либо нарушений.
Следующей градацией свободы является группа OSI-совместимых лицензий, внутри которой есть как GPL-совместимые, так и GPL-несовместимые. Миграция между этими двумя подгруппами запрещена, но GPL-несовместимых лицензий больше, и часть из них позволяет даже коммерческое использование продукта, полученного из имеющихся исходных кодов.
Наиболее свободным является открытый код (размещенный в так называемом «публичном доступе», public domain). Но в этом случае код теряет авторское право (это противоречит российскому законодательству, поэтому в нашей стране такая практика не применима).
Давайте рассмотрим несколько характерных случаев поведения при работы с Open Source лицензиями.
К первоначальному выбору лицензии, под которой исходный код продукта будет открыт, — это ответственный процесс. Хотя если продукт предполагается развивать очень активно, то в любой момент лицензию можно будет сменить (но это не будет распространяться на уже опубликованный код под другой лицензией).
Если мы собираемся существенно ограничить коммерческое использование продукта и максимально увеличить пользовательский охват, то лучше всего использовать GPL-лицензии. Они гарантируют, что все последующие модификации будут опубликованы также под GPL-лицензиями, и сам механизм лицензирования (ограничения) запретит какие-либо ограничения.
Если мы хотим сделать наш код максимально доступным для использования (в том числе, в коммерческих продуктах), то лучше всего выбрать GPL- или даже OSI-совместимую лицензию. При этом можно выбрать и двойное лицензирование (например, BSD + Apache лицензии).
Если же нам существенно, чтобы продукт мог быть использован только в коммерческих целях (т.е. нужно ограничить права его использования и распространения), то здесь выход один — создание своей лицензии.
В том случае, если мы выбираем множественное лицензирование исходного кода (так поступают все наиболее коммерчески успешные проекты), то стоит разделить весь функционал продукта на ядро (общая часть продукта, связывающая его модули в единое целое) и модули (функционал продукта, который не может быть выполнен без ядра, но составляет существенную его часть). Затем определить набор модулей, которые будут опубликованы под OSI-совместимой лицензией (при этом можно выбирать и множественное лицензирование в этой области) и коммерческой лицензией. И в заголовок каждого файла исходного кода добавить, под какой лицензией он выложен.
@licensed LGPL (LICENSE-LGPL.txt) @licensed MIT license (LICENSE-MIT.txt) @licensed YOUR license (LICENSE-YOURS.txt)
Желательно также приложить все тексты лицензий в сам продукт и дополнительно в readme-файле написать, какие модули под какой лицензией опубликованы.
Существенным при использовании какого-либо Open Source кода является понятие «производного произведения» (derivative work). Если ваш продукт не может работать без заимствованной части, например, заимствованная часть составляет основу (ядро) продукта, то в таком случае необходимо сохранить правила лицензирования первоначального кода.
Если же полученный нами исходный код был использован без изменений, и только через API самого кода (т.е. подключается как сторонний модуль в продукте, и продукт может, в принципе, работать и без этой внешней части), то наш продукт производным произведением не является, и мы можем лицензировать наш продукт (но не заимствованный код!) под любой лицензией. При этом наобходимо сохранить лицензию на заимствованный код без изменений.
Наиболее интересным и спорным является тот случай, когда сторонний код будет нами использоваться как существенная часть продукта, но нам необходимо изменить лицензию вопреки правилами исходного кода (т.е. по факту лицензию нарушить). В этом случае возможны следующие варианты поведения (чтобы без жертв):
Как быть в том случае, если вы хотите соблюсти исходную лицензию, но при этом совсем не хотите, чтобы ваши работы стали публичным достоянием?
Во-первых, можно использовать минимизацию и обфускацию кода. Грамотная обфускация почти на 100% гарантирует, что прочесть ваши исходники смогут только в самом крайней случае (а в нем исходники все равно смогут тем или иным образом достать). При этом стоит учесть ограничение текущей лицензии, и не выпускать скомпилированный код без исходных текстов (т.е., например, Zend тут не поможет).
Вы также можете ограничить распространение сборок продукта (сами исходные коды могут быть доступны в публичном репозитории, однако, для правильной их сборки будет необходимо специфическое окружение, которое вы не обязано распространять). В таком случае даже продукт, полученный под GPL-лицензией, будет достаточно тяжело видоизменить («взломать») и распространить дальше.
Естественно, вы также можете использовать множественное лицензирование своего продукта, чтобы закрыть наиболее существенные его части от коммерческого использования сторонними разработчиками.
Спасибо за внимание. Вопросы?