Обучение программированию на протяжении всей жизни

Превращение «минимально жизнеспособного разработчика» в студента, который на всю жизнь

Я преподаю компьютерное программирование (в частности, веб-разработку) на так называемом учебном курсе по программированию, Galvanize, в Сан-Франциско. У меня есть степень бакалавра компьютерных наук, и я преподаю в той или иной форме всю свою жизнь.

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

Например, я искренне верю, что так называемые теоретические навыки, такие как нотация Big-O и распределение памяти, важны в повседневной жизни инженера-программиста. Альтернативная точка зрения состоит в том, что эти навыки конкурируют за драгоценное время с более прагматическими навыками, которые можно применить к работе в первый же день. Сплоченный клич многих буткемпов состоял в том, что традиционный путь к компьютерному программированию сломан; что эти теоретические навыки не те, которые нужны современным программистам.

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

Обещание индустрии буткемпов - это не что иное, как «готовность к работе через 3–6 месяцев», что означает, что каждый час, потраченный на несерьезные темы, является значительной упущенной возможностью. Мы обучаем новичков, цель которых - начать профессиональную карьеру в области компьютерного программирования. Поскольку у студентов начального курса нет возможности потратить 4 года на то, чтобы по-настоящему изучить огромную область компьютерного программирования, большинство этих курсов нацелены на специальность; У Galvanize есть два целевых иммерсивных курса: веб-разработка и наука о данных.

Столкнувшись с сокращением сроков и амбициозным обещанием готовности к работе, многие люди в моей отрасли чрезмерно корректируют относительную леность академических кругов, спрашивая: «Какой минимально жизнеспособный разработчик?» или «Что такое минимально жизнеспособный разработчик?» минимум, который должен знать студент, чтобы выйти на рынок »?

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

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

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

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

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

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

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

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

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

Я хочу составить список тем для изучающих программирование на всю жизнь. Выбранные мной темы - это то, что я считаю соединительной тканью программирования; темы, которые - после освоения - дают программисту преимущество в всех языках и фреймворках. Это темы достаточно низкого уровня, чтобы их можно было широко (некоторые универсально) применять, но достаточно высокого уровня, чтобы их влияние можно было увидеть в вашей повседневной работе.

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

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

Роль неопытных программистов

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

Как только вы разовьете определенный набор навыков, вам будет легче попасть в одну отрасль или технологию. Повышение в рейтинге вашей компании означает, что ваши начальники захотят, чтобы вы тратили больше времени на эффективную разработку программного обеспечения. Получение звания «Front End Person» или «Java Person» на ранней стадии может помешать важному профессиональному исследованию.

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

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

Найдите минутку, чтобы подумать об этом. Вот мой список:

  • Хорошо знает любой 1 язык программирования.
  • Автономный ученик / имеет установку на рост.
  • Может читать и отлаживать код.

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

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

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

Компании намеренно вкладывают средства в менее опытных инженеров - TylerCo могла бы просто открыть должности среднего уровня, если бы нам потребовались опытные инженеры нет w. Чтобы это окупилось, нашим сотрудникам нужен большой потенциал обучения. Наем квалифицированных учеников дает моим опытным программистам лучший шанс получить положительный опыт преподавания и наставничества. Это также означает, что (надеюсь) вместо того, чтобы нанимать инженеров среднего звена через год или два, мы можем продвигать людей, которые прошли обучение в стиле TylerCo и уже знакомы с системой. Как менеджер по найму я готов пожертвовать определенными навыками в пользу способностей, потому что я вижу, что эти новые инженеры остаются в TylerCo достаточно долго, чтобы вырасти в великих инженеров, которые уже обладают Знанием о племени.

Если мои новые сотрудники - автономные ученики, умеющие читать код, они всегда будут говорить : «Я могу понять, что здесь происходит!» Но даже лучшие автономные ученики могут застрять, если не знают lingua franca. Здесь спрашивают «каков минимально жизнеспособный разработчик?» немного ломается. Если мои инженеры знают только номенклатуру React, а не общую номенклатуру программирования, они с гораздо большей вероятностью застрянут на проблеме, которая не является специфической для React. Чтобы справиться с этой проблемой, учащимся необходим словарный запас, чтобы иметь возможность исследовать любой вопрос из любого стека технологий.

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

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

Деловая смекалка

Мои собственные ~ 6 лет в качестве профессионального программиста еще не составляют долгую карьеру, поэтому я пытался учиться у других. Я дополнил свой личный опыт исследованиями. На мое мнение здесь влияют такие классические произведения, как Мифический человеко-месяц, Дизайн повседневных вещей и Прагматичный программист. Современные представления о технических навыках можно применить и к деловому аспекту программирования. Такое совпадение можно найти в 97 вещах, которые должны знать все программисты; а s, а также конференц-переговоры; и блоги других программистов, профессионалов и компаний. Например, два моих любимых поста в блоге демонстрируют это совпадение: О том, как быть старшим и Выбрать скучную технологию.

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

Чтобы получить совет по ведению переговоров, попробуйте этот подкаст.

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

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

Гибкость и адаптируемость

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

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

Вот статья, опубликованная Стэнфордским университетом, в которой конкретно упоминаются DraftKings и FanDuel. Пожалуйста.

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

Технические навыки

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

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

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

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

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

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

Чтобы сделать этот момент более конкретным: однажды я получил интервью с AirBnB отчасти благодаря моему сопроводительному письму, которое начинается с того, что я прямо и честно заявляю, что у меня нет того опыта, которого они ищут:

Здравствуйте, сотрудники Airbnb!

Я опытный full-stack инженер; путешественник; довольный пользователь Airbnb; и меня интересует эта должность в вашей прекрасной организации. Требования, такие как они есть, вполне подходят для моего фона:

«Ruby-on-Rails в производственной среде»

Нет. Но у меня есть солидные основы веб-технологий, а также опыт работы с Python + Django и Node.js.

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

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

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

Что старое становится новым

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

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

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

Все компьютерные программисты стоят на плечах гигантов; Если вы начинаете программировать в 2017 году, так много уже создано для вас. От программ на перфокартах до ассемблера, компиляторов, от ARPANET до Интернета… Изучение всех деталей всех этих систем - это изучение всей жизни, но более подробный взгляд на историю программирования часто помогает объяснить почему программы работают именно так .

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

объем памяти

Новичкам стоит сразу научиться тому, как работает компьютерная память; начиная с Стек и Куча. Им также следует как можно скорее понять концепцию Передача по ссылке. Эти три ключевых принципа могут помочь программисту отладить типичные побочные эффекты. Они также дают программисту полезную мысленную модель выполнения кода.

Начинающие мастера должны научиться использовать указатели и в конечном итоге написать реализацию malloc на таком языке, как C. Им также следует вручную размещать данные в стеке, написав некоторые программы на языке ассемблера.

Эти низкоуровневые детали не всегда «востребованы» в точности так же, как последняя версия платформы JavaScript, но они того стоят. Ни в одном списке вакансий нет пункта «необходимо реализовать функцию для рекурсивного вычисления n-й цифры последовательности Фибоначчи на языке ассемблера MIPS», - но именно это было одной из лучших вещей, которые я когда-либо делал в своей карьере.

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

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

Скорость

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

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

Параллелизм и параллелизм трудно избежать в некоторых областях. Интернет и JavaScript - отличный тому пример. Конкретно параллелизма невозможно избежать в любом современном интерфейсном веб-приложении - между AJAX и обработкой событий вы можете легко создать условия гонки, даже не осознавая этого. Понимание параллелизма - это критический навык отладки для веб-разработчиков. Сейчас легче избежать параллелизма, но не навсегда; начинающий мастер должен обязательно использовать что-то вроде Pthreads в C или, например, поэкспериментировать с параллелизмом GPU используя CUDA.

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

Парадигмы

Объектно-ориентированное программирование (ООП) слишком распространено, чтобы его игнорировать. Программисты должны понимать классы и объекты как экземпляры классов. Программистам следует заранее изучить объектно-ориентированный язык со статической типизацией, например Java или C ++. Особенно, если вы начинаете с чего-то довольно разрешительного, например, JavaScript, Ruby или Python.

Понимание концепций состояния, поведения и идентичности в объектах очень поможет разработчикам. Наследование, полиморфизм и инкапсуляция следует изучить относительно рано, особенно если вас интересуют компании с более крупными (и более старыми) базами кода, такими как Google или Microsoft.

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

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

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

Замыкания обычно появляются в популярных языках, таких как JavaScript и Python. Их понимание приведет к более глубокому пониманию масштабов и укрепит наши представления о стеке и куче. Возможность переписывать циклы как рекурсивные функции и писать чистые функции может еще больше уменьшить беспорядочные состояния и сделать ваш код потокобезопасным , что связано с параллелизмом и параллелизмом. Подобно тому, как программисты должны исследовать что-то жесткое в ООП (например, Java), программисты должны экспериментировать с серьезным функциональным языком, таким как Haskell.

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

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

Структуры данных

Некоторые структуры данных появляются снова и снова в компьютерном программировании. Многие из этих структур достаточно интуитивно понятны, чтобы начинающие программисты могли (и делают) их органично; Программисты сталкиваются с проблемой, которая эффективно решается с помощью пар ключ / значение, иногда в конечном итоге изобретая карту.

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

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

Основные структуры данных:

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

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

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

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

Образовательные дивиденды

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

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

Как и любые другие инвестиции, мы производим оплату сейчас в надежде, что наши знания позже превратятся в больше знаний. Эти дивиденды выплачиваются на приобретение определенных навыков спустя много времени после того, как были сделаны первоначальные вложения. Даже если вы реализуете только одну рекурсивную ассемблерную программу, ваше понимание кадра стека будет навсегда расширено. Отныне вы быстрее повышаете свой уровень в отладке, поиске утечек памяти и программном мышлении. Раннее инвестирование похоже на 401K: чем раньше вы начнете инвестировать, тем больше будет общий выигрыш.

Программистам необходимо оптимизировать как будущую скорость обучения , так и удержание - это означает, что мы должны нацеливаться на навыки, которые можно использовать регулярно, в дополнение к каталитическим прозрениям, которые приносят дивиденды этим навыкам. Например: знание The Stack, The Heap и особенно понимание «ссылочных типов» приносит дивиденды в умение отлаживать, но нам все равно нужно регулярно отлаживать, чтобы получить преимущества. Программисты будут отлаживать код каждый день, поэтому создание ментальной модели распределения памяти - одно из первых, чему я учу.

Общие Через Конкретные

Противники материалов по информатике часто говорят что-то вроде:

Если я учу своих студентов сортировке слиянием, они, вероятно, не сохранят эти знания, потому что они никогда не собираются внедрять сортировку слиянием с нуля за пределами этого класса. Они собираются использовать [новый популярный веб-фреймворк] прямо сейчас. Мы должны научить подлинным навыкам, которые они действительно могут применить.

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

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

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

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

Баланс и реальность

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

«Я обучаю своих студентов React, потому что существует миллиард React-вакансий».

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

Знание Angular или React - очень ценный навык на данный момент, но через 5 лет он может оказаться не таким ценным, но философские основы этих фреймворков (Model View Controller и Component Based Design) всегда присутствовали. в истории вычислительной техники. Программисты всегда будут приобретать какие-то временные навыки, такие как новая горячая структура - истинный навык - это иметь основы для быстрого изучения следующей. Если вы собираетесь преподавать современный веб-фреймворк, вы должны сделать это , чтобы дать учащимся более глубокое понимание основных концепций, убив двух зайцев одним выстрелом.

С правильной точки зрения учащиеся могут расширить свое понимание деревьев и объектно-ориентированного программирования с помощью DOM. AJAX и обработка событий могут использоваться для понимания параллелизма. Если вы преподаете серверные фреймворки, такие как Express, как пример шаблона проектирования Контроллер представления модели, тогда ваши ученики будут получать прибыль от своих дивидендов, когда они изучают Flask, Rails, Django или что-то еще популярное.

Вспомните мое сопроводительное письмо к AirBnb - это не было случайностью. Технический специалист по подбору персонала был готов признать, что Django является приемлемой заменой Ruby-on-Rails, в основном потому, что я могу объяснить, почему Это актуальный опыт, даже если я не очень разбираюсь в Rails.

Важно использовать конкретные примеры, чтобы мотивировать понимание общих концепций. Непосредственно научить людей абстракциям чрезвычайно сложно. Ориентация на общие концепции с помощью конкретных примеров - гораздо более действенная тактика, но она требует от нас более глубокого изучения отдельных тем. Эта глубина стоит вложений, даже если оставить другие темы на потом. Причина, по которой работа с Python / Django актуальна для работы с Ruby-on-Rails, заключается в том, что оба этих языка и фреймворки основаны на одних и тех же шаблонах.

Корни в шаблонах

Изучать новое легче всего, когда вы можете связать его с тем, что уже понимаете. Практически все языки программирования имеют конструкции для потока управления, функций, переменных и типов данных. Вот почему программисты, которые уже говорят на Ruby и JavaScript, легко могут использовать другой динамически типизированный язык сценариев, например Python.

Фактически, если вы хорошо говорите на Ruby и JavaScript, вы отчасти уже говорите на Python. В дополнение к тому, что Python и Ruby являются языками сценариев с динамической типизацией, Django и Rails основаны на шаблоне проектирования Контроллер представления модели (или MVC). Знание этих абстракций может помочь нам путешествовать от языка к языку или от фреймворка к фреймворку с очень небольшим сопротивлением.

В качестве примера я представлю два очень похожих фрагмента кода. В обоих примерах используются компоненты двух распространенных парадигм программирования - объектно-ориентированного программирования и функционального программирования - оба языка имеют одинаковые слабые места в их дизайне классов / объектов (отсутствие инкапсуляции ), И в обоих примерах мы работаем над этим недостатком, создавая инкапсуляцию с помощью замыкания, сначала в Javascript:

function Cat(age, name) {
  var age = age;    // Private
  this.name = name; // Public

  this.askAge = function(askerIsTrustworthy) {
    if(askerIsTrustworthy) {
      return age;
    }
  }
}

var chunky = new Cat(10, 'chunky');

console.log(chunky.name); // chunky
console.log(chunky.age); // undefined
console.log(chunky.askAge(false)); // undefined
console.log(chunky.askAge(true)); // 10

В Python

def make_cat(age_in, name):
    age = age_in # Private

    class Cat:
        def __init__(self, name):
            self.name = name # Public

        def ask_age(self, asker_is_trustworthy):
            if asker_is_trustworthy:
                return age

    return Cat(name)

chunky = make_cat(10, 'chunky')

print(chunky.name) # chunky
print(chunky.ask_age(False)) # None
print(chunky.ask_age(True)) # 10
print(chunky.age) # Error

Если вы говорите на Python или JavaScript, вам будет намного проще сориентироваться в другом примере. Если вы достаточно хорошо говорите на Ruby, вы, вероятно, сможете хорошо прочитать Python и использовать его для понимания JavaScript.

Если вы не говорите на каких-либо языках сценариев с динамической типизацией, но говорите на чем-то вроде Java, C ++ или другом объектно-ориентированном языке, вы можете присоединиться к ключевому слову class в коде Python и начать работу оттуда. чтобы понять остальное. Если вы знакомы с функциональным программированием, то заметите, что оба используют закрытие, чтобы сделать возраст нашего кота «приватным».

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

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

class Cat:
    def __init__(self, age_in, name):
        self._age = age # Private
        self.name = name # Public

    def ask_name(self, asker_is_trustworthy):
        if asker_is_trustworthy:
            return self._age

chunky = Cat(10, 'chunky')
print(chunky.name) # chunky
print(chunky._age) # 10

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

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

В заключение

Я считаю, что студенты должны начинать обучение с основ. 3–6 месяцев может быть достаточно, чтобы студенты стали компетентными разработчиками на React, но эти знания быстро атрофируются, если их компетенция не связана с чем-то более глубоким.

Питер Норвиг напоминает нам, что для того, чтобы по-настоящему научиться программировать, требуется больше 10 лет. У Мэтта Мая есть целый список вещей, которые все должны знать студенты, изучающие информатику. Обе эти статьи пересекаются с сборником эссе 97 вещей, ссылка на который приведена выше. Но не морщите лоб и не говорите: Если это правда, я никогда не стану программистом! вместо этого воспринимайте эти списки как желательные.

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

Блестящие и уважаемые мастера каждый день узнают что-то новое; даже самый опытный программист начинал свою карьеру с того, что научился печатать «hello world». Ваше будущее мастерство может быть еще больше, но каждый метр, который вы пройдете, открывает новые суперсилы.

На этом долгом и извилистом пути никому не следует экономить на основах - это инструменты, которые увеличивают вашу походку.