Автор:
Алексей Вторников
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
По роду деятельности мне часто приходится сталкиваться с людьми, гордо именующими себя программистами. При ближайшем рассмотрении оказывается, что лишь один, реже два из десяти могут считаться таковыми. Путь к вершинам тернист, и не всем по силам его одолеть.
Терпеливость – добродетель, ставящая нас выше того, что кажется трудновыполнимым.
Секст Эмпирик «Против ученых»
Программистами не рождаются
Есть профессии, занятие которыми является не только способом заработать на хлеб насущный, но одновременно и хобби. Таких профессий, как ни удивительно, достаточно много, например, литература, кулинария или садоводство. К ним с полным правом можно, разумеется, отнести и программирование.
Конечно, далеко не для каждого журналиста, повара, садовода или программиста его профессия одновременно и его хобби. В таком случае я склонен называть таких людей поденщиками.
В слове «поденщик» нет ничего оскорбительного. Большинству из нас приходится время от времени заниматься работами, которые нам не интересны, скучны, а порой и неприятны (я, например, не знаю ни одного психически здорового человека, испытывающего удовольствие от чистки засорившейся раковины).
Достаточно часто поденщик – это очень квалифицированный специалист, способный выполнять сложные работы, требующие мастерства, знаний и опыта. Но данный вид деятельности не занимает его целиком (если, конечно, исключить чрезвычайные ситуации). В своей работе поденщик может достичь весьма высокого уровня профессионализма, но истинным Мастером (именно так – с большой буквы) он не станет никогда: творцы среди поденщиков не рождаются. Причин тому немало, но я склонен думать, что самая весомая из них – качество образования.
Давным-давно, в Средние века, мастера объединялись в гильдии: каменщиков, пекарей, ткачей, ювелиров, купцов и др. Период ученичества начинался рано, как правило, с семи-восьми лет и в зависимости от специальности длился долго – порой с десяток лет.
Стать профессионалом очень и очень не просто. Помимо увлеченности нужен упорный, а порой изнурительный труд |
Процесс обучения во всех гильдиях был построен сходным образом: несколько лет в подмастерьях за еду и постель, выполнение возрастающих по сложности заданий под руководством опытного наставника, экзамен и, наконец, обряд посвящения в полноправные члены гильдии.
К моменту посвящения вчерашний ученик мог заслуженно считаться специалистом: гильдии дорожили деловой репутацией и допускали в свои ряды только тех, кто действительно обладал необходимыми знаниями и навыками.
После этого бывший ученик «...если музы были к нему благосклонны, представлял на суд гильдии свой шедевр и поднимался на высшую ступень профессиональной иерархии, становясь мастером гильдии. Творения этих мастеров, даже самого утилитарного назначения, воспринимаются часто как величайшие проявления человеческого разума» [1].
В наше время процесс профессиональной подготовки существенно ускорился. Есть специальности, которые можно приобрести на курсах в течение нескольких месяцев (рекламные газеты и объявления, особенно в крупных городах, пестрят такого рода предложениями). Обещается, что человек, закончивший подобные курсы, будет способен выполнять те или иные виды работ. Правда, все мы знаем, что ценность большинства таких новоиспеченных «мастеров» крайне сомнительна. Исключения, конечно, случаются, но на то они и исключения.
Аналогичная ситуация складывается и в области подготовки программистов и администраторов баз данных (о системных администраторах я лучше умолчу, т.к., честно говоря, не знаю ни одного высшего учебного заведения, где готовят таких специалистов). На организованной «Системным администратором» в декабре 2012 года дискуссии «Вектор роста: люди и технологии», посвященной 10-летнему юбилею журнала, прозвучало немало грустных слов о недостаточном уровне подготовки многих ИТ-специалистов и, в частности, системных администраторов.
Ситуация с системными администраторами усугубляется еще и тем, что разработка программного обеспечения в целом много лучше оплачивается: средние зарплаты программистов выше средних зарплат системных администраторов, при том, что работа программиста, как правило, более спокойная. Престиж профессии (а вместе с ним и доходы) системных администраторов падают, и поэтому неудивительно, что системные администраторы постепенно мигрируют в область разработки.
Почуяв легкую наживу, многие вузы ударными темпами организовали соответствующие факультеты и развернули мощные рекламные кампании, обещая предоставить высококлассное ИТ-образование. Но учебная база и, что важнее, преподавательские кадры большинства таких факультетов унылы и рудиментарны.
Оснастить несколько аудиторий компьютерами – в наше время вопрос нескольких дней, но наличие кучи компьютеров с выходом в Интернет – это далеко не база. Нужны методики, опыт, кругозор, школа. Все это нарабатывается многими годами.
Те, кто мог бы преподавать программирование, проектирование и администрирование ИТ-систем, как правило, не имеют для этого ни времени, ни стимулов: они полностью загружены основной работой, а потому идти преподавать за нищенские зарплаты желающих мало.
Большинство из них к тому же не имеют ни ученых званий, ни преподавательского стажа, а прозябать на кафедрах аспирантами (в лучшем случае старшими преподавателями) при их возможностях выглядит прямым оскорблением. За воротами вуза эти специалисты без труда находят работу с оплатой в разы (а то и на порядок) выше той, что им может предложить высшая школа. На мой взгляд, сейчас в стране насчитывается от силы десяток университетов, способных дать более-менее качественное ИТ-образование.
Тому, кто в силу тех или иных причин не может учиться в этих университетах, но действительно хочет стать специалистом и добиться успеха, остается одно – учиться самостоятельно. Всего можно достичь самому. Конечно, это потребует и сил, и времени, но при наличии главного – увлеченности выбранной профессией – всего можно добиться. Не стоит надеяться на волшебника, который по мановению палочки сделает из неофита мастера.
Ключ к успеха – в нас самих. Но об этом чуть позже, а сейчас я хочу остановиться на типичной ситуации: молодой специалист, вчера окончивший вуз, приходит на работу, на первую настоящую работу. Что его ждет?
Портрет типичного молодого специалиста
Итак, вчерашний студент пришел на работу. Очень маловероятно, что ему поручат какое-то самостоятельное направление. Во-первых, никто (в том числе и он сам) не представляет, что он умеет и знает, а в чем «плавает». Во-вторых, как и любому новому человеку, ему нужно время, чтобы освоиться, познакомиться, приглядеться. Но самое сложное – войти в предметную область. Здесь я остановлюсь чуточку подробнее.
По характеру выполняемой работы программисты традиционно (хотя и не строго) делятся на несколько категорий: прикладные программисты, системные программисты и теоретики. При этом доля системных программистов и теоретиков в совокупности вряд ли превышает два-три процента (а может быть, и меньше).
Об этих категориях я говорить не буду – там весьма специфические требования к подготовке и профессиональным навыкам. Подавляющее большинство программистов, как не считай, все-таки прикладники. И это подавляющее большинство приходит в основном либо в веб-разработку, либо в область учетных систем (бухгалтерский учет, многочисленные CRM, ERP, банки и т.п.). Здесь вхождение в «тему» происходит достаточно быстро: обычно неглупый человек через пару-другую месяцев начинает работать в полную силу.
Обычно, но не всегда. Некоторые области разработки программного обеспечения предполагают определенные знания. Если, например, компания занимается проектированием сложных конструкций, то весьма вероятно, что для расчетов прочности и устойчивости широко используется метод конечных элементов (МКЭ).
Если вчерашний студент не знает математического анализа, не прослушал курсы по дифференциальным уравнениям, численным методам и алгебре, то здесь ему делать нечего. Никто не согласится ждать пару лет (и это в лучшем случае), пока новичок овладеет всем необходимым минимумом.
Давайте будем честными: в 90% случаев вчерашний студент не умеет ничего. Слово «ничего» следует понимать буквально |
Если компания, в которую пришел работать новичок, занимается разработками в области искусственного интеллекта, то ему придется заниматься математической логикой, нейронными сетями, а также функциональным и логическим программированием.
Компании, специализирующиеся в разработке, изготовлении и обслуживании систем автоматизации и управления, обычно ожидают от претендентов хорошего знания электроники.
Для указанных мной случаев ближе всего подходят выпускники математических и физических факультетов: у них предполагается по крайней мере наличие приличного математического и физического образования. Их скорее всего придется доучивать (а также и переучивать), но это вполне выполнимо, и шансы стать профессионалом весьма высоки.
Для того чтобы процесс погружения в новую реальность был наиболее эффективным, существует четыре проверенных временем способа: искать ошибки в существующем коде (а в больших проектах их всегда предостаточно), работать в паре с кем-то из наставников, дополнительное образование и, конечно, самообразование.
Первый способ достаточно жестокий: новичка «бросают» на самую неинтересную, нудную и кропотливую работу. Кому охота «ковыряться» в чужом коде, когда не хватает времени и сил разобраться со своим! Но должен признаться, что это весьма эффективный метод, позволяющий быстро отсеять совсем уж непригодных (обычно через неделю они уходят сами и больше никогда к программированию не возвращаются). А вот те, кто выдержал, определенно подают надежды.
Второй способ – наставник – используется нечасто, т.к. вынуждает его постоянно отвлекаться, но если наставник стоящий, то это может дать превосходные результаты.
Несколько слов о третьем способе – о дополнительном образовании. Перспективно мыслящие работодатели обычно находят возможность оплатить специализированные курсы для своих сотрудников. Для работодателя это, безусловно, сопряжено с риском: не исключено, что сотрудник, в обучение которого были вложены немалые деньги, через месяц развернется и уйдет. Но кто не рискует, тот обычно ничего и не выигрывает. Компании, заботящиеся о своем развитии, не только учат своих людей, но параллельно не забывают о росте их доходов.
И, наконец, самообразование. Этот способ не требует больших финансовых вложений и доступен всякому.
Нечто большее, чем средство зарабатывания денег
Итак, будем считать, что первое препятствие преодолено, и молодой специалист решает продолжить свою профессиональную карьеру в области информационных технологий. Но карьера карьере рознь. Если ставится цель использовать ИТ только как трамплин для административного роста, то это одно (кстати, ничего плохого в этом нет), и останавливаться на этом я не стану.
Давайте будем честными: в 90% случаев вчерашний студент не умеет ничего. Слово «ничего» следует понимать буквально. Его навыки (особенно практические) весьма близки к определению «сферический конь в вакууме», т.е. они как бы есть, но, когда присмотришься, нет. Вся теоретическая подготовка, все радужные представления, как правило, разбиваются о прозу жизни. Вчерашний выпускник быстро обнаруживает, что реальные задачи почти ничего общего не имеют с учебными проектами, которые он выполнял в вузе.
Беда в том, что большинство студентов об этом не подозревают и поэтому часто предъявляют изначально завышенные требования к уровню оплаты труда. Найти информацию об уровне доходов программистов просто. И по меньшей мере смешно, когда дипломированный недоросль претендует на зарплату опытного профессионала, а потом ужасно обижается, что ему отказывают.
Предложение поработать на меньшей ставке, но взамен получить хорошую практику, обычно воспринимается как оскорбление. К счастью, и здесь есть своя хорошая сторона – происходит самоочищение программистской среды от случайных «загрязнений». В таких случаях я склонен думать, что методика профессиональных гильдий была куда разумнее – сначала научись чему-то, а потом уж «качай права».
Попробуйте забыть о карьере и погрузиться в пленительный мир битов и байтов. Все, что для этого нужно – компьютер, удобный стул, немного еды, хорошие книги и, может быть, изредка Интернет |
Разумеется, новичок новичку рознь. Кто-то только учился, а кто-то совмещал учебу с работой. При прочих равных вторые, разумеется, гораздо лучше подготовлены – они уже «пощупали», чем им придется заниматься по окончании учебы. Кое-кто из них (и тому есть примеры) сумели прекрасно себя показать и успешно делают профессиональную карьеру. Но таких единицы. Большинство же, увы, в массе своей необработанный материал.
При наблюдении за опытным разработчиком порой кажется, что он не очень задумывается, какие структуры данных привлекает и какими программными конструкциями пользуется. Это, конечно, заблуждение. Просто у опытного разработчика выработался своего рода навык. Мы ведь не задумываемся над тем, как пользоваться ложкой, но в раннем детстве этот навык дался нам с немалым трудом, просто мы о нем позабыли. Добиться такого навыка можно только одним способом – практикой. За видимой легкостью скрываются годы тренировок, неудач, а порой и обидных поражений.
Попробуйте забыть о карьере и погрузиться в пленительный мир битов и байтов. Все, что для этого нужно, можно описать несколькими словами – компьютер, удобный стул, немного еды, хорошие книги и, может быть, изредка Интернет.
Оглядитесь вокруг себя – наверняка ведь есть что-то, что лично вам интересно. И какое вам дело, если задача, которой вы увлеклись, уже решена – важно только то, что вы, лично вы, приобретаете в процессе ее решения. Не дайте сбить себя с толку утверждениями, что задача, которую вы решаете, никому не интересна. То, что интересно одному, может быть не интересно другому, и, возможно, ваш оппонент ошибается. Разумеется, набрести на действительно ценную идею очень трудно. И никаких гарантий тут нет и быть не может.
Существует немало способов достичь высот мастерства. И главный из них – живой интерес. Никакие меркантильные соображения не могут служить долговременным стимулом. Технологии развиваются быстро, порой стремительно. То, что вчера было последним писком моды, сегодня воспринимается как заурядность, а завтра вполне может стать анахронизмом. Годы, потраченные на овладение отдельно взятым языком программирования или технологией, могут оказаться потраченными впустую. Так что же, нет ничего «разумного, доброго, вечного»? Разумеется, есть.
И опыт авторитетных разработчиков тому подтверждение. В связи с этим я настоятельно рекомендую ознакомиться со статьей «Как стать хакером» Эрика С.Реймонда [4], одного из самых последовательных евангелистов открытого программного обеспечения. Замечу, что слово «хакер», используемое Реймондом, не имеет того криминального оттенка, который оно сегодня повсеместно приобрело. Хакер в первоначальном понимании – это человек, активно интересующийся информационными технологиями, влюбленный в свое занятие, ищущий и находящий интересные задачи и решающий эти задачи.
Много интересных, глубоких и остроумных мыслей можно почерпнуть из книги создателя Linux Линуса Торвальдса «Just for Fun» [5]. Само название (в переводе оно звучит как «Ради удовольствия») лучше всего подчеркивает, что программирование – это не только тяжкий, порой изматывающий труд, но и радость созидания, малодоступная представителям многих других профессий.
Не получая удовольствия, не работая до самозабвения, не вкладывая душу (то, что современном арго обозначается словцом «драйв»), не получится создать что-либо действительно стоящее.
При этом никто из по-настоящему великих программистов не ставил перед собой цель стать великим. Они решали, в общем-то, просто интересные им самим задачи. А уже потом выяснилось, что их «забавы» оказалисьчем-то большим. Если примера Торвальдса недостаточно, то приведу еще несколько.
В августе 2008 года в газете The New York Times журналист Стив Лор в статье, посвященной путям развития программного обеспечения, привел слова одного из наиболее заметных программистов за всю историю существования этой дисциплины Билла Джоя.
В оригинале [3] эта цитата звучит довольно грубо: «The truth is, great software comes from great programmers, not from a large number of people slaving away», что по-русски можно перевести как: «Правда в том, что великое программное обеспечение создается великими программистами, а не толпой народа на подхвате».
Билл Джой знал, о чем говорил, тем более что его личные заслуги (ведущий программист UNIX Berkley – впоследствии BSD UNIX; в числе его заслуг программные реализации таких общепринятых сегодня вещей, как виртуальная память, подкачка по требованию, и, самое главное, стека TCP/IP) позволяют ему быть столь категоричным.
Из исследовательского проекта, затеянного Деннисом Ритчи и Кеном Томпсоном в конце 60-х годов прошлого века, вышли язык программирования C и операционная система UNIX. Здесь комментарии, думаю, излишни.
Из наблюдений и размышлений над известной игрушкой пентамино у московского программиста Алексея Пажитнова появилась идея самой, пожалуй, знаменитой игры за всю историю компьютеров. Речь идет, разумеется, о «Тетрисе». Мало какая игра (а скорее всего ни одна) не была реализована на столь большом числе компьютеров и операционных систем.
Конечно, достичь высот, сравнимых с успехами тех же Д. Ритчи или Л. Торвальдса, чрезвычайно сложно. Людей, мыслящих по-настоящему ярко и оригинально (или на современном арго креативно) всегда очень и очень немного. И программирование в этом смысле не исключение. Но попробовать-то стоит. По-настоящему интересная проблема по-настоящему захватывает. Вы с сожалением будете отвлекаться на другие занятия (даже если их необходимо выполнять). И еще вот что: если вы чувствуете в себе дар творца – не позволяйте ему угаснуть, не душите в себе гения.
Да, деньги нужны всем, но какой ценой! Сколько прекрасных программистов безвозвратно кануло на поддержке и внедрении дорогущих и огромных информационных систем, под завязку набитых чудовищным количеством недокументрированных особенностей (здесь мне почему-то приходят на ум строки «Уж сколько их упало в эту бездну, разверстую вдали» из стихотворения Марины Цветаевой).
О пользе английского языка
Английский язык – неотъемлемая часть профессиональных навыков программиста. Чтение технической литературы составляет важную составляющую повседневной деятельности.
Это тем более необходимо, что русскоязычные переводы нередко кишат неточностями и ошибками. Большая часть таких ошибок вполне очевидна, но бывает, что нужно обращаться к оригиналу.
Вот примеры, взятые из широко известной книги Брюса Эккеля «Философия Java» [2].
Во вступительном слове к книге есть такие слова: «В книге «Философия Java» материал изложен в порядке, удобном для изучения, и она содержит понятные и легко применимые на практике ответы на практически все вопросы, стоящие перед начинающими программистами на Java».
Книга действительно хорошая и одна из немногих, которые стоит прочесть каждому Java-программисту (и не только начинающему). Но внимательное чтение перевода не может не вызвать некоторых вопросов. Вот несколько примеров.
Давайте обратимся к стр.104, где приведена следующая программа:
public class ListCharacters { public static void main (String[] args) { for (char c = 0; c < 128; c++) if (Character.isLowerCase ((char)c)) System.out.println («Значение: » + (char)c + « символ: » + c);
Программа совершенно правильная, и «претензий» к ней нет.
Но продолжаем читать комментарий к этой программе: «Обратите внимание, что переменная i определяется в точке ее использования, в управляющем выражении цикла for...».
По-настоящему интересная проблема по-настоящему захватывает. Вы с сожалением будете отвлекаться на другие занятия (даже если их необходимо выполнять) |
Позвольте, какая такая переменная i – в коде нет такой переменной!
Обращаемся к оригиналу. Программный код – тот же самый, а вот комментарий уже иной: «Note that the variable c is defined at the point where is used, inside the control expression of the for loop...» Вот теперь все правильно.
Понятно, что это простая описка, которая находится и исправляется без труда. Но позвольте продемонстрировать более тонкую ошибку на стр.126 русского перевода:
«Если же вы записываете конструктор явно, компилятор говорит: «Вы написали конструктор, а, следовательно, знаете, что вам нужно; и если вы создали конструктор по умолчанию, значит, он вам и не нужен».
Сама по себе эта фраза явно не образец хорошего русского языка, но, к сожалению, это не единственный ее недостаток. В оригинале эта фраза выглядит так:
«But if you write a constructor, the compiler says, “You’ve written a constructor so you know what you’re doing; if you didn’t put in a default it’s because you meant to leave it out.”»
Обратите внимание на выделенные цветом фрагменты в переводе и оригинале – заметили разницу? В русском переводе отсутствует частица «не», а без нее смысл фразы становится загадочным. Начинающий программист либо пропустит этот фрагмент в переводе (и правильно, кстати говоря, сделает, поскольку в нем, вообще говоря, нет ничего действительно нового), либо, напротив, вынужден будет домысливать, что на самом деле имелось в виду. Тут без оригинала вряд ли обойтись.
Какие уроки можно извлечь из этих примеров? Первый – очевидный: переводы могут содержать ошибки. Одни из них – элементарные, другие – более тонкие. Но важно то, что нет уверенности, что эти ошибки последние и других в переводе больше нет.
Второй урок: оригинал книги Б.Эккеля содержит более 1000 страниц и включает несколько глав, которые отсутствуют в русском переводе. Не очень понятно, чем руководствовались редакторы и переводчики, исключив треть книги. В отсутствие объяснений остается только гадать, какие мотивы ими двигали, но, на мой взгляд, перевод от этого явно проиграл.
И, наконец, третий урок. Очевидно, что физически невозможно перевести на русский язык все, что достойно перевода. Речь идет не только о книгах, но также о технических описаниях, документации, статьях, обзорах. Профессионал должен быть в курсе происходящего в его области, и тут без английского не обойтись.
***
Стать профессионалом (в любом деле, и не только в программировании) очень и очень не просто. Помимо увлеченности нужен упорный, а порой изнурительный труд. Да и после этого успех, если под ним понимать славу, почет и материальное благополучие, не гарантирован.
Но уж больно занимательно это нелегкое ремесло – ремесло программиста.
- Уэзерелл Чарльз. Этюды для программистов. – М., Издательство «Мир». – 1982.
- Эккель Брюс. Философия Java. – СПб, «Питер». – 2009.
- Steve Lohr. Code Name: Mainstream – http://www.nytimes.com/library/tech/00/08/biztech/articles/28code.html.
- Эрик С. Рэймонд. Как стать хакером – http://volgograd.lug.ru/library/hacker-howto.ru.html.
- Торвальдс Л., Даймонд Д. Just for Fun. Рассказ нечаянного революционера. – М., «Эксмо-Пресс». – 2002.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
|