Ответы на вопросы компания MindK на тему OOP

❏ Понимаю в чем суть ООП и его отличия от других подходов в программировании (функционального, процедурного).
ООП нацелено на разделение обязанностей и сокрытие информации

❏ Понимаю, что такое инкапсуляция, наследование и полиморфизм и могу объяснить на примерах.
Инкапсуляция – сокрытие данных ( public private protected )
Наследование – позволяет наследовать значения и методы родительского класса
Полиморфизм – позволяет расширять или изменять дочерний класс

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

❏ Понимаю, что такое объект в ООП.
Это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом

❏ Знаю какие бывает модификаторы доступа и их нюансы применения на практике.
public, private, protected

❏ Понимаю, что такое абстрактный класс и могу его реализовать.
Заготовка – методы должны быть определены в классе-потомке

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

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

❏ Понимаю, что такое паттерн программирования и какую проблему он решает.
Паттерны (или шаблоны) проектирования описывают типичные способы решения часто встречающихся проблем при проектировании программ

❏ Знаю, понимаю, и реализовывал хотя бы раз:
❏ Singleton – создание одного инстанса
❏ Factory – используется для создания объектов
❏ Proxy – интерфейс взаимодействия с любым классом, который трудно или невозможно использовать в оригинальном виде
❏ Adapter – позволяет привести нестандартный или неудобный интерфейс какого-то класса в интерфейс, совместимый с вашим кодом
❏ Command Chain – позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепи
❏ Inversion of Control – все зависимости модулей должны строятся на абстракциях этих модулях, а не их конкретных реализациях
❏ DI –  объект, который знает, как создать и настроить экземпляр класса и зависимых от него объектов. Используется для реализации слабосвязанной архитектуры
❏ ServiceLocator – является объектом, предоставляющим всевозможные сервисы (или компоненты), которые могут понадобиться приложению
❏ Prototype – позволяет копировать объекты, не вдаваясь в подробности их реализации
❏ Decorator – Динамически добавляет новую функциональность в экземпляры классов
❏ Observer – наблюдатель для навешивания обработчика на изменения
❏ Builder – интерфейс для производства частей сложного объекта
❏ Register – для реализации централизованного хранения объектов, часто используемых во всем приложении
❏ Mixin/Trait – подмешивание методов

Лучший ресурс по паттернам на мой взгляд https://refactoring.guru/ru/design-patterns/php


❏ Понимаю отличие подхода наследования от композиции.
Наследование – class dodgeClass extends carClass
Композиция – new carClass(new dodgeClass())

❏ Понимаю что такое namespace и их практическое применение.
Разделение пространства имен, для избегания конфликтов названий

Ответы на вопросы компания MindK на тему Git

  • Знаю, зачем нужна система контроля версий файлов и понимаю принцип ее работы.

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

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

Централизованная система контроля версий предназначена для решения основной проблемы локальной системы контроля версий.

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

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

  • Понимаю и использовал основные команды работы с репозиторием GIT (init, clone, commit, push, pull, fetch).
git init // инициализирует проэкт
git clone https://github.com/libgit2/libgit2 // клонирование существующего репозитория
git add * // добавить все файлы к индексированию
git commit // зафиксировать измененные файлы
git push <remote-name> <branch-name> // отправка изменений в удаленный репозиторий
git pull // автоматически получить изменения из удалённой ветки и слить их со своей текущей
git fetch [remote-name] // получение изменений из удалённого репозитория
  • Понимаю предназначение веток и использовал их в своей работе.

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

  • Сливал ветки через merge.

Предположим, вы работаете над проектом и уже имеете несколько коммитов.
Вы решаете, что теперь вы будете заниматься проблемой #53 из вашей системы отслеживания ошибок. Чтобы создать ветку и сразу переключиться на нее, можно выполнить команду git checkout с параметром -b:

$ git checkout -b hotfix
Switched to a new branch "hotfix"

Это то же самое что и:

$ git branch hotfix
$ git checkout hotfix

Вы работаете над своим сайтом и делаете коммиты.

$ git commit -a -m 'Create hotfix'
$ git checkout master
Switched to branch 'master'
git merge hotfix
  • Знаю применение команды stash + использовал её на практике.

Команда git stash позволяет на время «сдать в архив» (или отложить) изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключить контекст и вы пока не готовы к созданию коммита.

git stash    
git stash list    
git stash apply    

Отложенные изменения сохраняются в локальном репозитории Git и не передаются на сервер при выполнении команды push.

  • Реализовывал конфликты.

 Если разработчик A попытается изменить код, который редактирует разработчик B, может произойти конфликт. Основная задача команды git merge заключается в слиянии отдельных веток и разрешении любых конфликтующих правок.

  • Пересаживал цветы коммиты.

Команда git cherry-pick берёт изменения, вносимые одним коммитом, и пытается повторно применить их в виде нового коммита в текущей ветке. Эта возможность полезна в ситуации, когда нужно забрать парочку коммитов из другой ветки, а не сливать ветку целиком со всеми внесенными в нее изменениями.

  • Использовал команду rebase для перезаписи истории.

git rebase — это «автоматизированный» cherry-pick. Он выполняет ту же работу, но для цепочки коммитов, тем самым как бы перенося ветку на новое место.

  • Знаю, как изменить последний коммит.
git commit --amend

Ответы на вопросы компания MindK на тему HTML/CSS

  • Понимаю принцип каскадности таблиц стилей.

Это механизм, благодаря которому к элементу HTML-документа может применяться более чем одно правило CSS

  • Знаю основные HTML-элементы, такие как:span, div, ul, ol, thead, tfoot, p, a, и применял их на практике.
span – строчный элемент
div – блочный элемент
ul – список
ol – нумерованный список
thead – шапка таблицы
tfoot – футер таблицы
p – абзац
a - ссылка
  • Владею CSS-селекторами и понимаю, как они работают, такими как: #id.class; .class + .class; .class ~ div[attr], .div:not(:checked), div[attr*=”lorem”].
#id.class – выбираем в ид такой-то класc
.class + .class – выбрать элементы class внутри первого class
.class ~ div[attr] – выбрать все блоки div[attr] одного родителя class
.div:not(:checked) – выбрать элементы с классом div которые не отмечены &lt;input class=div type=checkbox /&gt;
div[attr*=”lorem”] – выбираем блок с атрибутом который содержит текст lorem
  • Понимаю как определяется приоритетность/вес CSS-селекторов.
*                                 	0-0-0-0 
li                                  0-0-0-1             
li:first-line                     	0-0-0-2             
ul li                              	0-0-0-2             
ul ol+li                          	0-0-0-3 
form + *[type=text]        			0-0-1-1 
table tr td.second         			0-0-1-3             
h2.block.title.               		0-0-2-1 
#xyz                             	0-1-0-0             
style=" "                       	1-0-0-0  
  • Проверял верстку на валидность, знаю основные правила валидного HTML, использовал средства валидации и знаю обязательные атрибуты HTML элементов.

https://validator.w3.org/ . Обязательные атрибуты это !DOCTYPE, html, head, title, body.

  • Применял на практике HTML5 элементы и знаю их назначение, такие как: article, aside, footer, header, nav, section.
article - задает содержание сайта вроде новости, статьи, записи блога, форума или др.
aside - определяет блок сбоку от контента для размещения рубрик, ссылок на архив
footer – определяет подвал сайта
header – определяет шапку сайта
nav – определяет навигацию сайта
section - задаёт раздел документа, может применяться для блока новостей, контактной информации и др.
  • Применял на практике CSS3 свойства, такие как: box-sizing,  animation, transform, translate.

box-sizing – применяется для изменения алгоритма расчета ширины и высоты элемента ( border-box – по границе, content-box – по контенту )

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

translate – одна из функций transform, позволяет перемещать элемент.

  • Использовал на практике хотя бы один из подходов clearfix, знаю зачем они нужны и как работают.

Это способ борьбы с проблемой контейнера нулевой высоты для плавающих элементов

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
  • Реализовывал тянущуюся верстку, знаю принципы и возможные проблемы.
.col1 { left: 0; right: 50%; margin-right: 100px; }
.col2 { width: 200px; left: 50%; margin-left: -100px; }
.col3 { left: 50%; right: 0; margin-left: 100px; }

Тянущуюся верстку можно делать: таблицами, блоками, гридами, флексами.

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

Ctrl+Shift+I

  • Знаю один из markup frame work (Bootstrap CSS / Compass CSS / Foundation CSS Material UI / Semantic UI / Знакомство с LESS, SASS).

https://getbootstrap.com/

sass – препроцессор css

Ответы на вопросы компания MindK на темы Environment Automation and Services

Environment Automation

  • Знаком с базовыми принципами Continuous Integration.
    Это практика разработки ПО, которая заключается в слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта выполнении тестов и доставки его на продакт.
  • Знаком с одной из систем Continuous Integration.
    Jenkins, TeamCity, Travis CI
  • Настраивал простую сборку веб-проекта из системы контроля версий (например, GIT) на Linux сервер.
    Hook Pre-commit, post-commit
  • Имею практический опыт работы с Docker.
    Программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации
  • Знаю как попасть по ssh в Docker контейнер.
    Для этого нужно установить и запустить на докер контейнере sshd
    apt-get install openssh-server
    mkdir /var/run/sshd
    chmod 0755 /var/run/sshd
    /usr/sbin/sshd
    useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
    passwd username ## Enter a password

    А для выполнения произвольных команд достаточно попасть на баш
    docker ps
    docker exec -it bash
  • Знаю что такое и есть опыт работы с docker-compose.
    Файл compose используется для определения необходимых для приложения сервисов. Пример, подымаем веб = пхп + нджинкс:
version: '3'
services:
  web:
    image: nginx:alpine
    volumes:
      - "./etc/default.conf:/etc/nginx/conf.d/default.conf"
      - ".:/var/www/html"
      - "./etc/default.template.conf:/etc/nginx/conf.d/default.template"
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=${NGINX_HOST}
    command: /bin/sh -c "envsubst '$$NGINX_HOST' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
    restart: always
    depends_on:
      - php
  php:
    image: nanoninja/php-fpm:${PHP_VERSION}
    restart: always
    volumes:
      - "./etc/php.ini:/usr/local/etc/php/conf.d/php.ini"
      - .:/var/www/html

Services

  • Знаю сервисы Firebase и есть опыт работы с ними
    Firebase дает инструменты для быстрой разработки приложений
  • Realtime Database
    Облачная NoSQL база данных
  • Cloud Functions
    Выполнение бекенд кода на гугловском облаке
  • Authentication
    Бекенд сервисы (телефон, пароль, провайдеры типа твиттер и фейсбук) SDK для авторизации
  • Cloud Storage
    Облачное хранилище для файлов
  • Знаю сервисы AWS и есть опыт работы с ними.
    https://aws.amazon.com/ru/
  • Есть опыт работы с Google API (e.g. Google Maps API, OAUTH).
    https://developers.google.com/apis-explorer/#p/

Ответы на вопросы компания MindK по теме Unix

✓ Умею искать файлы по названию и содержимому.
find /home -name top
grep -r "top" /home

✓ Знаю, что делает команда sudo rm -rf /.
Удаляет все

✓ Знаю команду chmod и что означает каждая из цифр 467.
Меняет права на файлы и директории
4 – чтение
6 – 4+2 – чтение и запись
7 – 4+2+1 – чтение запись и выполнение

✓ Знаю, как поменять владельца директории.
chown – R USER: /dir

✓ Знаю, что такое группа пользователей и как добавить в нее нового юзера.
useradd -G newgroup user

✓ Знаю зачем нужна команда sudo.
Получить права супер пользователя

✓ Знаю, что такое крон и умею добавлять новые задачи.
Это демон планировщик задач
crontab –e

✓ Знаю, как посмотреть все процессы пользователя www-data.
top –u www-data
ps –u www-data

✓ Знаю, как завершить нужный процесс.
killall process

✓ Умею работать с менеджером пакетов.
apt-get install packages
apt-get remove packages
apt-get update

✓ Знаю, что такое symlink и как его создать.
Символическая ссылка
ln -s {/путь/к/файлу или директории} {файл-линк}

✓ Знаю в чем отличие soft link от hard link.
Софтлинк – ссылка, удалив файл на который ссылается она станет недоступной. Хардлинк удаляя файл он будет существовать и работать пока не удалится все хардлинки.

✓ Знаю, что такое ssh и как с ним работать.
Протокол сетевого уровня. Для удаленного управления.

✓ Умею копировать файлы с локального на удаленный сервер по ssh.
scp file.gz root@server.my:/home/dir

✓ Знаю, как распаковать tar архив.
tar -xvf file.tar
tar -xzvf file.tar.gz
tar -xjvf file.tar.bz2

✓ Знаю, как работать в редакторе vim.
vi file.conf
Затем можно нажать клавишу i (или insert) и внести нужные изменения
После редактирования нажмите (esc)
:q! – выйти без сохранения
:wq – записать файл и выйти
Поиск по тексту (esc)/словокотороеищем