Часто начинающие программисты жалуются на отсутствие каких-либо идей для практики. И в самом деле, не идти же на фриланс без опыта. Как по мне, учится на клиентах это глупо, фрилансер должен уже быть специалистом, а не жить по принципу "главное чтоб меня выбрали, а там как-то оно будет, скопипащу код или нагуглю". Я обычно, когда изучал новый язык, старался отвечать на форумах по программированию, решал возникающие там у людей проблемы, и заодно учился сам.
Но сейчас я хочу представить замечательную статью на тему идей задач по программированию. Полностью вы ее можете прочитать в блоге автора по адресу http://eax.me/programming-language-learning/ , я же только процитирую эти задачи списком, и буду по мере их решения выкладывать в блоге (и мне какая-то практика, и кому-то может быть что-то пригодится).
Веб:
Базы данных:
Сети и протоколы:
Многопоточность:
Графика:
Некоторые алгоритмы:
Криптография:
Десктоп:
Прочее:
Но сейчас я хочу представить замечательную статью на тему идей задач по программированию. Полностью вы ее можете прочитать в блоге автора по адресу http://eax.me/programming-language-learning/ , я же только процитирую эти задачи списком, и буду по мере их решения выкладывать в блоге (и мне какая-то практика, и кому-то может быть что-то пригодится).
Веб:
- Возьмите один из веб-фреймворков для изучаемого вами языка и напишите сайт, который выводит на главной странице надпись «Привет, мир!». В случае с Haskell, к примеру, таким фреймворком будет Yesod, Happstack, Scotty или Snap.
- Добавьте форму для ввода имени пользователя, после отправки которой появляется надпись «Привет, (имя пользователя)!».
- Добавьте сохранение информации о пользователе в кукисах, чтобы посетителю не приходилось каждый раз вводить свое имя при заходе на сайт. Сделайте кнопку «выход», при нажатии на которую кукисы удаляются.
- Дайте пользователям возможность заливать аватарки.
- Пусть у пользователей будет возможность выбирать язык интерфейса.
- Одним пользователям нравится читать черный текст на белом фоне,а другим — белый текст на черном фоне. Дайте им возможность переключаться между несколькими шаблонами сайта.
- Разверните написанное вами приложение в Амазоне или в ином облачном хостинге.
Базы данных:
- Напишите телефонную книгу с использованием какой-нибудь реляционной СУБД, например, SQLite, MySQL или PostgreSQL. Телефонная книга — это приложение, которое хранит информацию о ваших знакомых и способах, которыми можно связаться с ними. Вы можете создавать, редактировать и удалять людей, а также различные их контакты — телефоны, скайпы, адреса блогов и так далее.
- Существуют ли ORM для изучаемого вами языка программирования? Сделайте так, чтобы приложение из предыдущего пункта могло работать с любыми двумя РСУБД, используя один и тот же код.
- Напишите телефонную книгу, используя для хранения информации одну из NoSQL баз данных, например, MongoDB, CouchDB или Riak;
- Напишите небольшое веб-приложение, отображающее число пользователей, находящихся в данный момент онлайн. Для этого воспользуйтесь одним их key-value хранилищ, например, Memcached илиRedis. Считается, что пользователь находится онлайн, если он запрашивал одну из страниц сайта в течение последних пяти минут.
Сети и протоколы:
- Напишите программу, выводящую последние 10 твитов, содержащих указанный хэштэг. Используйте HTTP API социальной сети Twitter.
- Напишите агрегатор блогов. Имеется список RSS- и Atom-лент. Программа должна генерировать файл index.html, содержащий ссылки на последние 50 постов, опубликованных в блогах из списка. Настройте автоматический запуск программы каждые 10 минут. Убедитесь, что файл index.html обновляется.
- Добавьте в программу из предыдущего пункта возможность заливать index.html в указанный каталог на удаленном сервере по протоколу FTP. Используйте готовую библиотеку для работы с FTP.
- Напишите программу, отправляющую электронное письмо на указанный адрес по протоколу SMTP с использованием готовой библиотеки. Затем прикрепите к письму несколько файлов. Сделайте так, чтобы в почтовых клиентах с поддержкой HTML отображалась HTML-версия письма с картинкой, а в клиентах без поддержки HTML — простая текстовая версия письма.
- Напишите программу, уведомляющую пользователя о получении новых писем. Используйте протокол POP3. Затем добавьте в программу поддержку IMAP. Убедитесь, что программа поддерживает SSL. Для работы с POP3 и IMAP используйте готовые библиотеки.
- Напишите простого ICQ-, IRC- или Jabber-бота с использованием готовой библиотеки для работы по выбранному протоколу.
- Выберите протокол из следующего списка: DNS, FTP, POP3, SMTP, IRC, IMAP, Jabber, ICQ, ed2k, BitTorrent. Напишите собственную библиотеку для работы по выбранному протоколу со стороны клиента. Или напишите сервер.
- Существуют ли для изучаемого вам языка программирования биндинги к libpcap? Если да, попробуйте написать простой HTTP-сниффер. Если нет, попробуйте написать простой аналог libpcap на raw-сокетах.
Многопоточность:
- Напишите программу, которая в несколько потоков скачивает файлы по заданному списку URL-адресов. Используйте «традиционную» многопоточность с мьютексами, семафорами и так далее. Разумеется, если она поддерживается изучаемым вами языком.
- Решите ту же задачу с использованием процессов операционной системы вместо потоков.
- Можно ли в изучаемом вами языке использовать легковесные потоки, событийно-ориентированное программирование или транзакционную память? Попробуйте решить задачу с помощью одного из этих подходов.
Графика:
- Напишите программу, рисующую диаграммы для некоторых данных. Программа должна уметь строить графики, гистограммы и круговые диаграммы.
- Задан список пар однонаправленно связанных элементов. Напишите программу, отображающую эти данные в виде графа.
- Напишите простую библиотеку для рисования Captcha. Используйте GD или аналогичную библиотеку на ваш выбор.
- Напишите конвертер из одного графического формата в другой. Как минимум, программа должна поддерживать форматы bmp, jpeg, gif и png.
Некоторые алгоритмы:
- Напишите программу, собирающую статистику поисковых запросов, по которым пользователи заходят на некоторый сайт. Для этого пропарсите при помощи регулярных выражений логи веб-сервера за месяц.
- Напишите библиотеку для поиска на графах в глубину и в ширину, а также при помощи алгоритма A*. Реализуйте прямой, обратный и двунаправленный поиск;
- Напишите генератор лабиринтов. Затем напишите программу, которая проходит лабиринты, сгенерированные предыдущей программой.
- Найдите сайт, использующий как можно более простую Captcha. Напишите программу, распознающую символы на этой Captcha. Используйте многослойные нейронные сети.
- Аппроксимируйте функцию синус на отрезке [0; pi/2] при помощи полинома четвертой степени. Для подбора коэффициентоввоспользуйтесь генетическим алгоритмом. Повторите задачу для другой функции и другого отрезка.
- Создайте библиотеку, реализующую алгоритм сжатия LZW. Затем протестируйте библиотеку на типичных данных. Насколько ее скорость и коэффициент сжатия отличаются от этих же параметров у других библиотек для сжатия данных без потерь?
- Реализуйте алгоритм перевода римских цифр в арабские, а также алгоритм преобразования в обратную сторону.
- Напишите библиотеку для работы с графами, матрицами, датами, комплексными числами или числами произвольной длины.
- Напишите свою реализацию хэш-таблиц, АВЛ-деревьев, двусвязных и xor-связных списков, а также других структур данных на ваш выбор.
- Придумайте простой язык программирования и напишите его компилятор или интерпретатор.
Криптография:
- Найдите библиотеку для генерации криптостойких псевдослучайных чисел. Напишите на ее основе генератор паролей. Если такой библиотеки для изучаемого вами языка нет, напишите ее. Из литературы тут можно посоветовать Практическую Криптографию.
- Напишите программу, считающую MD5, SHA1, SHA256 или инуюхэш-функцию от заданной строки. Напишите программу, считающую ту жехэш-функцию от большого файла на диске.
- Напишите программу, шифрующую файлы при помощи AES или иного симметричного шифра.
- Найдите библиотеку, реализующую алгоритм RSA. Напишите с ее помощью программу для обмена ключами по открытому каналу (например, электронной почте) и передачи по этому же каналузашифрованных и защищенных цифровой подписью сообщений.
- Сделайте то же самое с использованием эллиптических кривых. Если для изучаемого языка нет готовой библиотеки для работы с эллиптическими кривыми, напишите ее.
Десктоп:
- Напишите простое GUI-приложение с полем для ввода имени и кнопкой с надписью «ОК». При нажатии на кнопку должно появляться сообщение «Привет, (введенное имя)!». Продолжите работу над приложением. Пусть у программы будет иконка в трее и она будет уметь сворачиваться в этот трей. Научитесь выводить popup-сообщения.
- Можно ли на изучаемом вами языке программирования сделать скриншот экрана и сохранить его в bmp-файл? Если да, то попробуйте написать программу, делающую это.
- Напишите проигрыватель mp3-, ogg- и wav-файлов.
- Создайте программу, рисующую трехмерную вращающуюся пирамиду с разноцветными гранями.
- Напишите приложение, снимающую вебкамерой фото и/или видео.
- Научитесь сканировать документы и отправлять их на печать.
- Напишите программу, записывающую звук с микрофона в wav-файл.
- Напишите генератор Excel-отчетов с графиками и гистограммами. Проверьте, что он нормально отображается в Microsoft Office, Libre Office и Google Docs.
Прочее:
- Выполните любое задание из предыдущих пунктов. Убедитесь, что написанная программа работает как минимум под двумя операционными системами, например, под Windows и под Linux или под Linux и MacOS.
- Напишите программу для рекурсивного поиска файлов на диске. Напишите менеджер процессов. Если вы пишите под Windows, напишите программу, добавляющую себя на автозапуск путем редактирования реестра. Напишите программу, перечисляющую заголовки всех открытых окон.
- Попробуйте написать простую динамическую библиотеку. Затем напишите программу, подгружающую эту библиотеку и вызывающую функции из нее.
- Как вызывать из изучаемого вами языка функции, написанные на Си? Можно ли написать программу на Си, вызывающую функции, написанные на изучаемом вами языке? Если вы изучаете Си, замените в предыдущих двух предложениях «Си» на «OCaml».
- Можно ли писать на изучаемом вами языке под Android, iOS или Windows Phone? Попробуйте написать простое мобильное приложение.
Комментариев нет:
Отправить комментарий