Проект: Practice C++ (опенсорс на Github)  Публичный пост
21 апреля 2022  1122
Practice C++ (опенсорс на Github)

Кто я и как появилась идея

Привет! Я Алекандр, программирую в 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, но тема весьма нишевая, вряд ли получится что-то собрать.

Нужны ли какие-то советы или помощь Клуба?

  1. Присоединяйтесь и помогите проекту:
  • напишите идею задачи или напишите, какая тема вам была бы интересна
  • сделайте contribution в репозиторий в виде кода
  • найдите и поправьте ошибки или сделайте задачу понятнее, коректнее или читабельнее
  1. Поставьте звезду на GitHub, это и просто приятно и помогает в продвижении.

  2. Советы и замечания:

  • Может быть вы знаете, как сделать проект лучше?
  • Как мне рассказывать о нём, чтобы было понятнее и привлекательнее?
  • Может быть вы знаете, почему это не сработает?
  • О чём важном я не подумал?

Большое спасибо!

6 комментариев 👇

Привет!
Классный проект, сам год назад ротировался в плюсовые разработчики (до этого писал в основном на Python, но небольшой плюсовый опыт тоже был) и активно подтягиваю свой уровень.

Правда мне рабочих задач хватает + постоянно придумываю себе микро-задачи, если какую-то тему не очень понимаю.
Типа того

Могу посоветовать вот такую книгу, если ещё не видел. Это как раз сборник задач на разные прикладные темы, иногда заглядываю в неё. У меня она есть в бумажном виде, могу поделиться (контакт есть в профиле).

Небольшой оффтоп

Я преподаю в Нетологии и когда делал свой курс по Питону там, столкнулся с тем, что задачи для курсов в основном берутся из головы и вообще не имеют отношения к реальному миру.

Это навело меня на мысль, что было бы круто, если бы был ресурс с задачами не просто похожими на реальные рабочие задачи, а именно с реальными задачами. То есть различные open source issues, задачи от компаний итд. Даже начинал что-то делать, но в итоге забуксовал и забил. Так что примеры задач можно поискать в опенсорсе, например :)

Вот пара примеров чего-то похожего
https://up-for-grabs.net/#/tags/python
https://backend-university.ru/

  Развернуть 1 комментарий

@termith, извини, что долго не отвечал, и спасибо за сообщение!
Книгу такую не встречал, посмотрю. В целом, я понимаю, что идея о таких задачах много кому в голову приходила, и немало кто её уже реализовывал, но у всех есть свои отличия, и каждый может быть полезен.

К "up-for-grabs" ещё можно добавить https://goodfirstissue.dev/.

  Развернуть 1 комментарий

@AlexGarustovich, о круто, гляну goodfirstissue, спасибо 😊

  Развернуть 1 комментарий

Мне очень нравится идея! Пытался проходить плюсы на курсере но быстро стало скучно. Форкнуть репу и решать задачки кажется интересней!

Было бы круто ещё добавить что-то вроде счётчика, который показывает кол-во решённых задач и отображает в бадже, например. Не знаю можно ли такое реализовать 🤔

  Развернуть 1 комментарий

@al1, спасибо! Я думал о трекере решенных задач, но кажется, что для статического репозитория это слишком сложно и неподходяще. Тут больше напрашивается полноценный сайт с задачами и возможностью компиляции прямо в облаке (как leetcode/godbolt и т.п.). Я подобное начинал делать, но пока не хватает времени, поэтому решил сконцентрироваться только на задачах.

  Развернуть 1 комментарий

Вспомнил ещё проект для вдохновения - https://cryptopals.com/ (ex. Matasano Crypto Challenges).

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб