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

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

Быстрый старт с 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

15 интересных каналов Telegram для программистов

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

Tproger

Количество подписчиков: 60000+.

Частота обновлений: 2–3 записи в день.

Тематика: новости, статьи, рейтинги, обсуждения.

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

GeekBrains

Количество подписчиков: 3 200 +.

Частота обновления: 1–5 записей в день.

Тематика: новости, статьи.

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

Руки

Количество подписчиков: 2900+.

Частота обновлений: 1 запись в день.

Тематика: IT-новости.

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

TechSparks

Количество подписчиков: 37800+.

Частота обновлений: 2–3 записи в день.

Тематика: IT-новости.

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

Front End Dev

Количество подписчиков: 20200+.

Частота обновлений: 2–5 записей в день.

Тематика: объявления о вакансиях, статьи по фронтенду.

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

UniLecs

Количество подписчиков: 19100+.

Частота обновлений: 1–2 записи в день.

Тематика: задачи по программированию, статьи и лекции по Computer Science.

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

TechRocks

Количество подписчиков: 16300+.

Частота обновлений: 1–3 записи в день.

Тематика: статьи и новости про IT.

95% записей данного канала — ссылки на статьи портала techrocks.ru с кратким описанием. Подойдёт тем, кому не нужен специализированный канал по своему языку или направлению. Здесь можно найти и общие новости, и конкретные кейсы: например, по использованию Python в VS Code или приёмам CSS при оформлении сайта.

Machine Learning World

Количество подписчиков: 6700+.

Частота обновлений: 1–2 записи в день.

Тематика: новости ИИ.

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

Библиотека программиста

Количество подписчиков: 69600+.

Частота обновлений: 1–4 записи в день.

Тематика: статьи и обзоры книг.

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

StartAndroid

Количество подписчиков: 7900+.

Частота обновлений: 1 запись в день.

Тематика: всё про Android-разработку.

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

Microsoft Developer Community

Количество подписчиков: 3800+.

Частота обновлений: 1 запись в день.

Тематика: всё про разработку под и от Microsoft.

Здесь авторы ежедневно выкатывают порцию свежих новостей о релизах каких-нибудь продуктов, анонсах крупных конференций или официальные обзоры средств разработки Microsoft.

iOS dev

Количество подписчиков: 6200+.

Частота обновлений: 1–3 записи в день.

Тематика: всё об iOS-разработке.

Завершаем список каналов про платформы «яблочным» сообществом iOS dev. Здесь собрано много информации по прикладной части разработки — например, обзоры возможностей кнопок и ссылок. Есть и сильное новостное направление: анонсы и ссылки на видео с конференций, релизы продуктов и другие статьи.

Мой круг

Количество подписчиков: 4000+.

Частота обновлений: 2–5 записей в час.

Тематика: вакансии и HR-статьи.

Портал «Мой круг» оперативно сообщает здесь о свежих вакансиях в IT-индустрии и даёт советы, как быстро и успешно найти работу. При помощи чат-бота можно установить фильтр и видеть только сообщения из интересных вам рубрик.

Remote IT

Количество подписчиков: 17900+.

Частота обновлений: 1–5 записей в день.

Тематика: вакансии.

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

GitHub Repos

Количество подписчиков: 4800+.

Частота обновления: 2–5 записей в день.

Тематика: ссылки на исходники.

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

На десерт — несколько полезных чатов:

DBA RU

Количество участников: 1700+.

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

ГОРИ

Количество участников: 2000+.

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

Big Data Ru

Количество участников: 3800+.

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

Web Structure

Количество участников: 4000+.

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

Coding RU

Количество участников: 1 300 +.

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

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

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

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

«Шифропанки: свобода и будущее Интернета»

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

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

Кто это?

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

В качестве аргумента в защиту такого подхода Хьюз приводил пример: «Когда вы покупаете журнал в магазине, продавец не спрашивает ваше имя, и не обязан говорить своё. Но на ваших отношениях это никак не сказывается, ведь предметами интереса являются товар и плата за него». Если личная информация будет открыта, это не облегчает операции. Зато значительно возрастёт риск использования информации против вас со стороны тех, кто имеет доступ к разговору.

Идея конфиденциальности быстро находила единомышленников, уже через 2 года после основания клуба участников было более 700, через 5 – число достигло 5 тысяч. Название Шифропанк (Cypherpunk) предложила один из первых участников группы, писатель и хакер Джуд Милон. Здесь заключена игра слов cipher, punk и художественного направления в литературе и кинематографии cyberpunk.

Что проповедуют шифропанки?

В 1993 году Эрик Хьюз, один из основателей направления, выпустил целый манифест, где в нескольких абзацах объясняет идею необходимости конфиденциальности в сети. Но сначала делается ремарка: конфиденциальность – не секретность. Конфиденциальность — возможность для человека выбирать, что он открывает о себе миру. GBA7908 Секретность — желание оградить информацию от абсолютно всех. Секретность в корне противоречит смыслу интернета, но на конфиденциальность люди должны иметь право.

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

Что плохого в конфиденциальности?

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

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

Это вызвало множество судебных тяжб в 90-х годах. Большинство из них было связано с книгами по криптографии, так как они напрямую попадали под действие закона о запрете экспорта. Одна из книг, «Прикладная криптография» Брюса Шнайера, в итоге стала катализатором окончательной отмены закона.

Есть ли среди шифропанков известные последователи?

Учитывая тему и стремления, список известных деятелей-шифропанков огромный. Среди них есть известные политические деятели США, хакеры, простые разработчики. Cтоит упомянуть о создателе браузера Tor Джейкобе Апельбауме, разработчике BitTorrent Брэме Коэне, а также о Нике Сабо, одном из пионеров криптовалюты и умных контрактов. В эту же категорию можно отнести и Павла Дурова. Хотя он никогда публично о поддержке общества не сообщал, его деятельность, связанная с Telegram, косвенно об этом говорит. GBA8807

Однако, пожалуй, самым известным шифропанком современности является Джулиан Ассанж, чья деятельность значительно шире простой ретрансляции анонимно полученной информации.

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

В чём ценность общества шифропанков?

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

Идея повышения уровня конфиденциальности в сети звучит тем громче, чем больше данных и денег становится электронными. К примеру, в 2015 году ежесекундно регистрировалось 35 случаев нарушений безопасности в сети, что эквивалентно более чем 550 миллионам случаев за год. В 64% случаев — это попытки кражи личной информации, которая, в первую очередь, используется для получения финансовой выгоды. GBA1973 При этом в 52% случаев, деньги, украденные кибермошенниками, не возвращаются к владельцам, несмотря на существующие требования к банкам и операциям. Чем сложнее мошенникам получить доступ к личной информации, тем меньше угроза противоправных действий с их стороны. 

Если всё так хорошо, какие аргументы у критиков?

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

Что дальше?

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

Кстати, название этого поста — это еще и название известной книги Джулиана Ассанжа и соавторов. Если тема вас заинтересовала, советую обратить внимание.

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

P.S. Загадочные комбинации символов в статье выше — это не странности редактора, это дополнительные ключи для нашей игры «Дешифратор», в которой вы можете выиграть множество разных призов, в том числе бесплатное обучение на факультетах Geek University! Чтобы начать игру, пишите "geekbrains" в комментариях к посту.

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

19 ноя 19, 10:02
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

Бесплатное обучение тестировщиков ПО

До Нового года осталось меньше двух месяцев, и вы наверняка уже строите какие-нибудь планы на 2020-ый. Быть может, в эти планы входит «освоить профессию тестировщика ПО»? В таком случае можно начать воплощать их в жизнь уже в самое ближайшее время. Мы открываем набор на бесплатный пятимесячный курс тестировщиков ПО, по итогам которого вы можете попасть на стажировку в Geekbrains и Mail.ru Group.

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

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

Январь. Тестирование ПО, уровень 1

  • Основные понятия в тестировании
  • Место тестирования в процессе разработки ПО
  • Разработка тест-кейсов
  • Классы эквивалентности и граничные условия. Планирование и работа с требованиями
  • Работа с багтрекером
  • Регрессионное тестирование
  • Организация процесса тестирования
  • Тестирование пользовательского интерфейса

Февраль. Тестирование ПО, уровень 2

  • Тест-анализ. Исследование ПО
  • Доменное тестирование и комбинации параметров
  • Тестовая комбинаторика
  • Тестирование состояний и переходов
  • Тест-анализ на основе бизнес-логики
  • Тест-анализ на основе рисков (предугадывание ошибок)
  • Стратегия тестирования
  • Оценка эффективности тестов

Март. Введение в автоматизацию тестирования

  • Введение в автоматизированное тестирование
  • Стратегия автоматизированного тестирования. Практическое создание тестов при помощи Autoit.
  • Виды автоматизированного тестирования
  • Проект Selenium и его составляющие.
  • Автоматизированное нагрузочное тестирование на примере Apache Jmeter
  • Автоматизированное мобильное тестирование
  • Автоматизация процесса тестирования
  • Работа с требованиями и постановками задач

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

Зарегистрироваться на первый отборочный этап можно до 17 ноября на странице курса. Подробные правила программы можно посмотреть здесь. Желаем успехов!

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

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

Как выйти из отпуска, чтобы не было мучительно больно

Отпуск — сам по себе стресс. По данным опросов, 54 % россиян тревожатся и при планировании отдыха, и во время него. На стресс-депрессию после отпуска жалуется четверть респондентов, но есть причины считать, что это искаженные данные. Скажем, после новогодних каникул хандрят уже 70 %. Наконец, именно из-за стресса люди уходят в отпуск.

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

Почему возникает постотпускной синдром

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

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

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

Как планировать отпуск и выходить из него

Разбейте отпуск на несколько частей

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

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

Отдыхайте правильно

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

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

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

По поводу алкоголя и так все понятно. Интоксикация еще никого не делала здоровее.

Оставьте несколько дней для акклиматизации

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

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

Выходите из отпуска в середине недели

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

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

Входите в работу постепенно

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

Оставьте место для маленьких удовольствий

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

Как провести первый рабочий день после отпуска

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

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

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

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

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

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

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

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

Ошибки начинающего фрилансера

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

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

 Не брать предоплату

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

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

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

Работать «за еду»

Работать за символическую плату есть смысл, только если вы совсем новичок в профессии и вам нужен хоть какой-то опыт. Если это не ваш случай, то не стоит совершать распространенную ошибку и потворствовать заказчикам с запросами вроде «Напишите текст на тему „Математическая сингулярность“ на 10 000 знаков срочно, вот вам 500 ключевых слов. Плачу 10 копеек за тысячу знаков».

Вариант — работа «за имя» или «по дружбе». Кто-то с удовольствием сделает своему другу сайт за пару банок пива, а другой согласится работать бесплатно только на компанию не ниже Apple.

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

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

Скромничать

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

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

Работать без договора

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

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

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

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

Делить шкуру неубитого медведя

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

Лайфхак: заведите отдельный кошелек или карту и складывайте туда все предоплаты. Часто есть риск, что эти деньги придется возвращать, так что лучше их не трогать до окончания проекта.

Не планировать рабочий день

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

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

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

Лайфхак: задавайте себе вопросы. Буквально на каждое действие: зачем я это сейчас делаю? Что мне это даст? Чем мне хочется заняться? Как я могу оптимизировать свой день?

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

Врать и оправдываться

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

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

Лайфхак: правда, попробуйте быть с заказчиками честным. Это сэкономит много сил и времени, вот увидите.

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

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

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

Как написать говорящую программу на Python

Озвучиваем системное время и любой текст в Windows и Linux. Используем pytts3, espeak, RHVoice, gTTS, Speech dispatcher. 

Синтез речи может пригодиться вам в работе над мобильным помощником, умным домом на Raspberry Pi, искусственным интеллектом, игрой, системой уведомлений и звуковым интерфейсом. Голосовые сообщения донесут информацию до пользователя, которому некогда читать текст. Кроме того, если программа умеет озвучивать свой интерфейс, она доступна незрячим и слабовидящим.  Есть системы управления компьютером без опоры на зрение. Одна из самых популярных — NVDA (NonVisual Desktop Access) — написана на Python с добавлением C++.

Давайте посмотрим, как использовать text-to-speech (TTS) в Python и подключать синтезаторы голоса к вашей программе. Эту статью я хотела назвать «Говорящая консоль», потому что мы будем писать консольное приложение для Windows, Linux, а потенциально — и MacOS. Потом решила выбрать более общее название, ведь от наличия GUI суть не меняется. На всякий случай поясню: консоль в данном случае — терминал Linux или знакомая пользователям Windows командная строка.

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

Готовим поляну

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

Чтобы компьютер заговорил, нужны: 

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

В Windows есть штатный речевой интерфейс Microsoft Speech API (SAPI). Голоса к нему выпускают, помимо Microsoft, сторонние производители: Nuance Communications, Loquendo, Acapela Group, IVONA Software. 

Есть и свободные кроссплатформенные голосовые движки: 

  • RHVoice от Ольги Яковлевой  — имеет четыре голоса для русского языка (один  мужской и три женских), а также поддерживает татарский, украинский, грузинский, киргизский, эсперанто и английский. Работает в Windows, GNU/Linux и Android.
  • eSpeak (не обновляется с 2014 года) и его ответвление — eSpeak NG — c поддержкой более 100 языков и диалектов, включая даже латынь. NG означает New Generation  — «новое поколение». Эта версия разрабатывается сообществом с тех пор, как автор оригинальной eSpeak перестал выходить на связь. Система озвучит ваш текст в Windows, Android, Linux, Mac, BSD. При этом старый eSpeak стабилен в ОС Windows 7 и XP, а eSpeak NG совместим с Windows 8 и 10.

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

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

Установка речевых движков, голосов и модулей в Windows 

С установкой синтезаторов в Windows проблем возникнуть не должно. Единственный нюанс — для русского голоса eSpeak и eSpeak NG нужно скачать расширенный словарь произношения. Распакуйте архив в подкаталог espeak-data или espeak-ng-data в директории программы. Теперь замените старый словарь новым: переименуйте ru_dict-48 в ru_dict, предварительно удалив имеющийся файл с тем же именем (ru_dict).

Теперь установите модули pywin32, python-espeak и py-espeak-ng, которые потребуются нам для доступа к возможностям TTS:

pip install pywin32 python-espeak pyttsx3 py-espeak-ng

Если у вас на компьютере соседствуют Python 2 и 3, здесь и далее пишите «pip3», а при запуске скриптов  — «python3».

Установка eSpeak(NG) в Linux

Подружить «пингвина» с eSpeak, в том числе NG, можно за минуту:

sudo apt-get install espeak-ng python-espeak

pip3 install py-espeak-ng pyttsx3

Дальше загружаем и распаковываем словарь ru_dict с официального сайта:

wget http://espeak.sourceforge.net/data/ru_dict-48.zip

unzip ru_dict-48.zip

Теперь ищем адрес каталога espeak-data (или espeak-ng-data) где-то в /usr/lib/ и перемещаем словарь туда. В моем случае команда на перемещение выглядела так:

sudo mv ru_dict-48 /usr/lib/i386-linux-gnu/espeak-data/ru_dict

Обратите внимание: вместо «i386» у вас в системе может быть «x86_64...» или еще что-то. Если не уверены, воспользуйтесь поиском:

find /usr/lib/ -name "espeak-data"

Готово! 

RHVoice в Linux

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

Смысл в том, что мы клонируем git-репозиторий и собираем необходимые компоненты через scons.

Для экспериментов в Windows и Linux я использую одни и те же русские голоса: стандартный ‘ru’ в eSpeak и Aleksandr в RHVoice.

Как проверить работоспособность синтезатора

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

Проверить работу eSpeak в Windows проще всего через GUI  — достаточно запустить TTSApp.exe в папке с программой. Дальше открываем список голосов, выбираем eSpeak-RU, вводим текст в поле редактирования и жмем на кнопку Speak.

Обратиться к espeak можно и из терминала. Базовые консольные команды для eSpeak и NG совпадают — надо только добавлять или убирать «-ng» после «espeak»:

espeak -v ru -f D:\my.txt

espeak-ng -v en "The Cranes are Flying"

echo "Да, это от души. Замечательно. Достойно восхищения" |RHVoice-test -p Aleksandr

Как нетрудно догадаться, первая команда с ключом -f  читает русский текст из файла. Чтобы в Windows команда espeak подхватывалась вне зависимости от того, в какой вы директории, добавьте путь к консольной версии eSpeak (по умолчанию — C:\Program Files\eSpeak\command_line) в переменную окружения Path. Вот как это сделать.

Библиотека pyttsx3

PyTTSx3 — удобная кроссплатформенная библиотека для реализации TTS в приложениях на Python 3. Использует разные системы синтеза речи в зависимости от текущей ОС:

  • в Windows — SAPI5,
  • в Mac OS X — nsss,
  • в Linux и на других платформах — eSpeak.

Это очень удобно: пишете код один раз и он работает везде. Кстати, eSpeak NG поддерживается наравне с исходной версией.

А теперь примеры!

Просмотр голосов

У каждого голоса есть несколько параметров, с которыми можно работать:

  • id (идентификатор в операционной системе), 
  • name (имя),
  • languages (поддерживаемые языки),
  • gender (пол),
  • age (возраст).

Первый вопрос всегда в том, какие голоса установлены на стороне пользователя. Поэтому создадим скрипт, который покажет все доступные голоса, их имена и ID. Назовем файл, например, list_voices.py:

import pyttsx3

tts = pyttsx3.init() # Инициализировать голосовой движок.

У активного движка есть стандартный параметр ‘voices’, где содержится список всех доступных этому движку голосов. Это нам и нужно

voices = tts.getProperty('voices')

 # Перебрать голоса и вывести параметры каждого

for voice in voices:

    print('=======')

    print('Имя: %s' % voice.name)

    print('ID: %s' % voice.id)

    print('Язык(и): %s' % voice.languages)

    print('Пол: %s' % voice.gender)

    print('Возраст: %s' % voice.age)

Теперь открываем терминал или командную строку, переходим в директорию, куда сохранили скрипт, и запускаем list_voices.py.

 Результат будет примерно таким:

В Linux картина будет похожей, но с другими идентификаторами. 

Как видите, в Windows для большинства установленных голосов MS SAPI заполнены только «Имя» и ID. Однако этого хватит, чтобы решить следующую нашу задачу: написать код, который выберет русский голос и что-то им произнесет.

Например, у голоса RHVoice Aleksandr есть преимущество — его имя уникально, потому что записано транслитом и в таком виде не встречается у других известных производителей голосов. Но через pyttsx3 этот голос будет работать только в Windows. Для воспроизведения в Linux ему нужен речевой Speech Dispatcher, с которым библиотека взаимодействовать не умеет. Как общаться с «диспетчером» еще обсудим, а пока разберемся с доступными голосами.

Как выбрать голос по имени

В Windows голос удобно выбирать как по ID, так и по имени. В Linux проще работать с именем или языком голоса. Создадим новый файл set_voice_and_say.py:

import pyttsx3

tts = pyttsx3.init()

voices = tts.getProperty('voices')

# Задать голос по умолчанию

tts.setProperty('voice', 'ru') 

# Попробовать установить предпочтительный голос

for voice in voices:

    if voice.name == 'Aleksandr':

        tts.setProperty('voice', voice.id)

tts.say('Командный голос вырабатываю, товарищ генерал-полковник!')

tts.runAndWait()

В Windows вы услышите голос Aleksandr, а в Linux — стандартный русский eSpeak. Если бы мы вовсе не указали голос, после запуска нас ждала бы тишина, так как по умолчанию синтезатор говорит по-английски.

Обратите внимание: tts.say() не выводит реплики мгновенно, а собирает их в очередь, которую затем нужно запустить на воспроизведение командой tts.runAndWait().

Выбор голоса по ID

Часто бывает, что в системе установлены голоса с одинаковыми именами, поэтому надежнее искать необходимый голос по ID.

Заменим часть написанного выше кода:

for voice in voices:

    ru = voice.id.find('RHVoice\Anna')  # Найти Анну от RHVoice

    if ru > -1: # Eсли нашли, выбираем этот голос

        tts.setProperty('voice', voice.id)

Теперь в Windows мы точно не перепутаем голоса Anna от Microsoft и RHVoice. Благодаря поиску в подстроке нам даже не пришлось вводить полный ID голоса.

Но когда мы пишем под конкретную машину, для экономии ресурсов можно прописать голос константой. Выше мы запускали скрипт list_voices.py — он показал параметры каждого голоса в ОС. Тогда-то вы и могли обратить внимание, что в Windows идентификатором служит адрес записи в системном реестре:

import pyttsx3

tts = pyttsx3.init()

EN_VOICE_ID = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MS-Anna-1033-20DSK"

RU_VOICE_ID = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\TokenEnums\RHVoice\Anna"

# Использовать английский голос

tts.setProperty('voice', EN_VOICE_ID)

tts.say("Can you hear me say it's a lovely day?")

# Теперь — русский

tts.setProperty('voice', RU_VOICE_ID)

tts.say("А напоследок я скажу")

tts.runAndWait()

Как озвучить системное время в Windows и Linux

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

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

# «Говорящие часы» — программа озвучивает системное время

from datetime import datetime, date, time

import pyttsx3, time

tts = pyttsx3.init()

tts.setProperty('voice', 'ru')  # Наш голос по умолчанию

tts.setProperty('rate', 150)    # Скорость в % (может быть > 100)

tts.setProperty('volume', 0.8)  # Громкость (значение от 0 до 1)

def set_voice(): # Найти и выбрать нужный голос по имени

    voices = tts.getProperty('voices')

    for voice in voices:

        if voice.name == 'Aleksandr':

           tts.setProperty('voice', voice.id)

        else:

            pass

def say_time(msg): # Функция, которая будет называть время в заданном формате

    set_voice() # Настроить голос 

    tts.say(msg)

    tts.runAndWait() # Воспроизвести очередь реплик и дождаться окончания речи

while True:

    time_checker = datetime.now() # Получаем текущее время с помощью datetime

    if time_checker.second == 0:

        say_time('{h} {m}'.format(h=time_checker.hour, m=time_checker.minute))

        time.sleep(55)   

    else:

        pass

Программа будет отслеживать и называть время, пока вы не остановите ее сочетанием клавиш Ctrl+Break или Ctrl+C (в Windows и Linux соответственно).

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

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

Обертка для eSpeak NG

Модуль называется py-espeak-ng. Это альтернатива pyttsx3 для случаев, когда вам нужен или доступен только один синтезатор — eSpeak NG. Не дай бог, конечно. Впрочем, для быстрых экспериментов с голосом очень даже подходит. Принцип использования покажется вам знакомым:

from espeakng import ESpeakNG

engine = ESpeakNG()

engine.speed = 150 

engine.say("I'd like to be under the sea. In an octopus's garden, in the shade!", sync=True)

engine.speed = 95 

engine.pitch = 32

engine.voice = 'russian' 

engine.say('А теперь Горбатый!', sync=True)

Обратите внимание на параметр синхронизации реплик sync=True. Без него синтезатор начнет читать все фразы одновременно — вперемешку. В отличие от pyttsx3, обертка espeakng не использует команду runAndWait(), и пропуск параметра sync сбивает очередь чтения.

Озвучиваем текст из файла

Не будем довольствоваться текстами в коде программы — пора научиться брать их извне. Тем более, это очень просто. В папке, где хранится только что рассмотренный нами скрипт, создайте файл test.txt с текстом на русском языке и в кодировке UTF-8. Теперь добавьте в конец кода такой блок:

text_file = open("test.txt", "r")

data = text_file.read()

tts.say(data, sync=True)

text_file.close()

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

Управляем речью через Speech Dispatcher в Linux

До сих пор по результатам работы нашего кода в Linux выводился один суровый eSpeak. Пришло время позаботиться о друзьях Tux’а и порадовать их сравнительно реалистичными голосами RHVoice. Для этого нам понадобится Speech Dispatcher — аналог MS SAPI. Он позволяет управлять всеми установленными в системе голосовыми движками и вызывать любой из них по необходимости.

Скорее всего Speech Dispatcher есть у вас в системе по умолчанию. Чтобы обращаться к нему из кода Python, надо установить модуль speechd:

sudo apt install python3-speechd

Пробуем выбрать синтезатор RHVoice с помощью «диспетчера» и прочесть текст:

import speechd

tts_d = speechd.SSIPClient('test')

tts_d.set_output_module('rhvoice')

tts_d.set_language('ru')

tts_d.set_rate(50)

tts_d.set_punctuation(speechd.PunctuationMode.SOME)

tts_d.speak('И нежный вкус родимой речи так чисто губы холодит')

tts_d.close()

Ура! Наконец-то наше Linux-приложение говорит голосом, похожим на человеческий. Обратите внимание на метод .set_output_module() — он позволяет выбрать любой установленный движок, будь то espeak, rhvoice или festival. После этого синтезатор прочтет текст голосом, предписанным для данного движка по умолчанию. Если задан только язык — голосом по умолчанию для данного языка.

Получается, чтобы сделать кроссплатформенное приложение с поддержкой синтезатора RHVoice, нужно совместить pyttsx3 и speechd: проверить, в какой системе работает наш код, и выбрать SAPI или Speech Dispatcher. А в любой непонятной ситуации — откатиться на неказистый, но вездеходный eSpeak.

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

import platform

system = platform.system() # Вернет тип системы.

bit = platform.architecture() # Вернет кортеж, где разрядность — нулевой элемент

print(system)

print(bit[0])

Пример результата:

Windows

64bit

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

Модуль Google TTS — голоса из интернета

Google предлагает онлайн-озвучку текста с записью результата в mp3-файл. Это не для каждой задачи:

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

Что касается голосов, английский и французский звучат очень реалистично. Русский голос Гугла — девушка, которая немного картавит и вдобавок произносит «ц» как «ч». По этой причине ей лучше не доверять чтение аудиокниг, имен и топонимов.

Еще один нюанс. Когда будете экспериментировать с кодом, не называйте файл «gtts.py» — он не будет работать! Выберите любое другое имя, например use_gtts.py.

Простейший код, который сохраняет текст на русском в аудиофайл:

from gtts import gTTS

tts = gTTS('Иван Федорович Крузенштерн. Человек и пароход!', lang='ru')

tts.save('tts_output.mp3')

После запуска этого кода в директории, где лежит скрипт, появится запись. Чтобы воспроизвести файл «не отходя от кассы», придется использовать еще какой-то модуль или фреймворк. Годится pygame или pyglet. 

Вот листинг приложения, которое построчно читает txt-файлы с помощью связки gtts и PyGame. Я заметила, что для нормальной работы этого скрипта текст из text.txt должен быть в кодировке Windows-1251 (ANSI).

Выводим текст через NVDA

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

Одна из самых популярных программ экранного доступа в Windows — бесплатная и открытая NVDA. Для связи с ней к нашему приложению нужно привязать библиотеку nvdaControllerClient (есть варианты для 32- и 64-разрядных систем). Узнавать разрядность системы вы уже умеете.

Еще для работы с экранным диктором нам понадобятся модули ctypes и time. Создадим файл nvda.py, где напишем модуль связи с NVDA:

import time, ctypes, platform

# Загружаем библиотеку клиента NVDA

bit = platform.architecture()

if bit[0] == '32bit':

    clientLib = ctypes.windll.LoadLibrary('nvdaControllerClient32.dll')

elif bit[0] == '64bit':

    clientLib = ctypes.windll.LoadLibrary('nvdaControllerClient32.dll')

else:

    errorMessage=str(ctypes.WinError(res))

    ctypes.windll.user32.MessageBoxW(0,u"Ошибка! Не удалось определить разрядность системы!",0)

# Проверяем, запущен ли NVDA

res = clientLib.nvdaController_testIfRunning()

if res != 0:

errorMessage=str(ctypes.WinError(res))

ctypes.windll.user32.MessageBoxW(0,u"Ошибка: %s"%errorMessage,u"нет доступа к NVDA",0)

def say(msg):

    clientLib.nvdaController_speakText(msg)

    time.sleep(1.0)

def close_speech():

    clientLib.nvdaController_cancelSpeech()

Теперь эту заготовку можно применить в коде основной программы:

import nvda

nvda.say('Начать игру')

# … другие реплики или сон

nvda.close_speech()

Если NVDA неактивна, после запуска кода мы увидим окошко с сообщением об ошибке, а если работает — услышим от нее заданный текст. 

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

Заключение

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

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

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

29 авг 19, 15:15
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

Как я стал frontend-разработчиком и получил работу в Mail.ru

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

— Вениамин, какое у тебя было образование и где ты работал до GB? Откуда у начальника склада подготовка, чтобы выиграть бесплатное обучение IT-профессии при огромном конкурсе? :)

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

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

— Ты родился в Узбекистане?

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

Тем не менее, когда мне предложили работу в GeekBrains, ни грамма не сомневался, что нужно ехать в Москву.

— Когда ты понял, что разработка — это твое?

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

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

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

Сначала я выбрал язык Java: читал о нем, пробовал писать код — и убедился, что мне это интересно. Начал искать курсы и узнал про GeekBrains. Собирался записаться на платное обучение, но увидел, что проходит замечательный конкурс :) Можно было выиграть бесплатное обучение фронтенду или Ruby.

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

— И почему между Frontend и Ruby ты выбрал первое?

— Это произошло спонтанно: для поступления на специальность «frontend-разработка» во вступительных задачах нужно было использовать JavaScript. По сравнению с Ruby язык JS показался мне более близким к Java и потому более понятным. 

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

— Задания показались тебе простыми?

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

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

— Мы с двумя ребятами-бэкендерами сделали сервис для владельцев парковок Parking online. Это решение для автоматизации учета и управления, а также электронное рабочее место для оператора парковки.

Скриншот страницы авторизации

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

Создание тарифа с помощью сервиса Parking online

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

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

 — После обучения профессии ты остался в GeekBrains на стажировку. Что она собой представляла? Сколько длилась? Кто все это курировал?

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

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

Курировал нас тимлид из GeekBrains. Я и сейчас в его команде.

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

— С самого начала пришлось осваивать новые технологии: GraphQL, TypeScript, Apollo, Styled components.

— Когда ты шел на стажировку, ты уже знал, что по итогу можешь получить позицию Junior в GB?

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

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

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

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

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

— Практически не изменился. К тому, что я назвал выше, остается добавить как раз базовые вещи, изученные в GB: современный JS, HTML 5, CSS-grid.

— В каком направлении собираешься развиваться дальше, что изучать?

— Сейчас осваиваю React Native. Буду дальше развиваться как frontend-разработчик. Мне нравится это направление — оно востребовано и, как мне кажется, на этом поприще у меня многое получается. Тем более, есть у кого учиться: мне очень повезло с тимлидом. Помимо обширных знаний он обладает отменным терпением :)

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

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

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

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

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

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

Люди

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