понедельник, 28 сентября 2015 г.

Java Enterprise: что и как учить (статья специально для DOU)

Я выступал с аналогичной темой на IT fest, и, судя по реакции зала, людям было интересно. Формат доклада сжатый, многое пришлось проговаривать уже потом, отдельно от выступления. Да и качество записи вышло не очень, не всё слышно. Поэтому решил написать статью.
Сначала о себе любимом. У меня достаточно большой опыт работы java-разработчиком (с 2001 года, даже считать страшно), а программистом и того больше — с 96-го. Большую часть из этих лет я работал тимлидом в разных аутсорсинговых компаниях Киева. Кроме того, более 10 лет я преподаю в учебных центрах Luxoft, NetCracker и вот IntroPro. И даже год вёл в школе информатику. В общем, обучать умею. Ну и с другой стороны, во многих компаниях я выступал как технический специалист, проводящий собеседование. Так что я еще и тот самый человек, который знает, о чем вас будут спрашивать на будущей работе. В этом году я принял участие в создании учебной программы по java в GoIT и преподавал в одной из групп. Большинство моих студентов уже работают.
Я это всё рассказал не ради хвастовства, а для того, чтобы пояснить, на чём я основываюсь, говоря о списке технологий и порядке обучения.
Итак, начнем, и внезапно с конца — я соберу выводы, которые сделал из обучения молодых специалистов.

вторник, 25 февраля 2014 г.

Шаблоны разработки (полный курс) (плейлист)

Шаблоны разработки (полный курс) (плейлист)



Вот, наконец мне выделили время, чтобы прочесть полный курс по паттернам. Следите за обновлениями - лекции каждый вторник и четверг,в  принципе можно попробовать киевлянам прийти - 10:00-12:00, на Позняках.



В планах после этого курса будут рефакторинг, Enterprise patterns и еще многов сего.

среда, 10 июля 2013 г.

Design patterns (плейлист)



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

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

Если есть идеи для следующих курсов лекций - отписывайтесь так же. Постараюсь что-то придумать.

среда, 8 мая 2013 г.

Лекции по основам Java (плейлист)

Как видят наши читатели, писать посты мне надоело. Да, ленив уж больно. Поэтому вместо написания я занялся их записыванием. Все новодобавленные видео моих лекций я выкладываю на  Youtube вот в этом канале. Если кому интересно - слушайте и комментируйте. Буду признателен.

пятница, 26 апреля 2013 г.

Лекция по Java для начинающих

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


вторник, 4 декабря 2012 г.

XML или как его едят

Сегодня мы публикуем статью , человека, который недавно начал изучать Java. Думаю, что это будет интересно таким же новичкам, как и он. Итак, встречайте

AlexNNovak

Работа с XML, что же в этом направлении на сегодняшний момент времени написано очень много статей с примерами и примеров со статьями, некоторое из них лучше, некоторые хуже, некоторые можно сказать совсем отвратительные. Отвратительные они в том плане, что читающий их человек может совершенно бездумно скопировать пример описанный в статье и так же, не задумываясь и не углубляясь в подробности изменив два значения его использовать.  «А что в этом плохого?» совершенно справедливо спросите Вы, «Взял мол, готовый кусок кода, подправил под свои потребности и используй!», вот тут то и заключается «плохо». Используя чужой код Вы отвыкаете думать сами, и я не подразумеваю библиотеки сторонних разработчиков, я имею ввиду конкретно код примеров из статей.  Ну да ладно, я отвлекся и хватил немного в сторону.

Итак, я не претендую на ни на истину  ни на велосипед, но, перед тем как начать работу с великим и могучим XML-ем нам надо сперва определить, какое действие с ним, мы хотим выполнить, а именно: создать XML документ – записать некие данные использую определённую структуру или наоборот разобрать(parse) XML документ – из готового документа подчиненного строгой структуре извлечь интересующие нас данные. Когда мы определились, что именно мы хотим делать, мы должны понять, какими методом в данной конкретной ситуации нам удобнее и/или правильнее поступать.

Признаюсь честно, что с созданием XML документов мне пока сталкиваться не приходилось, посему буду описывать методы, к которым прибегал и которые, как я считаю для совсем уж начинающего Java программиста или QA Automation инженера самые быстрые в освоении и понимании. Итак, я выбрал два основных метода: это DOM и XPath.

вторник, 6 ноября 2012 г.

О перспективах Java. Часть 1

Получили очень интересный вопрос в комментариях, сразу его и процитирую:

Avicorn: Новичковый вопрос: на сколько сейчас востребованы программисты на java, в том числе - начинающие?
С учетом последних фортелей Oracle (смена лицензии и закрытие 100500 открытых еще Sun'ом проектов, исключение java-машины из linux-дистрибутивов и т.п.) и активного развития .net и php (если речь идет о вебе) будущее платформы видится туманным.
 Не буду голословным, поэтому начну с фактов. И сразу оговорюсь, буду говорить только про Киев, так как ситуацией в других городах не владею. Факты - это количество вакансий и количество соискателей. Вернее их отношение. Так вот, фактически последние пять лет у меня не было ни единого раза, чтобы были заполнены все вакансии - людей постоянно не хватает. Как заметили мне в комментариях - заполненность вакансий - 0.3 человека на место. Зарплаты в долларах у программистов на Java за последние пять лет же выросли от 1000 долларов до 2500 долларов для middle developer со стажем с года до 6 лет. Если кому хочется посмотреть текущую ситуацию с зарплатами, то среднюю температуру по больнице можно оценить вот здесь: на dou.ua . Обращаю внимание, что данные эти по настоящему "средние", то есть существенно искажены в сторону уменьшения, тем, что в рейтинг попадают и сотрудники гос предприятий и разработчики компаний, работающих на отечественный (читай бСССР) рынок. Почему у них зарплаты существенно меньше - чуть позже. Вывод - перспективы прекрасные.

hashCode

В прошлой заметке мы говорили о HashMap, hashcode() и немного equals().

Краткое содержание: записывая пару ключ-значение (запись)  в HashMap, мы помещаем ее в одну из ячеек (бакет) массива. То, в какую именно ячейку будет помещена запись (индекс ячейки в массиве) определяется по значению hashcode() ключа. Поскольку в один бакет может быть помещено несколько записей, то в бакет записываются не сами записи, а содержащие их связные списки.

В HashMap могут быть помещены записи только с уникальными ключами. Уникальность определяется методом equals(). То есть если

new Integer(1).equals(new Integer(1)); - вернул true - объекты равны.

Чтобы вся эта система корректно работала, необходимо соблюдать 2 правила (и пожалуйста, дальше - читать обязательно, потому что именно этот вопрос любят задавать на собеседованиях):

1. равные объекты должны иметь один и тот же hashcode
 то есть, если equals - true, hashcode() возвращает одинаковое число
2. объекты, имеющие разный hashcode - неравны
то есть если hashcode() возвращает разные числа, equals обязано вернуть false

Почему соблюдать эти правила необходимо?

понедельник, 5 ноября 2012 г.

HashSet

Пару строчек про HashSet

Set - множество уникальных элементов. Как определить уникальность мы поговорим в другой раз, вкратце - это делается с помощью метода equals(). Теперь о внутреннем устройстве: множество уникальных объектов - это как раз та вещь, о которой мы говорили в статье HashMap, только там это было множество объектов ключей. И действительно, если мы посмотрим на внутреннее устройство HashSet, найдем там объект HashMap. То есть HashSet - обертка для HashMap. Объекты, записываемые в Set, располагаются в качестве ключей, в качестве значения всегда записывается один и тот же объект типа Object.

Кстати, в классе LinkedHashSet данные содержатся во внутреннем объекте типа LinkedHashMap, а в классе TreeSet - в TreeMap

четверг, 1 ноября 2012 г.

Что нужно знать Java разработчику для прохождения собеседования

Мы как-то резко разогнались с женой и сразу начали накидывать информацию. Настала пора притормозить и начать с начала.

А начало у нас будет простое. Для чего мы работаем? Если кто-то скажет "для удовольствия", "для того, чтобы узнать что-то новое" или не приведи Господи "чтобы работать в  команде", киньте, пожалуйста в него чем-нибудь тяжелым. Зачем этот HR к нам пришел? Самое главное и не надо этого стесняться, мы работаем ради денег. Так вот, цель определили. Теперь как к ней идти.

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

среда, 31 октября 2012 г.

HashSet и HashMap

Самые распространенные вопросы для собеседований можно собрать в группы. И одной из самых частых групп являются вопросы о Collection framework. Об одном из аспектов этого фреймворка мы сегодня и поговорим.

Говорить о классах Collections framework, как и о сортировке и поиске данных можно много, поэтому давайте организуем пост в виде вопросов и ответов. А вопросы постараемся задать такие же, как это делают интервьюеры.

вторник, 30 октября 2012 г.

[Tips] PatternSyntaxException: Unmatched closing ')'

Сегодня надо было мне разрезать строку, содержащую некоторые данные на составные части. Выглядела эта строка примерно так:
data(data)=(
    subdata1=1;
    subdata2 =...
)
data(data2)=(
   ...
   ну и так далее
   ....
)
Я, как умная Маша, сразу написал content.split("\n)\n");
и естественно получил ошибку, которая вынесена в заголовок. Дело в том, что в регэкспах скобка является ключевым символом и парсер, естественно, искал закрывающуюся скобку. А мне-то скобка была нужна именно как скобка! А вот фиг. попробовал ее заэскейпить бек-слешом. Не проходит. С точки зрения самой Java \) - это дурость какая-то. Но верный интернет быстро помог найти решение - надо поставить два бек-слеша. Так получается, что первый бекслеш эскейпит второй и в движок парсера отправляется уже скобка заэскейпленная вторым. Вот. Как-то путанно обьяснил, но, надеюсь понятно. В любом случае, вот так:
content.split("\n\\)\n");
работает. С чем я себя и поздравляю.

понедельник, 29 октября 2012 г.

Запоздалое вступление

Здравствуйте все.

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

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

Итак, сначала представляемся. Мы - семья. Та самая, анекдотическая семья программистов, причем пишем на одном и том же языке (внезапно, джава). В общем-то, это вполне предсказуемо - познакомились мы как раз на работе. Зовут нас Сергей (это как раз я) и Алена (она пишет под именем Эритака).  Работаем мы достаточно давно. Я, например, с 96-го года работаю программистом, а Алена - не так много, тем более, что у нас есть двое чудных деток, младшая как раз 2012 года рождения. так что супруга сидит дома в декрете, но по любимой работе скучает.

В общем-то, как раз следствием этого "скучания" и стал этот блог, где Алена записывает всякие мысли по ходу вспоминания аспектов, которые ей пригодятся потом, когда декрет кончится и она вернется к работе.

Я же, со своей стороны, являюсь по второй профессии java trainer, и вообще - очень люблю рассказывать людям о том, что знаю сам. Веду несколько курсов по базовой джава, по паттернам (GRASP, GoF, Enterprise), Agile методолгии (являюсь Sertified Scrum Master) ну и по всяким разным аспектам (рефакторинг, юнит-тестирование и т.д.).

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

Кстати, если кому интересно, у нас есть такой же семейный блог по ММО играм. Но это так, не важно.

В общем, что я хотел сказать - не бойтесь задавать самые новичковые вопросы, мы постараемся на них ответить и никого не будем посылать читать документацию, РТФМ, в смысле :). Спрашивайте, комментируйте. мы будем рады.


четверг, 31 марта 2011 г.

getCurrentSession() дубль 2


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

Согласно книге, стандартная архитектура приложения, использующего базу данных и какой-либо фреймворк для работы с ней (обычно это ORM - object-relational mapping система) состоит из 3 уровней:
- доменная модель - обьекты предметной области, которые и нужно сохранять в базе
- DAO - уровень, абстрагирующий нас от конкретной реализации операций с БД. Сюда входят интерфейсы, описывающие базовые операции с базой данных, например, сохранение обьекта, нахождение обьекта по условиям и т.д. В книге рекомендуется для каждой сущности доменной модели создавать свой DAO. Ну и конкретная реализация этих интерфейсов, в зависимости от выбраной ORM-системы, JDBC etc. При желании реализацию можно поменять, не меняя бизнес-логику (классы бизнес-логики зависят только от интерфейсов, описывающих общие методы доступа к БД, без ссылок на конкретную реализацию). А используя Spring это можно сделать, просто изменив файл конфигурации.
- Сервисный уровень - здесь реализуется бизнес-логика. Методы представляют собой unit of work с точки зрения предметной области. Ну там всякие снять деньги со счета-положить на другой счет в одной операции. Именно методы этого уровня рекомендуется делать транзакционными.

понедельник, 21 марта 2011 г.

Hibernate & автогенерация ID

Для того, чтобы автоматически сгенерировать ID для ентити, необходима запись вида:

@Id
@GeneratedValue(
strategy=GenerationType.TABLE)
public Long getId() {
   return id;
}

public void setId(Long id) {
   this.id = id;
}

понедельник, 14 марта 2011 г.

Транзакции

Оказывается, даже в самых известных API есть издержки проектирования, что очень сильно подрывает нашу, начинающих программеров, веру в Божественную Святую Непогрешимость людей, пишущих всю эту красоту. Возьмем к примеру интерфейс UserTransaction. Интерфейс представляет собой сущность - транзакцию. Мы ее можем начать (begin()), выполнить (commit()) или откатить (rollback() или setRollbackOnly()). И вот скажите мне, мои более опытные коллеги, для чего нужен второй метод setRollbackOnly()?
Аналогичным вопросом задался и один из завсегдатаев Салона Большого Лося:
http://www.coderanch.com/t/157891/java-EJB-SCBCD/certification/When-UserTransaction-setRollbackOnly-UserTransaction-rollback

Обратите внимание на ответ девушки:
"... you might know the transaction is going badly *before* you reach the place where the transaction actually ends. You might not want to end the tx at the moment you discover it won't work, for many reasons. Perhaps you want to keep only one place in your code where the transaction ends. Or... you might need the rest of the transactional code to run for other side-effects ..."

Переводя на русский, setRollbackOnly() используется тогда, когда в середине транзакции стало понятно, что что-то пошло не так и транзакцию надо откатить, но вы хотите, чтобы оставшийся код доработал до конца. Почему вы можете вдруг этого захотеть? У вас 2 варианта: либо вы поклонник модульного программирования и концепции один вход-один выход (вот ссылка http://high-info.ru/Modulnoe_programmirovanie.htm - правда его взломали, но картинки повставляли веселые и даже по теме), либо ваш код производит какие-то побочные эффекты, которые должны быть сохранены независимо от исхода транзации. В любом случае, все это очень сомнительно (http://en.wikipedia.org/wiki/Code_smell)

пятница, 11 марта 2011 г.

Разница между Hibernate openSession() и getCurrentSession()

Начала готовиться к собеседованию и делать тестовое приложение. Основной целью было вспомнить как собственно оно все пишется и настраивается в разных фреймворках. Для начала взяла Hibernate. Однако столкнулась с трудностью: в книге, по которой я изучала Hibernate (надеюсь, найду ее и вставлю ссылку) для получения сессии использовалась функция openSession(), а в текущей документации все примеры основаны на другой функции - getCurrentSession(). В SessionFactory есть обе эти функции, но в чем же разница? Поскольку мне предстоит собеседование решила исследовать вопрос.

Ссылки по теме:
Java docs
http://ajava.org/online/hibernate3api/org/hibernate/SessionFactory.html

А вот здесь человек очень хорошо все обьяснил, но по-английски:
http://www.jeevanchaaya.com/2009/04/11/getcurrentsession-or-opensession-a-sessionic-dilema/