Współcześnie rozwój aplikacji internetowych czy mobilnych to nie tylko sam proces kodowania, lecz szereg aspektów związanych z programowaniem takich jak zarządzanie kodem źródłowym, testowanie, wdrażanie czy monitorowanie. W ciekawym sposób powyższe zagadnienia zostały opisane w dokumencie Twelve-Factor App, w którym zebrano 12 zasad rozwoju aplikacji. Poniżej krótko opiszę każdy z wymienionych aspektów. 

1. System kontroli wersji Link to heading

Kod aplikacji powinien być zarządzany w systemie kontroli wersji Git czy SVN. Pojedynczy program powinien mieć jedno źródło kodu, w przypadku systemów rozproszonych źródeł kodu może być wiele, jednak nie powinno być sytuacji, gdy wiele aplikacji dzieli ten sam kod.

2. Zależności Link to heading

Wszystkie zależności od innych bibliotek i framework’ów powinny być jasno zdefiniowane, aplikacja nie może zależeć od bibliotek zainstalowanych dla całego systemu.

3. Konfiguracja Link to heading

Między różnymi wdrożeniami aplikacji (produkcja, środowisko testowe, środowisko deweloperskie) jedyną różnicą powinna być konfiguracja (połączenia do baz danych, dane uwierzytelniające itd.) zapisana poza kodem źródłowym aplikacji np. w zmiennych środowiskowych lub w dedykowanych plikach.

4. Usługi wspierające Link to heading

Usługi wspierające (bazy danych, systemy kolejek, systemu cachowania pamięci) powinny być traktowane przez aplikacje jako zasoby dostępne np. za pomocą określonego URL, które nie są trwale z aplikacją związane np. można zmienić bazę danych z testowej na produkcyjną.

5. Buduj, publikuj, uruchamiaj Link to heading

Wdrażając aplikację wykonywane są 3 etapy:

  • budowanie kody wynikowego (np. kompilowanie),
  • publikowanie aplikacji (dołączenie do kodu wynikowego konfiguracji),
  • uruchomienie aplikacji.

6. Procesy Link to heading

Aplikacja powinny być uruchamiane jako pojedynczy proces lub kilka procesów, które są bezstanowe i nie współdzielające. W przypadku potrzeby zapisu / odczytu danych należy korzystać z zasobów zewnętrznych takich jak np. bazy danych.

7. Przydzielanie portów Link to heading

Aplikacja internetowa umożliwia komunikację z użyciem protokołów takich jak HTTP(S) czy FTP przez przydzielenie portu, na który inne systemy będą wysyłać żądania.

8. Współbieżność Link to heading

Aplikacja uruchomiona w 1 procesie może wykorzystywać wątki w maszynie wirtualnej Javy czy też asynchroniczny model wydarzeń dostępny w Node.js, by część zadań realizować równolegle i przyśpieszyć działania całej aplikacji, a także wykorzystać efektywnie dostępne zasoby sprzętowe.

9. Zbywalność Link to heading

Aplikacja może być uruchomiona lub zatrzymana w dowolnym momencie czasu. Czas uruchomienia aplikacji powinien być minimalnie krótki, natomiast jej zamknięcie powinno być bezproblemowe. Aplikacja powinna po otrzymaniu sygnału SIGTERM zatrzymać proces i zakończyć pracę.

10. Jednolitość środowisk Link to heading

Środowiska deweloperskie, testowe oraz produkcyjne powinny być do siebie jak najbardziej podobne, by było możliwe bardzo częste uruchamiania implementowanej aplikacji w każdym z środowisk w krótkim czasie.

11. Logi Link to heading

Aplikacja powinna traktować generowane logi jako strumień zdarzeń i nie powinna odpowiadać za ich przekierowywanie i zapis. Zaleca się, by korzystać z narzędzi do obsługi logów (takich jak Logplex lub Fluent).

12. Zarządzanie aplikacją Link to heading

Zadania administracyjne powinny być realizowane za pomocą pojedynczych procesów np. do migracji bazy danych czy uruchomienia konsoli. Kod zadania administracyjnego powinien być dołączony do kodu aplikacji. W zakresie możliwości dostępu do konsoli zaleca się używanie takich języków programowania, które udostępniają powłokę REPL np. poprzez wywołanie interpretera bez dodatkowych argumentów (np. python lub perl).