Какво очакваме от проектите

Проекта ще ви отнеме известно време от сесията, и ще е половината от оценката. Тук ще разкажем малко повече детайли за това какво очакваме от него.

Съдържание

Ще приемем разнообразни идеи за проекти. В идеалния случай (но не е задължително), ще е нещо, което на вас ви е интересно и което искате да направите за себе си, било то за проба или за употреба. Но е важно проекта да е приложение а не библиотека. Тоест, искаме да е нещо, което можете да пуснете на някого, който да го използва. Примерно:

  • Вместо "структура от данни", направете база данни, която използва тази структура вътрешно и вади някакъв интерфейс за пъхане на данни и намиране на данни.
  • Вместо "алгоритъм за най-кратък път" направете визуализация на този алгоритъм като графична програма или като command-line програма, която печата картинка.
  • Вместо "LSP server", вкарайте го в текстов редактор и ни покажете как работи на практика за вашия избран файлов тип.

Не е нужно проекта ви да е 100% изпипан. Ако е игра, няма нужда да е перфектно балансирана и да има 10 нива с композирана музика. Ако е сайт, няма нужда да е SEO-optimized, gzipped, webscale. Просто искаме да е нещо, което да можем да пробваме (на вашите компютри или на нашите, ваш избор) и да видим че работи преди да ни покажете кода.

Искаме проекта ви да съдържа Rust код. В крайна сметка целта ни e да оценим Rust-а ви. Напълно е ок да имате разнообразни други неща -- Javascript, XML, C (може да обвиете C библиотека в Rust). Но бихме искали да има достатъчно Rust код, който да видим как сте използвали.

Искаме проекта ви да бъде донякъде оригинален. Това не изисква гениална, уникална идея, просто някаква малка вариация на съществуваща формула, която няма да видите из tutorial-и онлайн. Примерно, може да направите:

  • Игра "тетрис", само че отвреме-навреме падат блокчета от антиматерия и/или различни други форми, или всеки N секунди се маркира ред, който дава "награда", или блокчетата се shift-ват настрани...
  • Прост блог, само че може да коментирате върху параграфи или даже върху конкретно селектиран текст (как ще работи pagination? А промени по текста на статията?)
  • Music player, който организира mp3-ки по директории както на вас ви харесва, или ги тегли от youtube с youtube-dl, или позволява search-ване по метаданни, или позволява crop-ване на аудиото.

Оценяване

Обикновено ще награждаваме точки по следния начин:

  • 30т за функционалност: проекта прави каквото сте казали, че ще прави.
  • 15т за стил: кода е горе-долу добре изглеждащ Rust код. Няма да сме твърде взискателни, но ще смъкваме точки ако видим твърде много не-идиоматични неща, примерно, ако си напишете целия проект с указатели и unsafe без добра причина.
  • 15т за тестове: Летвата ни е ниска, предвид че рядко има тестове. Ако нямате дори един, със сигурност ще изгубите 15т, така че има доста смисъл да положите не-нулево усилие в тази част. (Макар че ако усилието е "it works, 2+2=4", вероятно няма да мине :))

На изпита ще ни демонстрирате как се използва проекта и след това ще ни покажете кода и ще обясните как работи. Няма проблеми проекта да е публичен, може да го качите в github, gitlab, bitbucket, където ви е удобно. Може да го показвате на ваш компютър или да ни дадете начин да си го инсталираме при нас.

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

  • 105т: 6
  • 90т: 5
  • 75т: 4
  • 60т: 3

Срокове

Очакваме да си изберете проект до началото на сесията и да го обявите в discord, в канала #projects, заедно с факултетния си номер. Разкажете какво ще направите, и какви конкретни функционалности ще вкарате. Вижте историята на канала #projects за конкретни предложения и как са изглеждали. Вижте и форума от 2017та, когато нямахме discord: "Идеи за проекти". В гитхъб имаме и showcase на някои проекти, които студенти от минали години са предложили: https://github.com/fmi/rust-projects. (Бихме искали да качим и вашите, ако дадете линк и някаква картинка/gif за демо.)

Ще разгледаме предложенията и може би ще кажем "супер, звучи добре", а може и да кажем "добре, но добави X и/или Y". Може и да ви предупредим, че това изглежда твърде голямо за проект и има риск да ви дойде множко.

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

Откъм дата за изпита, всяка година ще се опитваме да получим най-късната възможна дата, за да имате време да бутате проекта лека-полека. Това обикновено ще е последната неделя след официалния край на сесията.

Идеи

Тук ще споделим няколко абстрактни теми за проекти. Не е необходимо да изберете една от тях, и самите идеи не са съвсем "цели". Приемете ги като посоки, в които да мислите. Имайте предвид, че идеите са нарочно непълни и мъгляви. Дори да изберете нещо от тук, бихме искали да измислите вариации или добавки.

Ако търсите популярни библиотеки по категория, един източник е Awesome Rust.

Идея: Desktop приложение

GUI-тата в Rust все още не са много стабилни, но има добри примери за простички приложения, направени с тях. Ето няколко:

Не е задължително да използвате GTK, но като че ли е най-стабилния вариант в момента, и имаме лекция за него и за Egui. Има доста други опции, ако сте достатъчно смели: https://www.areweguiyet.com/

Какво интересно/полезно нещо можете да измислите, което да е удобно за употреба в графичен интерфейс? Не забравяйте, че искаме да упражнявате Rust повече, отколкото да упражнявате GUI-та. Каквото и да измислите, целете интерфейса да е минимален, а повечето ви работа да е по самата имплементация отдолу. Минимален GTK интерфейс също може да бъде "обвивка" за нещо друго, като игра, чат, image processing...

Внимавайте обаче със стабилността на GUI-тата! Експериментирайте, преди да commit-нете към някакво desktop приложение, да не се окаже, че ви липсва нещо важно!

Идея: Игра

Каква игра може да направите?

Варианти има страшно много и няма да търсим кой знае колко polish -- целта ни, в крайна сметка, е да пишете Rust. Стига да имате смислен модел на играта, типове и трейтове, които интелигентно обвиват модела на играта, няма да настояваме за fancy графика или балансирани противници. Вижте лекцията за правене на игри за детайли и ресурси.

Идея: Сайт

Има много варианти за нещо просто, което може да подхванете, като:

  • Клонинг на twitter/facebook/instagram (клонинги на twitter са особено популярни днешно време)
  • Blog
  • Онлайн магазин
  • Чат клиент
  • YouTube клонинг

Но е дори по-важно от обикновено да направите нещо по-интересно с него. Блог, само че с коментиране на параграфи или изречения? Блог с ефективна търсачка, написана на Rust?

Допълнително, единствено препоръчваме да подхванете тази опция, ако вече имате опит в писането на някаква форма на web-dev, защото има доста повече движещи се части, отколкото си мислите. И съществува риска да ви се наложи да пишете повече Javascript, отколкото Rust. От друга страна, това може да е вариант да напишете сайта или част от него на WASM.

Идея: Конзолно приложение

Една от лекциите показва игра на бесеница. Бихте могли да имплементирате друга, по-сложна конзолна игра. Може би...

  • Adventure, в стил Zork, "go north -> You have been eaten by a grue"? Тук бихме очаквали да вложите усилия в неща като инвентория, битки срещу противници, вдигане на level-и и статистики...
  • Лабиринт, който се рендерира на екрана с ansi-art чертички (https://en.wikipedia.org/wiki/Box-drawing_character). Може би с противници, които се движат, когато играча се движи, лабиринт, който е затъмнен, освен в определен радиус от играча?
  • Вие сте крал/кралица на средновековно кралство! Всяка година трябва да решите дали да купите или продадете територия, колко жито да засадите, и колко да запазите за храна, трябва да се справяте с дипломация, войни и болести. Всяка година, избирате как да си алокирате ресурсите, и играта симулира какво се случва през годината.

Какво друго може да имплементирате в конзола? Може би с curses/ncurses, може би просто със стандартен терминален output?

  • Typing tutor? (вдъхновено от https://twitter.com/phansch/status/932944244880396288)
  • Текстов редактор? Достатъчно прост такъв (nano-подобен) може да е по-лесен, отколкото си мислите. Gary Bernhardt има чудесен screencast, който за нещастие е платен. Ето и един готин tutorial на C, с доста идеи за разширения: Build Your Own Text Editor.
  • Log viewer? Ще трябва да поддържа големички файлове (да кажем, стотици хиляди редове), да ги tail-ва in realtime, може би по няколко наведнъж. Може би с интерфейс за филтриране на log entries по определени параметри? Парсене на JSON логове?
  • Интерактивна конзола за преименуване/организиране по директории на музика/снимки/сериали? С редактиране на метаданни? С паралелно изпълнение на операциите върху огромни комплекти от данни (note: експериментирайте върху копия на истинските си файлове, да не ги омажете без да искате :))

"Конзолно приложение" също така може спокойно да бъде обвивка към други, по-библиотечни неща. Алгоритми, структури от данни, невронни мрежи. Щом има вход и изход, не би трябвало да е трудно да го обвиете в команден интерфейс със structopt/clap или да му сложите интерактивна конзола с rustyline, или да ползвате cursive или tui-rs за по-засукан терминален интерфейс.

В случай на нерешителност

Ако не можете да изберете, помислете си за посоки и ни питайте. Може да ви дадем идеи или вдъхновение. Ако дори нямате посока, пуснете си Random Number Generator за да изберете посока -- всичко е правимо, само ви трябва начална точка и да време.