Programowanie z AI - Generowanie i Wyjaśnianie Kodu
AI jako partner programisty
Dział zatytułowany „AI jako partner programisty”Narzędzia takie jak GitHub Copilot, ChatGPT czy Claude potrafią generować kod, wyjaśniać złożone fragmenty, pomagać w debugowaniu i automatyzować rutynowe zadania. Traktuj je jak bardzo szybkiego juniora: nadrabia tempem, ale wszystko po nim sprawdzasz. Pokażę Ci, jak korzystać z nich w codziennej pracy - i czego nie oddawać modelowi bez sprawdzenia.
Generowanie kodu z opisu
Dział zatytułowany „Generowanie kodu z opisu”Najprostsze zastosowanie - opisujesz, co chcesz osiągnąć, a AI generuje kod.
Podstawowe generowanie:
Napisz funkcję w Pythonie, która:- Przyjmuje listę liczb- Zwraca tylko liczby parzyste- Sortuje wynik malejącodef filter_and_sort_even(numbers): """ Filtruje liczby parzyste i sortuje malejąco.
Args: numbers: Lista liczb
Returns: Lista parzystych liczb posortowanych malejąco """ even_numbers = [n for n in numbers if n % 2 == 0] return sorted(even_numbers, reverse=True)
# Przykład użycianumbers = [1, 4, 7, 2, 9, 8, 3, 6]result = filter_and_sort_even(numbers)print(result) # [8, 6, 4, 2]Generowanie z komentarzami - możesz też pisać specyfikację jako komentarze, a AI wypełni kod:
Wypełnij poniższy kod zgodnie z komentarzami:
def process_user_data(users): # 1. Filtruj użytkowników powyżej 18 lat # 2. Wyodrębnij tylko imiona i emaile # 3. Posortuj alfabetycznie po imieniu # 4. Zwróć jako listę słowników passGenerowanie zapytań SQL
Dział zatytułowany „Generowanie zapytań SQL”AI doskonale radzi sobie z SQL - wystarczy opisać strukturę bazy i zadanie.
Baza danych ma następujące tabele:
Tabela: departmentsKolumny: DepartmentId (INT, PK), DepartmentName (VARCHAR)
Tabela: studentsKolumny: StudentId (INT, PK), StudentName (VARCHAR), DepartmentId (INT, FK), EnrollmentDate (DATE)
Tabela: coursesKolumny: CourseId (INT, PK), CourseName (VARCHAR), Credits (INT)
Tabela: enrollmentsKolumny: StudentId (INT, FK), CourseId (INT, FK), Grade (DECIMAL)
Napisz zapytanie SQL, które:Znajdzie wszystkich studentów z działu "Computer Science",którzy mają średnią ocen powyżej 4.0,posortowanych po średniej malejąco.SELECT s.StudentId, s.StudentName, d.DepartmentName, AVG(e.Grade) as AverageGradeFROM students sJOIN departments d ON s.DepartmentId = d.DepartmentIdJOIN enrollments e ON s.StudentId = e.StudentIdWHERE d.DepartmentName = 'Computer Science'GROUP BY s.StudentId, s.StudentName, d.DepartmentNameHAVING AVG(e.Grade) > 4.0ORDER BY AverageGrade DESC;Wyjaśnianie kodu
Dział zatytułowany „Wyjaśnianie kodu”AI potrafi wyjaśnić działanie skomplikowanego kodu w przystępny sposób.
Wyjaśnij poniższy kod Python linijka po linijce.Skieruj wyjaśnienie do początkującego programisty.
def memoize(func): cache = {} def wrapper(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrapper
@memoizedef fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2)Możesz dostosować poziom szczegółowości: “Wyjaśnij jak dla kogoś, kto dopiero uczy się programować” (dla początkującego), “Wyjaśnij działanie, skupiając się na wzorcach projektowych” (średnio-zaawansowany), “Przeanalizuj złożoność obliczeniową i optymalizacje” (zaawansowany).
Debugging z AI
Dział zatytułowany „Debugging z AI”AI może pomóc znaleźć i naprawić błędy w kodzie.
Znajdowanie błędów:
Ten kod powinien odwracać string, ale nie działa poprawnie.Znajdź błąd i go napraw.
def reverse_string(s): result = "" for i in range(len(s)): result += s[i] return result
print(reverse_string("hello")) # Powinno: "olleh", Jest: "hello"Odpowiedź AI: błąd - pętla iteruje od 0 do len(s)-1, dodając znaki w oryginalnej kolejności zamiast odwrotnej.
# Poprawiony kod:def reverse_string(s): result = "" for i in range(len(s) - 1, -1, -1): # Iteracja od końca result += s[i] return result
# Lub bardziej pythonowy sposób:def reverse_string(s): return s[::-1]Analiza stack trace:
Mój kod zwraca następujący błąd. Wyjaśnij przyczynęi zaproponuj rozwiązanie:
Traceback (most recent call last): File "app.py", line 45, in process_data result = data['users'][0]['email']KeyError: 'users'
Kod:def process_data(data): result = data['users'][0]['email'] return resultRefaktoryzacja kodu
Dział zatytułowany „Refaktoryzacja kodu”AI może pomóc ulepszyć istniejący kod, zachowując jego funkcjonalność.
# Przed refaktoryzacją:def calc(l): t = 0 for i in range(len(l)): if l[i] > 0: t = t + l[i] return t / len(l) if len(l) > 0 else 0# Po refaktoryzacji:def calculate_positive_average(numbers: list[float]) -> float: """ Oblicza średnią arytmetyczną liczb dodatnich z listy.
Args: numbers: Lista liczb do przetworzenia
Returns: Średnia liczb dodatnich lub 0.0, jeśli nie ma żadnej """ positive_numbers = [n for n in numbers if n > 0]
if not positive_numbers: return 0.0
return sum(positive_numbers) / len(positive_numbers)Zatrzymaj się na chwilę przy ostatniej linii, bo to najważniejszy moment tego przykładu. Oryginalny calc sumował tylko liczby dodatnie, ale dzielił przez długość całej listy. Dla [10, -5, -5] zwracał 3,33, choć jedyna dodatnia liczba to 10.
Czy to był błąd, czy zamierzone zachowanie? Tego z samego kodu nie wyczytasz - a AI też nie. Model dostaje funkcję nazwaną calc bez dokumentacji i zgaduje intencję. Jeśli zgadnie “średnia dodatnich”, napisze ładny docstring, poprawną nazwę i zostawi dzielenie po staremu. Dostaniesz kod, który wygląda lepiej i kłamie w opisie.
Rodzaje refaktoryzacji: czytelność (lepsze nazwy zmiennych, dokumentacja), wydajność (optymalizacja algorytmów), wzorce (zastosowanie design patterns), testowanie (dodanie testów jednostkowych), bezpieczeństwo (usunięcie podatności).
Pisanie testów
Dział zatytułowany „Pisanie testów”AI może automatycznie generować testy jednostkowe dla istniejącego kodu.
def validate_email(email: str) -> bool: """Sprawdza czy email ma poprawny format.""" import re pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' return bool(re.match(pattern, email))import pytestfrom your_module import validate_email
class TestValidateEmail: """Testy dla funkcji validate_email."""
# Poprawne emaile def test_valid_simple_email(self): assert validate_email("user@example.com") == True
def test_valid_email_with_dots(self): assert validate_email("user.name@example.com") == True
# Niepoprawne emaile def test_invalid_no_at(self): assert validate_email("userexample.com") == False
def test_invalid_no_domain(self): assert validate_email("user@") == False
def test_invalid_empty_string(self): assert validate_email("") == False
# Przypadki brzegowe def test_short_tld(self): assert validate_email("user@example.co") == True
def test_single_char_tld(self): assert validate_email("user@example.c") == FalseKonwersja między językami
Dział zatytułowany „Konwersja między językami”AI może tłumaczyć kod z jednego języka programowania na inny.
# Python:def process_users(users): active_users = list(filter(lambda u: u['active'], users)) names = list(map(lambda u: u['name'].upper(), active_users)) return sorted(names)// JavaScript (ES6+):const processUsers = (users) => { const activeUsers = users.filter(u => u.active); const names = activeUsers.map(u => u.name.toUpperCase()); return names.sort();};
// Lub w jednej linii:const processUsers = (users) => users .filter(u => u.active) .map(u => u.name.toUpperCase()) .sort();Generowanie dokumentacji
Dział zatytułowany „Generowanie dokumentacji”AI może automatycznie tworzyć dokumentację dla istniejącego kodu - docstringi, komentarze i type hints dla klas i funkcji, na podstawie samej implementacji.
Najlepsze praktyki kodowania z AI
Dział zatytułowany „Najlepsze praktyki kodowania z AI”- Czytaj wygenerowany kod, zanim go uruchomisz. To jedyna zasada z tej listy, której nie odpuszczaj. Kod od modelu wygląda poprawnie z definicji - jest składny, ma docstringi i sensowne nazwy - a mimo to potrafi mieć błąd logiczny albo lukę bezpieczeństwa. Traktuj go jak pull request od nieznajomego: dopóki go nie przeczytasz i nie przetestujesz, nie wiesz, co robi.
- Podawaj kontekst technologiczny - określ wersję języka, framework, biblioteki. “Python 3.11 z FastAPI i Pydantic v2” da lepsze wyniki niż “Python”.
- Używaj AI do nauki, nie kopiowania - staraj się zrozumieć wygenerowany kod. Pytaj o wyjaśnienia. To najlepsza forma nauki.
- Iteruj nad rozwiązaniami - jeśli pierwszy wynik nie jest idealny, doprecyzuj wymagania lub poproś o alternatywne podejście.
Popularne narzędzia AI dla programistów
Dział zatytułowany „Popularne narzędzia AI dla programistów”| Narzędzie | Zastosowanie | Integracja |
|---|---|---|
| GitHub Copilot | Autouzupełnianie, generowanie kodu | VS Code, JetBrains, Neovim |
| ChatGPT | Wyjaśnienia, debugging, architektura | Web, API, integracje |
| Claude | Długi kontekst, analiza kodu | Web, API |
| Cursor | IDE z wbudowanym AI | Samodzielne IDE |
| Amazon CodeWhisperer | Autouzupełnianie, bezpieczeństwo | VS Code, JetBrains |
| Tabnine | Autouzupełnianie lokalne | Większość IDE |
Podsumowanie
Dział zatytułowany „Podsumowanie”- Generowanie kodu - opisz zadanie, otrzymaj implementację
- SQL - podaj strukturę bazy, otrzymaj zapytanie
- Wyjaśnienia - AI tłumaczy kod na różnych poziomach zaawansowania
- Debugging - pomoc w znajdowaniu i naprawianiu błędów
- Refaktoryzacja - ulepszanie istniejącego kodu
- Testy - automatyczne generowanie testów jednostkowych
- Dokumentacja - tworzenie docstringów i komentarzy
Częste pytania
Czy AI może programować?
AI potrafi generować, wyjaśniać i debugować kod. Nie zastępuje programisty, ale znacząco przyspiesza pracę - zwłaszcza w pisaniu powtarzalnego kodu i szukaniu błędów.
made with ❤️ by aitomate.pl - Łukasz Podgórski