И снова 256-й день года

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

Под катом вспоминаем в честь праздника свои первые строчки кода. А ещё — код и программы, которые нам больше всего запомнились. И рассказываем, почему. И конечно, очень ждём ваших историй в комментариях!

swit7zcp2lj1rhjcruwcvqlgoiu.png


Что за язык программирования на картинке?

Мы сегодня ностальгируем, поэтому выбрали для поздравления COBOL. Он был первым стандартизированным языком программирования (стандартизирован в 1960 году). Это означает, что программа, написанная на одном компьютере, могла быть скомпилирована и исполнена на другом компьютере без доработок. В те времена это было огромным прорывом, другие языки требовали доработки программ при попытке запустить их на другом компе, зачастую это было трудно и долго.
Happy Programmer«s Day на COBOL’е выглядит именно так. (За экскурс и код благодарю pik4ez).

Идея поста родилась во время летнего корпоратива, когда мы с коллегами внезапно заговорили о первых шагах в программировании. И мы с iseregin решили собрать их воспоминания и поделиться с общественностью. Итак…

Казалось бы, что интересного в первых строчках кода? Некоторые тоже сначала так подумали.

Dev 1: Я думал, что у всех первая строчка кода была что-то вроде:

!#/bin/bash
echo "Hello World"

Dev 2: В нашей местности это было скорее: MsgBox "Hello World". Потому что найти диск с линуксом надо было еще постараться.

Дискуссия, можно сказать, завязалась уже с первых реплик в чате. А потом мы получили несколько интересных и развёрнутых ответов, которыми хотим поделиться. Вот что нам рассказали коллеги из Авито.

image

Андрей Shodan Аксёнов, руководитель инфраструктуры поиска: «Самые первые строчки кода, которые я в принципе в компьютер вводил, точно были не мои. Это были какие-нибудь странные программки на Basic, которые я перепечатывал из журналов (потому что суровое детство, восьмибитные игрушки). Но зато точно помню, как моей программой впервые воспользовались другие люди.
Это была эпоха излёта DOS. Я написал программку на ассемблере, которая захватывала экран в графическом режиме. Причем, в отличие всего, что на «рынке» было, она справлялась вообще со всеми видеорежимами, в том числе совершенно безумными хакерскими. Например, если штатный режим работы VGA это было 320×200 и на 256 цветов, то люди какими-то гнусными хаками и перепрограммированием контроллера, который лучи по ЦРТ-трубочке гоняет, добивались 360×240. Я умудрился написать программку, которая со всем этим справлялась, захватывала экран (видеопамять), сохраняла его в файл, и потом из этого дампа ты мог ловко .bmp сохранить отдельной офлайновой утилиткой. Я довёл эту программку до конца, выложил ее в интернеты и успешно забыл.
Прошло чуть ли не 12–15 лет с этого момента. Мне на e-mail пришло письмо. Такая простыня, как будто Лев Николаевич Толстой пишет, на трех листах — и это только первая фраза. «Здравствуйте, я водитель-дальнобойщик из Канады. Активный пользователь вашей программы. Денег у меня нет, а пять детей есть. И я на помойке нашел 486-й компьютер, плюс какие-то старые игры в интернетах украл, и теперь у меня дети дико шпилятся на этом компьютере в разные игры. При этом самая любимая их игра ничего не умеет: ни общую доску почёта сохранять, ни хотя бы один топовый high score сохранять, и даже скриншот сделать невозможно, потому что как раз используется какой-то наркоманский видеорежим. А ваша утилита с этим отлично справляется, и дети ей постоянно пользуются. Да я и сам, бывает, между рейсами… Так вот, поскольку мы активные пользователи вашей древней программы, я решил вас поощрить. Вот вам код перевода Western Union на 20 долларов». Я практически прослезился и решил, что в самый черный день, когда он наконец наступит и я буду голодать, вот я возьму этот MTCN (код перевода), обналичу его и проем. К несчастью, уже и с этого момента прошло еще много лет, поэтому где сейчас MTCN, достоверно неизвестно. Возможно, есть в старых архивах почты, если я их за это время не потерял. Узнаю в самый черный день».

image

Артём Разинов, ведущий iOS-разработчик: «В пятом классе написал в детской программе Лого Миры самостоятельно код, пока все остальные более успешные ребята играли в игры. Я сотворил программу, и она работала. В этот день я решил стать программистом».

image

Даниил Попов, старший android-разработчик:
s := width * height;
«Это была строчка на Pascal, которая вычисляла площадь прямоугольника. Дело было на курсах по программированию для школьников в восьмом классе. Меня тогда больше всего впечатлило то, что я могу давать компьютеру команды, а он беспрекословно их выполняет. Эдакий повелитель машин. С тех пор очень люблю, когда выстроенная последовательность действий (алгоритм) приводит к результату».

image

Дмитрий Белов, старший бэкенд-разработчик: «Это был первый заказ на зарубежном фрилансе. Голодное студенчество, хотелось заработать хоть небольшую денежку, и не так важно было, на чём писать: знаний почти не было, изучать всё равно почти с нуля.

Попался заказ сделать анимированную открытку на Флэше. Пришлось немного поучить Action Script. Стэковерфлоу ещё не было, приходилось читать документацию.

Заказчик остался доволен, удалось сдать проект сразу. Заработал свои первые пятнадцать долларов на фрилансе».

image

Илья Грибов, фронтенд-разработчик: «Зима, 6 утра, крепкий кофе, перед выходом на работу (работал тогда совсем не в IT).
static void main(String[] args) {
    System.out.println("Привет!");
}

Эмоции: ЧТО ТАКОЕ String[] args???».

image

Владимир Акимов, старший фронтенд-разработчик: «Моя первая строчка кода была написана, потому что я очень хотел войти в рэп-тусовку. Мне было лет 17, я не умел читать рэп и писать музыку, и решил войти в крутую команду через дизайн.
Тогда никто не занимался продвижением независимых артистов в интернете. Так, нарисуют обложку друзья, выпустят диск, раздадут знакомым. И был сайт MySpace, где можно было круто оформить страничку музыканта. Я посмотрел, как это делают заграничные ребята. В какой-то момент наткнулся на парня, который жил в Германии и сделал страницу для Серёги. Того, который пел «Черный Бумер, помните»? Я решил подсмотреть, как делать подобное. MySpace был свёрстан на таблицах, я расколупал всю эту страницу, понял его идею и позаимствовал её.
Первые мои страницы были похожи на его страницы. Я делал одну за другой, пытался продвигать их. Так я подружился с одной командой. Там был дизайнер, который предложил мне писать код, а на себя взял картинки. Мы начали для всех наших популярных русских рэп-артистов делать MySpace-страницы. А потом меня пригласили работать в питерский офис MySpace работать.
Потом я написал там много строчек кода — однотипных, табличных: это были CSS и верстка, ничего сложного. Сейчас в этом любой джуниор разберётся и сделает круче. Но тогда это было «вау», потому что мы работали с IE5 и другими браузерами, для которых надо было делать кучу всего магического.
Если бы не эта история, я бы не занялся программированием, не пришел бы в дизайн, не понял, что это такое».

image

Константин Селезнев, бэкенд-разработчик: «На программирование меня «подсадил» мой одноклассник еще в седьмом классе (воистину, как на наркотик):
— Псс, парень, не хочешь немножко программирования? — примерно так он мне и сказал, всучив мне диск с Borland Development Studio и огромной коллекцией статей про Delphi.
Позже в одной из таких статей я нашел следующее: «Давайте прикольнёмся над пользователем. Например, выведем внезапно сообщение «Пора спать» и… вырубим монитор! Включить его чудилка уже не сможет…». Я попробовал приведенный в статье код, и у меня все получилось! Чувствовал себя настоящим хакером!
Правда, после этого пришлось перезагружать компьютер, ведь включить обратно монитор мне и вправду не удалось».
procedure TForm1.Button1Click(Sender: TObject);
begin
    MessageDlg('Уже поздно. Будь послушным мальчиком. Туши свет и вали спать!', mtInformation, [mbOk], 0);
    SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
end;

А вот истории от ведущих подкаста Podlodka.

image

Стас Цыганов, руководитель мобильной разработки, Туту.ру: «Мама работала учителем информатики, и у меня довольно рано появился доступ к компьютерам. А моим первым опытом в программировании была Кукарача для MS-DOS. С интересом узнал, что она жива до сих пор и даже портирована на Windows.
ЭТО Ух
 ПОВТОРИ 5 ВПРАВО
КОНЕЦ

А первый код у меня был примерно такой».

image

Егор Толстой, руководитель разработки App Platform, Авито: «Лет в десять приехал в гости к старшему брату, у которого тогда появился первый компьютер, еще на MS-DOS. Помимо безудержных зарубов в первый GTA (в российской локализации он назывался прекрасным именем «Автовор») и Duke Nukem мы открыли для себя программирование. Математика меня тогда не сильно привлекала, а вот логические ветвления и рисование — в самый раз! Так первой программой и стала генерация супрематических композиций из кругов и линий: CIRCLE(10, 10), 50».

image

Катя Петрова, руководитель разработки Frontend Architecture, Авито: «Заставить черепашку в лого-мирах рисовать круги и писать «Hello world» на Pascal на уроках информатики — это, конечно, было занимательно и познавательно. Но ещё увлекательнее было в 8-м классе гонять на боссов в WoW Classic (тогда ещё не мейнстрим). Поэтому вот мои реально ПОЛЕЗНЫЕ первые строчки кода».
#showtooltip Regrowth
/cast [@mouseover,exists,help][@player] Regrowth(Rank 5)

image

Женя Кателла, руководитель мобильной разработки, Яндекс.Транспорт: «Где-то в 8 или 9 классе я заинтересовался программированием, поэтому родители мне купили книжку по Turbo Pascal. До сих пор помню, что она была красная. И вот сначала там были простые вещи, вроде циклов и условий. А потом, кажется, первая глава заканчивалась рассказом про то, что такое рекурсия. И нужно было решить задачку про ханойскую башню. Поэтому, если не считать хеллоуворлдов, её и можно считать первой моей программой».

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

image

Андрей Shodan Аксёнов, руководитель инфраструктуры поиска: «Давным-давно, когда я трудился в геймдеве, мы руками сдуру ума написали свой собственный движок. Так делать в целом нельзя, это невозможно, но нам никто этого не рассказал. Поэтому мы написали с нуля свой и собственный движок, и весь инструментарий для разработки игры, и построили на этом игру, и всё это успели сделать за три года. Ну и в частности в ходе этого игростроя я придумал и сделал вот какой ловкий финт ушами. На самом-самом первом поколении графических программируемых ускорителей, где шейдера только ещё приделали, был недлинный период, когда GPU можно было программировать на ассемблере и руками раскладывать инструкции по слотам. Потом эту возможность отключили, оставили только HLSL, но в самом начале было можно. Вот мы в один проход умудрялись использовать четыре текстуры за раз (это тривиально), и одновременно считать освещение, карту неровностей, тени накладывать и еще что-то (а вот это никто не умел). У нас в компании было тогда если не 3 ноу-хау, то 2 ноу-хау, вот эта штука была основным. Потом, через годик-другой, когда технологии сдвинулись вперед и оно несколько потеряло актуальность, с разрешения начальства я статеечку в книжке ShaderX4 про это опубликовал. Это было очень красивое честное инженерное решение, за которое мне не стыдно до сих пор. Но это не одна строчка кода, а целых десять!».
    Listing 5.

    #define POW c3 // c3.b=B, c3.a=A, for m=2. see [Beaudoin02]

    dp3_sat r1.rgb, t1_bx2, t2_bx2       // (1) (N.H)

    dp3_sat r0.rgb, t1_bx2, v1_bx2       // (2) (N.L)
    +mad_x4_sat r0.a, r1.b, POW.a, POW.b // (2) (N.H)*A+B

    mul_x4_sat r1.rgb, r0.a, r0.a        // (3) (N.H)^n
    +mad r1.a, t0.b, SPECK.b, SPECK.a    // (3) specshadow

    mul_sat r0.rgb, r0, r1_bx2.a   // (4) (N.L)*diffshadow
    +mul_sat r0.a, r1.b, r1.a      // (4) ((N.H)^n)*specshadow

    mad_sat r0.rgb, r0, DIFF, v0   // (5) (N.L)*shadow*diffcol+ambi
    +mul_sat r0.a, r0.a, t1.a      // (5) ((N.H)^n)*shadow*specmap

    mul_sat r0.rgb, r0, t3         // (6) diffmap*difflighting

    mad_sat r0.rgb, r0.a, SPEC, r0 // (7) result
    +mov r0.a, t3.a                // (7) diffuse map alpha

image

Даниил Попов, старший android-разработчик:
i  = 0x5f3759df - ( i >> 1 ); // what the fuck? 

Это фрагмент функции, которая вычисляет быстрый обратный корень из x. Такие вычисления нужны в игровых движках для обсчета освещения сцены. Этот нечитаемый код стал широко известным после выхода Quake III: Arena.
Увидев этот код, я впервые четко осознал гигантскую пропасть между читаемым кодом и оптимальным.

image

Илья Грибов, фронтенд-разработчик: «Мне запомнился этот код. Я подумал: «Как же просто и лаконично!)».
>>> comp_list = [x ** 2 for x in range(7) if x % 2 == 0]
>>> print(comp_list) // [4, 16, 36]

image

Михаил Юдин, старший android-разработчик: «Писал красно-черное дерево будучи студентом второго курса на acm.timus.ru по книжке Кормана, и что-то поехала крыша, и я проверил this на равенство null. Такая ситуация невозможна. Мне написали что я Ъ (типа true, суров)».
if (this == null)

image

Николай Рябов, старший фронтенд-разработчик: «Как-то, на моей первой работе, связанной с фронтендом, где я был ещё совсем-совсем зелёным джуниором, мне подкинул эту строчку для размышлений такой же начинающий разработчик, как и я, со словами: «друг, уже битый час пытаюсь понять что это такое и как оно работает — давай страдать вместе!». В итоге голова моя была занята только этим и спустя пару часов я всё же понял что это такое, и что мы в результате получим в foo. Но объяснить я этого тогда ещё не мог.
const foo = Function.prototype.call.bind(Array.prototype.slice)

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

Закончить этот пост я хочу, процитировав коллегу Андрея Shodan Аксёнова:


«Вообще обычно одной строчкой кода история никогда не ограничивается. И даже небольшим сниппетом на десять строк ограничивается крайне редко. А самые фееричные истории, они, наверное, никогда не про код, а в первую очередь про людей, про то, как этот код на них повлиял. А уж какая там строчка кода конкретно была, или какая конкретно глупая ошибка в два символа — совсем неважно».

Часть историй, которые тут рассказаны, iseregin снял на видео и выложил на нашем ютуб-канале. Загляните, если любите видео.

Ещё раз поздравляем всех программистов (и заодно тех, кто с ними тесно работает). Проведите этот день приятно и интересно.
И делитесь в комментариях строчками и историями, которые вам больше всего запомнились!

© Habrahabr.ru