Думай как программист. Урок по решению задач

Автор оригинала: Richard Reis
  • Перевод
image

Если вы интересуетесь программированием, то возможно слышали фразу:
«Каждый должен учиться программированию, потому что оно учит думать.»

— Стив Джобс

Наверное вы тоже задавались вопросом, что значит думать как программист?

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

Данный пост ставит целью научить вас этому.

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

Почему это важно?


Решение задач — это базовый навык.

Мы постоянно решаем задачи. Большие и маленькие. Как мы это делаем? Иногда хорошо… если повезет.

Если у вас нет системного подхода, то, вероятно, вы решаете задачи следующим образом (я так делал, когда только начинал кодить):

  1. пробуете решение,
  2. если оно не подходит, то пробуете другое,
  3. если не получилось, то повторяете пункт 2 до победы.

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

Лучший способ:

  1. иметь системный подход,
  2. применять его на практике.

«Большинство работодателей считает более важным навык решения задач.

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

Демонстрация комплексного мышления и способность решать большие сложные задачи столь же ценны (если не больше), чем базовые технические навыки, необходимые для работы.»

—  Hacker Rank (2018 Developer Skills Report)

Системный подход


Чтобы найти правильный подход, я последовал советам из книги Тима Феррисса об обучении "The 4-Hour Chef".

Это привело меня к интервью с двумя действительно впечатляющими людьми: C. Jordan Ball (занимает 1-е или 2-е место из 65 000 пользователей Coderbyte) и V. Anton Spraul (автор книги "Думай как программист. Креативный подход к созданию кода.").

Я задал им одинаковые вопросы, и угадайте что? Их ответы были очень похожими!

Скоро вы тоже их узнаете.

Примечание: это не значит, что они все делают одинаково. Они разные люди, и вы отличаетесь от них. Но если начинать с правильных базовых принципов, то результат получится намного лучше и намного быстрее.
«Самая серьезная ошибка, которую я вижу у молодых программистов — это сосредоточеность на изучении синтаксиса, вместо изучения того, как решать задачи.»

V. Anton Spraul

Итак, что делать, когда вы сталкнетесь с новой задачей?

Разберем по шагам:

1. Понимание


Поймите, что конкретно нужно сделать. Большинство задач сложны, потому что вы их не понимаете (вот почему это первый шаг).

Как узнать, что вы поняли суть задачи? Попытайтесь объяснить её простым языком.

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

Большинству программистов знакомо это чувство.

Вот почему вы должны описать свою задачу, нарисовать диаграмму или рассказать кому-то об этом (некоторые используют резиновую уточку).
“Если вы не можете объяснить что-то простым языком, то вы не понимаете этого.”

—  Richard Feynman

2. Планирование


Не начинайте решать задачу без плана, надеясь не запутаться в ней. Планируйте свое решение!

В программировании не надо «идти напролом». Дайте вашему мозгу время для анализа и обработки информации.

Чтобы получить хороший план, ответьте себе на простой вопрос:

«Подав на вход X, какие шаги нужно сделать, чтоб получить Y на выходе?»

Примечание: у программистов для этого есть отличный инструмент. Комментарии!

3. Декомпозиция


Это самый важный шаг. Будьте внимательны!

Не пытайтесь решить одну большую задачу.

Вместо этого разделите её на подзадачи. Решить их будет гораздо проще.

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

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

Соединение всех маленьких задач даст вам решение исходной.
Поздравляем!

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

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

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

Уменьшайте задачу пока не поймете как её решить. Запишите решение. Затем разворачивайте задачу до момента, пока не вернетесь к начальному вопросу.

—  V. Anton Spraul

4. Застряли?


Сейчас вы вероятно сидите и думаете: «Эй, это все круто, но что если я не смогу решить эту задачу?».

Прежде всего сделайте глубокий вдох. Не волнуйтесь. Это происходит со всеми!

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

На самом деле, вот три вещи, которые нужно попробовать сделать, когда сталкиваетесь со сложностями:

  1. Отладка. Проверяйте шаг за шагом, где вы могли ошибиться в своем решении. Программисты называют это дебаггингом.
    «Искуство отладки заключается в выяснении разницы того, что вы написали в программе, и того, что вы хотели написать»

    — Andrew Singer
  2. Смена подхода. Вернитесь на шаг назад. Посмотрите на задачу под другим углом. Можно ли абстрагироваться от реализации и применить более общий подход?
    «Иногда мы так сильно углубляемся в детали, что не учитываем общие принципы, с помощью которых можно решить задачу на более высоком уровне. [...]

    Классическим примером этого, конечно же, является суммирование длинного списка последовательных целых чисел 1 + 2 + 3 +… + n, который молодой Гаусс легко посчитал по формуле n (n + 1) / 2, избежав проблем, связанных с увеличением количества элементов»

    C. Jordan Ball

    Примечание: Иногда лучше удалить все и начать сначала с новыми силами. Я серьезно. Вы будете удивлены тем, насколько это может быть эффективно.
  3. Исследование. Эх, старый добрый Google. Независимо от того, какая у вас задача, скорее всего кто-то уже решал её до вас. Найдите этого человека или решение. Сделайте это даже если разобрались сами. Можно многому научиться у других людей.

    Предостережение: Не ищите решение большой задачи. Ищите решения только для маленьких подзадач. Почему? Если вы не будете напрягаться (хотя-бы немного), то не узнаете ничего нового. Если вы ничего не узнали, то зря потратили время.

Практика


Не надейтесь стать профессионалом через неделю. Для того, чтоб хорошо решать задачи, нужно решить много задач!

Практика. Практика. И еще раз практика. Только со временем вы сможете сказать: «Эта задача может быть легко решена с помощью <подставьте свое решение сюда>».

Как тренироваться? Есть интеренсые варианты!

Шахматные головоломки, математические задачи, судоку, го, монополия, видео игры и т.д.

На самом деле, общая практика среди успешных людей — это их привычка «решать микрозадачи». Например, Питер Тиль играет в шахматы, а Илон Маск играет в видеоигры.

Байрон Ривз сказал: «Если вы хотите посмотреть, как могут выглядить руководители бизнеса через три-пять лет, посмотрите в онлайн-играх».

Быстрая перемотка вперед. Илон Маск, Рид Хоффман, Марк Цукерберг и многие другие говорят, что игры были основополагающими для их успеха в создании своих компаний.

— Mary Meeker (2017 internet trends report)

Значит ли это, что вы должны только играть в игры? Конечно нет.

Но в чем суть большинства игр? Правильно, в решении задач!

Так что же должно быть в практических занятиях. Что-то, что позволит вам решать много микрозадач (и в идеале это вам нравится).

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

Как я уже сказал, все задачи имеют сходные модели решения.

Вывод


Это все!

Теперь вы знаете, что значит «думать как программист».

Вы также знаете, что решение задач — невероятный (базовый) навык, который надо развивать.

Обратите внимание, теперь вы также знаете, как практиковать свои навыки решения задач!

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

Жизнь — это процесс преодоления препятствий — укреплений, через которые мы должны прорваться.

С каждым разом вы узнаете что-то новое.

С каждым разом вы будете развивать силу, мудрость и перспективы.

С каждым разом будет все меньше конкуренов. И в конце останется только ваша улучшеная версия.»

— Ryan Holiday (The Obstacle is the Way)

Теперь идите решать задачи!

И пусть вам сопутствует удача!

Особая благодарность C. Jordan Ball и V. Anton Spraul. За полезные совет которые они дали.

Кроме того, я не мог бы преобрести своих знаний в области программирования так быстро без Lambda School. Не могу не поблагодарить и не рекомендовать их.
Поделиться публикацией

Комментарии 82

    +18
    Ох уж эти статьи, на 1/3 содержащие только мотивирующие цитатки Стетхема. По факту для любой области, где ты хочешь преуспеть нужно лишь 3 вещи: книга, практика и желание, все остальное это тренинги прямиком с лужников.
      +1
      То есть если хочешь стать хирургом, то достаточно купить справочник и тесак? И можно прочесть и идти практиковаться?

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

      Человек который считает, что достаточно прочесть книгу видимо никогда не делал ничего серьезного. Или является непризнаным гением.
        0
        Под книгой я подразумевал знания. Под практикой я подразумевал (как не странно) практику. Раньше хирургии по книгам некоторые обучались. Не беда. То что после специализированного учебного заведения выходят отменные специалисты я и не спорил.
        Только вот в чем беда: после этой статьи человек станет хирургом? Тогда к чему вы ведете?
          +1
          Веду к тому, что выше и написано, что надо практиковаться, но при этом систематически имея определенный подход и не сдаваться в случае затруднений.

          Может у вас есть более полезные советы и своя стратегия изучения нового или книги достаточно?
            0

            То есть если хирургу напишут: "нужно что бы при операции руки не треслись", у него перестанут треслись руки? Это опыт и знания, полученные годами. Вся статья — компиляция из общих советов, которые архитипом откладываются в головах программистов, которые приходят со знаниями и и опытом. Я не вижу как она может помочь людям, которых действительно хотят программировать. А те, кто захотел перебраться из /вставьте нужную профессию/ во что то более хайповое и прибыльное нечего не вынесут из нее.
            Ах да, если человека нет мотивации внутри, то никакие цитаты не помогут.

              +1
              С таким подходом можно любую книгу. Например «Совершенный код» можно назвать сборником общих советов. Т.к. некоторые описаные там вещи довольно очевидны.

              Может вы считаете, что патерны это тоже архитипы, и не стоит их изучать? Только практика из 1000 строк валидного кода запиханых в один класс или в одну функцию.

              Я знаю и ведущих специалистов которые на практике за пять и более лет не научились декомпозировать методы и классы, и думаю для них данная инфа тоже была бы полезной.
                –1
                Может вы считаете, что патерны это тоже архитипы, и не стоит их изучать?
                Да, это на 100% верно, изучать их не стоит. Начинающим так вообще вредно.

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

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

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

                    Заучивание и изучение это немного разные вещи. Естественно не стоит зубрить все наизусть. Но читать и пытаться понять всегда полезно. Даже для джунов.

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

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

                    Если вас во время такой практики не посещает мысль, что 1000 строк в одном месте это так себе идея, вам выше кодера не подняться

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

                    P.S. А вы вышли за рамки шаблонов или потеряли возможность самостоятельно думать?
                      +1
                      Заучивание и изучение это немного разные вещи
                      Да, но паттерны можно только заучить. Это же список примеров, как вы их хотите изучать?

                      Даже для джунов.
                      Ты вот откуда эти покалеченные джуны берутся.

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

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

                      P.S. А вы вышли за рамки шаблонов или потеряли возможность самостоятельно думать?
                      По вашему вопросу видно, что вы уже не понимаете, как можно думать и проектировать не используя паттерны. Об этом разрушительном влиянии я и говорил.

                      Я учился программированию в те времена, когда паттерны за знания не считались
                        0
                        Да, но паттерны можно только заучить. Это же список примеров, как вы их хотите изучать?

                        Можно поинтересоваться а основные парадигмы ООП тоже не нужны?

                        Вы предлагаете изучать таблицу умножение вместо того чтобы изучать само умножение

                        Вы предлагаете умножать не зная таблицу умножения?

                        Я учился программированию в те времена, когда паттерны за знания не считались

                        На перфокартах что-ли? Но и тогда были фундаментальные основы.
                          0
                          Вы предлагаете изучать таблицу умножение вместо того чтобы изучать само умножение
                          некоторые вещи надо знать. это не отменяет необходимость знания «как они получились такими», но избавляет от необходимости повторного изобретения велосипеда.
                      0
                      Эта статья — просто популистическая компиляция общих советов, прочтение которых ничего не даст никому. Я вообще не вижу в ней смысла, кроме «скромного» пиара очередной конторы по обучению программистов.
                      Программирование в первую очередь это борьба: поиск нужной информации, поиск решения нестандартных проблем и постоянная война с пк. Статьи вида «научим думать как программист», «обучим основам кодинга» в себе кроме как популизма не несут.
                      На счет обучения: я жил в местности, где не было интернета и ни одного человека, умеющего программировать. И это мне не помешало в 10том классе сверстать свой первый сайт и написать простенькие скрипты к нему.
                      Я это к чему: тому человеку, кто рвется вверх и хочет прогрессировать нужны лишь знания и практика. А тот, кому нужна мотивация и готовые ответы и с этой статьей далеко не уедут.
                      PS: почему я категорически настроен против: в статье нет ничего нового, а годной компиляцией назвать ее язык не поворачивается. По большому счету она ничем не отличается от бизнес-тренингов на которых тоже говорят общие вещи типа «экономьте»,«продумывайте» и прочее. Хорошо что хоть тут за прочтение копейку не взяли, и на том спасибо.
                        0
                        У вас реклама головного мозга. Эта ссылка является частью перевода. klimentRu спасибо за перевод. Эта статья является руководством по принципу «Разделяй и властвуй». Всё таки менеджеры не зря бутерброды кушают.
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Одно дело станок для хобби в гараже, другое промышленное оборудование со скоростью перемещения на ускоренном ходу до 30 м/мин. Пролетит перед глазами даже кнопку аварийного останова нажать не успеешь. Стоимостью одной фрезы 5 — 10 к рублей поломка которой уже является существенным косяком. И учитывая особенности обработки от аллюминия до титановых и жаропрочных сплавов. И точности обработки до пяти микрон. Технологического цикла в котором может быть задействовандо 5-10 человек и прочего.

                  Я не против книг. Как раз за них, но во многих случаях полезнее (особенно для начинающих) краткая инструкция и наставничество. Чтоб человек понимал основные алгоритмы и узкие места своей работы.
                  +2
                  То есть если хочешь стать хирургом, то достаточно купить справочник и тесак? И можно прочесть и идти практиковаться?

                  Да. Только сначала на мышах и лягуша́х. В общем-то, когда хирургия была примерно на той стадии развития, на которой сейчас программирование, оно ведь как-то так и было. А если бы анатомия и физиология не стояли на месте, а изменялись так же, как компьютеры — то, подозреваю, как-то так было бы и до сих пор. Собственно, и со станками ЧПУ тоже можно, просто не надо начинать свою практику сразу с фрезы 30 м/мин.
                +2
                Большинство работодателей считает более важным навык решения задач
                Решение задач на собеседованиях — одна из худших практик в найме. Просто потому что собеседование это стрессовая ситуация, где требуется дать ответ отсносительно быстро. В реальной жизни для решения задачи нужно время, и спокойная обстановка, желательно без окружающих требующих от тебя ответа как можно скорее.

                Дать ответ на задачу быстро в условиях стресса, может только человек, который эту задачу уже решал или знает ответ. Т.е. мы не проверяем то, как человек решает мыслит и рассуждает, а просто отбираем тех, кто такие типовые задачки задрачивает, посути это отрицательный отбор.
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    Про собеседования нигде не написано. Имеется в виду, что разработчик должен комплексно подходить к поставленной задаче, и думать головой, а не просто уметь нажимать на кнопки.

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

                    Допустим, что нужно срочно сделать какую-то задачу на работе. Её дают вам, а вы говорите: «Извините не могу работать в условиях стресса. Только если я эту задачу раньше решал.» Так получается?
                      +1
                      Нередко бывает, когда после серии «срочно сделать задачу» люди действительно увольняются.
                      Особенно, если оказывается, что задача нужна менеджеру для решения сиюминутной задачи, а потом отправляется в корзину.

                      Факторы стресса и стрессоустойчивости имеют место быть и должны учитываться обеими сторонами.
                        0
                        я иногда уточняю — «это задача разовая, редкая, или регулярная?» и не вижу ничего страшного в решении сиюминутных задач (иногда — просто отдаю слегка облагороженый результат запроса для разовых задач). и никаких проблем.
                        а вообще, вся жизнь — стресс. все мы когда-то что-то делаем впервые, все ошибаемся.
                        +2
                        Имеется в виду, что разработчик должен комплексно подходить к поставленной задаче, и думать головой
                        А что, без этого как то можно разработчиком работать? Хотя если смотреть на нынешнее поколение девелоперлов…

                        Допустим, что нужно срочно сделать какую-то задачу на работе.
                        Есть разница между решением практической задачи в течении нескольких часов сидя в своем уютном кресле, и решением абстрактной задачи в течении двух минут под взором нескольких экзаменаторов. Это совсем разные вещи, на работе нужно первое, а на собесах проверяют второе.
                        0
                        Дать ответ на задачу быстро в условиях стресса, может только человек, который эту задачу уже решал или знает ответ
                        Если вы говорите про алгоритмические задачи на собеседованиях, то это не так. Подавляющее их большинство без проблем решается за отведенное на интервью время без предзнания.
                          –2
                          Ага, только они потом нафиг не требуются, опять же, в большинстве компаний, однако они упорно их задают, теша свое самолюбие
                            0
                            Любое задание которое вы выполняете на работе это и есть задачи которые перед вами ставят. Только это задачи из реальной жизни. Суть статьи именно о них.

                            А на собеседовании их обычно задают для проверки уровня кандидата, а не для самолюбия.

                            По моему опыту примерно 50% собеседуемых не могут ответить на элементарные вопросы, при этом хотят зп 100к +
                              +1
                              Что вы понимаете под «элементарные вопросы»? Приведите пример.
                              Т.е. я правильно понимаю, что задачи, по типу олимпиадного программирования или нахождения производной в собеседовании на работу в обычную контору(банк, веб-приложение и т.п.), а не какой-нибудь рокет сайнс/блокчейн/ML/криптография/аналогичное, это нормально, а знание инструментов и фреймворков, с которыми придется работать, а также культура написания кода вовсе не важны на начальном этапе?
                                0
                                Например когда senior full stack developer не способен объяснить на пальцах как происходит загрузка данных по http и что такое keep alive.

                                Или человек не знает самой концепции переменных, в прошлой теме кто-то рассказывал. А кидал тучу скрытых editBox на дельфи-форму. И делал достаточно сложные проекты. Тоже наверное сидит и рассказывает, что «это все нафиг не требуется, столько лет работал без них, переменные только в рокетсаенсе и нужны»
                                  0
                                  Как я уже написал, не путайте знание инструментов и фреймворков для практической работы с алгоритмическими задачами про коня в вакууме там, где они точно не потребуются
                                    0
                                    Я не понимаю, что значит «алгоритмический конь в вакууме». Вам никогда структуры данных не были нужны? Вы не приходилось задачу на подпункты разбивать? Или что?
                                      0
                                      «алгоритмический конь в вакууме» — это когда ты приходишь на собеседование на условный проект по созданию приложения для складского учета, а тебя спрашивают про «как посчитать площадь стен домов в городе, чтобы рассчитать количество требуемой краски в литрах» или например про какую-нибудь производную… Вместо того, чтобы сделать акцент на структуры данных ЯП, который используется в проекте,
                                      фреймворки, стиль написания кода, именование переменных/методов/классов, понимание того, какой жизненный цикл задачи, начиная от постановки аналитиком и заканчивая взаимодействием с QA
                                        0
                                        или например про какую-нибудь производную

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

                                        как посчитать площадь стен домов в городе

                                        Это где такое справшивают? Уже давно вроде как перестали узнавать почему люки круглые.
                                        Вместо того, чтобы сделать акцент на структуры данных ЯП, который используется в проекте,
                                        фреймворки, стиль написания кода, именование переменных/методов/классов, понимание того, какой жизненный цикл задачи, начиная от постановки аналитиком и заканчивая взаимодействием с QA

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

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

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

                                            А непосредственно сами производные — первое что лезет в голову
                                            1. Есть куча вещей в прикладной области. Например нарисовать другим цветом кусок графика если он быстро растет.
                                            2. Интерполяция данных опять же. Ну невозможно интерполировать данные не зная что такое производная и какой ее смысл.

                                            Это все еще чисто прикладные области.
                                              0
                                              Т.е. вы считаете, что я должен помнить всю вышку из универа? А если я все это время работал в обычном ынтырпрайзе и нигде это не было нужно, от слова совсем, а тут такое… Да, вы можете сказать, что описание вакансии как бы предполагает знание предметной области и поэтому мне сначала придется изучить все, что связано с трейдингом. Вы еще скажите, чтобы у меня было высшее образование по экономике, тогда точно я смогу общаться без проблем с людьми. Ну извините, не все обладают такой памятью и интересом к высшей математике
                                              И кстати да, это совсем не технический бекграунд
                                                0
                                                Т.е. вы считаете, что я должен помнить всю вышку из универа?

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

                                                Ну извините, не все обладают такой памятью и интересом к высшей математике

                                                Ну да. Именно поэтому и берут не всех, а вначале проводят собеседования. Я не понимаю ваших претензий.
                                                  0
                                                  Ммм… Ну, у нас производные в школе давались, никак не в вузе.
                                                    0
                                                    Хрен редьки не слаще. В школе много чего давалось, однако это не означает, что мы обязаны все помнить на все случаи жизни.
                                                      +1
                                                      Ну, программирование все же считается технической профессией, что подразумевает знания/способности/интерес к точным наукам обычно. Хотя как по мне спрашивать производную действительно смысла мало. Объяснить ее любому чайнику на простом уровне можно очень быстро, а более углубленные знания таким способом вообще не проверяются. К слову лично у меня этих углубленных особо и нет))
                                  +1
                                  А на собеседовании их обычно задают для проверки уровня кандидата, а не для самолюбия.
                                  Только таким образом проверяют умение решать типовые алгоритмические задачки на время, а не уровень кандидата
                                  0
                                  Если эти задачи задают, значит, лучше ничего не придумали для отсева. Ну и вполне есть места, где можно применять знания алгоритмов, не считая даже ежедневных решений типа «что мне здесь использовать, TreeMap или HashMap?»
                                    0
                                    значит, лучше ничего не придумали для отсева

                                    Ха! Люди настолько ленивы, что им проще делать как все, чем подумать над тем, кто им конкретно нужен.
                                    Ну и вполне есть места, где можно применять знания алгоритмов

                                    А я и не говорю о таких местах, они безусловно есть и спрашивать там логично и правильно, но это меньшинство, а большинство спрашивает то, что у меньшинства, потом огребая тонны говнокода, багов и тратят время на обучение, после которого их успешно покидают в те самые места, которые меньшинство
                                    Даже если вам кажется, что это школьная программа, так что, это должны все помнить до самой старости? По себе людей не судите, оглянитесь вокруг
                                      +1
                                      Люди настолько ленивы, что им проще делать как все, чем подумать над тем, кто им конкретно нужен.
                                      Кому лень, те постепенно разоряются, в бизнесе каждый день головой думать надо. А вот тех, кто собеседует по алгоритмам, с каждым годом все больше.
                                      Даже если вам кажется, что это школьная программа, так что, это должны все помнить до самой старости?
                                      Давайте вспомним, с чего началась ветка. Я спорю с конкретным утверждением:
                                      Дать ответ на задачу быстро в условиях стресса, может только человек, который эту задачу уже решал или знает ответ
                                      Оно не верно. Человек, прошедший подготовку, которую без проблем может пройти даже школьник, может решить задачу без предзнания. Это все, что я изначально хотел сказать.
                                  0
                                  Подавляющее их большинство без проблем решается за отведенное на интервью время без предзнания.
                                  Не совсем. Если вы в свободное время, занимаетесь дрочерством таких задачек, то да, вы сможете быстро их решать. Но, как ниже отметили, к реальной практике это отношения не имеет.
                                    0
                                    Достаточно когда-то давно в школьном возрасте немного ими интересоваться и участвовать в школьных олимпиадах (по моему опыту). Несколько удивляет, когда люди называют крайне сложным то, что по плечу школьнику, при должной подготовке.
                                      +1
                                      участвовать в школьных олимпиадах
                                      Может еще надо было на пятерки учиться и не прогуливать?

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


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

                                      Если эти задачи задают, значит, лучше ничего не придумали для отсева
                                      Скорее это значит что интервьюер просто исптытывает интерес к таким задачам. На своей практике сталкивался с такими людьми, которые решение задачи на собесе ставили в приоритет остальным знаниям. Из десятка разрабов, нанятых таким способом, испыталку прошел один. И это не единственный пример
                                        0
                                        Может еще надо было на пятерки учиться и не прогуливать?
                                        Школьные олимпиады — это достаточное условие, но ни в коем случае не необходимое. Просто для иллюстрации того факта, что нет ничего сложного в решении задач с собеседования за время собеседования. Поскольку это доступно даже школьнику.
                                        Логики не прослеживается.
                                        Логика очень проста: есть компании, которые спрашивают на собеседованиях олимпиадные задачи, а есть те, которые спрашивают что-нибудь другое. По моим субъективным наблюдениям, первых постепенно становится больше, чем вторых, и условия работы в них, как правило, лучше. Из чего я делаю вывод, что это более эффективный метод подбора персонала.
                                        Из десятка разрабов, нанятых таким способом, испыталку прошел один
                                        Давайте я тоже субъективный опыт приведу. Два этапа собеседования: онлайн-тест и очное собеседование в офисе. Пока тест был на реализацию «условно реальной» фичи, большинство участников очного собеседования были никакие. Когда тест был заменен на список «олимпиадных» задач, все до единого участники очного собеседования стали как минимум «нормальные», а многие и «хорошие».
                                          –2
                                          Просто для иллюстрации того факта, что нет ничего сложного в решении задач с собеседования за время собеседования
                                          Сложного ничего нет, но почему соискатель должен тратить свободное время на откровенную ерунду, непонятно

                                          Из чего я делаю вывод, что это более эффективный метод подбора персонала.
                                          Причина намного проще — это банальная мода. Все хотят быть как гугл или фейсбук и тащаят оттуда модные штуки для собесов. Но на качество продуктов этих гигантов они не смотрят.
                                          Спойлер
                                          Качество — говно

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

                                          Давайте я тоже субъективный опыт приведу
                                          Я вам объективный критерий в своем примере привел. А никакие, нормальные и хорошие это оценочные суждения. Расшифруйте что это значит.
                                            +1
                                            почему соискатель должен тратить свободное время на откровенную ерунду, непонятно
                                            Не должен. Если не хочет, может не тратить, его никто не заставляет.
                                            Причина намного проще — это банальная мода.
                                            Почему вы так считаете? Я, по опыту общения с владельцами бизнесов, могу сказать, что им постоянно нужно думать об эффективности, и неверное решение очень быстро может привести к краху. А еще я вижу в мире вокруг себя эксперименты — некоторые вон разработчиков нанимают даже по логам поисковых запросов. То есть, люди явно заинтересованы в повышении эффективности, ищут варианты, но, в основном, используют алгоритмические задачи. Неужели все дело только в моде?
                                            за последние десять лет уровень среднего разраба сильно просел
                                            Это противоречит моим наблюдениям.
                                            никакие, нормальные и хорошие это оценочные суждения. Расшифруйте что это значит.
                                            Объективно — конверсия на очном собеседовании выросла более, чем на порядок, без изменения его формата или критериев оценки.
                                              0
                                              Почему вы так считаете?
                                              По опыту общения с теми, кто нанимает людей и дает задачки на собесах. Многие из них чуть ли не в прямую об этом говорят.

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

                                              Объективно — конверсия на очном собеседовании выросла более, чем на порядок, без изменения его формата или критериев оценки.
                                              Расшифруйте что такое никакие, нормальные и хорошие, про конверсию и так понятно. Какие именно у вас критерии оценки? Может вы их по решению задач оцениваете, ясное дело конверсия вырастет. В моем примере конверсия на собесах тоже была неплохая, только кандидаты работать не умели в итоге
                                                0
                                                По опыту общения с теми, кто нанимает людей и дает задачки на собесах
                                                Я делаю противоположный вывод тоже по опыту общения с теми, кто собеседует и нанимает людей.
                                                При росте количества новых разработчиков и уменьшении порога входа, средняя квалификация расти не может.
                                                Появление новых, более простых, направлений, не означает, что снижаются требования в уже существующих.
                                                Какие именно у вас критерии оценки? Может вы их по решению задач оцениваете, ясное дело конверсия вырастет.
                                                Оценивались по знанию алгоритмов, знанию инструментов, умению мыслить (оцениваемому посредством прокси «умение рассуждать вслух»), умению построения архитектуры.
                                                За время испытательного срока не отсеился никто, как до изменения формата теста, так и после.
                                      +3

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

                                        0
                                        Ну есть и есть. Какое это отношение к рабочим задачам имеет? Можем так же проверять умение рисовать на собесе. Поверьте, есть программисты которые умеют красиво рисовать не ходя в художественную школу, а просто брать в руку карандаш, включать воображение и придумывать картины.
                                          +1

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


                                          Вообще, если у вас есть какие-то доказательства что отказ от задачек или из замена на что-то другое увеличит КПД процесса найма программистов, назовите их уже.

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

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

                                    Зачем вообще расстраиваться, что компании проводят плохие собеседования? Там же скорее всего работаь еще хуже. Если компания не может организовать процесс найма сотрудников, то в работе там такой же бардак. Радуйтесь, вы потратили пару часов и точно знаете, что вам туда не нужно.

                                    Однажды я отработал в компании всего несколько дней и уволился. Процесс найма был отличным, я с удовольствием прошел 4 тура собеседований, и с HR, и дважды с технарями, и с руководителем. Мы обсуждали мой предыдущий опыт, решали довольно интересные задачи, не типовые. Я много расспрашивал про рабочий процесс, проект в котором я буду работать, в общем выглядело все очень хорошо. Когда я вышел на работу, оказалось, что я буду работать в совершенно в другом продукте, с другими людьми, и с другими технологиями, да и процессы там свои. А тратить свое время на то болото мне не хотелось, т.к. проектов поинтересней было предостаточно.
                                      +3

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

                                      –2
                                      Видимо, у автора нет опыта применения своих советов. Иначе он показал бы хоть один конкретный пример.
                                        0
                                        Господин минусёр, а вы можете поделиться опытом применения этих советов?
                                          0
                                          Не берите близко к сердцу, когда автор статьи может максимум выразить свое несогласие «минусом» и сказать ему особо нечего, это очень красноречиво говорит о его уровне и качестве статьи.
                                            +2
                                            А причем здесь автор? Это же перевод. Или автор свою статью на русский перевел?
                                        +6
                                        «Каждый должен учиться программированию, потому что оно учит думать.» сказал дизайнер Стив Джобс
                                          0

                                          Потому что дизайнеру Джобсу нужны были подчинённые-программисты.
                                          Вот он и учил их думать, что учит их думать. (А на самом деле, он учил их программировать на Джобса).

                                          0
                                          “Если вы не можете объяснить что-то простым языком, то вы не понимаете этого.”

                                          —  Richard Feynman

                                          Это был Эйнштейн.
                                          В оригинале:
                                          If you can't explain it simply, you don't understand it well enough.
                                            0

                                            "Этим Фейнманом был Альберт Эйнштейн" :)))

                                              0
                                              Папа, как звали Бетховена?©
                                              Был у меня приятель — Миша. Как-то в уже не очень сопливом возрасте, лет так в 16-17, подходит он к папе и спрашивает:
                                              — Папа, а как звали Бетховена?
                                              Папа, пожилой интеллигентный еврей, начинает на Мишу брызгать слюной:
                                              — Миша, да как ты можешь! Ты же интеллигентный человек! Ты учишься в школе! Мы тебя воспитывали! Просто позор в таком возрасте этого не знать! Каждый должен впитать это с молоком матери!..
                                              Ну и так далее. Потом, выговорившись, назидательным тоном:
                                              — Запомни, Миша, Бетховена звали Иоганн… Себастьян… (Садится на стул, делает паузу секунд на 10...)… Бах.
                                              ©
                                            +3
                                            «Каждый должен учиться программированию, потому что оно учит думать.»

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

                                              –1
                                              3. Декомпозиция

                                              В этом направлении есть отличные лекции по динамическому программированию. Можно поискать «Игорь Клейнер» на Ютубе.
                                                0
                                                У меня как уже иностранца в голове засел встречный вопрос — почему русскоязычники/люди-из-СНГ в среднем лучше кодят/соображают чем их собратья по цеху?
                                                  0

                                                  Жизнь такая .) Потому что собратья из СНГ воспитаны поколением, которому ничего нельзя было купить. Кто-то развивал коммуникативные навыки для добычи "того что нельзя достать", а кто-то искал альтернативные варианты решения задачи. Отсюда образ мышления, передавшийся с поколением. Первая мысль не "где я могу это купить", а "как я могу это сделать из говна и "

                                                    +1
                                                    Так «кодят» или «соображают»? Это несколько разные вещи :)

                                                    Не уверен, мои наблюдения этого не подтверждают. В принципе есть, грубо говоря, две традиции изучения: западная, которая идет через понимание, и восточная, которая идет через повторение/заучивание. Постсоветское пространство традиционно болтается где-то посередине с заметным креном в восточную. Соответственно все, что требует понимания и охвата на высоком уровне, часто вызывает сложности.
                                                      0
                                                      Сообразительно пишут код)
                                                      +1
                                                      русскоязычники/люди-из-СНГ в среднем лучше кодят/соображают

                                                      А кроме ваших слов, это как-то еще подтверждается?
                                                        0
                                                        Мои умозаключения основаны на моем опыте — слышал от других, читал, замечал(живу в Европе). А по факту — единственное, что на ум ещё приходит это та же ежегодная олимпиада по программированию, где Россия занимает 7 лет подряд первые места
                                                          0
                                                          та же ежегодная олимпиада по программированию
                                                          Если вы про IOI, то там Россия, конечно, среди лидеров, но не на первом месте: таблица медалей, таблица выдающихся участников. А если вы про ACM ICPC, то там хорошо видно, что у нас есть лишь некоторые яркие школы, а средний уровень не так уж и высок: таблица лучших ВУЗов, там же чуть ниже — таблица числа чемпионств по странам.
                                                            0
                                                            Про ACM ICPC. Спасибо за обзор) А что про русских хакеров тогда? Они хотя бы в топе?
                                                              0
                                                              Я от этой темы далек. Ближайший ко мне специалист по компьютерной безопасности — бывший моссадовец. Но да, он этнический русский.
                                                        0
                                                        Может 70 лет тирании, диктатуры и идиотизма, а потом и последовавшие 15 лет нищеты, повысили шизоидность народа?
                                                        0

                                                        Э… А где здесь урок?


                                                        Лекцию мотивировочную вижу. А примеры, упражнения, разбор конкретных задач?

                                                          0
                                                          Играя в шахматы можно хорошо научится только играть в шахматы. Ни шахматы ни видеоигры ни кроссворды никак не помогут научится решать программерские задачи.
                                                            0
                                                            но тем не менее, эти занятия улучшают «общую мозговую деятельность». что-то типа «ОФП для мозгов»
                                                            0
                                                            Большинство работодателей считает более важным навык решения задач.

                                                            —  Hacker Rank (2018 Developer Skills Report)

                                                            Как неожиданно. Сайт с задачками утверждает, что главное в карьере — задачки…
                                                              0
                                                              То что мы каждый день делаем на работе это тоже задачи. И смысл в том, что надо понимать их суть в том числе со стороны бизнеса, и уметь разобраться и декомпозировать. А сайты с задачками как раз и помогают улучшать эти навыки.

                                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                            Самое читаемое