Lista kontrolna dotycząca metodyki DevOps

Metodyka DevOps to integracja programowania, zapewniania jakości i operacji IT w ujednoliconą kulturę i zestaw procesów do dostarczania oprogramowania. Ta lista kontrolna jest punktem wyjścia, aby ocenić kulturę i proces Metodyki DevOps.

Kultura

Zapewnienie zgodności biznesowej między organizacjami i zespołami. Konflikty związane z zasobami, celami, celami i priorytetami w organizacji mogą stanowić zagrożenie dla pomyślnych operacji. Upewnij się, że zespoły biznesowe, programistyczne i zespoły operacyjne są dopasowane.

Upewnij się, że twój zespół rozumie cykl życia oprogramowania. Twój zespół musi zrozumieć ogólny cykl życia aplikacji oraz miejsce, w którym każda aplikacja znajduje się w tym cyklu życia. Dzięki tym informacjom wszyscy członkowie zespołu wiedzą, co powinni teraz robić, i co powinni zaplanować i przygotować się na przyszłość.

Zmniejsz czas cyklu. Staraj się zminimalizować czas potrzebny na przejście od pomysłów do użytecznego oprogramowania. Ogranicz rozmiar i zakres poszczególnych wydań, aby utrzymać niskie obciążenie testowe. Automatyzowanie procesów kompilacji, testowania, konfiguracji i wdrażania, gdy jest to możliwe. Wyczyść wszelkie przeszkody w komunikacji między deweloperami i między deweloperami i zespołami operacyjnymi.

Przeglądanie i ulepszanie procesów. Procesy i procedury, zarówno zautomatyzowane, jak i ręczne, nigdy nie są ostateczne. Skonfiguruj regularne przeglądy bieżących przepływów pracy, procedur i dokumentacji z celem ciągłego ulepszania.

Wykonaj proaktywne planowanie. Proaktywne planowanie awarii. Mieć procesy umożliwiające szybkie identyfikowanie problemów, gdy wystąpią, eskalowanie problemów do odpowiednich członków zespołu w celu ich rozwiązania i potwierdzenie ich rozwiązania.

Poznaj błędy. Błędy są nieuniknione, ale ważne jest, aby nauczyć się z błędów, aby uniknąć ich powtarzania. Jeśli wystąpi awaria operacyjna, klasyfikacja problemu, udokumentowanie przyczyny i rozwiązania oraz udostępnienie wszelkich lekcji, które poznasz. Jeśli to możliwe, zaktualizuj procesy kompilacji, aby automatycznie wykrywać takie błędy w przyszłości.

Optymalizuj pod kątem szybkości i zbieraj dane. Każda planowana poprawa jest hipotezą. Pracuj w najmniejszych przyrostach, które są możliwe. Traktuj nowe pomysły jako eksperymenty. Instrumentowanie eksperymentów w celu zbierania danych produkcyjnych w celu oceny skuteczności eksperymentu. Bądź gotowy do szybkiego niepowodzenia, jeśli hipoteza jest błędna.

Poczekaj na naukę. Niepowodzenia i sukcesy zapewniają możliwości nauki. Zanim przejdziesz do nowych projektów, poczekaj na zebranie ważnych lekcji i upewnij się, że twój zespół absorbuje te lekcje. Zapewnij również zespołowi czas na rozwijanie umiejętności, eksperymentowanie i poznawanie nowych narzędzi i technik.

Operacje na dokumentach. Udokumentowanie wszystkich narzędzi, procesów i zautomatyzowanych zadań o tym samym poziomie jakości co kod produktu. Udokumentowanie bieżącego projektu i architektury wszystkich systemów, które są obsługiwane, wraz z procesami odzyskiwania i innymi procedurami konserwacji. Skoncentruj się na krokach, które faktycznie wykonujesz, a nie teoretycznie optymalnych procesów. Regularnie przeglądaj i aktualizuj dokumentację. W przypadku kodu pamiętaj, aby uwzględnić znaczące komentarze, zwłaszcza w publicznych interfejsach API. Użyj narzędzi do automatycznego generowania dokumentacji kodu, gdy jest to możliwe.

Podziel się wiedzą. Dokumentacja jest przydatna tylko wtedy, gdy ludzie wiedzą, że istnieje i mogą ją znaleźć. Zachowaj uporządkowaną dokumentację i łatwo ją odnajduj. Bądź kreatywny: używaj brązowych toreb (prezentacji nieformalnych), filmów lub biuletynów, aby dzielić się wiedzą.

Opracowywanie zawartości

Zapewnij deweloperom środowiska przypominające środowisko produkcyjne. Jeśli środowiska programistyczne i testowe nie pasują do środowiska produkcyjnego, trudno jest przetestować i zdiagnozować problemy. Zachowaj możliwie jak najbardziej zbliżone środowiska programistyczne i testowe do środowiska produkcyjnego. Upewnij się, że dane testowe są zgodne z danymi używanymi w środowisku produkcyjnym, nawet jeśli są to przykładowe dane, a nie rzeczywiste dane produkcyjne (ze względu na prywatność lub zgodność). Zaplanuj generowanie i anonimizowanie przykładowych danych testowych.

Upewnij się, że wszyscy autoryzowani członkowie zespołu mogą aprowizować infrastrukturę i wdrażać aplikacje. Konfigurowanie zasobów przypominających środowisko produkcyjne i wdrażanie aplikacji nie powinno obejmować skomplikowanych zadań ręcznych ani szczegółowej wiedzy technicznej dotyczącej systemu. Każda osoba mająca odpowiednie uprawnienia powinna mieć możliwość tworzenia lub wdrażania zasobów przypominających środowisko produkcyjne bez przechodzenia do zespołu operacyjnego.

To zalecenie nie oznacza, że każda osoba może wypychać aktualizacje na żywo do wdrożenia produkcyjnego. Chodzi o zmniejszenie tarć dla zespołów programistycznych i QA w celu tworzenia środowisk przypominających środowisko produkcyjne.

Instrumentacja każdej aplikacji na potrzeby szczegółowych informacji. Aby zrozumieć kondycję aplikacji, musisz wiedzieć, jak działają i czy występują błędy lub problemy. Zawsze dołączaj instrumentację jako wymaganie projektowe i od samego początku kompiluj instrumentację w każdej aplikacji. Instrumentacja musi obejmować rejestrowanie zdarzeń na potrzeby analizy głównej przyczyny, ale także dane telemetryczne i metryki w celu monitorowania kondycji i użycia każdej aplikacji.

Śledzenie długu technicznego. Wiele projektów określa priorytety harmonogramów wydania dla jakości kodu do jednego lub innego stopnia. Zawsze dokumentuj, gdy skróty są wykonywane lub inne nieoptymalne implementacje i zaplanuj czas ponownego przejrzenia tych problemów.

Rozważ wypychanie aktualizacji bezpośrednio do środowiska produkcyjnego. Aby skrócić ogólny czas cyklu wydania, rozważ wypchnięcie prawidłowo przetestowanych zatwierdzeń kodu bezpośrednio do środowiska produkcyjnego. Użyj przełączania funkcji, aby kontrolować, które funkcje są włączone. Następnie możesz szybko przejść z programowania do wydania, przełączając się, aby włączyć lub wyłączyć funkcje. Przełączanie jest również przydatne podczas wykonywania testów, takich jak wydania kanarne, w których wdrażasz określoną funkcję w podzestawie środowiska produkcyjnego.

Testowanie

Automatyzowanie testowania. Ręczne testowanie oprogramowania jest żmudne i podatne na błędy. Automatyzowanie typowych zadań testowania i integrowanie testów z procesami kompilacji. Testowanie automatyczne zapewnia spójne pokrycie testowe i powtarzalność. Po uruchomieniu zintegrowanych testów interfejsu użytkownika użyj również zautomatyzowanego narzędzia. Platforma Azure oferuje zasoby programistyczne i testowe, które mogą pomóc w konfigurowaniu i uruchamianiu testów. Aby uzyskać więcej informacji, zobacz Programowanie i testowanie na platformie Azure.

Testowanie pod kątem błędów. Gdy system nie może nawiązać połączenia z usługą, system powinien bezpiecznie reagować. A gdy usługa będzie ponownie dostępna, system powinien odzyskać. Przetestuj testy polegających na wstrzyknięciu błędów w standardowej części przeglądu w środowiskach testowych i przejściowych. Gdy proces i praktyki testowe są dojrzałe, rozważ uruchomienie tych testów w środowisku produkcyjnym.

Testowanie w produkcji. Proces wydania nie kończy się wdrażaniem w środowisku produkcyjnym. Mieć testy, aby upewnić się, że wdrożony kod działa zgodnie z oczekiwaniami. W przypadku wdrożeń, które są często aktualizowane, zaplanuj testowanie produkcyjne w ramach regularnej konserwacji.

Automatyzowanie testów wydajnościowych w celu wczesnego identyfikowania problemów z wydajnością. Wpływ poważnego problemu z wydajnością może być tak poważny, jak usterka w kodzie. Mimo że zautomatyzowane testy funkcjonalne mogą zapobiec usterce aplikacji, te testy mogą nie wykrywać problemów z wydajnością. Zdefiniuj dopuszczalne cele wydajności dla metryk, takich jak opóźnienia, czasy ładowania i użycie zasobów. Uwzględnij zautomatyzowane testy wydajnościowe w potoku wydania, aby upewnić się, że aplikacja spełnia te cele.

Przeprowadź testowanie pojemności. Aplikacja może działać prawidłowo w warunkach testowych, a następnie mieć problemy w środowisku produkcyjnym z powodu ograniczeń skali lub zasobów. Zawsze należy zdefiniować maksymalną oczekiwaną pojemność i limity użycia. Przetestuj, aby upewnić się, że aplikacja może obsłużyć te limity, ale także przetestować, co się stanie po przekroczeniu tych limitów. Przeprowadzanie testów pojemności w regularnych odstępach czasu.

Po początkowej wersji należy uruchomić testy wydajności i wydajności za każdym razem, gdy zaktualizujesz kod produkcyjny. Użyj danych historycznych, aby dostroić testy i określić typy testów, które należy wykonać.

Przeprowadź zautomatyzowane testy penetracyjne zabezpieczeń. Zapewnienie bezpieczeństwa aplikacji jest równie ważne, jak testowanie innych funkcji. Przetestuj testy penetracyjne w warstwie Standardowa procesu kompilacji i wdrażania. Zaplanuj regularne testy zabezpieczeń i skanowanie luk w zabezpieczeniach na wdrożonych aplikacjach, monitorowanie otwartych portów, punktów końcowych i ataków. Testowanie automatyczne nie eliminuje potrzeby dogłębnych przeglądów zabezpieczeń w regularnych odstępach czasu.

Przeprowadź zautomatyzowane testowanie ciągłości działania. Twórz testy zapewniające ciągłość działania na dużą skalę, w tym odzyskiwanie kopii zapasowych i tryb failover. Konfigurowanie zautomatyzowanych procesów w celu regularnego wykonywania tych testów.

Zwolnij

Automatyzowanie wdrożeń. Automatyzacja zapewnia wiele korzyści, takich jak:

  • Włączanie szybszych i bardziej niezawodnych wdrożeń.
  • Zapewnienie spójnych wdrożeń w dowolnym obsługiwanym środowisku, w tym testach, przejściowych i produkcyjnych.
  • Usunięcie ryzyka błędu ludzkiego, które mogą wprowadzać wdrożenia ręczne.
  • Ułatwia planowanie wydań w wygodnych czasach, co minimalizuje wszelkie skutki potencjalnych przestojów.

Zautomatyzuj proces wdrażania każdej aplikacji w środowiskach testowych, przejściowych i produkcyjnych. Systemy mają na miejscu wykrywać wszelkie problemy podczas wdrażania i mieć zautomatyzowany sposób wprowadzania poprawek lub wycofywania zmian.

Użyj ciągłej integracji. Ciągła integracja (CI) to praktyka scalania całego kodu dewelopera do centralnego kodu opartego na regularnym harmonogramie, a następnie automatycznego wykonywania standardowych procesów kompilacji i testowania. Ciągła integracja zapewnia, że cały zespół może pracować nad bazą kodu w tym samym czasie bez konfliktów. Ciągła integracja pomaga również znaleźć wady kodu tak szybko, jak to możliwe. Najlepiej, aby proces ciągłej integracji był uruchamiany za każdym razem, gdy zatwierdzisz lub zaewidencjonujesz kod. Powinien działać co najmniej raz dziennie.

Rozważ wdrożenie modelu programowania opartego na magistrali. W tym modelu deweloperzy zatwierdzają pojedynczą gałąź (magistralę). Istnieje wymaganie, aby zatwierdzenia nigdy nie przerywały kompilacji. Ten model ułatwia ciągłą integrację, ponieważ wszystkie funkcje działają w magistrali i są rozwiązywane konflikty scalania po każdym zatwierdzeniu.

Rozważ użycie ciągłego dostarczania. Ciągłe dostarczanie (CD) to praktyka zapewnienia, że kod jest zawsze gotowy do wdrożenia, automatycznie kompilując, testując i wdrażając kod w środowiskach przypominających środowisko produkcyjne. Dodanie ciągłego wdrażania w celu utworzenia pełnego potoku ciągłej integracji/ciągłego wdrażania pomaga wykrywać wady kodu tak szybko, jak to możliwe. Gwarantuje to również, że w krótkim czasie można wydać odpowiednio przetestowane aktualizacje.

Ciągłe wdrażanie to proces, który automatycznie pobiera wszystkie aktualizacje przekazywane przez potok ciągłej integracji/ciągłego wdrażania i wdraża je w środowisku produkcyjnym. Ciągłe wdrażanie wymaga niezawodnego automatycznego testowania i zaawansowanego planowania procesów. Może to nie być odpowiednie dla wszystkich zespołów.

Wprowadź małe, przyrostowe zmiany. Duże zmiany kodu mają większy potencjał, aby wprowadzić błędy niż mniejsze. Zawsze, gdy to możliwe, zachowaj niewielkie zmiany. Pozwala to ograniczyć potencjalne skutki każdej zmiany i uprościć zadanie zrozumienia i debugowania problemów.

Kontrolowanie narażenia na zmiany. Upewnij się, że masz kontrolę nad tym, kiedy aktualizacje staną się widoczne dla użytkowników końcowych. Rozważ użycie przełączania funkcji, aby kontrolować, kiedy włączasz funkcje dla użytkowników końcowych.

Zaimplementuj strategie zarządzania wydaniami, aby zmniejszyć ryzyko wdrożenia. Wdrażanie aktualizacji aplikacji w środowisku produkcyjnym zawsze wiąże się z pewnym ryzykiem. Aby zminimalizować to ryzyko, użyj strategii, takich jak wersje kanarne lub wdrożenia niebieskie/zielone, aby wdrożyć aktualizacje w podzestawie użytkowników. Upewnij się, że każda aktualizacja działa zgodnie z oczekiwaniami, a następnie wdrożyć każdą aktualizację w pozostałej części systemu.

Dokumentowanie wszystkich zmian. Drobne aktualizacje i zmiany konfiguracji mogą być źródłem nieporozumień i konfliktów wersji. Zawsze zachowaj jasny zapis wszelkich zmian, bez względu na to, jak małe. Zarejestruj wszystkie zmiany, w tym zastosowane poprawki, zmiany zasad i zmiany konfiguracji. Rekord zmian powinien być widoczny dla całego zespołu. Nie uwzględniaj jednak poufnych danych w tych dziennikach. Na przykład zarejestruj, czy poświadczenie zostało zaktualizowane i kto dokonał zmiany, ale nie rejestruje zaktualizowanych poświadczeń.

Rozważ wprowadzenie niezmiennej infrastruktury. Niezmienna infrastruktura jest oparta na zasadzie, że nie należy modyfikować infrastruktury po wdrożeniu jej w środowisku produkcyjnym. W przeciwnym razie możesz przejść do stanu, w którym zastosowano zmiany ad hoc, co utrudnia poznanie dokładnie tego, co się zmieniło. Niezmienna infrastruktura działa przez zastąpienie całych serwerów w ramach każdego nowego wdrożenia. Dzięki temu podejściu można przetestować i wdrożyć kod oraz środowisko hostingu jako blok. Po wdrożeniu nie można modyfikować składników infrastruktury do czasu następnego cyklu kompilacji i wdrażania.

Monitorowanie

Obserwuj systemy. Twój zespół operacyjny powinien zawsze mieć jasny wgląd w kondycję i stan systemu lub usługi. Konfigurowanie zewnętrznych punktów końcowych kondycji w celu monitorowania stanu i aplikacji kodu w celu instrumentowania metryk operacji. Użyj wspólnego i spójnego schematu, który ułatwia korelowanie zdarzeń między systemami. Standardową metodą śledzenia kondycji i stanu zasobów platformy Azure jest użycie Diagnostyka Azure i Szczegółowe informacje aplikacji. Usługa Azure Monitor zapewnia również scentralizowane monitorowanie i zarządzanie rozwiązaniami chmurowymi lub hybrydowymi.

Agregowanie i korelowanie dzienników i metryk. Prawidłowo instrumentowany system telemetrii zapewnia dużą ilość nieprzetworzonych danych wydajności i dzienników zdarzeń. Upewnij się, że system przetwarza i szybko koreluje dane telemetryczne i dane dziennika, dzięki czemu pracownicy operacyjni zawsze mają aktualny obraz kondycji systemu. Organizuj i wyświetlaj dane, aby mieć spójny widok problemów i zobaczyć, kiedy zdarzenia są ze sobą powiązane.

Zapoznaj się z zasadami przechowywania firmowego, aby uzyskać wymagania dotyczące sposobu przetwarzania danych i czasu przechowywania danych.

Implementowanie zautomatyzowanych alertów i powiadomień. Skonfiguruj narzędzia do monitorowania, takie jak Monitor , aby wykrywać wzorce lub warunki wskazujące potencjalne lub bieżące problemy. Wysyłaj alerty do członków zespołu, którzy mogą rozwiązywać problemy. Dostosuj alerty, aby uniknąć wyników fałszywie dodatnich.

Monitorowanie zasobów i zasobów pod kątem wygasania. Niektóre zasoby i zasoby, takie jak certyfikaty, wygasają. Pamiętaj, aby śledzić, które zasoby wygasają, kiedy wygasają i jakie usługi lub funkcje zależą od nich. Użyj zautomatyzowanych procesów do monitorowania tych zasobów. Powiadom zespół operacyjny przed wygaśnięciem zasobu i eskaluj sytuację, jeśli wygaśnięcie zagraża zakłócaniu działania aplikacji.

Zarządzanie

Automatyzowanie zadań operacyjnych. Ręczne obsługiwanie powtarzających się procesów operacji jest podatne na błędy. Zautomatyzuj te zadania zawsze, gdy jest to możliwe, aby zapewnić spójne wykonywanie i jakość. Użyj kontroli źródła do kodu wersji, który implementuje automatyzację. Podobnie jak w przypadku dowolnego innego kodu, przetestuj narzędzia automatyzacji.

Weź pod uwagę podejście infrastruktury jako kodu do aprowizacji. Zminimalizuj ilość konfiguracji ręcznej potrzebnej do aprowizowania zasobów. Zamiast tego użyj skryptów i szablonów usługi Azure Resource Manager . Zachowaj skrypty i szablony w kontroli źródła, podobnie jak każdy inny kod, który utrzymujesz.

Rozważ użycie kontenerów. Kontenery zapewniają standardowy interfejs oparty na pakietach na potrzeby wdrażania aplikacji. W przypadku korzystania z kontenerów aplikacja jest wdrażana przy użyciu pakietów samodzielnie zawierających dowolne oprogramowanie, zależności i pliki, które należy uruchomić aplikację. Ta praktyka znacznie upraszcza proces wdrażania.

Kontenery tworzą również warstwę abstrakcji między aplikacją a bazowym systemem operacyjnym, co zapewnia spójność w różnych środowiskach. Ta abstrakcja może również odizolować kontener od innych procesów lub aplikacji uruchamianych na hoście.

Implementowanie odporności i samonaprawiania. Odporność to zdolność aplikacji do odzyskiwania po awariach. Strategie odporności obejmują ponawianie prób przejściowych awarii i przechodzenie w tryb failover do wystąpienia pomocniczego, a nawet do innego regionu. Aby uzyskać więcej informacji, zobacz Projektowanie niezawodnych aplikacji platformy Azure. Instrumentacja aplikacji w celu natychmiastowego zgłaszania problemów w celu zarządzania awariami lub innymi awariami systemu.

Ręczne wykonywanie operacji. Podręcznik operacji lub element Runbook dokumentuje procedury i informacje o zarządzaniu, które są potrzebne personelowi operacyjnemu do obsługi systemu. Ponadto udokumentować wszelkie scenariusze operacji i plany ograniczania ryzyka, które mogą być w trakcie awarii lub innych zakłóceń w usłudze. Utwórz tę dokumentację podczas procesu programowania i zachowaj jej aktualność później. Traktuj te zasoby jako dokumenty żywe, które należy regularnie przeglądać, testować i ulepszać.

Udostępniona dokumentacja ma kluczowe znaczenie. Zachęcaj członków zespołu do współtworzenia i dzielenia się wiedzą. Cały zespół powinien mieć dostęp do dokumentów. Ułatwianie wszystkim osobom w zespole aktualizowania dokumentów.

Dokumentowanie procedur na wezwanie. Pamiętaj, aby udokumentować obowiązki na wezwanie, harmonogramy i procedury oraz udostępnić je wszystkim członkom zespołu. Zawsze aktualizuj te informacje.

Udokumentowanie procedur eskalacji zależności innych firm. Jeśli aplikacja zależy od zewnętrznych usług innych firm, które nie są bezpośrednio sterowane, potrzebujesz planu obsługi awarii. Utwórz dokumentację dla planowanych procesów ograniczania ryzyka. Dołącz kontakty pomocy technicznej i ścieżki eskalacji.

Użyj zarządzania konfiguracją. Planowanie zmian konfiguracji, uwidocznij je na operacjach i rejestruj je. W tych celach można użyć bazy danych zarządzania konfiguracją lub podejścia konfiguracji jako kodu. Regularnie przeprowadzaj inspekcję konfiguracji, aby upewnić się, że oczekiwane ustawienia są rzeczywiście spełnione.

Uzyskaj plan pomoc techniczna platformy Azure i zapoznaj się z procesem pomocy technicznej. Platforma Azure oferuje wiele planów pomocy technicznej. Określ odpowiedni plan dla Twoich potrzeb i upewnij się, że cały zespół wie, jak używać planu. Członkowie zespołu powinni zrozumieć szczegóły planu, sposób działania procesu pomocy technicznej oraz jak otworzyć bilet pomocy technicznej na platformie Azure. Jeśli spodziewasz się zdarzenia o dużej skali, pomoc techniczna platformy Azure może pomóc w zwiększeniu limitów usługi. Aby uzyskać więcej informacji, zobacz często zadawane pytania dotyczące planów pomoc techniczna platformy Azure.

Postępuj zgodnie z zasadami dotyczącymi najniższych uprawnień, gdy udzielasz dostępu do zasobów. Starannie zarządzaj dostępem do zasobów. Odmowa dostępu domyślnie, chyba że jawnie przyznasz użytkownikowi dostęp do zasobu. Przyznaj użytkownikom dostęp tylko do tego, czego potrzebują do wykonywania swoich zadań. Śledź uprawnienia użytkowników i przeprowadzaj regularne inspekcje zabezpieczeń.

Użyj kontroli dostępu opartej na rolach platformy Azure. Przypisywanie kont użytkowników i uzyskiwanie dostępu do zasobów nie powinno być procesem ręcznym. Użyj kontroli dostępu opartej na rolach (RBAC) platformy Azure, aby udzielić dostępu opartego na tożsamościach i grupach microsoft Entra ID .

Użyj systemu śledzenia usterek, aby śledzić problemy. Bez dobrego sposobu śledzenia problemów łatwo przegapić elementy, zduplikować pracę lub wprowadzić nowe problemy. Nie polegaj na nieformalnej komunikacji między osobami w celu śledzenia stanu usterek. Użyj narzędzia do śledzenia usterek, aby rejestrować szczegółowe informacje o problemach, przypisywać zasoby, aby je rozwiązać, i udostępniać dziennik inspekcji postępu i stanu.

Zarządzanie wszystkimi zasobami w systemie zarządzania zmianami. Jeśli uwzględnisz wszystkie aspekty procesu DevOps w systemie zarządzania i przechowywania wersji, możesz łatwo śledzić i przeprowadzać inspekcję zmian. Dołącz kod, infrastrukturę, konfigurację, dokumentację i skrypty. Traktuj wszystkie te typy zasobów jako kod w procesie testowania, kompilowania i przeglądania.

Użyj list kontrolnych. Listy kontrolne operacji mogą pomóc w obserwowaniu procesów. Łatwo jest przegapić coś w dużej instrukcji ręcznej, ale po liście kontrolnej można wymusić uwagę na szczegóły, które w przeciwnym razie można pominąć. Zachowaj listy kontrolne i stale poszukaj sposobów automatyzowania zadań i usprawniania procesów.

Następne kroki