Финални проекти

  1. Идеи за проект

    Започнаха да се появяват въпроси по темата с финалните проекти. Честно казано - тъкмо навреме. Ще се опитаме да дадем малко яснота за процеса.

    • Стъпка 1: Скоро ще получите за домашно да дефинирате спецификация за финалния проект. Дефиниция на изискванията и формата за спецификациите ще бъдат споделени в секция "Задачи", подобно на всяко едно друго домашно. Вместо да споделяте код, ще споделите изискванията си в текстов формат. Ние ще коментираме дали идеята е добра, дали е прекалено лесна, или прекалено сложна, както и дали изискванията са ясни.
    • Стъпка 2: В случай на нужда, ще направим дискусионна среща на живо, в която можем да обсъдим проектите ви "на 4 очи".
    • Стъпка 3: Работите по проектите си задочно. Ако имате технически затруднения, или нужда от предефиниране на изискванията, свързвате се с нас, за да помагаме.
    • Стъпка 4: Защитата на проектите ще се извърши на живо и има за цел да разкажете за проекта си, а ние да питаме защо, как и какво. На база резултати ще получите оценка.

    Конкретни изисквания за формата на спецификациите ще получите при стъпка 1, но на този етап можем да ви дадем няколко идеи за това какво целим като обем и сложност.

    Знаете сложността на домашните, които получавате. Обикновено за тях получавате 10 точки. С финалния си проект получавате 60, така че можете да добиете груба представа за сложността, която търсим.

    Финалният проект не трябва да е нещо, което можете да направите за 3-4 дни, прекарвайки 1-2 часа на ден. Добре е да решава реален проблем. Да е нещо, което наистина си струва да се направи, а не просто проект, който визуализира уменията ви.

    Ето няколко насоки, които могат да ви помогнат да разберете какво целим.

    Революция в Web сайтовете

    Направа на web сайт, използвайки Django, Flask, или друг подходящ фреймуърк:

    • Създаване, вписване и редактиране на потребители.
    • База данни с поне няколко модела, които имат зависимости един с друг.
    • Възможност потребителите да манипулират и търсят обекти от базата данни.
    • Достатъчна сложност, за да разграничите проекта си от това, което ще видите на лекциите за Django. Това може да зависи от естеството на самия проект.
      Например:

      • обработка на данни чрез външно API (например Google API за навигация);
      • скрейпване и обработване на данни от чужди сайтове;
      • инстантно споделяне на събития между различни потребители, които са в сайта едновременно (например онлайн игра, в която потребителите играят един срещу друг и/или в отбори);
      • динамично генериране на файлове (снимки, документи, код).
    • Тестове! Не всичко в подобен проект може и е лесно да се изтества, но ще гледаме много стриктно какви тестове сте написали.

    • Естеството на проекта предполага не малко работа по графичния интерфейс. Това нас не ни интересува. Ние ще гледаме Python кода ви, а не CSS-а и JS-а. Съсредоточете се във важното за курса. Няма да обсъждаме дизайна на страницата ви, но ще обсъждаме дизайна на кода ви.

    Революция в десктоп приложенията

    Направа на приложение, използвайки Tkinter, PyQt или друг подходящ фреймуърк.

    • Темата е обширна, но във всеки случай ще очакваме добро разграничение на данни, интерфейс и логика на приложението (model-view-controller).
    • Очакваме код, напълно покрит от Unit тестове.
    • Такова приложение обикновено е обвързано с много потребителски инпут. Трябва да се справяте с грешките и да ги комуникирате с потребителя.
    • Създаване на лог файлове е доста добра идея.
    • Поддръжка на различни операционни системи.
    • Достатъчна сложност, за да се разграничите от просто писане на GUI - зад приложението трябва да има стабилна логика, която да ни убеди, че кодът си заслужава.

    Революция в CLI приложенията

    Направа на приложение, работещо с команден ред.

    • В зависимост от приложението, силно вероятно е да се нуждаете от добре разделение на данни, интерфейс и логика на приложението (model-view-controller).
    • Очакваме код, напълно покрит от Unit тестове.
    • Такова приложение обикновено е обвързано с много потребителски инпут. Трябва да се справяте с грешките и да ги комуникирате с потребителя.
    • Създаване на лог файлове е доста добра идея.
    • Поддръжка на различни операционни системи.
    • Имайки предвид, че за разлика от другите формати, тук нямате графична среда. Трябва много добре да компенсирате с функционалност или много да впечатлите с input/ouput оформление в терминала.
    • Убедете ни, че най-подходящият формат за вашето приложение е точно този, че нямате нужда от графичен интерфейс и липсата му не е просто "пътят на най-ниското съпротивление" за да отбиете номера.

    Революция в гейминга

    Направа на приложение, използвайки pygame, arcade, adventurelib или просто нещо графично и своите crazy game dev skills.

    • Тук идеите са също стотици. Да, няма как да направите следващия Cyberpunk, но има безбожно много игри с интересни механики и scope, достатъчно голям, за да е подходящ за проект и в същото време достатъчно малък, да не ви дойде в повече.
    • Както и за всичко останало - ще очакваме тестове. Да, няма как да тествате някаква част от подобно приложение, но с добра структура на кода, би следвало да можете да тествате атомарни парчета от функционалните аспекти на играта (механики, взаимодействие между обектите, etc.).
    • Щом сте се хванали на хорото - ще ви върнем обратна връзка за геймплея. Механиките на играта са важна част от функционалността на проект от този тип, така че ще очакваме да имате повече от една такава. Например:
      • Някаква форма на AI е добра идея за single player игри.
      • Някаква форма на multiplayer (hot-seat, online) е критична за multiplayer игри (duh). Да, може би няма да навлезем страшно много в networking-а, но няма да е непосилна задача да го направите.
    • Няма да оценяваме визуалните елементи на играта (и все пак - безплатни спрайтове има на килограм).

    Революция извън всякакви граници

    Ако имате идея, която не влиза в списъка по-горе, не се притеснявайте. Може и да е валидна, но нека я обсъдим. Някои идеи в тази насока:

    • Грандиозен Python пакет, който предоставя готина функционалност, но няма никакъв интерфейс, а просто предоставя тази функционалност след импортирането си.
    • Machine Learning проект, който далеч не е нещо, което можете просто да свалите от интернет.
    • Проект свързан с хардуер. Ако имате робот, датчици, IoT неща, напишете нещо свързано с тях.
    • Алгоритъм за умножение на матрици със сложност под O(n2.3728596).
    • Ядро на операционна система.

    Конкретно

    Някои конкретни идеи, които имам, докато пиша тази публикация:

    • Кубчето на Рубик:

      • предлага решения на зададена начална стойност;
      • има база данни за различни конфигурации;
      • сравнява различни решения по сложност;
      • дава алгоритъм за разбъркване на кубчето до достигане до определено състояние;
      • визуализира кубче в 3D формат, позволявайки потребителят да го завърта и разгледа отвсякъде;
      • и още...
    • Учебни графици:

      • съдържа данни за набор учители, ученици и предмети;
      • подготвя учебна програма, така че да няма припокриващи се часове на ученици или учители;
      • позволява въвеждане на конкретни правила (Не може да имаш изобразително изкуство и физическо в един и същ ден. Преподавател X не може да преподава в петък м/у 4-5.);
      • позволява ръчни промени по автоматично генерирана програма;
      • експортира програмата в различни формати;
      • и още...
    • Сайт за споделени пътувания:

      • потребители с кола заявяват посока и час на пътуване;
      • потребители, търсещи кола, могат да търсят измежду първите, за да споделят пътуване;
      • използва Google Maps API, за да провери кои коли минават през маршрута, който търся, и да предложи час, в който би трябвало да очаквам колата си (Георги тръгва с колата си от Враца за Бургас, но Виктор иска Георги да го вземе от София и да го остави в Стара Загора);
      • и още...
    • Hyper Shell

      • CLI програма, която позволява да spawn-вам shell сесии и да изпълнявам команди във всеки отделен shell.
      • мога лесно да превключвам между shell-овете, но работя във всички тях през един терминал;
      • мога да пренасочвам изхода на команда от даден shell към друг shell;
      • мога да запазвам състоянието на даден shell (environment variables, текуща директория и др.) и да започвам от същото място при следваща сесия;
      • и още...

    Ако това не ви стига, погледнете дефинициите на проекти от минали години, НО имайте предвид, че не всички са удачни. Освен това форматът, в който са предлагани, е много разводнен. Ще се опитаме да го унифицираме, за да няма контраст между дефиниция с един ред и такава с 2 страници.

    Примерни проекти 2016
    Примерни проекти 2015

Трябва да сте влезли в системата, за да може да отговаряте на теми.