Ако виждаш това съобщение, значи уебсайтът ни има проблем със зареждането на външни ресурси.

If you're behind a web filter, please make sure that the domains *.kastatic.org and *.kasandbox.org are unblocked.

Основно съдържание

Планиране на проект по програмиране

Да станеш програмист не означава само да научиш синтаксиса и понятията на един език за програмиране; означава и да разбереш как да използваш това знание, за да правиш програми. В този курс вече направи няколко програми в предизвикателствата и в проектите, но сега трябва да измислиш идеи за нови програми – идеи, които вълнуват лично теб – и да се опиташ да ги превърнеш в истински програми.
Вероятно няма да знаеш всичко необходимо за своята програма, когато я започнеш, и това е съвсем нормално – ще се мотивираш да научиш нови неща, защото толкова много ще искаш програмата ти да заработи. Програмистите постоянно учат нови неща за нови проекти и това е една от причините да обичаме работата си.
Да минем през процеса на планиране на един проект стъпка по стъпка:

1. Какво искаш да направиш?

Когато започнах да програмирам, постоянно мислех за нови програми, които да създам, и записвах идеите си. Пристрастих се към силата на създаването, а мозъкът ми искаше да направи толкова много неща. Ако и при теб е така, вероятно вече имаш идея, която искаш да осъществиш, а може би имаш цял списък с такива идеи.
Ако все още нямаш идея, ето няколко въпроса, които да ти помогнат с мисленето:
  • Коя е любимата ти игра - аркадна игра, бордова игра, спортна игра? Можеш ли да направиш нейна опростена, дигитална версия? Можеш ли да я промениш с различна тема или различни герои?
  • Кои са другите ти любими академични области? Ако обичаш изкуството, можеш ли да направиш програма, която да създава изкуство? Ако обичаш историята, защо не направиш интерактивна времева ос? Ако обичаш науката, защо не направиш научна симулация?
  • Кой е любимият ти филм или телевизионно шоу? Можеш ли да направиш дигитална версия на сцена или герой от него? Или дори игра по него?
  • Коя джаджа от реалния свят харесваш най-много? Можеш ли да направиш нейна симулация?
След като си избереш идея, трябва да я опишеш. Например, ако съм решил да направя клонинг на "Breakout", защото това е любимата ми ретро аркадна игра, ще напиша:
Breakout: игра, в която контролираш бухалка в долната част на екрана, и я използваш, за да удряш топка под ъгъл напред, за да разбива тухли. Целта е да разбиеш всички тухли и да не оставиш топката да падне на земята прекалено много пъти.
По-късно ще избистриш описанието, но засега това ти дава добра идея, за да продължиш с процеса по планиране.

2. Каква технология да използваш?

В тази стъпка трябва да решиш какви технологии (езици, библиотеки, среди) познаваш или можеш лесно да научиш и кои от тях са най-подходящи за работата. Може би и за теб в този списък има само един елемент, "1. JS+ProcessingJS" и това ще улесни твоето решение.
Нашата JS+ProcessingJS среда работи чудесно за създаване на анимации, игри, визуализации и симулации. Провери програмите в нашата общност, за да видиш широк спектър от програми създадени от хората тук.
Нашата среда не работи за други неща като групови (мултиплейър) игри, мобилни приложения или приложения за обработка на данни. Ако знаеш други езици/среди (като JS+HTML, Python, SCRATCH, Swift и т.н.) и смяташ да създадеш нещо, за което няма смисъл да използваш ProcessingJS, тогава разбери коя от тези технологии би била най-подходяща за твоята програма. Ако искаш да създадеш нещо такова, но не познаваш други технологии, по-добре би било да се спреш на друга идея за програма. Можеш да научиш още една нова технология за нов проект, но ако тепърва започваш да програмираш, по-добре е първо да овладееш първия си език.
Ако реша да правя игра като Breakout, ще предпочета JS+ProcessingJS, тъй като вече познавам технологията и тя работи добре за двуизмерни неща.

3. Какви функции ще има?

Тук вече започва истинското планиране и (според мен) истинското забавление. Целта ти в тази стъпка е да разбереш какво правиш – как ще изглежда, какви функции ще има, какви функции няма да има.
Първото, което можеш да направиш, е "скица" – чертеж на това, което ще правиш, но без детайли или точни размери. Можеш да направиш скица на хартия или в онлайн програма:
За да ти дам идея как изглеждат скиците, включих тези от моята версия на играта Breakout. Скицирах отделно всяка сцена и нарисувах стрелки между тях, за да покажа коя след коя следва. Тези стрелки ще ми помогнат да разбера каква логика ми трябва между сцените.
Сега можеш да използваш скици, за да направиш списък с функции, като измислиш какви елементи ще има твоята програма и си ги запишеш в списък.
За моята игра Breakout списъкът е този, разделен по сцени:
Сцена на играта
  • Палка, котролирана от потребителя
  • Няколко цветни тухли
  • Ъглово движение на топче
  • Засичане на сблъсък
  • Показване на животите
  • Показване на резултат
  • Звукови ефекти
Главна Сцена
  • Бутон за игра
  • Бутон за помощ
Помощна сцена
  • Текст
  • Бутон назад
Победна сцена
  • Заглавие
  • Анимация на фойерверки
Сцена на загуба
  • Текст
  • Бутон рестарт

4. Но кои от тези трябва да включва?

Ако имаме безкрайно много време, за да направим всички програми в главата си, всички те ще включват всяка функция от списъка. Но нямаме такова време, затова в тази стъпка трябва да решиш кои функции са най-важни и кои да направиш само ако имаш време. Това ще ти помогне да разбереш в какъв ред да имплементираш функциите, от най-важна към най-малко важна.
За да разбереш важността на всяка функция, задай си тези въпроси:
  • Ако споделя програмата с приятел, кои функции трябва да не пропускам да проверя, че работят?
  • За кои функции се вълнувам най-много?
  • Кои функции в програмата ми са най-уникални?
  • От имплементирането на кои функции ще науча най-много?
  • Има ли функции, за които все още нямам достатъчно умения?
След това разгледай списъка с функциите от предишната стъпка и ги подреди или дай ранг на всяка функция.
За списъка за моята игра Breakout поставих "P1", "P2" и "P3" до всяка функция, което бележи топ приоритет (P1), среден приоритет (P2) и най-нисък приоритет (P3). Реших да дам по-висок приоритет на уникалните механизми, вместо на основни функции като сцените, защото за мен те са по-вълнуващи:
(P1) Сцена на игра
  • (P1) Палка, контролирана от потребителя
  • (P1) Няколко цветни тухли
  • (P1) Ъглово движение на топче
  • (P1) Засичане на сблъсъци
  • (P2) Показване на животите
  • (P2) Показване на резултат
  • (P3) Звукови ефекти
(P2) Главна сцена
  • (P2) Бутон за игра
  • (P3) Бутон за помощ
(P3) Сцена за помощ
  • (P3) Текст
  • (P3) Бутон назад
(P2) Победна сцена
  • (P2) Заглавие
  • (P3) Анимация на фойерверки
(P2) Сцена на загуба
  • (P2) Текст
  • (P3) Бутон рестарт
Като общ съвет за всички, които правят игри, ето няколко функции, които те съветвам да не приоритизираш високо: менюта, множество нива, 3D графики. Фокусирай се върху това, което е уникално и забавно за твоята игра, а след това добави допълнителните неща.
Можеш да превърнеш списъка с приоритети във версии на проекта, за да можеш да виждаш лесно какво трябва да имплементираш във всяка версия, а и винаги можеш да спреш след определена версия и да се радваш на направеното.
Ето как ще изглеждат версиите на моята игра Breakout;
V1
  • Палка, контролирана от потребителя
  • Няколко цветни тухли
  • Ъглово движение на топче
  • Засичане на сблъсък
V2
  • Показване на живот
  • Показване на резултат
  • Сцена старт с бутон за игра
  • Победна сцена със заглавие
V3
  • Звукови ефекти
  • Бутон помощ
  • Фойерверки
  • Сцена загуба с бутон рестарт

5. Как ще го имплементираш?

Вече имаш идея какви функции ще включиш в програмата си, но ако започнеш сега, ще започнеш от съвсем празна програма, без написан код, а това може да е малко стряскащо. Кои променливи ще напишеш първо? Кои функции?
Един начин да разбереш това е да помислиш за "архитектурата на високо ниво" за своята програма – да я разделиш на категории като "обекти", "логика", "потребителски взаимодействия", "потебителски данни" и "сцени" – а след това да помислиш как да ги имплементираш като обектно-ориентирани типове, функции или променливи.
Ето една примерна архитектура за моята игра:
Обекти
  • Brick (.isHit())
  • Paddle (.move())
  • Ball (.move())
Сцени
  • Старт
  • Игра
  • Край
Логика
  • Сблъсък на топче и тухла (function, използва ограничения)
  • Ъгъл между топче и палка (function, променя ъгъл)
Взаимодействие с потребителя
  • Движение на палката с клавиатурата (keyPressed)
  • Бутони за промяна на сцените (mouseClicked)
Потребителски данни
  • Смърт на топчетата (array)
  • Удари на топчетата (array)
След като измислиш архитектурата на високо ниво, ще стане много по-ясно откъде да започнеш да пишеш кода си.
Можеш да решиш първо да напишеш цялата програма в псевдо код, за което ще поговорим по-късно в този урок. Като цяло това означава да напишеш цялата програма на обикновен език в коментари, които след това бавно да превърнеш в истински код.

6. С какво време разполагаш?

Колко време имаш, за да направиш тази програма? Колко седмици и колко време на ден? Кои функции ще пишеш всяка седмица? В тази стъпка целта ти е да определиш срок за проекта си – което е особено важно, ако имаш краен срок, но е и полезно, защото си създаваш представа колко време ти отнема писането на една програма.
Ето разписание за моята игра Breakout, в което приемам, че ще работя по 2-4 часа всяка седмица:
  • Седмица 1: Дизайн и псевдо код
  • Седмица 2: Груби визуализации
  • Седмица 3: Механика за преместване/сблъсък на топка
  • Седмица 4: Механика за отбелязване на точки
  • Седмица 5: Сцени (Старт/Победа/Загуба)
  • Седмица 6: Полиране, ръчни тестове (QA), Подготовка за демо
Определянето на графика за програмиране на проекти е трудно. Някои неща, които изглеждат лесни, отнемат повече време, отколкото очакваш (като странен бъг, заради който дебъгваш часове наред), а други, които изглеждат сложни, отнемат по-малко време. Като общо правило, приеми, че ще ти трябва повече време, отколкото си мислиш, и го променяй в хода на работата.

Да започваме ли!?

Надявам се, че това ти дава идея за процеса на планиране на проект по програмиране и те вдъхновява да започнеш собствен проект. В зависимост от това, което искаш да създадеш, може да решиш първо да прегледаш други курсове, като JS за напреднали: Игри и визуализации или JS за напреднали: Компютърни симулации на физични явления, за да почерпиш повече идеи за създаване на игри и симулации.
Важното е в някакъв момент да започнеш да пишеш собствени програми, защото така ще научиш най-много и ще извлечеш най-голяма радост от програмирането, защото ще превърнеш мечтите си в реалност.

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.