If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Planowanie projektu programistycznego

Bycie programistą to nie tylko nauka składni i koncepcji języka programowania: to zastanawianie się jak użyć tej wiedzy do stworzenia programów. Stworzyłeś kilka programów w tym kursie, w wyzwaniach i projektach, ale teraz powinieneś sam wymyślić pomysł na nowy program - pomysł, które wywołuje u ciebie podekscytowanie- a następnie staraj się przekształcić ten pomysł w prawdziwy program.
Prawdopodobnie nie będziesz wiedział wszystkiego, gdy zaczniesz, ale to dobrze -- będzie cię to motywować do poznania nowych rzeczy, bo będziesz chciał stworzyć swój wymarzony program. Programiści cały czas uczą się nowych rzeczy do kolejnych projektów, dlatego tak bardzo kochamy swoją pracę.
Przejdźmy przez proces planowania projektu programistycznego:

1. Co chcesz stworzyć?

Gdy zaczynałem programować ciągle myślałem jakie nowe programy mógłbym stworzyć i spisywałem je na liście. Byłem uzależniony od tworzenia, a istniało wiele rzeczy, które mój mózg chciał stworzyć. Jeśli jesteś w takiej sytuacji w jakiej byłem ja, to prawdopodobnie masz pomysł na swój program i być może masz swoją własną listę.
Jeśli nie masz pomysłu, poniżej kilka pytań, które pomogą ci w burzy mózgów:
  • Jaką wygląda gra, którą najbardziej lubisz - gra zręcznościowa, gra planszowa, gra strategiczna? Czy przychodzi Ci do głowy uproszczona, cyfrowa wersja tej gry? Masz pomysł, jak ją trochę zmodyfikować, na przykład wybrać inny kontekst albo innych bohaterów?
  • W jakich dziedzinach twórczości czujesz się najlepiej? Jeśli pasjonujesz się sztuką, wchodzi w grę program, dzięki któremu można byłoby tworzyć? Jeśli Twoją pasją jest historia, to co powiesz o interaktywnym kalendarium? Jeśli Twoją dziedziną są nauki przyrodnicze, to czy możesz stworzyć symulację jakiegoś zjawiska? 
  • Czy masz jakiś ulubiony film lub serial? Może mógłbyś stworzyć cyfrową wersję danej sceny lub postaci? Mógłbyś w oparciu o nie stworzyć grę?
  • Czy jest jakiś gadżet, który kochasz? Może mógłbyś stworzyć jego symulację?
Gdy wybierzesz jeden z pomysłów, upewnij się, że dobrze go rozpiszesz. Na przykład, jeśli chciałbym stworzyć klona gry "Breakout", ponieważ to moja ulubiona retro gra zręcznościowa, mógłbym napisać:
Breakout: gra w której kontrolujesz panel na dole ekranu, używasz go do obijania piłki pod odpowiednim kątem i zbijania cegiełek. Celem jest, aby rozbić wszystkie klocki i nie pozwolić, aby piłka uderzyła w ziemię zbyt wiele razy.
Dopracujesz ten opis później, ale w tym momencie wystarczy nam do przejścia w fazę planowania.

2. Jakiej technologii użyjesz?

W tym kroku, musisz zastanowić się z jakich technologii (języka/bibliotek/środowiska) potrafisz korzystać lub których mógłbyś z łatwością się nauczyć i zdecydować, które z nich najlepiej nadadzą się do pracy. Dla wielu z was ta lista może mieć tylko jedną pozycję, "1. JS+ProcessingJS", to sprawia, że wybór jest prosty.
Nasze środowisko JS+ProcessingJS nadaje się do tworzenia animacji, gier, wizualizacji i symulacji. Sprawdź naszą listę programów społeczności, aby zobaczyć jakie programy ludzie stworzyli za pomocą naszego środowiska.
Nasze środowisko nie sprawdzi się z rzeczami takimi jak gry multiplayer, aplikacje mobilne, aplikacje operujące na danych. Jeśli znasz inne języki/środowiska (na przykład JS+HTML, Python, SCRATCH, Swift, itd.) i wydaje ci się, że chcesz stworzyć coś co nie będzie miało tyle sensu z ProcessingJS, to rozważ skorzystanie z technologii, która najlepiej będzie nadawała się do stworzenia tego programu. Jeśli chcesz stworzyć coś nowego, ale nie znasz technologii, być może wymyślisz nowy pomysł na program. Możesz nauczyć się nowych technologii specjalnie pod nowy projekt, ale dobrym pomysłem jest opanowanie jednego języka, jeśli dopiero zaczynasz swoją przygodę z programowaniem.
Jeśli postanowisz stworzyć grę taką jak Breakout, to ja na twoim miejscu wybrałbym JS+ProcessingJS, ponieważ znam tą technologię i wiem, że świetnie poradzi sobie z grą 2D.

3. Jakie funkcje będzie zawierać?

Teraz zaczynamy prawdziwe planowanie i w tym momencie (według mnie) zaczyna się zabawa. Twoim wyzwaniem w tym kroku jest ustalenie co dokładnie tworzysz - jak całość będzie wyglądać, jakie funkcje ma zawierać, a jakich nie będzie.
Powinieneś zacząć od stworzenia  "mock-up'ów"  - szkiców, które przedstawiają rzecz, którą tworzysz, ale bez szczegółów takich jak kolory czy dokładne proporcje. Możesz stworzyć mock-upy na papierze lub za pomocą programów online:
Aby dać ci pogląd na to jak mock-up powinien wyglądać, dołączyłem mock-upy mojego klona gry Breakout poniżej Rysowałem każdą scenę osobno i narysowałem strzałki między nimi, aby pokazać jak jedna scena przechodzi w drugą. Te strzałki pomogą mi zrozumieć jak powinna wyglądać logika programu i jak program powinien działać.
Naszkicowany pogląd klona Breakout
Teraz możesz wykorzystać mock-upy do stworzenia listy funkcjonalności, na której umieścisz każdą funkcjonalność programu.
Dla mojego klona Breakout lista funkcjonalności rozbita na sceny będzie wyglądała następująco:
Scena Gry
  • Rakietka kontrolowana przez użytkownika
  • Wielokolorowe klocki
    • Ruch piłki pod pewnym kątem
    • Detekcja kolizji
    • Wyświetlenie życia w grze
    • Wyświetlenie wyniku
    • Efekty dźwiękowe
Scena Główna
  • Przycisk Play (Graj)
  • Przycisk Help (Pomoc)
Scena Pomocy
  • Text
  • Przycisk "Powrót"
Scena Wygranej
  • Duży tytuł
  • ( Animacja ogni sztucznych
Scena Przegranej
  • Text
  • Przycisk "Zagraj jeszcze raz"

4. Jakie funkcjonalności musi zawierać?

Gdybyśmy mieli nieskończoną ilość czasu do stworzenia wszystkich programów, które mamy w naszych głowach, wszystkie zawierałyby pełną funkcjonalność. Niestety nie mamy, więc w tym kroku musimy zdecydować, które funkcje programu są najważniejsze, a które są do zaprogramowania gdybyśmy mieli czas. To pomoże nam dowiedzieć się, w jakiej kolejności zaimplementować funkcje, od najważniejszej do najmniej ważnej.
Aby pomóc ci określić właściwy priorytet każdej funkcji, zadaj sobie następujące pytania:
  • Jeśli podzieliłbyś się tym z kolegą, które funkcje chciałbyś, aby na pewno działały?
  • Które funkcje najchętniej chciałbyś stworzyć?
  • Które funkcje są wyjątkowe dla mojego programu?
  • Implementacja jakich funkcji nauczy mnie najwięcej?
  • Czy są jakieś funkcje, których implementacja wykracza poza moje umiejętności?
Następnie nadaj kolejność poszczególnym funkcjom na liście lub nadaj każdej funkcjonalności stopień ważności.
Na mojej liście funkcjonalności klona Breakout, umieściłem "P1", "P2", and "P3" obok funkcjonalności oznaczając wysoki priorytet jako (P1), średni priorytet jako (P2) i niski priorytet jako (P3). Zdecydowałem się nadać wyższy priorytet wyjątkowej mechanice gry niż scenom, ponieważ uważam, że to najlepsza część tego projektu:
(P1) Scena Gry
  • (P1) Rakietka kontrolowana przez użytkownika
  • (P1) Wielokolorowe klocki
    • (P1) Ruch piłki pod pewnym kątem
    • (P1) Detekcja kolizji
    • (P2) Wyświetlenie życia w grze
    • (P2) Wyświetlenie wyniku
    • (P3) Efekty dźwiękowe
(P2) Scena Główna
  • (P2) Przycisk Play (Graj)
  • (P3) Przycisk Help (Pomoc)
(P3) Scena Pomocy
  • (P3) Tekst
  • (P3) Przycisk powrotu
(P2) Scena Wygranej
  • (P2) Duży tytuł
  • (P3) Animacja ogni sztucznych
(P2) Scena Przegranej
  • (P3) Tekst
  • (P3) Przycisk powrotu do początku
Jako ogólną wskazówkę polecam zmniejszyć priorytet następujących funkcjonalności: menu, wiele poziomów, grafika 3D. Skup się na tym co wyjątkowe i fajne w twojej grze, a następnie dodaj te dodatki.
Możesz zmienić swoją listę w wersje projektu, dzięki czemu będziesz mógł łatwo ustalić co musisz zaimplementować w kolejnych wersjach i zawsze będziesz mógł przestać jeśli dana wersja zadowoli twoje oczekiwania.
Tak wyglądałyby wersje mojego klona gry Breakout:
V1
  • Paletka kontrolowana przez użytkownika
  • Wielokolorowe klocki
  • Ruch kątowy piłki
  • Wykrycie kolizji
V2
  • Wyświetlenie pozostałego życia w grze
  • Wyświetlenie wyniku
  • Przycisk rozpoczęcia sceny w/przycisk grania
  • Scena zwycięstwa w/nagłówek
V3
  • Efekty dźwiękowe
  • Przycisk pomocy
  • Fajerwerki
  • Scena porażki w/Przycisk ponownego uruchomienia

5. W jaki sposób to zaimplementujesz?

Masz pogląd na to jakie funkcjonalności powinien zawierać twój program - ale jeśli zaczniesz teraz, będziesz patrzył na kompletnie pusty program bez kodu, a to potrafi być przytłaczające. Które zmienne powinieneś zapisać jako pierwsze? Które funkcje?
Jednym sposobem na rozpoczęcie prac jest opracowanie "architektury wysokiego poziomu" programu - rozbicie go na kategorie takie jak "obiekty", "logika", "interakcja z użytkownikiem", "informacje o użytkowniku" i "sceny" - a następnie wymyślenie sposobu na ich implementacje, na przykład jako obiekty, funkcje czy zmienne.
Na przykład, poniżej architektura mojego klona gry Breakout:
Obiekty
  • Brick (.isHit())
  • Paddle (.move())
  • Ball (.move())
Sceny
  • Start
  • Game
  • End
Logika
  • Ball-brick collision (function, use bounding box)
  • Paddle-ball angling (function, invert angle)
Interakcja z użytkownikiem
  • Keyboard-paddle movement (keyPressed)
  • Buttons for scene changes (mouseClicked)
Informacje o użytkowniku
  • Ball deaths (array)
  • Ball hits (array)
Gdy już opracujesz architekturę wysokiego poziomu, bardzo szybko stanie się jasne od czego powinieneś zacząć kodowanie.
Możesz chcieć napisać cały program najpierw w pseudokodzie, o czym pomówimy później w tym kursie. Zasadniczo, oznacza to napisanie całego programu w prostym języku jako komentarz, a następnie przekształcenie go w prawdziwy kod.

6. Ile masz czasu?

Ile masz czasu na napisanie programu? Ile tygodni, ile godzin dziennie? Jakie funkcje napiszesz każdego tygodnia? Twoim zadaniem w tym kroku jest określenie ram czasowych projektu - co jest szczególnie ważne jeśli musisz przestrzegać terminów, ale pomaga ci także zrozumieć ile czasu jest potrzebne na napisanie programu.
Poniżej mój klon gry Breakout rozpisany na tygodnie, zakładając pracę po 2-4 godziny tygodniowo:
  • Tydzień 1: Design i pseudokod
  • Tydzień 2: Proste grafiki
  • Tydzień 3: Ruch piłki/mechanizm kolizji
  • Tydzień 4: Mechanizm punktacji
  • Tydzień 5: Sceny (Start/Wygrana/Przegrana)
  • Tydzień 6: Poprawki, Testy manualne (QA), Przygotowania do dema
Planowanie terminów projektów programistycznych jest trudne. Niektóre rzeczy, które wydają się łatwe zajmują o wiele więcej czasu niż może ci się wydawać (na przykład jakiś błąd na którym marnujesz godziny starając się go naprawić), niektóre trudne rzeczy udaje się wykonać dużo szybciej niż mogło ci się wydawać. Jako dobrą praktykę przyjmij, że wszystko zajmie więcej czasu niż ci się wydaje i przesuwaj ramy czasowe wraz z postępem.

Czy jesteś gotowy!?

Mam nadzieję, że to da ci pogląd na proces planowania projektu programistycznego i zachęci cię do rozpoczęcia twojego własnego projektu już teraz. W zależności od tego co chcesz stworzyć, możesz zdecydować się na przestudiowanie innych kursów takich jak Zaawansowany JS: Gry i Wizaulizacje lub Zaawansowany JS: Symulacja Natury, aby poznać nowe sposoby tworzenia gier i symulacji.
Ważną rzeczą jest upewnienie się, że zaczniesz tworzyć własne programy w pewnym momencie, ponieważ wtedy nauczysz się najwięcej i najbardziej będzie ci się podobać ta część programowania, bo wtedy możesz zmienić swoje marzenia w rzeczywistość.

Chcesz dołączyć do dyskusji?

Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.