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. Не могу не поблагодарить и не рекомендовать их.

Комментарии (81)


  1. Defersa
    02.10.2018 11:08
    +1

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


    1. klimentRu Автор
      02.10.2018 19:38

      То есть если хочешь стать хирургом, то достаточно купить справочник и тесак? И можно прочесть и идти практиковаться?

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

      Человек который считает, что достаточно прочесть книгу видимо никогда не делал ничего серьезного. Или является непризнаным гением.


      1. Defersa
        02.10.2018 19:46

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


        1. klimentRu Автор
          02.10.2018 20:02

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

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


          1. Defersa
            02.10.2018 20:36

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


            1. klimentRu Автор
              02.10.2018 21:11
              +1

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

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

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


              1. ilitaexperta
                03.10.2018 00:48
                -1

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

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

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

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


                1. Mike_soft
                  03.10.2018 07:34

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

                  многим из них уже даже не приходит в голову, что можно как-то по-своему сделать.
                  видел я «сделанные по своему» модули… креативность, совмещенная с безмозглостью — адская смесь. ну и «сделал по своему» — заставляет вспомнить фразу из анекдота «Штирлиц любил стоять на своём...»


                1. klimentRu Автор
                  03.10.2018 07:45

                  Люди, которые вместо этого заучивают паттерны

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

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

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

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

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

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


                  1. ilitaexperta
                    03.10.2018 16:46

                    Заучивание и изучение это немного разные вещи
                    Да, но паттерны можно только заучить. Это же список примеров, как вы их хотите изучать?

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

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

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

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

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


                    1. klimentRu Автор
                      03.10.2018 16:55

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

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

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

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

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

                      На перфокартах что-ли? Но и тогда были фундаментальные основы.


                    1. Mike_soft
                      04.10.2018 07:22

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


              1. Defersa
                03.10.2018 11:45

                Эта статья — просто популистическая компиляция общих советов, прочтение которых ничего не даст никому. Я вообще не вижу в ней смысла, кроме «скромного» пиара очередной конторы по обучению программистов.
                Программирование в первую очередь это борьба: поиск нужной информации, поиск решения нестандартных проблем и постоянная война с пк. Статьи вида «научим думать как программист», «обучим основам кодинга» в себе кроме как популизма не несут.
                На счет обучения: я жил в местности, где не было интернета и ни одного человека, умеющего программировать. И это мне не помешало в 10том классе сверстать свой первый сайт и написать простенькие скрипты к нему.
                Я это к чему: тому человеку, кто рвется вверх и хочет прогрессировать нужны лишь знания и практика. А тот, кому нужна мотивация и готовые ответы и с этой статьей далеко не уедут.
                PS: почему я категорически настроен против: в статье нет ничего нового, а годной компиляцией назвать ее язык не поворачивается. По большому счету она ничем не отличается от бизнес-тренингов на которых тоже говорят общие вещи типа «экономьте»,«продумывайте» и прочее. Хорошо что хоть тут за прочтение копейку не взяли, и на том спасибо.


                1. bopoh13
                  03.10.2018 16:18

                  У вас реклама головного мозга. Эта ссылка является частью перевода. klimentRu спасибо за перевод. Эта статья является руководством по принципу «Разделяй и властвуй». Всё таки менеджеры не зря бутерброды кушают.


      1. nafgne
        02.10.2018 21:14

        В чём проблема освоить ЧПУ по книгам? От меня в двух метрах уже полгода фрезер стоит, пальцы на месте, брат не умер.


        1. klimentRu Автор
          02.10.2018 21:30

          Одно дело станок для хобби в гараже, другое промышленное оборудование со скоростью перемещения на ускоренном ходу до 30 м/мин. Пролетит перед глазами даже кнопку аварийного останова нажать не успеешь. Стоимостью одной фрезы 5 — 10 к рублей поломка которой уже является существенным косяком. И учитывая особенности обработки от аллюминия до титановых и жаропрочных сплавов. И точности обработки до пяти микрон. Технологического цикла в котором может быть задействовандо 5-10 человек и прочего.

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


      1. 3aicheg
        03.10.2018 05:06

        То есть если хочешь стать хирургом, то достаточно купить справочник и тесак? И можно прочесть и идти практиковаться?

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


  1. ilitaexperta
    02.10.2018 13:29

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

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


    1. anfield343
      02.10.2018 13:39
      +1

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


    1. klimentRu Автор
      02.10.2018 13:44

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

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

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


      1. nicholas_k
        02.10.2018 13:51

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

        Факторы стресса и стрессоустойчивости имеют место быть и должны учитываться обеими сторонами.


        1. Mike_soft
          02.10.2018 16:35

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


      1. ilitaexperta
        02.10.2018 15:16

        Имеется в виду, что разработчик должен комплексно подходить к поставленной задаче, и думать головой
        А что, без этого как то можно разработчиком работать? Хотя если смотреть на нынешнее поколение девелоперлов…

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


    1. alexeykuzmin0
      02.10.2018 16:58

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


      1. werklop
        02.10.2018 17:59

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


        1. klimentRu Автор
          02.10.2018 19:27

          Любое задание которое вы выполняете на работе это и есть задачи которые перед вами ставят. Только это задачи из реальной жизни. Суть статьи именно о них.

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

          По моему опыту примерно 50% собеседуемых не могут ответить на элементарные вопросы, при этом хотят зп 100к +


          1. werklop
            02.10.2018 20:12

            Что вы понимаете под «элементарные вопросы»? Приведите пример.
            Т.е. я правильно понимаю, что задачи, по типу олимпиадного программирования или нахождения производной в собеседовании на работу в обычную контору(банк, веб-приложение и т.п.), а не какой-нибудь рокет сайнс/блокчейн/ML/криптография/аналогичное, это нормально, а знание инструментов и фреймворков, с которыми придется работать, а также культура написания кода вовсе не важны на начальном этапе?


            1. balexa
              03.10.2018 13:28

              Например когда senior full stack developer не способен объяснить на пальцах как происходит загрузка данных по http и что такое keep alive.

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


              1. werklop
                03.10.2018 13:33

                Как я уже написал, не путайте знание инструментов и фреймворков для практической работы с алгоритмическими задачами про коня в вакууме там, где они точно не потребуются


                1. balexa
                  03.10.2018 14:46

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


                  1. werklop
                    03.10.2018 14:58

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


                    1. balexa
                      03.10.2018 15:05

                      или например про какую-нибудь производную

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

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

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

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


                      1. werklop
                        03.10.2018 16:04

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

                        Так именно это и спрашивают
                        Если бы только об этом спрашивали, я не стал бы приводить примеры


                        1. balexa
                          03.10.2018 16:56

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

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

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

                          Это все еще чисто прикладные области.


                          1. werklop
                            03.10.2018 17:07

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


                            1. balexa
                              03.10.2018 17:20

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

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

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

                              Ну да. Именно поэтому и берут не всех, а вначале проводят собеседования. Я не понимаю ваших претензий.


                            1. Neikist
                              03.10.2018 17:31

                              Ммм… Ну, у нас производные в школе давались, никак не в вузе.


                              1. werklop
                                03.10.2018 18:07

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


                                1. Neikist
                                  03.10.2018 18:14
                                  +1

                                  Ну, программирование все же считается технической профессией, что подразумевает знания/способности/интерес к точным наукам обычно. Хотя как по мне спрашивать производную действительно смысла мало. Объяснить ее любому чайнику на простом уровне можно очень быстро, а более углубленные знания таким способом вообще не проверяются. К слову лично у меня этих углубленных особо и нет))


          1. ilitaexperta
            02.10.2018 20:16

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


        1. alexeykuzmin0
          02.10.2018 20:18

          Если эти задачи задают, значит, лучше ничего не придумали для отсева. Ну и вполне есть места, где можно применять знания алгоритмов, не считая даже ежедневных решений типа «что мне здесь использовать, TreeMap или HashMap?»


          1. werklop
            02.10.2018 21:29

            значит, лучше ничего не придумали для отсева

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

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


            1. alexeykuzmin0
              02.10.2018 21:35
              +1

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


      1. ilitaexperta
        02.10.2018 19:06

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


        1. alexeykuzmin0
          02.10.2018 20:20

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


          1. ilitaexperta
            02.10.2018 20:27

            участвовать в школьных олимпиадах
            Может еще надо было на пятерки учиться и не прогуливать?

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


            1. alexeykuzmin0
              02.10.2018 20:51

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


              1. ilitaexperta
                02.10.2018 21:05
                -1

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

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


                1. alexeykuzmin0
                  02.10.2018 21:39

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


                  1. ilitaexperta
                    02.10.2018 22:11

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

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

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


                    1. alexeykuzmin0
                      04.10.2018 15:17

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


        1. slonopotamus
          02.10.2018 20:43
          +2

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


          1. ilitaexperta
            02.10.2018 20:46

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


            1. slonopotamus
              02.10.2018 21:06
              +1

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


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


    1. sentyaev
      02.10.2018 17:32

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

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

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

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


    1. slonopotamus
      02.10.2018 19:57

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


  1. andyudol
    02.10.2018 16:32
    -1

    Видимо, у автора нет опыта применения своих советов. Иначе он показал бы хоть один конкретный пример.


    1. andyudol
      02.10.2018 17:44
      -1

      Господин минусёр, а вы можете поделиться опытом применения этих советов?


      1. Defersa
        02.10.2018 18:00

        Не берите близко к сердцу, когда автор статьи может максимум выразить свое несогласие «минусом» и сказать ему особо нечего, это очень красноречиво говорит о его уровне и качестве статьи.


        1. Neikist
          02.10.2018 18:03

          А причем здесь автор? Это же перевод. Или автор свою статью на русский перевел?


  1. WeltRogg
    02.10.2018 17:15

    «Каждый должен учиться программированию, потому что оно учит думать.» сказал дизайнер Стив Джобс


    1. nickolaym
      03.10.2018 15:02

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


  1. an_v
    02.10.2018 17:59

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

    — ?Richard Feynman

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


    1. nickolaym
      03.10.2018 15:03

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


      1. Mike_soft
        03.10.2018 15:12

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


  1. vba
    02.10.2018 18:37

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

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


  1. didkovskyi
    02.10.2018 19:29

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

    В этом направлении есть отличные лекции по динамическому программированию. Можно поискать «Игорь Клейнер» на Ютубе.


  1. xState_level80
    02.10.2018 23:03

    У меня как уже иностранца в голове засел встречный вопрос — почему русскоязычники/люди-из-СНГ в среднем лучше кодят/соображают чем их собратья по цеху?


    1. FilimoniC
      02.10.2018 23:46

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


    1. Stiver
      03.10.2018 09:35

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

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


      1. xState_level80
        03.10.2018 20:56

        Сообразительно пишут код)


    1. didkovskyi
      03.10.2018 13:13

      русскоязычники/люди-из-СНГ в среднем лучше кодят/соображают

      А кроме ваших слов, это как-то еще подтверждается?


      1. xState_level80
        03.10.2018 20:49

        Мои умозаключения основаны на моем опыте — слышал от других, читал, замечал(живу в Европе). А по факту — единственное, что на ум ещё приходит это та же ежегодная олимпиада по программированию, где Россия занимает 7 лет подряд первые места


        1. alexeykuzmin0
          04.10.2018 15:24

          та же ежегодная олимпиада по программированию
          Если вы про IOI, то там Россия, конечно, среди лидеров, но не на первом месте: таблица медалей, таблица выдающихся участников. А если вы про ACM ICPC, то там хорошо видно, что у нас есть лишь некоторые яркие школы, а средний уровень не так уж и высок: таблица лучших ВУЗов, там же чуть ниже — таблица числа чемпионств по странам.


          1. xState_level80
            04.10.2018 21:17

            Про ACM ICPC. Спасибо за обзор) А что про русских хакеров тогда? Они хотя бы в топе?


    1. agarus
      04.10.2018 00:28

      Может 70 лет тирании, диктатуры и идиотизма, а потом и последовавшие 15 лет нищеты, повысили шизоидность народа?


  1. nickolaym
    03.10.2018 15:05

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


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


  1. tretyakovmax
    03.10.2018 15:13

    Играя в шахматы можно хорошо научится только играть в шахматы. Ни шахматы ни видеоигры ни кроссворды никак не помогут научится решать программерские задачи.


    1. Mike_soft
      03.10.2018 15:44

      но тем не менее, эти занятия улучшают «общую мозговую деятельность». что-то типа «ОФП для мозгов»


  1. agarus
    03.10.2018 22:23

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

    — ?Hacker Rank (2018 Developer Skills Report)

    Как неожиданно. Сайт с задачками утверждает, что главное в карьере — задачки…


    1. klimentRu Автор
      04.10.2018 08:57

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