Почему C++ до сих пор в топе, и как портфолио решает всё
Вы наверняка слышали: «C++ — это сложно», «C++ умирает» и прочие страшилки. Реальность же такова: C++ по-прежнему правит балом в геймдеве, высоконагруженных системах, финансах и embedded-разработке. Без него не обходятся ни Unreal Engine, ни Chromium, ни базы данных уровня MySQL.
Но есть одна проблема: выучить синтаксис — это полдела. Работодатель хочет видеть не диплом, а проекты на C++ для портфолио, где видна архитектура, работа с памятью и умение решать реальные задачи. Именно поэтому мы собрали 10 идей — от простых до продвинутых. Каждая идея сопровождается примером кода и пояснением, какой навык она прокачивает.
Готовы собрать портфолио, от которого у HR пойдут мурашки? Поехали.
1. Текстовый редактор в консоли (nano-like)
Сложность: Начинающий
Навыки: Работа с файлами, строки, управление терминалом
Классика, которая никогда не устаревает. Вы создаёте простой редактор с открытием, редактированием и сохранением файлов. Научитесь работать с fstream, обрабатывать нажатия клавиш и управлять буфером.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class TextEditor {
private:
std::vector<std::string> lines;
std::string filename;
public:
void open(const std::string& file) {
filename = file;
std::ifstream in(file);
std::string line;
while (std::getline(in, line)) {
lines.push_back(line);
}
}
void save() {
std::ofstream out(filename);
for (const auto& line : lines) {
out << line << '\n';
}
}
void run() {
// Здесь будет цикл обработки ввода
}
};
2. Простой HTTP-сервер (однопоточный)
Сложность: Средний
Навыки: Сокеты, сетевые протоколы, обработка запросов
Напишите сервер, который принимает HTTP GET-запросы и отдаёт статические файлы. Это золотой стандарт для понимания того, как работает интернет. Используйте sys/socket.h на Linux или winsock2.h на Windows.
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
bind(server_fd, (struct sockaddr*)&address, sizeof(address));
listen(server_fd, 3);
std::cout << "Server started on port 8080\n";
// Цикл accept и чтение запросов
return 0;
}
Такой проект в портфолио на C++ сразу показывает, что вы понимаете OSI-модель и умеете работать с низкоуровневыми сетевыми интерфейсами.
3. Менеджер задач (To-Do List) с графическим интерфейсом
Сложность: Средний
Навыки: Qt или SFML, MVC-паттерн, работа с БД (SQLite)
Создайте приложение с добавлением, удалением и сортировкой задач. Используйте библиотеку Qt — это даст вам понимание сигналов и слотов, а также навыки работы с GUI. Добавьте хранение в SQLite через sqlite3.h.
#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QMainWindow window;
window.setWindowTitle("Task Manager");
QListWidget* list = new QListWidget(&window);
QPushButton* addBtn = new QPushButton("Add Task", &window);
// layout и подключение сигналов
window.show();
return app.exec();
}
4. Эмулятор файловой системы (в оперативной памяти)
Сложность: Продвинутый
Навыки: Деревья, указатели, RAII, умные указатели
Реализуйте виртуальную файловую систему с каталогами, файлами, правами доступа и командами ls, mkdir, rm. Это отличное упражнение на работу с деревьями и управление памятью без утечек.
#include <memory>
#include <map>
#include <string>
class FileNode {
public:
std::string name;
bool isDirectory;
std::map<std::string, std::shared_ptr<FileNode>> children;
FileNode(const std::string& n, bool dir)
: name(n), isDirectory(dir) {}
};
5. Сетевой чат (клиент-сервер)
Сложность: Продвинутый
Навыки: Многопоточность, сокеты, протоколы
Создайте чат, где несколько клиентов могут общаться через сервер. Используйте std::thread для обработки каждого клиента. Это покажет, что вы умеете работать с конкурентностью и синхронизацией.
void handle_client(int client_socket) {
char buffer[1024] = {0};
while (true) {
int valread = read(client_socket, buffer, 1024);
if (valread <= 0) break;
// broadcast всем клиентам
memset(buffer, 0, sizeof(buffer));
}
}
6. Симулятор планировщика задач ОС
Сложность: Продвинутый
Навыки: Алгоритмы, очереди с приоритетом, симуляция
Реализуйте Round Robin, SJF, Priority Scheduling. Выводите статистику: среднее время ожидания, turnaround time. Отличный способ показать понимание операционных систем.
struct Process {
int id, burst_time, priority;
};
void round_robin(std::vector<Process>& processes, int quantum) {
std::queue<Process> ready;
// алгоритм с временными квантами
}
7. Генератор лабиринтов и поиск пути
Сложность: Средний
Навыки: Графы, DFS/BFS, A*, визуализация
Сгенерируйте лабиринт алгоритмом Прима или Краскала, затем найдите кратчайший путь с помощью A*. Визуализируйте через ASCII-графику или SFML.
<