Советы сеньоров: как прокачать знания junior .NET
Советы сеньоров — постоянная рубрика, в рамках которой опытные специалисты делятся практическими советами с джуниорами — общие лайфхаки по обучению, какие книги и ресурсы читать, какие навыки осваивать и многое другое. В этом выпуске говорим о .NET разработчиках.
Ярослав Ефименко, Senior Software Engineer, 12 лет опыта .NET разработки:
Всем привет! Прежде всего, хочу посоветовать нашим джуниорам две вещи. Во-первых, не бояться и верить в себя. Во-вторых, учиться, учиться и еще раз учиться. Пожалуй, порог входа для овладения стеком .NET будет выше по сравнению со сферой web-разработки, однако он же будет явно ниже, чем порог входа для разработки на С++, и примерно сопоставим с порогом входа для Java. Но это все не столь существенно по сравнению с одним соображением: самое главное, чтобы вам НРАВИЛОСЬ программировать.
Программирование, с одной стороны, — тяжелый умственный труд, получение массы знаний из самых разных источников, разбор головоломок багов иногда вообще без какой-либо помощи от тех самых источников, необходимость постоянно выстраивать в голове самые разные сложные конструкции (а способность к такому абстрактному мышлению есть далеко не у всех). Но, с другой стороны, программист — это творец и повелитель Вселенной! Маленькой J, которую он выстраивает силой своего разума и воплощает в строках программного кода. Конечно, внешняя среда (т. е. компьютерное железо и выбранный стек технологий) накладывает свои ограничения, но сравните, насколько они меньше по сравнению с ограничениями, например, инженеров-самолетостроителей. Ну и еще один маленький бонус — с такой напряженной работой мозгами склероз в старости вам точно грозить не будет.
С чего же начать? Я пришел в мир .NET, уже будучи опытным разработчиком (C++, Pascal и т. д.), поэтому фактически мне необходимо было изучить отличия C# от С++, а опыт работы с Microsoft Visual Studio у меня уже был. Здорово также помог опыт работы с Delphi и C++ Builder — было такое впечатление, что .NET Framework включал в себя лучшее из известных мне технологий. Поэтому для меня основными книгами стали учебники компании Microsoft для подготовки к экзаменам по .NET Framework 2.0:
Но перечисленные книги новичку могут оказаться слишком тяжелыми для восприятия и недостаточно подробными для первых шагов. Поэтому начинать я рекомендовал бы с книг из серии «Head First»: «Изучаем C#» и «Объектно-ориентированный анализ и проектирование». Они написаны легким языком и доступны для изучения даже подростку (проверено моим сыном). Далее можно читать книги из той же серии, например, «Изучаем SQL», «Паттерны проектирования» и так далее.
Сразу хочу отметить две важные вещи. Во-первых, просто читать даже самые лучшие книги категорически недостаточно. Нужно ставить себе Visual Studio (благо Community Edition для целей обучения абсолютно бесплатна) и одновременно с чтением писать код. Поставьте себе задачу для начала написать, например, свой калькулятор, потом каталог с поиском для домашних книг или фильмов и так далее. Заведите свой аккаунта на GitHub и соберите коллекцию своих маленьких проектов — так будет проще и совета спросить, и показать, как вы учились, уже при поиске работы. Во-вторых, ни в коем случае не пренебрегайте общими принципами объектно-ориентированного программирования. Уверенное владение ими в чем-то даже важнее владения языком С#.
Что читать далее и в каком направлении развиваться — покажут время и ваши предпочтения. Повторюсь, самое главное, чтобы программирование вам нравилось. Кто-то будет писать сайты, кто-то Windows-приложения, еще кто-то — только Back-end. .NET Framework предоставит вам возможности для всех этих направлений и еще для массы других, о которых вы еще не знаете (да и я тоже всех не упомню). Творите — и да пребудет с вами Сила!
Павел Мальцев, Solution Architect, 10 лет опыта .NET разработки:
Редакция DOU спросила меня, как прокачать свои знания джуну. Вообще-то есть годная Programmer Competency Matrix, но я добавлю еще немного отсебятины.
Старайтесь концентрироваться на принципиальных вещах, а не на освоении максимально широкого количества библиотек или деталей. Разберитесь с Design Patterns, SOLID, DDD, ORM.
Если вы не заканчивали профильный вуз, у вас может не хватать базы, основы. Попробуйте восполнить этот пробел самостоятельно — алгоритмы, структуры данных, работа с памятью, TCP, HTTP, security, O(n), memory management, деревья, графы...
Постройте в голове четкую причинно-следственную связь для всех новых веяний в индустрии. Какую задачу решает технология? Какие ограничения? К примеру, почему появился MVC, ведь был же Web Forms.
Не отвлекайтесь на модное. Оно может не прожить и двух-трех лет, и ведь есть еще столько «классики», которая будет нужна всегда. Silverlight? Нет, не слышал.
Ставьте цели. Найдите свой интерес. Goals should be SMART. Постоянно спрашивайте «зачем». Когда вложенность вопроса-ответа дойдет до трех-четырех-пяти уровней, можно остановиться.
Найдите баланс: что-то надо раскопать самому, за чем-то не стыдно обратиться к коллегам и получить быстрый ответ. Первое это из серии «Как много открытий чудных дает нам чтение сорсов». Второе — сильнейшим образом экономит время, добавляет еще умных и уже обдуманных мыслей и социализирует в коллективе. Не стыдно задавать вопрос, если не делать это по каждому чиху, а вначале какое-то время все-таки подумать/погуглить самому.
Заведите аккаунт на Stack Overflow. Разберитесь с Git. Многопоточность — это не просто async/await. Разберитесь глубже. В идеальном проекте применяется CI, unit testing, static code analyzer. Если у вас такого нет — сделайте свой pet project и примените там в любом начальном виде. Глубоко разберитесь с exception handling.
High Load не всегда вершина всего, но там много интересного. Вообще, вся архитектура зависит от нагрузки, помните об этом.
Требуйте code review! Пишите для других. Делайте комментарии в коде: что код делает видно из кода, а вот почему — очевидно не всегда.
Cloud — это уже необходимость. Но обязательно обращайте внимание на цену того или иного сервиса — это один из ключевых параметров при выборе. Если ваш проект не использует Cloud (Azure, Amazon или Google) — заведите себе аккаунт и пробуйте сами.
И еще немного:
- Заглядывайте в исходники .NET.
- Полезный список.
- 97 Things Every X Schould Know — неплохо.
- Читайте Рихтера, Фаулера, Скита. Из наших неплохо пишет Сергей Тепляков.
- Меняйте проекты, но не слишком часто. Старайтесь принимать участие в проектах, в которых есть реальные пользователи.
- Всегда понимайте бизнес-задачу, которую вы решаете.
- Не читайте бумажных книг, особенно в переводе — почти все они уже устарели.
- Не пользуйтесь локализированным продуктами, «у пана атамана все английское».
- На хабре часто комментарии важнее статьи.
- В любой профессии может присутствовать творчество. На любом проекте всегда можно чему-нибудь поучиться. Но не скатывайтесь в рутину.
- .NET — это еще и PowerShell c F#.
- Фронт-енд — дело молодых, лекарство против морщин. Но потом может быть больно за бесцельно прожитые годы.
- Изучите и используйте hot keys. Старайтесь вообще не пользоваться мышкой в меню.
- Освойте слепой набор на клавиатуре. Я учился на «solo на клавиатуре» от Шахиджаняна.
Василий Гребинник, Senior Software Engineer, 9 лет опыта .NET разработки:
Успех превращения начинающего разработчика в компетентного программиста предполагает серьезное изучение теории и наработку опыта. Других вариантов нет, и просто прохождение курсов вам не поможет. Учить и читать придется много, очень много, причем в самостоятельном режиме, а не только то, что «задали». А опыт нарабатывается на реальных сложных проектах. Чем сложнее проект, чем тяжелее вам будет работать, но тем больше полезного опыта получите. И, если вы действительно хотите стать классным специалистом, трудности в проектах вас должны не пугать, а мотивировать. А теперь рассмотрим будущее обучение более детально.
Теория программирования
.NET программист — это в первую очередь программист. Начните с самых азов — то есть изучите до полного понимания фундаментальные структуры данных и алгоритмы. Посмотрите теорию графов, комбинаторику, теорию вероятности. Д. Кнута читать сейчас совсем не обязательно. Можно найти понятные для начинающих статьи в интернете. Если вам не понятна статья — бросайте ее. Автор скорее всего и сам не до конца разобрался в материале. Моим первым учебником была книга «Простое и сложное в программировании» Велихова Е. П. Я бы рекомендовал почитать ее. Отличное изложение теории, и еще в ней есть определение Э. Дейкстры, кто же такой компетентный программист.
Принципы ООП, SOLID, GOF, MVC, MVVM и другие паттерны надо не только прочитать, но и проработать. Нарисуйте схемы паттернов. Спросите себя, действительно ли вы понимаете, когда их нужно применять, чем они похожи, чем отличаются. Не слушайте тех, кто говорят, что никогда на практике их не использовали. Вы же не собираетесь всю жизнь заниматься проектами не сложнее Hello World? Сложные продукты подразумевают проработку архитектуры программ. Проработайте Microsoft Application Architecture Guide. Multilayer,
Для изучения собственно C# и .NET я не буду оригинален и порекомендую классику: Троелсена — для С#, Рихтера — для получения более глубокой информации по .NET, «Pro ASP.NET 4.5 in C#» - для изучения ASP.NET. Я учил именно в таком порядке. Еще я бы порекомендовал почитать книгу «Accelerated C# 2010» Трей Нэш. Хотя она и несколько устарела с точки зрения описания языка, но там описано несколько полезных и интересных техник программирования. По .NET Core я использую просто документацию.
Выход .NET Core — настоящая революция в мире .NET, и хотя, как я считаю, он вряд ли вытеснит полновесный .NET Framework из Enterprise-сегмента, мы получили первое настоящее средство для создания кроссплатформенных приложений от Microsoft.
Еще я бы рекомендовал подписаться на тематические сообщества и посещать тематические митапы. В Киеве, например, регулярно проходит .Net café, который организует Intetics. Там мы обсуждаем реальные кейсы и практические решения сложных задач.
Практика
Самый главный совет по написанию кода — всегда пишите качественный код. Принцип «Quick and dirty» — ваш главный враг. Даже если менеджер говорит, что код нужен был на вчера, никогда не торопитесь, чтобы «сдать в сроки», не пишите плохой код. Лучше уделить чуть больше времени и избежать грубых ошибок. Не бойтесь: чем больше будет опыта, тем быстрее будете писать качественный код. Качество кода — это ваш профессионализм и репутация среди коллег. Окружающая среда, руководство и требования постоянно меняются, но опыт и репутация остаются навсегда. Нет ничего хуже репутации «#0%0кодера» для настоящего программиста. Прочитайте Боба Мартина «Чистый код» и ... еще раз перечитайте. Я рекомендовал другие книги выше, но эта — обязательна для прочтения.
Используйте лицензионное программное обеспечение. Получая деньги за написание ПО, надо и самому оплачивать труд других программистов. Постарайтесь договориться с руководством и получить MSDN-подписку. Это даст доступ к огромному количеству лицензионного ПО от Microsoft и не только. В подписку входит доступ к Pluralsight — источнику тренингов по различным областям ИТ.
Профессионал должен знать свой инструмент — изучайте возможности среды Visual Studio, особенно в отладке, навигации по коду и рефакторингу. Посмотрите на ReSharper, до выхода 2017 студии без него работать было не так приятно.
Аппаратное обеспечение
Ваш компьютер не должен сбоить и должен работать быстро. Поставьте максимальное количество ОЗУ, SSD. Инвестируйте в хороший большой монитор — берегите свое зрение. Заодно посвятите определенное количество часов в неделю физическим упражнениям и введите в рацион Омега-3-6-9 кислоты. Это позволит обеспечить хорошее кровообращение в головном мозге и даст возможность думать на все сто. И в целом, поможет вам поддерживать себя в тонусе. Все же ваше физическое состояние тоже очень важно, учитывая, сколько умственных усилий вы будете прилагать в работе.
Успехов в выбранной профессии, и не бойтесь начинать — все профессионалы когда-то были джунами.
Алексей Михалевич, Software Architect, Team Lead, 7 лет опыта .NET разработки:
«Для тех, кому интересно»
Программирование — это не про знание языков, библиотек, стандартов. Это логический образ мышления, умение разбивать задачу на подзадачи и четко представлять результат ваших действий. Как и любой другой навык, их надо прокачивать. Задачки, головоломки, личные проекты — все это тренирует ваш мозг в нужном направлении. Have fun!
Think outside the box
Будьте любознательны, выясняйте, как все устроено. Алгоритмы и структуры данных. ООП. Паттерны проектирования. Только не заучивайте определения, а прочувствуйте принцип. Практика — наше все. Напишите свой Dictionary, а потом попробуйте понять, почему он работает в несколько раз медленнее стандартного. Напишите мультипоточное приложение, используя low-level synchronization и половите deadlock’и. Решите уже наконец задачу коммивояжера, написав свой муравьиный алгоритм.
Изучайте различные языки программирования: это расширяет кругозор и повышает вашу гибкость и конкурентоспособность на рынке. Серебряную пулю программирования еще пока не изобрели. Не бойтесь разноязычной каши в голове: компилятор подскажет, чего в его языке нет :-)
Не ограничивайтесь только рабочими задачами, создавайте что-то для себя (в нерабочее время :-)). Изучайте материалы по Data Science, Machine Learning, Deep Learning, AI.
Learn English
Как бы банально это не прозвучало, прокачивайте свой английский. Причем не только технический и не только письменный. Возможность обсудить нюансы задания напрямую с заказчиком и способность четко и ясно рассказать ваш progress на стендапе еще никому не навредили.
Be a team player
Будьте командным игроком: ответственно относитесь к срокам, помогайте другим, не стесняйтесь сами обращаться за помощью. Не бойтесь брать на себя ответственность и проявлять инициативу — это залог роста специалиста в компании. В правильной компании.
Practice
Старайтесь попасть в outsource-компанию, которая работает с разными заказчиками — это даст потенциальную возможность не «закиснуть» в одном проекте, посмотреть на разные технологии и, возможно, сменить предметную область в пределах одной компании.
А языки, библиотеки, стандарты вам, конечно, придется изучить. А потом изучить новые. И еще новее. Но у вас уже будет базис.
Несколько полезных ресурсов:
- stackoverflow;
- CodeProject — ищите вопросы на интересующую вас тему и детально разбирайте ответы, не копируйте слепо решения;
- Хабрахабр — ищите и читайте статьи, обычно они легче для понимания новой для вас темы и могут послужить хорошим стартом;
- «Алгоритмы. Построение и анализ» Томас Х. Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн;
- «Приемы объектно-ориентированного проектирования. Паттерны проектирования» Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес;
- Также можете бесплатно скачать «Design Patterns via C#» Александр Шевчук, Дмитрий Охрименко, Андрей Касьянов;
- «Язык программирования C# 6.0 и платформа .NET 4.6» Эндрю Троелсен, Филипп Джепикс.
Артур Швецов, Senior Software Engineer, 7 лет опыта .NET разработки:
Важнейший навык, которым должен обладать каждый разработчик независимо от платформы и технологий, с которыми он работает ежедневно, — это английский язык. Без него невозможно эффективно коммуницировать с заказчиком, бизнес-аналитиками, понимать требования, работать в команде, изучать новые языки программирования и инженерные практики. Абсолютное большинство технической литературы, блогов, тренингов, записей с докладов выходят на английском языке, и 90% перечисленного так и остается без перевода! Например, издательства переводят книги очень избирательно и, зачастую, с опозданием в пару лет.
Найдите себе ментора, у которого вы сможете учиться и к которому будете прислушиваться. Такой человек поможет сделать кривую вашего обучения более стремительной, и сам процесс будет проходить эффективнее. Не бойтесь задавать вопросы старшим разработчикам, предлагать свои варианты решения и вступать в дискуссии. Учитесь работать в команде, потому что размеры текущих проектов зачастую непосильны одному человеку.
Технологии приходят и уходят, новые версии фреймворков появляются каждый год, но базовые вещи остаются востребованы всегда, ведь это фундамент, на котором все построено. Вы задумывались когда-либо, как работает операционная система, CLR, база данных или веб-сервер? Что происходит «за кулисами», когда вы запускаете свое консольное приложение или вводите в браузер адрес вашего веб-сайта? Хороший разработчик должен это знать и понимать.
Очень важно для разработчика умение читать, понимать и сопровождать чужой код. Невозможно взять и переписать весь код, который вам не нравится. Совершенствуйте свой код, подходы к его написанию и техники рефакторинга каждый день. Каждый класс, модуль, который вы начинаете писать, покрывайте unit-тестами! Unit-тесты — это незаменимый инструмент, который мгновенно показывает проблемы интеграции вашего модуля с другими частями системы.
В будущем вам необходимо будет проектировать новые модули и интегрировать их с уже существующими или же строить системы «с нуля». Для этого в вашем арсенале должны быть знания ООП, SOLID принципов, паттернов проектирования, DDD, TDD, а также подходов, которые помогают снижать сложность разработки проектирования и сопровождения кода.
Из must-read литературы по .NET, архитектуре ПО, рефакторингу и тестированию я бы порекомендовал следующие книги:
- «C# 6.0 in a Nutshell: The Definitive Reference», by Joseph Albahari, Ben Albahari;
- «C# in Depth», by Jon Skeet;
- «Clean Code: A Handbook of Agile Software Craftsmanship», by Robert C. Martin;
- «Dependency Injection in .NET», by Mark Seemann;
- «Паттерны проектирования на платформе .NET», by Sergey Teplyakov;
- «Head First Design Patterns: A Brain-Friendly Guide», by Eric Freeman, Kathy Sierra, Bert Bates, Elisabeth Robson;
- «Adaptive Code Via C#: Agile Coding with Design Patterns and Solid Principles», by Gary McLean Hall;
- «Microsoft .NET — Architecting Applications for the Enterprise», by Dino Esposito, Andrea Saltarello;
- «Implementing Domain-Driven Design», by Vaughn Vernon;
- «Patterns of Enterprise Application Architecture», by Martin Fowler Signature Book;
- «Working Effectively with Legacy Code», by Michael C. Feathers.
См. также другие советы сеньоров:
— Python
— Front-end/JavaScript
— Java
— QA