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

Основное для IT-специалиста

  • Английский язык
  • Архитектура компьютерных систем
  • Алгоритмизация и структуры данных
  • Математика (алгебра/геометрия): математический анализ, теория вероятности и математическая статистика, дискретная математика, теория чисел, линейная алгебра, численные методы etc
  • Технологии разработки программного обеспечения
  • Методологии: Waterfall, Scrum, MSF, RUP, Agile, Kanban, XP, TDD, BDD
  • Парадигмы программирования
  • Шаблоны (паттерны) проектирования
  • Безопасность информационных систем
  • Методики тестирования программного обеспечения
  • Основы эргономики (юзабилити)
  • Используемый язык программирования
  • Возможности используемых средств разработки
  • Знание предметной области

Языки программирования

  • Объектно-ориентированные: C#, C++, Java
  • Языки разметки: HTML, CSS
  • Веб-программирование: JavaScript, PHP, Python
  • Язык запросов: SQL

Frontend-разработка

  • Методологии (SuitCSS, BEM, OOCSS, SMACSS, Sestematic CSS)
  • HTML
  • CSS (Responsive, SVG)
  • Dive Deep CSS3 (Flexbox, Rotate, Scale, Grids, Skew, Gradients, Transform, Transitions)
  • JavaScript (ES6, TypeScript, Flow)
  • Понимание клиентских технологий
  • HTML фреймворки (Bootstrap, Foundation, Semantic UI, Uikit, Materialize CSS)
  • CSS-препроцессоры (LESS, SASS, Styles, PostCSS)
  • Фреймворки (Angular.js, Backbone.js etc)
  • Библиотек (React, Vue, jQuery etc)
  • Понимание UX и UI
  • Адаптивная/отзывчивая верстка из графических макетов
  • Кросс-браузерная и кросс-платформенная верстка и тестирование
  • IDE или редактор (Atom, NotePad++, NetBeans etc)
  • Управление пакетами (nmp, yorn)
  • Контроль версий (Git, GitHub, CVS etc)
  • DOM, Ajax, SVG-объектами
  • HTML5 API (canvas, geolocation, video etc)
  • Знание WebGL
  • Работа с веб-шрифтами
  • Умение пользоваться графическими редакторами (Photoshop etc)
  • Опыт работы с сборщиками (Gulp, Webpack, Grunt, Bower etc)
  • Опыт работы с веб-форматами (JSON, JSONP, XML)
  • Инструменты тестирования (Jest, Mocha, Jasmine, Enzyme)

Backend-разработка

  • Понимание Internet, Ethernet, DNS, OSI, TCP, IP, Socket
  • PHP (ООП, MVC/HMVC)
  • DataBase (MySQL, Postgresql, MongoDB, NoSQL etc)
  • Понимание серверных технологий
  • PHP фреймворки (Codeigniter, Yii, Laravel, Symphony etc)
  • CMS (WordPress, Drupal, PrestaShop, Magento, InstantCMS etc)
  • Unix/Linux, Windows
  • Nginx и Apache
  • CGI/FastCGI
  • ORM(объектно-реляционное отображение): Doctrine/Propel
  • WebSockets
  • IDE или редакторы (Atom, NotePad++, NetBeans, Eclipse, PhpDesigner etc)
  • Контроль версий (Git, GitHub, CVS etc)
  • Знание Composer - пакетного менеджера
  • Тестирование программного кода
  • Знание вопросов безопасности (XSS,CSRF, SQL, Injection)

Парадигмы программирования

Название парадигмыОписание
Императивное программирование:
  • как решить задачу и представить результат
  • процесс вычисления в виде инструкций, изменяющих состояние данных
  • приказы в виде команд
  • интенсивно используется присваивание.
Декларативное программирование:
  • описывает, что представляет собой проблема и ожидаемый результат
  • не используют понятия состояния
  • не содержат переменных и операторов присваивания
  • написание исполнимых спецификаций, содержит в себе составляющие процесса разработки (проектирование, рефакторинг, отладка и др.)
  • программа проектирует и доказывает сама себя.
Процедурное программирование:
  • последовательно выполняемые операторы можно собрать в подпрограммы
  • выполнение операторов с целью преобразования исходного состояния памяти в результат
  • задачи разбиваются на шаги и решаются шаг за шагом
Структурное программирование:
  • разработка программы ведётся пошагово, методом «сверху вниз»
  • иерархическая структура блоков, программа строится без использования оператора goto, последовательности, ветвления, цикла
  • используются подпрограммы.
Аспектно-ориентированное программирование:
  • разбиения программы на модули
  • аспект
  • совет
  • точка соединения
  • срез
  • внедрение
Объектно-ориентированное программирование:
  • абстракция данных
  • инкапсуляция
  • наследование
  • полиморфизм
  • класс
  • объект
  • поля класса (атрибуты)
  • методы (процедуры и функции)
  • свойства объекта
  • конструктор и деструктор
Агентно-ориентированный подход:
  • объект
  • актор
  • агент
Компонентно-ориентированное программирование:компоненты для повторного использования в программе
 Прототипное программирование:
  • делегирование
  • каскадирование
 Обобщённое программирование:
  • описание данных и алгоритмов, которое можно применять к различным типам данных, не меняя само описание
  • допустимые выражения
  • ассоциированные типы
  • инварианты
  • гарантии сложности
Функциональное программирование:
  • переменные
  • списки
  • вычисление аргументов
  • чистота функции
  • абстракция данных
  • функция высшего порядка
  • рекурсия
  • замыкания
Аппликативный язык программирования:написание программы состоит в систематическом осуществлении применения одного объекта к другому
Комбинаторное программирование:не требует явного упоминания аргументов определяемой функции, использует вместо переменных комбинаторы и композицию функций
Модульное программирование:организация программы как совокупности небольших независимых блоков
Логическое программирование:
  • основано на автоматическом доказательстве теорем
  • раздел дискретной математики
  • изучает принципы логического вывода информации на основе заданных фактов и правил вывода
Программирование в ограничениях:отношения между переменными указаны в форме ограничений, определяют не последовательность шагов для исполнения, а свойства искомого решения
Метапрограммирование:создание программ, которые порождают другие программы как результат своей работы
Языково-ориентированное программирование:заключается в разбиении процесса разработки программного обеспечения на стадии разработки предметно-ориентированных языков (DSL) и описания собственно решения задачи с их использованием
Автоматное программирование:программа или её фрагмент осмысливается как модель какого-либо формального автомата (теория автоматов).
Динамическое программирование:способ решения сложных задач путём разбиения их на более простые подзадачи.
Программирование потоков данных:программа моделируется в виде ориентированного графа потока данных между операциями, подобного диаграмме потока данных.
Событийно-ориентированное программирование:выполнение программы определяется событиями — действиями пользователя (клавиатура, мышь), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета).
Реактивное программирование:ориентировано на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что нижележащая модель исполнения должна автоматически распространять изменения благодаря потоку данных.

 

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

Основные

НазваниеОригинальное названиеОписаниеОписан в Design Patterns
Основные шаблоны (Fundamental)
Шаблон делегированияDelegation patternОбъект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.Н/д
Шаблон функционального дизайнаFunctional designГарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы.Н/д
Неизменяемый интерфейсImmutable interfaceСоздание неизменяемого объекта.Н/д
ИнтерфейсInterfaceОбщий метод для структурирования компьютерных программ для того, чтобы их было проще понять.Н/д
Интерфейс-маркерMarker interfaceВ качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого могут применяться атрибуты или аннотации.Н/д
Контейнер свойствProperty containerПозволяет добавлять дополнительные свойства для класса в контейнер (внутри класса), вместо расширения класса новыми свойствами.Н/д
Event ChannelEvent channelРасширяет шаблон Publish/Subscribe, создавая централизованный канал для событий. Использует объект-представитель для подписки и объект-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одного объекта, даже если он зарегистрирован только на одном канале.Н/д
Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.
Абстрактная фабрикаAbstract factoryКласс, который представляет собой интерфейс для создания компонентов системы.Да
СтроительBuilderКласс, который представляет собой интерфейс для создания сложного объекта.Да
Фабричный методFactory methodОпределяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.Да
Отложенная инициализацияLazy initializationОбъект, инициализируемый во время первого обращения к нему.Нет
Пул одиночекMultitonГарантирует, что класс имеет поименованные экземпляры объекта и обеспечивает глобальную точку доступа к ним.Нет
Объектный пулObject poolКласс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов.Нет
ПрототипPrototypeОпределяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор.Да
Получение ресурса есть инициализацияResource acquisition is initialization (RAII)Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта.Нет
ОдиночкаSingletonКласс, который может иметь только один экземпляр.Да
Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
АдаптерAdapter / WrapperОбъект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.Да
МостBridgeСтруктура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.Да
КомпоновщикCompositeОбъект, который объединяет в себе объекты, подобные ему самому.Да
Декоратор или Wrapper/ОбёрткаDecoratorКласс, расширяющий функциональность другого класса без использования наследования.Да
ФасадFacadeОбъект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.Да
Единая точка входаFront controllerОбеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы.Нет
ПриспособленецFlyweightЭто объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.Да
ЗаместительProxyОбъект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.Да
Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость.
Цепочка обязанностейChain of responsibilityПредназначен для организации в системе уровней ответственности.Да
Команда, Action, TransactionCommandПредставляет действие. Объект команды заключает в себе само действие и его параметры.Да
ИнтерпретаторInterpreterРешает часто встречающуюся, но подверженную изменениям, задачу.Да
Итератор, CursorIteratorПредставляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящих в состав агрегации.Да
ПосредникMediatorОбеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.Да
Хранитель, TokenMementoПозволяет не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях.Да
Null ObjectNull objectПредотвращает нулевые указатели, предоставляя объект «по умолчанию».Нет
Наблюдатель, Dependents, Publish-Subscribe,ListenerObserver илиPublish/subscribeОпределяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.Да
СлугаServantИспользуется для обеспечения общей функциональности группе классов.Нет
СпецификацияSpecificationСлужит для связывания бизнес-логики.Нет
Состояние, Objects for StatesStateИспользуется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.Да
СтратегияStrategyПредназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.Да
Шаблонный методTemplate methodОпределяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.Да
ПосетительVisitorОписывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы.Да
Простая политикаSimple policy Нет
Event listener  Нет
Одноразовый посетительSingle-serving visitorОптимизирует реализацию шаблона посетитель, который инициализируется, единожды используется, и затем удаляется.Нет
Иерархический посетительHierarchical visitorПредоставляет способ обхода всех вершин иерархической структуры данных (напр. древовидной).Нет

Design Patterns

  • Порождающие шаблоны проектирования
    • Abstract Factory — Абстрактная фабрика
    • Builder — Строитель
    • Factory Method — Фабричный метод
    • Prototype — Прототип
    • Singleton — Одиночка
  • Структурные шаблоны проектирования
    • Adapter — Адаптер
    • Bridge — Мост
    • Composite — Компоновщик
    • Decorator — Декоратор
    • Facade — Фасад
    • Flyweight — Приспособленец
    • Proxy — Заместитель
  • Поведенческие шаблоны проектирования
    • Chain of responsibility — Цепочка обязанностей
    • Command — Команда
    • Interpreter — Интерпретатор
    • Iterator — Итератор
    • Mediator — Посредник
    • Memento — Хранитель
    • Observer — Наблюдатель
    • State — Состояние
    • Strategy — Стратегия
    • Template method — Шаблонный метод
    • Visitor — Посетитель

Шаблоны параллельного программирования (concurrency)

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

НазваниеОригинальное названиеОписание
Active ObjectActive objectСлужит для отделения потока выполнения метода от потока, в котором он был вызван. Использует шаблоны асинхронный вызов методов и планировщик.
BalkingBalkingСлужит для выполнения действия над объектом только тогда, когда тот находится в корректном состоянии.
 Binding propertiesКомбинирует несколько наблюдателей для обеспечения синхронизации свойств в различных объектах[7]
Обмен сообщениямиMessaging design pattern (MDP)Позволяет компонентам и приложениям обмениваться информацией (сообщениями).
Блокировка с двойной проверкойDouble-checked lockingПредназначен для уменьшения накладных расходов, связанных с получением блокировки.
 Event-based asynchronousАдресные проблемы с Асинхронным паттерном, которые возникают в программах с несколькими потоками.
Охраняемая приостановкаGuarded suspensionИспользуется для блокировки выполнения действия над объектом только тогда, когда тот находится в корректном состоянии.
Half-Sync/Half-Async  
Leaders/followers  
 LockОдин поток блокирует ресурс для предотвращения доступа или изменения его другими потоками.
МониторMonitor objectОбъект, предназначенный для безопасного использования более чем одним потоком.
ReactorReactorПредназначен для синхронной передачи запросов сервису от одного или нескольких источников.
Read write lockRead-write lockПозволяет нескольким потокам одновременно считывать информацию из общего хранилища, но позволяя только одному потоку в текущий момент времени её изменять.
ПланировщикSchedulerОбеспечивает механизм реализации политики планирования, но при этом не зависящих ни от одной конкретной политики.
Thread poolThread poolПредоставляет пул потоков для обработки заданий, представленных обычно в виде очереди.
Thread-Specific StorageThread-specific storageСлужит для предоставления различных глобальных переменных для разных потоков.
Однопоточное выполнениеSingle thread executionПрепятствует конкурентному вызову метода, тем самым запрещая параллельное выполнение этого метода.
Кооперативный паттернCooperative patternОбеспечивает механизм безопасной остановки потоков исполнения, используя общий флаг для сигнализирования прекращения работы потоков.

Шаблоны архитектуры системы

  • Model-View-Controller (MVC) Модель-представление-контроллер.
  • Model-View-Presenter
  • Model-View-View Model
  • Presentation-Abstraction-Control
  • Naked objects
  • Hierarchical Model–View–Controller

Enterprise

  • Active Record — способ доступа к данным реляционных баз данных в объектно-ориентированном программировании.
  • Business Delegate
  • Composite Entity/Составная Сущность
  • Composite View
  • DAO (Data Access Object) Объект Доступа к Данным
  • Dispatcher View
  • Front Controller
  • Intercepting Filter
  • Registry
  • Service Activator
  • Service Locator/Локатор Службы
  • Service to Worker
  • Session Facade/Фасад Сессии
  • Transfer Object Assembler
  • Transfer Object/Объект Перемещения
  • Value List Handler/Обработчик Списка Значений
  • View Helper
  • Unit of Work

Прочие

  • Repository/Хранилище

Другие типы шаблонов

Также на сегодняшний день существует ряд других шаблонов:

  • Carrier Rider Mapper описывают предоставление доступа к хранимой информации
  • Аналитические шаблоны описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки
  • Коммуникационные шаблоны описывают процесс общения между отдельными участниками/сотрудниками организации
  • Организационные шаблоны описывают организационную иерархию предприятия/фирмы
  • Антипаттерны (Anti-Design-Patterns) описывают, как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации

 

Тестирование

  • Функциональное тестирование
  • Тестирование производительности
    • Нагрузочное тестирование
    • Стресс-тестирование
    • Тестирование стабильности
  • Конфигурационное тестирование
  • Юзабилити-тестирование
  • Тестирование интерфейса пользователя
  • Тестирование безопасности
  • Тестирование локализации
  • Тестирование совместимости

По знанию системы

  • Тестирование чёрного ящика
  • Тестирование белого ящика
  • Тестирование серого ящика

По степени автоматизации

  • Ручное тестирование
  • Автоматизированное тестирование
  • Полуавтоматизированное тестирование

По степени изолированности компонентов

  • Модульное тестирование
  • Интеграционное тестирование
  • Системное тестирование

По времени проведения тестирования

  • Альфа-тестирование
    • Дымовое тестирование
    • Тестирование новой функции
    • Подтверждающее тестирование
    • Регрессионное тестирование
    • Приёмочное тестирование
  • Бета-тестирование

По признаку позитивности сценариев

  • Позитивное тестирование
  • Негативное тестирование

По степени подготовленности к тестированию

  • Тестирование по документации (формальное тестирование)
  • Интуитивное тестирование