Pull to refresh

«Программист» — это сверхобобщение

Reading time 3 min
Views 8.1K
Original author: Erik McClure
В этом коде могут быть ошибки; я только доказал, что он правилен, а не проверял его.
Дональд Кнут

Сегодня я наткнулся на пост, в котором утверждалось, что использовать функцию C++ STL make_heap нельзя, потому что почти никто не умеет использовать ее правильно. Сначала я возмутился смехотворностью этой идеи — любой человек, имеющий хотя бы начальное представление об алгоритмах, должен знать, как правильно использовать make_heap. Но потом я задумался о том, сколько программистов не знают, что такое куча, более того, им это даже не нужно… А потом я понял, что все эти люди в равной степени зовутся программистами.

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

Термин «программист» покрывает колоссальный спектр способностей и умений. По вертикальной оси, программист может едва уметь писать на vbscript — или разрабатывать компиляторы для Intel или научный софт для авиакомпаний. По горизонтальной оси, он может быть экспертом в базах данных, улучшать производительность GPU, писать библиотеки параллельных вычислений, физические движки или драйвера для принтеров, заниматься обработкой изображений, генерацией 3D моделей или исследованиями в области искусственного интеллекта, использовать coffeescript, HTML5 и AJAX для разработки веб-приложений или nginx и PHP для разработки LAMP-стека, на котором веб-приложения работают… И это все — программисты.

Это безумие!

Наш мир поглощается программами. В будущем программирование будет базовым курсом, наряду с чтением, письмом и математикой. Говорить о ком-то «программист» будет бессмысленно, потому что 10% населения, а то и больше, будут программистами на том или ином уровне. У этого слова уже столько значений, что с равным успехом можно называть себя ученым вместо физика. Какие есть альтернативы? Лучшая попытка это исправить (Разница между разработчиком, программистом и ученым CS) дает всего три варианта и неспособна различить меня и выпускника колледжа со степенью в области искусственного интеллекта. Они занимаются многомерным математическим анализом и оценкой с использованием функциональных языков, на понимание которых мне придется потратить годы. Я пишу быстрый код на C++ и HLSL ассемблере и жонглирую матрицами сложных преобразований, чтобы рисовать на экране хорошенькие картинки. И то, и то — чертовски сложное занятие (по совершенно разным причинам), и ни один из нас не мог бы выполнять работу другого. Что для одного из нас — хорошая привычка, для другого — просто отвратительно. И оба мы — программисты.

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

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

Недостаточно спросить кого-то, программист ли он. «Программисты пишут программы» звучит почти как «ученые делают науку» — вот только ботаники не создают ядерные реакторы.
Tags:
Hubs:
+78
Comments 77
Comments Comments 77

Articles