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

Мы столкнулись с множеством методологий решения проблем и отработали их. У всех этих подходов есть свои особенности и подходящие поводы для использования. Имея множество методов, я обнаруживаю, что могу решить многие проблемы, о которых не мог и мечтать еще недавно. Тем не менее, этот якобы впечатляющий факт выглядит гораздо менее впечатляющим, чем я ожидал. Я не чувствую, что какая-то завеса была приоткрыта, и я не чувствую себя суперразработчиком, который может взглянуть на проблему и понять ее изнутри и снаружи за считанные секунды. Каждая проблема по-прежнему сложна; каждая проблема по-прежнему требует усилий, концентрации и умения сидеть в замешательстве. Иногда мне все еще кажется, что я вслепую влетаю в проблему, не зная, как к ней подойти. Но каким-то образом я обычно узнаю ее общую закономерность и затем решаю ее. Мы все делаем ... и многие делают это быстрее, яснее и элегантнее, чем я.

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

Итак, вот вопрос, который я задаю: измеряется ли ценность разработчика обширностью его набора инструментов или его способностью выполнять работу с помощью как можно меньшего числа инструментов? Как я уже сказал: я не мог даже начать понимать, как решать многие из этих сложных проблем без недавно добавленных инструментов в мой набор алгоритмических инструментов. Например, без знания обратного отслеживания я никак не мог бы понять, что такая проблема, как поиск слов, может быть решена путем концептуализации дерева решений, где каждый уровень на самом деле является уровнем в рекурсивном стеке вызовов, а каждая ветвь является записью. укажите на следующий уровень стека с другим значением. Отслеживание с возвратом - это доступный мне алгоритмический инструмент, который позволяет решать подобные проблемы. Но я не умнее, чтобы решить эту проблему. Я не придумал ни одного из этих инструментов: я просто использую их. Я поражен тем, насколько очевидно, что я стою на плечах гигантов, чей тяжелый труд сделал мою работу еще проще… и, следовательно, менее впечатляющей.

Есть разница между «чистым» талантом решать проблемы и способностью имитировать стиль мышления после многократного воздействия. Несмотря на то, что моя способность решать проблемы во многом обусловлена ​​способностью подражать тем, кто умнее меня, я считаю, что проблемы в информатике дают возможность укрепить необработанный талант к решению проблем. Хотя верно, что тех, кто использует парадигмы решения проблем, намного больше, чем тех, кто их создает, понимание парадигмы сильно различается среди тех, кто ее использует.

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

Каждый раз, когда мы изучаем новый «тип» проблемы, у нас есть выбор, насколько глубоко понять эту проблему. Это особенно тот случай, когда проблема может быть решена без глубокого понимания (подумайте о среднем классе математики в средней школе, который учит студентов запоминать уравнения и распознавать, когда проблема требует конкретного уравнения ... все, что должен сделать ученик, - это знать какие значения вставлять ... Да, они могут знать, как взять производную, но понимают ли они, что это на самом деле означает? Понимают ли они, почему существует производная? Могут ли они доказать, что используемые ими формулы всегда будут давать правильные результаты, или они принимают его истину за чистую монету, не понимая, каковы отношения между вводом и выводом на самом деле ?).

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