Задачи и упражнения на программирование: есть ли разница?

0
1391
views

Перевод статьи «Do You Solve Programming Problems or Complete Exercises?»

Люди часто считают слова «упражнения» и «задачи» («проблемы») взаимозаменяемыми. Но между ними есть разница, и весьма существенная.

Пол Зейц, профессор математики в университете Сан-Франциско, проводит разграничение между этими двумя словами.

Умножьте 5х5. Это легко и это — упражнение. Так же, как и 5490,9×496. Второй пример немного сложнее и займет у вас больше времени, но в принципе вы знаете, что нужно делать. Это ключевой момент.

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

А с задачами ситуация иная. Задача, по словам Зейца, это «математический вопрос, на который вы не знаете, как ответить, по крайней мере, не знаете сразу».

Профессор Зейц определяет упражнения и задачи с математической точки зрения, но эти определения вполне подходят и для программирования.

Работая программистами, мы ежедневно применяем наши навыки решения задач: когда занимаемся отладкой кода, когда изучаем новую тему и даже когда разбираемся с возникающим проблемами. Упражнения тоже занимают определенное место в нашей жизни, но для программиста они не являются равноценной заменой решению задач.

Упражняйтесь при помощи упражнений

Есть два способа, которыми вы можете извлечь пользу из упражнений. Во-первых, они весьма полезны при изучении новых тем.

Сейчас я занимаюсь изучением JavaScript и использую для этого как упражнения, так и задачи. Упражнения помогают мне увидеть шаблоны и свыкнуться с концепциями и синтаксисом.

Вот пример упражнения от проекта LambdaSchool. В нем мне нужно было написать функцию, которая принимала бы массив машин.

const cars = [
  { id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 },
  { id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 },
  { id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 },
  ...
 ]

Мне нужно было отсортировать массив объектов по ключу car_model, в восходящем порядке.

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

Но это все же упражнение, а не задача, потому что я с самого начала знала, что нужно делать.

Я только что изучила тему массивов в JavaScript. И я была знакома с сортировкой данных, потому что имела аналогичный опыт в Python. То есть, мне пришлось лишь поискать, как это делается в JavaScript. Также мне помогли четкие указания.

Но концепция все равно была для меня новой. Мне нужна была практика в том, как собрать все свои знания воедино, а здесь упражнения очень важны. Повторение ведет к лучшему усвоению материала, благодаря ему концепции начинают прочно оседать в голове.

Поддержка уровня знаний

Упражнения также не дают усвоенным знаниям припасть пылью.

Я изучаю JavaScript, но я вовсе не хочу забыть все, что я узнала о своем первом языке программирования — Python. Поэтому я использую Anki (программа с флешкарточками) несколько раз на дню.

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

Сейчас у меня больше тысячи карточек с материалом, который я уже много раз видела. Некоторые карточки содержат вопросы по синтаксису. Другие просят меня написать SQL-запрос или команду в терминале, или команду Git. Многие карточки содержат упражнения вроде «сдвинь список чисел на одно значение вправо».

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

Упражнения это палка о двух концах. С одной стороны, в учебе они несомненно полезны. С другой — очень легко привыкнуть к ним и застрять в одних лишь упражнениях.

В общем, обратная сторона пользы упражнений — остановка в зоне привычки.

Когда имеешь дело с неопределенностью

Программирование это решение задач. А решение задач непременно заставляет вас выходить из зоны привычки. И это хорошо.

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

  • Всякий раз при запуске программы появляется сообщение об ошибке. Почему? Что происходит? Где баг? Как его исправить?
  • Вы получаете новую постановку задачи. Читаете и перечитываете ее. Сперва у вас нет никаких идей, вы понятия не имеете что нужно для решения этой задачи. Возможно, вы вообще впадете в ступор, а в животе появится ноющее ощущение. (Вы выбрали хорошую задачу!)
  • Вам нужно изучить реляционные базы данных. Тема довольно широка. Как быть? На чем сфокусироваться для начала? Что имеет наибольшее значение? Что вам нужно знать уже сейчас?

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

Чтобы достичь прогресса, вы ищете информацию, экспериментируете, создаете план и применяете различные тактики решения задач. Короче говоря, чтобы разобраться, вы учитесь. Чем больше времени вы проводите над задачей и чем больше разных точек зрения приобретаете, тем больше слоев задачи вам открывается и тем ближе вы к «ага!»-моменту.

Решение задач требует значительных усилий

Второе, что отличает задачи, это сложность.

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

И не то чтобы упражнения не бывали сложными. Они тоже могут быть таковыми. Но одно дело, когда вы знаете, что вам нужно применить определенный метод, главное — сделать это правильно. Это сложно и порой может даже бесить.

Совсем другое дело, когда вы на старте не имеете ни малейшего понятия, как разобраться с проблемой, а в решении задач такое бывает сплошь и рядом. Как по мне, решение задач это всегда борьба.

Лучшее решение — смириться с этим и постараться выбраться из ступора. По своему опыту могу судить, что, прилагая значительные усилия, я многому учусь, и прорыв обычно не за горами.

По мере преодоления умственного дискомфорта вы обнаруживаете, что начинаете мыслить творчески и находите решения, о которых вы никогда не думали раньше. (Вы сами себе удивляетесь: оказывается, вы знаете больше, чем думаете!) В результате вы становитесь более сильным программистом.

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

Это как пересечение финишной черты на полумарафоне. Последние 21,1 км были, конечно, изматывающими, но пересечение финишной черты стоило того и вы чувствуете, что захотите сделать это снова. Решение задачи дает те же ощущения.

Так что, задачи или упражнения?

Когда вы открываете свой ноутбук, вы собираетесь решать задачи или выполнять упражнения?

Упражнения имеют свои достоинства. Я использую их, чтобы разогреться перед сессией программирования. С этой целью я 10-15 минут занимаюсь с карточками Anki. А когда я изучаю что-то новое, например, JavaScript, вся моя сессия программирования может быть посвящена исключительно упражнениям.

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

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

Для выработки навыков решения задач нужно много времени и практики. Единственный способ это сделать — работать ежедневно.

Мы, программисты, решаем задачи постоянно, причем в разных видах. Найти время для практики в этом деле не составляет труда, ведь именно на решении задач строится вся наша работа.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here