Как научиться мыслить как программист
Мысли как программист, чтобы находить необычные решения
Каждый человек должен научиться программировать компьютер, потому что он учит вас думать.
Ты, скорее всего, задумался о том, что значит мыслить как программист? Подобный образ мышления может научить тебя думать иначе, не стереотипно. Ты сможешь найти выход из любой ситуации и сумеешь решить какую угодно проблему, благодаря нестандартному образу мысли; также появится некая системность мыслительных процессов.
«Практически все работодатели сначала ставят приоритеты в решении проблем. Умение решать проблемы является самым важным навыком, который работодатели хотят видеть у своего сотрудника: оно важнее, чем знание языков программирования, отладка и дизайн системы. Демонстрация вычислительного мышления или способность преодолевать большие сложные проблемы столь же ценны (если не более), как и базовые технические навыки, необходимые для работы» — цитата на одном из крупнейших хакерских форумов.
Так что же ты должен делать, столкнувшись с очередной проблемой?
1. Пойми суть
Большинство проблем могут показаться нерешаемыми, потому что ты не понимаешь их сути. Но как найти ее, если кажется, будто нет выхода? Разложи ситуацию на составляющие и объясни все максимально простым языком. Когда ты проговариваешь каждый волнующий тебя момент и ищешь решение, то вскоре найдешь логические несостыковки, которые помогут выйти из ситуации. Большинство программистов так и поступают, когда пытаются найти ошибку в коде: они ищут «дыры» в логике действий и системы. Вот почему ты должен раскладывать каждую ситуацию и объяснять все происходящее простым языком — делай это для самого себя.
«Если вы не можете объяснить что-то простым языком, вы этого не понимаете».
– Ричард Фейнман –
2. Составь план
Не предпринимай никаких действий, не составив предварительного плана: это может лишь ухудшить положение. Тебе вряд ли что-то поможет, если не будет понимания, какие шаги необходимо предпринять для того, чтобы выйти из сложившейся ситуации. Ни один программист не полезет разбираться в коде, если у него не будет четкого плана действий: в противном случае результат может быть удручающим.
3. Дроби проблему на составные части
Не пытайся решить проблему разом — это неправильный путь, который не позволит действовать разумно и методично. Разбей проблему на составные части и разбирайся с каждой из них по отдельности, чтобы не столкнуться с непреодолимыми трудностями. Начинай всегда с самого простого, переходя к более сложным задачам. Этот метод активно используют программисты, и ты должен научиться мыслить и действовать подобным образом. Такая последовательность мысли поможет разложить проблему на составляющие и разобраться с ними индивидуально. Быстро и эффективно.
Если вы застряли, то должны уменьшить проблему до чего-то более простого. Как насчет нахождения самого большого числа вместо третьего по величине? Все еще слишком жестко? Как найти самое большое из трех чисел? Или большее из двух?
Уменьшите проблему до того момента, когда вы знаете, как ее решить, и напишите решение. Затем немного разверните проблему и перепишите решение, чтобы оно соответствовало. Продолжайте движение, пока вы не вернетесь туда, откуда начали».
4. Что делать, если все-таки безнадежно застрял
Что же, подобные неудачи происходят со всеми — главное, сделай глубокий вдох и успокойся: паника лишь усугубляет ситуацию. Профессиональные программисты смотрят глубже и пытаются бороться не с симптомами, а с самой проблемой. Зачем пытаться противостоять последствиям, если необходимо решить именно ее?
Представь, что человек, у которого аллергия на апельсины, продолжает употреблять их в пищу, а потом борется с сыпью на коже. Он мажет раздраженные участки мазью, но продолжает упорно кушать апельсины и даже не принимает никакие средства для того, чтобы купировать приступ. Так же и во всем остальном: все проблемы имеют свои причины, с которыми необходимо бороться, а обращать внимание лишь на симптомы — глупо.
5. Практикуйся
Не думай, что мыслить подобным образом будет легко. Тебе потребуется некоторая практика, чтобы перестроить свой образ мышления и начать смотреть на одну и ту же ситуацию под разными углами. Постоянно напоминай себе об альтернативных методах решения, о том, что существует множество способов, с помощью которых можно выйти из затруднительной ситуации. Учись не мыслить шаблонами, чтобы не ставить себя в безвыходное положение.
Как научиться мыслить как программист — отвечают эксперты
- Ответы экспертов, 17 сентября 2018 в 15:43
- Анастасия Витвицкая
Нам в редакцию Tproger пришел вопрос от подписчика, которым мы хотим поделиться с вами:
«Как научиться мыслить как программист?»
Мы обратились за разъяснениями к нашим экспертам, а полученные ответы предоставляем вашему вниманию.
Михаил Субботин , преподаватель израильской высшей школы IT и безопасности HackerU
Главная задача программиста — понимать, как работает мир, разбивать сложные явления на простые инструкции, а потом собирать их воедино. Программист должен уметь правильно задавать вопросы и находить на них ответы. Поэтому я не вижу разницы между фразами «мыслить как программист» и просто «мыслить». Но если вы все же хотите мыслить «как программист», то начните читать, рассуждать, спорить и находить ответы на вопросы, которые интересуют именно вас. На мой взгляд, программист — одна из немногих профессий, где приходится часто и много размышлять. Так что дерзайте.
Ильназ Гильязов , эксперт курса «Профессия веб-разработчик» университета digital-профессий Нетология
На самом деле, вопрос не такой тривиальный, как кажется. И правильно бы его было сформулировать немного по-другому, как научиться понимать и решать поставленные задачи, т.к. языки программирования, подходы к проектированию и все остальное меняется достаточно быстрыми темпами, но несколько умений остаются вне времени.
Исходя из опыта, могу выделить среди них следующие:
- Умение сформулировать/понять задачу.
- Умение упрощать.
- Умение декомпозировать, выделять главное, и выстраивать логическую цепочку.
- Умение выделять граничные значения и исключительные ситуации.
Спойлер: любой навык и любое умение нарабатывается только практикой.
Умение сформулировать/понять задачу
Фактически нас этому учат с детского сада – сначала выражать и формулировать свои желания, затем ставят все более и более абстрактные задачи, проверяя нашу способность понять их. И все здорово ровно до тех пор, пока вы общаетесь в одном информационном поле (школа, студенты одной специализации, специалисты одной предметной области). Проблемы начинаются тогда, когда вы взаимодействуете со специалистами из другой предметной области – медицина, страхование и т.д. Они говорят на своём языке, к которому привыкли, и вам придётся либо научится понимать, либо искать переводчика.
Как с этим работать: учитесь общаться, учитесь излагать свои мысли, учитесь понимать других людей. В современном мире даже программистам-интровертам этим приходится заниматься. Начните с того, что хотя бы раз в неделю посещайте мероприятия по тематикам, с которым вы никак не связаны, но не просто ходите, а активно задавайте вопросы и пытайтесь понять ключевые идеи и взаимосвязи (это перекликается со следующими двумя пунктами). Можете просто общаться с новыми людьми из других сфер жизни.
Учитесь простыми словами объяснять то, чем вы занимаетесь и над чем работаете, а также понимать, что вам объясняют другие. Всегда проверяйте то, насколько поняли вас, и насколько поняли вы: уточняйте у собеседников, правильно ли вы их поняли, и правильно ли поняли они вас.
Умение упрощать
Из всех компонентов этот, наверное, самый близкий к коду. Упрощайте – используйте техники и подходы, которые позволят вам больше думать о бизнес-задаче, чем о том коде, который вы пишете:
- Early Exit – проверяйте условия в начале метода/функции и выходите, если вас что-то не устраивает.
- Разделяйте объекты на те, что содержат только данные и не содержат логики, и объекты, содержащие логику.
- Разделяйте логику по слоям (неважно, какой паттерн вы выберите).
- Механизм исключений – выбрасывайте исключения, если текущий слой не имеет возможности разобраться с исключительной ситуаций.
- Декларативное программирование (аннотации, декораторы и т.д., в зависимости от языка программирования, но тут важно знать меру).
- Любые другие, которые приведут к сокращению сложности восприятия кода (включая использование готовых библиотек, фреймворков и решений).
Умение декомпозировать, выделять главное и выстраивать логическую цепочку
Одно из ключевых умений, позволяет правильно расставлять приоритеты и проектировать системы. А также, что немаловажно, общаться с заказчиками и руководителями, которым важно все. Суть заключается в следующем – вы должны научиться из любой системы выделять ключевые компоненты, без которых эта система не имеет смысла, и определять их свойства и поведение.
Как с этим работать: опять же, только практика – выбирайте любую бизнес-систему и пытайтесь оставить в ней минимальное количество объектов и их взаимосвязей (если говорить терминами стартап-сообщества – MVP), позволяющих сохранить эту систему в работающем состоянии. Опишите весь процесс по шагам, посмотрите, какие объекты и как взаимодействуют.
Попробуйте понять, почему это взаимодействие устроено именно так. Например, почему процесс заказа или покупки устроен именно так, а не иначе. Можно ли организовать его по-другому? И почему в новых проектах,это взаимодействие иногда строится по-другому (они об этом любят писать в различных источниках).
Найдите changelog’и либо описание истории проекта, посмотрите как менялся проект со временем, с чего начинался, что в него добавлялось и почему.
Умение выделять граничные значения и исключительные ситуации
Говорят, что когда-то очень давно программисты не должны были тестировать свой код. Сейчас ситуация в корне изменилась и в большинстве вакансий присутствует как минимум требование уметь писать авто-тесты.
На самом деле, программисту очень важно изучить теорию тестирования. Потому что именно из этого у вас сформируется понимание того, как обрабатывать различные входные данные, какие условия строить, где вас могут подстерегать ошибки и умеете ли вы вообще с этими ошибками работать.
Вместо заключения
Как уже было сказано в спойлере, ключевое – это практика. Не бойтесь ходить на встречи с реальными заказчиками, не бойтесь задавать вопросы, не бойтесь браться за проекты из другой предметной области (но при этом трезво оценивайте свои силы – если вы ничего не смыслите в медицине, не стоит браться за написание ПО для какого-то аппарата жизнеобеспечения), не бойтесь пробовать новые подходы и методы (когда-то многие вещи из тех, что используются сейчас, высмеивались и считались в корне неверными).
Только через практику вы получите реальный опыт и на нём поймёте, что правильно, а что нет. Яркий тому пример: нас долгие годы учили тому, что нужно выполнить гигантский объём проектирования, нарисовать кучу схем и диаграмм, прежде чем написать хотя бы одну строчку кода. Сейчас всех учат тому, что нужно быстрее планировать и быстрее делать.
Из книжек я бы не рекомендовал те книжки, которые воспитывают вас в духе, мол нужно делать именно так и никак иначе, потому что в первую очередь важно работающее решение, покрытое тестами, а рефакторинг можно сделать потом.
Думай как программист: почему вашей компании нужен свой язык
Специалист по обработке данных Дэвид Уоллер рассказывает, что работники сегодня должны научиться мыслить на языке кода
Сегодня большинство компаний считают, что проведение анализа — это написание формул в таблицах. Но в бизнесе многое поменялось с момента изобретения таблиц. Сегодня организации должны мыслить в масштабах миллионов индивидуальных клиентов, а не только нескольких сегментов, а способы решения проблем должны быть такими, чтобы их можно было использовать не один раз. Нужно применять последние достижения в области машинного обучения и искусственного интеллекта. Словом, компании должны научиться писать код, а не формулы, поскольку будущее труда связано с умением мыслить не только аналитически, но и алгоритмически.
Такая смена перспективы очень важна. Большинство компаний воспринимают код как нечто, спрятанное в загадочных уголках ИТ-отдела, или как прерогативу избранной группы специалистов по обработке данных. Но организации, которым удалось перевести вопросы анализа на язык программирования, часто растут и внедряют инновации быстрее других.
Опора на программирование принесет пользу организациям в трех отношениях.
Во-первых, программистское мышление позволяет четко отделять данные от их анализа и улучшать каждый из компонентов. Когда данные и анализ четко разделены, разные отделы могут сосредоточиться на одном аспекте, что приводит к более быстрому прогрессу.
Во-вторых, код гораздо проще распространять и использовать повторно. Приняв ключевые принципы разработки программного обеспечения, такие как контроль версий, корпоративные команды могут работать более эффективно и коллективно, поскольку обновления файлов отслеживаются в течение всего срока их службы, а изменения можно легко отменить.
Наконец, код подходит как для простого, так и для сложного анализа. Прорыв в технологиях машинного обучения и искусственного интеллекта реализован в виде кода, и благодаря копированию кода, который используют исследователи, люди могут получить доступ к самым современным методам анализа быстро и бесплатно.
Так что должны сделать менеджеры, чтобы перенаправить работников от формул к коду? По нашему опыту, ведущие компании совершают три практических шага.
Разрушение «Вавилонской башни». Общение — это залог для сотрудничества. Языковые барьеры создают самые сильные препятствия для эффективного обмена идеями. Это касается не только обмена текстами или разговоров, но и кода. Необходимость мысленно переписывать идеи на нескольких языках программирования требует дополнительных знаний.
Компании должны выбрать не более двух, а в идеале один язык аналитического программирования в качестве стандарта для всей компании — язык, на котором могут «говорить» все. Проясню: ни один вариант не может быть идеальным для любой ситуации, и разумные люди могут не согласиться с выбранным стандартом, поэтому нужно готовиться к трудностям в управлении изменениями. Но можно успокоить скептиков, согласившись пересматривать стандарты каждые несколько лет.
В качестве первого шага хорошо бы изучить, что делают эксперты. Поймите, что в обиходе в отделах, занимающихся аналитикой — например, финансовый отдел или маркетинговый. Одна глобальная компания, предоставляющая финансовые услуги, воспользовалась именно этим подходом и выяснила, что ее ведущие специалисты по данным остановились на языке Python.
Люди, которые потратили годы, пытаясь отточить свои прикладные математические способности, будут мыслить консервативно, когда речь зайдет о выборе инструментов и методов, и, вероятно, придут в восторг, если их неофициальные стандарты станут официальными. Эти люди станут светочами и учителями в организации, поэтому усиление их авторитета и влияния — это здравый подход и полезная стратегия управления талантами.
Создание хранилищ с общим кодом. После того, как люди переведут свои идеи на один язык, нужно создать репозитории с общим кодом и базы знаний — по примеру открытых сообществ. Это позволит людям быстро и легко делиться своей работой, и никому не придется заново изобретать колесо.
Как и в случае любой централизованной системы, нужно тщательно продумывать вопросы безопасности и разрешений, конфиденциальности и интеллектуальной собственности. Но благодаря репозиториям с общим кодом несколько отделов одной организации могут использовать один и тот же код для решения похожих проблем. Например, маркетинговая команда банка хочет найти клиентов, которые подумывают о рефинансировании ипотеки, чтобы предложить им определенные продукты, а финансовому отделу могут понадобиться данные о тех же людях для проектирования бюджетов и счетов. Формулировка проблемы одинакова в обоих случаях — сколько людей и кто из них способен к рефинансированию? — так почему бы не использовать один и тот же код, чтобы получить ответ?
Чтобы быстро начать работу, нужно выбрать проект, создать хранилище кода и пригласить побольше участников. Платформы для совместного использования кода, такие как GitHub и Bitbucket, легко с этим справляются. Полезно начать с широко применимых и не вызывающих споров проектов, таких как сегментация клиентов или расчет ценовой эластичности.
Некоторые компании, скажем, Google и Microsoft, делятся своим кодом публично. Один оператор связи опубликовал часть своих внутренних разработок, что позволяет компании пользоваться помощью людей, даже не работающих в ней, и это потенциально может стать стандартной платформой для телекоммуникаций.
Сделать код обычной частью бизнеса. Компании, которые хотят получить максимальную отдачу от продвинутой аналитики, сталкиваются со сложной задачей: нужно сделать моделирование на основе кода правилом, а не исключением. Это должно стать делом таким же обыденным, как прикрепление таблицы к электронному письму. А для этого необходимо изменить не только подход, но и привычки. Но есть прагматичные стратегии, чтобы ускорить этот сдвиг.
Во-первых, нужно донести четкие и конкретные ожидания на всех уровнях, от топ-менеджеров до рядовых сотрудников или инвесторов. Во-вторых, нужно дать сотрудникам время, чтобы научиться. Сегодня есть масса возможностей, доступных как для компаний, так и для частных лиц, начиная от учебного лагеря и заканчивая массовыми открытыми онлайн-курсами (MOOC) и индивидуальным обучением. По нашему опыту, любой из этих вариантов может быть успешным, если людям дают время на учебу без отрыва на повседневную работу. Стать компетентным программистом — вовсе не непосильная задача, и менеджерам не стоит думать, что их подчиненные не справятся.
В-третьих, люди должны знать, к кому обратиться за помощью. Страх перед обучением значительно снизится, если эта помощь будет своевременной и актуальной. И люди, которые на шаг впереди остальных, могут стать наставниками для начинающих. Менеджеры, предъявляющие подчиненным новые требования, должны быть готовы сами помогать им — мало что дает более сильный стимул для изучения чего-либо, чем понимание, что вам придется научить этому других.
Но не нужно бояться. В этом новом мире есть много подсказок — популярные ответы, найденные через поисковую систему, учебные ресурсы и т.п. И иногда в этих ответах будут ссылки на обширные репозитории с открытым исходным кодом с решениями всевозможных проблем.
Полезная статья? Подпишитесь на наш канал в Дзене и следите за лучшими обновлениями и обсуждениями на “Идеономике”
Источники:
http://tproger.ru/experts/how-think-like-a-programmer/
Думай как программист: почему вашей компании нужен свой язык