Страницы

четверг, 12 декабря 2013 г.

12 навыков, которые помогут найти причину ошибки, если непонятно, из-за чего она происходит

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


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

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

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

Термин
Сначала хочу пояснить одно понятие употребляемое мной:
Модели работы механизмов - здесь это представление как может работать конкретный механизм внутри платформы с технической стороны. Например, особенности процессора вывода СКД (система компоновки данных), ошибки времени выполнение запросов, отображение управляемых форм.

Для эффективного решения трудноанализируемых проблем нужно:
  • Обширная база моделей работы алгоритмов в голове. Знание моделей позволяет быстро строить гипотезы о работе исследуемого механизма. Что помогает вообще понять где и из-за чего может быть ошибка.
  • Умение видеть проблему максимально широко в любой момент времени. К примеру, не зацикливаться на конкретном решении возникших подпроблем, возможно при другом варианте этих новых проблем и нет.
  • Умение критически оценивать текущее направление поиска. Честно признаваться себе эффективно ли то, что ты сейчас делаешь и может есть другой подход к проблеме?
  • Мотивация на результат. Умение добиваться цели.
  • Развитые аналитические способности, в т. ч. осознанное или интуитивное применение основных инструментов анализа.
 
Тренировка

  1. Постоянное изучение и формирование моделей на основе данных встречаемых задач.
    • При решении задачи важно не просто решить ее, нужно понять, почему она произошла, как работает затрагиваемый внутренний механизм и что еще может произойти.
    • Рекомендуется записывать в некую базу знаний и/или рассказывать кому-то о проблеме и ее решении. При подобном описании становятся лучше видны пробелы в знаниях, а так же опыт прочнее закрепляется в голове. Дополнительно, если вы своим опытом кому-то помогли, то этот опыт лучше «индексируется» в голове по ключевым словам проблемы.
  2. Изучение любой информации о внутренней работе типовой функциональности платформы. Изучение особенностей системы.
    • Изучайте любую информацию, которую можно найти о работе внутренних механизмов платформы. В том числе списки ошибок платформы (файлы ErrPlatform_*.htm) и темы форумов про них же.
    • Дополнительно было бы не лишним изучать общую теорию программирования, работу с памятью, стандартные алгоритмические модели. Это помогает понять, как вообще могли сделать изучаемый механизм.
Для решения любых задач (особенно на этапе выдвижения предположений) помогает опыт в похожих областях. Так что, изучая что-то, вы получается навыки не только исследуемой области, но и косвенно увеличиваете шансы быстро решить проблемы в области с совпадающей логикой. (Правда возможно и то, что вам какой-то опыт наоборот помешает. Но я надеюсь вы умеете рационально оценивать применимость знаний).
  1. Пополнение моделей работы дополнительным чтением выборочных статей. Можно тратить хотя бы полчаса времени в день для чтения статей не по теме рабочих задач.
  2. Развитие аналитических способностей. Например, это можно сделать с помощью логических и дедуктивных игр. Можно поставить такие игры к себе на телефон и решать 1-2 задачки за день. Так же можно решать задачки на анализ ситуации, подобные тем, что ходят по интернету в виде тестов от google для менеджеров продукта. Кроме того, можно начать изучать элементы и инструменты анализа проблем.
  3. Развитие самомотивации. Помогает самоанализ, что же привлекает тебя в твоей работе вообще и искусственное подчеркивание данных аспектов во время приступов лени. Видеть результаты своего труда, например, копить базу записей решенных задач. (Но не забываем, что иногда просто надо временно переключиться на другую задачу или просто дать 5 минут мозгу отдохнуть).
  4. Всегда пытайтесь оценить для себя сколько займет времени завершить задачу по текущему пути поиска решения. Понятно, что это оценка при большом количестве неизвестных будет чаще совсем неправильная и больше на ощущениях. Но если вы начнете хоть как-то оценивать, то вы научитесь как минимум трезво смотреть на текущий процесс и научитесь осознаннее чувствовать перспективность направления дальнейшего поиска.


Подготовка к процессу
  1. Перестать переживать. Есть конечно полезный стресс, но чаще переживания только мешают думать. Так что лучше отключиться от страхов и переживаний типа «А Вася бы это сделал за пять минут», «Я не успею вовремя и все провалю».
  2. Есть просто результат, эффективность, прибыль и полученный по итогам опыт. Что-то одно может перевешивать. Главное, чтобы вы и человек ответственный за затраты понимали риски и возможное соотношение этих показателей. (про переживания советую почитать на Хабре)
  3. Выгрузить все текущие дела из головы, хотя бы на бумагу. Дела имеют привычку ни с того ни с сего всплывать в голове и отвлекать вас. Поэтому запишите их куда-то, чтобы не забыть и мозг успокоиться. Вообще рекомендую посмотреть методику GTD (Getting Things Done).Дать проблеме имя. Сформировать для себя четкое понимание, что за проблему мы решаем. Как это не странно, но непонимание, что мы в итоге исправляем и для чего, наиболее частая проблема затягивания решения.
  4. Определить правильный мотив. Проверить мотивацию на решение. Если мотивация «отработать» до конца дня, то задача вряд ли решиться. Если нет никакой мотивации на решение, то можно создать себе мотивацию самостоятельно. Например, решить для себя, что по итогам вы опубликуете проблему и решение на каком-нибудь известном сайте или поспорить с кем-нибудь, что вы сможете побороть проблему за час.
  5. Определить конечную цель. Надо определить четкие критерии результата, при котором задача будет считаться решенной. А далее уже ориентируясь на цель прокладывать пути поиска решений проблемы.
  6. Таймбоксинг. Если примерное время и вообще возможность решения проблемы не ясны и это демотивирует вас, то можно воспользоваться методом таймбоксинга. Метод заключается в определении для себя периода времени, в котором вы будете решать проблему и будете решать ее с полной самоотдачей. То есть, «Максимально сосредоточенно пытаюсь решить ее 2 часа, а потом переключаюсь на другую задачу». Это, во-первых, помогает проще и быстрее начать решать проблему, так как уменьшает моральное давление (вы как бы только пробуете). Во-вторых, помогает активизироваться, типа «у меня только 2 часа».
Продолжение следует...

Комментариев нет:

Отправить комментарий