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

Основная статья: Программирование на java

Приключения бравого джависта в поисках пропитания

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

Предыстория

К тридцати годам я перестал видеть перспективы на работе. Тогда, в 2018 году, я был начальником ОТК (отдела технического контроля) в муниципальном учреждении — автобусном парке. Однажды в городе сменилась власть и нам урезали финансирование. Я перешёл в другую компанию, но понял, что мне скучно. В полугосударственных организациях есть потолок роста: интересной и хорошо оплачиваемой должности там обычно ждут лет до пятидесяти.

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

Учиться программированию предстояло с нуля, при этом надо было на что-то жить. Я устроился в транспортную компанию системным администратором и записался на курсы Java-разработки в GeekBrains. Почему Java? Потому что этот курс стартовал раньше других! Мне хотелось скорее начать программировать, а на чём — без разницы. Я даже не знал, что Java и JS — разные языки. 

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

Чтобы прийти в Java, надо сначала отвергнуть Java

Работу я начал искать сразу по окончании второй четверти в GeekBrains: открыл HeadHunter, ввёл запрос «Java» и выбрал город Волгоград. Сайт выдал всего 16 вакансий, половина из которых… про JavaScript. «Это фиаско, братан!» — отозвался внутренний голос. Ах да, все вакансии были уровня Middle и Senior, кроме одной — «разработчик ABAP» с зарплатой 15 000 рублей. Мол, переучим с любого языка на суперперспективный, бла-бла-бла.

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

Про английский и людей

На моё резюме откликнулась компания-аутсорсер, которая тестирует игры. Это крупная контора с головным офисом в Праге и филиалами в Москве и Питере. Мне предложили посмотреть вакансию QA-инженера. В требованиях был английский, и я сразу предупредил — не владею. HR ответил, что это не критично и не обязательно. Затем мне прислали тестовое задание, которое я выполнил и показал своему преподавателю Александру Фисунову. Он посоветовал, как упростить и структурировать код — получилось шикарно. В компании посмотрели, сказали: «О, класс! Приходи на интервью». Пришёл, поговорил с тимлидом QA-инженеров и ещё с двумя людьми, ответил на вопросы по Java. «Неплохо! — говорят они. — А что у вас с английским?» — «Частично понимаю, но не говорю». — «Ну ладно».

Дальше было Skype-интервью с руководителем питерского филиала: «В принципе, меня всё устраивает! А как у вас с английским?». Я повторил свой ответ. «Ладно, мы вам позвоним». Затем — ещё одно телефонное интервью с двумя руководителями и тот же финал. Так продолжалось месяц. В итоге HR сообщил, что меня не взяли. «Почему?» — «У тебя плохой английский». Я спокойный человек, но тогда высказал всё, что думал. Ведь я с самого начала предупреждал о своём английском! А в итоге потратил несколько дней жизни на пустые разговоры.

Это был единственный раз, когда иностранный язык стал камнем преткновения при трудоустройстве. Документацию я читаю спокойно: IT-лексику знаю, непонятное смотрю в словарях и Google-переводчике. Для работы в среднестатистической российской компании этого хватает. 

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

В регионах не выбирают

Считаю, что в регионах надо браться за любую работу: через полгода-год у тебя будет совсем другое резюме, и ты сможешь найти лучшие варианты. Конечно, если ты в Москве, Питере, Екатеринбурге, Воронеже или Краснодаре, можно привередничать. Но когда у тебя на весь город несколько вакансий — не до жиру. Зато с опытом ты сможешь устроиться в приличную компанию удалённо или переехать в Москву.

Замахнуться на два языка (нет)

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

В компаниях, где я проходил собеседования на позиции уровня Middle, мне часто отвечали: «Приходите через годик». Не все говорят так открыто — некоторые начинают срезать тебя издевательскими вопросами: «Как называется такой-то метод в Spring? А сякой-то?». Причём интервьюеры тушуются, когда отвечаешь: «Ребята, вас в гугле забанили? Дайте мне компьютер, и я скажу, как называется метод, а заодно покажу, как его использовать». Ещё могут спросить, как относишься к переработкам. Я честно говорю, что время для меня — самый дорогой ресурс, и дарить его я не собираюсь.

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

Потом знакомый, который в Европе работает архитектором C#, протолкнул меня на собеседование в хорошую контору. У них собирался увольняться инженер автоматизированного тестирования, и я вышел на стажировку. Работал по часу в день. Стажировка закончилась, и-и-и… инженер не уволился :)

Затем в той же компании мне предложили заняться разработкой на C#. Для начала выдали сложное тестовое задание по SQL, и я от скуки делал его две недели, пока ждал увольнения инженера. В итоге я сам отказался от позиции: решил не браться за новый язык, пока не освою Java, ибо за обучение «уплочено». Параллельно осваивать два языка — это слишком, особенно для новичка. Сейчас-то я понимаю, что надо было не выделываться и согласиться на позицию разработчика С#. Но это лишь начало истории.

Пришёл февраль 2019 года. Директор конторы, куда меня приглашали автотестировщиком, решил мне помочь: обзвонил несколько IT-компаний и сказал, что годный парень ищет работу по Java. На следующий день я пошёл на собеседование в EAE-Consult. Там я ответил на общие вопросы и решил простенькую задачку по SQL. Мне сказали, что подхожу, но есть нюанс... У них не Java, а C# :) Засада! Однако я тогда ещё недостаточно отчаялся и отказал им. До мая собеседований не было вообще. Я продолжал откликаться на всё подряд. Переделал резюме, как советовала специалист GeekBrains по трудоустройству, и стучался в разные IT-конторы.

Тестовое с подвохом

Ещё был очень поучительный опыт с элементарным, на первый взгляд, тестовым заданием, которое оказалось с подвохом. Как-то раз я написал в LinkedIn тимлиду команды, где набирали Java-разработчиков. Он ответил, что джунов они уже набрали, остались вакансии мидлов, но я могу попробовать. Надо было на чистом Java написать консольное приложение, которое предлагало бы пользователю ввести любые числа, а на выходе показывало MIN, MAX и среднее значение. Была ещё хитрая приписка: «Неопытный программист должен понять, как работает твоё приложение, а злой программист не должен его сломать».

Я написал программку за десять минут, покрыл её подробными комментариями и обернул защитным кодом, где проверял типы входных значений и ловил исключения. Казалось, я предусмотрел абсолютно всё. В итоге тимлид «уронил» мою программу одной командой. Как? Он ввёл два максимальных для типа значения, так что произошло переполнение и расчёт выдал «–1». Это было очень поучительно! Кстати, нас на занятиях предупреждали о переполнении типа, но я тогда не придал этому значения. Что тут скажешь? Оставалось только улыбнуться, поблагодарить за опыт и пойти читать «Effective Java».

И вот однажды в выдаче hh.ru я нашёл вакансию «стажёр C#» со вкусной зарплатой и примечанием, что вместо «шарпа» кандидат может знать схожий строго типизированный язык. Я откликнулся с ленцой, даже без сопроводительного письма, и забыл об этом варианте. Но через пару недель прилетело тестовое задание со словами «Cделай, как сможешь, а не сможешь — напиши, где затык». Там было простенькое приложение: API на .NET и мобильная реализация на Xamarin.

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

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

Если бы не Java :) 

Вы можете сказать, что мне следовало изучить местный рынок и выбрать другой язык программирования. Но дело не совсем в этом. У нас экономически слабый регион с низким уровнем жизни, поэтому, какой язык ни учи, перспективы придётся искать в местах с крупным IT-кластером. Даже если ты освоишь повсеместно востребованный JavaScript, в Волгограде тебе предложат делать сайтики за 20 000 рублей в месяц. К тому же у всех разные склонности и интересы: у меня, например, нет дизайнерских задатков и чувства стиля, с которыми можно расти во фронтенде. Мне больше нравится заниматься серверной частью. 

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

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

Первая работа и перспективы

Итак, я устроился в EAE-Consult и стал единственным Java-разработчиком компании в Волгограде — коллеги по команде общаются со мной из Москвы. Я сразу оценил хорошо оборудованный офис, приятный коллектив, неплохую для нашего города зарплату.

Рабочий хаос :)

Я начал работать над расширением функций IBM MDM и использовал технологию, которая даже на StackOverflow не представлена. Поначалу пришлось очень тяжело. Во-первых, за повседневными задачами я не видел общей картины. Во-вторых, мне не хватало обратной связи по коду. А мне важно, чтобы мой код внимательно разбирали, критиковали и отправляли на доработку с указанием, что улучшить. Во время учёбы в GeekBrains я часто советовался с преподавателем Александром Фисуновым, и он умел объяснить, что хорошо, а что плохо. Теперь же надо было развиваться без наставника. Кстати, сейчас мне в этом помогает книга «Effective Java» — чтиво очень сложное, но и интересное!

Сейчас я уже полностью адаптировался в компании. С 2020 года перехожу на новый проект с очень современным стеком (микроcервисы, GraphQL). Кстати, мы ищем .NET-разработчиков. Если чувствуете в себе силы, присылайте резюме на почту svetlana.medova@eaeconsult.ru.

Важно ли иметь портфолио?

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

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

Итоги и советы

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

Во фронтенде, может быть, чем больше технологий ты освоил — тем ты круче. А в Java, если ты настроен на суровый Enterprise (работу в банках и крупных консалтинговых агентствах), поможет только погружение в коммерческие проекты. У меня поиск работы затянулся, но могу сказать, что всё основное на курсах я изучил в первые две четверти. Хотя дальше тоже были полезные вещи, было важно вместе с их изучением повторять старый материал.

Коммерческая разработка в любом случае отличается от учебных проектов. Пока нет «боевого» опыта, многие вещи можно понять, но не запомнить. С 1990-х годов Java оброс множеством фреймворков и библиотек, поэтому осваивать этот язык надо так: изучаешь Java Core, базовые принципы, алгоритмы, SQL — и идёшь работать.

Ещё очень важно умение читать код. Когда берёшься за новый проект, 50 % времени уходит на то, чтобы разобраться в сделанном до тебя, ещё 40 % — на документирование своего кода и всего 10 % — на программирование. Это только в фильмах про хакеров от быстрого ввода команд происходят чудеса. 

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

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

Хотите узнать больше о выпускниках Java-факультета GeekBrains? Вот их истории:

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

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

Быстрый старт с Java: пишем «крестики-нолики»

Перед прочтением данной статьи рекомендую ознакомиться с предыдущей, «Быстрый старт с Java: начало», поскольку ожидается, что читатель владеет материалом, изложенным в ней — знает о переменных, условиях, циклах и импорте классов. Сегодня мы углублим знания о Java, создавая игру «Крестики-нолики», которая работает в командной строке (консоли). В процессе будет рассмотрена работа с массивами, а также некоторые аспекты объектно-ориентированного программирования (нестатические методы, нестатические поля, конструктор).

Массивы

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

В Java массивы являются объектами, их создают с помощью директивы new. При создании указываем количество элементов массива или инициализируем его набором значений. Приведенный код иллюстрирует оба варианта:

class Arrays {
    public static void main(String[] args) {
        int[] arr = new int[5];
        int[] arrInit = {1, 2, 3, 4, 5};
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i * 2 + arrInit[i];
        }
        for (int a : arr) {
            System.out.println(a);
        }
    }
}

С элементами массива можно работать как с обычными переменными, присваивая им результат выражения и читая хранимые значения. При этом в квадратных скобках указывается индекс элемента массива. Индексация в Java идёт с 0 (с нуля). Первый цикл инициализирует элементы массива arr при помощи значений из массива arrInit. Каждый массив имеет поле length, содержащее количество его элементов. Второй цикл выводит элементы массива в консоль, используя второй вариант for  без счётчика цикла.

Методы

Кроме main() класс может содержать и другие методы. Рассмотрим в качестве примера класс с методом add(), который вычисляет и возвращает сумму двух значений, переданных как параметры. Обратите внимание на тип int, который стоит перед именем метода — это тип возвращаемого значения. Две переменные в скобках — параметры. Совокупность имени и параметров называют сигнатурой метода. Вызов метода происходит по имени, в скобках указывают передаваемые значения. В методе они попадают в параметры-переменные. Команда return возвращает результат сложения этих двух переменных и обеспечивает выход из метода.

class MethodStatic {
    public static void main(String[] args) {
        int c = add(5, 6);
        System.out.println("5 + 6 = " + c);
    }
 
    static int add(int a, int b) {
        return a + b;
    }
}

Слово static означает, что метод статический. Если мы обращается к какому-либо методу из статического метода, то вызываемый тоже должен быть статическим. Вот почему add() статический — он вызывается из статического main(). Использование статических методов — скорее исключение, чем правило, поэтому давайте посмотрим как сделать add() нестатическим.

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

class MethodNotStatic {
    public static void main(String[] args) {
        MethodNotStatic method = new MethodNotStatic();
        int c = method.add(5, 6);
        System.out.println("5 + 6 = " + c);
    }
 
    int add(int a, int b) {
        return a + b;
    }
}

Поля класса

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

class FieldExample {
    int a;
 
    public static void main(String[] args) {
        FieldExample field = new FieldExample();
        field.a = 12;
        System.out.println("a = " + field.a);
        System.out.println(field.getA());
        field.printA();
    }
 
    int getA() {
        return a;
    }
 
    void printA() {
        System.out.println(a);
    }
}

Приведённый выше код иллюстрирует работу с нестатическим полем int a. Описание полей принято размещать первыми в коде класса, затем идут описания методов. Возможность обращаться к полю (запись, чтение) мы получаем только после создания объекта. Также видно, что это поле доступно во всех нестатических методах объекта, а в статическом main() — через точку после имени объекта.

Крестики-нолики. Шаблон класса

Приступим к написанию кода игры. Начнём с шаблона класса и определения нужных полей. Именно это содержит приведённый ниже код. Первые две строки — импорт классов. Первыми в теле класса идут описания полей, затем методов. Метод main() используется для создания объекта (так как поля и методы нестатические) и вызова метода game() с игровой логикой.

import java.util.Random;
import java.util.Scanner;
 
class TicTacToe {
    final char SIGN_X = 'x';
    final char SIGN_O = 'o';
    final char SIGN_EMPTY = '.';
    char[][] table;
    Random random;
    Scanner scanner;
 
    public static void main(String[] args) {
        new TicTacToe().game();
    }
 
    TicTacToe() {
        // конструктор: инициализация полей
    }
 
    void game() {
        // игровая логика
    }
 
    // дополнительные методы
}

В качестве полей используем три символьные константы: SIGN_X, SIGN_O и SIGN_EMPTY. Их значения нельзя изменять, об этом говорит модификатор final. Двумерный символьный массив table будет нашим игровым полем. Потребуется также объект random для генерации ходов компьютера и scanner для ввода данных от пользователя.

Имена методов принято писать с маленькой буквы. Однако в коде мы видим метод TicTacToe() — есть ли тут нарушение? Нет, поскольку этот метод особенный и в объектно-ориентированном программировании называется конструктор. Конструктор вызывается сразу после того, как объект создан. Его имя, как видим, должно совпадать с именем класса. Мы используем конструктор для инициализации полей.

TicTacToe() {
    random = new Random();
    scanner = new Scanner(System.in);
    table = new char[3][3];
}

Игровая логика

Игровая логика располагается в методе game() и базируется на бесконечном цикле while. Ниже в фрагменте кода последовательность действий описана через комментарии:

// инициализация таблицы
while (true) {
    // ход человека
    // проверка: если победа человека или ничья:
    //    сообщить и выйти из цикла
    // ход компьютера
    // проверка: если победа компьютера или ничья:
    //    сообщить и выйти из цикла
}

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

void game() {
    initTable();
    while (true) {
        turnHuman();
        if (checkWin(SIGN_X)) {
            System.out.println("YOU WIN!");
            break;
        }
        if (isTableFull()) {
            System.out.println("Sorry, DRAW!");
            break;
        }
        turnAI();
        printTable();
        if (checkWin(SIGN_O)) {
            System.out.println("AI WIN!");
            break;
        }
        if (isTableFull()) {
            System.out.println("Sorry, DRAW!");
            break;
        }
    }
    System.out.println("GAME OVER.");
    printTable();
}

Реализация вспомогательных методов

Пришло время написать код методов, вызываемых в game(). Самый первый, initTable(), обеспечивает начальную инициализацию игровой таблицы, заполняя её ячейки «пустыми» символами. Внешний цикл, со счетчиком int row, выбирает строки, а внутренний, со счётчиком int col, перебирает ячейки в каждой строке.

 
void initTable() {
    for (int row = 0; row < 3; row++)
        for (int col = 0; col < 3; col++)
            table[row][col] = SIGN_EMPTY;
}

Также потребуется метод, отображающий текущее состояние игровой таблицы printTable().

void printTable() {
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++)
            System.out.print(table[row][col] + " ");
        System.out.println();
    }
}

В методе turnHuman(), который позволяет пользователю сделать ход, мы используем метод nextInt() объекта scanner, чтобы прочитать два целых числа (координаты ячейки) с консоли. Обратите внимание как используется цикл do-while: запрос координат повторяется в случае, если пользователь укажет координаты невалидной ячейки (ячейка таблицы занята или не существует). Если с ячейкой всё в порядке, туда заносится символ SIGN_X — «крестик».

void turnHuman() {
    int x, y;
    do {
        System.out.println("Enter X and Y (1..3):");
        x = scanner.nextInt() - 1;
        y = scanner.nextInt() - 1;
    } while (!isCellValid(x, y));
    table[y][x] = SIGN_X;
}

Валидность ячейки определяет метод isCellValid(). Он возвращает логическое значение: true — если ячейка свободна и существует, false — если ячейка занята или указаны ошибочные координаты.

boolean isCellValid(int x, int y) {
    if (x < 0 || y < 0 || x >= 3|| y >= 3)
        return false;
    return table[y][x] == SIGN_EMPTY;
}

Метод turnAI() похож на метод turnHuman() использованием цикла do-while. Только координат ячейки не считываются с консоли, а генерируются случайно, при помощи метода nextInt(3) объекта random. Число 3, передающееся как параметр, является ограничителем. Таким образом, генерируются случайные целые числа от 0 до 2 (в рамках индексов массива игровой таблицы). И метод isCellValid() снова позволяет нам выбрать только свободные ячейки для занесения в них знака SIGN_O — «нолика».

void turnAI() {
    int x, y;
    do {
        x = random.nextInt(3);
        y = random.nextInt(3);
    } while (!isCellValid(x, y));
    table[y][x] = SIGN_O;
}

Осталось дописать два последних метода — проверка победы и проверка на ничью. Метод checkWin() проверяет игровую таблицу на «победную тройку» — три одинаковых знака подряд, по вертикали или горизонтали (в цикле), а также по двум диагоналям. Проверяемый знак указан как параметр char dot, за счёт чего метод универсален - можно проверять победу и по «крестикам» и по «ноликам». В случае победы возвращается булевское значение true, в противном случае — false.

boolean checkWin(char dot) {
    for (int i = 0; i < 3; i++)
        if ((table[i][0] == dot && table[i][1] == dot &&
                         table[i][2] == dot) ||
                (table[0][i] == dot && table[1][i] == dot &&
                                  table[2][i] == dot))
            return true;
        if ((table[0][0] == dot && table[1][1] == dot &&
                  table[2][2] == dot) ||
                    (table[2][0] == dot && table[1][1] == dot &&
                      table[0][2] == dot))
            return true;
    return false;
}

Метод isTableFull() во вложенном двойном цикле проходит по всем ячейкам игровой таблицы и, если они все заняты, возвращает true. Если хотя бы одна ячейка ещё свободна, возвращается false.

boolean isTableFull() {
    for (int row = 0; row < 3; row++)
        for (int col = 0; col < 3; col++)
            if (table[row][col] == SIGN_EMPTY)
                return false;
    return true;
}

Теперь осталось собрать все эти методы внутри TicTacToe. Последовательность их расположения в теле класса не важна. А после этого можно попробовать сыграть с компьютером в крестики-нолики.

Заключение

На всякий случай прилагаю мой telegram — @biblelamp. Если вас заинтересовала тема, рекомендую почитать «Java-программирование для начинающих» Майка МакГрата и «Изучаем Java» Кэти Сьерра и Берт Бейтс. Также напоминаю ссылку на мою предыдущую статью, где мы начали знакомство с Java.

Если язык Java вас заинтересовал — приглашаем на факультет Java-разработки. Если ещё не совсем уверены — посмотрите истории успеха наших Java-выпускников:

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

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

Быстрый старт с Java: от знакомства до вашей первой игры 

Эта статья рассчитана на новичков в программировании. Её цель — объяснить азы языка Java (классы, методы, компиляция, байт-код, JVM, переменные, условия, циклы, импорт). Этот материал поможет:

  • научиться писать код, компилировать и запускать байт-код;
  • познакомиться с переменными;
  • узнать об условных операторах и циклах;
  • освоить использование классов из стандартных пакетов;
  • написать простую консольную игру «Угадай число».

Java Development Kit (JDK)

Для работы с Java необходимо скачать, установить и настроить Java Development Kit (JDK) — пакет программ и утилит для разработчика. Он бесплатно предоставляется компанией Oracle.
В строку поиска Google вводим запрос “jdk 8 download” и в первой же строке поисковой выдачи видим ссылку на страницу загрузки на oracle.com. Листаем вниз, щёлкаем Accept License Agreement — соглашаемся с лицензией. Выбираем пакет в колонке Download, который соответствует вашей операционной системе и её разрядности (32 или 64 бита). Для скачивания нужно будет зарегистрироваться на сайте. Скачиваем и устанавливаем JDK. При выборе пакетов и папки JDK рекомендую отказаться от Public JRE и сократить имя папки до jdk1.8.

Счастливым обладателям Windows потребуется также настройка системных переменных. Как их найти: Панель управления → Система → Дополнительные параметры системы → Вкладка «Дополнительно» → кнопка «Переменные среды», второе окошко сверху. В нем надо создать переменную JAVA_HOME и изменить (дополнить) Path (для этого используются кнопки «Создать» и «Изменить». Значение для переменной JAVA_HOME содержит путь к папке JDK. Переменную Path дополняем значением %JAVA_HOME%\bin. Обратите внимание, что список путей разделяется точкой с запятой (;). Инструкция есть также на сайте Oracle.

JDK содержит много утилит, но нам потребуется только компилятор (javac) и виртуальная машина Java — JVM (java).

Проверить правильность установки и настройки можно в командной строке (на Windows: Win + R → cmd) или в терминале (Linux, Mac), набрав следующие команды:

javac -version
java -version

В качестве альтернативы можно использовать онлайн-JDK вместе с редактором, например на сайте Repl.it.

Написание кода

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

Для Windows хорошим выбором будет Notepad++ с плагином NppExec. Подробно о его настройке можно прочитать в статье Виктора Темпалова  «Компилируем и запускаем Java-файлы из Notepad++». Для Linux и Мас есть другие текстовые редакторы, например Atom или Sublime Text.

Hello, world!

При изучении нового языка писать программу, выводящую «Hello, world!», — это традиция. Она возникла в 1978 году, с выходом в свет книги «Язык программирования С» Брайана Кернигана и Денниса Ричи.

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Код начинается с ключевого слова class. Java-программы состоят из классов — это «кирпичики» приложения. В реальных приложениях их могут быть десятки, сотни и тысячи. Затем пишется имя класса — HelloWorld. Имена классов принято писать в стиле CamelCase (все слова слитно, каждое с заглавной буквы). Классам, как и другим сущностям — методам, полям и переменным — рекомендуется давать мнемонические, «говорящие» имена.

После имени в фигурных скобках записывается тело класса. Оно может содержать поля, методы и другие классы. Поля хранят данные. Они подобны переменным, однако в Java это несколько иная сущность. Методы содержат набор команд или код. Имена методов (как и полей, переменных) принято писать в стиле camelCase, со строчной буквы.

В нашем классе только один метод — main(). Он особенный, его часто называют стартовым. Когда виртуальная машина Java получает класс для исполнения, она ищет в нём метод main. Если находит — выполняет код, который содержит метод. Если нет — выдаёт сообщение об ошибке. Важно, чтобы метод main() имел строго определённую сигнатуру: был публичным (public), статическим (static), не возвращающим никакого значения (void), с параметром в виде массива строк (String[] args). В противном случае виртуальная машина его просто не найдёт.

Наш метод main() содержит лишь одну строку, которая выводит в консоль текст "Hello, world!".

Перед компиляцией сохраняем написанный код в файл. Имя файла должно соответствовать имени класса с точностью до регистра символов (Java — регистрозависимый язык). Затем открываем командную строку (или терминал) и вызываем сначала компилятор (javac), а потом виртуальную машину JVM (java).

C:\Users\User>javac HelloWorld.java
C:\Users\User>java HelloWorld
Hello, world!

После компиляции возникнет бинарный файл HelloWorld.class, содержащий байт-код. Имя этого файла (без расширения) передаётся как параметр при вызове виртуальной машины. В результате видим строку «Hello, world!» — это результат выполнения программы.

Переменные

Переменные хранят данные (числа, строки, логические значения и другие). Они похожи на коробочки: надписи на них — это имя и тип переменной, а внутри находится значение. При этом возможны две операции:

  • запись значения в переменную (или присвоение значения);
  • чтение значения из переменной. 

В Java перед использованием переменную нужно обязательно объявить, указав тип и имя, поскольку Java — язык со строгой и статической типизацией. Попытка использовать переменную без объявления приведёт к ошибке компиляции. По типу переменные могут быть простыми (числа, символы, логические значения) или ссылочными (массивы, строки, любые другие объекты). В Java есть восемь простых типов (byte, int, short, long, float, double, boolean, char) и бесконечное количество ссылочных.

В примере ниже мы видим объявление двух переменных целого типа (int). Причём переменная second инициируется при объявлении. Затем переменной first присваивается результат выражения, в котором присутствует переменная second. В результате выполнения программы в консоль будут выведены значения обеих переменных: 35 и 10.

class Variables {
    public static void main(String[] args) {
        int first;
        int second = 10;
        first = second * 3 + 5;
        System.out.println(first);
        System.out.println(second);
    }
}

Имя переменной может содержать буквы и цифры, знак подчёркивания и $. Имя не должно начинаться с цифры. В профессиональной разработке в именах переменных используют только буквы. Имя должно явно указывать на назначение переменной. Например: countString — счётчик строк, errorSign — признак ошибки. Рекомендуется избегать однобуквенных имён — за исключением временных переменных (существующих в рамках цикла или небольшого кодового блока).

Проверка условий

Любой язык программирования высокого уровня позволяет изменять порядок выполнения программы в зависимости от заданного условия. В Java для этого используется конструкция if. После этого ключевого слова в скобках записывается логическое выражение, затем в фигурных скобках — группа команд. Если результат логического выражения — true (истина), то эта группа команд выполняется, если false (ложь) — нет.

class ComparisonShort {
    public static void main(String[] args) {
        int i = 10;
        if (i == 10) {
            System.out.println("i = 10");
        }
    }
}

Результат этого примера — строка “i = 10” в консоли, так как результат логического выражения (проверка на равенство) будет true.

В качестве знаков сравнения допустимы: <, <=, >, >=, ==, !=. Добавив ключевое слово else, получаем полную форму оператора сравнения.

class ComparisonFull {
    public static void main(String[] args) {
        int i = 10 + 2;
        if (i == 10) {
            System.out.println("i = 10");
        } else {
            System.out.println("i != 10");
        }
    }
}

Выполнив эту программу, мы увидим в консоли сообщение “i != 10”, так как результат сравнения значения переменной i и цифры 10 будет false. Поэтому выполнится набор команд в фигурных скобках после слова else.

Циклы

Циклы предназначены для повторения группы команд. Java позволяет использовать два вида циклов:

  • с определённым количеством итераций: for;
  • без определенного количества итераций: while и do-while.
class CycleFor {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(i);
        }
    }
}

Запустив этот пример, мы увидим в консоли колонку чисел от 0 до 4. Это результат работы классического цикла for со счётчиком. В круглых скобках три параметра цикла, разделённые точкой с запятой: объявление и инициализация счётчика, проверка условия продолжения цикла, действие после каждой итерации. В фигурных скобках — тело цикла. В нашем случае это команда, выводящая значение счётчика i в консоль.

Когда будем писать игру, используем циклы while и do-while — там и увидим их работу на практике. Пока достаточно сказать, что их синтаксис проще for, а тело цикла повторяется до тех пор, пока логическое выражение в круглых скобках после while возвращает true.

Пример ниже иллюстрирует вторую форму цикла for — без счётчика. Такой вариант удобен при переборе элементов массива или списка.

class CycleForeach {
    public static void main(String[] args) {
        int[] arr = {5, 4, 3, 2, 1};
        for (int a : arr) {
            System.out.println(a);
        }
    }
}

Импорт и использование классов

Один из важных принципов программирования — DRY: Don’t Repeat Youself (не повторяйся). Разработчик должен уметь использовать то, уже создано, отлажено и работает.

Java поставляется с набором packages (пакетов). Они содержат скомпилированные классы, сгруппированные по тематике. На неё указывает имя пакета: java.io, java.util, java.net и так далее.

В игре нам потребуется случайное число от 0 до 9. Писать генератор случайных чисел незачем, так как в пакете java.util есть готовый класс Random. Чтобы использовать класс из пакета, его нужно импортировать. Строки с директивами импорта располагаются в самом начале файла класса.

import java.util.Random;

Создадим объект на основании класса, чтобы можно было вызвать нужный метод. Слева от знака присваивания (=) объявляем ссылочную переменную (объект) random типа Random. Справа создаём объект с помощью директивы new.

Random random = new Random();

Вызываем метод через точку после имени объекта: random.nextInt(10). Цифра 10 ограничивает диапазон генерируемых чисел (от 0 до 9). В результате получим строку из 30 случайных чисел. Запустите программу несколько раз и обратите внимание, что последовательность чисел не повторяется.

import java.util.Random;
 
class RandomInt {
    public static void main(String[] args) {
        Random random = new Random();
        for (int i = 0; i < 30; i++) {
            System.out.print(random.nextInt(10) + " ");
        }
    }
}

Игра «Угадай число»

Мы узнали достаточно, чтобы написать игру «Угадай число». В ней компьютер «загадывает» целое число от 0 до 9, а человек должен угадать его — есть три попытки.

Создадим класс GuessTheNumber с методом main(), импортируем нужные нам классы и добавим соответствующие объекты. Класс Scanner обеспечит чтение чисел с консоли (System.in — консоль).

import java.util.Scanner;
import java.util.Random;
 
class GuessTheNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner sc = new Scanner(System.in);
    }
}

Объявим и инициируем три переменные: счётчик попыток count, для чтения числа с консоли — guess, для хранения загаданного числа — number.

int count = 0;
int guess = -1; 
int number = random.nextInt(10);

Опишем основной игровой цикл, используя while. В цикле запрашиваем число с консоли, сравниваем с загаданным. В случае несовпадения выводим подсказку и увеличиваем счётчик попыток на 1.

while (count < 3 && guess != number) {
    System.out.print("Guess the number (0..9): ");
    guess = sc.nextInt();
    if (number != guess) {
        System.out.println("Your number is " +
            ((guess > number)? "greater" : "less"));
        count++;
    }
}

Тело цикла while повторяется, пока логическое значение в скобках возвращает true. Таким образом наш цикл будет повторяться, пока значение счётчика попыток меньше 3 и число не отгадано. Обратите внимание на конструкцию, которая позволяет выбрать одно из двух значений согласно условию в скобках. Это тернарный оператор. Если условие в скобках true, то возвращается значение слева от двоеточия, если false — справа.

(guess > number)? "greater" : "less"

Остаётся добавить строку с выводом результата игры (победа или проигрыш) после цикла — тут снова используется тернарный оператор. Текст работающей программы выглядит так:

import java.util.Scanner;
import java.util.Random;
 
class GuessTheNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner sc = new Scanner(System.in);
        int count = 0;
        int guess = -1;
        int number = random.nextInt(10);
        while (count < 3 && guess != number) {
            System.out.print("Guess the number (0..9): ");
            guess = sc.nextInt();
            if (number != guess) {
                System.out.println("Your number is " +
                    ((guess > number)? "greater" : "less"));
                count++;
            }
        }
        System.out.println("You " +
            ((guess == number)? "WIN!" : "Lose: " + number));
    }
}

Сохраняем программу в файл GuessTheNumber.java, компилируем (javac), вызываем JVM (java) — и пробуем выиграть у компьютера.

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

import java.util.Random;
import java.util.Scanner;
 
class GuessTheNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner sc = new Scanner(System.in);
        do {
            //
            // Вставьте фрагмент, который должен повторяться
            //
            System.out.println("Repeat game? Yes - 1, No - 0");
        } while (sc.nextInt() == 1);
    }
}

Обратите внимание, что тело цикла do-while повторяется на тех же условиях, что и тело цикла while: логическое выражение в скобках должно быть true.

Заключение

На всякий случай прилагаю мой telegram — @biblelamp. Если вас заинтересовала тема, рекомендую почитать «Java-программирование для начинающих» Майка МакГрата и «Изучаем Java» Кэти Сьерра и Берт Бейтс. В следующих статьях мы продолжим начальное изучение Java на примере создания других игр. Следите за блогом!

Если язык Java вас заинтересовал — приглашаем на факультет Java-разработки. Если ещё не совсем уверены — посмотрите истории успеха наших Java-выпускников:

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

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

Тренды среди языков программирования в 2019 году

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

Популярные языки программирования

Начнём с традиционно популярных языков, Как известно, любой распространенный язык имеет в запасе минимум 10 лет, чтобы специалисты в нём оставались востребованными на рынке.
Согласно рейтингам авторитетного портала PYPL, основывающихся на популярности поисковых запросах Google в разных странах, самым востребованным языком сегодня является Python. Он обошёл Java ещё летом прошлого года, и количество запросов с тех пор увеличилось на 4,5%.

По версии портала TIOBE, учитывающего не только Google, а все поисковые системы, первое место давно и уверенно удерживает как раз Java. При этом статистика этого портала подтверждает, что языки живут в противофазе: Java за год потерял 0,9%, в то время как Python набрал 1,93 пункта.

Известная софтверная компания JetBrains на своём официальном сайте опросила 7 тысяч разработчиков. Результаты следующие: JavaScript первый, на втором месте Java (оставим HTML/CSS и SQL за скобками), на третьем Python. При этом у Python вновь лучший прирост аудитории за год — 9 %.

Вот что о феномене Python говорит преподаватель факультета искусственного интеллекта GeekUniversity Сергей Ширкин:

«Python очень прост в освоении – можно быть новичком в программировании и уже писать на нём рабочие программы. В своё время это подошло Data Science, потому что большую часть контингента в этой сфере составляли математики и физики, но не профессиональные программисты. В итоге самые популярные библиотеки для работы с большими данными – на Python.

Единственное, что ограничивает язык – низкая скорость работы программ, особенно если мы сравниваем с C/C++. При этом в Python есть такие библиотеки, как numpy, которая, благодаря тому, что часть кода написана на C и Fortran, почти не уступают в производительности.

Сейчас Python проникает в область квантовых вычислений и квантового машинного обучения. Сейчас уже для этого есть библиотеки Qiskit, Cirq, PennyLane, дальше – больше. Здесь уже скорость исполнения программ на Python не важна, ведь все операции проходят на квантовом компьютере, быстродействие которого на порядки выше».

Языки программирования «второго эшелона»

При взгляде на рейтинг PYPL также бросается в глаза взлёт Kotlin: четыре позиции за год и итоговое 12 место.  Пользователи на сайте JetBrains отдали языку 9 место. Причин взлёта две.

Первая — это обновление языка в конце лета. Тогда были устранены многие проблемы и расширена функциональность, с сопутствующим введением всех новых фичей в IntelliJ IDEA – популярнейшую среду программирования. Вторая причина — в прошлом году язык Kotlin получил статус предпочтительного для разработки Android-приложений.

Вот что думает об этом декан факультета Android-разработки GeekUniversity Александр Аникин:

«Если в прошлом году Kotlin стал предпочтительным для Android, то в этом, по сути, главным. Теперь весь новый код, библиотеки, обновления и примеры будут писаться разработчиками платформы на Kotlin. Для этого есть 3 основные причины:

  • Юридический уход от Java. Не секрет, что Oracle в последние годы всё больше ограничивает бесплатное использование Java, что больше всего, пожалуй, затрагивает Android.
  • Полная взаимозаменяемость языков. Можно легко перейти с одного языка на другой не изменив ни строчки кода.
  • Kotlin = Java 2.0. Это современный язык, имеющий те же возможности, что и родитель, но улучшенный с учётом текущих тенденций.

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

Другой заметный язык – Rust, который также выделяется в рейтинге PYPL. Год назад мы узнали о том, что это один из самых любимых языков у посетителей портала Stack Overflow. Rust очень медленными шагами идёт к замещению C/C++ в клиентских и серверных веб-приложениях. Этим он обязан популярному формату инструкций для виртуальной машины WebAssembly, поддерживающему все три вышеназванных языка.

Кроме того, он поддерживает и Go — язык к которому также стоит присмотреться. Согласно JetBrains, у Go ожидается самый большой прирост популярности в ближайшие 12 месяцев.

Менее распространенные языки программирования

У языков программирования, не входящих в топы рейтингов, очень сложно оценить потенциал. Количество поисковых запросов, как правило, плохо отражает реальность – из-за низких цифр в статистику вмешивается специфика региона и местных компаний. Из тех, на которые стоит обратить внимание гикам (а больше это, пожалуй, никому и не надо): Elixir, Dart и Ballerina.

Если о первых двух вы наверняка что-то слышали и читали, — а Dart даже многие успели похоронить — то о последнем стоит сказать чуть подробнее. Ballerina – это молодой и крайне интересный язык. Его синтаксис — комбинация из Java, Python, JavaScript и Go, со статической типизацией. Основные операции имеют привычный вид, поэтому на обучение не уйдёт много времени. Но куда интересней в Ballerina другое — направленность на интеграцию. В современном вебе, где постоянно взаимодействуют сотни серверов и сервисов, ценность языков с модулями, легко обеспечивающими это, крайне высока. Как альтернативу Ballerina можно взять на заметку Pulumi и Dark – будущее веба без языков инфраструктуры невозможно.

Однако, несмотря на все прелести и перспективы этих языков, браться за их изучение новичкам не следует – лишь представителей первого и отчасти второго разделов стоит рассматривать как фундамент современного программиста. Знание Elixir, Dart, Ballerina или Pulumi поможет понять, что у любой задачи есть множество решений.

Подробней об изучении разных языков программирования можно почитать на страницах факультетов Geekbrains — Python, Go, Java, а также веб-, iOS-, Android-разработки. Удачного выбора!

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

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

Первая работа в IT с переездом в Москву: как это бывает

Никите Ермакову 26 лет, раньше он жил в Старом Осколе Белгородской области и работал резчиком металла на металлургическом комбинате. Программирование начал изучать менее года назад, а сейчас — Junior-разработчик Java в компании EPAM Systems. Это крупнейший производитель заказного ПО в мире. 

Первую работу в IT Никита получил в процессе обучения. Но были на пути и сомнения, и проваленное собеседование, и интересные учебные проекты.

— Привет, Никита! Ты уже завершил обучение или еще продолжаешь?

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

— Чем сейчас занимаешься в EPAM?

— Работаю над проектом, который был написан довольно давно, так что многие инструменты, используемые в нем, мы на уроках в GU не затрагивали. Например, Tomcat Vault, Axis2 или Sybase. Естественно, приходится все это изучать уже самостоятельно. 

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

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

— Как ты нашел эту работу? На каком этапе обучения?

— Работу я начал искать примерно в середине третьей четверти, и поначалу с вакансиями было совсем глухо. Я постоянно отслеживал предложения на сайтах типа HeadHunter. Еще попробовал «Мой круг», но там вакансий для начинающих Java-разработчиков не оказалось. 

Я прошел весь путь ищущего работу студента: откликался на вакансии, выполнял тестовые задания, дистанционно решал кейсики со Дня карьеры в GeekBrains.

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

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

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

Что было делать дальше? Я посоветовался со знакомым Java-программистом, который работал в EPAM. Он помог мне составить новое резюме на вакансию в компании. Я читал, что подобная практика широко применяется в Google и других крупных западных компаниях: сотрудники могут приглашать на вакансии своих знакомых и друзей. В моем случае это сработало. 

— Как выглядит хорошее резюме в EPAM? Чем оно отличалось от предыдущего?

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

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

Тестовое задание и собеседование

Мне ответили и предложили выполнить тестовое задание. Нужно было написать консольную программку типа CRUD. 

Как мне показалось, работодателя больше интересовала архитектура программы, нежели ее конкретная реализация. Главным было показать, что умеешь практически подходить к задаче и создавать гибкий код, в котором можно что-то быстро заменить. После курса по фреймворку Spring я уже понимал, как это должно выглядеть. Да и книга «Совершенный код» очень помогла разобраться в таких вещах. В плане инструментов оказалось достаточно простого Java Core.

Предложенное мной решение подошло — пригласили на собеседование. 

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

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

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

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

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

Когда готовился к собеседованиям, обогнал программу обучения GeekUniversity: раньше времени разобрался в паттернах проектирования, одолел половину книги о Spring. Помимо занятий и методичек читал и смотрел сторонние источники. Все решает мотивация.

— Переезд из Старого Оскола в Москву был связан с работой?

— Да, я переехал именно ради этого. В Москве намного больше вакансий, чем в моем родном городе и в среднем по стране. Хотя, если честно, я еще рассматривал варианты в Питере, потому что мне больше нравился этот город. В итоге остановился на EPAM и Москве.

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

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

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

Не секрет, что рынок перенасыщен джуниорами и на старте приходится брать его брутфорсом (буквально — «грубой силой»). Это тоже подталкивало к раннему поиску работы. 

Переезд

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

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

— Почему ты решил идти в разработку и выбрал язык Java? 

— Оглядываясь назад, думаю, что предпосылок заняться программированием было две. Первая — с детства с компьютерами дружу. Конечно, сначала это было связано с игрушками, но я и обработкой изображений в Photoshop увлекался, и ролики монтировал в Sony Vegas, и в 3D-моделировании успел получить минимальный опыт — делал игровые карты для Counter-Strike 1.6. Разные бытовые вопросы с «железом» и «софтом» тоже сам старался решать, когда нужно было поднять домашнюю сеть, модернизировать или настроить оборудование, побороть «синий экран смерти», очистить ПК от вирусов и их последствий. 

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

Выбор языка

Когда я планировал учиться, посоветовался с товарищем, о котором уже рассказывал. Он предложил для начала попробовать Python либо Java. 

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

— Над какими проектами ты работал за время учебы? Расскажи немного о самых интересных.

— Сначала я создал сетевой чат. Программа очень проста по возможностям, но когда впервые создаешь что-то сложнее «Hello, world!» — и тем более что-то полезное на практике, — испытываешь эйфорию!

Дальше я работал над облачным хранилищем. Захотелось добавить имитацию окошек Windows средствами Swing, и получилось интересно. Это привнесло в процесс каплю творчества — а творчество я люблю.

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

Немного о самой игре. Это классический космический shoot ‘em up: летим вперед и крушим всех на своем пути. Жанр и тематику мы выбрали на первом занятии, в качестве движка использовали LibGDX. По итогам курса достаточно было сдать что-то типа бесконечного уровня с несколькими типами противников, но мне захотелось большего. 

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

Чтобы игра лучше выглядела, я доработал интерфейс, добавил полоски с уровнем здоровья, закрепил рекордные суммы баллов в главном меню. Еще я создал систему сохранений на основе SQLite. Чтобы прикрутить ее к LibGDX, пришлось повозиться не один час. Также реализовал три уровня сложности и режим Survival, в котором каждую минуту возрастает число врагов, наносимый ими урон и скорость полета снарядов. 

Ресурсы частично брал из материалов урока, частично собирал и делал сам. Сначала я находил базовые изображения в Google, затем редактировал их в Photoshop — обрезал, склеивал, подгонял по цветовой гамме. 

В общей сложности на проект ушло около полутора месяцев. Конечно, хотелось бы загрузить игру в Google Play Market и посмотреть, как она себя покажет, но для этого пришлось бы заменить часть контента: шрифты, многие изображения и всю музыку не пропустят из-за нарушения авторских прав. Пока речь шла об учебном проекте, это было не принципиально, но для массового распространения — сами понимаете.

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

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

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

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

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

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

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

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

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

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

— Какие перспективы видишь для себя в профессии? В каком направлении хочешь развиваться дальше?

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

Когда я готовился к собеседованиям, просмотрел 24-часовой курс по Java, который записал Yakov Fain по своей книге. Яков — очень умный человек, в свое время компания Sun Microsystems присвоила ему титул Java Champion. Меня этот курс очень вдохновил — захотелось как можно скорее набрать опыта, стать бывалым разработчиком, возможно, получить какие-то награды. 

На сегодняшний день моя программа-минимум — получить должность уровня Senior. А дальше посмотрим. Я думаю, когда занимаешься делом, которое действительно нравится, карьерный рост — это вопрос времени. Сейчас мне нравится писать код. С возрастом вкусы меняются, но в IT столько разных направлений, что в случае чего у меня будет выбор.

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

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

Как стать Android-разработчиком — интервью с деканом

Александр Аникин — Senior Android developer и декан факультета Android-разработки в GeekUniversity. Он сам изучил профессию в GeekBrains, а сейчас руководит преподавателями и параллельно работает в крупной компании. Я расспросила Александра, что происходит с платформой Android, какие направления развития она предлагает программисту и как приобщиться к ней в GU.

 

— Привет! Расскажи, пожалуйста, о перспективах Android-разработчика, как ты их видишь. Чем это направление привлекло тебя и чем оно может заинтересовать сегодняшнего новичка?

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

Меня в мобильной разработке привлекает возможность сразу видеть результат своих трудов. Ты пишешь небольшое приложение за пару месяцев, выкладываешь его в Google Play и получаешь отдачу. Можно работать в одиночку или в маленькой команде, где вклад каждого участника важен и очевиден. Для сравнения: если в команде из 500 джавистов писать крупную серверную SAP-систему, результата своей работы можно не наблюдать годами и не увидеть никогда. Думаю, многим важно, чтобы их вклад был заметен.

Есть и еще один момент. Навыки Android-разработки позволяют создавать приложения для себя — полезные инструменты, которые всегда с тобой. Для меня смартфон — это часть жизни, неотъемлемая и интересная. Я понимаю, как работает мой гаджет, расширяю его возможности, делаю его «умнее» и так упрощаю свою жизнь. Это приносит мне удовольствие. И надо помнить, что Android-разработка нацелена не только на мобильные устройства, сфера ее применения гораздо шире.

— Помимо приложений для планшетов и смартфонов, что можно делать?

— Писать софт для Android Auto, телевизоров, часов и других устройств. Android для ТВ отличается от мобильной версии в основном управлением — все действия не через тачскрин, а через пульт.

Еще есть горячее направление Internet of Things: можно писать приложения для управления умным домом. Тут уже больше отличий от мобильной разработки. Умные дома — это тренд, который уже наметился и будет развиваться. Эти технологии ближе, чем кажутся, ведь не обязательно иметь комплекс устройств: лампочки и розетки Wi-Fi — тоже умный дом.

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

Будет развиваться индустрия — нужна ведь не только программная часть, но и аппаратная. Уже были «первые звоночки»: Microsoft HoloLens и Google Glass. Но технология еще недостаточно совершенна для реализации таких идей. Как только появятся недорогие и удобные очки (а это случится), произойдет взрыв! Дополненная реальность через смартфоны — это легко и это уже есть.

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

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

Наши студенты изучают мобильную разработку за год и не в формате пятидневки: у нас два занятия в неделю по два с половиной часа каждое. За это время ты получаешь базовые знания, которые позволят устроиться на работу в качестве junior'а. Если ты очень упорно занимался и отдавал этому все силы, тебя могут взять на вакансию уровня middle. Будь у нас два года учебного времени, я бы с удовольствием добавил в программу курс по дополненной реальности.

— Помимо языка Java на факультете преподают Kotlin?

— Да. Недавно мы включили в программу изучение основ Kotlin. По итогам курса студенты пишут приложение для заметок, которое, по аналогии с Google Keep, хранит данные в облачном хранилище Firebase.

В планах — добавить еще курс профессиональной мобильной разработки на Kotlin.

— А еще какого типа проекты ждут студентов факультета?

— Сначала мы пишем погодное приложение, которое показывает сводку по любым городам и регионам. Дизайн интерфейса и дополнительные фичи — на усмотрение слушателей. Затем изучаем принципы Material Design и по этому курсу пишем приложение для просмотра фотографий — по аналогии с лентой Instagram.

Один курс посвящен популярным библиотекам: Dagger, Mosby, Butterknife, Room, Sugar ORM. Отдельный проект по итогу студенты не разрабатывают, вместо этого они внедряют изученные паттерны и библиотеки в свои текущие проекты.

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

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

— Что нужно для занятий мобильной разработкой? Как минимум среда разработки и Android-устройство для тестирования?

— Из обязательных требований — только компьютер. Даже Android-девайс иметь под рукой не обязательно, потому что тестировать приложения можно на эмуляторе. Гипотетически, код можно писать и в блокнотике, но на деле, конечно, понадобится среда разработки (IDE). Это бесплатная Android Studio, которую вы можете скачать из интернета.

Если сравнивать с iOS-разработкой, там тебе нужен Mac, который стоит в 5–10 раз дороже ПК под Windows или Linux. Плюс ты будешь ежегодно платить Apple по 100 $, чтобы иметь право что-то разрабатывать для их устройств. Это создает «имущественный ценз» — порог входа, который в Android-разработке практически отсутствует.

— Как изменилась Android-разработка за последние годы — с момента, когда ты пришел в это направление?

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

Я пришел в Android-разработку четыре года назад — тогда многие использовали IDE Eclipse, и я тоже начинал работать в ней. С тех пор все перешли на Android Studio — среду разработки от Google. Еще появились архитектурные компоненты: стало ясно, какой должна быть архитектура Android-приложений. До недавнего времени все писали кто во что горазд. В число основных языков разработки вошел Kotlin — теперь это стандарт, и многие новые приложения изначально пишутся на нем.

— То есть за Kotlin будущее? Почему этот язык так «выстрелил» в Android-разработке?

— Создатели Kotlin плотно работают с Google. А если учесть, что они (JetBrains) создали еще и среду IntelliJ IDEA, на которой базируется гугловская Android Studio, сотрудничество получается очень успешным. Кроме того, Java принадлежит компании Oracle, у которой сейчас правовые проблемы с Google.

Я не вникал глубоко в этот вопрос, но, насколько понимаю, Oracle хочет сделать Java платным для корпоративных клиентов или брать royalties за использование отдельных модулей. А поскольку на этом языке пишется софт для двух миллиардов Android-устройств, Google не в восторге от такого хода. Если бы не юридические препирательства, не уверен, что Kotlin так быстро поднялся бы в этой сфере. Но есть и другие причины.

Возьмем Go и Dart — они со временем наверняка станут официальными языками Android-разработки, но у них узкая специализация. Kotlin позволяет делать все, что может Java, и больше того. На нем можно написать сервер, мобильное приложение, нативную логику, среду сборки — что угодно. Плюс создатели Kotlin добавляют в язык фичи, специально заточенные под Android-разработку.

— Несколько вопросов о тебе: чем ты занимался раньше, как пришел в IT и стал писать для мобильных устройств?

— До Android я всю жизнь занимался маркетингом. Работал классическим маркетологом, мобильным маркетологом, SMM, продакт-менеджером. Потом захотел сменить профессию и начал программировать.

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

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

— С чего ты начал путь в разработку?

— Знакомые разработчики порекомендовали мне начать с Java. И этот совет до сих пор актуален, потому что Java — развитый, хорошо документированный язык с отличным community. Он использует строгую статическую типизацию и подходит новичку. Если ты знаешь Java, тебе легко перейти на Swift, Objective-C, Kotlin, Go, Dart. Это позволяет выбирать практически любое направление.

— Сначала ты пробовал учить язык самостоятельно?

— Да. Месяца два я ковырялся с Java сам, затем понял, что лучше вложить деньги в свое образование и с помощью менторов закрепить и стандартизировать свои знания. Тогда я купил курсы в GeekBrains, прошел обучение и устроился junior'ом на первую работу.

— Какое-то портфолио удалось собрать?

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

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

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

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

— Через какое время в разработке ты решил преподавать?

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

— Чем ты занимаешься вне GeekUniversity?

— Работаю в крупном банке и пишу для него приложения.

— И там тоже проводишь собеседования? Ты на руководящей должности?

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

— До банка ты работал еще в нескольких компаниях?

— Да. Начинал в небольшой компании, где разработкой занимались два человека: я и технический лид, который меня многому научил. Через два года я перешел на middle-позицию в EPAM. Это крупнейший в мире производитель программного обеспечения.

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

— А кого-то из выпускников GB и GU тебе доводилось брать на работу?

— Только один раз, но случай интересный. В октябре 2018 года ко мне пришел выпускник курса, который я вел около года назад. Он уже 6 месяцев трудился Android-разработчиком и хотел устроиться к нам преподавать. Я его сразу узнал — это был один из активных студентов. Мы провели собеседование, он его не прошел: не хватало базовых знаний для ведения вебинаров. На мой взгляд, преподавателю, который ведет курсы Android-разработки первого и второго уровня, нужна очень хорошая теоретическая подготовка. Потому что студенты, еще мало знакомые с Java, могут задать любой вопрос — не только про Android, но и по смежным направлениям. И ты должен быть готов хотя бы в общих чертах говорить о вещах, с которыми на практике не сталкивался.

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

— Спасибо тебе за содержательный рассказ: мы успели затронуть много тем! Ждем вопросов в комментариях.

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

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

С Дня карьеры в «Альфа-Банк»: история студента GU

Ивану 22 года, и он уже успел поработать в авиационной отрасли, освоить C++ и приняться за Java, а еще — найти работу мечты в одном из крупнейших российских банков. Мне захотелось узнать эту историю подробнее, и мы с Иваном записали интервью. Поговорили о том, как начать новую карьеру, когда у тебя уже есть хорошая работа, и чем полезен GeekUniversity студенту известного вуза.

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

— Сейчас я — старший разработчик Equation в «Альфа-Банке». Наша команда совершенствует систему расчетов. Если конкретнее говорить о моих задачах, это написание и доработка кода, исправление ошибок ПО.

Как ты попал в «Альфа-Банк»? И трудно ли было искать вакансии параллельно с учебой?

— Работу я нашел на мероприятии День карьеры в GeekBrains. Такие встречи с работодателями — просто потрясающая идея. Я очень обрадовался, когда узнал о них. Участвовал два раза. И вот во второй мне улыбнулась удача.

Как это было?

— Первый День дал мне опыт: я растерялся и толком не успел поговорить с работодателями, зато узнал, как преподнести свои знания и пройти собеседование. Особенно полезным было выступление Людмилы Карамышевой. Ее советы помогли мне составить более удачное резюме. Старое просто выкинул.

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

«Альфа» зацепила с первых минут диалога. Компанию представляли приятные и приветливые HR. Они сказали, что ищут специалистов со знанием Java и C++. После беседы обещали перезвонить буквально через пару дней. У меня было чувство нереальности происходящего и огромное желание попасть именно туда.

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

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

— До программирования я учился в Московском авиационном институте (МАИ) и работал на авиационных предприятиях. Когда пришел на предыдущее место работы, понял, что не хватает знаний в области программирования (конкретно C++), и начал искать хорошие курсы.

Сначала я прошел курсы от МФТИ и Яндекса, о которых узнал на сайте Coursera. Было тяжело совмещать дополнительное образование с работой и учебой в вузе, но это принесло плоды.

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

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

Как получилось, что ты решил сменить сферу деятельности?

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

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

Почему ты выбрал язык Java?

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

Легко ли было изучать Java после С++? Были какие-то сложные темы?

— После C++ изучение Java шло более чем прекрасно. Достаточно было провести аналогию между двумя языками, и все становилось на свои места. Сложных тем в Java после C++ не было как таковых. Безусловно, эти языки не полностью идентичны, но похожи.

Расскажи, пожалуйста, какие именно проекты ты уже сделал и как их оцениваешь?

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

Какой проект был сложнее, а какой принес больше удовольствия?

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

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

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

Что за игра в итоге получилась?

— Мы разрабатывали своего Bomberman’а. Я сразу понял, сколько всего можно придумать и сделать. Здорово было делиться с преподавателем своими наработками и получать по ним рекомендации. Но главное — это был проект, к которому раз за разом хотелось возвращаться, чтобы дорабатывать.


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

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

А кто вел курс разработки игр?

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

Кстати, именно в работе над игрой я впервые на практике применил Gradle и Maven. А они очень востребованы на моей нынешней работе!

Были еще какие-то учебные курсы в GU, которые тебе особенно запомнились и помогли?

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

Также был очень интересен курс HTML/CSS. Очень жаль, что я пока не успел его закончить.

Сколько времени с начала учебы прошло, прежде чем ты нашел работу?

— Я поступил в GeekUniversity в декабре 2017 года, а на работу устроился в сентябре 2018. За это время некоторые курсы пришлось перепройти: не все успевал с первого раза, потому что параллельно работал и учился в университете офлайн. Но я все-таки благополучно добрался до конца второй четверти в GU.

И вот ты на собеседовании в «Альфа-Банке». Трудно было? И долго ли ты к нему готовился?

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

А сейчас насколько тебе хватает знаний, полученных в GU? Многому ли приходится доучиваться по ходу дела?

— В базовых вопросах знаний хватает, но, безусловно, учиться приходится многому. Во время испытательного срока понадобилось на новом уровне изучить Gradle, git и язык программирования RPG. Уверен, что первые два пункта дались бы мне гораздо легче, если бы я доучился в GU до конца. А вот RPG в любом случае понадобилось бы учить с нуля. Но благодаря знанию Java и C++, я без особых проблем освоил третий язык на минимально необходимом уровне.

Совсем недавно я прошел курс TDD на Java и получил сертификат, подтверждающий мои компетенции.

Что ты думаешь о студенческом сообществе, которое ведет Даша Грач? На практике оно тебе пригодилось?

— Это, пожалуй, одна из самых полезных вещей в GU! Студенческое сообщество дает возможность делиться мыслями, наработками, опытом. Я не только общался с одногруппниками, но и часто советовался с преподавателями в чатах. Мне это очень помогло.

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

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

Что ты посоветуешь людям, которые приходят из смежных областей или хотят изучать Java после других языков с ООП?

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

Когда планируешь вернуться к обучению в GeekUniversity?

— Собираюсь где-то в начале марта. Очень надеюсь, что к этому времени успею разобраться со всеми делами: окончить вуз и защитить диплом.

Спасибо тебе за историю. Успеха в любимой работе и, конечно, в дальнейшем обучении!

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

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

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

Новичкам еще сложнее — у них не хватает опыта, чтобы адекватно оценить качество своего кода. Максимум, на что может рассчитывать работодатель, — ссылка на 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
Показаны все темы: 8

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

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

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

Люди

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