Кто я и как появилась идея
Привет! Я Алекандр, программирую в NtechLab core сервисы обработки видео и запуска нейросеточек. Пишу в основном на крестах, но так же практикую Golang, Python.
За 15 лет изучения программирования я заметил досадную особенность человеческого мозга: теоретические знания без практического использования забываются очень быстро. По субъективным ощущениям, за год пропадает 90-95%. Если закреплять прочитанное практикой в редакторе кода, то запоминается значительно больше и дольше. Но иногда бывает, что нет времени или лень или не получилось придумать достойную задачу. Со временем появилась идея того, чего мне самому не хватает: ресурса с темами не для новичков, где можно было бы обучаться вместе с практикой, не тратя время на продумывание задач, создание шаблона проекта и подключение нужных библиотек. Встречайте:
Practice C++ - репозиторий для практико-ориентированного изучения языка C++ для middle уровня. Согласно идее, пользователь выбирает любую интересующую тему и выполняет практические задания.
Ссылка: https://github.com/practicode-org/practice-cpp
По замыслу в проекте будут задачи как по самому языку C++, так и по toolchain'ам, утилитам (например, objdump, strace), стандартной библитеке STL, популярным библиотекам (Boost), технологиям и принципам (CUDA, SIMD) и типичным приемам в языке. Для каждой задачи будет написано описание, начальный код, который необходимо дописать, и описаны способы проверить корректность выполнения.
Система сборки - CMake, компилятор и ОСь - любые, но пока тестировал только на gcc.
Как это работает:
- программист выбирает тему, которую хочет изучить
- самостоятельно читает книгу, статьи, смотрит обучающие видео
- открывает "Practice C++" и решает задачи на эту тему
- самостоятельно проверяет себя (хотя для многих задач есть готовые тесты)
Что уже есть
На момент создания поста я написал 12 задач по нескольким темам:
- sorting - алгоритмы упорядочивания STL и вопросы эффективности сортировок,
- chrono - одноименная библиотека, часики, измерение длительности,
- condition_variable - использование одноименного примитива и типичные рабочие задачи с его использованим,
- template - шаблоны, приемы с шаблонами, и мета-программирование,
- compilation - ручной запуск компилятора и линковщика, понимание процесса сборки.
Пример задачи
/*
Task:
- write a thread-safe queue (with use of condition_variable) and tests
*/
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <queue>
template <typename T>
class Queue {
public:
Queue(int max_queue_len) {}
void enqueue(const T& value) {}
T pop() {}
private:
std::queue<T> storage; // underlying data type
};
int main() {
return 0;
}
Какие планы на будущее?
- Ближайшее время: добавить задачи на C++20 concurrency: latches, barriers, semaphores, обновление в атомиках
- Объявить о проекте в различных местах (чаты, сообщества, форумы) и изучить интерес
- Продолжить добавлять задачи (есть идеи тем, но без точного плана)
- Начать добавлять ссылки на источники: рекомендуемые книги, статьи, видео для изучения темы
- Начать писать примеры решений и разбор типовых ошибок.
Есть ли трудности?
Самый сложный момент в создании подобных задач: как проверять корректность выполнения? Для некоторых задач можно написать тесты, для некоторых успешность выполнения очевидна, но есть класс задач, которые проверить очень сложно. Взять например, почти любую проблему в concurrency: ошибиться там очень легко, а найти ошибку очень неочевидно. Что делать?
Для каких-то задач я планирую включить sanitizer'ы, а для каких-то задачи придется мириться с тем, что проверить их на 100% автоматизированно невозможно. Нужен code review от грамотного человека, но это совсем другая история.
Есть идеи как это можно монетизировать?
Проект всегда будет открытым и бесплатным, ради развития сообщества языка C++. Можно включить donations, но тема весьма нишевая, вряд ли получится что-то собрать.
Нужны ли какие-то советы или помощь Клуба?
- Присоединяйтесь и помогите проекту:
- напишите идею задачи или напишите, какая тема вам была бы интересна
- сделайте contribution в репозиторий в виде кода
- найдите и поправьте ошибки или сделайте задачу понятнее, коректнее или читабельнее
Поставьте звезду на GitHub, это и просто приятно и помогает в продвижении.
Советы и замечания:
- Может быть вы знаете, как сделать проект лучше?
- Как мне рассказывать о нём, чтобы было понятнее и привлекательнее?
- Может быть вы знаете, почему это не сработает?
- О чём важном я не подумал?
Большое спасибо!
Привет!
Классный проект, сам год назад ротировался в плюсовые разработчики (до этого писал в основном на Python, но небольшой плюсовый опыт тоже был) и активно подтягиваю свой уровень.
Правда мне рабочих задач хватает + постоянно придумываю себе микро-задачи, если какую-то тему не очень понимаю.
Типа того
Могу посоветовать вот такую книгу, если ещё не видел. Это как раз сборник задач на разные прикладные темы, иногда заглядываю в неё. У меня она есть в бумажном виде, могу поделиться (контакт есть в профиле).
Небольшой оффтоп
Я преподаю в Нетологии и когда делал свой курс по Питону там, столкнулся с тем, что задачи для курсов в основном берутся из головы и вообще не имеют отношения к реальному миру.
Это навело меня на мысль, что было бы круто, если бы был ресурс с задачами не просто похожими на реальные рабочие задачи, а именно с реальными задачами. То есть различные open source issues, задачи от компаний итд. Даже начинал что-то делать, но в итоге забуксовал и забил. Так что примеры задач можно поискать в опенсорсе, например :)
Вот пара примеров чего-то похожего
https://up-for-grabs.net/#/tags/python
https://backend-university.ru/
Мне очень нравится идея! Пытался проходить плюсы на курсере но быстро стало скучно. Форкнуть репу и решать задачки кажется интересней!
Было бы круто ещё добавить что-то вроде счётчика, который показывает кол-во решённых задач и отображает в бадже, например. Не знаю можно ли такое реализовать 🤔
Вспомнил ещё проект для вдохновения - https://cryptopals.com/ (ex. Matasano Crypto Challenges).