- PVSM.RU - https://www.pvsm.ru -
Перевод статьи Валинды Чен [1].
Это сборник советов для разработчиков-новичков, которые смотрят на пустой экран и не знают, с чего начать. Нередко можно услышать от молодых разработчиков, работающих над решением каких-то задач в программировании, что они не уверены, за что нужно хвататься. Ты понимаешь саму задачу, логику, основы синтаксиса и так далее. Если ты видишь чей-то код, или тебе кто-то помогает, то можно всё сделать самому. Но бывает, что ты не уверен в своих силах, или поначалу тебе трудно реализовать свои мысли в коде, несмотря на то, что ты знаешь синтаксис и логику. Под катом — несколько советов по решению этой проблемы, которые помогут вам в повседневной работе.
Вы не сможете решить задачу, если не поймёте её. Есть разница между задачей и задачей, которую, как вам кажется, вы решаете. Можно прочитать первые несколько строк, а насчёт остального выстроить предположения, поскольку всё выглядит похожим на то, с чем вы сталкивались раньше. Даже если вы делаете популярную игру наподобие Виселицы, удостоверьтесь, что прочитали все её правила, пусть даже вы играли в неё раньше.
Иногда можно попробовать объяснить задачу другу и посмотреть, поймёт ли он ваше объяснение. Вы же не хотите пройти половину пути и обнаружить, что неправильно поняли требования. Так что лучше потратить в начале больше времени, чтобы всё прояснить. Чем лучше поймёте задачу, тем легче будет её решить.
Допустим, мы создаём простую функцию selectEvenNumbers
, которая берёт массив чисел и возвращает массив evenNumbers
с одними лишь чётными числами. Если чётных чисел в исходном массиве нет, то массив evenNumbers
возвращается пустым.
function selectEvenNumbers() {
// здесь ваш код
}
Какие вопросы можно себе задать:
Возьмите лист бумаги и пройдите по задаче вручную. Выберите не менее трёх наборов данных для проверки. Выберите предельно допустимые и крайние случаи.
Предельно допустимые случаи: проблема или ситуация, возникающая за пределами нормальных параметров функционирования. Например, когда одновременно несколько переменных или состояний среды имеют экстремальные значения, даже если каждый из параметров находится в своём специфическом диапазоне.
Крайние случаи: проблемы или ситуации, возникающие только при экстремальных (минимальных или максимальных) значениях параметров функционирования.
Вот, к примеру, несколько наборов данных для использования:
[1]
[1, 2]
[1, 2, 3, 4, 5, 6]
[-200.25]
[-800.1, 2000, 3.1, -1000.25, 42, 600]
Когда только начинаешь, то зачастую пренебрегаешь какими-то шагами. Поскольку наш
Давайте пройдём по массиву [1]
[1]
.
Теперь пройдём по массиву [1, 2]
[1, 2]
1
.2
.evenNumbers
и добавляем в него 2
.[2]
.
Можно пройти по задаче ещё несколько раз. Обратите внимание, что количество шагов в алгоритме для [1]
отличается от алгоритма для [1, 2]
. Поэтому рекомендуется проходить по нескольким наборам данных. Например, с единственным элементом; смесь целых и нецелых чисел; многоразрядные числа; наборы с отрицательными числами.
Поищите подходящие паттерны, может быть, что-то удастся обобщить. Подумайте, можно ли уменьшить количество шагов.
selectEvenNumbers
.evenNumbers
для хранения чётных чисел.[1, 2]
.evenNumbers
.Этот подход напоминает математическую индукцию [3]:
n = 1
, n = 2
, ...n = k
.n = k + 1
.
После проработки основных шагов напишите псевдокод, который можно перевести в настоящий код. Это поможет определить структуру кода, да и вообще облегчит его написание. Пишите псевдокод построчно. Это можно делать на бумаге или в виде комментариев в редакторе. Если вы только начинаете и считаете, что пустой экран выглядит жутковато или отвлекает, то лучше писать на бумаге.
В целом не существует правил для написания псевдокода, но можно включать синтаксис из вашего языка, если так будет удобнее. Но сосредотачивайтесь не на синтаксисе, а на логике и этапах алгоритма.
Применительно к нашему случаю есть много разных вариантов. Например, можно использовать filter
, но ради простоты примера воспользуемся простым циклом for
(однако при последующем рефакторинге мы ещё столкнёмся с filter
).
Вот пример псевдокода, в основном состоящего из слов:
function selectEvenNumbers
создаём массив evenNumbers и делаем его эквивалентным пустому массиву
для каждого элемента в этом массиве
смотрим, является ли элемент чётным
если чётный (при делении на 2 результат получается нецелым)
добавляем его к массиву evenNumbers
return evenNumbers
А вот псевдокод, в котором слов гораздо меньше:
function selectEvenNumbers
evenNumbers = []
for i = 0 to i = length of evenNumbers
if (element % 2 === 0)
добавляем его к массиву evenNumbers
return evenNumbers
Главное, писать код построчно и понимать логику каждой строки.
Вернитесь к задаче, чтобы удостовериться, что вы на правильном пути.
Когда ваш псевдокод будет готов, преобразуйте каждую строку в реальный код на вашем языке. Здесь мы воспользуемся JavaScript.
Если вы писали на бумаге, то перенесите всё в редактор в виде комментариев, а затем замените каждую строку.
Теперь вызовите функцию и дайте ей некоторые из ранее использованных наборов данных. Так можно проверить, возвращает ли код нужный результат. Также можете написать тесты для проверки соответствия выходных данных ожидаемому результату.
selectEvenNumbers([1])
selectEvenNumbers([1, 2])
selectEvenNumbers([1, 2, 3, 4, 5, 6])
selectEvenNumbers([-200.25])
selectEvenNumbers([-800.1, 2000, 3.1, -1000.25, 42, 600])
После каждой переменной или строки можно использовать console.log()
. Это поможет проверить, ведут ли себя значения и код так, как ожидается, прежде чем двигаться дальше. Таким образом вы выловите любые проблемы, не зайдя слишком далеко. Вот пример того, какие значения можно проверить при начале работы.
function selectEvenNumbers(arrayofNumbers) {
let evenNumbers = []
console.log(evenNumbers) // Удаляем после проверки выходных данных
console.log(arrayofNumbers) // Удаляем после проверки выходных данных
}
Ниже приведён код, полученный после обработки каждой строки псевдокода. Символы //
обозначают строки из псевдокода. Жирным выделен реальный код на JavaScript.
// function selectEvenNumbers
<b>function selectEvenNumbers(arrayofNumbers) {</b>
// evenNumbers = []
<b> let evenNumbers = []</b>
// for i = 0 to i = length of evenNumbers
<b> for (var i = 0; i < arrayofNumbers.length; i++) {</b>
// if (element % 2 === 0)
<b> if (arrayofNumbers[i] % 2 === 0) {</b>
// добавляем его к массиву evenNumbers
<b> evenNumbers.push(arrayofNumbers[i])
}
}</b>
// return evenNumbers
<b> return evenNumbers
}</b>
Уберём псевдокод, чтобы не путаться.
function selectEvenNumbers(arrayofNumbers) {
let evenNumbers = []
for (var i = 0; i < arrayofNumbers.length; i++) {
if (arrayofNumbers[i] % 2 === 0) {
evenNumbers.push(arrayofNumbers[i])
}
}
return evenNumbers
}
Иногда разработчики-новички настолько увлекаются синтаксисом, что им трудно идти дальше. Помните, что со временем вам будет проще соблюдать синтаксис, и нет ничего стыдного в том, чтобы потом при написании кода обращаться к справочным материалам для корректного соблюдения синтаксиса.
Возможно, вы заметили, что упрощение и оптимизация — это повторяющиеся темы.
«Простота — предпосылка надёжности».
Эдсгер Дейкстра, нидерландский учёный и один из первопроходцев в ряде областей информатики
В нашем примере одним из путей оптимизации будет фильтрация элементов в массиве посредством возвращения нового массива с помощью filter
. В этом случае нам не нужно определять переменную evenNumbers
, потому что filter
вернёт новый массив с копиями элементов, которые соответствуют фильтру. При этом исходный массив не изменится. Также нам не нужно использовать цикл for
. filter
пройдёт по каждому элементу, и если вернёт true, то элемент попадёт в массив, а если false
, то будет пропущен.
function selectEvenNumbers(arrayofNumbers) {
let evenNumbers = arrayofNumbers.filter(n => n % 2 === 0)
return evenNumbers
}
Может потребоваться несколько итераций упрощения и оптимизации кода, по мере того как вы будете находить новые способы.
Задавайте себе такие вопросы:
«Программы должны быть написаны так, чтобы люди их читали, и лишь во вторую очередь — чтобы машины их исполняли».
Джеральд Сассман и Гарольд Абельсон, авторы “Structure and Interpretation of Computer Programs”
Этот шаг необходимо выполнять в ходе всего процесса. Сквозная отладка поможет раньше выловить любые ошибки синтаксиса или недостатки логики. Воспользуйтесь преимуществами своего IDE (Integrated Development Environment) и отладчика. При обнаружении бага рекомендуется просматривать код построчно, стараясь найти неожиданные вещи. Несколько советов:
«Самый эффективный инструмент отладки — тщательное продумывание в сочетании с разумно размещёнными командами вывода на экран».
Брайан Керниган, профессор информатики в Принстонском университете
Через месяц вы можете и не вспомнить, что означает каждая строка кода. А тот, кто будет работать с вашим кодом, вообще этого не знает. Поэтому важно писать полезные комментарии, чтобы избежать проблем и сэкономить впоследствии время, когда придётся снова вернуться к этому коду.
Избегайте таких комментариев:
// Это массив. Итерируем его.
// Это переменная.
Старайтесь писать короткие, высокоуровневые комментарии, которые помогут понять, что тут происходит, если это не очевидно. Это пригодится при решении сложных задач, вы сможете быстро понять, что делает конкретная функция, и почему. Благодаря использованию понятных комментариев и имён переменных и функций вы (и другие люди) сможете понять:
Получайте отзывы от коллег, руководителей и других разработчиков. Читайте Stack Overflow. Смотрите, как другие решали аналогичные задачи и учитесь у них. Нередко бывает несколько способов решения задачи. Узнайте, что они собой представляют, и вам будет быстрее и проще приходить к ним самостоятельно.
«Неважно, насколько медленно вы пишете чистый код, вы всегда будете тратить больше времени, если пишете грязный код».
Дядя Боб Мартин, программный инженер и соавтор манифеста Agile
Даже опытные разработчики постоянно практикуются и учатся. Если вы получили полезный отклик, внедрите его. Снова решите задачу, или аналогичные задачи. Заставляйте себя. С каждой решённой задачей вы становитесь лучше как разработчик. Радуйтесь каждому успеху и не забывайте, как много вы уже прошли. Помните, что программирование, как и любая деятельность, со временем будет даваться всё проще и легче.
«Гордитесь тем, сколько вы прошли. Верьте в то, что пройдёте ещё больше. Но не забывайте наслаждаться путешествием».
Майкл Джозефсон, основатель Института этики Джозефа и Эдны Джозефсон
Автор: NIX_Solutions
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/262267
Ссылки в тексте:
[1] статьи Валинды Чен: https://codeburst.io/10-steps-to-solving-a-programming-problem-8a32d1e96d74
[2] мозг: http://www.braintools.ru
[3] математическую индукцию: https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D1%8F
[4] Источник: https://habrahabr.ru/post/335666/
Нажмите здесь для печати.