Tworzenie aplikacji to proces, w którym każdy etap musi być dokładnie zaplanowany i przemyślany. Na samym początku, jak w budowie domu, najważniejszym elementem jest solidna podstawa — fundamenty, które będą trzymać cały projekt. W kontekście tworzenia oprogramowania, fundamentem jest odpowiednia struktura aplikacji, którą budujemy, korzystając z odpowiednich narzędzi i technik. Z pomocą generatywnej sztucznej inteligencji (AI) proces ten staje się szybszy, bardziej precyzyjny i efektywny. Jednak, jak każda nowa technologia, wymaga ona odpowiedniego podejścia, aby w pełni wykorzystać jej potencjał. Jednym z kluczowych narzędzi w tym procesie jest tzw. stubbing — technika pozwalająca na szybkie stworzenie szkieletu aplikacji, zanim wdrożymy pełną funkcjonalność.
Stubbing polega na tworzeniu uproszczonych wersji komponentów oprogramowania, które mają na celu jedynie zarysowanie struktury aplikacji. Zamiast od razu implementować skomplikowane funkcje, tworzymy tzw. stuby — miejsca, które będą pełnić funkcję zastępczą, umożliwiając testowanie ogólnego działania aplikacji bez konieczności wdrażania pełnej logiki. Daje to możliwość wczesnego wykrywania problemów z integracją poszczególnych części aplikacji oraz umożliwia równoległą pracę zespołów nad różnymi komponentami.
Korzyści z używania stubbing są liczne:
-
Wczesna integracja — dzięki stubom możemy szybciej połączyć różne części aplikacji i zidentyfikować potencjalne problemy z kompatybilnością.
-
Równoległa praca — członkowie zespołu mogą pracować nad różnymi elementami aplikacji jednocześnie, używając stubów do symulowania zależności.
-
Testowalność — stuby pozwalają na testowanie poszczególnych komponentów aplikacji w kontrolowanym środowisku, co ułatwia identyfikację błędów.
-
Szybsza iteracja — tworzenie struktury aplikacji przed implementowaniem pełnej funkcjonalności pozwala na szybsze wprowadzanie zmian i mniejsze ryzyko błędów.
Przykład stuba może wyglądać następująco: jeśli tworzysz aplikację, która ma łączyć się z bazą danych, zamiast od razu pisać skomplikowany kod do połączenia, możesz stworzyć stub, który jedynie zasymuluje takie połączenie:
W tym przypadku, connect_to_database() oraz fetch_data() to stuby, które nie łączą się z rzeczywistą bazą danych, lecz jedynie wyświetlają komunikaty, co pozwala na testowanie innych części aplikacji, które będą z tych metod korzystać.
Ważne jest, aby tworzenie stubów było realizowane strategicznie. Powinniśmy tworzyć stuby najpierw dla funkcji, które będziemy implementować w przyszłości, a nie dla tych, które mogą nigdy nie zostać wprowadzone. Dobrym rozwiązaniem jest także używanie sztucznej inteligencji do generowania propozycji struktur klas czy podpisów metod, co może znacznie przyspieszyć proces. Warto jednak pamiętać, że stubbing nie polega tylko na szybkim generowaniu kodu — chodzi o stworzenie solidnego fundamentu, który umożliwi dalszy rozwój aplikacji.
Kolejnym ważnym etapem w tworzeniu oprogramowania jest wydobycie wymagań z dokumentu projektowego. Zrozumienie potrzeb i celów wszystkich interesariuszy to kluczowy element, który ma wpływ na sukces całego projektu. Niewłaściwie zrozumiane lub niekompletne wymagania mogą prowadzić do dużych opóźnień i problemów w realizacji. Wykorzystanie generatywnej sztucznej inteligencji w tym procesie pozwala na szybsze zebranie wymagań, ale także na ich lepsze zrozumienie i analizowanie.
Z narzędziami AI, jak ChatGPT czy Gemini, proces zbierania wymagań staje się znacznie prostszy. Dzięki ich zdolnościom analitycznym i przetwarzania języka naturalnego, możemy łatwiej zrozumieć, co dokładnie jest wymagane od naszego oprogramowania. Ważne jest jednak, aby nie polegać wyłącznie na AI — choć narzędzia te mogą znacznie wspomóc pracę, to ostateczna decyzja o funkcjonalności i kierunku rozwoju aplikacji powinna należeć do zespołu developerskiego.
W trakcie tego procesu ważnym krokiem jest również zachowanie krytycznego podejścia do wyników generowanych przez AI. AI może pomóc w opracowaniu prototypów i sugestii, ale każdy kod i sugestia muszą zostać zweryfikowane przez człowieka, aby upewnić się, że są poprawne i spełniają wymagania. Współpraca z AI nie oznacza oddania pełnej kontroli nad projektem — to narzędzie, które ma wspierać, a nie zastępować decyzyjność programisty.
Zrozumienie i wyciąganie wymagań z dokumentów projektowych to umiejętność, która pozwala na unikanie problemów w późniejszych etapach pracy. Istotne jest, aby wymagania były zrozumiane w sposób precyzyjny, a każdy element aplikacji był dopasowany do oczekiwań użytkowników i interesariuszy. Tylko wtedy będziemy mogli zbudować naprawdę użyteczne i sprawnie działające oprogramowanie.
Jak zoptymalizować zarządzanie sesjami w aplikacji webowej opartej na bazie danych?
Współczesne aplikacje webowe oparte na bazach danych wymagają skutecznego zarządzania sesjami, które stanowią fundament dla przechowywania i przetwarzania danych użytkownika. W tym przypadku, projektujemy aplikację, która pozwala na tworzenie sesji, przypisywanie do nich losowych zestawów pytań oraz rejestrowanie odpowiedzi. Kluczowym elementem procesu jest dbałość o poprawną strukturę bazy danych i odpowiednią organizację kodu.
Pierwszym krokiem w budowie aplikacji jest zaprojektowanie funkcji create_session(), która odpowiada za inicjalizację sesji. Celem tej funkcji jest przypisanie unikalnego identyfikatora do nowej sesji oraz dodanie jej do bazy danych. W początkowym etapie, implementacja tej metody wyglądała następująco: tworzono nową instancję obiektu DatabaseConnection, z którego następnie pozyskiwano kursor do wykonywania zapytań SQL. Jednak, jak pokazuje praktyka, takie podejście ma swoje ograniczenia, zwłaszcza w większych aplikacjach.
Zamiast wielokrotnie określać ścieżkę do bazy danych w różnych częściach aplikacji, lepiej jest zainwestować czas w przekazywanie tej ścieżki w jednym miejscu — na przykład bezpośrednio do klasy Session. Dzięki temu, każda sesja korzysta z tej samej instancji połączenia, co zapewnia lepszą organizację kodu i łatwiejsze zarządzanie połączeniami z bazą danych. Wprowadzenie tego typu refaktoryzacji polega na zmianie konstrukcji klasy Session tak, by przyjmowała kursor jako argument w konstruktorze i wykorzystywała go w całym dalszym przebiegu tworzenia sesji. Dzięki temu kod staje się bardziej przejrzysty i elastyczny.
Kolejnym krokiem jest integracja z klasą Questions, która odpowiada za losowanie pytań z bazy danych. Aby poprawnie wczytać i przypisać pytania do sesji, zastosowano metodę get_question_set(). Dzięki tej funkcji aplikacja pobiera zestaw 35 pytań i przypisuje je do nowo utworzonej sesji. Ważnym elementem tego procesu jest poprawne przypisanie każdego pytania do odpowiedniego zestawu, co możliwe jest dzięki zastosowaniu odpowiednich zapytań SQL. Wprowadzenie tej logiki do metody create_question_set pozwala na elastyczne zarządzanie pytaniami oraz ich prawidłowe powiązanie z identyfikatorem sesji.
Podczas dalszego rozwoju aplikacji okazało się, że proces tworzenia sesji i przypisywania pytań może zostać uproszczony i zoptymalizowany. Poprzez eliminację nadmiarowych połączeń z bazą danych i przekazanie już istniejącego kursora do metod odpowiedzialnych za dodawanie pytań, zmniejsza się obciążenie bazy danych, a aplikacja działa szybciej i sprawniej. Kluczowym rozwiązaniem w tym przypadku okazało się przypisanie obiektu Questions do instancji klasy Session, co pozwala na dostęp do bazy pytań przez przekazany kursor.
Ostatecznie, aplikacja z powodzeniem wczytuje dane i wyświetla je na stronie internetowej. W momencie uruchomienia aplikacji i wczytania strony, użytkownik widzi listę identyfikatorów pytań, co potwierdza poprawność wczytania zestawu pytań. Dodatkowo, dane wyświetlane w konsoli również wskazują na poprawne załadowanie sesji i pytań, co pozwala na dalszą weryfikację działania aplikacji.
Po przejściu przez proces refaktoryzacji, ważne jest, aby użytkownik aplikacji zrozumiał, że każda zmiana w strukturze bazy danych powinna wiązać się z odpowiednim testowaniem aplikacji w celu wykrycia ewentualnych błędów. Należy również pamiętać, że elastyczność kodu w kontekście zarządzania połączeniami z bazą danych, jak i organizacji zapytań, jest kluczowa dla utrzymania wysokiej jakości aplikacji, szczególnie w przypadku jej dalszego rozwoju.
Choć nasza aplikacja działa poprawnie i spełnia podstawowe funkcje, takie jak tworzenie sesji, przypisywanie pytań i rejestrowanie odpowiedzi, to proces ten jest tylko częścią większej całości. Przed nami dalsza praca nad dodaniem kolejnych funkcjonalności, takich jak obsługa odpowiedzi użytkowników, analiza wyników testu czy prezentacja szczegółowych statystyk.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский