Исповедь программиста
Jan. 31st, 2019 08:19 pmУ программистов - железные нервы. Это только так кажется, что они нелюдимы и неподготовлены к жизни в жестоком мире людей. Просто большую часть жизни они проводят в мире бездушных нещадных программ. Которым не скажешь, что сегодня ты в плохом настроении или неважно себя чувстуешь. Она не будет тебя слушать, просто перестанет работать. Но даже когда ты уверен, что все под контролем, все четко отлажено, проверенно и оттестировано и работаешь уже сотни и тысячи часов - все равно что-нибудь может в любой момент на**нуться.
Как например сегодня.
С утра мой коллега открыл гугл карты, чтобы показать на круглом глобусе, как быстрей долететь до Бразилии через Хьюстон, а глобус больше был не круглый. У него не работает ни на одном девайсе, у меня везде работает нормально.
Я полез обновлять приложение на Google Play, а оказалось, что оно просто оттуда исчезло. Без всяких напоминаний и предупреждений. При этом я его вижу и могу редактировать через консоль разработчика. Не странно ли?
Потом перестали работать сервисы Google Cloud, которые вообще никто не трогал уже несколько месяцев. Оказалось, что они просто отключены в настройках админской консоли. Сами по себе отключились, ага. В отчетах ни слова. Включил обратно, заработало.
И через несколько месяцев таких трудовых будней ты уже ничему не удивляешься. В этом какбэ и заключается профессиональная закалка. В любой ситуации делать вид, что так все и ожидалось, просто если что пожать плечами и молча и спокойно приводить все в рабочее состояние. Пока снова не навернется.
Раньше я еще глупый был, молодой, и не мог понять, как программисты работают с системами в миллионы строк кода, не понимая, как все там внутри работает. Как они могут быть уверены, что их программа будет в любой ситуации вести себя так, как задумано? Так вот, они не уверены. Точнее не так: они знают, что почти в любой программе есть баги, и просто живут с этим, надеясь, что пронесет.
Помню, я еще начал учился в универе и нам дали задание написать программу шифрования на базе RSA - одного из лучших алгоритмов шифрования. Я долго ходил в шоке, понимая, какая это сложная задача - написать криптосистему, чтобы она еще без багов работала. Пока не подошел к более опытному одногрупнику и он мне показал, как надо делать: скачиваешь в интернете какую-то рандомную реализацию алгорима и не разбираясь, как он работает, просто создаешь формочки приложения, которые вызывают библиотечные функции алгоритма. И самое интересное: это был правильный подход.
Никто не ожидает, что программист будет сам все писать с нуля руками. Это долго и ненадежно, и надо разбираться как там все устроено. Мы просто доверяем друг другу, хоть и понимаем, что в любой системе есть заложенные мины замедленного действия, такие как, например, проблема 2000-го года. Мы ходим по чужим минным полям, руководясь только скудными описаниями тех территорий, по которым гуляем, и надеясь, что если кто-то проходил безопасно по этому полю до нас, то скорее всего, пройдем и мы. Но к, сожалению, это не всегда так.
Интересно сравнить, как обстоит дело в других областях. Например, когда ты садишься в машину, ты смотришь на приборную панель, на которой показаны результутаты быстрого теста состояния машины по чеклисту, и только потом едешь. Так вот, в компьютерных программах нет таких чеклистов (они могут использоваться при создании программ, и то не всегда). Ты едешь сразу, а проверки случаются по ходу движения, если у программиста было время и желание их туда вставить.
И это я еще про программы машинного обучения не начал говорить, которые вообще не детерминированы. Как написать тесты на Голосовой помощник, когда даже на один и тот же вопрос он всегда отвечает по-разному, в зависимости от времени, места, предыдущих вопросов и т.п. и никто не может предскзать, что он скажет в следующий раз? А ведь мы под него тоже программы пишем.
Можно долго говорить об ухищрениях, на которые идут программисты, чтобы хоть как-то удостовериться в работе своих программ. Например, создают "чудные тесты" (flaky tests), которые выполняются успешно только иногда (как машина, которая заводится не с первого раза); имитируют реальное окружение фейковым, а потом выпускают код в продакшн, надеясь, что там программа будет работать, как раньше; проверяют код друг друга глазами, надеясь, что он от этого станет более надежным и т.п.
Но даже в таких монструозных корпорациях как майкрософт, эппл или гугл, регулярно случаются косяки, и все с этим живут. Подлатаем, выпустим патч и будем летать дальше. Добавим еще 10 тысяч дешевых машин в датацентр с бэкапами и будем пилить облачные сервисы дальше. Форкнем взломанный Этереум и будем майнить криптокоины дальше.
Природа непредсказуема. Просто прими это. Железо непредсказуемо, потому что физика на квантовом уровне недетерминирована. Стартовали ракету, а в нее ударила молния. Запустили спутник с несколькими дублирующимися процессорами, их насквозь прошила быстрая частица и они все отказали, потому что стояли плотно в ряд. Послали другой спутник на Марс и забыли перевести футы в метры.
И тем более непредсказуемы программы, потому что написаны людьми, которые склонны ошибаться, даже самые умные из них. Честное слово, я даже буду рад, если когда-нибудь программы будут тоже писать роботами. Может, хоть тогда они станут надежней. Ведь они уже играют в шахматы лучше нас. А нам останутся чувства и эмоции; все то, что мы делали, начиная с древних времен.
Как например сегодня.
С утра мой коллега открыл гугл карты, чтобы показать на круглом глобусе, как быстрей долететь до Бразилии через Хьюстон, а глобус больше был не круглый. У него не работает ни на одном девайсе, у меня везде работает нормально.
Я полез обновлять приложение на Google Play, а оказалось, что оно просто оттуда исчезло. Без всяких напоминаний и предупреждений. При этом я его вижу и могу редактировать через консоль разработчика. Не странно ли?
Потом перестали работать сервисы Google Cloud, которые вообще никто не трогал уже несколько месяцев. Оказалось, что они просто отключены в настройках админской консоли. Сами по себе отключились, ага. В отчетах ни слова. Включил обратно, заработало.
И через несколько месяцев таких трудовых будней ты уже ничему не удивляешься. В этом какбэ и заключается профессиональная закалка. В любой ситуации делать вид, что так все и ожидалось, просто если что пожать плечами и молча и спокойно приводить все в рабочее состояние. Пока снова не навернется.
Раньше я еще глупый был, молодой, и не мог понять, как программисты работают с системами в миллионы строк кода, не понимая, как все там внутри работает. Как они могут быть уверены, что их программа будет в любой ситуации вести себя так, как задумано? Так вот, они не уверены. Точнее не так: они знают, что почти в любой программе есть баги, и просто живут с этим, надеясь, что пронесет.
Помню, я еще начал учился в универе и нам дали задание написать программу шифрования на базе RSA - одного из лучших алгоритмов шифрования. Я долго ходил в шоке, понимая, какая это сложная задача - написать криптосистему, чтобы она еще без багов работала. Пока не подошел к более опытному одногрупнику и он мне показал, как надо делать: скачиваешь в интернете какую-то рандомную реализацию алгорима и не разбираясь, как он работает, просто создаешь формочки приложения, которые вызывают библиотечные функции алгоритма. И самое интересное: это был правильный подход.
Никто не ожидает, что программист будет сам все писать с нуля руками. Это долго и ненадежно, и надо разбираться как там все устроено. Мы просто доверяем друг другу, хоть и понимаем, что в любой системе есть заложенные мины замедленного действия, такие как, например, проблема 2000-го года. Мы ходим по чужим минным полям, руководясь только скудными описаниями тех территорий, по которым гуляем, и надеясь, что если кто-то проходил безопасно по этому полю до нас, то скорее всего, пройдем и мы. Но к, сожалению, это не всегда так.
Интересно сравнить, как обстоит дело в других областях. Например, когда ты садишься в машину, ты смотришь на приборную панель, на которой показаны результутаты быстрого теста состояния машины по чеклисту, и только потом едешь. Так вот, в компьютерных программах нет таких чеклистов (они могут использоваться при создании программ, и то не всегда). Ты едешь сразу, а проверки случаются по ходу движения, если у программиста было время и желание их туда вставить.
И это я еще про программы машинного обучения не начал говорить, которые вообще не детерминированы. Как написать тесты на Голосовой помощник, когда даже на один и тот же вопрос он всегда отвечает по-разному, в зависимости от времени, места, предыдущих вопросов и т.п. и никто не может предскзать, что он скажет в следующий раз? А ведь мы под него тоже программы пишем.
Можно долго говорить об ухищрениях, на которые идут программисты, чтобы хоть как-то удостовериться в работе своих программ. Например, создают "чудные тесты" (flaky tests), которые выполняются успешно только иногда (как машина, которая заводится не с первого раза); имитируют реальное окружение фейковым, а потом выпускают код в продакшн, надеясь, что там программа будет работать, как раньше; проверяют код друг друга глазами, надеясь, что он от этого станет более надежным и т.п.
Но даже в таких монструозных корпорациях как майкрософт, эппл или гугл, регулярно случаются косяки, и все с этим живут. Подлатаем, выпустим патч и будем летать дальше. Добавим еще 10 тысяч дешевых машин в датацентр с бэкапами и будем пилить облачные сервисы дальше. Форкнем взломанный Этереум и будем майнить криптокоины дальше.
Природа непредсказуема. Просто прими это. Железо непредсказуемо, потому что физика на квантовом уровне недетерминирована. Стартовали ракету, а в нее ударила молния. Запустили спутник с несколькими дублирующимися процессорами, их насквозь прошила быстрая частица и они все отказали, потому что стояли плотно в ряд. Послали другой спутник на Марс и забыли перевести футы в метры.
И тем более непредсказуемы программы, потому что написаны людьми, которые склонны ошибаться, даже самые умные из них. Честное слово, я даже буду рад, если когда-нибудь программы будут тоже писать роботами. Может, хоть тогда они станут надежней. Ведь они уже играют в шахматы лучше нас. А нам останутся чувства и эмоции; все то, что мы делали, начиная с древних времен.