Перевод статьи Софи ДеБенедетто «How to Get Un-Stuck».
Я застрял!
Несколько недель назад я столкнулась с особенно сложной задачей. Мне нужно было переписать один код, отвечающий за доставку музыкального контента в некоторые онлайн-магазины (представьте Spotify, iTunes и т. п.), с которыми у моей компании партнерские отношения.
День начался очень плавно, я хорошо продвинулась вперед. И все было отлично до 5 часов вечера, когда я внезапно уперлась в стену. При отправке буквально каждой песни в альбом на удаленном сервере компании-партнера, я получала сообщение об ошибке, которое раньше мне никогда не встречалось.
Это меня напрягало: рабочий день подходил к концу, а я до сих пор не закончила намеченное. И я была совершенно сбита с толку: такого сообщения об ошибке я раньше не видела и даже не представляла, что с этим делать.
Несмотря на огорчение и стресс, я не переставала обдумывать подход к решению проблемы. Я просто погрузилась в поиски. Перепробовала кучу разных подходов, подобранных случайным образом, и ни один из них ни к чему не привел. День сменился вечером, становилось поздно, а я становилась все более измотанной. В конечном итоге я сдалась (и, честно говоря, немного всплакнула).
С мыслями об этой проблеме я заснула. А когда на следующий день пересмотрела задачу на свежую голову, смогла систематизировать подход к решению и исправила баг меньше, чем за час.
Думаю, многие люди узнают себя в этой истории. Застрять может и опытный разработчик, столкнувшийся с упертым багом, и начинающий программист. Давайте будем вместе выбираться из состояния «застревания», используя эти советы!
Руководство по «саморазблокировке»
- Изолируйте проблему
- Поэкспериментируйте
- Определите свои ожидания
- Задавайте вопросы
- Расскажите все уточке
- Сделайте перерыв
Изолируйте проблему
Вы столкнулись со странным багом в своем коде, ваша программа попросту не делает то, что, по вашему мнению, должна делать, и вы не знаете, почему. Первое, что нужно сделать в таком случае, это изолировать проблему.
Давайте обратимся к моему опыту с кодом для доставки музыки в онлайн-магазины. Все началось с сообщения об ошибке при выполнении кода, ответственного за передачу контента на удаленный сервер онлайн-магазина. При попытке поместить файл Х на удаленный сервер выскакивало сообщение вроде «Доступ запрещен!»
Код, который приводил к этой ошибке, отвечал за две вещи:
- соединение с удаленным сервером;
- передачу файлов на этот сервер.
Итак, чтобы изолировать проблему, мне нужно было определить, какая из двух задач кода приводит к ошибке. На этот вопрос можно ответить, удалив или закомментировав часть кода, касающуюся одной или другой задачи. Или пытаясь выполнять каждую строку кода в терминале.
Пойдя этим путем, я смогла увидеть, что мой код успешно выполнял соединение с сервером, однако не мог перемещать на него файлы. Я сузила проблему и поняла, на чем нужно сконцентрировать свои усилия по отладке.
Вывод прост. Когда в нашей программе есть баг и мы не можем достичь желаемого ее поведения, нам нужно выделить весь код, который может быть ответственен за возникшую проблему. Затем нужно сужать поиски. Начните с одной строки или раздела кода и постепенно добавляйте оставшийся код, чтобы найти именно тот участок, который приводит к проблеме.
Поэкспериментируйте
Зная, в каком фрагменте кода кроется проблема, можно начать углубляться. Когда мне случается совсем-совсем застрять, когда у меня не появляется ни единой идеи, почему проявляется баг или почему что-то не работает, я предпочитаю начать экспериментировать. Давайте рассмотрим другой пример.
Недавно один из моих студентов обратился ко мне с проблемой с CSS. Он пытался изменить на своей странице цвет шрифта и заголовка. Мне был представлен CSS-файл. Код со стилями заголовка мне казался совершенно правильным. И тем не менее, эти стили не отображались на странице. Я понятия не имела, почему так происходит!
И мы просто начали экспериментировать. Мы пытались делать совершенно простые изменения в CSS, например, меняли цвет фона для всей страницы. Даже если в таблице стилей были какие-то правила, затрагивающие заголовки, то изменение фона для всей страницы, конечно, должно было отображаться. Но оно не отображалось!
Цвет фона вообще не менялся. Это выявило реальную проблему: на странице не отображались никакие CSS-стили. Это заставило нас задуматься, а знает ли наш HTML-код о существовании CSS-файла? Ответ на этот вопрос был простым: НЕТ. Мы забыли включить тег <link> в <head> HTML-документа для привязки CSS-файла. Проблема была решена!
Не бойтесь попробовать что-то поменять в своем коде, чтобы спровоцировать отличающееся поведение. Это может помочь выявить настоящую проблему, которая стоит за странным поведением кода, или, по крайней мере, может натолкнуть вас на какую-то идею о том, где скрыта причина проблемы. Однако, чтобы экспериментирование было удачным, нам нужно понимать, к чему должны приводить изменения в коде.
Определите свои ожидания
Один из способов упростить сложную проблему это определение ожидаемого поведения. Спросите себя: «Почему это – проблема? Что конкретно я вижу такое, чего видеть не должен? Чего я не вижу, а оно должно быть?»
Чтобы решить проблему, нам нужно четко определить ее параметры. Начиная экспериментировать с новым кодом, нужно ясно понимать, что должно происходить после каждого внесенного нами изменения. Переключаясь между написанием строки-другой кода и просмотром результатов этих изменений, мы сможем лучше понять, на что влияет наш код.
Задавайте вопросы
Если вы чувствуете, что уже готовы выбросить свой комп в окно, пришло время перестать писать код и начать задавать вопросы. Набор доступных ресурсов может отличаться в зависимости от ситуации. Если вы в классе с другими студентами, спросите у товарища или учителя. Если вы разработчик-джуниор, спросите у коллеги или старшего члена команды.
Но есть ресурсы, доступные всем:
- Загуглите! Разработчики всех уровней делают это ежедневно. Это по-настоящему ценный навык, нужный в программировании, и не нужно его стесняться.
- Задайте вопрос на форуме вроде Stack Overflow. Stack Overflow существует, потому что люди хотят помочь вам в решении вашей проблемы. Воспользуйтесь этим!
- Сходите на митап. Для начинающих программистов проводят отличные митапы, кроме того, некоторые митапы действуют в качестве учебных групп, где волонтеры отвечают на вопросы и помогают желающим. Сходите туда и познакомьтесь с другими программистами!
- Спросите у друга или сокурсника. Если вы проходите какой-то курс (не важно, онлайн или в классе), поговорите с какими-нибудь людьми, изучающими программирование вместе с вами. Они почти наверняка вас не укусят и скорее всего у них самих тоже найдется, что спросить у вас.
Вишенка на тортике: умение задавать вопросы это важный навык для программиста, который нужно развивать. Вы постоянно будете сталкиваться со сложностями или изучать что-то новое, поэтому способность задавать краткие и четкие вопросы вам будет пригождаться все время. Начинайте практиковаться в этом деле как можно раньше и как можно чаще, не сомневайтесь слишком долго, прежде чем обратиться за помощью.
Расскажите все уточке
Вам случалось начать что-нибудь спрашивать у товарища, коллеги или учителя – и остановиться на полуслове, когда осознали, что уже и сами все поняли?
Что ж, в программировании для этого есть название: Rubber Ducking (метод утенка).
Вот как это работает. Проговаривая проблему, вы начинаете понимать разницу между реальным и ожидаемым поведением вашей программы. Кроме того, сделав шаг назад и попытавшись объяснить проблему кому-нибудь другому, вы смотрите на нее с новой перспективы и начинаете понимать ее иначе.
Для применения этого метода есть много способов.
- Расскажите другу или соседу по комнате. Ему вообще не обязательно знать что-либо о программировании, нужно только согласие послушать:)
- Расскажите коллеге или сокурснику.
- Расскажите неодушевленному предмету – собственно, резиновой уточке!
Главное – сделать шаг назад и проговорить проблему вслух, чтобы посмотреть на нее под другим углом.
Сделайте перерыв
Если вы застряли, огорчены или поставлены в тупик, у вас есть два варианта. Вы можете игнорировать эти чувства, биться головой о стену и измождать себя. Или можете сделать перерыв!
Даже если вы прерветесь всего на несколько минут, встаньте из-за стола, походите, подумайте о чем-нибудь еще. Зачастую, если посмотреть на проблему свежим взглядом, то решение само на вас выпрыгнет.
Для многих из нас последовать этому совету сложнее всего. Когда мы внедрились в решение проблемы, нам кажется неправильным остановиться и начать думать о чем-то еще. Но если вы огорчены, а ваш мозг устал, то много вы не наработаете. Дайте себе необходимый и заслуженный отдых. Вы вернетесь к своей проблеме и поймете, что оно того стоило.
Не сдавайтесь
Человек, который застрял, чувствует себя ужасно. В лучшем случае это отбирает время и силы, а в худшем – заставляет вас сомневаться в своих способностях развиваться как программисту. Но, если вы разработчик, то вы довольно часто переживаете состояния «застревания». Этого не нужно бояться. Применив изложенные в этой статье советы, вы не останетесь в застрявшем состоянии надолго.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]