С некоторыми сожалениями

Я присоединился к программе Udacity Intermedia javascript Nanodegree 3 апреля 2021 года и закончил ее 20 июня 2021 года. Первая часть заняла не так много времени, всего около недели, поэтому я подумал: «Хм, это будет легко закончить. Может быть, я смогу закончить его за 3 недели?» К сожалению, это была очень наивная мысль. Со временем другие развлечения (книги, не связанные с работой, выпивка и т. д.) все больше отвлекают меня от курса, поэтому закончить курс за два дня до окончания семестра едва ли удалось.

Самая основная причина, по которой я начал проходить курс, заключалась в том, что моя нынешняя компания поддерживает плату (как просто!). Тем не менее, я услышал небольшое предупреждение о том, что корпоративная лицензия, выплачиваемая Udacity, довольно высока, поэтому, пожалуйста, будьте осторожны при прохождении курса. Я люблю такое слово. Если деньги имеют отношение, даже если они не мои, это может обеспечить вам некоторую продуктивность.

Другая причина в том, что я хочу переосмыслить теоретические концепции JS. Это может звучать как оправдание, но, поскольку я был занят закрытием проблем Github, чтобы поддерживать проект в рабочем состоянии, я иногда не погружался глубоко в теорию и был зациклен на сроках. «Я повторю это в будущем!» — В итоге ничего не происходит. И если вы продолжаете поддерживать один проект более года и привыкли к архитектуре, вы можете легко понять, где исправить или создать, не задумываясь. Это заставило меня чувствовать себя плохо, потому что я чувствовал себя идеально приспособленным разработчиком для этого проекта. Без определенного фреймворка или библиотеки я хотел прекрасно провести время с vanilla JS.

Эта программа состоит из трех частей: объектно-ориентированный Javascript, функциональное программирование и асинхронное программирование. Все строки кода, которые я видел в прошлом, были полезны во время прохождения курса. Но пока я вспоминал строки кода, я понял, что концепция ООП — это то, с чем я не так часто сталкивался в работе, как с FP или AP. Напротив, часть FP & AP было нетрудно закончить, потому что я потратил на нее достаточно времени во время работы.

Внутренние мысли

Объектно-ориентированный JS

Я узнал об ООП, изучая Java в университете. Тем не менее, у меня действительно не было возможности применить эту парадигму к JS в работе, особенно используя или настраивая «прототип» напрямую или применяя шаблон миксина. Поэтому я просто создал компоненты React с модульной функцией (например, маршрут, контейнер, элементы и т. д.) на стороне внешнего интерфейса и объединил их.

В книгах по JS много говорится об ООП, на самом деле я не так много видел в кодовой базе по работе, поэтому я переосмыслил взаимосвязь между концепцией, которую легко спутать, и отличной темой для обсуждения. книга или лекция» и концепция, которая на самом деле много используется в реальной работе. Или, может быть, потому, что я был в той части, которая использует внешние библиотеки npm для быстрой реализации пользовательских веб-сервисов. Я не знаю. Но, по крайней мере, я видел довольно много модульных паттернов.

Сначала мне было трудно понять прототип, потому что в нем говорилось, что ООП в JS может быть реализовано с использованием прототипа, и этот язык, основанный на прототипах, отличается от языков, основанных на классах, таких как Java, но в настоящее время вы можете использовать класс. в JS, благодаря улучшению спецификации. Да, кстати, будьте осторожны, потому что класс в JS — это синтаксический сахар прототипа с некоторыми отличиями! Так что я не мог расслабиться ни на одном этапе мыслительного процесса и постоянно беспокоился о том, что станет следующим препятствием. Раньше было немного сложно понять, почему люди, которые привыкли использовать Python, C, C++ или Java, резко нападают на JS, но теперь я могу понять.

Иногда я не понимаю смысла объектно-ориентированного программирования с помощью JS, состоящего из объектов, за исключением примитивных значений. Похоже, я прохожу ориентированное на программистов обучение, чтобы стать программистом, хотя я уже программист. Ладно, хватит жалоб.

Когда я читал книгу Кайла Симпсона Вы не знаете JS — это и прототип объекта, в начале главы 6 был абзац:

В этот момент часто возникает вопрос, почему это должно быть так сложно, чтобы сделать что-то, казалось бы, такое простое. Теперь, когда мы приоткрыли завесу и увидели, насколько все это становится грязным, неудивительно, что большинство JS-разработчиков никогда не погружаются так глубоко, а вместо этого передают такой беспорядок в библиотеку «классов», чтобы справиться с этим за них.

Поэтому он смело ныряет в мир прототипов. Главы 4 и 5 объясняют, как разработчики пострадали от ООП JS, а глава 6 учит нас тому, как мыслить в стиле прототипов объектов JS. Я не мог понять, почему он отказался применить способ мышления о других языках ООП к JS, когда я впервые прочитал эту книгу два года назад, но я рад, что теперь я медленно начинаю понимать аргумент.

Важно подумать о разнице между наследованием на основе классов и наследованием на основе прототипов. Самая большая разница заключается в том, можно ли расширить свойство во время выполнения или нет. Это возможно в наследовании на основе прототипов, поэтому существует высокая вероятность путаницы, если произойдет какое-либо непредсказуемое расширение. Но я бы не сказал, что это хороший аргумент в пользу отношения к прототипу как к корню зла, потому что вы можете получить архитектурную гибкость.

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

Неизменяемая структура данных

Клянусь, я посещал занятия по структуре данных на втором курсе, но не могу вспомнить неизменную структуру данных. Может быть, я не интересовался ds в то время. (Теперь вы можете увидеть вред, когда вы посещаете неинтересный класс.) В разделе функционального программирования есть объяснение библиотеки Immutable.js, и она включает в себя плюсы неизменяемой структуры данных, но я не мог полностью понять почему это хорошо.

Чтобы восполнить свое невежество, я показал видео JSConf о функциональном программировании Анджаны Вакил и опубликовал статью, надиктовав видеоконтент в текст. Мне нравится ее дружелюбная манера говорить. Пока мы обменивались электронными письмами, чтобы получить одобрение на перевод, она любезно предложила твитнуть о моей статье и спросила, есть ли у меня ручка для твиттера. К сожалению, нет, но я уже оценил одобрение. Недавно она записала мастер-класс по FP, его можно посмотреть на FE Masters.

Очередь задач: макро и микро

Нельзя говорить об асинхронном программировании, не упомянув цикл обработки событий. Но жаргон плавал в моем мозгу. Есть очередь задач, и тайминги, когда общий синхронный код, setTimeout или промис отличаются друг от друга. Вот и все. Это то, что я знал. Если вы видите слайд презентации или статьи о цикле событий, он часто представляется как символ бесконечности (∞), потому что он буквально бесконечен. Однако я не знал, что «очередь макрозадач» и «очередь микрозадач» выполняют разные роли. (Недавно я гуглил объектив DSLR, поэтому «макро» и «микро» было нетрудно понять.)

Очередь микрозадач имеет дело с обещаниями (или асинхронными и ожидающими) задачами, в то время как очередь макрозадач обрабатывает все задачи, кроме обещаний. Когда стек вызовов движка JS пуст, выполняется самая старая задача (то есть скрипт) в очереди макрозадач, очередь микрозадач выполняет все свои задачи, задача в очереди микрозадач завершается, и браузер отображает ее содержимое. Цикл событий повторяет этот процесс бесконечно. Более подробные пояснения можно найти на сайте Javascript.info. Лично я люблю этот сайт из-за элегантного объяснения сложных концепций JS.

Обещание и асинхронное/ожидание использования

У меня был странный стереотип: «это выглядит просто ужасно, если смешать Promise с async/await в кодовой базе». Будьте последовательны», что заставляет меня использовать только async/await. Однако иногда это выглядит нормально и даже лучше контролирует поток. Например, если вам нужно иметь дело с «разрешить» или «отклонить» в середине блоков кода, тогда Promise будет лучшим выбором. Такая жесткость в этом случае тоже не поможет.

Вещи, которые я использовал в проектах

  • Детали HTML и элемент сводки: однажды я видел статью о создании модального компонента с использованием этих двух элементов из информационного бюллетеня разработчиков, например эта. Во втором проекте я хотел сделать полностраничную галерею изображений с модальным окном, и мне пришла в голову эта статья, поэтому я использовал эти два элемента. Реализация была очень удобной. (Одно большое предостережение: IE их не поддерживает.)
  • Модули JS: необходимо организовать файлы JS по модульному принципу, но мне было лень настраивать webpack, babel или что-то еще для сборки. Я использовал тег script с атрибутом типа модуля, чтобы включить эти модули в мой файл index.html. MDN предоставляет отличную документацию.
  • Fetch API: мне также было лень настраивать какие-либо пакеты или инструменты для получения API, поэтому я просто использовал собственный API извлечения. IE тоже не поддерживает это. Согласно MDN, разница между XMLHttpRequest и Fetch API заключается в том, что Fetch API предоставляет лучшую альтернативу, которую можно легко использовать с другими технологиями, такими как Service Workers.

Другие

Что мне понравилось

  • Когда вы отправляете проект, вы получаете обратную связь и получаете или не получаете результаты. Обратная связь была весьма полезной, и время ответа было быстрым. Я всегда делал проект по выходным, но рецензент присылает отзыв не позднее, чем через час. Рубрики проекта также очень понятны, поэтому не нужно тратить время на то, чтобы выяснить, что рецензент действительно хочет увидеть в моем проекте.
  • Между лекциями есть много викторин и итоговый проект, так что это более эффективный способ изучения программирования, чем просто чтение книги и выполнение некоторых проектов самостоятельно. Поэтому я рекомендую этот курс тем, кто не хочет тратить много времени на размышления о том, чтобы сделать его практикой.
  • Каждая глава состоит из видео и текста для обобщения на одной странице, поэтому это меньше отвлекает, чем переключение между слайдом презентации и видео.

Что мне не понравилось

  • Кажется, что в последних частях легче найти опечатки, чем в самой первой части. Я отправил несколько опечаток в систему обратной связи, но до сих пор не получил ответов. Я надеюсь, что в других, более популярных программах наностепеней меньше опечаток.

Советы

  • Программы Nanograde всегда в продаже. Не спешите записываться, когда увидите что-то вроде «Скидка 75%» на странице курса. Эти события всегда возвращаются.
  • Если вы застряли во время выполнения проекта, перейдите в репозиторий шаблонов проектов Github и обратитесь к проблемам, открытым другими студентами в прошлом. В репозитории есть устаревший код. Если вы привыкли исправлять их, ничего страшного, но некоторым может потребоваться некоторое время, чтобы найти решение самостоятельно.
  • Я видел сообщение на Reddit, что плата за наностепень постоянно растет, но объем поддержки студентов сокращается. Другие МООК-сервисы или онлайн-платформы для обучения программированию предлагают аналогичные виды лекций, поэтому я не уверен, стоит ли проходить курс, даже если плата превышает бюджет. Но если вы хотите получать обратную связь от проектов 1:1, то, возможно, этот курс будет лучше, чем другие платформы, которые не поддерживают обратную связь.
  • В каждом модуле указано примерное время обучения, но, пожалуйста, умножьте примерно 1,5 на письменное время и думайте об этом как о реальном времени, чтобы завершить модуль, когда это новый предмет для вас.

Закрытие

Я не полностью посвятил свои 3 месяца курсу, но это была отличная возможность поразмышлять над концепциями, о которых я не думал глубоко. Я рекомендую эту программу людям, которые хотят проводить время так же, как и я! Удачного кодирования 👩‍💻✨