Кросспост из
жж. Адресовано в первую очередь студентам, особенно моим. Вы тут иногда бываете.

Представьте себе обычного студента третьего-четвертого курса, будущего программиста. Он уже практически наверняка где-то работает, но все равно - "будущий".
Он молод, умен, амбициозен. Он знает паскаль и слегка его презирает. Он владеет С и C++, но на первом не пишет из-за малой нишевости языка, а второй уважает, но, как правило, не хочет связываться. Указатели, монструозность темплейтов и все такое. Он имеет некоторый практический опыт ассемблера и твердо уверен, что это - чудовищно. Он изучил джаву или сишарп и совершенно точно знает, что это его выбор. Писать легко, востребованность высочайшая - чего еще желать.
И, повторюсь, он уже наверняка где-то работает по специальности.
Почему же все-таки "будущий"?
читать дальшеПотому что на этом этапе его уверенность, определенность становятся стеной, останавливающей дальнейшее его развитие как программиста. Из него сейчас может получиться великолепный кодер, но для level-up'а надо идти дальше.
Выбор инструмента определяется решаемой задачей и доступным арсеналом программиста. Это аксиома software engineering. Но как только программист начинает любую задачу решать единственным способом, он регрессирует в кодера.
Когда молодой человек выбирает девелоперскую стезю, его намерение таково: "Изучу много языков и стану крутым программером!"
То есть в сознании неразрывно связаны знание языков и профессиональный уровень. И абстрактный, но многочисленный студент, мной описанный, находится в своеобразной точке экстремума: он уже изучил много языков. Следовательно, он уже крутой программер. Но это локальный максимум нашей воображаемой кривой и он, честно признаться, довольно невысоко оторван от нулевой отметки. Дальше профессиональный уровень поднимается другими качествами, нежели знание языков.
Следующий экстремум - владение технологиями, знание библиотек, API, спектр задач, которые наш герой умеет решать хорошо. Технологии - это уже отлично, это гораздо выше, чем просто языки. Человек, овладевший набором технологий, - востребованный специалист. Он умеет решать задачи, и умеет решать их хорошо.
Но это все еще кодер. Стена, которая удерживает его сейчас - полнота его знаний в специфической области, необходимость в нем как специалисте.
А что дальше? Человек способен за час оптимизировать страничный sql-запрос в десять тысяч раз. Построить сложное модульное MDI-приложение. Написать диспетчер заданий в распределенной среде. Что дает мне право такого человека все еще обзывать обидным "кодер"?
Абстрактное мышление. Вот что.
Программирование - в самом деле arcane knowledge, not common at all. Программист постоянно движется вперед, его разум жив и гибок, он находится в состоянии жадного поиска и постижения нового. Он способен создавать новое, небывалое. Он жонглирует идеями и всякий раз находит наилучший инструмент для их реализации: начиная от платформы и ОС и заканчивая используемыми технологиями и языками.
Кодер выполняет поставленную задачу. Программист - создает ее.
Простите мне такую вольную трактовку понятия "программист". Есть ведь термины "System architect", "software engineer" и другие, локальные, емкие, определяющие. К тому же я ни слова не сказал о таких качествах, как дисциплина, методичность, последовательность, без которых хорошим программистом не стать. Просто суть здесь в принципиальном разграничении: находится ли программист "под" задачей или "над" ней. Исполнитель ли он - или способен стать волшебником, как Столлман, Таненбаум, Кнут?
Это все тот же древний спор между ремеслом и искусством, но мое твердое убеждение: для по-настоящему хорошего программиста его занятие - искусство. Это не цепочки операторов на экране, не формальные грамматики и UML-диаграммы. Это идеи, которые стоят за ними. Это бесконечный простор самовыражения, которое само выберет себе наилучший синтаксис и платформу, железо и софтверную начинку.
И все-таки с небес на землю. Хорошо, скажете вы, язык и технологии - не главное. Так что, ждать кучу лет, становиться узким специалистом только для того, чтобы признать иллюзорность этой полноты? Мы ведь все еще говорим о нашем гипотетическом студенте третьего-четвертого курса. И, если честно, - говорим для него и ради него.
Точка отсчета - прямо сейчас. Гибкость мышления и свобода от реализаций не придет сама собой. Надо ломать старое, разбивать стену. искать непривычные пути, нехоженные тропы. Привыкли к удобной императивной логике шарпа - а напишите менеджер памяти на лиспе! XML-парсер на перле! Декларативная парадигма! Функциональное программирование! Аспектно-ориентированное! Технологии метапрограммирования! Компилятор брэйнфака на брэйнфаке! Оторвитесь от x86-архитектуры! Напишите игрушку для своей любимой нокии! Спроектируйте и закодируйте драйвер для QNX! Пробуйте!
Кто сказал, что это сложно? Сложно - оторваться от привычки. А дальше - полет!
И уж поверьте, искусство вернет вам гораздо больше, чем ремесло.
я аж дочитала
молодецка
Квантовая механика, например, была эркейн нолидж. Нелинейные динамические системы в области математики - это был эркейн нолидж. А программирование...)
Дим, под программированием я здесь понимал, как должно явствовать из текста, несколько большее, нежели формочки на дельфях.
Замени термин на Computer Science, будет адекватнее.
Программирование как методология оперирования абстракциями - ultimate arcane knowledge. В первой же лекции Structure and Interpretation of Computer Programs Абельсон очень хорошо говорит об этом, посмотри сам.