думай как программист креативный подход к созданию кода с версия а спрол
Думай как программист. Урок по решению задач
Если вы интересуетесь программированием, то возможно слышали фразу:
«Каждый должен учиться программированию, потому что оно учит думать.»
Наверное вы тоже задавались вопросом, что значит думать как программист?
По сути, речь идет о более эффективном способе решения задач.
Данный пост ставит целью научить вас этому.
Прочтя его, вы более точно поймете, что нужно делать, чтоб находить лучшие решения.
Почему это важно?
Решение задач — это базовый навык.
Мы постоянно решаем задачи. Большие и маленькие. Как мы это делаем? Иногда хорошо… если повезет.
Если у вас нет системного подхода, то, вероятно, вы решаете задачи следующим образом (я так делал, когда только начинал кодить):
«Большинство работодателей считает более важным навык решения задач.
Умение решать задачи практически единогласно является самой важной способностью, которую ищут работодатели… Более важной, чем знание языков программирования, отладки и дизайна системы.
Демонстрация комплексного мышления и способность решать большие сложные задачи столь же ценны (если не больше), чем базовые технические навыки, необходимые для работы.»
Системный подход
Чтобы найти правильный подход, я последовал советам из книги Тима Феррисса об обучении «The 4-Hour Chef».
Это привело меня к интервью с двумя действительно впечатляющими людьми: C. Jordan Ball (занимает 1-е или 2-е место из 65 000 пользователей Coderbyte) и V. Anton Spraul (автор книги «Думай как программист. Креативный подход к созданию кода.»).
Я задал им одинаковые вопросы, и угадайте что? Их ответы были очень похожими!
Скоро вы тоже их узнаете.
Примечание: это не значит, что они все делают одинаково. Они разные люди, и вы отличаетесь от них. Но если начинать с правильных базовых принципов, то результат получится намного лучше и намного быстрее.
«Самая серьезная ошибка, которую я вижу у молодых программистов — это сосредоточеность на изучении синтаксиса, вместо изучения того, как решать задачи.»
Итак, что делать, когда вы сталкнетесь с новой задачей?
1. Понимание
Поймите, что конкретно нужно сделать. Большинство задач сложны, потому что вы их не понимаете (вот почему это первый шаг).
Как узнать, что вы поняли суть задачи? Попытайтесь объяснить её простым языком.
Вспомните случай, когда вы зациклились на задаче и начали объяснять её себе. В этот момент проявляются логические ошибки, которые вы не видели раньше.
Большинству программистов знакомо это чувство.
Вот почему вы должны описать свою задачу, нарисовать диаграмму или рассказать кому-то об этом (некоторые используют резиновую уточку).
“Если вы не можете объяснить что-то простым языком, то вы не понимаете этого.”
2. Планирование
Не начинайте решать задачу без плана, надеясь не запутаться в ней. Планируйте свое решение!
В программировании не надо «идти напролом». Дайте вашему мозгу время для анализа и обработки информации.
Чтобы получить хороший план, ответьте себе на простой вопрос:
«Подав на вход X, какие шаги нужно сделать, чтоб получить Y на выходе?»
Примечание: у программистов для этого есть отличный инструмент. Комментарии!
3. Декомпозиция
Это самый важный шаг. Будьте внимательны!
Не пытайтесь решить одну большую задачу.
Вместо этого разделите её на подзадачи. Решить их будет гораздо проще.
Затем решайте подзадачи, начиная с самых простых. Когда задача кажется простой, это значит, что вы знаете ответ (или близки к нему).
Решайте каждую подзадачу независимо от других и после решения объедините результаты.
Соединение всех маленьких задач даст вам решение исходной.
Поздравляем!
Этот метод является краеугольным камнем решения задач. Запомните это (перечитайте этот шаг, если нужно).
Если я мог бы научить каждого молодого программиста навыкам решения задач, это уменьшило бы колличество технического долга.
Предположим, что необходимо написать программу, которая берет 10 цифр и возвращает третье по величине. Для новичка это может стать сложной задачей, хотя требует только знаний базового синтаксиса.
Если вы застряли, то надо упрощать. Вместо третьего по величине числа, как насчет нахождения самого большого? Все еще слишком сложно? Как найти самое большое из трех чисел? Или больше из двух?
Уменьшайте задачу пока не поймете как её решить. Запишите решение. Затем разворачивайте задачу до момента, пока не вернетесь к начальному вопросу.
4. Застряли?
Сейчас вы вероятно сидите и думаете: «Эй, это все круто, но что если я не смогу решить эту задачу?».
Прежде всего сделайте глубокий вдох. Не волнуйтесь. Это происходит со всеми!
Разница лишь в том, что лучшие программисты фиксили баги и решали задачи с интересом, а не с раздражением.
На самом деле, вот три вещи, которые нужно попробовать сделать, когда сталкиваетесь со сложностями:
«Искуство отладки заключается в выяснении разницы того, что вы написали в программе, и того, что вы хотели написать»
«Иногда мы так сильно углубляемся в детали, что не учитываем общие принципы, с помощью которых можно решить задачу на более высоком уровне. [. ]
Классическим примером этого, конечно же, является суммирование длинного списка последовательных целых чисел 1 + 2 + 3 +… + n, который молодой Гаусс легко посчитал по формуле n (n + 1) / 2, избежав проблем, связанных с увеличением количества элементов»
Предостережение: Не ищите решение большой задачи. Ищите решения только для маленьких подзадач. Почему? Если вы не будете напрягаться (хотя-бы немного), то не узнаете ничего нового. Если вы ничего не узнали, то зря потратили время.
Практика
Не надейтесь стать профессионалом через неделю. Для того, чтоб хорошо решать задачи, нужно решить много задач!
Практика. Практика. И еще раз практика. Только со временем вы сможете сказать: «Эта задача может быть легко решена с помощью ».
Как тренироваться? Есть интеренсые варианты!
Шахматные головоломки, математические задачи, судоку, го, монополия, видео игры и т.д.
На самом деле, общая практика среди успешных людей — это их привычка «решать микрозадачи». Например, Питер Тиль играет в шахматы, а Илон Маск играет в видеоигры.
Байрон Ривз сказал: «Если вы хотите посмотреть, как могут выглядить руководители бизнеса через три-пять лет, посмотрите в онлайн-играх».
Быстрая перемотка вперед. Илон Маск, Рид Хоффман, Марк Цукерберг и многие другие говорят, что игры были основополагающими для их успеха в создании своих компаний.
Значит ли это, что вы должны только играть в игры? Конечно нет.
Но в чем суть большинства игр? Правильно, в решении задач!
Так что же должно быть в практических занятиях. Что-то, что позволит вам решать много микрозадач (и в идеале это вам нравится).
Например, мне нравятся задачи по программированию. И каждый день я пытаюсь решить хотя бы одну (в основном на Coderbyte).
Как я уже сказал, все задачи имеют сходные модели решения.
Вывод
Теперь вы знаете, что значит «думать как программист».
Вы также знаете, что решение задач — невероятный (базовый) навык, который надо развивать.
Обратите внимание, теперь вы также знаете, как практиковать свои навыки решения задач!
Наконец, я хочу, чтобы вы столкнулись с множеством задач.
«Когда вы думаете, что успешно преодолели одно препятствие, появляется другое. Но именно это делает жизнь интересной. [. ]
Жизнь — это процесс преодоления препятствий — укреплений, через которые мы должны прорваться.
С каждым разом вы узнаете что-то новое.
С каждым разом вы будете развивать силу, мудрость и перспективы.
С каждым разом будет все меньше конкуренов. И в конце останется только ваша улучшеная версия.»
Теперь идите решать задачи!
И пусть вам сопутствует удача!
Особая благодарность C. Jordan Ball и V. Anton Spraul. За полезные совет которые они дали.
Кроме того, я не мог бы преобрести своих знаний в области программирования так быстро без Lambda School. Не могу не поблагодарить и не рекомендовать их.
Рецензии на книгу « Думай как программист. Креативный подход к созданию кода. C++ версия » Антон Спрол
Книга не для тех, кто думает, что это учебник по С++. Она для тех, кто уже знаком с С++. Написана живым, понятным языком с интересными примерами и упражнениями. Подойдёт для параллельного изучения С++ по любому из учебников, которые зачастую, к сожалению, учат только синтаксису этого языка.
Предлагаю несколько фотографий для знакомства с книгой
Противоречивые впечатления от книги: с одной стороны никаких претензий нет, новичку книга очень даже подойдет для чтения, но с другой стороны, если взять, например, книгу Лафоре по C++, то там и объем различных задач будет больше и само описание языка более полное и тема ООП раскрыта лучше.
В итоге не совсем понятно, зачем эта книга нужна.
В принципе для ребенка/подростка или как дополнение к учебнику по С++ можно взять, но ничего особо интересного я в ней не обнаружил.
В этой книге вы не найдете:
Жестких инструкций
Готовых шаблонов
Скучных объяснений
Думай как программист. Креативный подход к созданию кода. C++ версия
Посоветуйте книгу друзьям! Друзьям – скидка 10%, вам – рубли
Эта и ещё 2 книги за 299 ₽
Отзывы 2
Хорошая книга для начинающих программистов. Учит развивать навыки программирования, учить мыслить как решить задачу и составить программу, а не просто писать код. Рекомендую тем, кто начал учить программирование, а затем бросил не веря в свой талант программиста.
Хорошая книга для начинающих программистов. Учит развивать навыки программирования, учить мыслить как решить задачу и составить программу, а не просто писать код. Рекомендую тем, кто начал учить программирование, а затем бросил не веря в свой талант программиста.
Книга супер для людей, которые задумываются о профессии программиста и пытаются разобраться, подходит им это занятие или нет. С первых страниц книги дается очень полезный материал, который сразу покажет, интересен ли вам предмет программирования или это не ваше. Читается очень легко!
Книга супер для людей, которые задумываются о профессии программиста и пытаются разобраться, подходит им это занятие или нет. С первых страниц книги дается очень полезный материал, который сразу покажет, интересен ли вам предмет программирования или это не ваше. Читается очень легко!
Оставьте отзыв
Напишите отзыв и получите 25 бонусных рублей на ваш счёт ЛитРес
Рецензии на книгу « Думай как программист. Креативный подход к созданию кода. C++ версия » Антон Спрол
Книга не для тех, кто думает, что это учебник по С++. Она для тех, кто уже знаком с С++. Написана живым, понятным языком с интересными примерами и упражнениями. Подойдёт для параллельного изучения С++ по любому из учебников, которые зачастую, к сожалению, учат только синтаксису этого языка.
Предлагаю несколько фотографий для знакомства с книгой
Противоречивые впечатления от книги: с одной стороны никаких претензий нет, новичку книга очень даже подойдет для чтения, но с другой стороны, если взять, например, книгу Лафоре по C++, то там и объем различных задач будет больше и само описание языка более полное и тема ООП раскрыта лучше.
В итоге не совсем понятно, зачем эта книга нужна.
В принципе для ребенка/подростка или как дополнение к учебнику по С++ можно взять, но ничего особо интересного я в ней не обнаружил.
В этой книге вы не найдете:
Жестких инструкций
Готовых шаблонов
Скучных объяснений
Думай как программист, Креативный подход к созданию кода, C++ версия, Спрол А., 2018
К сожалению, на данный момент у нас невозможно бесплатно скачать полный вариант книги.
Но вы можете попробовать скачать полный вариант, купив у наших партнеров электронную книгу здесь, если она у них есть наличии в данный момент.
Также можно купить бумажную версию книги здесь.
Думай как программист, Креативный подход к созданию кода, C++ версия, Спрол А., 2018.
При помощи этой книги любой программист, особенно начинающий, может усовершенствовать свои навыки программирования. Автор разработал собственную программу, позволяющую получить навыки креативного решения разнообразных задач. Эти навыки необходимы в первую очередь тем, кто хочет создавать собственный код и действительно понимать и чувствовать основы программирования. Живой язык, множество примеров на языке C++ и уникальное авторское видение сделают чтение этой книги настоящим удовольствием.
Стратегии решения задач.
Эта книга посвящена решению задач, но что это значит на самом деле? Когда люди используют этот термин в разговоре, они зачастую имеют в виду нечто очень отличное от того, о чем я говорю в этой книге. Если из выхлопной трубы вашего старого автомобиля идет сизый дым, двигатель то и дело глохнет, а расход топлива вырос, то эта проблема, как задача, может быть решена с применением знаний автомобиля, диагностикой и заменой деталей при помощи инструментов автомеханика. Впрочем, если вы расскажете о своей проблеме друзьям, то один из них может вам ответить: «Эй, ты должен заменить свою старую машину на что-то поновее, и проблема будет решена». Однако предложение вашего друга на самом деле не будет решением задачи: это будет лишь способом ее избежать.
Задачи подразумевают ограничения, незыблемые правила, касающиеся задачи или способа ее решения. В случае со сломанной машиной одно из ограничений заключается в том, что вам нужно отремонтировать имеющийся автомобиль, а не купить новый. Ограничения также должны подразумевать общую стоимость ремонта, время на ремонт и невозможность приобретения инструмента для ремонта только этой поломки.
При решении проблемы в программе у вас также есть определенные ограничения. Среди общих ограничений язык программирования, платформа (будет ли программа работать на ПК, iPhone или ином устройстве?), производительность (для игровой программы может требоваться обновление графики до 30 кадров в секунду, бизнес-приложение должно иметь ограничение по максимальному времени отклика на ввод пользователя) или объем требуемой памяти. Иногда ограничения также подразумевают код, на который вы можете ссылаться: возможно, программа не может включать определенный открытый код или, наоборот, должна использовать только открытый код.
Содержание.
ОБ АВТОРЕ.
ВВЕДЕНИЕ.
Об этой книге.
Предварительная подготовка.
Выбор тем.
Стиль программирования.
Упражнения.
Почему C++?.
ГЛАВА 1. СТРАТЕГИИ РЕШЕНИЯ ЗАДАЧ.
Классические головоломки.
Лисица, гусь и кукуруза.
Задача: как пересечь реку?.
Вынесенные уроки.
Головоломки со скользящими плитками.
Задача: скользящая восьмерка.
Задача: скользящая пятерка.
Вынесенные уроки.
Судоку.
Задача: заполнить квадрат «Судоку».
Вынесенные уроки.
Замок Кварраси.
Задача: открыть инопланетный замок.
Вынесенные уроки.
Общие подходы к решению задач.
Планируйте решения.
Переформулируйте задачи.
Делите задачи.
Начните с того, что знаете.
Упрощайте задачи.
Ищите аналогии.
Экспериментируйте.
Не расстраивайтесь.
Упражнения.
ГЛАВА 2. ИСТИННЫЕ ГОЛОВОЛОМКИ.
Обзор языка C++, используемого в этой главе.
Шаблоны вывода.
Задача: половина квадрата.
Задача: квадрат (упрощение задачи с половиной квадрата).
Задача: линия (еще большее упрощение задачи с половиной квадрата).
Задача: посчитать на уменьшение, считая на увеличение.
Задача: равнобедренный треугольник.
Обработка ввода.
Задача: проверка контрольной суммы Луна.
Разбиение проблемы на части.
Задача: преобразовать символ цифры в целое число.
Задача: проверка контрольной суммы Луна, фиксированная длина.
Задача: проверка простой контрольной суммы, фиксированная длина.
Задача: положительное или отрицательное.
Соберем все детали вместе.
Отслеживание состояния.
Задача: декодирование сообщения.
Задача: чтение трех- или четырехзначного числа.
Задача: чтение трех- или четырехзначного числа, дальнейшее упрощение.
Заключение.
Упражнения.
ГЛАВА 3. РЕШЕНИЕ ЗАДАЧ С МАССИВАМИ.
Обзор основных свойств массивов.
Сохранение.
Копирование.
Извлечение и поиск.
Поиск определенного значения.
Поиск по критерию.
Сортировка.
Быстрая и простая сортировка с помощью функции qsort.
Легко модифицируемый алгоритм сортировки — сортировка вставками.
Вычисление статистических показателей.
Решение задач с помощью массивов.
Задача: нахождение моды.
Рефакторинг.
Массивы фиксированных данных.
Нескалярные массивы.
Многомерные массивы.
В каких случаях использовать массивы.
Упражнения.
ГЛАВА 4. РЕШЕНИЕ ЗАДАЧ С УКАЗАТЕЛЯМИ И ДИНАМИЧЕСКОЙ ПАМЯТЬЮ.
Обзор основных свойств указателей.
Преимущества использования указателей.
Структуры данных, размер которых определяется во время выполнения программы.
Динамические структуры.
Разделение памяти.
В каких случаях использовать указатели.
Вопросы памяти.
Стек и куча.
Объем памяти.
Время существования переменной.
Решение задач с указателями.
Строка переменной длины.
Задача: операции со строками переменной длины.
Проверка на специальные случаи.
Копирование созданной динамически строки.
Связные списки.
Задача: отслеживание неизвестного количества студенческих карточек.
Построение списка узлов.
Добавление узлов в список.
Обход списка.
Заключение и дальнейшие шаги.
Упражнения.
ГЛАВА 5. РЕШЕНИЕ ЗАДАЧ С КЛАССАМИ.
Обзор основных свойств классов.
Цели использования классов.
Инкапсуляция.
Повторное использование кода.
Разделение задачи.
Сокрытие.
Читабельность.
Выразительность.
Создание простого класса.
Задача: список класса.
Базовый фреймворк класса.
Служебные методы.
Классы с динамическими данными.
Задача: отслеживание неизвестного количества записей студентов.
Добавление узла.
Перегруппировка списка.
Деструктор.
Глубокое копирование.
Общий обзор классов с динамической памятью.
Ошибки, которых следует избегать.
Фальшивый класс.
Однозадачники.
Упражнения.
ГЛАВА 6. РЕШЕНИЕ ЗАДАЧ С ПОМОЩЬЮ РЕКУРСИИ.
Обзор основ рекурсии.
Головная и хвостовая рекурсия.
Задача: подсчет количества попугаев.
Подход 1.
Подход 2.
Задача: выявление лучшего клиента.
Подход 1.
Подход 2.
Большая рекурсивная идея.
Задача: вычисление суммы элементов целочисленного массива.
Распространенные ошибки.
Слишком много параметров.
Глобальные переменные.
Применение рекурсии к динамическим структурам данных.
Рекурсия и связные списки.
Задача: подсчет отрицательных чисел в односвязном списке.
Рекурсия и двоичные деревья.
Задача: нахождение наибольшего значения в двоичном дереве.
Функции-обертки.
Задача: нахождение количества листьев в двоичном дереве.
В каких случаях использовать рекурсию.
Аргументы против рекурсии.
Задача: отображение элементов связного списка в прямом порядке.
Задача: отображение элементов связного списка в обратном порядке.
Упражнения.
ГЛАВА 7. РЕШЕНИЕ ЗАДАЧ С ПОМОЩЬЮ ПОВТОРНОГО ИСПОЛЬЗОВАНИЯ КОДА.
Хорошее и плохое повторное
использование кода.
Основы работы с компонентами.
Кодовый блок.
Алгоритмы.
Шаблоны.
Абстрактные типы данных.
Библиотеки.
Изучение компонентов.
Исследовательское обучение.
Применение полученных знаний на практике.
Задача: староста.
Анализ решения задачи выбора старосты.
Обучение по мере необходимости.
Задача: эффективный обход.
Когда следует искать компонент.
Нахождение компонента.
Применение компонента.
Анализ эффективного решения задачи с обходом.
Выбор типа компонента.
Процесс выбора компонента.
Задача: выборочная сортировка.
Сравнение результатов.
Упражнения.
ГЛАВА 8. ДУМАЙТЕ КАК ПРОГРАММИСТ.
Разработка собственного мастер-плана.
Использование своих сильных и слабых сторон.
Планирование с учетом недостатков кодирования.
Планирование с учетом недостатков дизайна.
Планирование с учетом ваших сильных сторон.
Составление мастер-плана.
Решение любой задачи.
Задача: жульничество при игре в «Виселицу».
Нахождение возможности для жульничества.
Необходимые операции для обмана в игре «Виселица».
Исходный дизайн.
Первичное кодирование.
Анализ первоначальных результатов.
Искусство решения задач.
Изучение новых навыков программирования.
Новые языки.
Выделите время на учебу.
Начните с того, что вы знаете.
Изучите отличия.
Изучайте хорошо написанный код.
Новые навыки для языка, который вы уже знаете.
Новые библиотеки.
Выберите курс.
Заключение.
Упражнения.
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ.
По кнопкам выше и ниже «Купить бумажную книгу» и по ссылке «Купить» можно купить эту книгу с доставкой по всей России и похожие книги по самой лучшей цене в бумажном виде на сайтах официальных интернет магазинов Лабиринт, Озон, Буквоед, Читай-город, Литрес, My-shop, Book24, Books.ru.
По кнопке «Найти похожие материалы на других сайтах» можно найти похожие материалы на других сайтах.
On the buttons above and below you can buy the book in official online stores Labirint, Ozon and others. Also you can search related and similar materials on other sites.