Як вчити .NET: докладна інструкція для новачків і пару порад для досвідчених

Всім привіт. Мене звати Влад. Я старший .NET розробник у компанії DataArt. В IT я близько семи років, з них більше п'яти працюю c .NET. Хочу дати деякі поради тим, хто тільки починає свій шлях в IT як розробник, а також тим, хто вже має пару років досвіду. Сподіваюся, моє бачення комусь допоможе на шляху.

На написання цієї статті мене надихнули недосконалі програми навчання багатьох курсів, а також неспроможні, загальні або занадто надлишкові поради експертів для новачків.

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

Що хочуть від джуніора

В основному роботодавець, наймаючи фахівця, бажає отримати недооцінений актив. Тобто спочатку людини беруть для розвитку, щоб інвестиції роботодавця окупилися, і через якийсь час джуніор виконував ту ж роботу так само якісно, як і фахівець, який стоїть на ринку дорожче і має більше досвіду.

Як не дивно, для початківця набагато важливіше те, що називають soft skills, і знання англійської мови . Але варто враховувати, що є речі, які можна виправити і яким можна навчити, а є ті, яким не можна. Наприклад, якщо людина не говорить по-англійськи, але розуміє базовий словник і граматику навчити його розмовній мові — це ризикована затія. Але якщо джуніор вже трохи розмовляє, то нанести його за півроку цілком реально.

Якщо людина здатна розслаблено вести бесіду і виявляє, що називається, аналітичні здібності, не впадає в ступор від складнощів — це теж можна віднести в розряд soft skills. Важливо те, наскільки людина здатна доводити роботу до результату, а вміння спілкуватися, правильно ставити питання і давати відповіді — дуже ефективний для цього інструмент.

До речі, здатність навчатися — теж важливий чинник. Краще взяти спеціаліста, вже здатної до самонавчання, ніж прищеплювати це. Показником можуть бути, наприклад, домашні саморобки на GitHub або навіть проекти в продакшені.

Ходить жарт (схожа на правду), що пройти співбесіду на джуніора/інтерна набагато складніше, ніж на сеньйора :) Так воно і є. Досвідчений фахівець має портфоліо/резюме — це вже говорить про те, що він здатний приносити результат. Але якщо людина раніше не працював або працював мало — рекрутеру необхідно тільки за одну співбесіду і, можливо, тестове завдання з'ясувати все про кандидата.

Але навіть якщо людина добре показав себе на співбесіді, це ще не привід розслаблятися — компанія буде стежити за тенденціями розвитку, щоб вчасно з'ясувати, чи виправдовує джуніор інвестиції грошей і часу в нього чи ні.

Де вигідні джуниоры

Існує цілий ряд завдань (нескладний баг-фіксінг, редагування, верстки та UI, написання юніт-тестів), з якими людина з невеликою кількістю знань і досвіду впорається за той же час, що і людина більш досвідчений. Взяти, приміром, промислову (enterprise) розроблення, великі проекти, де купу часу йде на рутину, начебто оновлення проекту до актуальної версії, мердж, тестування. Це жирний плюс в найом початківців фахівців.

Якщо взяти аутсорсинг і аутстаффінг (тобто перепродаж людино-годин) в тій чи іншій формі, то рейт, за якими продають джуніорів, не набагато нижче рейзів міддл-розробників. А ЗП початківців може бути значно нижче, що робить їх привабливим активом компанії, що приносить навіть більш високу маржу, ніж більш досвідчені розробники. Досвідчених ще й знайти набагато складніше — потрібно платити агентствам або рекрутерам аж до однієї зарплати такої людини, щоб здійснити оренду. А маржа при заробіток на висококласних фахівців — низька, вони більше потрібні для підтримки бізнесу в робочому стані.

Перші кроки

Якщо ви взагалі не з IT, у вас немає друзів-розробників, немає профільної освіти, і ви зовсім нічого не розумієте — можна почати з якихось курсів. Боюся, що зараз залишу без шматка хліба власників инфобизнесов, але в інтернеті можна знайти досить безкоштовних матеріалів, наприклад, на торрентах. Але, природно, я не рекомендую вам скачувати піратський контент :)

Якщо з живою людиною-лектором вам простіше, то раджу курси з великою тривалістю, наприклад від 3 до 6 місяців. Мені здається, це або втягне вас у процес, або остаточно вам набридне, і ви зрозумієте, що це не ваше.

Курси не допоможуть вам знайти роботу і не допоможуть отримати всі необхідні знання для працевлаштування. Але якщо ви заплатите гроші, це дисциплінує вас. Також курси дають першу понятійну базу, від якої можна відштовхуватися далі, загальне розуміння предмета і що важливо — знайомства.

Але краще всього мати товариша з IT, який зможе перевірити на адекватність курси, куди ви хочете піти, щоб не вийшло, що це банальна витягування грошей, і ви отримали хоч якусь користь.

Для людей, які вже коли щось кодили в універі чи школі, мають якесь уявлення про IT-сфері, курси — швидше за все, зайва трата грошей. Досить подивитися їх програму і далі самому шукати потрібні матеріали.

Зауважу, що будь-яке навчання повинне супроводжуватися практикою. Будь то самоосвіта або курси, ви повинні показувати результат. Це може бути макет, якщо ви вчите верстку, веб-додаток або мобільний — не важливо. Головне, все, що ви дізнаєтеся теоретично, відразу ж застосувати на практиці.

Далі я розпишу своє бачення, з чого краще починати і як рухатися далі в світі .NET розробки.

Hard Skills

Я розділю всі сфери знань hard skills на такі частини:

Для розробників різних рівнів потрібна різна ступінь занурення в ці напрями. Давайте подивимося, з чого почати.

Поради для інтернів/джуніорів

Назви книг написані в оригіналі, можна без проблем знайти російськомовні адаптації у друкованому або електронному вигляді.

C#

«C# 4.0 The Complete Reference» by Herbert Schildt

Добре підійде для освоєння базового синтаксису мови. Особисто мені ніколи не подобалися книги Троелсена, які рекомендують новачкам. За моїми суб'єктивними відчуттями, там багато води, а ось у Шилдте як раз все по справі і з прикладами.

Дуже важливо для початківців. Якщо освоюєте C# з нуля, вивчайте як можна детальніше саме мова, синтаксичні конструкції і всілякі їх комбінації, пробуйте їх застосовувати, намагайтеся самі ставити собі питання і тут же відповідати, тестуючи, як це працює, загалом-то досліджувати.

Заучувати, який тип скільки байт займає в пам'яті, можна оглядово, але не варто на цьому зациклюватися. Краще перевірте, наскільки добре ви розумієте приклади і зможете написати таке ж.

Методи стандартних бібліотек .NET — це енциклопедичні знання, і заучувати їх теж по початку не варто. Це гуглится за пару секунд, і куди більш продуктивно буде це робити вже під час самої роботи (навчальної, зрозуміло) над якимись своїми виробами. Так методів буде свій «вагу», і потреба в них. Отже, запам'ятаються вони куди краще.

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

LINQ

«Pro LINQ: Language Integrated Query in C# 2010» by Joseph Rattz, Adam Freeman

Книжка дає вичерпні розуміння коштів LINQ в достатньому обсязі для впевненої роботи з ним, а з LINQ доведеться працювати багато. По суті, це величезна частина мови C#, на якій пишеться чимало логіки. Я сам дуже люблю використовувати LINQ, де тільки зможу. Писати бізнес-логіку (логіку програми) у функціональному стилі (використовуючи описовий формат перетворення даних, а не послідовний) куди лаконічніше і зрозуміліше, як на мене. Загалом у книзі досить глибоко показані всі тонкощі, рекомендую, не дивлячись на її вік. В LINQ мало що змінилося.

Бонус #1
Даю вам свою класифікацію методів LINQ , яка допоможе запам'ятати куди краще. Написав її, коли сам вивчав LINQ.

.NET

«CLR via C#» by Jeffrey Richter

Класика жанру. Зовсім новачкам її можна пропустити і сконцентруватися на більш практичною літературі з фреймворкам, але кожен .NET розробник зобов'язаний її прочитати. Книга дає базове розуміння, як влаштована платформа .NET, як працюють синтаксичні засоби.

Я б дав деякі поради, як читати цю книгу:

Частина 1 — Основи CLR — дуже глибоко вникати не потрібно, достатньо зрозуміти, що таке:

Частина 2 — Проектування типів — цю частину потрібно добре вивчити цілком, важлива базова частина C#/.NET.

Частина 3 — Основні типи даних — заучувати функції роботи з рядками немає сенсу, це все легко гуглится. Особливу увагу приділіть:

Частина 4 — Ключові механізми — раджу дуже добре розібрати:

Частина 5 — Багатопоточність — занадто глибоко вникати, як це працює на рівні ядра ОС, не варто, але треба розуміти загальні концепції:

SQL

«T-SQL Fundamentals» by Itzik Ben-Gan

Мабуть, найкраща книга за T-SQL, яку я бачив для початківців. Інформація дається послідовно, детально і системно, проте в книзі того видання, яке я читав, не було голови про індекси. Раджу знайти окремо і вивчити.

Бонус #2
Дам вам вихідний код змійки , яку я написав на T-SQL. Робити такі проекти — дуже хороший спосіб вивчити мову краще.

А тепер челлендж : хто перший напише тетріс на T-SQL — отримає від мене пляшку ірландського віскі :)

Frameworks & Tools

«ASP.NET MVC 5» Адама Фрімена

Для веб-розробки рекомендую цю книгу. В ній непогано розібрані базові можливості ASP.NET MVC, контейнери управління залежностями (IoC), основи LINQ, AJAX, JQuery. Є приклади з кодом, досить легко читається.

Також рекомендую дуже хороші сайти-довідники по фреймворкам на платформі .NET — Metanit.com і Professor Web . Є дуже багато прикладів.

Також непоганий спеціалізований ресурс Entity Framework — Entity Framework Tutorial .

Productivity tools

Дуже важливо привчати себе з самого початку користуватися засобами підвищення продуктивності, щоб не втрачати час на банальної механіці роботи. Візьміть за правило:чим більше дій ви справляєте на клавіатурі — тобто клавішами, а не мишею, тим швидше ви працюєте . Комбінації гарячих клавіш здатні дуже сильно прискорити рутину і не віднімати вашої уваги.

Обов'язково встановіть собі ReSharper — особисто я не мислю свою роботу без цього доповнення до Visual Studio. Для тих, хто використовує Rider, Resharper взагалі, як рідний.

Якщо ви використовуєте MS SQL Server Management Studio, то must have розширення SQL Hunting Dog . Якусь подобу ReSharper'a для більш швидкої навігації по сутностей бази і перемикання баз.

Якщо ваша розробка пов'язана з Web — освоюйте Chrome dev tools (F12 tools).

Для 99% випадків налагодження коду в браузері їх повинно вистачити. Для більш хитрих випадків перехоплення і зміни трафіку використовуйте Fiddler .

Шаблони проектування та парадигми

«Патерни проектування на платформі .NET» Сергія Теплякова

Російськомовна книга за шаблонами проектування, досить розумна, з прикладами.

Парадокс шаблонів проектування в тому, що їх знання найчастіше вимагається від новачків, а самі шаблони — це концентрація досвіду тисяч розробників, і дійсно навчитися їх застосовувати можна тільки з роками. Тому для початку рекомендується просто завчити формальні визначення та схеми. З часом це формує стиль мислення, і ви будете застосовувати шаблони повсюдно. Найгірше — застосовувати шаблони заради шаблонів, це називається over-engineering.

Також раджу ознайомитись з парадигмами SOLID, головна з яких, я вважаю «S» — single responsibility principle. Все інше похідне від неї.

Front-end

Я не рекомендую читати найвідомішу ортодоксальну книгу з носорогом, яка називається «JavaScript: The Definitive Guide» (Докладне керівництво) by David Flanagan. Дуже академічний стиль викладу, дуже багато води і несуттєвих деталей. Звичайно, якщо ви розробник front-end фреймворків, то ця книга для вас. Але я все ж люблю більш практичний підхід. Найкраще, що є в Рунеті по Javascript, це JavaScript.ru і Learn Javascript.ru .

Інформації на цих ресурсах достатньо, щоб мати компетенцію на рівні middle front-end розробника. Звичайно, потрібен ще досвід володіння технологією та фреймворками, але я кажу лише про обсяг знань.

JQuery.page2page.ru — ресурс, який я рекомендую, якщо ви зіткнулися з JQuery. В наших реаліях досить старих проектів — це може бути актуально.

Освоювати Angular, TypeScript або React цілком можливо на сайтах з офіційної документації.

З того, що мені здалося дуже хорошим для вникання в React.js і сучасну інфраструктуру front-end розробки, це книга «Розробка веб-додатків в ReactJS» А. Хортона і Р. Вайса.

Допоміжні засоби

Дуже корисні розробникам будь-яких рівнів і напрямків. Елементарні завдання — зробити скрін — відправити колезі, записати відео — відправити клієнту — не повинні викликати труднощів.

Clip2net — утиліта, яка дозволяє на ходу домалювати щось на скріншоті і тут же його зберегти або відправити.

Jing — утиліта, що дозволяє в два кліка записати відео з екрану, завантажити хмара та видати посилання на його перегляд.

Також є онлайн-засоби для тестування невеликих шматків коду, наприклад, .NET скрипка некваліфікований робітник , або для регулярних виразів — RegExr .

Багато люблять LINQPad — текстовий редактор, що дозволяє тестувати LINQ2SQL або EF LINQ запити до бази і різні шматки коду без перекомпіляції важких громіздких проектів.

Системи контролю версій

Зараз в основному користуються git-подібними системами, так що вивчення контролю версій рекомендую почати саме з git.

Якщо ви думаєте, що робота з git це обов'язково заучування команд командного рядка — то це не так. Думаю, немає нічого поганого в тому, щоб використовувати візуальні клієнти. Це навіть простіше з точки зору вирішення конфліктів чи організації роботи з великою кількістю файлів. Наприклад, мені подобається SourceTree .

Для початку достатньо розуміти, що таке Repository, Branch, Pull, Commit, Push, Merge, Stash. Якщо хочете створити свій приватний репозиторій — можете використовувати BitBucket . Якщо хочете комусь показати свій код, то зручно буде створити публічний репозиторій на GitHub .

Stack Overflow

Я дуже рекомендую мати там аккаунт і задавати питання, також по можливості давати відповіді. Навіть поставлене запитання може принести вам рейтинг. Наприклад, один з моїх запитань набрав 10 000 переглядів, що дало мені золоту медаль і хороший рейтинг.

Цей рейтинг можна витрачати, виставляючи бонус за відповіді на ваші питання, на які ніхто не хоче відповідати. З бонусом ймовірність отримати відповідь зростає. Мене це кілька разів рятував, коли мені потрібно було терміново одержати відповідь. Я використовував бібліотеку, на яку майже не було документації, і запитати було ні в кого. В результаті мої запитання з часом дуже сильно зросли в рейтингу.

Методології розробки

Слід розібратися, що таке Agile-підхід, хоча б у теорії, можливо, вивчити «артефакти» Scrum.

Нещодавно IT Ukraine Association виклала документ з набором необхідних навичок для junior-фахівців . У своєму навчанні можна також орієнтуватися на нього. Методології розробки і реліз-менеджмент вже займають там важливе місце. Почати вивчати Scrum можна прямо з Wiki .

Ясна річ, що в реальному житті і реальних проектах все заточене під ситуацію, і деякими артефактами або процесуальними речами можна жертвувати. Але тим не менше треба розуміти, навіщо це було придумано і як це допомагає в роботі. Це свого роду фреймворк взаємин з клієнтом, щоб і для нього розробка була більш прозорою та прогнозованою, і команду не кривдили.


Бонус #3
Даю свій список питань для підготовки до співбесід , який я склав кілька років тому. Якщо відповісте на всі ці питання, можна сказати, що ви знаєте C#/.NET і Core-бібліотеки на впевненому middle-рівні.

Поради для розробників Middle/Senior рівня

Для читання таких книг бажано мати хоча б рік-півтора досвіду розробки, інакше гори теорії не знайдуть свій відгук у вашому сприйнятті.

C#

«C# in Depth» by Jon Skeet

Книга Джона Скиту, топового коментатора з Stack Overflow. Джон — професійний розробник на Java в Google, але це не завадило йому написати бестселер про тонкощі синтаксису C#.

Дуже детально розбираються нюанси синтаксису, різниця в поведінці в різних версіях .NET фреймворку і просто легко читається. Якщо Ріхтер — більше про .NET, то ця книга саме про тонкощі C# і про еволюцію цих мовних засобів.

T-SQL

«Querying Microsoft SQL Server 2012 by Dejan Sarka

Книга по підготовці до іспиту 70-461 від «Майкрософт». Більш структурного і виразного довідника по T-SQL я не знаходив. Теми дуже чітко розділені між собою, багато наочних прикладів, даються всі тонкощі синтаксису T-SQL. По суті, більше, ніж у цій книзі .NET розробнику, якщо він не є професійним Database developer'ом, знати і не потрібно.

Архітектура

«Patterns of Enterprise Application Architecture» by Martin Fowler

Ця книга — відправна точка у вивченні архітектури корпоративних додатків. В ній достатню кількість розглянутих фундаментальних засобів і понять.

«Enterprise Application Architecture with .NET Core» by Ganesan Senthilvel

Книжка дає розуміння про сучасні течії в архітектурі, розкриває поняття CQRS, DDD. Корисна для саморозвитку. Читати чи не читати — вирішувати вам. Такі підходи ви побачите не в кожному проекті, але важливо вміти оперувати категоріями і шаблонами, описаними там.

«Refactoring: Improving the Design of Existing Code» by Martin Fowler

Книжка Мартіна Фаулера. Дається дуже глибокий аналітичний підхід рефакторінгу і поліпшення існуючого коду.

Фреймворки

Якщо вас турбують питання продуктивності в старому-легасі проекті, а переписувати на чистий SQL ви не хочете — рекомендую гайд «Performance Considerations for EF 4, 5, і 6»

На Entity Framework можна писати досить продуктивний код, не вдаючись до допомоги Dapper'a або чистого ADO.NET або ж переписувати вже існуючий, оптимізуючи його.

Також кілька книжок по більш детальному розбору можливостей Entity Framework і продуктивності:

Наступні книги я не читав, але чув рекомендації від колег. Вони можуть допомогти, якщо перед вами стоять специфічні завдання у вузьких областях:

Огляд Open-source проектів

Перегляд того, як зроблені Open-source проекти , допомагає збагатити розуміння і дає можливість взяти собі кращі фішки.

І ще можете глянути самий знаменитий .NET Open-source E-commerce движок .

Чи потрібні сертифікати від Microsoft?

Вирішувати вам, в цьому питанні я не фахівець. Однак скажу свою думку.

Pros:

Можу відзначити посібник для підготовки до іспиту 70-461 як відмінний підручник, та й взагалі допомоги для складання іспитів з баз даних — чудові навчальні матеріали.

Cons:

Куди рости далі

Зростання компетенції людини можливий як в сторону софт скілів — організації процесу навчання новачків, коучингу, організації роботи команди, управління ризиками на позиції проектного менеджера або CTO, так і вузької спеціалізації — вміти робити більш складні речі, вивчати більш рідкісні технології або просто працювати в рази швидше інших.

Можу порадити читати книги для загального розвитку, а також розвитку навичок в суміжних спеціальностях. Наприклад, за методологією проектування UI можна ознайомитися з книгою проектувальника Apple — Джефа Раскіна «Інтерфейс. Нові напрямки в проектуванні комп'ютерних систем» .

Або ж вибирайте базові книги з проектного менеджменту: «Міфічний людино-місяць, або Як створюються програмні системи» Фредеріка Брукса.

Більш академічна література з проектного менеджменту — «Керівництво до зводу знань з управління проектами» .

Або ж можете записатися на курси Stratoplan . Сам переглянув пару штук, поліпшив розуміння процесів і людей у них. Про «Стратоплане» як про курси для менеджерів чую тільки позитивні відгуки.

Куди рухатися — вирішувати вам, але також варто обговорити з керівництвом, які фахівці більш актуальні конкретно у вашій компанії.

Відповіді на популярні питання

Відповім на кілька запитань, які часто переростають у холивары через нерозуміння повної картини розробки.

Потрібна програмісту математика та алгоритми?

Буває по-різному. У програмуванні є типові завдання, які вирішуються типовими методами. Ці методи можна назвати алгоритмами. Майже завжди все алгоритмічні задачі так чи інакше вирішені вже в якихось бібліотеках від сторонніх виробників, і розробникам залишається тільки використовувати їх. Так відбувається в 99% випадків.

Однак якщо ви працюєте над створенням унікальних технологічних речей — так, вам потрібно орієнтуватися. Те ж саме з математикою — як не дивно, але найчастіше вона потрібна в геймдеве або у вузькоспеціалізованому софті за розрахунками/прогнозування/машинного навчання і так далі. Крім того, робота з алгоритмами і математикою розширює розумові здібності і патерни мислення, що дозволяє швидко думати і міркувати.

Для входу в IT, думаю, з головою достатньо розуміти:

Якщо ви навчаєтесь/навчались в технічному вузі — то для вас це буде відносно нескладно. Але якщо профільної освіти немає і тяги до алгоритмів теж, розвивайте своє портфоліо на гітхабі, вчіться робити проекти і приносити результат.

І кілька холиварных питань :)

Що краще — Java або C#?

У світі розробки є більш або менш доречні засоби вирішити завдання, в тому числі важливий фактор — можливість знайти людей, які знають технологію, та їх ціна. Однозначної відповіді немає. На Java більше open-source, в C# більш модерний синтаксис. Java хоститься на Linux, C# вимагає Windows, хоча .NET Core розгортається на Linux, що робить його гарним вибором для микросервисов під безкоштовними системами управління базами даних, наприклад PostgreSQL або MongoDB. У всіх технологій є плюси і мінуси. Все залежить від конкретної задачі.

Ставити чи ні нижнє підкреслення для приватних членів класу?

Як хочете :) Проте якщо весь проект написаний в єдиному стилі, його простіше читати і члени команди звикають читати код швидше. «C# Coding Conventions (C# Programming Guide)» — дещо описано тут. Можна використовувати StyleCop і блокувати компіляцію проекту у разі невідповідності форматування. В цілому стандартизація підвищує швидкість і зрозумілість.

Що краще — SQL або NoSQL бази даних?

Знову таки відповіді немає — кожної задачі своє рішення. Технології — це лише інструментарій, вирішальний завдання. Очевидно, що зберігати дані аналітики з досить плоскою структурою і великим обсягом зручніше в NoSQL, а сутності, пов'язані сотнями зв'язків і обмежень, — в реляційній базі.


Навіщо ці питання? Своїми відповідями я хотів показати своє відношення до технологій і розробки в цілому. Не важливо, яким молотком ти заб'єш цвях. Важливий факт забиття цвяха під потреби клієнта, враховуючи його потреби та можливі ризики. Решта — деталі, які йому, по суті, і не потрібні.

Ось і все, якщо захочете зі мною зв'язатися, можете писати прямо на Facebook — Vladislav Furdak .

Опубліковано: 26/04/18 @ 10:08
Розділ Різне

Рекомендуємо:

Як скоротити ручне тестування і чи можна без нього обійтися
Розробник ядра та драйверів Intel — про входження в професію, "сушці" мізків і релокації в Фінляндії
DevOps дайджест #19: Jenkins X і DevOps інтернатура
Поради сеньйорів: як прокачати знання junior Ruby
Мій звіт про конференції Страйк 2018 в Ульяновську