Елена Булыгина предлагает Вам запомнить сайт «Ленусик»
Вы хотите запомнить сайт «Ленусик»?
Да Нет
×
Прогноз погоды

Основная статья: Java

На что смотрят работодатели, когда оценивают ваш код

Новичкам еще сложнее — у них не хватает опыта, чтобы адекватно оценить качество своего кода. Максимум, на что может рассчитывать работодатель, — ссылка на GitHub-профиль, где его ждет пара-тройка учебных задач. Чтобы сэкономить время, руководители IT-отделов начинают с главного: предлагают соискателю написать код.

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

«Если меня заинтересовал присланный код, прямое собеседование кандидату гарантировано. Я оцениваю, насколько хорошо разработчик ориентируется в базовых принципах объектно-ориентированного программирования. Правильно спроектированная объектная модель для задачи — огромный плюс для кандидата».
Константин Ян, сооснователь и технический директор CloudPayments

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

Обычно в качестве тестовых заданий кандидатам дают абстрактные задачи, а не реальные бизнес-кейсы. По ним работодатель оценивает:

  • знание языка/технологий,
  • логические способности кандидата,
  • его уровень аккуратности и педантичности, читаемость кода.
Сколько у вас времени на выполнение тестового?

Обычно работодатели подбирают такие задачи, которые потребуют у middle-разработчика не больше 7-8 часов, но джуниорам дают больше времени. Постарайтесь прислать результат не позже, чем через 3-5 дней. Помните, что единицы среди работодателей оплачивают выполненное тестовое. Но каждая решенная задача прибавляет вам опыта.

Что важнее, сколько времени вы потратите или как напишете код? Универсальный совет: присылайте код, который решает поставленную задачу, и оформляйте его в соответствии с принятыми в сообществе разработчиков стандартами. Чем быстрее можно разобраться в вашем коде, тем больше у него шансов.

Вы пройдете собеседование, если ваш код:

Работает без ошибок, решает поставленную задачу, покрыт тестами

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

«Разработчик должен решить задачу, удостовериться в этом и предоставить доказательства».
Павел Романченко, технический директор Центра программных решений, «Инфосистемы Джет», язык программирования — Java

Соблюдает общепринятые принципы:

SOLID — акроним для пяти основ­ных прин­ци­пов про­ек­ти­ро­ва­ния в ООП: прин­ципа един­ствен­ной ответ­ствен­но­сти (Single responsibility), откры­то­сти/закры­то­сти (Open-closed), под­ста­новки Бар­бары Лис­ков (Liskov substitution), раз­де­ле­ния интер­фейса (Interface segregation) и инвер­сии зависимостей (Dependency inversion);

KISS (акроним для «Keep it simple, stupid», то есть призыв не усложнять код),

DRY (акроним для «Don’t repeat yourself», призыв не повторяться) и другие.

«Эти моменты позволяют понять, насколько глубоко человек погружен в тему разработки, как сильно он ей интересуется. Если кандидат, который еще нигде толком не работал, соблюдает базовые принципы написания кода, это хороший знак. Значит, изучал данный вопрос, причем, скорее всего, самостоятельно, потому что в рамках университетских программ на этом редко акцентируют внимание».
Алексей Максимов, руководитель разработки Mediasoft, языки программирования: PHP, JavaScript

Максимально прост

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

«Новичкам кажется, что опытный специалист работает на опережение и поэтому проектирует «на вырост». Начинающие разработчики пытаются предугадать и просчитать все возможные случаи развития системы. Это множит абстракции и лишние архитектурные слои в их коде.
На самом деле, профессионал пишет код для конкретной задачи, и для этого необязательно использовать все известные паттерны и архитектурные решения».
Сергей Козлов, ведущий программист проекта «Айхор Хостинг» компании МАРОСНЕТ. Языки программирования: The Go Programming Language, JavaScript, PHP

Выдержан в едином стиле

Тестовое задание должно соответствовать стандартам оформления кода, принятым в языке программирования. Это не нудное требование преподавателя информатики: стандарты утверждены и используются мировым сообществом программистов. Ширина отступов, регистр переменных, стиль записи комментариев — если все это соответствует стандартам, программу легко читать, не приходится напрягать память и зрение.

«Когда работаешь в команде, помни о том, что твой код будут читать другие разработчики. Смогут ли они быстро понять, что происходит на экране? Внести изменения, не погружаясь глубоко в контекст задачи?»
Илья Гордиенко, Backend-Lead ONDOC. Языки программирования: PHP, Python

Понятен, при необходимости пояснен комментариями

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

«Часто я решаю тестовое задание и только потом сравниваю свой результат с тем, что прислал кандидат. Поддержка старого кода — самая дорогая часть проекта, поэтому важно уметь сразу писать его понятным другим разработчикам».
Зураб Белый, руководитель группы (TeamLead), практика — Java, «Рексофт»

Если вам тяжело дается тестовое задание, работодатель, скорее всего заметит это. Код, написанный новичком, часто напоминает лоскутное одеяло. Павел Романченко, технический директор Центра программных решений, «Инфосистемы Джет», советует новичкам: «Когда решили задание, отнеситесь к написанному как к черновику и перепишите заново с правильным наименованием и с комментариями. Важно, чтобы за кодом была видна мысль, а не вымученные формулировки».

Если возникли сложности с тестовым: советы

Не уложились в срок? Покажите сделанное.

Ваш потенциал виден даже в функциональности, не реализованной до конца.

«Неважно, почему вы не успели. Покажите то, что уже написано: даже на основании этого кода можно многое понять. Не поленитесь описать в сопроводительном письме или рассказать при встрече, как вы планировали реализовать задачу. Умение продумывать варианты решения и доходчиво их излагать ценится не меньше, чем умение писать код».
Алексей Максимов, руководитель разработки Mediasoft. Языки программирования: PHP, JavaScript

Задавайте больше вопросов. Учитесь у лучших.

Не бойтесь уточнять детали тестового задания. Обращайтесь к более опытным коллегам за советами и идеями. Черпайте вдохновение и знания в качественных источниках. Так вы развиваете мышление и повышаете уровень подготовки.

«Новичкам я советую читать книги и статьи только проверенных авторов. Не бойтесь задавать вопросы и консультироваться с более опытными коллегами. Читайте их код и всегда (даже так: ВСЕГДА) уточняйте, почему сделано именно так, а не иначе, почему выбран именно такой подход, а не другой. Успехов в карьере!»
Зураб Белый, руководитель группы (TeamLead), практика — Java, «Рексофт»

Энтузиазм не менее важен, чем чистота кода!

«Синтаксису, паттернам и best practices можно научить, а вот умению излагать мысли, работать в команде, ответственности и особенно горящим глазам — нет».
Сергей Шитиков, руководитель отдела разработки «Суточно.ру»

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

«На собеседовании я объясняю, что говорить “я не знаю” — абсолютно нормально в рабочей ситуации. Мы каждый день сталкиваемся с уникальными задачами, у нас нет готовых решений. Кандидат должен понять, что академические знания, полученные в учебном заведении, не помогут ему в ежедневной работе. Гораздо важнее научиться думать, рассуждать и искать оптимальные решения».
Константин Ян, сооснователь, технический директор платежного сервиса CloudPayments

Практически все эксперты солидарны в главном: важнее всего в кандидате — умение думать. Всему остальному, при желании, вас смогут научить на новом месте работы. Удачи!

Пройти обучение

6 фев 19, 17:00
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Взгляд изнутри: как работается в «Альфа-Банке»

Здравствуйте Михаил! Расскажите, как вы устроились в «Альфа-Банк»?

— Я отдал резюме представителям банка на Дне карьеры GeekUniversity в Mail.Ru. Через пару дней меня пригласили на собеседование, которое состояло из нескольких этапов. С момента подачи резюме до выхода на работу прошло меньше недели.

Почему вы выбрали «Альфа-Банк»?

— У каждого собственные приоритеты. Одним нравится важность и сложность проекта, а некоторые ищут новые технологии и стремятся идти в ногу со временем. У меня другой приоритет — мне важна рабочая атмосфера. В «Альфа-Банке» все друг с другом доброжелательны и общаются позитивно. В других организациях с этим жестче, один сплошной стресс. Я думаю, что работа должна приносить радость, тогда и ходить на нее одно удовольствие.

Организация работы

Давайте поговорим о том, как устроена работа в банке. С которого часа начинают работать?

— Все по-разному. Я работаю в open space, в котором сидит несколько команд. Вижу, что некоторые приходят в 11:00 и уходят в 20:00, но я работаю с 9:00 до 18:00. С утра у всех команд проходит daily — утреннее совещание, на котором сотрудники обсуждают, что произошло вчера и как у всех обстоят дела, распределяют задачи на день. У нас daily в 9:45. Обсудили — пошли работать. Начиная с 10:15 никто никого не трогает — у всех есть работа.

Совещания daily относятся к Scrum?

— Да, daily относится к Scrum. Это методология, помогающая команде управлять процессом разработки. Она позволяет в небольшие временные итерации предоставлять конечному пользователю работающий продукт. Сейчас расскажу подробнее.

Сначала мы разбиваем большую задачу на много мелких и сортируем их по смыслу. Потом собираем задачи в спринты — укладываем их в фиксированный промежуток времени, за который планируем их реализовать. Все задачи добавляются на Канбан-доску, на которой есть столбцы «Нужно сделать», «В разработке», «Тестируется», «Выполнено». У каждой задачи — собственный жизненный цикл — от аналитики и разжевывания деталей до тестирования и релиза. Посмотрев на доску, команда всегда понимает, на каком мы этапе разработки и как движемся. Очень классно ощущать себя частью большого и сложного механизма по разработке ПО!

Как распределяется время в течение рабочего дня? Обед по часам или нет? Как относятся к опозданиям?

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

Михаил, а как построена работа с технической точки зрения?

— В банке плотно взаимодействуешь с аналитиком. Эти ребята могут ответить на любой вопрос. Например, что-то запрограммировал, звонишь аналитику: «Привет, я вот это сделал. Куда нужно ИНН вписать? А фамилию? А как перевести деньги?» Аналитик разжевывает. Так построена система: если программист чего-то не понимает, он звонит аналитику, который все объяснит. Вообще задачу программисту ставит аналитик, а аналитику — бизнес, то есть люди, которые общаются с клиентами.

Расскажите поподробнее.

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

В банке довольно сложная архитектура со множеством сервисов. Аналитик понимает, какие сервисы нужно «дернуть», чтобы решить задачу бизнеса. Он объясняет это программисту: «Послушай, Миша, есть задача. Я хочу, чтобы человек нажал на эту кнопку, потом ты “дергаешь” этот сервис, оттуда вынимаешь вот эти параметры, складываешь здесь, вводишь на эту страничку, а тут нажимаешь. Понял?» Понял — началась разработка. Не понял — объясняют еще раз.

Чем лучше аналитик, тем меньше вопросов, поэтому аналитики важны. Их работа даже важнее, чем программирование. Когда правильно поставлена задача и программист понимает, что делать, код пишется быстро. Гораздо дольше происходят согласования и объяснения. На понимание, как все должно быть, уходит много времени. Сначала нужно продумать, потом разрабатывать. А код пишется в последнюю очередь.

Есть также разные среды для развертывания ПО. Когда программа написана, нужно ее запустить и проверить. Первая ступень проверки — среда development, в которой программа работает изолированно. Следующий шаг — поставить программу на интеграционную среду, чтобы понять, как она работает в связке с другими сервисами. Еще одна среда называется prelife. Она приближена к действительности и нужна для показа демоверсий клиентам, руководству и бизнесу. Боевая среда последняя — то, что увидят клиенты банка.

Командный дух

Что вас больше всего удивило, когда вы вышли на работу?

— Больше всего — позиционирование на командную работу, это довольно редкое явление. Обычно аналитик, который должен уточнять задачу, просто что-то напишет, побурчит в трубку и все — разбирайся дальше сам. А здесь не так. Ребята плотно друг с другом работают, если кто-то что-то не понял — его не бросают, а помогают. Иногда мы организуем большие встречи для проработки сложных задач.

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

— Не то чтобы их было много, просто я заметил, что командность есть. Я работал и в других больших компаниях. Там мало кто говорил: «Давайте все обсудим, сядем, потратим время и уточним задачи». Частенько сотрудники отписывались другим и все, их больше ничего не интересует. Люди работали по принципу «Меня не трогайте — я в домике». А в «Альфа-Банке» сотрудники откладывают дела, чтобы помочь, причем вне зависимости от должности. Все начинают двигаться и стараться решить проблему. Это круто!

Соцпакет

Михаил, есть ли у вас индексация зарплаты?

— В «Альфа-Банке» процесс роста сотрудника построен так: вы с руководителем заводите в систему цели, которых должны достичь за определенное время. Например, ставите цель выучить новую технологию. Наступает день Х, и руководитель проверяет, получилось или нет, и оценивает по пятибалльной шкале. Тройка означает «Ты молодец! Сделал то, что тебя просили». Четверка — «Ого, ты проявил инициативу, сделал что-то новое, да еще и помог товарищам». Пятерка — сверхдостижения. Как мне объяснили, нужно сильно попотеть, чтобы ее заработать.

Сколько же целей нужно ставить? Одну, две или больше?

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

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

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

Я думаю, что в банке хороший рост, потому что идет непрерывное движение — необходимо постоянно что-то учить. Те технологии, на которые меня брали на работу, я уже не использую. Первые два месяца я работал над старым зарплатным проектом, изменял продукт и исправлял ошибки. Сейчас — новый уровень. Теперь проект переходит на так называемый единый фронт — набор правил, по которым нужно разрабатывать ПО в банке. И тут уже нет того стека технологий, который у меня был. А работать надо уже не на Windows, а на MacBook. Каждый день новые вопросы и ответы — постоянное движение. Очень интересно работать!

А какие у вас кабинеты?

— В основном везде open space. В нашем здании столы с перегородками, а в соседнем перегородки убрали. Это сделано для того, чтобы люди больше общались друг с другом и вопросы решались быстрее.

Какое питание? Есть столовая или сотрудники ходят куда-то на бизнес-ланч?

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

Дресс-кода нет, верно?

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

Что по поводу ДМС? Оплачивают ли вам сотовую связь или тот же фитнес-клуб?

— Фитнес я оплатил сам. ДМС есть, но новенькие получают его после испытательного срока. В него много всего включено, даже стоматология. Есть еще классная штука: 10 дней в году можно не выходить на работу, не оформляя больничный. Если приболел на два дня, никто не потребует больничный лист.

Отпуск, обучение?

— Отпуск — как у всех, 28 дней в году, а обучение постоянное. В Москве на «Курской» находится «Альфа-Лаборатория», в которой тестируют и применяют новые технологии. Там же устраивают встречи в презентационном зале. В лаборатории проходит внутреннее обучение для сотрудников банка.

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

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

Служба поддержки для сотрудников?

— Да, в банке все нацелено на взаимопомощь. Например, при устройстве на работу я проходил тест на человеческие взаимоотношения. Там были вопросы: «Что вы сделаете, если клиент, которого вы видите в первый раз, пришел в банк и что-то попросил? Как вы ему ответите?» и «Как нужно обращаться к коллегам?» Такая проверка, умеете ли вы слушать и слышать людей. Наверно, поэтому мы все — одна большая команда.

— Михаил, спасибо!

Пройти обучение

21 дек 18, 15:12
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Почему я устроился джуниором после семи лет разработке?

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

Закончил вуз и стал программистом

Я вырос в Серпухове и в вузе учился там же — изучал программирование в филиале Московского авиационного института. Но там мы программировали только на Pascal. На примере этого языка нас учили быть универсальными разработчиками — уметь видеть задачу и выстраивать алгоритм для ее решения. Поэтому после вуза я легко прошел тестовое задание и устроился Java-разработчиком в неплохую IT-компанию в своем городе.

Java изучал самостоятельно, по ходу работы. Тогда можно было учиться только по книгам и на практике. Я читал  литературу о программировании на JBuilder — популярной тогда среде, которая позволяла набирать код через графический интерфейс при помощи манипуляции компонентов.

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

Не справился с тестовым заданием и пошел учиться в кредит

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

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

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

Сразу решил, что учиться пойду в GeekBrains — давно был знаком с их сайтом. Когда изучил программу факультета Java-разработки, увидел все вопросы с собеседований, которые провалил.

Занимался каждый вечер после работы

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

Учиться было несложно — все-таки у меня была хорошая база. Нужно было только получить новые знания и систематизировать их. А язык Java мне всегда был интересен — на нем можно решать разные задачи, в том числе заниматься мобильной разработкой. Моя мечта — создать свое приложение.

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

Я много читал, особенно понравились эти книги:

  • «Java. Библиотека профессионала» Кея Хорстманна и Гари Корнелла;
  • «Изучаем Java» Кэти Сьерра и Берта Бейтса;
  • «Разработка под Android» Брайана Харди и Билла Филлипса.

Чтобы нормально чувствовать себя в режиме ежедневной работы и учебы, я занимался спортом, выделял достаточно времени на сон и прогулки. Были дни, когда я спал 4 часа. Но потом я просто не мог усваивать информацию, так что пересмотрел режим.

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

Пришел на День карьеры и нашел работу

Я два месяца учился на курсах, когда в GeekBrains объявили, что состоится День карьеры. Решил сходить, чтобы просто посмотреть на других студентов и послушать, что будут рассказывать компании. Резюме взял с собой на всякий случай и оставил его трем компаниям: «АйДи — Технологии управления», НТЦ «Вулкан», «Инфосистемы Джет». Они понравились мне интересными проектами и корпоративной культурой — внимательным отношением к сотрудникам. На мероприятии была классная возможность пообщаться с компаниями, которые заинтересованы в сотрудниках: и в новичках, в опытных разработчиках. Я хорошо зарядился, чтобы активно учиться дальше, и решил для опыта походить по собеседованиям, если пригласят.

В результате я сходил в «АйДи — Технологии управления» — они предложили мне стажерскую позицию, потому что к тому моменту я не успел получить достаточно знаний. На собеседование в «Инфосистемы Джет» я пошел чуть позже и подготовился более тщательно. Нужно сказать, что спрашивали все, что мы проходили в GeekUniversity в течение шести-семи месяцев:

  • Git;
  • Java Core;
  • алгоритмы и структуры данных;
  • базы данных;
  • HTML/CSS;
  • Spring.

Далее было еще одно собеседование, после которого я получил предложение работать на позиции джуниора. Пару недель назад вышел на проект, который компания «Инфосистемы Джет» делает для «Московской биржи». Многое мне приходится изучать с нуля, потому что мы работаем на таких фреймворках, средах и другом вспомогательным ПО, с которым я раньше не сталкивался. Мой основной источник информации сейчас — Google и более опытные коллеги.

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

Советы тем, кто планирует сменить работу:

  1. Быть открытым и честным на собеседованиях. Мне кажется, важно не теряться, если задают вопросы, на которые у тебя нет ответа. Лучше честно признаться, что прямо сейчас готового ответа у вас нет, но вы знаете, где будете его искать. Если сможете назвать, в какой книге или документации будете искать, — это дополнительный плюс.
  2. Подготовиться к собеседованию. Перечитайте конспекты курсов, которые вы до этого проходили, посмотрите теорию в других удобных вам источниках, загуглите, что спрашивают на собеседованиях по вашей специализации.
  3. Выходить на новую работу отдохнувшим. Если учитесь параллельно с работой, лучше получить основную информацию на курсах, а уже потом идти по собеседованиям. Выходить на должность начинающего разработчика — это как проходить отдельный сложный курс.
  4. Не упускайте возможности для нетворкинга. Я пришел на День карьеры, чтобы познакомиться с другими компаниями «на будущее», и не рассчитывал, что так быстро найду работу. В результате живое общение на специально организованной встрече оказалось максимально эффективным для трудоустройства.
Пройти обучение

17 ноя 18, 15:32
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Наставничество GeekBrains

Кто такие наставники

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

Так выглядит раздел наставничества. Во вкладке «Обучение» описаны ключевые моменты — что это такое, как стать наставником и какая от этого польза

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

Как стать наставником

Если вы выполнили эти условия, в разделе «Обучение» откроется страница «Наставничество». Внутри — вводная информация и списки доступных потоков. Выберите из них приглянувшийся и нажмите кнопку «Стать наставником». Вы увидите pop-up с описанием задания для потенциального наставника: записать короткое видео о том, почему вас интересует эта миссия и понравилось ли вам учиться в GeekBrains.

В доступных потоках перечислены курсы, к которым студент подходит по критериям: прошел курс, сдал шесть из восьми заданий на 4 и 5, успешно справился с тестом и прикрепил ролик

Простое задание для тех, кто хочет стать частью команды наставников GeekBrains

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

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

Недавно мы ввели систему оценок наставникам и отзывов о них

Почему быть наставником круто

Сейчас в GeekBrains 663 наставника, некоторые провели уже больше десяти потоков. Их профит в том, что благодаря вопросам от студентов они упражняются в сфере, которую недавно изучили, и прокачивают профессиональные навыки. Особо любознательные ученики задают сложные вопросы, на которые наставник не может ответить сразу — тогда они вместе разбираются и находят ответ. Так наставник углубляет свои знания и развивается как преподаватель — вникает в вопрос и учится понятно объяснять.

Что говорят сами наставники

Павел Пимкин, 43 года, Москва

«Я окончил курс «Frontend-разработчик». Стал наставником в феврале и провел уже 14 потоков. Эта практика помогает мне лучше изучить и закрепить тонкости языка, создать сеть людей, которые работают в IT. Но самое важное — когда помогаешь другим, чувствуешь себя нужным.

Бывали и необычные случаи. Я был наставником на курсах Java-1 и Java-2, и после их окончания одна из студенток попросила меня помогать ученикам на курсе по React. Я согласился, но в GeekBrains нет возможности стать наставником этого курса. Тогда я предложил студентке написать письмо в техподдержку с просьбой назначить меня. Через несколько дней это случилось — и было очень приятно, что я стал одним из немногих наставников на курсе React».

 

 

Артем Еремин, 29 лет, Москва

«Я учусь на факультете Java-разработки, был наставником на пяти потоках. Зачем мне это нужно? Приятно помогать людям, и полезно для меня — когда отвечаешь на вопросы студентов, глубже погружаешься в тему, которую уже проходил, освежаешь ее в памяти. Надеюсь, наставничество приносит пользу и студентам.

 

Фрагмент моего наставничества — помогаю студенту разобраться с домашним заданием

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

Дмитрий Бронских, 22 года, Новоуральск

«Закончил две GeekBrains-профессии: «Программист PHP» и «Программист Android» — и сейчас учусь на факультете веб-разработки. Наставничество сразу заинтересовало. Ознакомился с описанием программы и решил, что будет интересно. Выполнил условия задания, стал наставником и сразу взялся курировать первый поток. На сегодняшний день я провел 24 потока. И уже заявился на несколько еще не стартовавших.

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

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

Валерий Туров, 28 лет, Балашиха

«Я окончил профессию «Программист Java» и после двух курсов устроился на работу по специальности. Наставником решил стать из «корыстных» целей — слышал, что человек, который объясняет тему, начинает сам лучше разбираться в ней. Было интересно углубить знания по Java, и наставничество рассматривал больше как пинок лично мне. Пинок, который поможет преодолеть лень, занятость и нехватку времени, чтобы узнать новое о языке и программировании.

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

Мне нравится помогать людям. Студент приходит со словами: «Слушай, у меня не получается, не могу понять» — и мы вместе разбираемся. Тогда я вижу, как у него появляется понимание темы. Для меня это заряд бодрости и уверенности в себе — нравится это чувство.

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

На странице с отзывами обо мне как наставнике оставили комментарий о том, как я рассказываю о терминах программирования. Парень написал, что я захожу сильно издалека, но в итоге студент все понимает. Действительно: данные, переменные, функции оператора могу объяснить на тортах и автобусах. Студент первого курса ожидает услышать заумные определения, а ты говоришь: «Представь автобус, а в нем злого кондуктора». У человека подвисание происходит: «Мы сейчас точно о программировании говорим?»

«Осознал, что в объяснении терминов захожу издалека, только после этого отзыва»

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

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

Однажды я был наставником на курсе Java-2. Со студентами сложились приятельские отношения, но после курса общение в чате прекратилось. Чуть позже мне написал один из ребят: «Валера, ты был наставником у нас на курсе. Может еще побудешь?» Оказалось, они хотят сделать собственный проект — построить приложение под iOS и Android. Говорят: «После курса и стажировки начали делать, но не доделали, а забрасывать не хотим. Чувствуем, что нужна твердая рука. Ты уже работаешь программистом, давай с нами». Я согласился, начали вместе пилить приложение.

Потрясающее было время — для меня это был курс IT-менеджера, тимлидера, скрам-мастера и product owner-а в одном флаконе. Приложение не довели до конца, но остался его скелет на iOS и Android. Надеюсь, что знания у ребят не пропали даром, а исходный код сохранился — может быть, когда-то они закончат».

 

Пройти обучение

19 окт 18, 13:24
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Работа за рубежом

Своими впечатлениями о работе, зарплате и развитии IT-рынка в Болгарии делится программист Олег Иванов.

- Олег, было бы здорово сначала узнать немного о Вашем пути до переезда. Кем начинали работать, с какими языками?

- Я начинал как Junior в небольшой конторе в Воронеже. Там требовался своего рода эникейщик, который поддерживал бы сайт и писал Perl-скрипты для обработки данных. Мне повезло: время от времени приходили новые проекты с другими требованиями к технологиям. Довелось писать и на Python, и на C++, и на Java. В итоге стек Java-технологий стал моим основным — и остается таким до сих пор.

Вид на Софию из окна офиса. Фото: Олег Иванов (с)

После кризиса 2008 года часть нашей команды перешла в другую, родственную компанию, а в 2015 мне пришлось начать поиск новой работы.

Никогда раньше я не проходил собеседований по всем правилам, со смешными вопросами вроде «Кем вы видите себя через пять лет?» и «Чем абстрактный класс отличается от интерфейса?». Однако пришлось.

- Как вы начали искать работу в иностранных компаниях?

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

Но так получилось, что в то время одна финская компания искала Java-разработчиков, и мне позвонила HR из рекрутингового агентства. Она нашла мое резюме на HeadHunter и предложила собеседование. Я согласился, потому что мне было очень интересно, как это выглядит. Собеседование проходило на английском. И хотя работу я тогда не получил, результат собеседования был для меня скорее положительным. Я осознал, что это не так страшно. Подумал, чем черт не шутит, и разместил резюме на Xing, плюс заполнил профиль в LinkedIn. Xing.com — это немецкий аналог LinkedIn, а я в первую очередь думал о Германии как о наиболее вероятном направлении.

Мое резюме находили — в основном на HeadHunter — российские и украинские HR. Мне предлагали релокацию в США, Нидерланды, Германию и Польшу. Были варианты с Прибалтикой. От продолжения некоторых собеседований я отказался в процессе из-за откровенно грабительских условий.

- Какого плана были «грабительские условия»?

- Нужно понимать, что в США и Западной Европе нет большого дефицита IT-специалистов, что бы там ни писали «в интернетах». Если американцы готовы нанять специалиста из России/Украины/Беларуси, они точно не намерены ему платить столько же, сколько американцу. Им это невыгодно — тем более когда есть индийцы, готовые трудиться за гораздо меньшие деньги, чем разработчики из бывшего СССР.

Но это не самое главное. Часто работодатель выдвигает условие, что ты не имеешь права перейти куда-то, скажем, в течение двух лет. Иначе ты будешь вынужден платить компенсацию. И тому подобные вещи мелким шрифтом. Особенно этим славятся работодатели из США. Я не отрицаю, что при наличии знакомств с прошлой работы там можно неплохо устроиться. Но если начинать с нуля, придется смириться, что уровень жизни может стать даже ниже, чем был в России.

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

- Как сложилось, что выбрали Болгарию?

Меня нашли на Xing рекрутеры, которые искали специалистов для компании в Болгарии. Я не выбирал эту страну раз и навсегда. Я останавливался на ней несколько раз, в том числе после переезда.

Если говорить о первом решении, на него повлияло несколько факторов. Во-первых, климат. Недаром на туристических сайтах Болгарию всегда наделяют эпитетом «солнечная». Это правда. Тут много солнца и значительно теплее, чем в Центральной России.

Во-вторых, Болгария является членом ЕС, что автоматически означает возможность трудоустройства по Blue Card — «Синей карте», которая подтверждает ваше право жить и работать в Евросоюзе.

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

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

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

- Какое ПО вы пишете? Пришлось ли осваивать что-то, связанное с местной спецификой?

- Cначала я работал в аутсорсинговой компании. Там успел поучаствовать в двух проектах из сферы «кровавого энтерпрайза». Первый — из области e-commerce, второй — оптовых продаж обуви. «Местной» специфики в Болгарии нет, мне хватило общих знаний о Java-стеке: Spring Framework и тому подобном.

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

- Организация рабочего процесса отличается от российской?

- Перестраиваться не приходилось. Практически везде, как и у нас, используется Agile в разных ипостасях.

- Как в Болгарии с уровнем зарплат? Кстати, зарплаты «белые»?

- По моим наблюдениям, хороший разработчик (Java или front-end) может рассчитывать на 5 000 лева (2 500 евро) в месяц «чистыми». Если имеет дар убеждения — то и на большее. Это для Болгарии весьма неплохо. В Москве наверняка можно заработать лучше, но и потратишь значительно больше.

В Софии, насколько мне известно, все работают «в белую». Налоги не такие уж большие. Подоходный тут — 10%. Плюс иностранцам вряд ли выгодно зарплату в конверте получать.

- А как с конкуренцией? И в каком состоянии, на Ваш взгляд, сейчас IT-отрасль в Болгарии?

- Дефицит IT-специалистов здесь — не меньше 20 000 человек. Это из новостей за 2016 год, но я думаю, с тех пор ситуация не сильно изменилась. Болгары частенько стремятся сбежать в Западную Европу, и нехватку кадров тут восполнить сложнее, чем в той же Германии.

При этом Болгария старается всячески развивать IT-сектор: многих привлекают низкие налоги, поэтому здесь работают филиалы практически всех крупных аутсорсеров. Такие известные продуктовые компании, как VMWare, тоже имеют филиалы в Софии.

- По каким сайтам лучше ориентироваться, если хочешь прикинуть уровень зарплат для своего направления? Где искать вакансии?

- Есть сервис «БГ Работодател» — аналог Glassdoor для Болгарии. Там можно посмотреть зарплаты и почитать отрицательные отзывы о компаниях (Гугл-переводчик в помощь) — бывает полезно.

Что касается вакансий — есть, например, Rabota.bg. Но считаю, лучше не искать работу на сайтах, а обращаться со своим CV в компанию напрямую. Как минимум, у аутсорсеров всегда есть вакансии. Сам я в Болгарии работу через сайты не искал — меня HR находили.

- Вы говорите, что выбирали Болгарию несколько раз. Это связано со сменой работы уже после переезда? Или появлялись новые варианты в РФ и других странах?

- Новые варианты появляются регулярно: мне пишут на LinkedIn болгарские и европейские работодатели. Сейчас новое место не ищу, но всегда добавляю HR в свою сеть и отвечаю им, пусть даже отказом. Из РФ мне практически не пишут. Возможно, потому что LinkedIn сейчас в России заблокирован.

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

Все зависит от ожиданий. У меня были коллеги, которые ждали от Болгарии некой «европейскости». Но Балканы — это все же другое. Здесь нет лоска и ровных дорог, но есть красивая природа, спокойная обстановка и корректное отношение. София — довольно провинциальный город. Как и вся Болгария. И в этом огромные плюсы для меня. Хожу пешком на работу через парк каждый день. Из окна офиса неплохой вид :) И я точно зарабатываю не меньше болгар.

- Путешествуете по другим балканским странам?

- Да. Уже побывал в Сербии и Македонии. Вы, наверное, знаете, что Болгария до сих пор не в Шенгене. Поэтому для поездки в его страны нужна виза.

Здесь ее получить можно, но я бы рекомендовал тем, кто собирается переезжать, получить Шенген заранее. Потому что в России его для некоторых стран можно получить на два или три года. А в Болгарии его выдают на тот же срок, что и разрешение на пребывание. Большинство консульств здесь предпочитают давать визу на срок поездки.

Без Шенгена нельзя будет въехать в ту же Грецию, например. А до Эгейского моря от Софии расстояние примерно такое же, как до Черного.

Пройти обучение

26 июл 18, 10:29
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

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

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

Судите сами: для веб-разработки неплохо бы владеть PHP, JavaScript, Python, Ruby, а еще HTML и CSS; в мобильной сфере — Swift, Objective-C, Java, C#. Перечень языков для создания десктопных приложений можно даже не начинать — по сути, все будут полезны. Именно поэтому мы взяли на себя ответственность назвать 5 языков программирования, которые надо изучить хотя бы шапочно, чтобы сегодня называться программистом.

Python

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

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

def fib_recursion(i):
	if i > 1:
   	 return fib_recursion(i-1) + fib_recursion(i-2)
	return i
            	
for i in range(10):
	print i, fib_recursion(i)

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

Стоит упомянуть, что на данный момент актуальны две версии: Python 2 и Python 3. Вам за основу лучше брать последнюю, так как поддержка Python 2, а значит — и активная разработка на ней, прекратится совсем скоро.

JavaScript

Следующий must have среди языков — JavaScript, для работы с ним хватит браузера. Синтаксис здесь на порядок сложнее: появляются служебные символы и конструкции с разношерстными скобками, названия функций далеко не всегда раскрывают суть действия, и даже простейший код имеет структурированный вид. Взглянем на переписанный код с функцией Фибоначчи:

function fib_recursion(n) {
   return n < 1 ? 0
    	: n <= 2 ? 1
    	: fib_recursion(n - 1) + fib_recursion(n - 2);
}
 
console.log(fib_recursion(10));

Объем кода практически не изменился, зато снизилась читаемость. После изучения Python вы без проблем разберетесь, как работает структура return, и оцените удобство именно такого способа записи.

Кроме того, экосистема JavaScript богаче, чем Python. Она предлагает обилие сред разработки, редакторов кода, фреймворков, библиотек. Это еще один шаг к пониманию, как работает «взрослое» программирование.

В целом, JavaScript незначительно уступает Python по спектру решаемых задач, но его возможности «глубже». Знание этого языка пригодится при разработке программ на любых платформах.

C#

Если вы не определились с языком, значит еще не решили, что вас привлекает: веб, мобильные или десктопные приложения. Тогда ваше решение — C#, универсальный инструмент для всех направлений разработки. Чтобы создавать десктопные приложения, понадобится Visual Studio (версия Community — бесплатная). Для мира мобильных устройств установите Xamarian, а для веба пригодится ASP.NET.

Взглянем на наш код на языке C#:

static void Main(string[] args)
{
	int number = 10;
	fib_recursion(number);
}
 
static void fib_recursion(int n, int a = 0, int b = 1)
{
	if (n == 0) return;
	Console.WriteLine(a);
	fib_recursion(--n, b, b+a);
}

Код вновь незначительно усложнился — это связано с использованием ключевого слова static. На этом этапе вы познакомитесь с грамотным использованием памяти, областями видимости данных и полностью погрузитесь в ООП. Ну, если не успели при знакомстве с JavaScript.

Swift

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

Четвертая версия Swift вышла в 2017 году: она содержит множество улучшений для работы со строками, коллекциями; возросла надежность и многое другое. Это уже не «сырой» язык, а классический представитель верхушки рейтинга TIOBE с планомерным развитием. С помощью Swift вы можете создавать приложения для всех продуктов Apple: macOS, watchOS, iOS и любой новой системы, если она появится.

Посмотрим на код последовательности Фибоначчи:

func fib_recursion(num1: Int, num2: Int, steps: Int) {
 
	if steps > 0 {
    	let newNum = num1 + num2
    	fib_recursion(num2, num2: newNum, steps: steps-1)
	}
	else {
    	print("result = \(num2)")
	}
}
fib_recursion(0, num2: 1, steps: 10)

Java

Более двух десятков лет этот язык находится в списке самых востребованных, а это уже что-то значит. Сегодня он в основном ассоциируется с разработкой приложений для Android — но это лишь малая часть его возможностей. При помощи Java вы можете создавать графические виджеты для веба или писать десктопные приложения — принцип независимости от платформы и устройства в Java живет и процветает.

Кроме того, Java — великолепный язык, чтобы полноценно понять программирование: здесь реализованы все принципы ООП, организована работа с памятью и периферией, можно поупражняться с функциональным программированием.

А вот так выглядит Java-код нашей последовательности в простейшем императивном случае:

public class MainClass {
 
  public static long fib_recursion(long number) {
	if ((number == 0) || (number == 1))
  	return number;
	else
  	return fib_recursion(number - 1) + fib_recursion(number - 2);
  }
 
  public static void main(String[] args) {
	for (int counter = 0; counter <= 10; counter++)
  	System.out.printf("Fibonacci of %d is: %d\n", counter, fib_recursion(counter));
  }
}

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

Заключение

К списку можно было бы добавить ряд полезных языков вроде PHP, C++ или Ruby. Или несколько функциональных для общего развития: Lisp, Haskell, Clojure. Впрочем, до этого вы обязательно дойдете. Но сперва выбирайте специализацию, записывайтесь на курсы GeekBrains и осваивайте пять описанных must know языков.

Пройти обучение

24 июл 18, 16:59
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

История языков программирования: 2000-е

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

Языки программирования сыграли важную роль в этих метаморфозах. Узнаем, какие из них появились в первом десятилетии XXI века и как способствовали прогрессу.

В начале 2000-х форм-фактор зачастую играл ключевую роль

Продолжение битвы

Начнем с того, на чем остановились в прошлой статье. Компания Microsoft в конце 90-х приступила к разработке C#, который должен был оспорить господство Java. Новый язык был представлен в 2000 году, но увидел свет только в 2002. Причина задержки заключалась не только в желании победить все «болячки» Java, но и в меняющихся тенденциях на рынке IT. Прежде в Microsoft ориентировались на создание десктопных приложений для Windows, но поняли, что это путь в никуда. Требовалась новая программная платформа, которая бы замкнула на себе множество языков, а также позволила работать с вебом, мобильными и стационарными устройствами. Так появилась .NET, представленная вместе с C# в 2000 году.

Этот шаг позволил в долгосрочной перспективе поднять интерес как к языку, так и ко всем продуктам Microsoft. Но компания уже допустила главный просчет. В конце 90-х ведущие производители мобильных устройств, среди которых — Nokia, Ericsson и Motorola, объявили о создании новой системы Symbian. Изначально она была закрытой, приложения писались на языках ассемблера и C, но долго игнорировать влияние Java было невозможно. Уже к началу 2000-х пользователи мобильных устройств могли устанавливать приложения на базе Java ME (ограниченной версии языка). Пока C# собирал аудиторию, Java уже работал на каждом втором смартфоне. Microsoft еще долго будет пытаться переломить эту ситуацию, но так и не преуспеет.

Зато у C# прекрасно пошли дела в игровой сфере. Как и сегодня, в 2000-х среди консольных приставок основная борьба разворачивалась между Sony PlayStation и Microsoft Xbox. Первая использовала в качестве базы C и язык ассемблера, потом перешла на собственный скриптовый язык. Фактически, Sony PlayStation была закрыта для сторонних разработчиков. Продукт компании Microsoft опирался на C++ и C# — в частности при работе с графическим движком Unity. Популярность C# возросла, но догнать Java так и не получилось: конкурент имел серьезное влияние на веб, а к концу десятилетия стал фундаментом системы Android.

Масла в огонь подливали и новообразованные языки. К примеру, Groove, работающий на базе JVM, подтягивал синтаксис Java к простоте Python, сохраняя функциональность — поэтому привлек внимание. Менее известные примеры: Whiley, AspectJ, Join Java, Tea. Свою нишу занял и появившийся в 90-х JavaScript.

Новый вектор обучения

Создание языков программирования для обучения — тенденция, берущая начало в 60-х годах. В первом десятилетии XXI века появился ведущий «детский» язык — Scratch. Разработанный в MIT, он позволял на основе простых графических блоков создавать анимацию. Первые 10 лет существования не принесли языку заслуженной славы. Дело в концепции, согласно которой программировать приходилось непосредственно в браузере. Из-за ограничений на трафик и скорость начинающие программисты со всего мира не могли себе позволить долго возиться с этим продуктом.

Виток функционального программирования

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

Частично этому способствовала новая волна маломощных машин (смартфонов). Высокие требования при скромной производительности вынуждали программистов мыслить функциями, а не привязываться к данным. Частично на популярность ФП повлиял новый язык — Clojure, диалект Lisp, работающий на основе виртуальной машины Java. Он будто связал десятилетия, позволив в новой эре применить известные принципы ФП. Чуть позже появился еще и ClojureScript для работы с JavaScript. Это был сигнал разработчикам языков: пора вводить возможности полноценного функционального программирования.

Big data

В 2008 году редактор журнала Nature Клиффорд Линч ввел понятие «большие данные». Этот термин он использовал при анализе растущего объема информации, поступающей в сервисы и социальные сети. Ведущие компании столкнулись с проблемой: необходимо было придумывать новые методы обработки и хранения данных, чтобы отвечать потребностям общества. Частично это решалось функциональным программированием, но требовались и новые специализированные языки.

Компания Google нашла выход в использовании нейронных сетей и языка для обработки данных — Go. Он должен был стать полноценной альтернативой C и C++, улучшив читаемость кода, документируемость, скорость сборки программ и множество других аспектов. Go так и не стал панацеей, но заслужил репутацию удобного и надежного инструмента для сложных разработок.

Гонка мобильных вооружений

Чтобы понять, насколько быстро менялись технологии в первом десятилетии XXI века, достаточно вспомнить события на рынке мобильных телефонов. Он стартовал с огромными черно-белыми «коммуникаторами» под управлением закрытых операционных систем. Им на смену пришли кнопочные «смартфоны» с Symbian. Уже к концу десятилетия все эти наработки устарели — на рынке сенсорных аппаратов бушевала битва iOS и Android.

Аппараты Android работали, опираясь на язык Java, и с первого дня существования системы пользователи могли писать под нее приложения. Почти все базовые приложения Android — результат международного конкурса разработчиков, который устроил Google за год до официального запуска платформы.

В Apple избрали другой путь — использовать собственные наработки. Objective-C был создан в 80-х как одно из множества ответвлений языка С. Возможно, он так и канул бы в ХХ веке, если бы не приглянулся разработчикам компании NeXT и операционной системы NEXTSTEP. Компьютер NeXTcube собрал массу положительных отзывов, но не получил распространения из-за высокой стоимости проекта.

Главой NeXT был Стив Джобс. Он не только удержал компанию на плаву и выгодно продал ее Apple, но и внедрил все наработки в «яблочные» продукты. Надежность и быстродействие стали визитной карточкой Mac OS и iPhone OS.

В отличие от Android, который имеет открытый исходный код, системы Apple изначально были закрытыми для сторонних разработчиков. Компания выпускала средства разработки приложений после того, как оценивала заинтересованность в продуктах. Так случилось и с MacOS: Xcode была представлена спустя 2 года после платформы, — и с iOS: через год была обнародована SDK. Разумеется, исходные коды при этом не открывались и разработчики не получали полной свободы в персонализации. Родилось главное идеологическое противостояние в  IT 2010-х годов: анархическая свобода против бесконечных ограничений, массовость против качества, доступность против безопасности.

Поговорим об этом в следующей статье.

Пройти обучение

29 июн 18, 11:03
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Что нужно знать, чтобы стать Java-разработчиком

Александр Чебыкин уже полгода работает Java-разработчиком в компании «Сбербанк-технологии». До этого он писал код на Фортране, работал над диссертацией в Институте прикладной математики имени М. В. Келдыша РАН и успел закончить две четверти в GeekUniversity. Этих знаний хватило, чтобы успешно пройти собеседования в Сбертехе и получить сразу два интересных предложения работы.

— Чем вы сейчас занимаетесь?

— В Сбертехе я работаю Java-разработчиком в отделе эквайринга, в команде клиринга.

Эквайринг — это оплата товаров и услуг при помощи банковских карт. Чтобы магазин мог принимать безналичный расчет, он заключает контракт с банком.

Команда, в которой я работаю, занимается клиринговым взаимодействием — это процесс безналичного расчета, выполняемого с привлечением третьего участника, клирингового субъекта (в данном случае Сбербанка). Когда покупатель оплачивает покупку через терминал, в системе банка формируется файл, в котором закодирована информация. Моя команда пишет всю систему клиринга. Одна из ключевых частей этого приложения — парсер. Это программа, которая считывает каждый файл и передает на дальнейший процессинг.

— Какие знания нужны, чтобы получить такой оффер?

— Если вы хотите писать backend корпоративных приложений, нужно хорошо разобраться в следующих темах:

  • Java SE (Collections, многопоточность);
  • Maven;
  • Git;
  • Linux OS;
  • Spring (IoC, DI) — от джуниора обычно ждут общего представления, что это и для каких задач используется. Но знание этого фреймворка будет большим преимуществом при трудоустройстве и в дальнейшей разработке.

Могу поделиться вопросами, которые мне задавали во время собеседований на должность Java-разработчика:

  • Как устроены ArrayList и LinkedList? В чем разница?
  • Как устроены HashMap/HashSet?
  • Что такое Deadlock (с примерами)? Как его избежать? Как убедиться, что в запущенном приложении он случился?
  • Что вы знаете про жизненный цикл потока? Приведите схему перехода между состояниями;
  • Как бы вы проводили ревью кода другого разработчика?
  • Выполните умножение двух чисел, представленных строкой (пример):
String str =239391391289323784827473442342*239391391289323784827473442342”.

— Как нашли эту работу?

— Она сама меня нашла. После первой четверти в GeekUniversity (факультет Android-разработки), когда достаточно изучил Java, я выложил резюме Java-разработчика на HeadHunter. Честно написал, что работал только с Фортран, что Java освоил самостоятельно и прохожу обучение.

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

После трех–четырех собеседований у меня сложилось понимание, как отвечать. Я стал увереннее, но приостановил поиски. Решил уделять больше внимания учебе, пошел на стажировку по Java-разработке в GeekBrains.

Чуть позже сотрудники кадрового агентства, с которым работает Сбертех, увидели мое резюме на HeadHunter и предложили пройти два собеседования. Первое — с командой в отделе кредитов. Вопросы, которые мне задавали, мы хорошо изучили на курсе «Java 3». Второе собеседование, в отделе эквайринга, проводил руководитель направления. На следующий день рекрутер позвонил и сообщил, что мне готовы сделать оффер. Позже поступило предложение и из первого отдела.

— Были какие-то сложности в первые месяцы работы?

— Команда, в которую я пришел, работала над проектом уже больше года. Было сложно сразу во всем разобраться. Хочу сказать одногруппникам, которые жаловались на количество кода в наших учебных проектах (например, когда мы писали сетевой чат в первой четверти): «Это вовсе не много кода!». Там было от силы 3 модуля по 20 классов в каждом. На момент, когда я подключился к работе своей команды в Сбертехе, в нашем рабочем проекте было около 20 модулей и сотни классов. Поэтому первый месяц на реальном проекте был для меня непростым.

К тому же, у меня не было представления, как устроен бизнес-процесс в компании. Стеснялся спрашивать — не знал, насколько глупыми могут показаться мои вопросы, и помогла только практика. Рабочий процесс складывался из двухнедельных спринтов: мне накидывали задач, и я потихоньку разбирался в проекте. Ещё увереннее почувствовал себя, когда пришел новый разработчик и мы уже вместе разбирались в том, как все устроено.

— Почему вы решили учиться программированию?

— Я закончил МИФИ, факультет теоретической и экспериментальной физики, по специальности «Прикладная математика и информатика». После вуза я полгода работал аналитиком в компании «Филип Моррис». Мне не нравились мои задачи: рутинная работа над статистикой и контроль того, как работают другие. На тот момент у меня не было четкого представления, чем хочу заниматься дальше. Увидел, что Институт прикладной математики проводит конкурс на место научного сотрудника — и пошел туда работать, поступил в аспирантуру.

Там я занимался разработкой, 70% из которой занимала матфизика и только 30% — программирование. За 4 года такой работы я понял, что физики с меня хватит — мне интереснее рассматривать задачи с точки зрения математики и программирования. Поэтому начал искать учебные программы для разработчиков.

Точно не знал, хочу заниматься корпоративной или мобильной разработкой или уйти в геймдев. У меня были базовые знания в Python и Java. Я работал только с простыми задачами, которые можно решить любым процедурным языком. Опыт разработки на Фортране дал мне неплохую базу, но объектно-ориентированное программирование пришлось осваивать почти «с нуля». Но я хотел развиваться и писать полноценные проекты.

— Почему поступили именно в GeekUniversity и выбрали факультет Android-разработки?

— До определенного профессионального уровня я не мог придумывать задачи сам. Хотел, чтобы мне их ставили опытные специалисты.

На тот момент программа GeekUniversity только запускалась. Было открыто три направления: веб-разработка, Android и iOS. Факультет Android-разработки выбрал методом исключения. iOS мне был не очень интересен, так как сам не пользуюсь техникой Apple и не обладаю нужными базовыми знаниями. Веб-разработку не рассматривал, потому что на тот момент не знал ничего о HTML, CSS, JavaScript. А вот моих минимальных знаний по Java для поступления на факультет Android-разработки было достаточно.

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

— Какие впечатления об обучении в GeekUniversity?

— В целом, мне понравилось, как и в каком объеме нам давали материал. Были преподаватели и курсы, которым я до сих пор благодарен, а были темы, которые не особо запомнились и пригодились.

Понравился курс Алексея Степченко «Java 2». Он же показал, как писать игру под Android. На курсе «Java 3» преподаватель Николай Дмитриев подробно объяснил всю теорию, которая требуется на собеседованиях. Хочу отметить, что Николай лучше всех давал обратную связь по домашним заданиям — он обращал внимание не только на очевидные ошибки, но и расписывал замечания по стилю кода.

Из преподавателей по Android запомнился Станислав Хижняк — подробно и понятно объяснял нужные нам инструменты. С преподавателем первого курса по Android Александром Аникиным писали погодное приложение — он разложил «по полочкам» всю работу.

У меня были замечания к информации в методичках по некоторым курсам (иногда они были недостаточно согласованы с тем, что мы проходили) и к формулировке задач по курсовым проектам. Сообщил преподавателям — надеюсь, эти моменты доработают.

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

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

Пройти обучение

13 июн 18, 09:24
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Как избежать тупиковых блокировок в Java

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

Как происходит блокировка

Два потока работают с общими ресурсами.

Поток 1 захватывает Ресурс 1 и начинает операции с ним.

Поток 2 последовательно захватывает Ресурс 2 и Ресурс 1.

Поток 2 не получает доступа к Ресурсу 1 и в ступоре ждёт, когда тот освободится.

Поток 1 не завершил работу с Ресурсом 1, но пытается захватить Ресурс 2 и тоже впадает в ступор.

Как это выглядит в коде:

public class DeadlockTest {  
 public static void main(String[] args) {  
   final String res1 = "my sample text";  
   final String res2 = "some other text";  

   // Пусть поток P1 навесит замок на ресурс res1, а затем на res2
   Thread P1 = new Thread() {  
     public void run() {  
         synchronized (res1) {  
          System.out.println("Поток 1 навесил замок на Ресурс 1");  
          try { Thread.sleep(100);} catch (Exception e) {}  

          synchronized (res2) {  
           System.out.println("Поток 1 навесил замок на Ресурс 2");  
          }
        }
     }
   }

   // Поток P2 последовательно пытается запереть доступ к res2 и res1
   Thread P2 = new Thread() {  
     public void run() {  
       synchronized (res2) {  
         System.out.println("Поток 2 навесил замок на Ресурс 2");  
         try { Thread.sleep(100);} catch (Exception e) {}  
         synchronized (res1) {  
           System.out.println("Поток 2 навесил замок на Ресурс 1");  
         }
       }
     }
   }

   P1.start();  
   P2.start();  

 }
}  

Видимо-невидимо

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

Есть несколько способов уберечь Java-приложение от «падений» и «зависаний», связанных с противоречиями в работе потоков. Это механизмы synchronized и volatile, алгоритмы, реализованные в классах Java Concurrent, но главное  — забота о структуре вашего приложения.

Ключевое слово volatile в Java

Модификатор volatile используют, когда нужно:

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

Как только один поток записал что-то в volatile-переменную, значение идёт прямо в общую память и тут же доступно остальным потокам:

class CarSharingBase
{
  static volatile int your_car_ID = 3222233;
}

Но учтите, что модификатор volatile никак не ограничивает одновременный доступ к данным. А значит, в работу одного потока с полем может вмешаться другой поток. Вот что будет, если два потока одновременно получат доступ к операции увеличения на единицу (i++):

int i = 0;

Поток 1: читает переменную (0)

Поток 1: прибавляет единицу

Поток 2: читает переменную (0)

Поток 1: записывает значение (1)

Поток 2: прибавляет единицу

Поток 2: записывает значение (1)

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

В примере с увеличением на единицу мы видим сразу три действия:  чтение, сложение, запись. Чтение и запись — операции атомарные, но между ними могут вклиниться действия другого потока. Поэтому составная операция инкремента (i++) полностью атомарной не является.

Обратите внимание: с volatile-переменной возможны как атомарные, так и неатомарные операции. Ключевое слово volatile позволяет сделать так, чтобы все потоки читали одно и то же из основной памяти, но не более того.

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

Ключевое слово synchronized

Модификатор synchronized исключает доступ второго и последующих потоков к данным, с которыми уже работает один поток. Это ключевое слово используют только для методов и произвольных блоков кода.

Используйте synchronized, чтобы:

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

Метод может быть статическим или нет  — без разницы. Но синхронизация влияет на видимость данных в памяти. В прошлой статье мы говорили о взаимном исключении (mutex’e). С его помощью synchronized ограничивает доступ к данным. Образно говоря, это замок, с помощью которого поток запирается наедине с объектом, чтобы никто не мешал работать. Обратите внимание: замок запирают до начала работы. То есть проверка, не заняты ли ресурсы кем-то другим, происходит на входе в synchronized-блок или метод.

public class SynchronizeThis {
    private int syn_result;
    public synchronized int methodGet() {
        return syn_result;
    }
}

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

Данные, которые изменились внутри метода или блока sychronized, находятся в кэше поверх основной памяти и видны следующему потоку, к которому перешёл мьютекс.

Подсказки по блокирующей синхронизации

Главное при работе с synchronized  — правильно выбрать объект, по которому будет происходить проверка доступности ресурсов. Если вам нужна синхронизация на входе в метод, учитывайте, принадлежит этот метод классу или объекту. Вход в статичный метод блокируют по объекту класса, а в абстрактный метод  — по this. Если по ошибке заблокировать метод класса по this, доступ к ресурсам останется открыт для всех.

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

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

Атомарность с помощью Java Concurrent

Вернёмся к составной операции «чтение-изменение-запись». Когда нам нужно развести потоки по углам, но без мьютекса, можно использовать инструкцию «сравнение с обменом»  — compare and swap (CAS).

Для этого сначала заводят переменную, по значению которой можно понять, заняты ли ресурсы и, если да,  — кем. Например, пока ресурсы свободны, переменная хранит «-1», а если заняты — номер процессора, который с ними работает (0,1 и т.д.).

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

Можно сказать, что это более интеллигентная форма взаимодействия между потоками. Они уже не бодаются за ресурс и не закрывают дверь перед носом оппонента, а обмениваются сообщениями в духе: «Хотелось бы поработать вот с этим»  — «Извините, оно пока занято. Не желаете ли кофе?».

На этом принципе построен целый ряд алгоритмов синхронизации, которые называют неблокирующими (non-blocking). Создание таких алгоритмов  — задача не для новичка. Но, к статью, в Java «из коробки» есть несколько готовых неблокирующих решений. Они собраны в пакете java.util.concurrent.

ConcurrentLinkedQueue

На русский название класса переводится как «параллельная очередь». Работает такая очередь по принципу First In First Out («Первым зашёл  — первым выйдешь»). Алгоритм основан на CAS, быстр и оптимизирован под работу со сборщиком мусора.

Если вы хотите создать очередь из объектов, а затем добавлять и удалять их в нужный момент, не нужно писать и синхронизировать методы вручную. Достаточно создать классы для потоков, производящих и потребляющих данные, а затем поставить эти потоки в очередь ConcurrentLinkedQueue.

В прошлой статье мы говорили, что в Java поток можно создать как экземпляр класса Thread или как отдельный класс с интерфейсом Runnable. Сейчас мы используем второй подход. Единственный метод интерфейса Runnable —  run(). Чтобы задать нужное поведение для потребителя и производителя, мы будем переопределять этот метод в каждом случае по-своему.

Поток-производитель:

public class ProducerThread implements Runnable {
    @Override
    public void run() {
        System.out.println("Генерируем сообщения в очередь");
        try {
            for (int i = 1; i <= 10; i++) {
                QueueTest.enqueueTask("Задача номер " + i);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Поток-потребитель:

public class ConsumerThread implements Runnable {
    @Override
    public void run() {
        String task;
        System.out.println("Ждём задачи \n");
   //Пока есть задачи в очереди:
        while (QueueTest.isTaskHasBeenSet() || QueueTest.getQueue().size() > 0) {
            if ((task = QueueTest.getQueue().poll()) != null)
                System.out.println("Выполняю задачу : " + task);
            try {
                Thread.sleep(500);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

Обратите внимание, если очередь пуста, метод poll() вернёт значение null. Поэтому нам нужно было убедиться, что он возвращает что-то другое.

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

Очередь, в которой будут работать потоки:

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class QueueTest {
    private static Queue<String> queue = null;
    private static boolean taskHasBeenSet = false;

    public static void main(String[] args) {
        queue = new ConcurrentLinkedQueue<String>();
// Создаём и запускаем потребителя и производителя
        Thread producer = new Thread(new ProducerThread());
        Thread consumer = new Thread(new ConsumerThread());

        producer.start();
        consumer.start();

        while (consumer.isAlive()) {
            try {
    // Оставим время на ожидание постановки задач
                Thread.sleep(1000); 
            } catch (InterruptedException e) {
                 // Выводим трейс вместе с текстом исключения
                e.printStackTrace();
            }
        }
   // Всё выполнено нормально, выходим.
        System.exit(0);
    }

    public static Queue<String> getQueue() {
        return queue;
    }

    // Добавляем задачи в очередь
    public static void enqueueTask(String task) {
        try {
            queue.add(task);
            System.out.println("Добавлена задача : " + task);
            Thread.sleep(200);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }

    public static boolean isTaskHasBeenSet() {
        return taskHasBeenSet;
    }
    
    public static void setTaskHasBeenSet(boolean taskHasBeenSet) {
        QueueTest.taskHasBeenSet = taskHasBeenSet;
    }
}

Запустите и посмотрите, как добавляются и выполняются задачи.

Атомарные классы

Пакет java.util.concurrent.atomic включает в себя классы для работы с:

  • примитивами  — AtomicBoolean, AtomicInteger, AtomicLong;
  • ссылочными типами   — AtomicReference;
  • массивами  — AtomicBooleanArray, AtomicIntegerArray, AtomicReferenceArray и др.;
  • аккумуляторами  — DoubleAccumulator, LongAccumulator;
  • обновлениями («апдейтерами»)  — AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater.

Давайте посмотрим, как два потока могут работать с переменной AtomicInteger без синхронизации. Для этого создадим класс myThread, в котором будет атомарный счетчик:

import java.util.concurrent.atomic.AtomicInteger;

class myThread extends Thread{
    public volatile AtomicInteger counter;
/* Для наглядности тестирования мы сделали поле волатильным.
   Данные не попадут в кэш и работу двух потоков будет легче отследить */

    myThread(AtomicInteger counter){
        this.counter = counter;
    }

    @Override
    public void run() {
        for(int i = 0; i < 1000; i++){
            counter.updateAndGet(n -> n + 2);
        }
// После работы счётчика в каждом потоке будем выводить значение:
        System.out.println(counter);
    }
}

Для операций над числами мы использовали метод updateAndGet() класса AtomicInteger. Этот метод увеличивает число на основе аргумента  — лямбда-выражения

Теперь посмотрим на всё это в действии. Создадим и запустим два потока myThread:

public class MultiCounter {
    public static void main(String[] args) {
        AtomicInteger myAtomicCounter = new AtomicInteger(0);

        // Создаём потоки
        myThread t1 = new myThread(myAtomicCounter);
        myThread t2 = new myThread(myAtomicCounter);

        t1.start();
        t2.start();
    }
}

В результате работы кода получим два значения: первое из них будет случайным числом в диапазоне от 2000 до 4000, а второе  — всегда 4000. Например, при первом запуске я получила результат:

2670

4000

Запустите код ещё раз и убедитесь, что меняется только первое значение. Второе число предсказуемо именно благодаря работе атомарного счётчика. Если бы мы использовали для счётчика обычный (неатомарный) Integer, второе число было бы случайным.

Блокирующие и неблокирующие алгоритмы в Java

Блокирующие алгоритмы парализуют работу потока  — навсегда или до момента, пока другой поток не выполнит нужное условие. Представьте, что поток A заблокирован и ждёт, когда поток B завершит операцию. Но тот не завершает, потому что заблокирован кем-то ещё. Случайно создать такую западню в приложении очень легко, а вот просчитать, когда она сработает  — трудно. Если без синхронизации можно обойтись, лучше обойдитесь — ради экономии нервов и ресурсов.

Неблокирующие алгоритмы тоже могут вести к проблемам, например, к live-lock. Это ситуация, когда несколько потоков буксуют:  продолжают работать, но без реального результата. Причиной может быть загруженность потоков сообщениями друг от друга. Чем больше сообщение, тем больше оно грузит память. Другая возможная причина  — неудачная реализация алгоритма, при которой в очереди возникает конфликт.  Поэтому начинающим лучше не мастерить велосипед, а сначала разобраться с чужими наработками.

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

Пройти обучение

12 апр 18, 12:14
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0
Темы с 11 по 19 | всего: 19

Последние комментарии

нет комментариев
Читать

Поиск по блогу

Люди

7 пользователям нравится сайт lena2018.mirtesen.ru