====== Propozycje tematów ====== 1. **Narzędzia wspierające pracę zespołów programistycznych: DevOps i CI/CD** (ciągła integracja, ciągłe dostarczanie i ciągłe wdrażanie). * [[https://azure.microsoft.com/pl-pl/products/devops|Azure DevOps]] * **Boards** do planowania pracy * **Repos** do przechowywania kodu * **Pipelines** do automatyzacji budowania, testowania oraz wdrażania * **Artifacts** do przechowywania i udostępniania artefaktów budowania * **Test Plans** do zarządzania testami Prezentacja może być przygotowana przez zespół. Każdy członek kilkuosobowego zespołu powinien aktywnie uczestniczyć w prezentacji, która powinna demonstrować kompletny proces wytwarzania oprogramowania wspólnego projektu, np. realizowanego w ramach Pracowni Programowania Zespołowego. Dobrze jest pokazać: * organizację pracy zespołu: podział zadań, system zgłoszeń (issue tracker) oraz wybraną metodykę, np. Scrum; * repozytorium kodu i zespołowy sposób pracy z systemem kontroli wersji, np. GitHub Flow lub [[https://dev.to/heratpatel/git-flow-a-successful-git-branching-model-1j6f|Git Flow]]; * przykładowy przepływ zmian: gałąź -> commit -> pull request -> przegląd kodu i testy -> scalenie zmian -> wdrożenie; * automatyzację budowania, testowania i wdrażania projektu. W przypadku indywidualnych prezentacji wystarczy zademonstrować działanie jednego z narzędzi lub procesów opisanych powyżej. Inne narzędzia CI/CD i wspierające pracę zespołów programistycznych, które można rozważyć: * [[https://bitbucket.org/product/features/pipelines|Bitbucket Pipelines]]: usługa CI/CD zintegrowana z repozytoriami Bitbucket. * [[https://about.gitlab.com/|GitLab]]: platforma łącząca repozytoria, zgłoszenia, przegląd kodu i CI/CD. * Można również omówić integrację wybranej platformy z innymi usługami, np. GitHub. 2. **Automatyzacja budowania i testowania** * [[https://cmake.org/|CMake]]: konfiguracja procesu budowania projektów C i C%%++%%. * [[https://maven.apache.org/|Maven]] lub [[https://gradle.org/|Gradle]]: budowanie projektów Java i zarządzanie ich zależnościami. * [[https://www.npmjs.com/|npm]]: zarządzanie zależnościami i skryptami w projektach JavaScript i TypeScript. * [[https://github.com/features/actions|GitHub Actions]]: definiowanie workflow do budowania, testowania i wdrażania, uruchamianych w odpowiedzi na zdarzenia w repozytorium. * [[https://docs.github.com/en/actions/hosting-your-own-runners|Self-hosted runners for GitHub Actions]]: uruchamianie workflow na własnych maszynach. * [[https://trunk.io/|Trunk]]: narzędzia wspierające kontrolę jakości kodu i automatyzację zadań deweloperskich. * [[https://pre-commit.com/|pre-commit]]: zarządzanie kontrolami uruchamianymi przed zatwierdzeniem zmian, np. formatowaniem i analizą kodu. * Serwery CI/CD: [[https://www.jenkins.io/|Jenkins]], [[https://docs.buildbot.net/latest/index.html|Buildbot]], [[https://docs.gitlab.com/ee/ci/|GitLab CI/CD]]. 3. **Statyczna analiza kodu, formatowanie, refaktoryzacja i generowanie kodu** * [[https://www.jetbrains.com/resharper/|ReSharper]]: narzędzia dla C# i .NET do analizy, nawigacji i refaktoryzacji kodu. * [[https://clang.llvm.org/|Clang]], [[https://clang.llvm.org/extra/clang-tidy/|Clang-Tidy]] i [[https://clang.llvm.org/docs/ClangFormat.html|Clang-Format]]: kompilator, analiza statyczna i automatyczne formatowanie kodu C/C%%++%%. * Włączanie analizy i formatowania do lokalnego workflow oraz potoków CI. 4. **Techniki izolowania testowanego kodu i obiekty testowe w testach jednostkowych** * Atrapy (mocki), stuby i inne obiekty testowe: czym się różnią i kiedy warto ich używać. * Biblioteki dla .NET: [[https://github.com/devlooped/moq|Moq]], [[https://fakeiteasy.github.io/|FakeItEasy]] i [[https://nsubstitute.github.io/|NSubstitute]]. * [[https://site.mockito.org/|Mockito]]: biblioteka do tworzenia obiektów testowych w Javie. 5. **Generowanie testów i danych testowych** * [[https://autofixture.github.io/|AutoFixture]] oraz atrybut `AutoData`: automatyczne przygotowywanie danych testowych. * Narzędzia AI do generowania testów: weryfikacja poprawności i przydatności wygenerowanych przypadków. 6. **Profilowanie i diagnostyka aplikacji** * Narzędzia diagnostyczne Visual Studio: profilowanie instrumentacyjne i statystyczne (sampling), analiza wydajności oraz diagnostyka pamięci. * Narzędzia JetBrains [[https://www.jetbrains.com/dotmemory/|dotMemory]] i [[https://www.jetbrains.com/dottrace/|dotTrace]]: analiza użycia pamięci i wydajności aplikacji .NET. * [[https://github.com/google/orbit|Orbit]]: profiler do analizy wydajności aplikacji m.in. w C/C%%++%%, Rust i Go. * [[https://sourceware.org/binutils/docs/gprof/|gprof]]: profiler dla programów w C i C%%++%%. * [[https://valgrind.org/info/tools.html|Valgrind]]: narzędzia do wykrywania błędów pamięci i profilowania programów w systemie Linux. 7. **Konteneryzacja** * [[https://www.docker.com/|Docker]]: budowanie obrazów i uruchamianie aplikacji w kontenerach. * [[https://podman.io/|Podman]]: narzędzie zgodne z wieloma poleceniami Dockera, umożliwiające uruchamianie kontenerów bez uprawnień administratora. * [[https://docs.docker.com/compose/|Docker Compose]]: definiowanie i uruchamianie aplikacji składających się z wielu usług. * [[https://kubernetes.io/|Kubernetes]]: wdrażanie, skalowanie i zarządzanie aplikacjami składającymi się z kontenerów. 8. **Wykorzystanie narzędzi AI w procesie wytwarzania oprogramowania** * Generowanie i objaśnianie kodu, automatyczna recenzja zmian, tworzenie opisów commitów oraz generowanie testów jednostkowych. * Konfigurowanie agentów programistycznych, np. w VS Code z GitHub Copilot. * [[https://ollama.com/|Ollama]]: uruchamianie modeli językowych lokalnie. * Weryfikacja wyników generowanych przez AI, ograniczenia narzędzi i ochrona poufnego kodu. 9. **Inne narzędzia** Zaproponujcie narzędzie lub praktykę stosowaną w branży, której nie obejmują powyższe tematy i która nie jest ujęta w programie innych przedmiotów na kierunku IS. Jakich narzędzi używacie w pracy lub projektach?