Сегодня я бы хотел разобрать ТЗ на позицию стажера-разработчика. Когда-то давно я его писал: хочу поделиться своими соображениями на этот счет.Новичкам будет полезно иметь представление о том, что их ожидает в будущем при трудоустройстве.
Разбор типичного тестового задания на позицию разработчика - 1
Вакансия выглядит следующим образом: Стажер-разработчик PostgreSQL от 30 000 руб. до вычета НДФЛ ООО Бизнес Технологии Санкт-Петербург, Коломяжский проспект, 33к2 Бизнес Технологии Требуемый опыт работы: не требуется
  • Полная занятость, полный день
Обязанности:
  • Реализация задач не высокого уровня сложности под руководством разработчика
  • Постоянный рост квалификации
Требования:
  • Понимания принципов структурного программирования, теории реляционных баз данных.
  • Ответственность, самостоятельность, инициативность
  • Коммуникабельность, умение и желание работать в команде
  • Высокая обучаемость
Желательно:
  • Знание
  • Sql;
  • Pl\sql;
  • Pl\pgSql;
  • C++, java, pascal.
Условия:
  • Работа в стабильной, динамично развивающейся компании
  • Комфортные условия труда
  • Отсутствие формализма и бюрократии
  • Обширные возможности для профессионального и карьерного роста
  • Заработная плата по итогам собеседования
  • Оформление по ТК, оплачиваемый отпуск согласно трудовому законодательству.
  • Просьба в заголовке письма указывать код вакансии: Project04
Описание тестового задания: Тест предназначен для самоконтроля с целью определения соискателю, для себя, стоит ли тратить свое время на собеседование. Псевдокод Данный псевдокод используется для описания алгоритмов.
  1. Отступ от левого поля указывает на уровень вложенности.
  2. Циклы while, for, repeat и условные конструкции имеют тот же смысл, что и в pascal-е.
  3. Символ “--” обозначает комментарий
  4. Символ “:=” обозначает присваивание
  5. Переменные локальны в рамках процедуры, если не оговорено иначе
  6. Индекс массива пишется в квадратных скобках, конструкция A[i] означает i элемент в массиве A
  7. Возможно использование объектов, состоящих из нескольких полей, или имеющих несколько атрибутов, значения поля записывается как ИмяПоля[ИмяОбъекта].

    К примеру, длина массива A записывается как Length[A]; что означают квадратные скобки - выясняется по контексту (переменная, обозначающая массив, или объект является указателем на составляющие его данные). После присвоения y:=x для любого поля f будет выполняться равенство f[y]=f[x]; определение того, что является атрибутом – функция, переменная или что-либо еще, - делается по контексту.

  8. Указатель может иметь специальное значение NIL, не указывающее ни на какой объект.
  9. Параметры передаются по значению: вызванная процедура получает собственную копию параметров, изменения параметров внутри процедуры снаружи не видно. При передаче объектов копируется указатель на данные, соответствующие этому объекту.
Задача Функция сортирующая массив элементов A: Sort(A,p,r) 1 if p < r 2 then q := round_half_down((p+r)/2) 3 Sort(A,p,q) 4 Sort(A,q+1,r) 5 Merge(A,p,q,r) Пример массива: A = (5,2,4,6,1,3,2,6) Примера запуска: Sort(A,1,length[A]) Необходимо: Разработать алгоритм функции Merge(A,p,q,r) на любом удобном вам языке, с использованием дополнительной памяти или без нее, как вам будет быстрее или удобнее в реализации. Если у вас получится - с радостью ждем вас для прохождения дополнительного тестирования. Мой ответ: Алгоритм, описываемый в примере "Псевдокода" - это алгоритм сортировки слиянием (Merge sort). Основная задача нашей функции - отсортировать массив неупорядоченных чисел: например, по возрастанию. Задача разбирается на подзадачи: последовательность чисел из массива разбивается на массивы меньшего размера до тех пор, пока массив не станет однозначным, происходит сравнение элементов массивов, их замена (меньшее на большее, по индексу), слияние.
Разбор типичного тестового задания на позицию разработчика - 2

public class Main {
    public static void main(String[] args) {
        int[] massif = {13, 3, 8, 1, 15, 2, 3, 7, 4};
        System.out.print("Массив до сортировки: ");
        for (int i = 0; i < massif.length; i++)
            System.out.print(massif[i] + " ");
        System.out.println("");
        massif = sort(massif);
        System.out.print("Массив после сортировки: ");
        for (int i = 0; i < massif.length; i++)
            System.out.print(massif[i] + " ");
    }

    public static int[] sort(int x[]) {
        if (x.length == 1) //Рекурсия идет до тех пор, пока массив делится
            return x;
        else {
            int half = (int) Math.floor(x.length / 2); //Разбиваем массив на 2 части
            int halfFirst[] = new int[half]; //1 часть, пустой массив
            int halfSecond[] = new int[x.length - half]; //2 часть, пустой массив
            for (int i = 0; i < x.length; i++) { //Заполняем новосозданные массивы значениями
                if (i < half)
                    halfFirst[i] = x[i];
                else
                    halfSecond[i - half] = x[i];
            }
            halfFirst = sort(halfFirst); //Рекурсия
            halfSecond = sort(halfSecond); //Рекурсия
            x = sortNext(halfFirst, halfSecond); //Отправляем заполненные значениями массивы в следующий метод
            return x;
        }
    }

    public static int[] sortNext(int x[], int y[]) {
        int c[] = new int [x.length + y.length]; //Создаем результирующий массив из суммы длин массивов из аргументов метода
        int a = 0, b = 0;
        for (int i = 0; i < x.length + y.length; i++) { //Сравниваем массивы, меняем местами элементы, заполняем новосозданный массив
            if (a == x.length) {
                c[i] = y[b];
                b++;
            }
            else if (b == y.length) {
                c[i] = x[a];
                a++;
            }
            else if (x[a] > y[b]) {
                c[i] = y[b];
                b++;
            }
            else {
                c[i] = x[a];
                a++;
            }
        }
        return c;
    }
}
Разбор типичного тестового задания на позицию разработчика - 3
Ссылка с рабочим кодом на Ideone: ТУТ Задача была успешно сдана, после чего пригласили на интервью, где, вместо собеседования, в меня кинули очередную порцию подобных задач и удалились на два часа, выдав ручку и 2 листочка А4. Забрали листочки, не посмотрев в них, и сказали, что перезвонят. Мое удовольствие от подобного времяпрепровождения не описать цензурными словами. Но, как минимум, это та суровая реальность, с которой многим придется столкнуться в начале своего пути.
Разбор типичного тестового задания на позицию разработчика - 4
Искренне желаю Вам интересных и конструктивных собеседований. С умом выбирайте работодателя. Всем добра!) П.С.: мой обзор компаний-работодателей за апрель 2018 (Санкт-Петербург) можно посмотреть ТУТ