Продолжая историю с шаблонами у меня наконец дошли руки до давно мною купленной книги "Рефакторинг с использованием шаблонов" Джошуя Кериевски.
Книга очень сильна по своей структуре напоминает книгу Фаулера о рефакторинге - те же перечисление различных рефакторингов вместе с правилами их применения и примерами. Все примеры, кстати, на java.
Коротко говоря книга представляет собой смешивание идей уже упомянутого Фаулера и банды четырех: как наиболее правильно улучшать проект, применяя шаблоны, и делая эта с помощью инструментов рефакторинга. Идея интересная, и в большинстве случаев, работает - разве что надо постоянно себя контролировать и отдергивать за руку, что бы не терять чувства меры.
Из плюсов отметил бы не плохие примеры использования TDD при разработки, сами примеры взяты из реальной практики и книга не затянута. Так же книга содержит вполне умеренные дозы UML. Из недостатков: раздела "механика" зачастую тривиальны и просто занимают кучу места не неся какой-то реальной пользы (впрочем тогда их можно просто пропускать).
В общем отличная книга - после Фаулера и Гаммы с Ко обязательна к прочтению.
воскресенье, 18 ноября 2012 г.
воскресенье, 11 ноября 2012 г.
Опять double
Недавно занимался проблемой кластеризации наборов объектов из нескольких разных источников. После написания первой версии алгоритма решил проверить алгоритмы на вшивость класторизовав данные от одного источника с самими собой. Понятно, что я рассчитывал 100% совпадение всех объектов и какого же было мое удивление когда из ~250 тысяч объектов не класторизованными оказались примерно 7 тысяч объектов. Чудеса. Принялся копать и искать волшебника.
Изучение логов прояснило ситуацию.
Одним из факторов при кластеризации является дистанция между объектами, вычисленная на основе долготы и широты. Код для этого дела широко распространен в интернете и выглядит примерно так:
И о чудо - тест проваливается - и отладчик показывает что расстояние между object1 и object2 равно NaN. Приплыли. Проход в дебаггере показал, что брался арккосинус от значения едва больше единицы (что-то в вроде 1.00000000002) что оказалось фатальным. Добавление
Изучение логов прояснило ситуацию.
Одним из факторов при кластеризации является дистанция между объектами, вычисленная на основе долготы и широты. Код для этого дела широко распространен в интернете и выглядит примерно так:
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 лет) увидел как много у таких успешных программистов зависит от таких вещей как программирование в школе, отношения родителей к компьютерам, встреча с правильными людьми, правильный университет и т.п. Кажется что в этом месте очень многое было мной упущено (как впрочем и у очень многих детей из бывшего СССР), но тут уже ничего не поделаешь, остается только пытаться все догнать уже сейчас.
В целом книга уж точно как минимум заслужила 4 или даже 5 с минусом. Каждому программисту задается некоторый набор общих так и уникальных вопросов. Из общих вопросов выделяются просьба о рекомендации литературы обязательной к прочтению (и некоторые даже не могли ничего предложить, так как очень мало читают). Так же интересен вопрос про отношение к партерном - некоторые считают это "отрыжкой плохих языков" )).
Вообще очень сильный уклон в сторону довольно возрастных программистов из молодых выделяется разве что Брэд Фицпатрик, создатель livejournal. Вообще читая его интервью (ему тогда было 28 лет) увидел как много у таких успешных программистов зависит от таких вещей как программирование в школе, отношения родителей к компьютерам, встреча с правильными людьми, правильный университет и т.п. Кажется что в этом месте очень многое было мной упущено (как впрочем и у очень многих детей из бывшего СССР), но тут уже ничего не поделаешь, остается только пытаться все догнать уже сейчас.
Как наконец выучить все эти паттерны
В отпуске взял с собой пару книжек по программированию что бы, валяясь на пляже, можно было бы с толком провести время. Одной из этих книжек была Паттерны проектирования от Фрименов.
Брал я эту книгу с некоторым скепсисом, так как уже читал одну книгу из этой серии (по objective с) и остался несколько разочарован. Книга описывает самые популярные паттерны проектирования в развлекательной манере с повторением одного и того же по несколько раз. Довольно много сравниваются похожие паттерны (например Стратегию и Состояние) что бы подчеркнуть их различия, что вообще говоря выглядит достаточно эффективно, как способ обучения.
В общем при внимательном прочтении (и если делать упражнения хотя бы в уме) книга позволяет очень хорошо освоить базовые паттерны, знать которых просто необходимо в современных условиях. До этого я читал книгу банды четырех и даже очень внимательно ее изучив так и не смог окончательно выучить основные вещи. После этой книги в голове все уложилось очень хорошо и вообще впечатление после прочтения остались просто отличные. И вывод в конце очень правильный - читать Паттерны проектирования как учебник и банду четырех как справочник. В общем если вы плаваете в паттернах самое время взяться за эту книгу.
Брал я эту книгу с некоторым скепсисом, так как уже читал одну книгу из этой серии (по objective с) и остался несколько разочарован. Книга описывает самые популярные паттерны проектирования в развлекательной манере с повторением одного и того же по несколько раз. Довольно много сравниваются похожие паттерны (например Стратегию и Состояние) что бы подчеркнуть их различия, что вообще говоря выглядит достаточно эффективно, как способ обучения.
В общем при внимательном прочтении (и если делать упражнения хотя бы в уме) книга позволяет очень хорошо освоить базовые паттерны, знать которых просто необходимо в современных условиях. До этого я читал книгу банды четырех и даже очень внимательно ее изучив так и не смог окончательно выучить основные вещи. После этой книги в голове все уложилось очень хорошо и вообще впечатление после прочтения остались просто отличные. И вывод в конце очень правильный - читать Паттерны проектирования как учебник и банду четырех как справочник. В общем если вы плаваете в паттернах самое время взяться за эту книгу.
О двухтомнике Core Java
Недавно производственная необходимость и просто любопытство подтолкнуло меня к написания продакшен систем на Java. Знакомство с этим новым для меня языком я решил начать с довольно известного в узких кругах двухтомника Core Java от Кея Хорстманна и Гари Корнелла.
Если в двух словах то книга мне очень понравилась - написано очень толково без лишней воды и ненужных отступлений. Кроме описания самого языка, довольно живого и без лишнего формализма, есть еще очень хорошее описание библиотек java (собственно весь второй и посвящен в основном работе с библиотеками). Особый бонус этих книг - многочисленные отсылки, прежде всего в первом томе, к языку С++ с обсуждением параллелей, общих мест и различий. Мне как старому С++ программеру это было очень полезно.
Первый том содержит описание языка и самый основы работы с библиотеками, а второй том содержит описание остальных частей библиотеки и различные тонкие моменты работы с языком (например, такие как безопасность).
Полезно было почти все, разве что работа с UI пока мне абсолютно не нужно и солидную часть его описание во втором томе я просто пропустил.
Отлично описано многопоточное программирование, потоки, коллекции, работа с XML, сетевого программирования, работой с JDBC - в общем всего что надо для написания уже вполне серьезных приложений.
В общем надо быстро освоить Java если ты хорошо знаком с С++ - Core Java совсем неплохой выбор.
вторник, 4 сентября 2012 г.
Развращенные Iдеей
У нас много и со вкусом пишут на IntelliJ Idea да и на прочих продуктах jetbrains (типа WebStorm, PyCharm и т.п.), благо лицензия позволяет.
С недавнего времени и я вступил в клуб активных пользователей данных продуктов - ну прежде всего идеи, но и PyCharm с AppCode уже успел пощупать.
Да продукт крутой, спору нет. Его магия по предсказанию того что ты хочешь сказать иногда просто завораживает и кажется что так просто не может быть - и иногда проскакивает мыслишка: "а как он вообще смог догадаться!?".
Но, совершенно случайно, знакомясь с новым для меня языком программирования и задавая всякие наивные вопросы более опытным по этим делам коллегам, я выяснил, что же, черт побери, это интеллектуальная идея творит?!
Невинный вопрос: если передать String в функцию и там ее поменять, то вызвавший код увидит изменения - т.е. значения передаются по значению или по ссылке? Ответ: эээ, мы так не делаем - не в курсе.. Вопрос решился после написания коротенького теста.
Дальше: Как правильно, то писать параметры шаблона функции
Pair<A, T>.of или может Pair.of<A, T> или все-таки так Pair.<A, T>of?! Ответ: хм, не знаю - идея говорит, что это тут лишнее - значения и так выведутся из параметров функции. Но все таки, как правильно то писать? Хм, ну давай попробуем вставить во все возможные места и поймаем момент когда идея перестанет подсвечивать красным. WTF?!
А может не стоит начинать сразу с идеи?! Возьмите старый добрый mcedit или может даже vi - просто ручками попишите старый добрый жава код. Ручками откомпилируйте его и протестирует. Уверен тогда будут приобретены сокровища неведомых знаний. И уж в конце, когда все станет совсем ясно и понятно можно запустить идею что бы писать код на пару порядков быстрее. Именно в таком порядке надо учиться и именно так правильно.
С недавнего времени и я вступил в клуб активных пользователей данных продуктов - ну прежде всего идеи, но и PyCharm с AppCode уже успел пощупать.
Да продукт крутой, спору нет. Его магия по предсказанию того что ты хочешь сказать иногда просто завораживает и кажется что так просто не может быть - и иногда проскакивает мыслишка: "а как он вообще смог догадаться!?".
Но, совершенно случайно, знакомясь с новым для меня языком программирования и задавая всякие наивные вопросы более опытным по этим делам коллегам, я выяснил, что же, черт побери, это интеллектуальная идея творит?!
Невинный вопрос: если передать String в функцию и там ее поменять, то вызвавший код увидит изменения - т.е. значения передаются по значению или по ссылке? Ответ: эээ, мы так не делаем - не в курсе.. Вопрос решился после написания коротенького теста.
Дальше: Как правильно, то писать параметры шаблона функции
Pair<A, T>
А может не стоит начинать сразу с идеи?! Возьмите старый добрый mcedit или может даже vi - просто ручками попишите старый добрый жава код. Ручками откомпилируйте его и протестирует. Уверен тогда будут приобретены сокровища неведомых знаний. И уж в конце, когда все станет совсем ясно и понятно можно запустить идею что бы писать код на пару порядков быстрее. Именно в таком порядке надо учиться и именно так правильно.
воскресенье, 5 августа 2012 г.
Тайм менеджмент и "Правила Джобса" от Кармина Галло
Недавно наша компания организовала для нас курсы по тайм менеджменту на пару дней. Вообще было интересно:
- сформулировали свою миссию (хм, для меня она все равно пока остается достаточно абстрактной)
- построили планы на 20 лет вперед (и они оказались у нас удивительно похожи)))
- поговорили про планирование
- обсудили среднесрочное и краткосрочное планирование
- построили пинарик (очень стимулирует - рекомендую)
- и изучили еще кучу всего интересного.
По завершению неожиданно для себя стал вести трекинг своего времени, планировать каждый день (с помощью жестких и гибких задач), и занялся поеданием одного очень большого "слона".
Через некоторое время мне в руки попалась книга "Правила Джобса" Кармина Галло.
Сама по себе книга на троечку - очень много воды и сомнительных примеров. Книга разделена на 7 частей исходя из 7 принципов которые, как бы, были взяты у Стива Джобса:
1. Делайте то, что любите.
2. Оставьте след во вселенной.
3. Встряхните ваше сознание.
4. Продавайте мечты, а не продукты.
5. Скажите "нет" тысяче вещей.
6. Создайте безумно великий опыт.
7. Овладейте посланием.
Так вот - тайм менеджмент это во многом про то, как понять что вы любите и выстроить свою жизнь так, что бы именно этим и заниматься..
- сформулировали свою миссию (хм, для меня она все равно пока остается достаточно абстрактной)
- построили планы на 20 лет вперед (и они оказались у нас удивительно похожи)))
- поговорили про планирование
- обсудили среднесрочное и краткосрочное планирование
- построили пинарик (очень стимулирует - рекомендую)
- и изучили еще кучу всего интересного.
По завершению неожиданно для себя стал вести трекинг своего времени, планировать каждый день (с помощью жестких и гибких задач), и занялся поеданием одного очень большого "слона".
Через некоторое время мне в руки попалась книга "Правила Джобса" Кармина Галло.
Сама по себе книга на троечку - очень много воды и сомнительных примеров. Книга разделена на 7 частей исходя из 7 принципов которые, как бы, были взяты у Стива Джобса:
1. Делайте то, что любите.
2. Оставьте след во вселенной.
3. Встряхните ваше сознание.
4. Продавайте мечты, а не продукты.
5. Скажите "нет" тысяче вещей.
6. Создайте безумно великий опыт.
7. Овладейте посланием.
Так вот - тайм менеджмент это во многом про то, как понять что вы любите и выстроить свою жизнь так, что бы именно этим и заниматься..
Подписаться на:
Сообщения (Atom)






