Итак, сегодня, я решил взять небольшой перерыв в работе над PHPixie v3 и написать несколько заметок. Так как мой предыдущий пост о тестовых заданиях на интервью нашел своего читателя, я решил углубиться в эту тему и написать заметку о том, что каждый веб-разработчик, по моему мнению, должен знать.
В моем предыдущем посте был огромный перечень вещей, которые вы должны были знать, чтобы повысить свою квалификацию. Возможно, многие скажут, что такой подход является слишком формальным, но я считаю, что он служит прекрасной возможностью узнать что-то новое, о чем вы возможно и не подозревали. Так же, вы можете убедиться, что люди, работающие на высоких должностях, по крайней мере, более осведомлены, чем те, кем они управляют.
Так как мой вариант списка, судя по всему, будет очень большим, я разделю его на несколько постов.
Кто-то может сказать: моя работа заключается в создании форм для WordPress, и мне не нужно это знать, ведь эти знания мне не пригодятся. Мой ответ заключается в том, что если вы не узнаете этого, тогда создание форм для WordPress будет вашей работой на всю жизнь.
Итак, давайте начнем с того, что, по моему мнению, нужно знать каждому junior’у.
Я хочу уточнить то, что «Junior» не означает «тот, кто просто начал разрабатывать», это человек который имеет достаточно знаний и навыков, что бы эффективно справиться с большинством повседневных задач, но время от времени вынужден обращаться за помощью.
Основные знания
- Понимание «большого O», что это означает и почему это важно;
- Структуры массива данных, как они определены, а не как они реализованы в PHP. Как n-ый элемент массива обращается в памяти;
- Знание, по крайней мере, одной фундаментальной структуры данных (связный список, очередь, стек);
- Быть в состоянии реализовать, по крайней мере, один алгоритм сортировки сложности O(NlogN);
- Понимание рекурсии. Это само собой разумеется.
ООП
- Инкапсуляция, наследование, полиморфизм;
- Разница между интерфейсом и абстрактным классом. В качестве дополнительного бонуса будет знание того, как PHP примеси могут быть использованы при реализации нескольких интерфейсов;
- Понимание не менее 2 паттернов каждого вида (порождающих, структурных и поведенческих);
- DRY (Don’t repeat yourself) принцип;
- Почему Singleton'ы зло.
Архитектура
- Различие между MVC, VC и MVP архитектурами;
- Почему микрофреймворки типа Slim не могут быть классифицированы как MVC, и какой тип архитектуры они имеют на самом деле;
- Почему все PHP MVC Фреймворки на самом деле таковыми не являются;
- Что такое разделение ответственностей (Separation of Concerns);
- Понимание ORM и ActiveRecord.
Сети
- Структура IP адреса;
- Что такое порт, протокол и сокет;
- Умение построить HTTP запрос и ответ с полезной нагрузкой вручную;
- Плюсы и минусы при использовании куков и сессий. Знание когда, что, использовать;
- Будучи в состоянии выполнить основные настройки HTTP сервера (apache, nginx и т.д.);
- Использование AJAX.
SQL
- Проектирование нормализированных таблиц. Знание первых трех нормальных форм;
- Понимание индексов. Что такое TABLE FULL SCAN и почему этого стоит избегать;
- Понимание как использовать EXPLAIN для анализа запросов;
- Различные виды JOIN'ов;
- Почему внешние ключи необходимы в базе данных;
- MyIsam vs InnoDB плюсы и минусы;
- Знание о существовании NoSQL баз данных.
HTML, CSS и разметки
По большей части, это полагается на реальный опыт, так что здесь сделать акцент только на теории:
- По крайней мере, один шаблонизатор, или использование PHP в качестве шаблонизатора;
- Понимание CSS препроцессора;
- Ощущение комфорта с поддержкой кроссбраузерности;
- По крайней мере, несколько хороших CSS эффектов, таких как тени, градиенты, закругленные углы и т.д.;
- Понимание важности семантической разметки;
- Объектная модель документа (DOM).
Javascript
Да, это выделено в отдельный раздел
- Каким образом JavaScript является объектно-ориентированным языком без классов;
- Как эмулировать классы в JavaScript;
- Каким образом прототипный подход ООП превосходит классовый;
- JQuery, хотя я предполагаю, в наши дни люди сначала изучают JQuery, а потом уже JavaScript;
- Уметь написать хорошо структурированный код без обратных вызовов;
- Методы быстрой загрузки JS (uglifying, requirejs).
Безопасность
- Различные подходы к авторизации и аутентификации;
- OAuth;
- Предотвращение SQL атак;
- Предотвращение XSS атак;
- Смягчение DDOS атак;
- Хэш-функции и почему md5 это уже не круто.
Процесс разработки
- Почему нам нужно тестирование?
- Уметь использовать любую систему тестирования, бонусом будет PHPUnit;
- Mocks vs Stubs;
- Различные виды тестирования: модульное (Unit), интеграционное (Integration), Behavioral, дымовое (Smoke), тестирование черного ящика (Black box) и т.д.;
- Любая система контроля версий, бонусом будет знание Git. Уметь откатить изменения, сделать rebase, branch и т.д..
Оптимизация
- Кеширование;
- Профилирование;
- Понимание механизмов балансировки нагрузки.
PHP
Наконец-то =)
- Типы данных PHP;
- Обработка ошибок;
- Наследование исключений и несколько catch операторов;
- Классы, интерфейсы, примеси;
- Загрузка файлов;
- Магические методы;
- Быть продуктивным хотя бы в одной из CMS;
- Автозагрузка;
- Позднее статическое связывание.
Теперь об этом. Я сгруппировал пункты так, что бы их предметы можно было легко загуглить, к тому же большинство из них есть на вики. И если вы думаете, что я действительно переоценил уровень Junior'а, вы будете очень удивлены, сколько из этих тем может быть изучено всего за 2 вечера проведенных на википедии. Просто попробуйте =)
От переводчика: данный пост является вольным переводом статьи Things Every Web Developer Should Know – Part 1
комментарии (0)