Dlaczego nie warto dołączać bezkrytycznie kodu z internetu do projektu

Jesteś freelancerem. Piszesz kod dla klienta i przekazujesz klientowi prawo do tego kodu. Dwa tygodnie później okazuje się, że jest problem. Klient informuje Cię, że nie zapłaci dopóki nie rozwiążesz problemu praw autorskich do tego kodu – nie tego klient oczekiwał, gdy podpisywał umowę.

A może jesteś managerem zespołu programistycznego w dużej firmie IT? W pewnym momencie podczas audytu wewnętrznego okazało się, że w projekcie jest kod z internetu na nieznanej licencji. A dokładnie, ten kod jest w Twoim projekcie. Najpewniej z podwyżki nici…

Programista w projekcie nie powinien mieć takich problemów, prawda? A jednak – najpewniej masz w umowie przekazanie praw do kodu, tak jak freelancer. Potencjalnie odpowiadasz za to do jakiejś wielokrotności swoich zarobków.

A więc może nie warto dołączać losowego kodu z internetu do swojego projektu?

Skąd te potencjalne problemy

W każdej z powyższych sytuacji ktoś wkleił kod z internetu do projektu. I jeśli ten ktoś nie zadbał o zgodność z licencją na oprogramowanie wklejanego kodu, złamał prawo.

Zgodnie z prawem, upraszczając, każdy fragment kodu w internecie należy do kogoś. Ktoś udzielił Ci prawa wykorzystywania tego kodu pod warunkiem, że spełnisz pewne wymogi.

To znaczy, że jeśli nie znasz tych wymogów, to nie jesteś w stanie udowodnić, że je spełniasz – i możesz ponieść konsekwencje. Jak bardzo bolesne będą te konsekwencje, będzie zależało od kontekstu.

Innymi słowy – wykorzystanie kodu z jakiegoś bloga, forum czy biblioteki jest dla Ciebie potencjalnie niebezpieczne.

Ale przecież kod ze StackOverflow można dołączyć do projektu – po to tam jest

Na pewno?

Spójrzmy troszkę głębiej.

Jaką licencję ma kod na StackOverflow?

Pod linkiem https://stackoverflow.com/help/licensing znajduje się informacja, że wszystko co wrzucili użytkownicy StackOverflow jest wrzucone na licencji o nazwie „Creative Commons Attribution-Share Alike”.

Ta licencja mówi mniej więcej o tym, że aby móc wykorzystać materiały udostępnione na tej konkretnej licencji to musisz:

  •         Uznać autorstwo: oznaczyć utwór, podać link do licencji itp.
  •         Wszystkie dzieła pochodne muszą być udostępnione na tych samych warunkach
  •         Nie możesz korzystać z żadnych środków prawnych ani technologicznych uniemożliwiających innym korzystanie z dzieła na tej licencji

Gdybyśmy chcieli spełnić zasady licencji StackOverflow, najprawdopodobniej musielibyśmy udostępnić całość kodu na tej samej licencji (CC-BY-SA) i zaznaczyć fragment pochodzący od konkretnego autora na StackOverflow.

W projektach komercyjnych jest to zwykle nieakceptowalne.

Jakie jest stanowisko platformy StackOverflow?

Znalazłem stanowisko Jeffa Atwooda, który jest współzałożycielem StackOverflow.

Jeff wypowiedział się na temat licencji pod linkiem: https://meta.stackexchange.com/questions/25956/what-is-up-with-the-source-code-license-on-stack-overflow/25957#25957, co można sparafrazować mniej więcej tak:

  •         Nie ma czego się bać
  •         Spokojnie możesz remiksować i reużywać, jak długo uznajesz autorstwo i używasz podobnej licencji
  •         Na StackOverflow w większości mamy wycinki kodu (code snippet). Wycinki mogą być w pełni wykorzystywane zgodnie z zasadą wolnego użytku (fair use), więc nie ma problemów

Problem polega na tym, że Jeff jest współtwórcą platformy StackOverflow, ale nie jest autorem wszystkich tekstów. Poszczególni autorzy jedynie udzielili StackOverflow prawo do dalszej dystrybucji tekstów – i to właśnie na licencji CC-BY-SA. Nawet właściciele StackOverflow nie mają prawa zmienić tej licencji samemu, bez zgody wszystkich autorów odpowiedzi.

Czy zatem wszyscy autorzy odpowiedzi na StackOverflow zgadzają się z tym stanowiskiem?

Nie do końca.

W roku 2016 pojawiły się głosy, że kod na StackOverflow powinien być przelicencjonowany na MIT. Pojawiło się sporo głosów przeciwnych.

Poniżej sparafrazuję stanowisko jednego z użytkowników, które można znaleźć pod linkiem: https://meta.stackexchange.com/questions/271080/the-mit-license-clarity-on-using-code-on-stack-overflow-and-stack-exchange/271113#271113

  •         Ludzie zaczęliby zadawać pytania z nadzieją otrzymania kodu, który mogą od razu dołączyć do projektu – byłoby to niekorzystne z perspektywy jakości samych pytań
  •         Wiele dobrych pytań by się nie pojawiło, bo ludzie musieliby licencjonować kod w tych pytaniach – nie do przejrzenia (review), a do swobodnego dysponowania przez innych
  •         Wiele dobrych odpowiedzi by się nie pojawiło z tych samych przyczyn

Innymi słowy, społeczność skupiona dookoła StackOverflow jest podzielona. To sprawia, że nie ma możliwości przelicencjonowania starych odpowiedzi na inną licencję.

Czyli StackOverflow jest bezużyteczny?

Nie. Nie można kopiować kodu bezpośrednio ze StackOverflow, ale nie ma powodu unikać korzystania z tej platformy. Pomocą służą nam dwa mechanizmy:

  •         Zasada „typowych praktyk”
  •         Prawa autorskie dotyczą konkretnego utworu, nie konceptów

Zasada typowych praktyk

Jeśli jesteś programistą, jak napiszesz pętlę w Pythonie sumującą liczby od 0 do 9?

Najpewniej tak:

prosty algorytm sumowania liczb od 0 do 9 napisany w Pythonie

 

 

Na świecie jest wielu programistów i nie jest to jedyne możliwe rozwiązanie. Ale to powyższe rozwiązanie jest jednym z najbardziej typowych i najprostszych rozwiązań. Jest to rozwiązanie, które najpewniej przyjdzie na myśl większości programistów.

Coś takiego jest „standardową praktyką”. Czymś, co się „po prostu robi w danej branży”.

Jeśli kilku programistów, którzy nigdy nie rozmawiali ze sobą, proponuje bardzo podobne rozwiązanie, to takie rozwiązanie nie do końca podlega ochronie.

Jeśli więc zobaczysz kod na StackOverflow, który jest taką „typową praktyką”, nie musisz się przejmować. Nie każdy kod znaleziony na StackOverflow jest potencjalnym zagrożeniem dla Twojego projektu.

Jak poznać kod, który jest typową praktyką?Ano, nie jest to proste – kilku niezależnych od siebie programistów powinno napisać rozwiązanie w bardzo podobny sposób.

Szczęśliwie, mamy jeszcze jedno potencjalne rozwiązanie w zanadrzu.

Prawa autorskie a koncepty

Rozważmy ciąg Fibonacciego.

Ten ciąg ma następującą sekwencję liczb: 1,1,2,3,5..(n-2), (n-1), n=(n-2)+(n-1).

Jak możemy napisać coś takiego w kodzie? Możemy użyć algorytmu iteracyjnego:

prosty algorytm obliczania ciągu Fibonacciego napisany w Pythonie

 

 

 

 

 

Nie jest to idealny algorytm, ale ten wymyśliłem przed chwilą. Ten kod podlega ochronie.

Ale sam algorytm nie podlega tej ochronie. Każdy może przeanalizować moje rozwiązanie ciągu Fibonacciego i napisać własny kod implementujący ten algorytm.

W wypadku czegoś tak prostego, najpewniej będzie to podobne z różnicą na poziomie zmienionych nazw. W wypadku większego fragmentu kodu najpewniej różnic będzie więcej.

Tu znajduje się odpowiedź na pytanie, jak można wykorzystać StackOverflow – niekoniecznie do kopiowania kodu. Zawsze można zainspirować się cudzymi rozwiązaniami, by na ich bazie napisać własny kod i własne rozwiązania.

A jak to robią inni

Naruszenia licencji StackOverflow w projekcie komercyjnym

Cóż… niektórym wychodzi to lepiej, innym gorzej.

W poniższym artykule z 2016 roku Nissan został obiektem żartów z uwagi na to, że pewien developer przekleił kod ze StackOverflow:

https://www.theverge.com/tldr/2016/5/4/11593084/dont-get-busted-copying-code-from-stack-overflow

Innymi słowy, tego typu rzeczy się zdarzają.

Badania nad naruszeniami licencji StackOverflow w projektach OpenSource

We wrześniu 2018 roku została opublikowana praca naukowa, w której Sebastian Baltes i Stephan Diehl pokusili się o sprawdzenie zgodności z Uznaniem Autorstwa kodu znalezionego na GitHubie.

Nie zaskoczyło mnie szczególnie to, że pomiędzy 3.3% a 11.9% projektów posiadało kod, który najprawdopodobniej pochodził ze StackOverflow – a do tego nie więcej niż 1.8% z tych repozytoriów miały jakiekolwiek Uznanie Autorstwa.

Można więc założyć, że podobnie kiepska sprawa dotyczy też kodu komercyjnego.

Źródło: https://arxiv.org/abs/1802.02938

Duże firmy i lista zatwierdzonych bibliotek

W odpowiednio dużych firmach, by uniknąć problemów związanych z licencjami, kodem z niewiadomego źródła i ogólnie rozumianym zarządzaniem ryzykiem, często praktykuje się dość interesujące rozwiązanie:

  •         Istnieje lista zatwierdzonych bibliotek w akceptowalnych wersjach
  •         Nie wolno programiście dołączyć do kodu biblioteki spoza akceptowalnej listy (lub w innej wersji)
  •         Nie wolno programiście kopiować kodu z żadnego źródła poza firmowym repozytorium

Na pierwszy rzut oka brzmi to bardzo radykalnie. Jednak jeśli zwrócisz uwagę na to, że duża firma ma zupełnie inny profil ryzyka (inne typy osób i organizacji mogą chcieć ją pozwać), zaczyna mieć to sens.

Inne firmy mają określone wytyczne co do akceptowalnych licencji. Przykładowo, Google, w poniższym dokumencie, opisuje jakie licencje mogą być wykorzystywane, a jakie są absolutnie zakazane:

https://opensource.google.com/docs/thirdparty/licenses/

Sporo tego było. Co ja mam z tego zapamiętać?

Przede wszystkim, najważniejsza rzecz: nie kopiuj kodu ze StackOverflow do swojego projektu. W ogóle, nie kopiuj kodu z żadnego źródła do swojego projektu bez zaznaczenia tego źródła i zrozumienia z czym to się wiąże.

Po drugie, panika nie pomoże. Różne byty mają różne profile ryzyka.

  •         Wielkie firmy będą bardzo ostrożne jeśli chodzi o licencje – one zachowują się rozsądnie, próbując zniwelować ryzyko wprowadzenia kodu na niekorzystnej licencji do swojej organizacji.
  •         Freelancer, nie mający parasola ochronnego, powinien rozważyć zainteresowanie się tematem licencji, choćby po to, by nie zostać pozwanym lub nie pisać kodu za darmo.
  •         Programista bawiący się we własnym prywatnym repozytorium Gitlabowym? Jakkolwiek nadal powinien przestrzegać prawa, konsekwencje naruszeń licencyjnych nie będą bardzo dotkliwe.

Dzięki zasadzie typowych praktyk i niemożności obrony pomysłów prawami autorskimi (a tylko implementacji) wszyscy nadal możemy cieszyć się z możliwości swobodnego programowania nawet, jeśli ktoś już coś napisał przed nami (nie dotyczy USA i prawa patentowego na software, ale to temat zupełnie innego artykułu).

Nie da się całkowicie unikać wykorzystywania kodu innych osób w swoich projektach. Jeśli spróbujesz tak robić, konkurencja Cię przegoni. Ale warto sprawdzać licencje dołączanego przez siebie kodu, by się upewnić, że nie zrobisz sobie (czy innym) kłopotów.

Nie każda licencja jest problematyczna. Są takie licencje jak MIT czy BSD 0-clause (do 3-clause) których wykorzystanie nie jest problematyczne – więcej, te licencje zachęcają do wykorzystywania kodu w dowolnym kontekście – jak tylko oznaczysz kod na tych licencjach.

Co dalej

Jeżeli interesują Cię tematy licencji, polecam gorąco książkę Heather Meeker Open (Source) for Business: A Practical Guide to Open Source Software Licensing – Second Edition. Przeczytałem, bardzo przystępna i pomaga wdrożyć licencje w codziennej pracy programisty.

Jeżeli chcesz włączyć bibliotekę na nieznanej Ci licencji do swojego projektu, polecam stronę https://tldrlegal.com/ . Ta strona jest próbą przełożenia, nie zawsze prostego do zrozumienia, języka prawniczego na proste wytyczne – wolno Ci zrobić X, musisz spełnić warunek Y.

Jeżeli chcesz włączyć jakiś kod z internetu do swojego projektu, najlepiej przepisz ten kod po swojemu. Nie mam tu na myśli “kopiuj, wklej, trochę zmień” a “zrozum i napisz to po swojemu”. W ten sposób powstał nowy utwór, którego twórcą jesteś Ty (upraszczam tu temat).

Jeżeli interesuje Cię ogólny temat licencji i chcesz poćwiczyć analizę licencji OpenSource w praktyce, mam przyjemność prowadzić warsztat na konferencji FDD (30 listopada 2018, Gliwice). W filmiku na YouTube mówię na ten temat tyci więcej.

Powodzenia!