Ilya Strukov's site

Языки программирования

2015-03-19

Что лучше, Haskell или Common Lisp? Python или Ruby? C++ или Java? Некоторые программисты не задумываясь дают ответ на подобный вопрос вне зависимости от контекста.

— Конечно, C++/Java/Lisp лучше.
— Всё ещё не пишете на Erlang/Scala/Rust? Ха! Ретрограды!
— Я могу что угодно написать на C, зачем мне другие языки?

Более опытный разработчик скажет, что всё зависит от задачи. Но про себя всё равно подумает «И всё-таки Haskell — лучший».

В подобных разговорах на удивление часто люди забывают простой факт — что язык программирования это не только синтаксис и семантика; это ещё и сообщество, библиотеки, инструменты, документация.

Что толку в монадах, макросах и акторах, если тебе приходится тратить драгоценные часы на то, чтобы просто подключиться к базе данных или научиться парсить JSON? Какой смысл в изящной системе типов если твой коллега не может прочитать твой код?

Подкасты

2014-08-28

Кратко напишу про подкасты, которые я сейчас слушаю. Большинство из них чисто технические.

Русскоязычные подкасты

Начну с подкастов про программирование и технологии

  • Радио-Т — без комментариев
  • Как делают игры — как нетрудно догадаться из названия, подкаст про gamedev.
  • EaxCast — новый подкаст про программирование вообще и про функциональное программирование в частности. Выходит в формате интервью и имеет текстовую расшифровку каждого выпуска, что очень удобно.
  • DevZen — ещё один подкаст от авторов EaxCast, но уже в форме свободной беседы и не только про программирование.
  • DevOps дефлопе — подкаст про разные технологии на стыке программирования и системного администрирования: Chef, Puppet, Ansible и т.д.
  • Разбор полётов — про программирование, много Java.

Есть также парочка интересных для меня подкастов не связанных с IT.

  • Laowaicast — про жизнь в Китае.
  • Evergreen podcast — подкаст Артёма Росновского, в основном про жизнь в США.

Англоязычные подкасты

На английском языке найти интересные подкасты гораздо проще.

  • The Changelog — про Open Source. Часто бывают интересные гости.
  • Linux Outlaws — еженедельные обсуждения всего что относится к Linux и Open Source.
  • Hanselminutes — получасовые интервью о программировании, часто говорят про веб и .NET, но, к счастью, этим круг тем не ограничивается.
  • Functional Geekery — ещё один подкаст в формате интервью, в этот раз о функциональном программировании.

Есть несколько хороших подкастов посвящённых конкретным языкам программирования.

И в заключение хочу упомянуть удивительное шоу, которое называет Welcome to Night Vale. Это новостная радиопередача воображаемого городка Night Vale, якобы расположенного посреди пустыни в Америке. В городе постоянно происходят разные мистические явления, от исчезновения людей до открытия портала в другое измерение и прилёта инопланетян. Очень рекомендую послушать, начинать можно прямо с первого выпуска.

Про кофе

2013-03-23

Кофе — чрезвычайно популярный напиток среди программистов, но, к сожалению, его обычно воспринимают только как «топливо» и пьют исключительно для того, чтобы взбодриться и набраться сил. А ведь хорошо приготовленный кофе может быть ещё и очень вкусным напитком. Я раньше пил растворимый кофе, полагая, что варить «настоящий» кофе самому долго и сложно. Потом я случайно наткнулся на статью A Coder's Guide to Coffee и всё изменилось к лучшему. Как оказалось, чтобы готовить хороший кофе, не нужно тратить уйму времени и денег. Для этого требуется:

  1. Кофе в зёрнах, лучше всего свежеобжаренный
  2. Кофемолка (любая, ручная или электрическая)
  3. Френч-пресс или гейзерная кофеварка

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

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

  1. Помолоть кофе. Для френч-пресса нужен сравнительно крупный помол, чтобы сетка не забивалась.
  2. Вскипятить воду в чайнике.
  3. Засыпать кофе в пресс и залить его кипятком.
  4. Закрыть крышку, но поршень не опускать
  5. Подождать 4-5 минут и после этого опустить поршень.

Вот и всё, кофе можно пить.

Что такое программирование?

2012-09-05

В качестве разминки для мозгов задумался над вопросом: как можно было бы наиболее просто и доступно объяснить ребёнку (или просто несведующему человеку) , на что похоже программирование? На ум пришла следующая аналогия.

Допустим, что вам приходится руководить трудолюбивым и послушным, но совешенно глупым работником. Этот работник настолько глуп, что сам не знает, как выполнить даже самую простую работу. Но, если вы напишете ему достаточно подробную инструкцию, то он сделает всё, что потребуется. Например, чтобы наш работник смог забить в стену гвоздь, надо написать для него примерно следующее:

  1. Подойди к шкафу с инструментом.
  2. Возьми в правую руку инструмент, лежаший справа на верхней полке. Это молоток (мы заранее знаем, что молоток лежит именно там).
  3. Возьми в левую руку из такой-то коробки одну металлическую деталь. Это гвоздь.
  4. Подойди к стене.
  5. Левой рукой приставь гвоздь острым концом к такому-то месту стены.
  6. Убедись, что правой рукой ты держишь молоток за конец ручки.
  7. Ударь молотком по гвоздю.
  8. Повроряй действие 7 до тех пор, пока гвоздь не войдёт на нужную глубину в стену.
  9. Снова подойди к шкафу с инструментом и положи молоток на верхнюю полку справа.

Причём, если мы в инструкции перепутаем, скажем, полку шкафа, то работник возьмёт не тот инструмент и будет старательно забивать гвоздь отвёрткой или рубанком. Так вот, а теперь представьте себе, что нужно написать инструкцию, по которой этот работник смог бы построить дом. Вот это и есть программирование. А если у нас есть не один работник, а целая бригада, то это уже параллельное программирование. При параллельном программировании надо писать инструкции так, чтобы работники не только делали нужные действия, но ещё и не сталкивались друг с другом (dead lock) и не пытались отнять друг у друга инструменты (race condition).

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

Вы всё ещё копируете конфиги вручную? Тогда мы идём к вам

2012-09-02

Расскажу о том, как я храню конфигурационные файлы для vim, zsh и любых других программ, которыми регулярно пользуюсь. Описываемая идея проста и совершенно не нова. Она заключается в том, чтобы хранить все важные конфиги в git-репозитории. Зачем это делать? Во-первых, полезно сохранять историю изменений на случай, если что-то сломаешь и захочешь вернуться к предыдущей версии. Во-вторых, перенос конфигов на новую машину, а также их последующая синхронизация между машинами, при таком подходе сводятся к нескольким тривиальным командам. В-третьих, полученный репозиторий можно поместить на github обеспечив себя надёжным бэкапом и поделившись наработками с окружающими.

Теперь о технических деталях. Все конфиги я перенёс в одну директорию и расставил в нужных местах символические ссылки. Чтобы на каждой новой машине вручную не создавать множество ссылок, я написал Makefile, который делает это автоматически. Этот же Makefile заодно запускает установку плагинов к Vim при помощи Vundle. Кроме самих конфигов, я включил в репозиторий всякие вспомогательные скрипты, а также инструменты вроде oh-my-zsh и git-flow. Для последних очень удобно оказалось использовать git submodule.

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

git clone https://github.com/iley/profile.git
git submodule update --init
make

После любых изменений в конфигах я делаю коммит и синхронизирую репозитории при помощи git push и git pull.

Коаны в программировании

2012-08-25

У буддистов коан — это короткий рассказ или вопрос, призванный натолкнуть ученика на правильный путь и тем самым приблизить его к просветлению. У программистов есть своя интерпретация этого слова, пусть, более приземлённая, но, тем не менее, заслуживающая внимания.

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

Ближе к делу. Понадобилось мне изучить питон. Я сначала листал какие-то книжки, пропуская большие куски текста, которые были для меня очевидны, и выискивая примеры кода. Это было неэффективно. Затем наткнулся на Python Koans, буквально за пару дней прошёл все уроки — и теперь могу писать код на питоне практически с тем же успехом, что на давно и хорошо известных мне языках.

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

Помимо Python Koans, существуют ещё Ruby Koans (на которых первые и основаны), Clojure Koans. Ещё для Clojure есть 4clojure, со своим набором коанов для решения онлайн.