пятница, 29 марта 2013 г.

Новые планы на ближайшее время

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

Приоритетный список:

  1. Изучить язык Scala и написать проект на нем. Этот язык мне давно интересен и очень хочется его потрогать. Так как за прошедший год успел освоиться с jvm и стандартной библиотекой Java, то попробовать на jvm новый язык кажется очень логичным. Scala у нас уже кое-где используется в отделе в продакшене и вроде парни довольны. В качестве IDE конечно пойдет IntelliJ.
  2. Обновить HabraReader и сделать второе приложение для iOS. Обновление выпустить просто необходимо и оно уже под парами. Для второго приложения уже есть куча идей: думаю будет очень интересно.
  3. Поработать с big data и NoSQL хранилищами. За последнее время по работе плотно столкнулся с этими вопросам и знаете, мне понравилось. К сожалению сейчас процесс несколько приостановился, но надеюсь что будет продолжение. Это как сладкие жевательные медвежонки - чем больше ешь, тем больше хочется.

Список с задачами второго приоритета:
  1. Попробовать реанимировать изучение English - перед этим придется найти стимул для этого. Задача переехала из предыдущего списка.
  2. Попасть на конференцию по интересующим сейчас тематикам (C++, Java, high load computations, iOS). Продолжаем с предыдущего года. Думаю эта задача так и будет тянуться все время. Уже планирую идти на JPoint.
  3. Углубить Python. Тут по пунктам: дочитать большой справочник по python, получше изучить батарейки из комплекта python,  попробовать плотно PyCharm в качестве IDE (вместо Sublime Text 2 и Emacs).
  4. Попробовать C++x11. Кажется компиляторы уже почти готовы. Да и Страуструп уже на пороге с новой книгой. Осталось только найти нужный проект.

Список получился интересный. Даже не терпится погрузиться в это.

среда, 27 марта 2013 г.

Ревизия планов

Когда то давно (уже больше года назад) я составил для себя список личного, около рабочего, развития. Время пролетело не заметно и прошло явно больше намеченных 3-4 месяцев и я решил проверить что из запланированного мной реализовано, и наверное составить новый список на грядущий год-полтора. Итак приступим к осмотру.

1. Расширить свои теоретические познания в области data mining. В списке сейчас 3 книги:
- Web Data Mining от Bing Liu (прочитано 70%). Отличное введение в майнинг и поисковые технологии
- Программируем коллективный разум от Тоби Сегаран (прочитано 10%). Книга с практическим уклоном с периметрами на python.
- Введение в информационный поиск от Маннинга и компания. Чем то похоже на первую книгу - читать пока не начал.

Тут прочитаны первые 2 книги (вот их обзор: здесь и здесь). Третья книга пока только бегло просмотрена. Итого выполнено на 70%.

2. Написать свое первое приложение для iOS и выложить в стор. Кажется что это будет очень интересно - во всяком случае первые впечатления от документации Apple оставили очень принятые впечатления. Objective C пока кажется несколько странным, но посмотрим...
Приложение написано и даже написал о нем пост на хабре. Сейчас готовится обновление с исправлением ошибок и новым функционалом. Об этом планирую потом написать подробнее. Итого выполнено на 100%.

3. Углубить знания в области Python. Все скрип ты писать исключительно на нем (вместо Perl) и изучить недавно купленный справочник по сему очень интересному языку.

Все скрипты теперь в основном пишутся мною на python. Perl, shell и awk остались только для поддержки legacy и для быстрого написания однострочников в основном по анализу данных. Справочник по python так пока и не был прочитан. Итого выполнено на 50%.

Теперь по планам из во второй очереди по приоритетам.

4. Продолжать изучать Java.
- дочитать двухтомник Хортсманна Java 2 (первый прочитан на 80%)
- продолжить изучение IntellyJ IDE
- возможно достанется какой-то проект на нем что-бы по практиковаться
Двухтомник прочитан и даже прочитаны еще две очень полезные книги о Java.  IntellyJ IDE активно используется. И даже готов проект на java (по бронированию отелей) - он уже вышел для карт. Планируются и дальнейшие релизы. Итого выполнено я бы оценил на 120%.

5. Попасть на конференцию по интересующим сейчас тематикам (C++, mining, high load computations, iOS).

В прошлом году был на двух интересных конференциях: HighLoad++ и Application Developer Days. В ближайшее время планирую посетить JPoint. Итого выполнено на 100%.
6. Попробовать реанимировать изучение English - перед этим придется найти стимул для этого.
Стимул за этот год фактически так и не был найден. Итог заслуженные 0%.

7. Дождаться ту пару книжек по boost которые я заказал и прочитать их.
Обе книги прочитал. Остался разочарован - уровень не самый высокий. Но все-таки выполнено на 100%.

Подведем итоги:
( 70 + 100 + 50 + 120 + 100 + 0 + 100) / 7 = 77%
В общем за срок ~ в 4 раза превышающий запланированный выполнено чуть больше чем на 3/4. Да конечно, было сделано и еще много всего не вошедшего в этот список, но вообще тенденция показательна. Скоро напишу про планы на ближайший год: возможно удастся их выполнить за пятилетку.

воскресенье, 24 марта 2013 г.

Погружаясь в мир Java

Продолжая изучать Java, прочитал еще две знаковые в этой области книги. Прежде всего это очень известная книга Брюса Эккеля "Философия Java". Как ни странно она по аналогии с "Core Java" так же зачастую делает ссылки на С++. По духу книга очень близка к уже упомянутому двухтомнику Хортсманна и Корнелла, но зачастую делает акценты в других местах. Именно сравнить эти две книги и хотелось бы дальше.

Эккель в начале дает описание ООП, основ Java, его синтаксиса, затем идет описание коллекций объектов, RTTI, шаблонов, массивов, io и завершает все глава про параллельное выполнение.

Автор придумал хитрую систему примеров: в начале дается полный исходный код, а затем в комментарии приводится формализованный вывод этого кода на консоль. Благодаря паре скриптов, написанных им, пример вывода в комментарии никогда не расходится с исходным кодом (что зачастую можно видеть у других авторов).

В книге очень хорошо описана реализация внутренних классов: тема достаточно нетривиальная, с подводными камнями. Ставим здесь плюс Эккелю. Так же очень хорошо описана параметризация и RTTI. Одна из самых сложных тем в Java - использование системы ввода/вывода (в основном за счет активного использования шаблона декоратор) тут описано намного понятнее чем в Core Java, в том числе и за счет исторического экскурса.

С другой стороны в Core Java имеются свои неоспоримые преимущества: к примеру, есть не мало тем, которых Эккель вообще не касается, но они очень важны для практического применения Java.  В целом "Философия Java" написана живо и интересно. Автор не боится при случае указать на недостатки в проектировании Java и книга выглядит достаточно объективно. В целом обе книги не плохо дополняют друг друга: разве что первые несколько глав Философии можно просто пробежать глазами после Core Java.

Так же хотелось бы написать про книгу Джошуа Блоха "Java. Эффективное программирование". Книга абсолютно не похожа на две предыдущие. Оформлена она в том же стиле как книги, например, Скотта Мейерас о С++: т.е. набор практических советов (один совет - одна глава) по различным областям программирования на Java.

Основные вопросы, затрагиваемые в книги это:

  • создание и уничтожение объектов
  • методы
  • классы и интерфейсы
  • замена конструкций из С
  • исключения
  • потоки
  • сериализация

В целом почти все разделы очень полезны. Информация сжата и советы конкретны. Проблемы выявлены очень четко. Например тут описана модель памяти Java, что я не нашел в предыдущих двух книгах. В целом не советую кому-либо садиться за написание крупного проекта без тщательного штудирования труда Блоха. Т.е. как и в мире С++ книга этого типа является must read для любого уважающего себя программиста на Java.



p.s.
В релиз на maps.yandex.ru уже вышел продукт он-лайн бронирования отелей (см. скриншот рядом).

Весь бэкэнд написан на Java и ходит он-лайн (т.е. сразу когда пользователь задает запрос в сервисе) к нашим партнерам за данными по бронированию отелей.

воскресенье, 18 ноября 2012 г.

О книге Кириевски "Рефакторинг с использованием шаблонов"

Продолжая историю с шаблонами у меня наконец дошли руки до давно мною купленной книги "Рефакторинг с использованием шаблонов" Джошуя Кериевски.

Книга очень сильна по своей структуре напоминает книгу Фаулера о рефакторинге - те же перечисление различных рефакторингов вместе с правилами их применения и примерами. Все примеры, кстати, на java.

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

Из плюсов отметил бы не плохие примеры использования TDD при разработки, сами примеры взяты из реальной практики и книга не затянута. Так же книга содержит вполне умеренные дозы UML. Из недостатков: раздела "механика" зачастую тривиальны и просто занимают кучу места не неся какой-то реальной пользы (впрочем тогда их можно просто пропускать).

В общем отличная книга - после Фаулера и Гаммы с Ко обязательна к прочтению.

воскресенье, 11 ноября 2012 г.

Опять double

Недавно занимался проблемой кластеризации наборов объектов из нескольких разных источников. После написания первой версии алгоритма решил проверить алгоритмы на вшивость класторизовав данные от одного источника с самими собой. Понятно, что я рассчитывал 100% совпадение всех объектов и какого же было мое удивление когда из ~250 тысяч объектов не класторизованными оказались примерно 7 тысяч объектов. Чудеса. Принялся копать и искать волшебника.

Изучение логов прояснило ситуацию.

Одним из факторов при кластеризации является дистанция между объектами, вычисленная на основе долготы и широты. Код для этого дела широко распространен в интернете и выглядит примерно так:
   static private double distance(double lat1, double lon1, double lat2, double lon2) {
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515 * 1.609344;
        return dist;
    }
Расстояние возвращается в километрах. Функция работает вполне себе нормально в большинстве случаев. Но логи подсказали написать вот такой волшебный тест:
@Test
public void testEqualDistance2() throws Exception {
        SomeObject object1 = new SomeObject();
        SomeObject object2 = new SomeObject();

        double lat = 51.4902008376945;
        double lon = 4.28921666956459;
        object1.setLatitude(lat);
        object1.setLongitude(lon);

        object2.setLatitude(lat);
        object2.setLongitude(lon);

        System.out.println("Distance between " + object1 + " and " + object2 + ": " + object1.distance(object2) + " reverse=" +
                object2.distance(object1));

        assertEquals(object2.distance(object1), 0.0, 0.00000001);
}

И о чудо - тест проваливается - и отладчик показывает что расстояние между object1 и object2 равно NaN. Приплыли. Проход в дебаггере показал, что брался арккосинус от значения едва больше единицы (что-то в вроде 1.00000000002) что оказалось фатальным. Добавление

 
dist = Math.min(dist, 1);
перед 4 строкой спасло отца русской демократии и чудеса закончились.

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

воскресенье, 30 сентября 2012 г.

На кухне крутых кодеров

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

В целом книга уж точно как минимум заслужила 4 или даже 5 с минусом. Каждому программисту задается некоторый набор общих так и уникальных вопросов. Из общих вопросов выделяются просьба о рекомендации литературы обязательной к прочтению (и некоторые даже не могли ничего предложить, так как очень мало читают). Так же интересен вопрос про отношение к партерном - некоторые считают это "отрыжкой плохих языков" )).

Вообще очень сильный уклон в сторону довольно возрастных программистов из молодых выделяется разве что Брэд Фицпатрик, создатель livejournal. Вообще читая его интервью (ему тогда было 28 лет) увидел как много у таких успешных программистов зависит от таких вещей как программирование в школе, отношения родителей к компьютерам, встреча с правильными людьми, правильный университет и т.п. Кажется что в этом месте очень многое было мной упущено (как впрочем и у очень многих детей из бывшего СССР), но тут уже ничего не поделаешь, остается только пытаться все догнать уже сейчас.

Как наконец выучить все эти паттерны

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

Брал я эту книгу с некоторым скепсисом, так как уже читал одну книгу из этой серии (по objective с)  и остался несколько разочарован. Книга описывает самые популярные паттерны проектирования в развлекательной манере с повторением одного и того же по несколько раз.  Довольно много сравниваются похожие паттерны (например Стратегию и Состояние) что бы подчеркнуть их различия, что вообще говоря выглядит достаточно эффективно, как способ обучения.

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