Як вчити .NET: детальна інструкція, vol. 2
Усім привіт, мене звати Влад і я займаюсь .NET розробкою понад 10 років. За цей час я встиг попрацювати на десятках проєктів у ролі сеньйор та лід-розробника, також провів велику кількість співбесід на різні рівні. 4 роки тому я написав статтю як вчити .NET, яка стала доволі популярним матеріалом серед початківців, що хочуть вивчати .NET технології. Також доволі корисною була стаття із загальними рекомендаціями для тих, хто тільки починає свій кар’єрний шлях в IT.
Тепер я зробив корективи і деякі поліпшення, щоб адаптувати матеріал до умов сьогодення. У цій статті наголос зроблено на базу мови C# й платформи .NET + на веброзробку. Якщо ви хочете писати для desktop або мобільних — думаю, зможете знайти ці матеріали в інтернеті без проблем.
План для вивчення C#
У цій Гугл-таблиці можна знайти такі вкладки:
- C# 5 basics — базові теми з синтаксису C#. Пропоную початківцям вивчати базу, разом зі старим синтаксисом включно, щоб ви не губились у коді, написаному давно. Якщо ви зараз не розберетесь у базі добре, то потім навряд матимете на це час. В процесі самонавчання не забувайте про LINQ, варто знати всі методи.
- C#
6-11 фічі , які були додані в C#, починаючи з 2015 року. У документі я зібрав усі фічі за категоріями й додав посилання, де можна подивитись/ почитати. Рекомендую розглядати нові фічі як «патч» базових знань. Можете вивчити їх стовпчиками послідовно, у рамках якогось контексту, наприклад: сьогодні ви вивчаєте все, що стосується структури програми та using’ів, завтра — все, що стосується структур даних та колекцій. Проте, якщо у вас на проєкті зафіксована не найновіша версія C#, то ви можете сконцентруватись тільки на актуальних для вас фічах. Таким чином за2-3 тижні ви вивчите всі останні апдейти мови.
Можливості мови, що стосуються некерованого коду, вивчати не обов’язково. Вони мають доволі вузьку нішу застосування і вам це скоріш за все не знадобиться. А якщо знадобиться — знаєте, де шукати інформацію.
- Базові знання про середовище виконування в .NET CLR (Common language runtime). Власне базові знання про те, як .NET-платформа працює всередині. У таблиці поділені .NET Framework та .NET Core / .NET 5+. З появою нових версій фреймворка та runtime, дещо сильно змінилось, і те, що було актуально для .NET 4.8 вже не актуально для .NET 5 (наприклад, Application Domains).
- Базові знання бібліотек класів (BCL) — перелік найпопулярніших класів з .NET, які допоможуть вам у рутинній роботі.
- Патерни проєктування — зібрані найпопулярніші патерни проєктування, які можуть стати вам в пригоді. Деякі з них вже не так актуальні, інші має сенс знати, якщо ви вже не trainee. Пропоную розглядати патерни як ідею, а не як рішення. Патерни — це мова, яка розповідає про імплементацію, але у сучасному C# більша частина патернів вже вбудовані на рівень мови/фреймворків, і імплементувати їх окремо не потрібно. Однак знати про них необхідно, виключно з точки зору термінології. Наприклад, нема сенсу реалізовувати Singleton, коли можна використати Singleton scope у вашого IoC-контейнера. Або, наприклад, патерн Observer/ Iterator вже має мовні засоби в C# у вигляді подій та переліків.
- Різні корисні посилання і матеріали — сюди я буду додавати різні курси, статті, книги, які мені здалися корисними.
Що змінилося у вимогах для початківців
Знання лише мови C# мало, необхідно також вміння працювати з фреймворками/інфраструктурою. Ваш джентльменський набір може бути таким:
- ASP.NET Core.
- EF Core.
- XUnit або NUnit, розуміння що таке интеграційні/юніт тести, методологія AAA.
- Базовий SQL: SELECT запити, зміни даних, створення/зміна таблиць.
- Вміння запускати docker-контейнери та docker-compose файли. Базові навички володіння докером, уміння писати нескладні докерфайли.
- Базове володіння git’ом.
Зовсім круто буде, якщо ви розберетеся з тим, як реалізовувати розгортання програми за допомогою CI/CD пайплайнів. Можете використовувати Gitlab pipelines / Github actions, або навіть щось із хмар, на кшталт Azure pipelines.
Деплоїти можете в Heroku або налаштувати свою Linux VM з нуля. Найдешевші Linux машинки тут.
Додаткові компетенції
Бази даних
У цьому документі я зібрав необхідний мінімум базових знань з T-SQL / MS SQL Server. Де та як вивчати, вирішувати вам, можу запропонувати такі матеріали:
- Початковий рівень: непоганий сайт-підручник з основ.
- Середній рівень: книга з написання запитів на T-SQL.
- Розвинений рівень: найкращий підручник з базового SQL, на мій погляд.
Однак, останнім часом, особливо з поширенням мікросервісної архітектури, все популярнішим стає MySQL / PostgreSQL. Але вивчивши базу SQL за MS SQL Server, вам буде легше розібратися в будь-якій SQL-подібній мові. Проте не варто гнатися за усіма базами даних, рекомендую спочатку вивчити Microsoft стек.
Розуміння роботи аутентифікації та авторизації
Доволі важливо розуміти, як працює аутентифікація та авторизація, що таке Bearer & JWT токени, які бувають постачальники аутентифікації: asp.net idetntity, Identity Server, 3rd party сервіси.
Непоганий курс на Udemy з теми, проте він не для зовсім початківців.
Контейнеризація
Сучасна розробка практично неможлива без контейнеризації.
По docker та docker-compose можу порекомендувати офіційну документацію:
- Dockerfile reference.
- docker-compose guide.
Або відеокурс з Udemy про docker & docker-compose. Однак, для початківців достатньо розуміти, як запускати/ зупиняти/ збирати Docker-контейнери та Docker-compose файли.
Front-end
Якщо вам подобається front-end й у вас багато вільного часу, то можете базово вивчити якийсь з фреймворків. Для цього підійдуть курси типу цих:
Раджу платні курси на Udemy. Але це не обов’язково, щоб розвиватись як junior .NET. Якщо часу не так багато, то раджу сконцентруватися саме на back-end частині.
Як набувати практичних навичок
Я виокремив такі етапи навчання:
Етап 1. База синтаксису
Тут ваше завдання засвоїти синтаксис мови C# без реальних завдань. Це можна робити, просто реалізуючи кожну фічу в IDE окремо, експериментуючи з поведінкою.
Потім можна братися до складніших завдань.
Я створив документ, де зібрав кілька завдань для самостійного опрацювання. Реалізуйте всі завдання та залийте код на github.
Також можу порекомендувати CodeWars для вправ з кодом.
Ще один сайт, що допомагає вивчати програмування в ігровому стилі, — CodeEasy.
Особисто я вивчав синтаксис, просто експериментуючи в IDE, без сторонніх сервісів, ставлячи собі питання, і знаходячи відповіді в книгах та в офіційних специфікаціях.
Етап 2. База фреймворків
Почати можна з ASP.NET Core та EF Core. Який тип матеріалів використовувати — вирішувати вам.
Це можуть бути як статті з docs.microsoft, так і курси з Udemy або книги. Кожен шукає свою зручну форму самонавчання.
Щодо курсів на Udemy — я б радив шукати курси з найбільшою кількістю покупок + найбільшою тривалістю. Рев’ювери Udemy стежать, щоб структура курсу була максимально зрозуміла для студентів, інформацію можна засвоювати маленькими блоками.
Етап 3. Нескладні завдання на фреймворках
Ось, наприклад, нескладна задачка для проєктування API. Аналогічно можете вигадати й собі проєктування бази даних на Entity Framework з підходом CodeFirst з EF міграціями. Потім реалізувати те саме, але у підході зі створенням бази даних через чистий SQL.
Етап 4. Pet-проєкт
Настав час писати свій проєкт. Завдання: створити закінчений продукт, це в рази більше, ніж лабораторна робота.
Цим продуктом не обов’язково може бути вебдодаток, хоча це було б ще краще. Ви можете реалізувати API для своєї вебпрограми, припускаючи, що під нього можна без проблем реалізувати front-end.
Але головне тут — розділяти етапи розробки, щоб коли ви працюєте над ними, ви чітко розуміли свої завдання, щоб кожне завдання для вас було прозорим.
Наприклад: для початку ви малюєте макети, щоб зрозуміти, як виглядатиме потенційний front-end. Тут вам допоможе Balsamiq, Ninjamock, Axure або будь-які інші засоби, навіть на листочку. Прототипуючи свій проєкт, ви навчитеся бачити користувальницькі кейси цілком і зможете їх явно формалізувати.
Як приклад: можете взяти будь-яку E-commerce систему або клон Instagram, чи й взагалі придумати щось своє. Головне тут — мати розуміння, що це буде і як цим користуватися.
Наступним етапом опишіть бізнес-логіку, тобто, які дані ви виводите на екран, які дані відправляєте на сервер, яка послідовність користування. Розбийте все на сторінки, а сторінки — на окремі фічі (тобто конкретні функції).
Починайте проєктувати API під уявний front-end, емулюючи повернення реальних результатів роботи.
Далі розробляйте схему бази та бізнес-логіку навколо неї. Досить зручно користуватиметься Postman під час розробки. Також можна писати інтеграційні тести в окремому проєкті, щоб проходити ланцюжки типових юз-кейсів.
Етап 4.1. Рефакторинг pet-проєкта
На попередньому етапі головне завдання було зробити так, щоб ваш проєкт просто коректно працював, ми ще не говорили про дизайн коду.
Тепер настав час виправити косяки, показати більш досвідченим товаришам свій код та попросити зворотний зв’язок. А якщо товаришів у вас небагато, то вступайте до мого .NET ком’юніті. Там більш як 1000 .NET розробників, які зможуть відповісти на запитання / допомогти.
Етап 5. Розгортання pet-проєкта
- Розгорніть ваш проєкт, бази даних на віддаленому сервері.
- Налагодіть CI/CD, для початку це можна зробити навіть у візуальному дизайнері Azure DevOps, але я б рекомендував навчитись писати YAML скрипти для розгортування.
- Напишіть інтеграційні тести.
Загальні рекомендації
- Поки є час — вивчайте мову якісно та глибоко, потім часу не буде.
- Інтернатура — хороша точка входу, у найкращому випадку, вас потім візьмуть на роботу, в іншому — отримаєте досвід. Моніторьте DOU та інші сайти щодо інтернатур.
- Безкоштовна/ малооплачувана робота краще безкоштовного неробства, навіть поганий досвід краще ніякого досвіду, але врахуйте, що приходячи на інтерв’ю у велику компанію, у разі вашої невдачі вас навряд повторно запросять у найближчі 6 місяців.
- У вас має бути ключова компетенція, те, що ви знаєте найкраще. Так, потрібно знати широкий спектр питань, включаючи фреймворки, інфраструктуру тощо, але має бути щось, що ви знаєте найкраще. Для C# програміста це може бути мова C#.
Рекомендації книг та курсів
Синтаксис С#
- Офіційна документація з C#.
- Непоганий базовий туторіал з C#.
- Книга про асинхронне програмування в C#.
- C# in Depth, Fourth Edition (Jon Skeet) — базова книга з синтаксису C#.
LINQ:
Поради щодо написання коду:
Ресурси з вивчення C#:
Патерни проєктування:
- Список патернів, але рекомендую ставитися до патернів не як до фрагментів коду, які «треба» запихувати собі в проєкт, а як до своєрідної ідеї, яка може бути реалізована різними способами. Автор навів свою імплементацію в прикладах, але ваша може бути іншою. Багато патернів уже не варті ручної імплементації. Наприклад, замість Singleton, у нас є Singletone scope у стандартного IoC контейнера в .net core, але в підручнику все ще дається Signleton
10-річної давності з подвійним блокуванням.
Архітектура:
Робота CLR
- CLR via C# (Developer Reference) by Richter Jeffrey — книга описує поведінку .NET Framework 4.5, багато з цього буде так само актуально для .NET Core / 5+.
Книга про все на базовому рівні: мова, бібліотека класів, фреймворки, веб, мобайл, ML:
- C# 8.0 and .NET Core 3.0 — Modern Cross-Platform Development: Build applications with C#, .NET Core, Entity Framework Core, ASP.NET Core, and ML.NET using Visual Studio Code, 4th Edition 4th Edition.
Скоріше для ознайомлення з різними аспектами розробки.
ASP.NET Core
- Базовий гайд з ASP.NET Core.
- Імплементація API через контролери.
- Довідка з Minimal API (альтернатива контролерам).
EF Core
ASP.NET Core MVC
ASP.NET Core 6.0 Course — MVC — Blazor — Razor — EF Core — курс, орієнтований на вивчення серверного Razor, клієнтського Blazor, а також шару даних.
Що змінилося в .NET-розробці та необхідних скілах розробників за останні 10 років
Докладніше ви можете почитати мій торішній матеріал на цю тему, але якщо коротко:
• C# став використовувати більше функціональних прийомів розробки: Pattern matching, Багато LINQ, імутабельність.
• Асинхронний код.
• Стала популярнішою веброзробка.
• Став лаконічнішим API для розробки вебзастосунків.
Як обирати курси з розробки
Загалом на питання йти чи ні на курси маєте відповідати ви самі. Якщо у вас багато часу та мотивації — цілком можете впоратися і самостійно, організувавши навчання та практику. Якщо у вас є основна робота, а часу замало — можна підключити професіоналів, які вам у цьому допоможуть.
Дисклеймер: не запитуйте мене, які курси кращі, я не знаю, тому що ніколи не навчався на курсах. Але я можу дати спільні рекомендації, як обирати курси під себе, ґрунтуючись на досвіді інших людей.
Загальні критерії курсів, на мій погляд, які здатні довести людину до ринкового стану:
- Розгорнута програма. Вивчення як C#, так і прикладних аспектів: бази даних, веб або інша розробка, фреймворки. Допускається, якщо в рамках центру навчання будуть різні курси, пов’язані між собою загальною послідовністю.
- Буде добре, якщо вам дадуть якесь розуміння роботи черг, розподілених систем, засобів розробки, якщо напрямок курсів веб.
- Велика кількість практичних завдань, а також навчальні проєкти. В ідеалі — робота в команді.
- Тривалість хоч би
4-6 місяців. - Постійне спілкування з менторами, отримання зворотного зв’язку. Важливо, щоби ментори мали комерційний досвід розробки.
Результатом закінчених курсів має стати вміння розробки проєктів будь-якої складності end-to-end з розгортанням, без використання складних архітектурних патернів. Питання якості коду і підтримуваності тут другорядне.
Як вивчати англійську швидко
Я нерозривно пов’язую англійську з розробкою, важливо вміти спілкуватися/писати/читати, щоб не залежати від клієнтів на локальному ринку.
Завдання, яке я вирішую своїми наступними рекомендаціями, — це максимально швидка підготовка людини до ринку праці, а не академічність навчання.
Проблема у вивченні англійської досить часто пов’язана з тим, що викладачі англійської вчать, як бути викладачем англійської, завантажуючи вас правилами, але говорити від цього ви не почали. Зазвичай ці люди знають мову вже з дитинства, і ті речі, які видаються вам складними, для них вже очевидні давно.
Я вважаю, що первинна мова — це вербальна. Якщо ви вмієте говорити, то зможете писати. Якщо ви можете тільки писати, говорити не зможете. За розмови відповідають інші зв’язки у мозку.
Мова = слова + шаблони мови + вміння їх слухати та говорити. Правила в мові — це скоріше шаблони, які потрібно завчити, без пошуків зайвих закономірностей. Забудьте про 24 часи. Часів у мові всього 3. Решта — це відтінки сенсу.
В англійській мові зміст частіше передається службовими словами та порядком слів, ніж у нашій. У мові працює лише те, що ви довели до рефлексу. Для створення мовної бази для спілкування потрібно знати багато слів. Вивчати слова логічніше за рівнем їхньої потрібності у мові, тобто за частотним словникам.
Користуватися мнемонічними техніками не можна, треба зубрити. Вчити буде складніше, але так наш мозок навчиться їх діставати швидше, без зайвих адресацій.
Ось декілька частотних словників вартих вашої уваги:
Професійні ж терміни ви можете підхопити з тредів на Stackoverflow або статей на Medium.
Потрібно багато спілкуватися. Мінімум 3 рази на тиждень по 1 годині. Краще більше. Також вам потрібно спілкуватися з собою під час внутрішнього діалогу, навчаючись висловлювати ваші типові смислові конструкції новою мовою. Важливо, щоб викладач не заважав вам, а допомагав, коригуючи, але не перевантажуючи.
Для спілкування краще обирати або дотичні теми або заздалегідь відомі вам. Погано, коли в спікінг-клабах вам нав’язують спочатку особисту або тему «що ви робили вчора ввечері». Якщо ви не хочете це обговорювати — ви думатимете своєю мовою, щоб потім перекладати англійською, і це погано. Результат, який нам потрібен — це думати ВІДРАЗУ англійською. Цей процес нагадує закипання чайника. Потрібно якийсь час прогрівати себе, потім відбудеться кипіння і ви зможете відразу перемикатися на англійську, думаючи вже нею.
Англійську мову найкраще практикувати рано вранці, коли ви не встигли достатньо прокинутися і ваша критична частина свідомості не заважатиме вам.
Не бійтесь виглядати безглуздо під час практики, це не допоможе досягненню результату.
Один з хороших методів на розвиток слухання: слухати дитячі казки англійською. Вони не рясніють надмірно складною граматикою і лексикою, слова в них вимовляють чітко. У своєму навчанні ми повинні пройти умовний шлях дитини, тільки з більшою усвідомленістю, тож проходимо 10 років за 1 рік.
Для прокачування вміння спілкуватися, можна слухати та перекладати подібні відео з субтитрами:
- GitLab [REGitLab Meeting — Engineering (Public Stream).
- Coding Interview | Software Engineer @ Bloomberg (Part 1).
Це дуже схоже на звичайні робочі дзвони.
Щоб розвинути правильний акцент, вам потрібно сформувати «маску» вимови. Не бачу сенсу не вчитися робити це відразу, щодо мови. Логічно вчитися правильно вимовляти слова відразу, ніж потім роками переучувати себе. Бачив багато викладачів, не здатних говорити з правильним акцентом, але наше завдання — не навчати мови, а використовувати її. Ось непоганий мануал з вправами.
Дуже важливо розуміти, що в англійській язик примикає до піднебіння у стані спокою, деякі звуки вимовляються горлом, наприклад «h». Загалом після кількох тижнів практики можна привчити себе говорити анатомічно правильно, що створить правильні звуки. Найпростіше вибрати якогось персонажа, наприклад ведучого CNN та його копіювати, — це, на мою думку, найшвидший шлях навчання.
Отже, щоб швидко вивчити мову, нам потрібно:
- Багато нею спілкуватися.
- Постійно розширювати словниковий запас та використовувати його.
- Багато читати й слухати.
Вивчення граматики — це лише інструмент ускладнення мови, здатності виражати відтінки сенсу, але не центральний чинник. Однак, якщо ви хочете скласти міжнародні іспити на формальне володіння мовою, вам доведеться добре вивчити і граматику теж.
За рекомендаціями людей, можу порадити декілька сервісів для початку вивчення англійської:
Непогано підходять для зовсім початківців.
Наостанок
Вступайте в .NET ком’юніті, в якому вже понад тисячу учасників. Обговорюються теми з .NET, обговорення різних курсів, більш досвідчені хлопці, серед яких і я, даємо поради початківцям.
Також у мене є закрита спільнота для досвідчених сеньйорів, техлідів і архітекторів, якщо хочете туди потрапити, напишіть мені. Також звертайтесь із запитаннями про .NET на Facebook.
113 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів