Я пытаюсь изучить JavaScript и веб-разработку уже почти три года — у меня есть работа на полную ставку, я помогаю управлять баром, так что дайте мне немного послабления, хорошо. Я наконец-то нахожусь в учебном лагере по JavaScript и разработке полного стека и очень взволнован. Очевидно, мне еще предстоит пройти долгий путь, прежде чем я смогу убедить кого-то платить мне как разработчику, но одна вещь, которую я усвоил без сомнения, — это ценность псевдокодирования.
Мой бакалавриат был по истории, и в те дни я писал много черновиков (большую часть времени я предпочитал, чтобы самый первый черновик был сделан старой доброй ручкой и бумагой, смеется). Несколько профессоров внушали мне важность черновика — часто даже требовалось сдать первые черновики для получения оценки. Если бы вы попытались сразу же погрузиться в то, что, как вы предполагали, будет вашим окончательным черновиком, всего с несколькими правками, это было бы довольно очевидно для человека, оценивающего вашу статью.
Вывод заключался не в том, что «никто не настолько хорош как писатель», а скорее в том, что «качество вашего письма улучшается с каждым черновиком». К окончанию колледжа я понял, что чем больше времени вы потратите на набросок своего документа, тем меньше времени вам придется потратить на работу над окончательным вариантом.
Потратив много времени на несколько сайтов, посвященных проблемам игрушек, а совсем недавно в моем учебном лагере по программированию, я обнаружил, что то же самое верно и для написания алгоритмов. Сначала я просто погружался и начинал решать проблему, без плана, без ничего. Какой кошмар. Я потратил много времени, глядя на экран, не зная, где я нахожусь, что я пытаюсь сделать или куда движется мой код…
Теперь, спустя три года, я понимаю, что этот подход «стрельба от бедра», когда я сразу начинаю писать код, был/является чем-то вроде проблемы с моим эго. Это всегда горькая пилюля, которую нельзя проглотить за одну ночь. Я не шучу, когда говорю вам всем, что усвоил этот урок ТЯЖЕЛЫМ ПУТЕМ.
С тех пор мой подход изменился. Помимо того, что сейчас я обычно начинаю с серьезного сеанса записи на доске всех моих игрушечных задач, я начинаю каждую проблему с большой дозы псевдокодирования.
Мои замечательные инструкторы в моем учебном лагере научили меня начинать любую проблему с:
- Идентификация ввода
- Определение ожидаемого результата
- Определяем, какие ограничения у нас могут быть, если таковые имеются
- Определение наших пограничных случаев
Вот как это может выглядеть внутри функции-притворщика в текстовом редакторе:
//input : array //output : same array but with duplicates removed //constraints : must happen in place (cannot make a copy) //edge cases : empty arrays? Arrays containing all the same numbers? Non number values?
По сути, это переписывание подсказки своими словами, но к тому времени, когда я закончу с определением этих четырех пунктов, мое понимание поставленной задачи уже улучшится. Иногда неясно, какими именно будут пограничные случаи, поэтому много раз я возвращаюсь назад и добавляю случаи по мере их появления или смотрю на некоторые тестовые входные данные, чтобы получить лучшее представление о них. какие они могут быть.
После того, как я определил эти маркеры, я предпочитаю начинать с очень простого плана. Обычно я начинаю с перечисления шагов, которые, как я знаю, мне придется предпринять. Для этой проблемы это может выглядеть примерно так:
//iterate, loop or recursion? //compare elements, if matching remove one from the array //return the array
Даже с этим простым планом я немного лучше понимаю порядок, в котором мне нужно будет выполнить мой код, и теперь я могу начать заполнять детали.
Остальная часть моего псевдокода будет в основном просто работать над этими тремя строками.
Начнем с первой строки «итерация, цикл или рекурсия?» Я знаю, что хочу избежать вложенных циклов ради временной сложности, и у меня есть идея отслеживать элементы, которые я уже видел, чтобы я мог просто использовать один цикл. Мой план состоит в том, чтобы использовать хеш-таблицу для достижения этой цели. Я думаю, что хеш-таблица будет лучше, чем использование Array.prototype.includes(), поскольку это требует временной сложности, что потенциально может означать обход всего массива для каждого элемента, что в основном представляет собой вложенный цикл. Пока я перебираю массив, я могу сохранять уникальные значения в хеш-таблице, поэтому, если я проверю, находится ли мой текущий элемент в хэш-таблице, а это не так, я знаю, что хочу сохранить этот элемент в хеш-таблице и сохранить его в массиве. Если он уже есть в хеш-таблице, я знаю, что хочу удалить его из массива.
Сосредоточив внимание на одной строке своего плана за раз, я могу ясно представить себе, что я пытаюсь сделать на этом этапе, тем самым добавляя еще несколько строк в свой псевдокод.
//create hash table //iterate through array with a for…loop
Следующая строка — «сравнить элементы, если они одинаковые, удалить текущий из массива». Я упомянул логику, которую мне нужно будет использовать здесь, в предыдущем абзаце, но теперь давайте представим ее в виде псевдокода.
//check if current element is in hash table //if it is remove current element from array, use array.prototype.splice() //otherwise, it isn't, add it to hash table with a value of true
Мой псевдокод выглядит довольно хорошо… все, что осталось сделать, это вернуть мой массив после завершения цикла. Как только я это сделаю, у меня должно получиться что-то похожее на это…
//create hash table //iterate through array with a for…loop //check if current element is in hash table //if it is remove current element from array, use array.prototype.splice() //otherwise, it isn't, add it to hash table with a value of true //return array
Будь то курсовая работа, такая как «Обсуждение исторических предрассудков и влияние народной памяти: Евсевий на Константина», или алгоритм игрушечной задачи, такой как обход по спирали/улитке, время, которое вы потратите на свой черновик или псевдокод, окупится в виде дивидендов. когда дело доходит до вашего конечного продукта.
«Мы думаем на языке. Качество наших мыслей и идей может быть таким же хорошим, как и качество нашего языка». — Джордж Карлин
Привет, я новичок в этом! Если вы хотите следить за моим путешествием от бармена до разработчика, подпишитесь на меня. Когда-нибудь у меня даже будет время написать о барменстве! Я слышал, там деньги!🤣