Технические скиллы академиста: что нужно уметь, чтобы пройти отбор

Введение

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

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

Вступительный тест 👶

Тест состоит из 4-х типов вопросов: вопросы по технологии направления (например, JS), WEB, базы данных и ООП.

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

https://academy.binary-studio.com/blog/marafon-pidgotovki-do-testu

Во всех направлениях есть вопросы по WEB, которые включают в себя HTTP, Rest API, HTML и CSS. Так как в Binary Studio Academy мы обучаем разрабатывать web-приложения независимо от направления, то соответственно, вам нужно знать и web-технологии. При этом вопросы этого типа достаточно простые, перечислять все возможные способы вертикального центрирования в CSS не придется, но не мешало бы знать хотя бы один 😉 Для подготовки я бы посоветовал посмотреть, какие есть HTTP методы, их особенности и назначение, что такое Rest API, структура Rest ресурсов, самые распространенные HTML теги и базовый CSS (background, color и т.д.).

Аналогично и по базам данных, спрашивать в тесте про параллельное выполнение транзакций и в чем особенность b-tree индексов не будут, но нужно иметь представление о реляционных таблицах и их свойствах, уметь написать SELECT запрос с JOIN’ами разного типа (LEFT, RIGHT, OUTER, INNER), агрегатными функциями (AVG, SUM, COUNT) и сортировками (ORDER BY), а также другие операции в SQL (UNION, HAVING, WHERE и т.д.).

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

Большинство вопросов будет именно по языку программирования, так что если вы уже успели написать что-нибудь больше, чем “Hello world”, то скорей всего, проблем со вступительным тестом у вас не будет.

Технические скиллы разработчика 🧔

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

Математика 📏

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

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

Task example

Сперва определимся с параметрами, которые нам необходимы для решения задачи:

Task example

  • Wtotal - ширина всех таб
  • Wvis - ширина видимой области
  • Wofs - смещение слева
  • Wtab - ширина одной табы

Таким образом, двигать мы можем, изменяя смещение слева (Wofs) на какой-то шаг (S), прибавляя или вычитая его. Для того, чтобы определить до какого предела мы можем двигать, нам нужно знать общую ширину таб: Wtotal = Σwtab. И тогда предел будет следующим:

0 ≥ Wofs ≥ Wvis - Wtotal

Вычислив это, запрограммировать нам не составит никакого труда. На стрелки мы вешаем обработчик событий, и если жмем влево, то Wofs -= S, а если вправо, то Wofs += S.

И если Wofs == 0, то выключаем стрелку влево, а если Wofs == Wvis - Wtotal, то вправо.

В результате может получится что-то подобное:

Tabs example

Алгоритмы 📈

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

Т.е. допустим мы возьмем сортировку “пузырьком”:

function sort(arr) {
   for (let i = 0; i < arr.length - 1; i++) {
       for (let j = i + 1; j < arr.length; j++) {
           if (arr[i] > arr[j]) {
               const buff = arr[i];
               arr[i] = arr[j];
               arr[j] = buff;
           }
       }
   }
 
   return arr;
}

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

for (let i = 0; i < arr.length - 1; i++) {
   for (let j = i + 1; j < arr.length; j++) {
       // … to do whatever you need
   }
}

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

Структуры данных 🏗

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

Существует ряд типовых структур данных, которые эффективно подходят в определенных ситуациях, например, такие, как массив, список, очередь, стэк, дерево, хэш-таблица и другие. И если, например, мы хотим хранить, добавлять и искать данные, то подходящей структурой было бы бинарное дерево, так как в нем данные хранятся всегда в отсортированном виде и сложность поиска и вставки составляет O(log n). А если вам нужно закешировать какие-то данные, чтобы не тратить время на поиск, то подошла бы хэш-таблица, у которой сложность вставки и поиска и того лучше O(1), но есть проблемы с хранением больших объемов данных.

А какую структуру данных вы бы выбрали для отображения комментариев с вложенными комментариями? Пишите свой вариант в комментариях 😉

Также вам постоянно придется структурировать свои данные самостоятельно, описывая свойства классов и создавая отношения между классами, и со временем вы сможете делать это максимально эффективно, понимая все преимущества и недостатки.

Шаблоны проектирования 🧬

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

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

createRoute(transportType) {
   // … do smth
   if (transportType === 'car') {
   } else {
   }
   // … do smth
   if (transportType === 'bike') {
   } else {
   }
}

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

createRoute(transportType) {
   if (transportType === 'bike') {
       return createBikeRoute();
   } else {
       return createCarRoute();
   }
}

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

Так называемые Gang of Four (Erich Gamma, Richard Helm, Ralph Johnson, и John Vlissides) собрали самые распространенные, по их мнению, паттерны, разделили их на 3 группы (поведенческие, структурные и порождающие) и выпустили книгу “Design Patterns: Elements of Reusable Object-Oriented Software”. Эта книга - хорошее начало для знакомства с шаблонами проектирования, и на практике вы будете встречаться с ними постоянно.

Вывод ☝️

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

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