andrzejn: (Default)


Всё началось... смотря откуда считать. Тридцать пять лет назад я составил свою первую работающую программу для калькулятора МК-54. Тридцать лет назад получил свои первые деньги за написанную программу. Двадцать восемь лет назад устроился на первую программистскую работу. Мест работы я с тех пор сменил немного - на последнем, четвёртом, я проработал восемнадцать лет.

Динозавром я себя не считаю. Динозавры успели всерьёз покодить на мейнфреймах с перфокартами и перфолентами. А не так, как я - только на лабораторках первого курса. Я мастодонт. Я успел попрограммировать на БК-0010 (PDP-11), Агате (кривом советском клоне Apple II) и ZX Spectrum. На БК я написал Xonix - на ассемблере, затем вручную переведя команды в машинные коды.

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

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

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

Мало работ, где процесс столь ценен, как в работе программиста, учитывая уровень зарплат и типичное продуктивное время (часа четыре в сутки, не считая выходных). Мало работ, где результат ценится столь ничтожно (в среднем, учитывая всё сотворённое, а не только задержавшуюся у пользователей верхушку айсберга). Мало работ, где необходимо с такой скоростью бежать через поток новых знаний, чтобы только оставаться на месте.

В этой профессии выживают и задерживаются только просветлённые. (Ну и местами столь же целостно-бесхитростные идиоты - там, где их ещё не заменили автоматизацией и не смахнули в корзину). Только те, кто способны сохранять интерес и самоуважение, всю жизнь непрерывно отправляя в ничто все результаты своей напряжённой работы. Потому что важен только процесс здесь и сейчас.
andrzejn: (Default)
Если вы с интересом и согласием читаете этот пост, он для вас бесполезен. Он адресован тем, кто не станут его читать.


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

Затем они начинают, сцуко, спрашивать. Как мне этот дизайн? Хочу ли я плитку подешевле, но которая отвалится через десять лет, или которая проживёт век, но дороже? Как надо считать суммы возврата налога на платежи, просроченные более чем на полгода? Эти термины следует переводить по медицинскому словарю или по техническому? Мой ребёнок не хочет играть в подвижные социальные игры, но отлично сам в уголке собирает конструкторы - мне это подходит? Как я вообще хочу жить? Отстаньте, демоны! Я уже заплатил вам денег - чего вам ещё надо?

И вот тут я совершаю критическую ошибку, из-за которой примерно вся моя жизнь идёт в жопу. Я говорю: "Отстаньте, демоны!" Я отговариваюсь какой-нибудь незначительной ерундой. Я тупо молчу. Я отвечаю, но меняю решения по пять раз в неделю. Я говорю: "Вы специалисты, вам виднее, сделайте как-нибудь сами". Очевидно же, что они просто придалбываются. Я уже сказал всё, что мне надо, я уже дал денег. Пусть делают и не высовываются.

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

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

Они всё равно постараются угадать и сделать как лучше. Они же специалисты.

Но что я получу при таком моём отношении к своему запросу?

Только говно.
andrzejn: (Default)
Ассертивное поведение считают эталоном здорового конструктивного общения и отношения к жизни. Я с этим, в общем, согласен. Ассертивный человек выглядит сильным, уверенным, надёжным, в меру жёстким, но одновременно и внимательным, гибким, сочувствующим и так далее. Однако сложность ассертивности не только в том, что для неё надо извести стадо собственных тараканов, но и в том, что идеально она работает только с такими же ассертивными людьми. Невротизированные собеседники могут принимать эту позицию за чёрствость, холодность, наглость, слабость, обман - всё что угодно из своего привычного спектра. В общем итоге ассертивность даёт приличные результаты даже тогда, но что хорошие люди всегда могут договориться - это романтичная иллюзия.

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

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

А в программировании обязательные условия, которые всегда-всегда должны исполняться, иначе всё пропало и сплошная ошибка, почти во всех языках называют assert.
andrzejn: (Default)
Прошу помощи коллективного разума. Прежде всего программистов и примкнувших к ним айтишников, но также и всех остальных заинтересованных.

После поста о психологии программистов мне поступил запрос программиста, которого в процессе лечения поломали психологи (подлечили как человека, поломали как программиста): восстановить профессиональные качества программиста.

Нижеследующее - первые наброски методики. Прошу дополнять и корректировать.

Тезисы:
1. Курс должен проходить в обстановке, приближённой к нормальной работе программиста. То есть годиться для индивидуальной самостоятельной работы. Роль ведущего - направлять и подсказывать, если понадобится. Дистанционно.

2. Это не должен быть очередной практический курс языков программирования, фреймворков и технологий. Таких курсов уже 100500, незачем их повторять. Цель - развить базовые качества психики, которые делают программиста программистом.

3. Я планирую фокусироваться на следующих качествах:
* способность к рабочему трансу (состоянию потока)
* в качестве помощи - техники организации работы и времени
* мышление абстракциями и категориями
* деятельный интерес к тому, как всё устроено, как работает и как это можно улучшить
* удовольствие от программирования как процесса

Далее, собственно, упражнения и рекомендации, как это всё развивать. Тут советы особенно нужны.

Наброски )

Уф. Комментарии, мнения, дополнения?
andrzejn: (Default)
Тезисы сегодняшнего доклада Романа Сидорченко на симпозиуме:

* Программисты думают сложными абстракциями. Не образами, не метафорами, не силлогизмами. Многоуровневыми многопоточными абстракциями. Просто потому что постоянно работают с ними, а переключаться между способами мышления - затратно.

* Как следствие, все программисты способны к глубокому, длительному трансовому сосредоточению (состоянию потока). Эта способность - и профессиональное показание, и профессиональная деформация. Программист норовит войти в рабочий транс по любому вопросу, который стоит размышлений.

* Всё сущее программисты категоризируют по удобным критериям. То, чему не удаётся дать компактное рабочее определение и разложить по категориям - не существует, потому что с ним невозможно работать.

* Гармонию, красоту и соразмерность сложных структур программисты чуют интуитивно. Потому что иначе со сложными абстракциями работать не получается. Дисгармония вызывает острое ощущение неправильности и почти физическое отвращение.

* Отстранённая метапозиция по отношению к чему угодно, которой психотерапевтов долго специально учат, у программистов встроена.

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

* Хотите работать с программистом? Выработайте общий разговорный словарь и не лезьте трогать в его психике то, что и так работает.

Дополню своими наблюдениями )
andrzejn: (Default)
На описание языка Eiffel я набрёл лет двадцать назад, и сразу же влюбился в его принцип Design by Contract. Я вообще люблю, чтобы всё было описано максимально чётко: что куда можно и нельзя передавать, что откуда следует ожидать. И чтобы всё максимально проверялось как можно раньше. И в языки с нестрогой типизацией я так и не поверил. Контракты просто идеально соответствуют моему представлению о прекрасном. (Отсюда следует, что реальный мир почти всегда ужасен). Жаль, что Eiffel так и не захватил весь мир, а больше с тех пор контракты мне нигде не попадались.

Так что когда я два года назад узнал о проекте CodeContracts for .Net, я ухватился за него всеми руками. Это было в точности то, что надо. И оно показало мне уйму сомнительных мест в моём коде. А я-то думал, что пишу аккуратно... (Потом я пробовал пропускать через анализатор исходники нескольких популярных библиотек, и всегда это оказывался ад кромешный из кучи не проверенных разработчиками возможных ситуаций).

Но, блин, проект уже два года как заброшен. В VS.Net 2017 и .Net Core поддержки контрактов нет и не будет. И чем их теперь заменить? Пока что перевожу проекты на R# Code Annotations. Это не то, но хоть что-то...
andrzejn: (Default)
В здешнем здании довольно разветвлённая сеть дверей и коридоров. За дверью может оказаться не комната, а коридор, некоторые двери в нём ведут в другие коридорчики, за некоторыми дверями скрывается тамбур и ещё несколько дверей. Но всё тщательно пронумеровано, на каждой двери висит табличка с полным путём к ней. Например, тут неподалёку есть комната с номером 5.3.3.4.А.
andrzejn: (Default)
В офисе второй день сломан кондиционер. После обеда солнце светит на нашу сторону здания. Обстановка совершенно нерабочая, даже с открытыми окнами.

Нет, этот пост никак не связан с предыдущим.
andrzejn: (South Park)
Языки программирования с ленивыми вычислениями не захватили весь мир только потому, что этот результат им пока ещё ни для чего не понадобился.

Дополз

Thu, Jun. 23rd, 2016 18:05
andrzejn: (Default)
Закрыл задачи, помыл чашку, выбросил бумажки, спрятал в ящик зеркало заднего вида, выключил компьютер. Отпуск. В следующий раз на программистскую работу 12 июля.
andrzejn: (Default)
Зарегистрировался как ФОП (частный предприниматель) смешанного психолого-программистского профиля. Оказалось удобно, что я ещё не ушёл с программистской работы, тут есть бухгалтеры, которые взяли на себя вообще все усилия с оформлением. А там дальше уже разберусь.

Котики

Tue, Mar. 29th, 2016 08:29
andrzejn: (Me)
Кошка, когда гадит на ковёр за креслом, думает: "Тут темно, никто не видит, да и я же потом всё зарою..."

Программист, когда вставляет в код костыль, думает так же.
andrzejn: (Discontented)
Я худо-бедно владею тремя профессиями, плюс ещё на несколько смотрел со стороны, и во всех натыкался на эти грабли. Я начинаю думать, что это глобальный закон. Формулируется он так:

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

Например... )

Можете добавлять примеры из своих областей.

Этому миру недостаёт идеальных посредников, переводчиков и сомелье, которые бы выводили потребителей в точности на нужных им производителей, абсолютно не загружая первых ошибочными рекомендациями, а вторых - избыточной побочной суетой.
andrzejn: (Default)
Вчера вечером весь наш программистский офис остался без интернета (за пять минут до нашего совещания с заказчиком, но это уже другая история). Причём не внезапно, ресурсы постепенно отваливались один за другим у разных людей, скайп и ещё один мессенджер пережили многих, но в итоге умерли и они... Мы безуспешно искали причину, перезагружали роутер и DNS-сервер...

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

Выводы:

1. Не должно технике быть умнее человека.
2. Слава роботам!
andrzejn: (Storytime)
Если нельзя прожить день без мнемонических приемов и цифровой гимнастики тайм-менеджмента, то у вас просто слишком много задач.

Эндрю Смарт. О пользе лени. Инструкция по продуктивному ничегонеделанию
andrzejn: (Default)
Интуитивный дружественный покерфейс.
andrzejn: (Default)
Наш админ завёл сову.
Приучает её к рукам.
В холодильнике уже припасены мыши.
andrzejn: (Default)
За шесть рабочих дней поднял виртуальную машину под OpenSUSE, а на ней - CMS Orchard с сайтом фирмы. При том, что Orchard официально поддерживает только родной .Net Framework под Windows. Чтобы запустить его на Mono под Linux, мне пришлось перечитать всё, что об этом написано на форумах (к счастью, основную работу люди уже провели), пропатчить и пересобрать и Orchard, и Mono, плюс потом самостоятельно поплясать с мелкими фиксами, конфигурированием и доустановкой тем вручную. В процессе один раз угробил систему и переустанавливал её заново.

Выводы:

1. Учитывая, что до этого всё моё знакомство с Linux ограничивалось только шаманством "зайти по SSH на вот этот сервер и передёрнуть вон тот сервис, если багтрекер лёг" - я крут.

2. Без гугля и множества тематических форумов фиг бы я справился. За другие области знания не скажу, а современное программирование и админство без этой глобальной базы знаний давно уже просто невозможны.

3. Практически все Open Source решения (ну, насколько моя выборка репрезентативна) явственно отдают непрофессионализмом. Основные фичи работают, а множество мелочей либо глючат, либо отсутствуют. Чтобы понять, как это всё заставить работать, требуется копаться в неочевидных советах и плясать с бубном. Потому что, ясное дело, писать основную функциональность интересно, а вылизывать детали и делать людям удобно - обычно нет. Этим нормальные программисты занимаются только за хорошие деньги.
andrzejn: (Default)
Пока я настойчиво стараюсь уйти из программистов в психотерапевты, многие люди переучиваются в разработчиков или тестеров. Меня иногда спрашивают, на что смотреть и с чего начинать в этом деле (изучать "программирование как иностранный"). Я в некотором затруднении, потому что сам-то я учился этому четверть века назад, и практически всё с тех пор потеряло актуальность.

Думаю, что порекомендовать можно такое:

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

Upd.: Я пополняю список по мере поступления комментов. Стараюсь держать его именно в рамках вводной для начинающих. Например, Structure and Interpretation of Computer Programs - книга великая, но не в самом начале.

Profile

andrzejn: (Default)
Андрій Новосьолов

April 2019

M T W T F S S
1 2 3 45 67
89 1011 1213 14
1516 17 18 19 2021
22232425262728
2930     

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Sun, Apr. 21st, 2019 18:48
Powered by Dreamwidth Studios