Developer Roadmap
public enum
- 1 год
- Рекомендуемый срок изучения всех материалов
- 2 года
- Рекомендуемый опыт работы для перехода на следующий уровень
Книга обучает основным структурам данных и алгоритмам работы с ними, повсеместно используемым в программировании. Основной тезис книги: данные — первичны. Обязательна к изучанию любым программистом стремящимся стать профессионалом.
- Массивы, списки, деревья, кортежи, очереди, стэки
- Виды поиска, их отличия по производительности
- Виды сортировок, их отличия по производительности
В книге подробно описываются языковые средства С#, даются профессиональные рекомендации и приводятся сотни примеров программ, охватывающих большинство аспектов программирования на С#.
- Коллекции, перечислители и итераторы
- ООП, классы, наследование, перегрузки
- Делегаты, события
- Интерфейсы, структуры и перечисления
- Рефлексия, аттрибуты
- Обработка исключительных ситуаций
- LINQ, лямбда-выражения
Книга старая, про работу с ASP.NET 4 читать только при необходимости. Часть 3 описывает базовые принципы проектирования веб приложений, идею multi-layer архитектуры, и типовые архитектуры для UI.
- Понимать что такое coupling, cohesion, separation of concerns, information hiding
- Знать принципы SOLID
- Знать как выглядит multi-layer архитектура (UI, Business Logic, Data)
- Знать что такое DTO
- Знать основные паттерны для UI - MVC, MVP, MVVM
Задачник содержит все типовые базовые задачи, решать которые быстро и эффективно должен уметь любой профессиональный программист. Задачник используется для обучения студентов младших курсов мехмата ЮФУ.
- Решить не менее 80% задач из каждого раздела задачника
- 2 год
- Рекомендуемый срок изучения всех материалов
- 2 года
- Рекомендуемый опыт работы для перехода на следующий уровень
- 1 год
- Рекомендуемый опыт работы с младшими программистами
- Написать техническую статью о своём уникальном опыте работы с конкретной технологией, решения конкретной проблемы, потенциально полезную широкому (или узкому) кругу читателей.
Книга подробно описывает внутреннее устройство и функционирование общеязыковой исполняющей среды (CLR) и архитектуру Microsoft .NET Framework.
- проектирование типов:
- основы типов, примитивные, ссылочные и значимые типы
- методы, свойства, события, обобщения
- интерфейсы
- основные типы данных: строки, перечислимые типы, массивы, делегаты
- ключевые механизмы: исключения, сборка мусора
- многопоточность: потоки, асинхронные операции
Книга рассказывает, как писать код, который легко читать, поддерживать, тестировать.
- Boy Scout Rule
- Stepdown Rule для организации кодов
- Почему побочные эффекты усложняют понимание кода
- Принцип CQS
- Law of Demeter
- Выразительность имен
- Комментарии
- Акроним FIRST для тестов
Книга знакомит с фундаментальными приемами повторного использования кода, ставшими обязательными для изучения в наше время, в особенности в сфере разработки корпоративных приложений, где кодовая база функционирует и развивается годами.
- сигнатура, интерфейс, динамическое связывание, композиция, наследование, делегирование, агрегирование, осведомленность
- обратить внимание на миксины, в данной книге как основу приводят множественное наследование, тогда как в самых современных языках в основе лежит композиция
- первое и второе правила объектно-ориентированного проектирования
- отличие агрегирования и осведомленности, в сравнение с UML, где связь "осведомленность" называется "ассоциацией", а агрегирование зовется композицией, когда связанный объект не принимается извне, а создается внутри класса
- нежеланные зависимости и связи
- отличие приоритетов в проектировании приложений, библиотек, фреймворков
- собственно паттерны: порождающие, структурные, поведенческие
- уделить особенное внимание композиции и паттернам: абстрактная фабрика, посредник, стратегия, наблюдатель, мост, фасад - поскольку их применение в совокупности с архитектурными паттернами и приемами, предлагаемыми в последующих книгах, является фундаментом для построения по-настоящему надежных и модифицируемых OLTP систем, гибкость и интегрируемость которых наиболее востребована в наши дни, и с которыми нам приходится иметь дело чаще всего.
Книга обучает основным паттернам и способам их применения с краткими примерами кода.
- краткий экскурс по ООП
- принципы SOLID
- структурные, порождающие и поведенческие паттерны
Книга объясняет как писать хорошие юнит-тесты на .NET.
- определение юнит-теста
- свойства хороших юнит-тестов
- разница между юнит-тестами и интеграционными тестами
- виды тестов: value-based, state-based, interaction-based
- понятия fake, stub, mock object
- техника Extract and Override
- какие есть isolation frameworks для .NET - понимать в чем разница между constrained и unconstrained, какой лучше выбрать под конкретный проект и почему
- что такое overspecification, почему это плохо
- знать как тестировать cross-cutting concerns
- как писать простые и надежные тесты - ловят баги и дают понятные ошибки
- как писать тесты, которые легко читать, понимать и поддерживать
- с чего начать внедрение тестов в старый проект
- 2 год
- Рекомендуемый срок изучения всех материалов
- 3 года
- Рекомендуемый опыт работы для перехода на следующий уровень
- 2 года
- Рекомендуемый опыт работы с младшими программистами
- Написать 2-3 технические статьи о своём уникальном опыте работы с конкретной технологией, решения конкретной проблемы, потенциально полезные широкому (или узкому) кругу читателей.
Книга обучает эффективным подходам к программированию в рамках полного цикла создания ПО. Основной тезис книги – программу нужно писать так, чтобы другие разработчики могли легко в ней разобраться. Отличительная особенность книги – внимание к мелочам. Например, как назвать переменную или в каком месте поместить комментарий. Также автор объясняет в чем разница между программированием на языке и программированием с использованием языка.
Стоит отметить, что все представленные в книге методики не зависят от языка программирования. Книга будет полезна как начинающему, так и опытному разработчику.
- управление сложностью
- программирование с использованием языка
- методики проектирования
- разработка качественных классов и методов
- работа с переменными
- принципы именования
- операторы: условные операторы, циклы, управляющие структуры
- табличные методы
- логические выражения
- характеристики качества ПО
- методики повышения качества ПО
- совместная разработка
- тестирование
- отладка
- рефакторинг
- методики оптимизации кода
- форматирование
- методики комментирования
Книга рассказывает как работать в сложной кодовой базе, у которой нет тестов. Как внести изменения, и ничего не сломать? Как добавить тесты, если для этого надо поменять код? Как упростить код? Многие сложные и успешные проекты имеют огромную кодовую базу, с которой необходимо уметь обращаться.
- Виды изменений в ПО (добавление фич, исправление, рефакторинг, оптимизация)
- Шов для тестирования (seam)
- Как тестировать класс со сложными или скрытыми зависимостями
- Практика изменения кодов небольшими шагами (single-goal editing)
Книга похожа на ТЗ для разработчиков таких продуктов как Resharper или Roslynator. Представляет очевидный набор возможных операций над кем-то когда-то уже написанным кодом. Как бы бесполезно это не звучало, книга дает две неоспоримых причины для прочтения: узнать для каких целей не стоит напрягать пальцы и тратить время на печатание кода заново (используя вместо этого современный инструмент) и дать этим очевидным операциям единые названия, которые будут передаваться из поколения в поколение.
- цель рефакторинга
- за рефакторинг не платят, правило трех ударов
- понимание, что главное - не копипастить код - DRY, и что вариативность его использования должна организовываться благодаря декомпозиции классов
- понимание, что теоретическая общность теперь зовется - YAGNI
- понимание, что комментирование невнятных кусков кода следует заменять декомпозицией его методов
- польза замены элементарных типов классами для передачи между объектами (начиная с DDD этому дается термин Value Object)
- вред switch, общеизвестные паттерны для борьбы с ним
- польза утверждений (assertion-ов) для изучения кода, правда мало уделено внимания тому, что их не стоит отключать при компиляции для выпуска - в наше время это бессмысленно
- вред классов данных (начиная с DDD этому дается термин Anemic Model), правда стоит отметить, что современные ORM просто требуют этого, заставляя на первый взгляд жертвовать энкапсуляцией, тогда как в действительности это входит в задачи проектирования приложения, чтобы корректно делегировать задачу хранения данных, сформировав прослойку граничных интерфейсов для хранимых состояний и агрегировав их в соответствующие объекты бизнес логики, соблюдающих энкапсуляцию и организующих связи между собой
- польза тестирования, правда там не говорится про накладные расходы и бесполезность тестов при необходимости их изменения, особенно при рефакторинге изначально неорганизованного, но протестированного кода
- базовая технология рефакторинга
- знание на что способны инструменты, автоматизирующие рефакторинг
- рассуждения на тему почему разработчики не хотят применять рефакторинг, где стоит отметить только факт, что разработчик становится замотивирован в проектировании и рефакторинге не ранее, чем неоднократно испытает жалобы о нескончаемых багах и срывах сроков и убедится, что подход "напишу как получится" не работает и наносит вред всей команде
Книга в основном ориентирована на разработчиков OLTP систем. Вместе с уже изученными паттернами она формирует фундамент для построения архитектуры и проектирования компонент по-настоящему надежных, гибких и интегрируемых OLTP систем. Расширяет терминологию из предыдущих прочитанных книг на архитектурном уровне и предлагает методы управления архитектурой в соответствии со структурой команд разработчиков (и очень напоминает принципы разработки по фичам FDD) и сложности предметных областей.
- сущность, объект-значение
- идентичность сущностей, обременительность ассоциаций, агрегаты и границы его знаний, корневой объект агрегата
- объектный анализ и углубление моделей
- мотивация информативного именования типов
- необходимость утверждений в объектах-сущностях
- замкнутость операций в объектах-значениях
- понимание отличий между единым языком предметной области (ubiquitous language) и предметно-ориентированным языком (domain-specific language, DSL)
- с трудом применяемые на практике паттерны для выполнения транзакций: фабрика, хранилище, спецификация - почему рекомендуется реализация только операции И для комбинирования спецификаций в большинстве случаев
- множество примеров построения моделей предметной области с применением множества уже известных паттернов GoF
- ограниченный контекст (по-современному - фича). рекомендации по определению границ, взаимодействие между собой и с внешними системами
- устаревающая концепция сервисов для взаимодействия между ограниченными контекстами (речь о технологиях сродни WCF, которые вытесняются "субъектно-ориентированным программированием" SUP и "сервисной шиной предприятия" ESB)
- дистилляция смыслового ядра, неспециализированные подобласти (внешние зависимости), подключаемые компоненты, общее ядро (сквозная функциональность, зачастую мост), шаблоны документирования
- смысловое ядро (по-современному монолит), выделенное ядро (по-современному микросервис), выделение абстрактного ядра для организации связей между ними (например через NuGet)
- цена создания выделенного ядра, когда к этому стоит прибегать, отличие от выделения неспециализированных подобластей
- карта контекстов ядра, введение и поддержка крупномасштабной структуры ядра,
- уровень поддержки принятия решений (data warehouses, OLAP), положение относительно остальных уровней ответственности (которые в свою очередь относятся к OLTP)
- понимание, что использование рефлексии языка программирования не должно осуществляться на уровне знаний (модули, которые мы и привыкли называть модельными)