Программирование для не-программистов. Биография джуна
Предисловие: это рассказ о книгах для тех, кто решил изучить программирование самостоятельно. Но поскольку читать список книг было бы скучно, то я решил дополнить его своей биографией.
Итак… Мне за сорок. По образованию лингвист, работаю в научной сфере. С программированием никогда не сталкивался, хотя формально в школе проходил уроки по информатике, которые, собственно, свелись к набору программы на Бэйсике из методички и к лицезрению загадочного ДОСа на компьютере учителя. Ох, да, ещё было очень краткое знакомство с Фокалом, но, опять же, все строго по методичке.
Я детдомовец, поэтому после школы мне удалось поступить по квоте в местный университет на сельскохозяйственный факультет. Учеба закончилась ровно через год из-за нелюбви к выбранной дисциплине. Собственно, мне трудно представить, что большинство людей способно в восемнадцатилетнем возрасте точно определить свои профессиональные и жизненные целеустремления. Я читал биографии людей наподобие Илона Маска, который начал программировать уже с пеленок, или основательницы «Тераноса», которая уже в пятилетнем возрасте организовала свою домашнюю химическую лабораторию.
Большинство же людей, как и я, впрочем – стадо животных, следующих за трендами. В университет поступаем не из-за тяги к знаниям, а просто потому что все так делают. Ну, и в армию-то тоже никому особенно не хочется. Есть более везучие особи, которые целенаправленно поступают в перспективные ВУЗы на перспективные специальности по совету родителей, но это опять же вопрос везения, связей и денег. Я в детстве любил смотреть «Умников и умниц» и мне, честно говоря, было трудно представить себе, что в этой передаче могли бы массово участвовать, скажем, дети отбывающих наказание или страдающих алкоголизмом людей.
Страна активно готовилась ко второй чеченской кампании и всех неприкаянных и праздношатающихся массово свозили в призывные пункты. Я решил не пытать судьбу и уехал в другой конец страны подальше от военкомата работать разнорабочим в порту. У меня довольно медленный мозг, поэтому только через несколько лет продуктивного общения с «раённым» интеллектуальным большинством и с их более удачливыми собратьями, уже вставшими на путь успеха, до меня дошло осознание того, что перспектива бытия бесправным червём на дне общества — очень сомнительное удовольствие. Высшее образование было единственной дверью вверх по социальной лестнице.
Итак, я поступил на лингвиста. Почему? Потому что в местном университете преподавали лингвистику и потому что на целевом факультете были бюджетные места. Лингвистика… Очень интересная специальность. Лингвистика – это наука о структуре языка, но, как правило, подавляющее большинство лингвистов с трудом владеет своим родным языком, не говоря об иностранных. Отец современной лингвистики Ноам Хомски говорит только на английском и понимает пару фраз на иврите, тем не менее, это не помешало ему разработать мощную теорию грамматики языков, которой активно пользуются миллионы людей, работающих в сфере языкознания.
И вот эта особенность лингвистики была моим шансом шагнуть на следующую ступень. Если вуз выпускает сотни однотипных специалистов с базовым набором знаний в соответствии с требованиями Минобразования, то лучшим способом выделиться из толпы было бы выучить парочку иностранных языков. Учебу в университете пропускать не хотелось, поэтому пришлось бросить работу в порту и устроиться в школу ночным сторожем. 4000 рублей в месяц. Каждый день овсянка и макароны. Но, с другой стороны, масса свободного времени, которое я использовал для выполнения домашних заданий и изучения дополнительных специальностей. В довеску к преподаваемому в университете английскому я решил учить французский. Почему? Потому что это официальный язык дипломатии, второй язык в ООН и, в конце концов, язык экономически развитых стран.
Взяв в руки самоучитель по французскому, я впервые в жизни задался вопросом: собственно, есть ли у меня способности к языкам? Откуда у меня уверенность в том, что чтение книги и выполнение всех упражнений не будет пустой тратой времени? Работу сторожем с нищенской зарплатой можно было бы поменять на должность мерчендайзера в соседнем торговом центре или на место складского рабочего на пивном заводе, но в этом случае у меня бы не было времени на самообразование. В общем, я сделал шаг в сторону неизвестности.
Работа день через три. Переписывание лекций. Домашнее задание. Курсовые. Самоучитель по французскому. Через два года я достиг того уровня, который позволял читать небольшие газетные статьи и писать незамысловатые сочинения. Большой проблемой была разговорная речь и слух, поэтому пришлось записываться на языковые курсы и сидеть на овсяной каше с утра до ночи. Через год я прошел экзамен на уровне В2, который позволяет поступать в зарубежные вузы.
Вопрос о способности к языкам остался открытым. Почему я выучил французский? Из-за упорства или из-за генетических способностей? Или вместе из-за тех и других? Мои размышления были прерваны вызовом к декану. «У тебя есть DELF B2? Вот и прекрасно. У нас подписано соглашение с университетом Бреста об обмене студентами. Поедешь на три месяца».
Я в компании нескольких провинциальных мажоров отправился в Бретань. Стипендия 500 евро в месяц, конец овсяной каше. Брест – провинциальный город средней паршивости, в котором, кроме порта, нет никаких развлечений. Мои напарники плюнули на учебу с первого дня и укатили в Париж. А я исправно ходил на лекции, после обеда в лабораторию, куда я напросился в качестве ассистента на добровольной основе. Контакт с преподавателями был налажен.
Возвращение в родное провинциальное захолустье. Разговорный французский позволил устроиться в отдел по международному сотрудничеству в родном вузе. Еще два года. Дипломная. Выпуск. Мне тридцать. Военкомат вручает мне военный билет с пометкой «рядовой запаса». Я еду в Ренн по магистерской стипендиальной программе. 750 евро в месяц, пара лет лекций, экзаменов и стажировок. Мне предлагают пройти конкурс на получение государственного контракта для написания диссертации. Конкурс успешно пройден. Четыре года, 1600 евро в месяц после уплаты налогов. Диссертация защищена. Я еду в Шанхай, это мой первый постдок.
1000 евро в месяц. Для Китая и даже для Шанхая вполне приемлемая зарплата. Однако это мой потолок. Карьерный рост возможен, но он потребует огромных усилий. Претендент на должность доцента должен обладать запасом в несколько десятков публикаций в достойных журналах и опытом работы в нескольких странах. Начался период тяжелых раздумий. Несмотря на годы усилий и ученую степень, я оказался на том уровне, на который попал бы и без французского с овсяной кашей. Более того, несмотря на довольно глубокие знания в лингвистике, я не любил эту профессию.
Перспектива быть вечным постдоком и заниматься нелюбимым делом меня не радовала, и я довольно часто начал впадать в депрессию. Чтобы привести мозг в порядок, я начал заниматься спортом. Первый день. Бег. 100 метров. Я мёртв. Я никогда в жизни не бегал, обходил турники стороной. Я был любимой целью шпаны. Однако стометровка дала свои плоды: депрессии как не бывало. Мозг начал работать и анализировать действительность.
Фильм «Прикосновение греха», эпизод с заводским рабочим, выбрасывающимся из окна из-за безысходности. Я могу пробежать 1 километр. Я читаю критическую статью о фильме. Три километра. Сценарий был основан на реальных событиях, происходивших на фабриках «Фоксконна», известных своими нечеловеческими условиями труда. Пять километров, свинцовые бедра, но я, кажется, могу пробежать еще парочку. Терри Гоу заявляет о сокращении штата «Фоксконна» и о создании полностью автоматизированного предприятия.
Я остановился. У меня afterburn. Вот он, тренд. Мир стремительно движется в сторону тотальной роботизации. Carrefour заменяет кассиров на автоматические сканеры. Cathay Bank реформирует отдел по работе с клиентами в том же духе. Парижские работники метро бастуют из-за открытия новой автоматизированной ветки. Я должен начать учить программирование или останусь навсегда за бортом.
Я всегда искренне считал, что у всех людей существуют свои пределы в области усвоения знаний. И я всегда думал, что программирование является запретной зоной, в которую мне вход запрещен. Несмотря на свой возраст, я отлично помню ощущение отрезвляющей тупости, которое у меня возникало каждый раз, когда я набирал программы из методички на клавиатуре школьных компьютеров. Товарищи управлялись с заданием за пять минут и даже умудрялись писать какие-то дополнительные строчки, заставлявшие компьютер пищать динамиком и мигать курсором. Я же, однако, потел в стороне и не мог запустить даже программу из методички.
Спорт и давняя работа сторожем изменил мое отношение к этому вопросу. Если я могу перебороть себя и пробежать восемь километров, если я могу терпеливо сидеть за самоучителем по французскому языку и писать часами упражнения, то я наверняка смогу обучиться программированию. Ну, а если не смогу, то хотя бы попытаюсь.
Итак, что учить, где начинать? Quora, StackExchange, Habr. Самые популярные и востребованные языки: Python, Java, JavaScript. Я точно не хочу учить веб-программирование. Лепить красивые сайтики на фоне вонючего китайского смога и заваленного пластиковыми бутылками пляжа – это, по-моему, верх ханжества. Виртуальная реальность должна соответствовать действительности.
В общем, выбор пал на Пайтон. Все говорят, что это очень легкий язык. Это как раз то, что мне нужно. Итак, книга Доусона. Я дошел до циклов и мне все надоело. Где-то глубоко во мне сидело осознание неудовлетворенностью выбранным курсом. Более того, автор выбрал написание игры в качестве основного мотиватора для изучающих язык. С одной стороны война в Сирии, миллионы беженцев, терроризм, глобальное потепление. А в это время взрослые люди с солидным фундаментальным образованием сидят в мягких креслах и пишут игры. Да-с… Но, тем не менее, учебник Доусона всё-таки очень внятен. И предлагаемая вместе с книгой IDE облегчает знакомство с языком.
В плане знаний ничего полезного я из книги не извлек, наоборот, у меня возникло еще больше вопросов. Например: как пишется операционная система и как она записывается на жесткий диск. Как осуществляется передача сообщений по сети? Почему у ДОСа убогая графика, а у Windows 16 миллионов цветов? Книгу Доусона пришлось отложить в сторону и снова погрузиться в раздумья.
Есть один немецкий фильм, называется «Кто я». Герой фильма хочет влиться в компанию хакеров и те просят его продемонстрировать свои знания. Говорят: вон там за окном электростанция, отключи ее. Кандидат в хакеры садится за лаптоп и набирает код на клавиатуре. Стоящие за его спиной люди уважительно говорят: о, ты умеешь low level! Ты с нами. Вот эта фраза довольно глубоко въелась в мой мозг. Low level… Кажется, это и есть ключ к ответам на мои вопросы.
Итак, учить программирование придется учить с азов, с ассемблера. Quora, StackExchange, Habr. Набор книг по ассемблеру. Несколько недель на ознакомление с каждым учебником. Бездна безысходности. Каждая книга предлагает учить ассемблер с позиции языка высокого уровня, чаще всего С. Педагогически это неверно. Это как предложить изучающим русский язык сначала освоить синтаксис сложноподчиненных предложений, а потом перейти к алфавиту. Отсюда, кстати, следует и вторая проблема: автор предполагает, что изучающий ассемблер не нуб, и знает, что и где нужно нажать, чтобы запустить отладчик, да и вообще в какой среде разработки следует писать код. Ах да: учебники в основном концентрируются на FASMe или TASMe, если речь идет о российских авторах. Линукс я никогда не видел, поэтому на ФАСМе стоит крест. У ТАСМа нет внятной среды разработки, поэтому тоже «нет».
Несколько недель поисков в сети увенчались успехом. Я нашел книгу, которую можно было бы поместить в рубрику «изменяющих сознание». Кип Ирвин, седьмое издание. Почему эта книга так хороша? Ирвин по образованию музыкант, причем с диссертацией, что не помешало ему в зрелом возрасте снова поступить в университет на программиста. Он учил язык самостоятельно в качестве хобби, поэтому отлично понимает все трудности, с которыми может столкнуться новичок. Его учебник объясняет всё: куда нажать, на что посмотреть, как установить. Отличный вводный курс по Visual Studio, МАСМ, ДОС и немного С++. А главное – это упражнения.
Я постдок, работаю в непыльной лаборатории, шеф не занудствует и не заставляет работать сверхурочно. Вечернее время с шести до двенадцати уделено ассемблеру и программированию вообще. Первое упражнение — это как моя первая стометровка. Главное – осознать то, что программирование и вообще поиск решения проблемы является неалгоритмируемым и нелинейным процессом. Этот процесс требует непрогнозируемых временных затрат: может, пару минут, а, может, и несколько дней. Главное – помнить свой предыдущий успех: если я в прошлый раз решил упражнение с двумя звездочками, то в этот раз тоже решу.
Вместе с первой решенной задачей пришло понимание того, что программированию нельзя обучить. Можно выучить пару сотен алгоритмов, но всё равно настанет тот день, когда нужно будет создать что-то новое. И тут уж никакой Дональд Кнут не поможет. А можно ли развить способности к программированию? Ломоносов говотил, что лучшее упражнение для мозга — математика. Поэтому в довесок к ассемблеру нужно было освежить знания по матану и начать изучать дискретную математику. Снова муки выбора, но уже попроще. Матанализ, учебник Стюарта, шестое издание. Дискретная математика, Кеннет Розен, седьмое издание.
В сети очень много дискуссий, посвященных бесполезности асма. Я же чрезвычайно рад тому, что выучил основы этого языка. Низкоуровневое программирование позволяет понять такие неочевидные для языков высокого уровня вещи как работа стека памяти и почему возникает его переполнение, чем опасна рекурсия, фундаментальное значение связанного списка для систем хранения памяти, етц. Главное же — это то, что асм учит бережливому отношению к ресурсам компьютера и, соответственно, к энергопотреблению. Будь я миллиардером, я бы с удовольствием инвестировался в разработку систем наподобие MenuetOS. Ну, или хотя бы пожал руку их разработчикам.
Девять месяцев на Ирвина, ознакомление с FreeDOS, изучение стандартной библиотеки С и первые шаги в С++. Краткое знакомство с технологиями SSE по справочнику Куссвурма. Босс вызывает меня к себе в кабинет и заявляет, что мои сомнительные успехи на научном поприще не позволяют ему продлить мой контракт. Не удивительно: мои коллеги с утра до ночи потеют над проектами, забывают о личной жизни и бьются насмерть с редакторами и рецензентами за каждую статью, а я отсиживаю положенное по контракту время в лаборатории и бегу домой баловаться с ассемблером, и вообще думаю больше о программировании, чем о работе.
В общем, у меня полгода до увольнения и мне нужно добавить газу. Откладываю дискретную математику в сторону. Мне нужно начинать учить язык высокого уровня и выбор падает, естественно, на С++. Я уже на «ты» с Visual Studio, поэтому все должно быть легко. Кстати, С является подмножеством С++, поэтому можно убить двух зайцев одним выстрелом.
Кресты. На мой взгляд, есть пара достойных учебников: Прата и Дейтель. Прата местами довольно многословен. Дейтель прост, но все объясняет с точки зрения ООП. С этих учебников началось мое первое погружение в мир объектов. Поскольку мой мозг был безнадежно испорчен ассемблером, то учебник Дейтеля я использовал только как источник дополнительной информации. Автор посвящает целую главу описанию «силы, мощи и красоты» ООП, при этом не удосуживаясь описать недостатки концепции. Например, Ирвин открыто говорит во вступлении, что писать ПО на ассемблере – нездоровая идея, но знать ассемблер должен каждый. Прата тоже не излишествует и описывает ООП довольно умеренно. Дейтель же говорит: ООП – это круто, поэтому будем им пользоваться. 2+2? Нет проблем: создадим класс, парочку конструкторов, унаследуем методы и перегрузим операторы. Ответ: 4.
Человек пришел в ресторан и заказал спагетти. Официант принес ему ложку, вилку и трубочку. Клиент думает: ну, раз принесли трубочку, то ей обязательно надо пользоваться. И начинает засасывать по очереди макаронины. Просто, мощно и красиво. Это не критика ООП, мне просто кажется, что у всего есть свои области применения и ограничения. ООП наверняка хорошо в графике, где каждый объект на дисплее соответствует объекту, создаваемому на основе описания в классе. Но и здесь вспоминается книга Абраша, писавшего игры на чистом ассемблере. Или Ксавье Ниель, владелец французского мобильного провайдера Free. Он основал школу «42», где абитуриентам после нескольких месяцев подготовки предлагается написать видеоигру на С. Можно ведь и без ООП обойтись.
Другая проблема языка – указатели. Этой теме тоже посвящены сотни статей и гневных писем в редакцию. Указатель в ассемблере – очень простая вещь и не требует для понимания какого-то особенного мозга. Реализация указателей в С/С++ — это действительно проблема. Не хочу останавливаться на тонкостях, хочется лишь сказать, что указатели с кастами и с десятком астерисков между скобками действительно вызывают обморок. Почему нельзя было придумать что-нибудь более внятное наподобие ESI/EDI и квадратных скобок?
Неделя до увольнения. Лингвист. Более чем высшее образование. Абсолютно бесполезное существо на рынке труда. У меня выбор: или заняться поиском работы, или потратить накопленные деньги на путешествия и отдых. Китай всё-таки красивая страна. Гансу, Цинхай, Синьцзянь, Каракорумское шоссе. Мои разосланные несколько месяцев назад резюме остались без ответа. Я сижу в лаборатории и рассматриваю сайт университета. «Лаборатория искусственного интеллекта ищет людей с магистерским образованием и навыками программирования». Мне отвечают через пять минут. Рандеву через час.
Шеф интересуется моим прошлым и задает пару вопросов о моей мотивации. Он по образованию статистик, никогда не программировал, поэтому зовет своего постдока, чтобы тот меня протестировал. Алгоритмы по преобразованию фраз и поиску слов, это просто. Генетические методы и модели Маркова… эээ, полный ноль. Шеф мне говорит: у тебя ровно столько знаний, сколько могло бы быть у стандартного самоучки. Ассемблер не в счет, он бесполезен. Но он дает мне шанс, поскольку у меня есть знания иностранных языков и способность к обучению. Он работает над корпусом китайского языка и собирается расширяться в сторону индоевропейских языков. Сидящий рядом постдок говорит, что придется учить паттерны. ООП неизбежно как крах империализма…
Итак, первый день. Среда разработки – Visual Studio. Язык – С Шарп. Моя задача – изучить программное обеспечение, над которым они начали работать десять лет назад. Язык по синтаксису близок к С++, но есть масса незнакомых мне методов, поэтому снова приходится искать учебник и решать упражнения. В этот раз выбор падает на болгарский учебник, написанный основателями Telerik. Превосходная книга для тех, кто хочет изучить одновременно и язык, и алгоритмы.
Прата, кстати, описывал очереди и стэки, но это делалось в не-императивном стиле: мол, давайте решим эту задачу с помощью стэка. А что это за стэк-то такой и откуда он взялся – не известно. Болгары описывают каждый алгоритм и объясняют, какой круг задач может быть решен с их помощью. Я когда-то на заре юности читал треды на StackExchange и часто впадал в ступор от фраз наподобие «черно-красные деревья». Сейчас тоже впадаю, но хотя бы представляю, что такое «дерево» вообще. Учебник болгар пришлось дополнить книгой поляка Марцина Ямро. Чистые алгоритмы, все просто и понятно. Паттерны: Джудит Бишоп.
Искусственный интеллект и корпус китайского языка. Шарпа недостаточно. Нужно учить базы данных. SQL, справочник Агарвала. Прекрасная книга, внятные объяснения. За алгоритмами и базами данных следует учебник Петцольда по WPF и «WPF Cookbook». XAML прост в усвоении, однако идущие вместе с ним bindings и MVVM пока еще не поддаются пониманию.
Год работы в области разработки искусственного интеллекта в качестве джуниора. То есть в академической среде нет такого понятия как инженер ПО. Мы все – research assistants. У каждого свой проект, а как он будет реализован — это личное дело каждого. Я уже упомянул, что мой босс никогда не программировал. Для него главное требование – интеграция с ранее написанным софтом, всё. Я иногда беседую с коллегами, работавшими ранее в корпоративной среде. Судя по всему, у нас довольно расслабленная обстановка, всё обходится без проверок качества кода. Паттерны пылятся на полке.
Я пока еще не знаю, хочу ли я в будущем продолжать работать программистом и искать более высокооплачиваемую работу в частной компании, но я уже точно знаю, что мне не хочется заниматься ИИ. Как говорят наши американские партнеры, ИИ – это 99% hype. Очковтирательство. Терри Гоу безусловно сможет автоматизировать конвейер Foxconn'a. Метрополитеновцы, кассиры в супермаркетах и работники колл-центров тоже пойдут на мороз, потому что это алгоритмируемая работа. Компьютер, однако, никогда не заменит учителя, врача и инженера. И я лично вряд ли доверю роботу управлять моей машиной.
Ах, я забыл: я же лингвист и все так же бесполезен на рынке труда. Где он, тренд? Что нужно учить, чтобы остаться на плаву? Ну, посмотрю новости еще раз. Ага, канадцы арестовали дочку владельца Huawei. Немцы беспокоятся по поводу уязвимости государственных систем телекоммуникаций перед лицом китайской угрозы. Nokia еще не достигла технологического уровня Huawei, поэтому в Германии назревает дилемма: либо ждать несколько лет, пока местные компании родят достойную замену китайской продукции, и при этом поставить крест на экономическом рывке вперед. Либо модернизировать местную мобильную сеть до уровня 5G, полагаясь исключительно на потенциально небезопасную продукцию коммунистов. Мне кажется, что я должен начать копать в этом направлении. С, Линукс, networking, электротехника, телекоммуникационные стандарты. Это моя следующая ступень.
Заключение. Все вопросы, которыми я начал задаваться с того момента, когда впервые открыл самоучитель по французскому, так и остались без ответа. Можно ли развить способности к языкам или это врожденная особенность человека? Логика, абстрагирование и программирование — аналогичный вопрос. Нейрофизиологи утверждают, что левое полушарие мозга как раз и отвечает за языковые способности человека и его умение логически рассуждать. Был ли мой мозг изначально предрасположен к аналитической деятельности или же это результат жизненных обстоятельств? Почему я был апатичным ребенком без всяких интересов, а перешагнув за черту двадцатилетия, внезапно обрел усидчивость и умение усваивать довольно чувствительные объемы информации?
Вопрос отнюдь не праздный, потому что кассирам супермаркетов после массовых увольнений придется как-то приспосабливаться к новым условиям. Если логическое мышление является следствием тренировок, тогда кассирам можно не волноваться. Волноваться придется нынешним программистам из-за возросшей конкуренции. Если логическое мышление закодировано генами, тогда волноваться придется правительству, потому что кассиров придется чем-то кормить. Ну, и всевозможным борцам за равноправие и равные возможности для всех тоже нужно будет как-то смириться с этой неудобной правдой.
Ну, и на счет целей в жизни. У читателей этой статьи наверняка возникло ощущение недоумения: здоровый, мол, лоб, а всё ещё мечется в подмастерьях. Осознание того, чем мне бы хотелось заниматься, пришло уже после того, как мой научрук подарил мне книгу «Человек, который сажал деревья» Жионо. После этого я напал на публикации нашего ученого Зимова в Nature, описывавший первый проект по геоинженирингу в Восточной Сибири. Есть еще замечательная работа зоологов из Новосибирска, ведущих работы по приспособлению львов к условиям полярной зимы. Мне бы хотелось заниматься именно этим. За 20 000 рублей в месяц.
Всем удачи!