Rambler's Top100 Service калинин.ru / программирование / отвлеченно /  << 15.02.02 >>

Как стать программистом: часть первая, нравоучительная

Я не знаю почему, но где-то в среднем пару раз в месяц ко мне обращаются с подобным вопросом --- как стать программистом? Конечно, его иначе формулируют, но в общем смысл именно такой. Что я могу ответить на этот вопрос? Если коротко, то ответ будет "не знаю". А вот если развернуто, то получается эта статья, которую я и опубликую (раз уж есть к ней интерес.)

Предупреждение

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

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

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

А ты кто такой?

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

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

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

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

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

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

Математика

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

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

Я прекрасно понимаю, кто задает вопрос подобный вынесенному в заголовок статьи: это школьники, которым еще предстоит изучение серьезной математики где-нибудь в институте, то есть пока что знания математических методов им не грозит. С другой стороны, в свое время, когда я учился в физико-математическом классе от МАИ, у нас были предметы вполне на уровне первого-второго курса "Прикладной математики" того же института и это, в общем-то, даже нравилось. Просто я не верю в то, что учащийся 10-11 класса будет по собственной воле читать математические учебники, для этого тоже нужен некоторый опыт и умение их читать, которое придет при обучении в ВУЗе, поэтому с нормальной математикой школьнику можно и подождать. Если же вы учитесь в школе с хорошей подготовкой, то вам, как и мне в свое время, очень повезло; сейчас я понимаю, что подобное стечение обстоятельств, то есть когда обучение интересно и преподавателю и ученикам, является большой редкостью.

Об институте

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

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

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

Опыт

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

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

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

Работа

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

В качестве доказательства своих слов могу привести яркий пример html-верстания: это был один из самых легких видов заработка для студентов околокомпьютерных специальностей года два-три тому назад (а может и сейчас, не знаю). Не требовалось почти никаких знаний, в то же самое время работа была востребована и за нее платили некоторые деньги. Конечно же, иногда давали и попрограммировать, но крайне редко. И что в итоге? Подобная работа, повторю, отнимает большое количество времени, поэтому на учебу в институте сил уже не хватало и к окончанию ВУЗа большая часть подобных студентов не имела ни хорошего образования, ни приличной работы. Спрашивается, зачем нужно было этим заниматься?

Вышесказанное верно с одной оговоркой: если позволяют условия. Что делать, когда условия не позволяют нормально учится, я не знаю.

"Тусовка"

Очень важно для программиста попасть в компанию уже состоявшихся профессиональных программистов: и дело не в том, что они будут чему-то учить (скорее всего, нет, кому хочется просто так кем-то заниматься?), они даже, скорее всего, не будут воспринимать "новенького" за равного себе (а что делать, с самомнением у программистов обычно проблем не бывает), хотя, несомненно, будут отвечать на его вопросы или хотя бы давать направление поиска ответа. Дело даже не в этом.

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

Под подобной компанией я, конечно же, пониманию отнюдь не совместное распитие спиртных напитков, курение или прочие прелести жизни; смею вас заверить, что программисты, если их застать в подобные моменты жизни, вряд ли чем отличаются от остальных людей; ну может быть историй, связанных с компьютерами, больше. Конечно же, я имею в виду некоторое сообщество, организованное вокруг какого-нибудь ресурса: news-конференции, сайта, списка рассылки или еще чего-нибудь в этом духе (ссылки на известные мне ресурсы я дам в другой части статьи.) Так вот участие в подобных сообществах, быть может, даже, на птичьих правах "read-only", чрезвычайно полезно. Надо только помнить о том, что любой человек, пусть он десять раз профессиональный программист, может ошибаться и поэтому относиться к словам с придиркой.

Среда программирования

Я уверен в том, что для обучения программированию стандартного (заметьте, стандартного, а не борландского) Паскаля хватит за глаза, вообще Паскаль это такой язык программирования, в котором есть почти все что может понадобиться. Не слушайте никого, кто будет говорить об отсутствии в нем средств для объектно-ориентированного программирования, о том что сейчас "все программируют на Java" или что "C++ круче" --- это все неправильно хотя бы потому, что сродни выражению "сейчас так носят".

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

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

Кроме Паскаля можно выбрать, конечно же, и другой язык программирования; мало того, можно выбрать иной вид языков программирования, логический или функциональный. Мне известно, к примеру, мнение, что научить программировать на LISP значительно проще, чем на императивных языках программирования. Оспаривать или обосновывать это утверждение я не буду (просто потому, что никогда никого не учил логическим языкам программирования и мне не с чем сравнивать), но некоторое рациональное зерно в этом есть.

А вот в качестве операционной системы для развлечений я посоветовал бы какой-нибудь из Unix'ов: Linux или BSD, причем скорее все-таки BSD, как это ни странно --- ее сложнее устанавливать. И я не шучу: Unix советую не из-за того, что "это круто", а исключительно в образовательных целях. Во-первых, это сильно дисциплинирует, во-вторых научит читать документацию, в-третьих позволит приобщиться к прекрасному, в-четвертых вокруг Unix существует очень большая и плотная "тусовка", которая лично мне сильно импонирует. Нет, я не верю в то, что школьник будет читать исходники ядра операционной системы; точнее читать-то он их будет, да вот только не поймет, для этого действительно нужен опыт. Но в Unix есть все, что можно попытаться изучить и при этом это "все" быстро работает и позволяет посмотреть внутренности. Кроме того, бесплатных компиляторов и текстовых редакторов хватит для удовлетворения любых потребностей начинающего программиста.

Правда, привыкнув к Unix, очень сложно переходить на Windows --- по себе знаю. При этом, когда мне недавно волею судеб пришлось три месяца программировать под Windows, то средой MSVC, к примеру, пользоваться для меня было невозможно, все равно брал XEmacs и редактировал тексты программ в нем, а проект собирал исключительно при помощи nmake. Но это не беда, переучиться достаточно просто, а вот более-менее подробное знакомство с Unix позволяет воспитать тот самый "хороший вкус", который упоминался чуть выше.

Отдельно хотелось бы сказать про C и C++. Эти два языка программирования ни в коем случае нельзя изучать сначала, так как они слишком сложны для восприятия. В тоже самое время, программист просто обязан знать оба этих языка, настолько сильно они повлияли на практику современного программирования. При этом вне зависимости от того, чем программист будет зарабатывать себе на жизнь: программированием на Java, Delphi или созданием сайтов при помощи какого-нибудь PHP. Плотное знакомство с C и C++ является одним из основополагающих практических знаний.

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

Что делать?

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

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

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

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

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

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

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

Резюме

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

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

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

PS

Пользуясь случаем, поздравляю сам себя с первой заметкой в этом году.


Версия для печати


  Ссылки по теме:
/stud/22_01_01.shtml
   Моя статья про обучение студентов программированию.
  Рядом в разделе:
Как стать программистом: часть вторая, книги и интернет-ресурсы (04.03.02)
   Вторую часть статьи я публикую значительно позже, чем рассчитывал: просто не получилось выкроить немного времени на последнюю проверку текста перед публикацией....   >>>>
Ответственность, доверие и качество (27.03.01)
   Существует такая черта человеческого характера под названием "ответственность". Вообще говоря, очень полезная черта: если она есть у человека, то он может...   >>>>
  Рядом по дате:
Как стать программистом: часть вторая, книги и интернет-ресурсы (04.03.02)
   Вторую часть статьи я публикую значительно позже, чем рассчитывал: просто не получилось выкроить немного времени на последнюю проверку текста перед публикацией....   >>>>
Черный квадрат (12.12.01)
   Пожалуй, это такой ресурс, о котором в той или иной форме рассказал практически любой веб-обозреватель (прошу заметить, что я себя к...   >>>>
  Содержание:
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
   C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Просто так
Студенческое
Туризм
  Байки
Фотографии
Комментарии
   Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Благодарности
Форум
Хронология
 
  В этом разделе:
Postfix изнутри (08.02.03)
   Эта заметка пишется после громадного перерыва и поэтому, наверняка, будет отличаться от всего остального. Что же, год назад я закончил нравоучениями...   >>>>
Как стать программистом: часть вторая, книги и интернет-ресурсы (04.03.02)
   Вторую часть статьи я публикую значительно позже, чем рассчитывал: просто не получилось выкроить немного времени на последнюю проверку текста перед публикацией....   >>>>
Как стать программистом: часть первая, нравоучительная (15.02.02)
   Я не знаю почему, но где-то в среднем пару раз в месяц ко мне обращаются с подобным вопросом --- как стать...   >>>>
Ответственность, доверие и качество (27.03.01)
   Существует такая черта человеческого характера под названием "ответственность". Вообще говоря, очень полезная черта: если она есть у человека, то он может...   >>>>
Традиционное управление (06.02.01)
   Йордон пишет о том, что основная проблема создания программных систем заключается не в программировании или проектировании, а в управлении и он...   >>>>
Содержание раздела полностью...
   Примерно в тоже время
Как стать программистом: часть вторая, книги и интернет-ресурсы (04.03.02)
   Вторую часть статьи я публикую значительно позже, чем рассчитывал: просто не получилось выкроить немного времени на последнюю проверку текста перед публикацией....   >>>>
Черный квадрат (12.12.01)
   Пожалуй, это такой ресурс, о котором в той или иной форме рассказал практически любой веб-обозреватель (прошу заметить, что я себя к...   >>>>
Хронология полностью...
   Содержание
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
  C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Туризм
  Байки
Фотографии
Комментарии
  Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Студенческое
Просто так
Благодарности
Форум
Хронология
© 2000-2008, Andrey L. Kalinin
mailto:andrey@kalinin.ru
Rambler's Top100