Продолжая тему предыдущего поста :) Вообще, исходно он был совсем не про образование, а немного шире, именно про пользу от теории... Но потом куда-то свернули. Ну да ладно, свернули так свернули.
Вывод будет в конце.
... именно из-за этого, как мне кажется, в программировании столько "дилетантов" :) Чтобы стать физиком нужно много учиться, чтобы стать строителем нужно много учиться, чтобы стать химиком нужно много учиться. Чтобы стать программистом? Уважаемые
lumag и
ran-dom оба физики, оба с Политеховского Физтеха [и ещё одна особенность обучения у них общая, кстати; ребята, знакомьтесь :)]. На кого учился
ushastyi я не знаю.
lazy-frog лингвист и психолог. Я, ребята, единственный из вас учился на что-то типа программиста :)
По идее меня пять лет натаскивали и обучали программировать. За пять лет можно горы свернуть. По идее я должен быть мегакрут. Видимо что-то не так со мной... Однако, из моей группы кроме меня в программисты пошло человека два. Большинство -- в тестеры. Староста -- в стройальпы. Хотя ведь они все прошли этот бесчеловечный пятилетний тренинг.
Ну да, допустим Политех suxx, особенно наша кафедра, и это действительно недалеко от истины. Но как же эти физики, химики (есть соответствующий знакомый) и лингвисты (вот позор на нашу "техническую" специальность!) программируют?!
А очень просто. Дело в том, что вас обманывают. Дело в том, что "прикладное" программирование это не просто, а очень просто. Сферический прикладной программист не должен знать и уметь:
- Железо, ассемблер, регистры, двоичная система счисления -- все такие вещи абсолютно не нужны. Мы используем языки высокого уровня, а часто и вообще скрипты.
- Алгоритмы, математику вообще. В любом языке есть функция sort, есть hashmap, есть ассоциативный массив какой-нибудь. Что там ещё надо-то?
- SQL и реляционную алгебру. Современные ORM прекрасно справляются.
- Как устроены сети ниже уровня "поток байт". Концепция сокета маскирует всё нижележащее начиная с 80-х. А по последним данным сетей вообще нет, удалённые вызовы ходят прозрачно.
- Концепция файла эффективно скрывает все детали реализации файловых систем, все эти сектора и кеши.
- Выделение памяти происходит тоже само.
- Без многопоточности можно обойтись в 99% случаев. Более того, это таки действительно хороший стиль -- без неё обходиться.
- Детали реализации ОС тоже не нужны.
- Пролог, хаскель, схема и прочая такая же ботва
Что там осталось?
- Синтаксис языка программирования
- Любимая библиотека
Всё! Это, вообще-то, с трудом тянет на двухгодичное обучение в ПТУ.
Да, действительно, есть особые отряды программистов специального назначения. Некоторые из них, например, знают SQL. Таких днём с огнём ищет
plugimz (точнее, раньше искал). Или кто-то знает низкий уровень, такие нужны
ran-dom. Для разработки игр требуется примерно один человек, который сечёт в алгоритмах и оптимизации. Хорошо бы он принимал участие в написании движка. Для собственно конкретной игры он не нужен. Когда пишут ОС кто-то должен знать про процессор, кто-то другой про файловые системы, ещё кто-то -- про сети, про алгоритмы распределения памяти. Ну и т.п.
Конечно, при прочих равных, приятно, когда у тебя умные коллеги, с которыми можно по обсуждать что-нибудь в перерыве. Как выясняется, в среднем физики, математики и лингвисты более чем удовлетворяют этому требованию. Конечно, редко-редко бывают ситуации, когда мифологические представления (о железе, об ОС), складывающиеся у сферического прикладного программиста оказываются неадекватны, причём настолько, что это влияет на код, причём так, что код не работает. В этом случае он попадает в затруднение, ему нужна кратковременная помощь эксперта. Но, если человек обучаем, обычно это не проблема. Физики и математики и лингвисты в среднем обучаемы.
Да, вывод. Дело в том, что знание того, что не должен знать сферический прикладной программист не даёт ключевого преимущества. Оно даёт только расширение возможной области деятельности в те области, где эти специфические знания нужны. Там действительно могут быть бОльшие зарплаты -- но скорее потому, что подходящих людей меньше, а не потому что они чем-то "более лучшие" программисты.
Т.е. на данный момент программистов толком нечему учить. Программу заполняют всякими как-то косвенно относящимися к делу вещами... И это лучше чем ничего, конечно. Но в целом печально.
Если бы я учил программистов, я бы постарался дать им опыт работы над сильно разными проектами из сильно разных областей. Тогда они могли бы по крайней мере действительно выбирать любую область работы. И даже работать в сложных случаях, когда требуется одновременно аж два знания из разных областей. И это да, некоторое практическое преимущество, возможность сменить работу на совсем другую, знакомство с разными паттернами, применяемыми в разных областях. Может даже количество перейдёт в какое-то качество, хотя это и не очевидно.
Да, и я думаю, программирование через некоторое время выйдет из этого странного промежуточного состояния. Например, останется 1% "программистов" от сегодняшнего, а остальное будет настолько упрощено, что с задачами прикладного программиста будут справляться пользователи без подготовки вообще.