На главную

Как я популяризировал программирование

29-06-2021

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

Посидел пару вечеров, собрал материал, составил план, подготовил доклад. Доклад получился большой — на целый час. Это много.

Есть несколько правил подготовки выступлений. Одно из главных: держать в голове образ предполагаемого слушателя. Для меня слушатель был молодой, но умудрённый. Кто-то, кто пошёл на курсы, чтобы обрести, наконец, профессию. Возможно, старший студент, который в теории знает много, а на практике нуждается в присмотре.

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

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

Внезапное бедствие

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

Какое отношение всё это имеет к программированию? Выясняется, что самое прямое. Программирование оказалось побочным эффектом битвы математиков за математику.

Два видео для тех, кому тема кажется интересной.

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

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

Полезно иметь похожий алгоритм и для арифметики, не правда ли?

Однако, математики выяснили, что такого алгоритма вообще не может быть. Сначала этот факт установил Алонзо Чёрч, а через несколько месяцев — Алан Тьюринг. Оказалось, алгоритм можно придумать не для каждой задачи, что, конечно, очень всех расстроило.

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

Поэтому сейчас мы не сидим без работы.

Лучший язык программирования

Этот вопрос весьма прагматичен. Согласитесь, неплохо выучить один язык и писать на нём десятилетиями. Основная проблема — определиться с выбором, чтобы не пришлось переучиваться. Вторую часть доклада я посвятил поиску лучшего языка, что не просто интересно, но и практически полезно.

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

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

Нам необходимо сформулировать новый — корректный — вопрос. Не какой лучший язык программирования, а как быстро изучать новые языки?

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

В частности, слегка инженерный синтаксис C повлиял на C++, Objective-C, Perl, Java, PHP, JavaScript, C#, Go и Rust. Мне повезло, что я выучил C в 1989-м.

Зная Java и C++, я написал первую полезную программу на C# через двадцать минут после начала изучения — все концепции были мне знакомы. Это ключ к быстрому освоению языков.

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

Какие бывают семейства? Есть несколько устоявшихся классификаций, которых мы будем придерживаться.

Исторически, самая ранняя классификация касалась первых языков программирования — Fortran и LISP. Первый из них был императивным, то есть состоял из императивов — команд.

Второй положил начало функциональным языкам, поскольку все вычисления в нём можно описать комбинацией функций.

К императивным, помимо Fortran, можно отнести Pascal, C, C++, Java, C#, Python, Go. К функциональным — Scheme, Clojure, Haskell, Scala, Erlang.

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

В противовес им, в объектно-ориентированных языках программист размещает код и данные вместе и называет объектом. К объектно-ориентированным языкам относят C++, Object Pascal, Java, C#, JavaScript.

Существуют ли объектные функциональные языки? Да, конечно — язык может принадлежать разным семействам. Если Pascal императивный и процедурный, то OCaml проектировался именно как функциональный и объектно-ориентированный. Из него вырос F# — функциональный язык платформы .NET.

Языки, хорошо подходящие для быстрого старта — скриптовые. Многословное русское название этого семейства — языки сценариев. К ним относятся JavaScript, Python, PHP.

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

Эти языки идеальны для небольших проектов и прототипов. А ещё — для обучения программированию.

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

Для таких языков характерен бойлерплейт — избыточный код, который программист вынужден писать, чтобы удовлетворить ограничениям языка. Эти ограничения помогают вылавливать непрошенные ошибки в программе. К этому семейству языков принадлежат C++, Java, C#, Go, Kotlin.

Системные языки позволяют писать эффективный код. Они низкоуровневые, требуют ручного управления памятью и сложных манипуляций для несложных задач. В эту категорию входят C, C++, Rust и, в какой-то мере, Go.

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

Стоит упомянуть нишевые языки, которые могут входить в разные семейства, но которые вы обязаны выучить, если собираетесь разрабатывать определённый софт. Например, фронтенд невозможен без скриптового объектно-ориентированного JavaScript.

Полезно помнить, что языки отличаются не только смыслом, но и синтаксисом. Даже человек, далёкий от программирования, без труда отличит Pascal от C, но оба они процедурные и императивные. Выучив один, вы быстро освоите другой.

Фундамент

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

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

Но здесь полезно вспомнить историю. Двадцать лет назад «формы шлёпали» не на JavaScript, а на Delphi. Бекенд писали на Perl, а PHP только-только появился. Да и сам Perl был чем-то новым по сравнению с C++ и, тем более, с C.

За свою карьеру, хотите вы этого или нет, вы поменяете стек несколько раз. И, возможно, единственное, что вам не придётся изучать на новых платформах — это алгоритмы и структуры данных.

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

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

Разберитесь с непрерывной интеграцией и развёртыванием (continuous integration/continuous deployment). Настройте автоматическую сборку своих проектов.

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

Доведите знание английского до уровня upper intermediate — B2. Этого достаточно для того, чтобы воспринимать английскую речь на слух, общаться с носителями языка и писать письма.

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

Обучение требует времени, с нуля до уровня B2 можно дорасти примерно за три года. Если не владеете языком, не тяните.

Наверное, на этом можно было бы остановиться. Я сделал интригу в первой части, и дал полезные советы во второй. Всё?

Нет. Интересный доклад похож на драму, а драма требует трёх актов, каждый из которых должен разворачивать действие в неожиданном направлении. Мы поговорили о технических аспектах профессии, но, кажется, git и алгоритмы — не самые важные вещи для программиста. А какие самые важные?

Нетехнические аспекты

Третья часть доклада самая спорная, поскольку она про soft skills. Среди программистов гибкие навыки пользуются дурной славой. Разберёмся, почему?

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

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

Мы учились своей работе, они — своей. Всё, точка, гибкие навыки нам не нужны. Логично?

Почти. Для полноты картины надо всё-таки убедится, что технические навыки важнее для инженера, чем социальные.

И это можно проверить. Соответствующие исследование провели Хекман и Кауц в 2012 году. Посмотрите на результаты в таблице 2, где отражено влияние интеллекта и характеры на достижения к 35-ти годам.

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

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

Навыки взаимодействия

Что же это такое — soft skills? Откуда они появились?

А появились они из большого исследования, которое армия США проводила в 50-60 годы прошлого века.

Военные исследовали разные методы обучения, чтобы выявить самые эффективные. Результатом десятилетнего исследования стала новая дисциплина — Системная инженерия обучения (System Engineering of Training). Исследователи обнаружили, что некоторые навыки легко поддаются измерению. Например, в работе радиста важны скорость передачи и количество ошибок, которые мы можем посчитать без особого труда.

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

С другой стороны, такой навык, как дружелюбие измерить трудно. Значит, и развитие навыка, и эффективность обучения оценить тоже трудно.

Понятия hard и soft skills ввёл Уитмор в докладе 72-го года. С hard всё понятно — это старые добрые профессиональные или технические навыки. А вот гибкие навыки — это важные рабочие навыки, которые не относятся к техническим, и не зависят от вида деятельности.

У нас всё ещё нет устоявшегося перевода, и слово гибкие не раскрывает понятия. Я предлагаю говорить о социальных навыках или навыках общения.

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

Это замечание усложняет нам задачу. Действительно, что именно нам развивать и как измерять результаты, если социальные навыки так неуловимы?

Какими бывают навыки общения?

Марсель Робле из Университета восточного Кентукки в 2012 году проделал большую работу. Теперь мы знаем, что такое навыки общения.

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

Всего в списке оказалось 517 навыков, многие из которых повторялись. После группировки и фильтрации осталось 26 навыков, из которых профессор отобрал 10. Они встречались в ответах чаще других.

Большая пятёрка

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

Ответы на эти вопросы психологи начали искать ещё в первой половине XX века. В 1936 году Олпорт и Одберт выдвинули лексическую гипотезу, предположив, что все черты характера так или иначе представлены в языке. Они проработали словари английского языка и составили список из 4500 прилагательных, описывающих личность.

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

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

Сейчас они известны, как большая пятёрка.

Эти черты характера можно измерить, воспользовавшись, например, опросником 5PFQ, адаптированном для России А. Б. Хромовым. Он есть и в онлайн-варианте. Ответы на 75 вопросов отнимут у вас приблизительно десять минут.

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

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

Характер остаётся неизменным.

Можем ли мы измениться?

Возможно, потому, что мы не стремимся его изменить?

В 2015 году Хадсон и Фрейли попытались выяснить, можно ли влиять на характер и на какую скорость мы можем рассчитывать. Оно называется Volitional personality trait change: Can people choose to change their personality traits? и датируется 2015 годом.

Я видел его пару лет назад, сейчас оно исчезло из интернета и доступно только за деньги.

Есть похожий материал тех же авторов 2018 года.

Для оценки изменений Хадсон и Фейли брали тест большой пятёрки. Они не предлагали конкретных методов коррекции — студенты сами решали, как именно они будут работать над собой.

Лучший результат изменений составил 0,05 сигмы в месяц, средний — 0,02. С одной стороны, это небыстро, с другой, этого вполне хватает, чтобы за полгода внести в характер ощутимые коррективы.

Сигма — стандартное отклонение. Представим, что наш тест показывает, где человек находится на шкале интроверсии-эсктраверсии числом от 0 до 60.

В теорвере формула нормального распределения подобрана так, чтобы всю выборку можно было разделить на шесть сигм. В диапазоне 0–10 окажутся экстремальные интроверты, а в диапазоне 50–60 — такие же экстраверты.

Середина нашей шкалы это 30, и диапазон от минус сигмы до плюс сигмы от середины считается условной «нормой». В нашем случае нормальные люди имеют показатели от 20 до 40.

Чтобы добраться от нижней границы нормы до середины, потребуется от 20 до 50 месяцев, и это довольно долго.

Целесообразность длительной работы исследователями не подтверждается. Граве, изучая эффективность разных методов психотерапии, в 1994 году показал, что положительных показаний для долговременного анализа нет, а отрицательные есть. Это так называемые ятрогенные эффекты — неблагополучные побочные эффекты лечения.

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

Психотерапия как метод работы

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

Кто вообще проверял эффективность терапии?

Оказывается, много кто, в том числе и Граве, на которого мы ссылались. В 70-е годы терапевты начали применять научные методы для оценки своей работы.

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

Уэкслер, Келли и другие получили интересные результаты в исследовании 2011 года. Они собирали субъективную оценку после применения лекарств против астмы и сравнивали её с объективными результатами. Первое лекарство было настоящим, второе — ингалятор-пустышка, третье — фейковая акупунктура. Четвёртая группа была контрольной, больных не лечили.

Субъективно, улучшения заметили больные из всех групп, кроме четвёртой. Астматики оценивали эффективность пустышки также высоко, как и эффективность реального лекарства. Но объективно никакого улучшения не было.

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

Точно также люди в течение жизни становятся более конформными, учатся избегать конфликтов. Это естественный ход вещей. Но вы можете считать, что это связано с тем, как вы работали над собой, если работали. Например, на основании «опыта» можно утверждать, что чтение художественной литературы смягчает характер. Но есть ли тому объективное подтверждение?

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

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

Эффективные методы

Исследователи давно сравнивают эффективность методов терапии, и эти результаты открыты. Традиционно, самой известной практикой является CBT (КПТ, когнитивно-поведенческая терапия). Последние несколько лет не менее популярна ACT (ТПО, терапия принятия и обязательств).

Эффективных методов немало, помимо перечисленных можно практиковать CFT, DBT, EFT, гештальт-терапией и ещё десятком других.

Важный вопрос: стоит ли посещать терапевта? Можно, но не обязательно. Работа со специалистом может оказаться эффективной в первое время, если у вас небольшой опыт самотерапии.

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

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

Пара книг для начала.

Разум рулит настроением

Разум рулит настроением

Книга Д. Гринбергера и К. А. Падески описывает методы когнитивно-бихевиоральной самотерапии. Мне её рекомендовали, как трудную и скучную, но оказалась, что практики, описанные в книге, очень нравятся программистам. Предстоит много писать, заполнять анкеты и отслеживать результаты. Очень похоже на работу программиста.

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

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

Так работает когнитивно-поведенческая терапия.

Ловушка счастья

Ловушка счастья

Книга Р. Хэрриса описывает самотерапию принятия и ответственности. Она прекрасно дополняет КПТ вот в каком отношении.

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

Быть ответственным трудно, ещё труднее быть терпимым. Как изменить своё эмоциональное отношение? С помощью ТПО. Этот метод помогает принимать неизбежные неприятные эмоции, которые постоянно возникают в нашей жизни.

Заключение

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

Но оказалось, что я делал доклад для старшеклассников. Бедные дети. Урок был первым, начинался в девять часов, и некоторые школьники беззастенчиво спали.

У меня был один благодарный слушатель. Учительница. Она задала больше всех вопросов.

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

И пусть простят меня школьники, которым пришлось всё это слушать.