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

Основная статья: Разработка

«Шесть сезонов „Игры престолов“ за две недели на работе...»

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

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

Я не хотел терять время, и сама работа была совсем не по душе. Каждый день я буквально заставлял себя вставать и ехать в офис.

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

Программирование — то, что доктор прописал

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

Уговорил и меня попробовать. Правда, я решил оценить возможности Java — прошёл сначала короткое онлайн-обучение по этому языку. После этого решил проработать вопрос серьёзнее: поискал в сети курсы и нашёл GeekBrains. Помню, понравилось то, что они связаны с Mail.Ru Group, поэтому остановился на этом варианте.

Выбрал iOS-разработку. Я большой поклонник продукции Apple и думаю, что её мобильные устройства будут востребованы ещё долго. А значит, и на специалистов будет спрос. Apple — компания, которая двигает технологии вперёд. Конечно, уже не так, как при Джобсе, но всё же она находится на переднем крае hi-tech.

Этап обучения 

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

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

Ещё один нюанс: уже заканчивая карьеру менеджера, я делал приложение для работодателя. Это был калькулятор стоимости литра топлива на базе в Бишкеке с учётом всех издержек при покупке в разных местах. Например, компании предлагают купить 92-й бензин на границе Киргизии и России по 400 долларов за тонну. Мы эту сумму забиваем в калькулятор и видим результат: литр этого бензина на нашей базе будет стоить 30 сом (местная валюта). В то же время мы знаем, что прямо сейчас можем купить в Бишкеке рядом с базой такое же топливо, а его финальная стоимость будет 25 сом за литр. Так можно быстро сравнивать варианты и принимать решения.

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

Так я применил свой опыт на практике — и это пригодилось впоследствии.

Трудоустройство

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

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

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

Что касается работы, то сначала меня оценили как «начинающего middle», и эти было очень неожиданно. Со временем я дорос до старшего разработчика.

Доходы, дорога на работу и другие нюансы

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

На дорогу до офиса трачу примерно столько же времени, но зато появилось много других плюсов. Это корпоративные «плюшки» и бонусы, ДМС, фитнес. Удобный и просторный офис, а также возможность работать удалённо — этой зимой попробую из Испании. Компания оплачивает поездки на конференции. Ещё «Альфа-Банк» сейчас развивает мерч-направление, так что как сотрудник я всегда могу купить свитшот с хорошей скидкой :)

Свободного времени стало гораздо меньше — я реально занят работой, причём такой, которая приносит удовольствие мне и пользу компании. Это имеет для меня большое значение.

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

Планы на будущее

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

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

Советы начинающим

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

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

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

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

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

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

20 дек 19, 11:46
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

Обучение Python для школьников

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

Что такого особенного в вашем курсе?

Главная особенность курса — в цели обучения. Школьники здесь не готовятся на должность middle-разработчика, а, скорее, знакомятся с миром IT, разработки. Поэтому учебный материал не только проще подается, но иначе выстроен. Яркие презентации, лаконичные методички, облегченные практические задания — все призвано подстёгивать интерес к учебе. 

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

Что нужно знать и уметь к началу занятий?

Сразу скажем: знаний о разработке не нужно, мы учим программированию с нуля, с установки Python и среды разработки. А вот что точно понадобится:

  • Базовые навыки работы на компьютере. Надо уметь устанавливать и запускать программы, выходить в интернет, создавать и копировать файлы.
  • Математика на уровне начальной школы. Код всегда связан с логикой и вычислениями.
  • Английский язык на базовом уровне. В коде мы используем английские слова — их надо уметь запоминать. Сюда же относится умение печатать в американской раскладке.

Остальному научит Алексей Петренко — один из самых опытных наших преподавателей, декан факультета Python в GeekUniversity.

Что будут создавать на курсе?

Основным проектом учеников будет сайт-визитка. Это хорошее начало для развития в мире IT. Такой проект позволяет не только изучить Python, но и параллельно вникнуть сразу в несколько других языков и популярных инструментов — HTML, CSS, JavaScript, SQL, Bootstrap, Flask. Все это будет освоено на базовом уровне, таким образом сформируется первый стек технологий.
 
Преимущество сайта-визитки ещё и в том, что такой результат можно легко увидеть и оценить. Это как игрушка, которую делаешь сам — играть с ней вдвойне приятно и друзьям всегда показать можно.

А как с нагрузкой?

Курс разработан специально для детей и нагрузка здесь ниже, чем на взрослых занятиях в GeekBrains. Уроки-вебинары длительностью 1,5 часа проходят раз в неделю. Каждый урок разбит на две половины, между которыми предусмотрен перерыв. Мы постарались найти баланс так, чтобы ребёнок нормально ознакомился с новой технологией и при этом не успел устать или заскучать.

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

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

По запросу «сайты, созданные с Python» Google выдает множество топовых ресурсов — включая самого себя.

Профессиональная сфера разработки быстро развивается. Насколько актуальные вещи преподаете вы?

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

  • Flask — минималистичный по своей концепции фреймворк, который позволяет пятью строчками кода создать веб-версию «Нello, world!». Весь проект можно собирать как конструктор, из готовых компонентов. Простота в освоении и отсутствие лишнего — вот за что мы выбрали Flask.
  • Bootstrap — набор инструментов и заготовок, ускоряющих создание веб-страниц. Вместо того чтобы месяц углубляться в тонкости CSS и JavaScript, с Bootstrap мы просто берем шаблон и получаем отличное динамическое меню или стильную анимированную кнопку для сайта. Быстрые результаты мотивируют новичков.
  • Jinja2 — шаблонизатор, полезный при создании веб-приложений на Flask. По шаблону генерирует Python-код, который можно тут протестировать в «песочнице».
  • SQLite — база данных, реализованная в одном файле. Идеальна для первого знакомства с возможностями современных СУБД, не требует сложной установки и настройки.

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

А если ребенку не понравится Python? Получается, всё было зря?

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

В курсе мы затронем HTML, CSS и JavaScript. Если ребенку понравится это, он сможет заняться версткой сайтов и frontend-разработкой. Если приглянется SQL, на котором пишут запросы к базам данных, ему будет с чего начать учиться на аналитика. В подростковом возрасте есть время на изучение разных языков и технологий. Остается пробовать и выбирать.

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

Давайте сведём все вместе. Выпускник нашего курса Python для школьников сможет создавать:

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

А как развиваться после курса?

Главное — не останавливаться, иначе знания могут уйти в пассив и стереться из памяти. Можно перейти к взрослым курсы — у нас есть бесплатный интенсив по Python, а также программы подготовки junior- и middle-специалистов. Помимо веб-разработки c Python, можно познакомиться с близкими IT-направлениями, которые были затронуты в время курса — возможно, они вызовут больший энтузиазм.

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

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

Как записаться на курс?

Достаточно просто оставить заявку на странице. Новый поток стартует 29 ноября.

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

20 ноя 19, 16: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

Голые хипстеры и офисные битвы: что было на Dream Team

Что такое Dream Team

С первых минут на мероприятии я поняла, что никакие оды «особой атмосфере», «незабываемым эмоциям» и «командному духу» не выразят общее настроение лучше, чем одно слово. Dream Team — это кураж! 

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

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

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

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

Кстати, насчет еды: на время мероприятия участники были обеспечены перекусами, водой и, главное, кофе! Был даже обед — правда, на него отвели всего 20 минут. Может, это и к лучшему: никто не успел расслабиться и потерять соревновательный дух.

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

О чем рассказывали на лекциях

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

Иоанн Павловский о гейм-дизайне настольных игр

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

Как сделать крутую карточную игру-филлер?

Отказаться от: 

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

Лучше избегать:

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

Хорошим идеям свойственны:

  • глубокие механики,
  • нелинейный баланс,
  • неординарность.

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

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

Данила Терсков о продвижении продукта

Основа digital-стратегии:

  • определение целей, ЦА и УТП;
  • формирование сообщения;
  • создание креативной стратегии (упаковки);
  • выбор каналов продвижения;
  • медиапланирование;
  • постановка и контроль KPI.

Важно понимать истинную цель, которую вы хотите достичь. Это могут быть новые клиенты или положительное сальдо сметы.

Формируя посыл для ЦА, нужно отталкиваться от ее ключевой потребности и того, как бренд может ее удовлетворить.

Креатив должен быть не просто ярким, а с понятной пользой.

Основные каналы продвижения: SEO, Yandex + РСЯ, Google + КМС, MyTarget, таргетированная реклама в Facebook + Instagram, таргетированная реклама в VK, реклама в YouTube, тизерная реклама, CPA-сети, еmail-рассылка, товарные агрегаторы.

Основные цели продвижения — Awareness (охват аудитории), Traffic (посещения, трафик), Interaction (вовлечение), Sales (продажи), Loyalty (лояльность). У целей разные метрики, и их много:

  • Awareness. Охват (Reach, Cover) — сколько представителей ЦА имели контакт с рекламой в рамках компании заданное число раз. KPI охвата: View — количество просмотров рекламного объявления; CPM (cost per millennium) — оплата за тысячу показов рекламного объявления; CPV (cost per view) — оплата за просмотр рекламы. 
  • Traffic. Хосты (посетители) — уникальные посетители сайта. Сеансы — общее число сеансов на сайте; CPC (cost per click) — сумма, которую рекламодатель платит за один клик по его рекламе; CPV (cost per visitor) — за одного посетителя. Это не одно и то же.
  • Interaction. Время, проведенное на сайте, — средний показатель в минутах. Глубина просмотра сайта — среднее число страниц, просмотренных за один сеанс (на одного посетителя). Engagement rate — коэффициент вовлеченности аудитории в публикации контента. 
  • Sales. Orders — количество оформленных заказов. Sales — количество совершенных продаж. CPO (cost per order) — средние затраты на получение заказа. CPS (cost per sale) — средняя стоимость продажи.
  • Loyalty. Retention rate (CRR) — коэффициент удержания клиентов. CRR = ( (E – N) / S) × 100. Где: (Е) — количество клиентов на конец периода; (N) — количество новых клиентов, приобретенных за период; (S) — количество клиентов на начало периода. Churn rate — коэффициент оттока. Грубая оценка: Churn rate = Ушедшие клиенты / Общее число клиентов. 

Mention — суммарное количество упоминаний бренда на чужих площадках. Passion — среднее количество упоминаний бренда одним автором. Net Sentiments Rate — разница между позитивными и негативными упоминаниями.

Из этих этапов продвижения формируется воронка продаж:

Иван Русов о конфликтах в команде

Конфликт складывается из причины и конфликтной среды. 

Возможные причины:

  1. Неправильное распределение зон ответственности. 
  2. Непонимание правил игры.

Чтобы избежать конфликтов, правила нужно составить до начала работы: «Не флудим в рабочем чате», «Договоренности нужно фиксировать после каждой встречи» и так далее.

Ставим цели по методике SMART: Specific (конкретные), Measurable (измеримые), Achievable (достижимые), Relevant (значимые), Time bound (определенные по времени). О возможном срыве дедлайнов нужно предупреждать, о косяках — говорить.

Илья Полянский о лендингах для игр, которые помогают влюблять и продавать 

Фольклор — колыбель референсов. Вдохновиться можно русскими народными сказками или архетипами Юнга.

Нужно вызывать у пользователя яркие эмоции и приятные ассоциации! Например, вот так:

Сергей Тиджиев о работе с цветом, графикой и шрифтами

Сергей раскрыл тему цвета, графики и шрифта на примере разработанной им крутейшей книги-игры. Там вы выступаете в роли иммигранта, который переехал в другой город. Нужно адаптироваться в нем и умело выходить из сложных ситуаций — для этого есть небольшой запас денег. Так погрузилась в лекцию, что записала только это: «Хочу книгу серии „ПРИВЕТ СТРАНА“!»

Сергей Илюхин о логике презентаций

Структура презентации: заглавный слайд, бэкграунд, драма, идея, детали идеи, RTB (Reasons to believe), чего ждать.

Заглавный слайд — обложка, по которой будут судить о всей презентации. Красивые картинки — это важно. Бэкграунд — ответ на вопросы: 

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

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

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

Закончить нужно красиво и без «спасибо». Финальный слайд — забавная фраза, которая обобщает всю презентацию.

Впечатления участников

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

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

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

Как опытный IT-специалист изучал Python в GB

Константин Ложкин — Magento-разработчик, т.е. специалист, который пишет интернет-магазины на PHP-движке Magento. Уже три года как Константин живет и работает в Германии. Совсем недавно он поделился историей своего переезда и трудоустройства, а главное — подробными рекомендациями для тех, кто хотел бы работать в ЕС. 

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

— Константин, сколько вы уже занимаетесь программированием профессионально?

— Впервые коммерческую программу я написал в 2006 году, когда учился на первом курсе университета. Это было решение для автоматизации производства пенопласта. Программу внедрили и использовали на промышленном предприятии минимум пару лет. Были за время учебы и другие подработки: создание небольших сайтов, верстка. В 2010 году я окончил университет и остался работать в сфере образования. В этот период написал на PHP систему для дистанционного тестирования студентов. Ее в университете использовали до 2015 года. В этот период я также работал по совместительству в технической поддержке Яндекса.

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

Хочу порекомендовать новичкам: когда у вас уже есть базовые знания для позиции программиста, переходите к работе в команде. Это ускорит ваше обучение. Два года командной разработки дали мне в разы больше, чем все предыдущие годы кодинга в одиночку. Например, я изучил на практике Docker и Vagrant, узнал про автоматическое тестирование с помощью PHPUnit-тестов и с их помощью нашел вагон багов в чужом коде. Это технологии, которые используются только в больших проектах, — на маленьких, над которыми работаешь один, это бессмысленно. 

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

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

— Когда вы поняли, что вам нужен Python, и какие перспективы для себя увидели в этом направлении?

— До 2014 года я работал в Яндексе, в технической поддержке сервиса «Почта для домена». Там я узнал, что почти все проекты Яндекса написаны на Python и что этот язык хорошо заточен под работу со строками, поэтому идеален для крупной поисковой системы. 

Больше я тогда ничего не знал о Python, и, конечно же, заинтересовался им. Хотел переквалифицироваться из сотрудника техподдержки в Python-программиста

Обстоятельства распорядились иначе, и я погрузился в более знакомую мне сферу PHP, а затем переехал на работу в Германию. Но от идеи изучить Python не отказался, потому что понял, насколько он перспективен.

— Вы окончили вуз по специальности «системное программирование» — это хорошая теоретическая база. Дальше получили опыт PHP-разработки. Почему вы решили изучать Python на курсах, а не самостоятельно, по книгам и документации?

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

Сначала я пытался самостоятельно освоить Python по статьям в интернете, затем попробовал бесплатный образовательный видеокурс. Есть ряд ресурсов такого плана: edX, Udemy, бесплатные уроки на GeekBrains. Если пользоваться бесплатными инструментами, то получаешь, как правило, точечные знания. Такое обучение малоэффективно. Так можно стать кодером, но не программистом. 

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

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

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

— Почему вы остановили выбор на курсах GeekBrains? Насколько оправдались ожидания от учебы?

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

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

Еще один аргумент в пользу онлайн-обучения — его легче совмещать с полной занятостью на работе.

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

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

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

— В курсе по профессии «Программист Python» обучение языку разделено по уровням. На одном из них мы разрабатывали собственный мессенджер. Позже этот проект студенты продолжили доводить до ума на стажировке. А я попал в команду, которая делала другой проект, и разрабатывал backend-часть для программного HR-бота. Нужно было написать API, который отвечал бы за сохранение данных и взаимодействие всех частей бота между собой. Таких частей две: frontend-клиент и «паук», который собирает данные в интернете и передает API для обработки.

Backend я построил на основе Flask. Сейчас мы с командой вносим финальные правки, и совсем скоро проект будет внедрен реальным заказчиком. Ждать осталось совсем чуть-чуть :)

— Вы теперь можете сравнить написание backend’а на PHP и Python. В чем, на ваш взгляд, плюсы и минусы? Что бы вы предпочли делать с помощью PHP, а что — на Python? 

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

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

PHP старше, и иногда это играет с ним злую шутку, но все же он развивается: например, PHP 7 гораздо быстрее прошлых версий. Думаю, этот язык еще долго продержится в пятерке самых популярных.

Python незаменим для крупных веб-проектов, где важно быстродействие. А еще это универсальный язык, на котором можно писать что угодно, в том числе desktop-приложения. Его используют для сложных научных вычислений, построения нейросетей и даже для программирования умного дома на базе Raspberry Pi. Думаю, PHP никогда не сможет предложить так много вариантов применения.

Есть еще эстетика. И хотя плохой код можно написать на любом языке, скажу честно: код на Python намного чище и читабельнее. Скажем так, Python требует от программиста дисциплины, в то время как PHP легче «мирится» с некрасивым кодом.

— Помимо Python вы изучали в GeekBrains информационную безопасность. На каком этапе сейчас обучение? Вы собираетесь применять эти знания в разработке? Или вам интересна возможность перейти с позиции разработчика к работе программиста-безопасника?

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

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

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

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

Из автосервиса — в веб-разработку 

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

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

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

Когда выбирал высшее образование, пошел по пути наименьшего сопротивления. Смотрел на это так: «Что может быть сложного в истории? Прочитал книжку, рассказал — вот и сдал предмет».

— Куда можно пойти работать с дипломом историка?

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

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

— Как вы стали автомехаником и где учились?

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

Выучился на автомеханика на курсах ДОСААФ: там работают хорошие преподаватели и есть гараж, где дают покопаться во внутренностях автомобиля. Когда пошел на стажировку, у меня были и теоретическая база, и опыт. В итоге остался работать там, где стажировался, — в Bosch-service.

Почему так мало проработали автомехаником — всего год?

— Эта работа мне очень нравилась. Я бы не отказался и дальше этим заниматься, если бы там можно зарабатывать по-человечески. Сервисов в Кемерово много, а загрузки мало, и 40 % дня сидишь без работы.

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

Есть объективный потолок заплаты, и очень невысокий. При идеальном раскладе, если целыми днями, без перерывов и обеда, работать на какой-нибудь замене колодок, которая делается почти вдвое быстрее нормо-часа, то за месяц можно заработать 64 800 рублей. Это предел и идеальная модель, которая в жизни никогда не осуществится. А так автомеханик зарабатывает от 20 до 40 тысяч рублей, и 40 — это очень круто.

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

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

— Все началось с компьютерных игр. Раньше я довольно активно в них играл, например в RPG Lineage — эта игра привлекала социальной составляющей. И постоянно перед глазами были примеры, как люди зарабатывают на игровых серверах. 

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

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

Сервер я решил арендовать. Также нужно было привлечь разработчиков, чтобы сделать сайт и подключить базу. Цены на их работу показались мне космическими. И тогда я подумал: «А сделаю-ка я сайт самостоятельно. Надо только HTML выучить, и все будет замечательно».

Нашел интерактивные курсы HTML Academy, затем CSS освоил. Потом понял, что этого недостаточно, — чтобы сделать свой сайт, нужно еще выучить PHP. Прошел и этот курс. Попутно изучал дополнительные технологии, пытался знакомиться с JavaScript, улучшал навыки в верстке.

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

— Помогли новые знания?

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

Первая моя работа была связана с СRM — меня взяли в стартап, у которого не было ни лида, ни наставника, ни четкого бизнес-плана. Дали доступ к серверу, ТЗ и сказали «Дерзай!». Это была настоящая школа выживания — перед тобой ставят задачу, с которой ты совершенно не знаком, и приходится искать решение с помощью Google. Тем не менее я продержался полгода, несмотря на то, что зарплату они стабильно задерживали, а придраться пытались к каждой мелочи. При этом все равно я получал больше среднего дохода по области.

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

— Почему выбрали GeekBrains и рассматривали ли другие образовательные курсы?

— Я к тому времени уже работал в веб-студии, и мне нужно было получить новые знания — поучиться на системного администратора, чтобы брать дополнительные задачи и больше зарабатывать. Выбирал между несколькими курсами — у GeekBrains курс дороже, чем у некоторых конкурентов, но самый интересный по наполнению. Я показал программу знакомому сисадмину из Израиля, и он одобрил соотношение цены и качества. По JavaScript курс прошел уже накатом — мне понравилось, как в GeekBrains преподают. К тому же с таким же объемом знаний за эти деньги ничего больше не предлагалось.

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

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

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

С JavaScript эту ошибку я решил не повторять и проходил курсы планомерно, шаг за шагом, — так оказалось эффективнее и удобнее. Я, собственно, еще учусь. Продвинутый курс по JavaScript у нас закончился в начале июня, потом начался по React. Еще мне предстоит пройти бонусный курс, который мне подарили на Новый год, — Node.js. Так что буду учиться до конца лета.

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

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

— Не страдает ли семейная жизнь при таком насыщенном графике?

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

— Довольны ли вы сейчас своими доходами?

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

— Как планируете развиваться?

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

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

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

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

Кто такой iOS-разработчик

Со стороны iOS разработка может казаться закрытым клубом. Для работы обязательно нужен Mac, Apple пристально контролирует экосистему. Изнутри тоже иногда слышны противоречия — кто-то говорит, что язык Objective-C старый и неповоротливый, а кто-то, что новый язык Swift слишком сырой. 

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

В этот раз о своем опыте нам рассказали Марат Нургалиев и Борис Павлов — как они учились профессии IOS-разработчика, как проходили первые собеседования, почему получали отказы. А экспертом выступил Андрей Антропов — декан факультета iOS-разработки в GeekBrains.

В 2016 году Марат Нургалиев из Астраханской области пришел устраиваться на работу мобильным разработчиком в местную телекомпанию. Это было его первое собеседование. Он только что вернулся из армии, без практики и опыта, позабыв даже теорию, с которой и так были проблемы. Единственным опытом в мобильной разработке у Марата была дипломная работа по анализу потоков утечек информации через Android-приложения. На собеседовании его спрашивали про учебу и опыт, про ООП и прочую теорию, но пробелы в знаниях Марату скрыть не удалось. 

Тем не менее, ему не отказали, а дали практическое задание — за две недели реализовать отображение списка новостей с помощью API. И под iOS, и под Android. «Если на Android у меня был какой-то опыт, то для создания iOS версии не было даже инструмента. Среда разработки ios приложений есть только на Mac. Но через две недели я вернулся, показал, что мог на Android. С iOS пришлось выкручиваться на ходу. В итоге меня взяли. Тогда я жил в Астрахани. Меня устраивала любая работа в ИТ с зарплатой выше двадцати».

Кто такие — iOS-разработчики

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

«Для работы с iOS нужен макбук, потому что только на нем есть необходимая среда разработки Xcode. Она бесплатна и распространяется через магазин приложений AppStore. Для установки надо иметь своей Apple ID и больше ничего. В Xcode можно разработать приложения для чего угодно — телефона, планшета, часов. Встроенный симулятор и редактор есть для всего», — говорит Андрей Антропов, декан факультета iOS разработки в GeekBrains.

«Но среду разработки можно поставить и на Windows, если использовать „Хакинтош”. Это рабочий, но окольный вариант — никто из серьезных разработчиков подобным не занимается. Начинающие покупают старенький Макбук. А опытные обычно могут себе позволить последнюю модель».

Языки — Swift или Objective-C

Почти вся iOS-разработка ведется при помощи языка программирования Swift. Он появился пять лет назад и сейчас постепенно вытесняет старый язык Objective-C, который Apple использовала во всех своих приложениях больше 30 лет

«На Objective-C накоплена огромная база кода, поэтому до сих пор требуются разработчики на оба языка, в зависимости от компании, от ее задач и приложений. Приложения, написанные много лет назад, основаны на Objective-C. А все новые проекты по умолчанию разрабатываются на Swift. Сейчас Apple очень много делает для того, чтобы вести одновременную разработку под телефон, планшет, часы и Макбук было максимально удобно. Один и тот же код может быть скомпилирован и запущен везде. Раньше этого не было. Под iOS разрабатывали на Swift, под MacOS использовали Objective-C».

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

«Objective-C достаточно старый язык — ровесник языка С++. Во времена, когда его разрабатывали, требования к языкам были совсем другими. Когда появился Swift, в нем было много багов, функциональность была ограниченной, синтаксис был шероховатым. А на Objective-C у людей была набита рука. Он много лет совершенствовался, все ошибки там были исправлены. Но теперь, я думаю, Swift не уступает Objective-C. Хотя даже Apple в своих проектах до сих пор использует оба. Языки во многом взаимозаменяемые и взаимно дополняемые. Структуры и объекты одного языка можно превратить в объекты и структуры другого языка. Хорошо бы знать оба варианта, но для новичков Objective-C часто кажется пугающим и непонятным».

Обучение IOS-разработке

«На моей первой работе меня обучал начальник, помогал в реализации и настройке проекта», — рассказывает Марат, —  «Но работать по Android и по iOS одновременно трудно. Нужно время для перестройки, переключения с проекта на проект, с языка на язык. В итоге я решил, что нужно выбрать одно направление и изучать его. Меня подкупили интерфейс Xcode и простой синтаксис Swift».

Марат поступил на факультет iOS-разработки в GeekBrains. Первое время было очень легко, потому что многие вещи он знал по опыту работы. Годовой курс разбит на четыре четверти. По словам Андрея, в первой дается только самая база: «Основа языка Swift, знание базовых фреймворков, сетевое взаимодействие, хранение данных, жизненный цикл приложения, контроллера, базовые архитектуры, основные библиотеки, которые все используют, многопоточность и параллелизм в приложениях».

Во второй четверти добавляется Objective-C. Проводится курс по архитектуре, базовым паттернам программирования. В третьей четверти учат правильному стилю написания кода. Рассказывается, что такое фабрика, как правильно писать тесты, формировать проекты, что такое Git-Flow, Continuous Integration через Fast Lane. Четвертая и завершающая четверть посвящена командной работе, практическим заданиям и стажировкам.

«Первая четверть прошла легко», — говорит Марат, — «но потом началось изучение программирования на Objective-C, изучение паттернов проектирования, принципов Solid, Git-Flow, архитектуры проекта, Unit и UI тестирования приложений, настройка кастомной анимации — и тогда мне стало интересно учиться». 

«У меня в GeekBrains все началось не супер гладко», — рассказывает Борис Павлов, и его путь к iOS-разработке в целом был не самым прямым. Парня воспитывала бабушка. Она была архитектором, математиком и дизайнером и привила Борису любовь к проектированию, научила чертить от руки и рисовать. Его дядя был сисадмином и заинтересовал племянника компьютерами. 

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

Он начал изучать C++ с преподавателем в Иркутском Институте Солнечно-Земной Физики. Затем заинтересовался геймдевом и попробовал перейти на C#. И, наконец, как и Марата, его подкупил язык Swift. 

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

Поэтому после вводного курса Борис поступил не на годовое обучение, а на короткий трехмесячный курс, где преподают самые основы профессии. «Там мне попались очень хорошие преподаватели, и объясняли все достаточно понятно».

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

Вакансии сюда

Вы можете посмотреть самые свежие вакансии для iOS-разработчиков и подписаться на новые.

Работа

Но ни у Марата, ни у Бориса трудоустройство не прошло так просто. 

«Некоторые крупные фирмы давно разработали iOS приложения на Objective-C, и  продолжают поддерживать старую кодовую базу. К сожалению, у меня нет весомого аргумента, чтобы заставить их использовать исключительно Swift. Особенно тех, кто пользуется правилом „не трогай то, что работает“», — говорит Марат, — «Направлению Objective-C в Geekbrains уделяется мало внимания. Оно несет скорее ознакомительный характер. Но каждая компания, в которую я собеседовался, спрашивала про Objective-C. А так как учеба ориентирована на Swift, как и моя прошлая работа, то на собеседованиях я получал отказы».

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

Но все оказалось не так радужно. Даже от джуниора IOS-разработки простят того, чего он знать не может. Я пока не нашел работу. Работаю за „спасибо“, набираюсь опыта. Понимаю, что это не то, чего я хотел, но мне интересно, и это движет мной. Я хочу получать знания».

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

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

Зарплаты

Зарплата iOS разработчика, как и любая другая зависит от вопроса «Москва или Россия». Но из-за специфики индустрии — много удаленной работы, возможности для релокации и работа не на региональном рынке — цифры все чаще приближаются друг к другу.

«Джуниор совсем низко уровня часто работает бесплатно или за символические деньги — 20–30 тысяч рублей. Если же джуниор целенаправленно взят на свою позицию, то получит от 50 до 80 тысяч. Мидлы получают от 100 до 150, и иногда даже до 200. Синьоры в IOS-разработке меньше 200 не получают. Я думаю, их зарплата в районе 200–300. А у тимлидов, соответственно, за 300».

Зарплаты сюда

По данным калькулятора зарплат «Моего круга» средняя зарплата iOS-разработчика составляет немногим меньше 140 000 рублей.

Собеседования

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

Мы созвонились. Со мной общалась приятная девушка. Но никаких вопросов про знание языка не задавали — только разные логические задачки, например, „Время 15:15 сколько градусов между часовой и минутной стрелкой?“ или „Столб 10 метров, улитка днем ползет 3 метра вверх, ночью спускается на 1 метр. Через сколько дней она доползет до верха?“, и еще парочка подобных. 

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

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

Андрей рассказывает, что «первая вещь, которую у всех спрашивают на собеседовании — это жизненный цикл контроллера. Очень любят спрашивать какой-нибудь простенький паттерн программирования. Обязательно спросят про опыт использования популярных библиотек. Точно будет вопрос про отличия в Swift Value Types от Reference Types, про Automatic Reference Counting и управление памятью. Могут спросить, как реализовывали хранение данных в приложениях, и реализовывали ли сетевые запросы. Спросят про основы REST и JSON. Специфические вещи и тонкости у джуниора не будут спрашивать. По крайней мере я не спрашиваю».

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

Марату повезло больше. Сейчас он работает в транспортной компании и один отвечает за iOS направление, продолжая учебу на факультете. «Поскольку за iOS отвечаю я один, мой труд оценивается только умением реализовать поставленные передо мной задачи [а не знанием теории]».

Сообщество

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

«Мировое комьюнити обычно общается через твиттер. Люди ведут свои блоги, записывают ролики на Youtube, зовут друг друга на подкасты. Однажды у меня появился вопрос по презентации, где выступал тимлид HQTrivia. Это американская викторина, в которую играет одновременно несколько миллионов человек. Я ему написал в твиттере, он мне ответил, мы пообщались, я поблагодарил. Комьюнити чрезвычайно дружелюбные, и это здорово».

Литература

https://docs.google.com/document/d/1-cMseCx1vBwVA8xv4uccpE_vkqvhPG_1Wt9gLiLWAGQ/edit#

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

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

Методологии разработки ПО: бережливая разработка

В предыдущем посте мы рассказали о гибких методологиях разработки — Scrum и экстремальном программировании (если вы еще не читали о них — сделайте это!) Но на этом список Agile-методологий не заканчивается.

Бережливое производство подразумевает сокращение всех возможных потерь, экономичный и разумный подход к производственным ресурсам. Речь не только о потерях времени или растрате финансов и труда, но и нереализованном творческом потенциале сотрудников. Впервые эту систему использовала компания Toyota, а затем ее внедрили и многие другие производства. 

Для разработки ПО эту методологию адаптировали в 2003 году программисты Мэри и Том Поппендик. Они написали книгу «Бережливое производство программного обеспечения» («Lean Software Development: An Agile Toolkit»), в которой изложили принципы и практики бережливой разработки.

Принципов всего семь:

  1. Ликвидировать потери.
  2. Встраивать качество.
  3. Создавать знание.
  4. Откладывать необратимые решения.
  5. Доставлять быстро.
  6. Уважать людей.
  7. Оптимизировать целое.

Рассмотрим их по порядку. 

Исключайте потери

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

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

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

Любую функциональность, которая не требуется пользователю, можно отнести к потерям, как и задержки в выполнении работы.

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

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

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

Как все гибкие методологии, бережливая разработка внимательно относится к потребностям и пожеланиям пользователей, поэтому сами по себе переделки не всегда можно записать в потери. По данным Мэри и Тома Поппендик, от 30 до 50 % изначальных требований к продукту к концу разработки обычно меняются. Но бывают и иные ситуации.

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

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

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

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

Разрабатывайте через тестирование

Для чего проводится тестирование программного кода?

Большинство разработчиков ответят: чтобы выявить ошибки и исправить их! 

И ошибутся.

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

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

Но есть и альтернативный взгляд: тестирование должно предотвращать дефекты в коде.

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

Для этого необходима дисциплина в коллективе и самодисциплина каждого члена команды — по принципам профессионализма в духе Agile. И тестирование следует интегрировать прямо в процесс разработки. Авторы методологии рекомендуют разработку через тестирование — Test driven development, или TDD. Автоматизированный тестовый модуль создается раньше участка кода, а разработка при этом разбивается на множество мелких фрагментов — и для каждого предусматривается собственный тест. Когда фрагмент создан, тестовый модуль запускается и проверяет, насколько результат работы соответствует ожидаемому. Такое тестирование выполняется максимально часто — каждый час или около того, — чтобы убедиться, что с момента прошлой проверки не появились ошибки. Если баг обнаруживается, код переделывают «по горячим следам», пока все не заработает идеально. В конце дня тестовая нагрузка запускается еще раз, а еженедельно выполняются более сложные комплексные тесты. Такая организация работы позволяет практически полностью исключить ошибки в программном коде. И финальная проверка при TDD проходит существенно быстрее.

Создавайте знание

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

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

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

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

Откладывайте необратимые решения

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

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

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

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

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

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

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

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

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

Доставляйте быстро

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

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

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

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

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

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

Уважайте сотрудников

Программист и IT-бизнесмен Джоэл Спольски в 1991 году, едва закончив колледж, устроился в Microsoft, где ему поручили разработать стратегию языка макросов на базе Basic для Excel. Он изучил требования и пожелания пользователей, но, составив спецификации, с удивлением обнаружил, что команда не спешит их выполнять. «Возможно, у них есть интересные мысли, и я должен это выяснить», — решил Спольски. Причины оказались прозаичнее: старшие и более опытные коллеги просто не хотели выслушивать мнение новичка. Один из руководителей проекта Excel, водивший дружбу с самим Биллом Гейтсом, даже организовывал совещания, на которых жаловался, что Спольски «вносит путаницу в создание стратегии макросов». 

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

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

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

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

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

Оптимизируйте целое

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

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

В этом может помочь диагностический инструмент — карта потока создания ценности (value stream map). Это график работ, который начинается с получения заказа (технического задания на разработку программы) и заканчивается передачей пользователю готового решения. Таким образом, карта начинается с заказчика и заканчивается на нем, а между этими двумя точками располагаются в порядке выполнения все технологические этапы разработки. Для каждого указывается среднее время исполнения. 

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

Рассмотрим ситуацию, когда заказчику требуется оперативно внести изменения в функциональность программы. Составим карту потока создания ценности:

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

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

Запишем продолжительность каждого этапа, сразу отмечая время, потраченное непосредственно на создание ценности (в первой строчке) и на простои и ожидание (в нижней строке). Посчитаем: всего на создание ценности ушло 160 минут (причем большая часть — на разработку и тестирование). А вот потери превысили это время вдвое: 325 минут! На весь цикл потребовалось 8 часов — полный рабочий день, из которого лишь 2 часа 40 минут было затрачено на реальную работу. 

В данном примере очевидно, что можно исключить из цепочки диспетчера, а обязанности по санкционированию передать ведущему разработчику. Это сэкономит в среднем два часа и повысит эффективность почти на 45 %.

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

Инструментарий бережливого разработчика

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

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

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

Еще есть специальная техника бережливости, нацеленная на обустройство рабочего пространства сотрудников. Это «Пять S» (5S) — по первым буквам слов sort (сортировать), systematize (систематизировать), shine (чистить), standardize (стандартизировать) и sustain (поддерживать). Поскольку методология бережливого производства возникла в Японии, там аналогичные понятия обозначаются пятью японскими словами, которые тоже начинаются звуком «с».

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

  1. Сортировать — проведите инспекцию своего стола и жесткого диска. Удалите все ненужное: старые версии программы, неиспользуемый софт, устаревшие отчеты и документы (при необходимости можно создать резервную копию). 
  2. Систематизировать — разложите все «по полочкам», наведите порядок. Создайте удобную и логично устроенную структуру папок, которая позволит быстро находить нужные файлы. Ярлыки часто используемых программ и документов следует разместить на рабочем столе или закрепить в панели инструментов, редко используемые — переместить в меню «Пуск» или соответствующие подпапки. Придерживайтесь одной системы на всех компьютерах. Рабочая среда должна быть такой, чтобы каждый специалист из команды мог найти в ней необходимое, войдя в систему с любого компьютера. 
  3. Чистить — мусор надо отправлять в корзину, будь то бумажный стакан из-под кофе или временный файл с черновиком документа. Наброски алгоритмов и кода, сделанные на клочках бумаги, стоит перенести в файлы, а бумагу выбросить или подшить в папку (если нужно). И протереть монитор от пыли!
  4. Стандартизировать — обеспечьте единую конфигурацию программных средств на всех рабочих станциях. У команды разработчиков, трудящихся над одним проектом, должна быть установлена одна версия среды разработки и программных средств — чтобы не было проблем с совместимостью. На всех машинах должен быть идентичный набор программного обеспечения.
  5. Поддерживать. Навели порядок — соблюдайте его. 

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


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

Изучение Unity в GU, лучшие assets и паблики — мнение декана

Декан факультета разработки игр Илья Афанасьев отвечает на вопросы о движке, его преподавании в GU и о себе.

— Илья, почему ты выбрал Unity, а не Unreal или еще что-то? Зачем начинать именно с этого движка?

— Начинал я как раз с Unreal Engine, но это было давно — тогда он был известен как UDK (Unreal Development Kit). Новичку работать с ним было очень сложно: на поверхности все просто, но, заглянув «под капот», просто теряешься. 

Среда работала недостаточно стабильно, особенно в руках людей, которые только начали ее изучать. Скрипты приходилось компилировать в сторонних программах. Даже сейчас Unreal известен как мощный, но очень громоздкий инструмент, который с лету не освоишь. Да, там есть Blueprint (раньше Kismet), но досконально понять, как это работает, сложно. Например, чтобы максимально эффективно использовать blueprints, нужно понимать их природу — а значит, неплохо программировать. Особенность движка Unreal в том, что он удобен, пока вы не особо заморачиваетесь, но становится бичом для тех, кто еще не понимает природу ООП и основ программирования.

Если у человека нет опыта разработки, Unity3D — входной билет в геймдев. С этим движком легко программировать и творить свои миры: не осилит его только ленивый. По графике и разнообразию инструментов Unreal впереди, но, я вас уверяю, в умелых руках Unity способен на потрясающие штуки, такие как Unity Adam или Book of the Dead. А без умения и на Unreal далеко не уедешь.

— Что происходит с движком сейчас и как он менялся в последние несколько лет? 

— Он активно перестраивается: многие технологии буквально пишутся заново. Unity Tech реализовали возможность создания шейдеров через графический интерфейс. Раньше для этого приходилось устанавливать сторонние платные дополнения. 

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

Также Unity Tech перестроили многопользовательскую систему на базе технологии ECS. Это позволит разработчикам оптимизировать сетевые приложения без «костылей».

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

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

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

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

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

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

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

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

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

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

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

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

— Для каких задач ты сам используешь Unity?

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

Сначала я занимался фрилансом, потом объединился с коллегами — мы создали Game Line Studio и начали разрабатывать приложения на заказ: в основном AR и VR. 

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

Сюжет нашей игры прост: три героя сражаются со злом, которое вторглось в этот мир из подземелий древнего города. Герои отличаются по цвету (красный, синий, зеленый — RGB-отряд). Каждый атакует только противников своего цвета. Игроку нужно правильно расставить персонажей, чтобы они справились с очередной волной чудовищ. Чтобы перемещать героев, их нужно вращать по часовой стрелке или против нее.

Мы выбрали не очень простой в исполнении стиль 3D-графики, и у нас возникли большие трудности с контентом, но сейчас мы близки к финишной прямой. Уверен, игра найдет своего издателя и выйдет на рынок.

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

— Самый крутой наш проект такого плана — тренажер для Международного центра подготовки спасателей. К сожалению, детали раскрыть не могу из-за договора о неразглашении (non-disclosure agreement). Но это был невероятно интересный новый опыт. Проект очень амбициозный: если у заказчика все получится, он может произвести революцию в своей области.

— А как тебе реализация AR и VR в Unity? Насколько это удобно?

— Unity использует пакеты инструментов (SDK) от производителей шлемов виртуальной реальности (HTC, Oculus) и устройств дополненной реальности. С такими же пакетами работают и другие движки, поддерживающие AR/VR. Но я заметил забавную вещь. 

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

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

— Движок называется Unity 3D и, естественно, он ориентирован в первую очередь на трехмерные проекты. Но его возможности в 2D перекрывают абсолютное большинство вещей, которые тебе когда-либо понадобятся. Специализированные движки могут быть глубже оптимизированы под 2D, однако им не обойти Unity по разнообразию и удобству инструментов.

Чтобы понять, насколько красивыми могут быть двухмерные игры на Unity, достаточно взглянуть на Ori and the Blind Forest, Forgotten Anne или Children of Morta. The Heart Stone демонстрирует удивительную игру теней, которая может заставить игрока думать, что он находится в полном 3D. Отчасти это и правда так (в Unity все находится в 3D-пространстве, даже 2D-объекты), но на других движках ты не создашь подобных эффектов с такой легкостью.

Если ты знаешь Unity и хочешь быстро сделать 2D-игру с качественной графикой, смысла учить отдельный движок нет.

— Порекомендуй лучшие Unity Assets (расширения и наборы ресурсов) для разных задач, пожалуйста. Твой «топ-лист».

— Среди лучших платных ассетов юнити я бы отметил:

  1. Gaia — генератор ландшафтов.
  2. Cascade — генератор рек, озер и водопадов.
  3. Ассеты серии Obi от Virtual Method — симуляторы тканей, воды, веревок.
  4. Winter Forest Environment — набор фотограмметрических моделей окружения.
  5. Ассеты для Unity от kripto289 — крутые наборы эффектов.
  6. Наборы от Polygon Blacksmith — прикольные низкополигональные модельки.
  7. Ассеты от Manufactura K4 — убойные наборы окружения для игр с видом сверху.
  8. Mesh Baker — инструмент оптимизации 3D-сцен.

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

Лучшие бесплатные Assets для Unity:

  1. Hand Painted Forest Environment Free Sample — отличный набор рисованных лесных текстур.
  2. Ассеты от Polygon Blacksmith — среди них есть несколько бесплатных.
  3. Palace of Orinthalian — неплохой набор с домиком на болоте.
  4. Unity Recorder — позволяет записывать видео игрового процесса в Unity.
  5. Zenject Dependency Injection — инструмент (фреймворк) для управления зависимостями в Unity-проекте.
  6. UniRx — реактивное расширение для реализации асинхронных и многопоточных вычислений.
  7. Unity Anima2D — официальный плагин с открытым кодом (C#) для движка версии 5.x и выше. Упрощает создание и редактирование 2D-анимации, в том числе за счет привязки спрайтов к скелету («костной анимации»).
  8. Free Asset — 2D Handcrafted Art — пакет двухмерных спрайтов окружения.
  9. Free Rocks — набор из четырех камней и одной скалы для создания окружения.
  10. Mega Fantasy Props Pack — набор объектов для средневекового игрового окружения.

Также советую обратить внимание на бесплатные ассеты для Unity 3d и не только от Unity Technologies: они очень крутые и заслуживают внимания. Лучше скачать все, что у них есть, а затем пробовать и разбираться.

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

— Насколько легко или трудно создавать и продавать свои наборы ресурсов для Unity? Если эта тема тебе знакома и интересна.

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

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

— Какие проекты делают студенты факультета разработки игр в GeekUniversity?

— Один из проектов, которые «выстрелили», — коммерческий продукт для застройщиков от команды Project X. Приложение позволяет в виртуальной либо смешанной реальности прогуливаться по земельным участкам, чтобы планировать будущее расположение дома и объектов. Ребята уже нашли инвестора и начали восполнять свои затраты на обучение. Кстати, эта команда набирает студентов на подработку.

Игровые проекты — очень разноплановые. Здесь и уникальный пошаговый 2D-платформер, и железнодорожный survival-action с элементами экономической стратегии. Обе вещи — в постапокалиптическом антураже.

Атака на поезд в игре The Last Hope от команды Limerence Games

Также есть оригинальный tower defence про котиков и фэнтезийный roguelike, где надо вырезать орды нечисти и прокачивать свою крепость.

 

Арт врага из «рогалика» Tomorrow’s Hero от команды Brave Team

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

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

— Ты рассказываешь как человек, вовлеченный во все это. Как строится твое взаимодействие со студентами?

— Во время командной разработки студентов поддерживают сразу три преподавателя: Роман Муратов помогает с code review и архитектурой проекта, гейм-дизайнер подсказывает, как сделать игру интересной, а я выступаю в роли project manager’а и слежу, чтобы получился минимально жизнеспособный продукт, который можно показать инвестору. Еще я рассказываю, какие фичи стоит и не стоит делать, что можно и нельзя говорить инвестору, как правильно построить презентацию для лиц, принимающих решение.

— Игры, которые ты перечислил, все однопользовательские. Но в учебной программе есть и мультиплеер.

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

— Что еще губит игровые проекты?

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

Пожалуй, 3D-графика — самое страшное, что может случиться с проектом. Когда наша студия взялась за трехмерную игру, мы рассчитывали на самый аскетичный набор контента: вид локации сверху и персонажи — всё. В игре нельзя перемещаться по уровню, исследовать его и произвольно двигать камеру. Тем не менее тащить этот проект нелегко, потому что мы не можем делать контент. В команде шесть художников, но все «тридешники» разбежались. Полный цикл создания одной 3D-модели, включая работу аниматоров, стоит около 150 000 ₽. И все же мы преодолеваем трудности — совсем чуть-чуть и доведем игру до релиза.

Кстати, по итогам наших проб и ошибок я скоро опубликую на «Пикабу» статью: почему не стоит делать 3D-игру, если у вас нет лишнего миллиона в кармане.

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

— Какие YouTube-каналы и ленты в соцсетях стоит отслеживать изучающим движок Unity?

— Из YouTube советую:

  1. Nevosoft
  2. DevGAMM
  3. Официальный канал Unity
  4. Sebastian Lague
  5. Brackeys 
  6. Unity3D College
  7. Школа разработки игр

Из групп «ВКонтакте»:

  1. DTF
  2. Игромания
  3. Unity User Group
  4. Unity3D & CG / Unity 3D

А еще на «Пикабу» есть «Лига разработчиков видеоигр» — на их сообщения тоже стоит подписаться.

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

— Спасибо! Последний вопрос, как всегда, к читателям. Что еще вы хотели бы узнать по теме? И есть ли у вас планы делать свою игру на Unity? 

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

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

31 июл 19, 17:12
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0
Темы с 1 по 10 | всего: 30

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

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

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

Люди

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