HPUNIX Сайт о ОС и не только!

Советы и примеры задач, которые посодействуют для вас в освоении нового языка программирования

25 июня 2012 - unix
Советы и примеры задач, которые помогут вам в освоении нового языка программирования

Не так давно мне пришло еще одно письмо от 1-го из читателей блога. Создатель письма пенял, что на кафедре, на которой он обучается, не достаточно внимания уделяется программированию, также интересовался, не знаю ли я каких-нибудь приемов, содействующих исследованию нового языка программирования. Вот, что я думаю по этом поводу.

Все языки программирования изучаются идиентично. Поначалу вы понимаете, что желаете освоить новый язык. Мотивы могут быть самыми различными.

Может быть, вы решили начать карьеру программера, может быть — просто желаете решить своими силами некую задачку, а может быть, вы уже понимаете десяток языков программирования и учите очередной в надежде открыть в процессе исследования нечто новое и увлекательное себе. В любом случае, вы выбираете подходящий для ваших целей язык. Вопрос выбора языка программирования был более тщательно освящен в заметке Итак, вы решили стать программером.

Сегодня можно отыскать массу обучающих материалов на хоть какой вкус — статей в журнальчиках, постов в блогах, видео-курсов и т.д.. Встречаются даже интерактивные сайты-учебники.

Но я глубоко убежден, что нет наилучшего метода начать исследование нового языка программирования, чем прочесть неплохую книжку по нему. Статьи и видео-курсы оставляют пробелы в познаниях.

С помощью их вы сможете просто выучить синтаксис языка программирования, но они не дадут для вас глубочайшего осознания его внутреннего устройства. Если в языке употребляется автоматическая сборка мусора, то как она работает? Если процессы «общаются» с помощью обмена сообщений, каковы гарантии на доставку этих сообщений?

Советы и примеры задач, которые помогут вам в освоении нового языка программирования

Неплохую книжку в том либо ином виде (картонном либо электрическом, на российском языке либо на британском) можно отыскать по хоть какому языку программирования. Книжки есть даже по не так давно показавшимся языкам, таким, как Go либо Perl 6. Если книжек нет, то, вероятнее всего, язык не заслуживает вашего внимания. Он или безвыходно устарел, или появился практически вчера и, может быть, не станет существовать уже завтра.

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

Если перед вами стоит выбор — прочесть книжку на британском языке либо ее перевод на российский, безотступно советую избрать 1-ый вариант. Еще одна опасность может подстерегать вас при исследовании юных языков программирования.

К примеру, Scala является новым и очень стремительно развивающимся языком. Книжки о Scala, написанные практически год либо два вспять, уже успели устареть.

Кроме книжки по самому языку программирования для вас, вероятнее всего, также пригодится несколько книжек по связанным с этим языком технологиям. При исследовании Python вы, возможно, также будете заинтересованы в освоении Django. Если вы исследуете Scala, не разрушить прочесть книжки по Akka, Play Framework и Scalatra.

Но одних только книжек недостаточно. Навряд ли после чтения книжки вы смогли стопроцентно, во всех деталях, уяснить ее содержание. К тому же, в книжках нередко не дискуссируются многие принципиальные вопросы.

И хотя ответы на их содержатся в официальной документации и тех постах в блогах, вы, снова таки, не сможете просто прочесть и уяснить их. Истинное осознание приходит только с опытом. Чтоб по-настоящему освоить язык программирования, необходимо много писать на нем, также читать код других программистов.

Приобретению опыта использования языка содействует решение с его помощью задач. В неких книжках в конце каждой главы приводятся маленькие задачи. Но я лично никогда не обожал эти задания из-за их искусственности.

Мне больше нравится заниматься более-менее реальной задачей и, если будет нужно, использовать в ней dict’ы, чем писать 5 строк кода, которые делают с этими dict’ами что-то мнимое и никому ненадобное. Разглядим некие из таких более-менее реальных задач (либо «коанов», если желаете), сгруппированных по теме.

Интернет:

    Советы и примеры задач, которые помогут вам в освоении нового языка программирования
  • Возьмите один из веб-фреймворков для изучаемого вами языка и напишите веб-сайт, который выводит на главной страничке надпись «Привет, мир!». В случае с Haskell, например, таким фреймворком будет Yesod, Happstack, Scotty либо Snap.
  • Добавьте форму для ввода имени юзера, после отправки которой возникает надпись «Привет, (имя юзера)!».
  • Добавьте сохранение инфы о юзере в кукисах, чтоб гостю не приходилось всякий раз вводить свое имя при заходе на веб-сайт. Сделайте кнопку «выход», при нажатии на которую кукисы удаляются.
  • Советы и примеры задач, которые помогут вам в освоении нового языка программирования
  • Дайте юзерам возможность заливать аватарки.
  • Пусть у юзеров будет возможность выбирать язык интерфейса.
  • Одним юзерам нравится читать темный текст на белоснежном фоне, а другим — белоснежный текст на черном фоне. Дайте им возможность переключаться меж несколькими шаблонами веб-сайта.
  • Разверните написанное вами приложение в Амазоне либо в ином пасмурном хостинге.

Базы данных:

Советы и примеры задач, которые помогут вам в освоении нового языка программирования
    Советы и примеры задач, которые помогут вам в освоении нового языка программирования
  • Напишите телефонную книжку с внедрением какой-либо реляционной СУБД, к примеру, MySQL, PostgreSQL либо SQLite. Телефонная книжка — это приложение, которое хранит информацию о ваших знакомых и методах, которыми можно связаться с ними. Вы сможете создавать, редактировать и удалять людей, также разные их контакты — телефоны, скайпы, адреса блогов и т.д..
  • Есть ли ORM для изучаемого вами языка программирования? Сделайте так, чтоб приложение из предшествующего пт могло работать с хоть какими 2-мя РСУБД, используя один и тот же код.
  • Напишите телефонную книжку, используя для хранения инфы одну из NoSQL баз данных, к примеру, MongoDB, CouchDB либо Riak;
  • Напишите маленькое веб-приложение, отображающее число юзеров, находящихся на этот момент онлайн. Для этого воспользуйтесь одним их key-value хранилищ, к примеру, Memcached либо Redis. Считается, что юзер находится онлайн, если он запрашивал одну из страничек веб-сайта в течение последних 5 минут.

Сети и протоколы:

  • Напишите программку, выводящую последние 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-адресов. Используйте «традиционную» многопоточность с мьютексами, семафорами и т.д.. Очевидно, если она поддерживается изучаемым вами языком.
  • Решите ту же задачку с внедрением процессов операционной системы заместо потоков.
  • Можно ли в изучаемом вами языке использовать легковесные потоки, событийно-ориентированное программирование либо транзакционную память? Попытайтесь решить задачку при помощи 1-го из этих подходов.

Графика:

  • Напишите программку, рисующую диаграммы для неких данных. Программка должна уметь строить графики, гистограммы и радиальные диаграммы.
  • Задан перечень пар однонаправленно связанных частей. Напишите программку, отображающую эти данные в виде графа.
  • Напишите ординарную библиотеку для рисования Captcha. Используйте GD либо аналогичную библиотеку на ваш выбор.
  • Напишите конвертер из 1-го графического формата в другой. Как минимум, программка должна поддерживать форматы 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 и Гугл Docs.

Прочее:

  • Сделайте хоть какое задание из прошлых пт. Удостоверьтесь, что написанная программка работает как минимум под 2-мя операционными системами, к примеру, под Windows и под Linux либо под Linux и MacOS.
  • Напишите программку для рекурсивного поиска файлов на диске. Напишите менеджер процессов. Если вы пишите под Windows, напишите программку, добавляющую себя на автозапуск методом редактирования реестра. Напишите программку, перечисляющую заглавия всех открытых окон.
  • Попытайтесь написать ординарную динамическую библиотеку. Потом напишите программку, подгружающую эту библиотеку и вызывающую функции из нее.
  • Как вызывать из изучаемого вами языка функции, написанные на Си? Можно ли написать программку на Си, вызывающую функции, написанные на изучаемом вами языке? Если вы исследуете Си, поменяйте в прошлых 2-ух предложениях «Си» на «OCaml».
  • Можно ли писать на изучаемом вами языке под Android, iOS либо Windows Phone? Попытайтесь написать обычное мобильное приложение.

Ух! Много вышло, правда? Как, все еще не достаточно? В таком случае можно порекомендовать последующее. Читайте книжки о программировании.

Во время чтения придумывается много увлекательных задачек. Учавствуйте в конкурсах по программированию. Задумайтесь, какие рутинные задачки для вас приходится временами решать и попытайтесь написать программку для их решения. Участвуйте в open source проектах.

Читайте блоги. Полистайте архивы блогов, на которые вы подписаны. В их можно отыскать достойные внимания задачи. Заведите свой блог и пишите о ваших успехах в исследовании нового языка.

Комменты к постам часто наводят на достойные внимания мысли.

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

Как обычно, буду рад хоть каким вашим комментариям.

Похожие статьи

Теги:
Рейтинг: +3 Голосов: 221 1834 просмотра
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...