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

Большие постоянные кодовые базы

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

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

Реальные рабочие процессы разработчиков

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

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

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

См. различные языковые парадигмы

Большинство программистов знают, что количество языков программирования, которые вы знаете, не является чем-то особенным. Да, это звучит впечатляюще, пока люди не узнают, что за неделю можно выучить еще один. Но я считаю, что необходимо сказать об обучении. Это может быть больше для людей, которые выбрали маршрут ECE, как я, чем для майоров CS. И со временем многие программы заменили Java в своих учебных программах на Python. Другая парадигма и гибкость языков более высокого уровня позволяют мыслить по-разному. Например, наличие хэш-таблиц в Python в качестве базовых типов позволяет вам намного удобнее понимать, когда их использовать. Точно так же list comprehensions, map и reduce действительно позволили мне больше думать параллельно.

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

Освойтесь с CLI

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

Читать документы

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

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

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

Только лаборатории Linux

В Иллинойсе инженерными лабораториями был только Linux. Это определенно добавило первокурсникам дополнительной кривой обучения. Но к четырем годам обучения в колледже вы освоились с командной строкой.

Тестовый дизайн

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

Полноценный проект

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

Решение реальной проблемы

Я посещал занятия по GPGPU, когда Nvidia впервые представила CUDA. Для нашего финального проекта мы решили задачи, которые были заинтересованы в распараллеливании различных исследовательских групп. На самом деле нам повезло, что главный научный сотрудник Nvidia, Дэвид Кирк, преподавал этот класс. И мне нравится говорить себе, что наша презентация оказала некоторое влияние на то, что Nvidia добавила атомарное приращение к CUDA.

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