усы2

Стой под стрелой

Поступки и мысли, о которых могу вспомнить не краснея

Как писать
усы2
tonsky

О блоггинге, организации работы и отношению к этому всему.

Артемий Лебедев https://tema.livejournal.com/2774733.html:

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

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

Артемий Лебедев https://www.youtube.com/watch?v=2BieKJEFofs:

Мои маленькие посты, нечто среднее между длинной СМС-кой и коротким эссе, людям этот формат вполне понятен.

Jason Fried https://youtu.be/PKeJRmzUXYc?t=2312 (перепечатывал, так что не дословно):

I try to write all my blog posts within 15-20 minutes. Yes, I might spend couple of days, rewrite it 3-4 times. Might get 3% better. Doesn’t worth waiting couple of days, might decide not publish at all (get cold feet). Some stuff that comes out of it is not that good, but it doesn’t matter: everybody will forget about it tomorrow anyways. Try not to attach preciousness to these things. That more perfect version of yourself, it doesn’t exist. You wrote what you wrote, just publish and move along.

Kent Beck https://www.facebook.com/notes/kent-beck/publish-everything-pretty-much/1839078656124990/ (добавлено):

Publish pretty much everything you write because you can’t predict what is going to be popular. There is a lower bar for quality, but barring dishonesty and literally unreadable prose, everything else should go out somewhere.

Erik Spiekermann https://99u.adobe.com/articles/55323/erik-spiekermann-no-free-pitches

Work is gas. Work will fill any given volume. If you give me two hours, I will take two hours. If you give me 10 minutes, I will take 10 minutes. So if you give somebody two weeks to do a project, he’s going to start on day 12 and it will take him two days, but the two weeks will be filled because work expands like gas. Straightforward physics. That’s why I don’t believe in time sheets, because you always happen to have eight hours at the end of the day. You make up stuff.

@mdubakov: https://medium.com/@mdubakov/55-дедлайны-138e17aa762c

В основном дедлайны используют именно для этого. Это такой wishful thinking, что к указанной дате будет готово хоть что-то. Ну и работает, черт возьми. У меня по лонгридам дедлайн 24:00 каждый день. И что-то я публикую к этому времени. Не всегда хорошее, но хоть что-то.

Людвиг Быстроновский https://us9.campaign-archive.com/?u=4792a92d9a9a009fb843c130e&id=03db86f018&e=68e6483c9a

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

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

Маячила еще возможность обосраться перед читателями, но для того, чтобы она не пила мозг, достаточно было с самого начала в описании курса развязать себе руки: отменить вообще все обязательства.

В мире, где курс — это регулярные отшлифованные выпуски, меня спасает рецепт «делать всё наоборот»: продолжение этого рассказа будет приходить внезапно, и надо не стараться выдерживать стиль. Сарычева придумала, что надо однажды прислать пустое письмо, просто чтобы не стараться сделать Идеальную Рассылку.

И как только договорились о расставании, я получил внутреннюю свободу — даже если сорвется, у меня не будет неоплатного долга. Раньше к любому циклу текстов прилагалась вина, и она всё убивала. А теперь есть силы делать — не уговариваю себя из-под палки, а сижу пишу как свободный человек, день за днем. Потому что могу не писать. В этом секрет разрешения не делать. 

Еще Людвиг (про дизайн, но и тексты тоже) https://us9.campaign-archive.com/?u=4792a92d9a9a009fb843c130e&id=31913ffac1&e=68e6483c9a

> проект одновременно и крутой, и слабый. Крутой, потому что получилось, слабый, потому что мог лучше.

Неа. Это принципиальный момент, зырь. Крутой потому что крутой. Но слабый - тоже потому что крутой.

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

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

От себя лично скажу, что я интуитивно нащупал те же выводы. С ЖЖ я загнал себя в угол, когда начал писать английский блог на tonsky.me. Стоящие мысли было жалко писать по-русски, а в английском блоге хотелось если писать, то каждый пост должен был быть самым лучшим: обстоятельным, хорошо написанным, аккуратно сверстанным, смешным, интересным, с картинками и интерактивчиком.

Когда это получалось, получалось здорово, спору нет. Но на длинной дистанции это оказался путь в никуда: девять постов в 2014, два в 2015, два в 2016, три в 2017. В середине 2017 я начал писать мега-пост, написал 11 тыщ знаков, не прошел даже половины материала и сдулся. Он так и лежит незаконченный до сих пор, правда я сделал из него доклад потом https://www.youtube.com/watch?v=ObHrsSrfJJk.

Соскучившись по блоггингу, в конце 2017 я запустил телеграм-канал t.me/whining. Туда я разрешил себе писать коротко и без всяких задних мыслей. Тут же захлестнула эйфория: писать снова легко и приятно, сомнения не гложут, контент создается. Главное, в конце концов, что у тебя есть что сказать, а не насколько хорошо и увлекательно это оформлено. Плюс короткий формат дает некоторую автоматическую защиту от занудства.

Потом пришел Рахим и мы сделали из этого grumpy.website, чудом дважды чуть его не запоров. Сначала я решил, что надо сделать собственный движок под всё это. Спас опыт: я разрешил себе делать блог максимально тупым и тяп-ляп, ну и немного интерес подстегивало то, что я сделал из этого телешоу https://www.youtube.com/playlist?list=PLdSfLyn35ej8por7aH-5wYvOyDTu-bPoH. Ну а потом мы решили перейти на английский, и это тоже ощутимо подорвало мотивацию, т.к. количество рускоязычных читателей начало снижаться (и снижается до сих пор, в телеграм-канале по крайней мере), а новые англоговорящие, они, ну, более обстоятельные и серьезные, что ли, не такие веселые. Но сейчас все уже привыкли и воспринимают английский как данность.

А спасли grumpy как проект удачные принципы: короткий формат постов, как в чате, без заголовков, без тем и без всей шелухи: комментов, тегов, ничего этого нет. Даже markdown мы до сих пор не поддерживаем. Разрешена ровно одна картинка в начале поста и несколько предложений, всё. Очень легко писать и очень легко читать, а значит регулярные пополнения, нет давящего груза ответственности, не надоедает и не выматывает. Ну и оформление соответствует: иконка за 5 минут, верстка за 10, дефолтный шрифт, квадратные юзерпики. Важны только буквы, остальное не важно. Это, если честно, дает ощущение удивительной легкости, правды, ну и свободы конечно.


Монады против исключений
усы2
tonsky

Я конечно не настоящий сварщик и про ФП мне Рабинович напел. Но я поработал в трех Clojure-командах и одной Erlang и видел, как люди пытаются для обработки ошибок слезть с исключений и перейти на Error монады (например, failjure, бывают и самописные, но принцип понятен). Считается, что исключения это такие грязь и пот для люмпенов, а монады из области чистых идей и разносят их на золотых подносах во дворцах.

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

А в производстве у нас что? Все спешат, тесты покрывают 25% случаев от силы, хорошо если хоть на какие-то failure cases тесты вообще есть, задачи и курс партии меняется еженедельно, коммуникация средняя, такая штука как коллективное внимание вообще можно сказать не существует (ну нельзя на каждый чих оповещать всех, ну нереалистично это). Задача производства ведь какая? Строить новое со скоростью большей, чем разваливается старое, чтобы выйти в конце в net positive. Подход быть внимательным, хоть я сам его и очень люблю и использую в домашних опен-сорс проектах, где всё разложено по полочкам и муха рядом чихнуть не может; такой подход ну не работает, нельзя на него полагаться от слова совсем.

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

Так что да, проблемы с исключениями я не вижу и очень их люблю даже.


Фронтендеры не на маках
усы2
tonsky

Сколько раз, и каждый удивляюсь, насколько люди легко заменяют мнения в интернете на свои собственные и начинают спорить уже с ними. Вот, например, твит:

miketansky: Фронтендеры не на маках с чувствами вкуса и хорошего дизайна — это редчайшее исключение. Хотите резко повысить вероятность найма хорошего фронтендера? Жестко и безжалостно дискриминируйте по этому признаку.

А вот реплаи:

flashader: Ни одна статусная (а тем более — зашкварная) вещь не заменит исполнителю мозг и умение думать.

Как будто кто-то с этим спорил. Утверждение было в обратную сторону — если умение уже есть, есть тенденция к переходу на маки.

Newesprod: столько дебилов видел на маках, которые пользуются им ради понтов и какого-то там вкуса, вообще ни разу не показатель. Надо быть деградантом, чтобы такое советовать

Опять развернули утверждение. Речь же не о том, что дебилы (что бы это ни значило) тоже могут купить мак. Речь о том, что Хорошие Фронтендеры (что бы это ни значило) переползают рано или поздно на мак.

orsinium: Я воспринял этот твит как «Для того, чтобы делать хороший UI, нужно пользоваться хорошим UI». И отметил, что UI в маке хорош, а UX — нет. А навыки в UX я считаю не менее важными для фронтендера и дизайнера.

Ну тут человек хотя бы признается, что прочитал что-то своё. Поставил вместо необходимого условия достаточное.

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

На эту тему у меня есть шикарный же пример. Сидел я как-то на докладе про какой-то кросс-мобильный фреймворк, из серии write once — run anywhere, и на одном из слайдов, продающих его, был график выручки компаний от приложения по количеству платформ. Грубо, компании, выпускающие приложение только на одной платформе, там, айос или андроид, зарабатывают условно $1000 в мес на нем. Компании, выпускающие на двух, зарабатывают допустим $2000. На три платформы (+windows phone) уже $5000. Ну и самый пик там что-то типа те, кто выпустили приложение аж на 11 платформ (хз, что это за платформы), гребут уже там, например, $500 000 — непропорционально больше, короче. Ну и показывалось это под таким соусом, типа, за этим вам и нужен наш фреймворк — выпустите под больше платформ, заработаете больше денег. Для презентации кросс-платформенного фреймворка очень удобный аргумент. На самом деле всё объясняется гораздо проще, конечно — если у вас есть приложение, зарабатывающее $500 000, у вас найдутся деньги, чтобы портировать его на 11 платформ. А если приложение херовое, то запускай хоть на 11 платформах, денег не соберешь. Вроде бы банальная мысль. График можно было прочитать и так, и так, а понять его правильно можно только через понимание механики, которая его формирует.


Генератор идей
усы2
tonsky

Который раз убеждаюсь, что все самые интересные идеи возникают от внешних стимуляторов — общение в кулуарах конференций, доклады, посиделки в барах, споры. Невозможно сидеть дома и что-то придумать. Сама идея, конечно, явно не звучит, но мозг в каком-то дискуссионном режиме подмечает тропки чужих мыслей и по сложным ассоциациям может вообразить какую-то проблему и тут же, на месте, придумать решение. И проблемы, и решения, всегда случайные, подмечаются (я бы даже сказал — генерируются, или возникают) в гораздо большем количестве, идут таким фоном вперемешку, бегущей строкой, загораются на секунду и тут же исчезают. Только если случайно сгенерированное решение _подойдет_ к случайно сгенерированной соседней проблеме, как входит в замок правильно наконец подобранный ключ из связки, происходит щелчок — сигнал в сознание, что нужно притормозить и обратить внимание. Остаток вечера, конечно, будет занят уже верчением этой _комбинации_ в голове, обдувом конструкции, первой проверкой на прочность. Если всё сложится, то дальше уже мысль надо где-то зафиксировать, а именно — произнести вслух, вербализировать, записать, пусть даже и в одиночестве. Здесь важен именно документальный факт, переход из мира чистых идей в объективную реальность. Когда это случается, дальше просто работа.


Надо поговорить о стримерах
усы2
tonsky

Я тут подсел на Сэра Троглодита (пусть псевдоним вас не пугает), который играет в Героев Меча и Магии 3. В общем-то играет неплохо, и к игре я не равнодушен, но подсел я в первую очередь на харизму, потом на скилл и нехилый такой саспенс (см. https://www.youtube.com/watch?v=DN1fc_Jb3es), а потом обнаружился гораздо более интересный эффект.

Герои вообще игра стратегическая, и если ты играешь хорошо, то она очень быстро превращается в очень условное соревнование столбиков чисел: 100 скелетов лучше, чем 5 вампиров, потому что хитпоинтов больше, но есть еще атака/защита/особые свойства, так что всё не так однозначно™ — но всё еще это набор чисел, которые всего лишь комплексно и ситуативно сравниваются. Соответственно скилл в игре — умение оценивать и максимизировать эти числа. Тактика, стратегия, экономика. И очень легко найти стримы занудных достаточно папок, которые и играют получше, и объясняют по-подробнее, но для них это передвижение шахмат по доске, а из чего там сделаны фигуры и доска — без разницы.

Так вот, у Сэра Троглодита происходит важная штука — он берет всё происходящее за чистую монету. Гноллы у него — не просто юниты первого уровня из замка типа «Оплот», это действительно бестолковые прямоходящие собаки, которые живут почему-то в болотах, и он пытается как-то, через шутки в основном, осмыслить, почему они там живут и зачем. Феи это не просто юнит, который производит атаку и наносит N дамага, ему важно, как именно они этот дамаг наноят: пыльцу токсичную распыляют? Каждая деталь оживает и обретает смысл. Больше всего любви своим героям, конечно — он их и по именам помнит, и в аватарки вглядывается, и прозвища ласковые придумывает, и задним числом какую-никакую мотивацию подводит. Пришлось по игре зайти в снега Академии? — Джен пошла морозить ноги, захватила шубу. Ну и так далее. Внезапно выясняется, что у замков в игре всё это время были названия, но всем как-то было пофиг, ну потому что действительно, выигрывать они никак не помогают. Троглодит же их зачитывает и подводит легенду, как то или иное название могло случиться. Избушка колдуньи, чисто утилитарное строение на карте, выдающее случайный вторичный навык, у него абсолютно серьезно полноценный дом, в котором живет почти что живой человек и помогает по мере возможностей.

И так далее. Конечно, и утилитарность, и столбики цифр, и стратегия — это всё тоже есть, механика самой игры совершенно обычная, просто фигуры имеют значение. За этот счет пространство мира как бы расширяется, ты получаешь возможность посмотреть на него вглубь и при небольшом усилии действительно можно представить, что было вот такое вот королевство, ему тысячи лет, жизнь в нем так вот причудливо сложилась, территории поделили, замков понастроили, расы такие вот корявенькие, одни в лесах, другие в горах, третьи под землей, кое-как уживались, армии набирали из кого придется, конфликтовали, притирались и вот сейчас в нем происходят такие вот бои между доблестными (и нонсенсными по составу) армиями во главе с выдающимися полководцами, иногда живыми, а иногда и не очень. А то что вы видите на экране — это такая очень условная реконструкция этих событий, что ли. Ну правда, когда вы видите в одном войске условных церберов, мошек из болота и скелетов с луками (а Герои в этом смысле — идеальный генератор таких вот ситуаций), неужели вам не хочется узнать предысторию??? И что они друг о друге думают, стоя плечом к плечу против, например, пегасов и ходячих деревьев?

Короче, он превратил довольно механическую экономико-тактическую стратегию, давно всеми понятную и освоенную, в цветную и захватывающую историю, причем превратил неожиданно и на 99% за счет того, что смог включить наше воображение. Я, если честно, давно забыл это чувство, что игры могут быть и этим тоже, а не голым геймплеем. И это прекрасно.


Повышенное чувство собственности
усы2
tonsky

Бывает, что в интернете кто-то слегка неправ, в какой-то детали, и тогда поправить их будет обычным занудством (90% моих постов, ха-ха), а бывает, чтоб вот совсем прям мимо и непонятно даже, о ком речь.

Возможно, вы видели уже эту мысль в каком-нибудь статусе вконтакте или еще в каком солидном источнике:

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

Ну вот прямо сейчас я смотрю на шкаф из икеи. Собранный моими руками. Никаких особенных чувств не испытываю. Шкаф как шкаф. Внутри вещи. Блин, кем надо быть вообще, чтобы испытывать чувства, даже пусть чувство повышенной собственности, к шкафу? Гордость владение икеевским шкафом? Серьезно? Совершенно утилитарная штука.

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

Ну ладно, шкаф действительно смешно. Но вот «домашний кинотеатр». Тоже собирал сам, выбирал проектор, колонку, искал, покупал, соединял, прокладывал. Казалось бы, опять должен испытать гордость владения. Однако всё, что я испытываю, это «клевый фильм, ладно, пора спать» (ну или, что чаще бывает, «блин, что за говно мы посмотрели, как теперь это забыть?»). Как-то не думается о «блин, на каком классном экране мы это смотрим, как я горд, что всё сам собрал». Ты ж покупаешь всё это, чтобы потом забыть и не думать. Если я обо всей этой затее и вспоминаю, это скорее «так, чё всё так хреново стыкуется, куда колонку поставить, тут шнур торчит, ладно, стулом прижмем, че так хреново слышно, почему блютус не работает, неужели что-то еще надо докупать, блин вообще не то купил, почему два пульта теперь, зачем мне два пульта» и как я мучался всё это выбирая и «never again». Гордость владения? Работало бы.

Окей, там еще и программное обеспечение упомянули. Ха-ха, яжпрограммист. Вот есть у меня программа, написанная лично мной для моих нужд, AnyBar называется. Пользуюсь, полезно, удобно. Какие я по этому поводу чувства испытываю? «Ох, че ж сил нету никак это барахло доделать, ладно, потерплю, перебьюсь» и так все 3 года. Короче, опять не про меня, хотя вот какие-то люди думают, что если они сообразили, как запустить готовый билд-скрипт на готовых исходниках, то это чуть ли равно тому что они сами всё с нуля написали. Крафтовый софт получается, ручной выделки. Целый линукс дистрибутив придумали, чтобы таких людей в одном месте собрать.

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

Тот самый шкаф

без темы
усы2
tonsky

А вот и инструкция, как замапить CapsLock+IJKL на стрелки и наслаждаться управлением курсором с home row в любом приложении http://tonsky.me/blog/cursor-keys/


Не Vim-ом единым
усы2
tonsky

Появился повод высказаться по поводу Vim, а я давно собирался. Мнение такое, что он, крутой для своего времени, сегодня просто морально устарел.

Disclaimer: я просидел исключительно на Vim около года, активно программировал, так что это не рассуждения в вакууме. Я был в этой шкуре, знаю о чем речь на собственном опыте. Тем не менее, я без особых сожалений (и потерь, как я считаю) сменил Vim на более современные редакторы.

Итак.

Для начала давайте оспорим тезис, что набор текста — редкая операция. По моим оценкам, набор и трансформации делятся скорее как 50%/50%, т.е. набор далеко не редкая операция. Грубо, каждому переносу соответствует редактирование (т.к. код редко когда переносим без изменений), а каждому удалению — вставка (статистически, по GitHub, обычно графики вставок/удалений очень симметричные). Т.е. бегать между режимами приходится достаточно часто, чтобы записать необходимость их переключения в некую дополнительную ненулевую «нагрузку».

Далее, главное продающее свойство Vim это его «язык» трансформаций и манипуляций, настолько развесистый, что ему отдана основная клавиатура, а вводу текста — дополнительная, включаемая по кнопке.

Так вот, не хочу никого расстраивать, но система команд получилась такой не из-за какого-то великого инсайта, а просто потому, что у автора был тормозной модем и он «хотел печатать быстрее, чем обновлялся экран». Ну, представили ситуацию, да? Набрал «выделить текст, от кавычки до кавычки, заменить, ввести „абырвалг“, выйти», послал голубиной почтой и пошел пить кофе. Более того, даже в момент создания подход Vim не имел смысла для локального редактирования, где задержки нет. 

В современном мире у нас давно есть гораздо более продуктивные и удобные инструменты: визуальное выделение, непосредственное манипулирование и мгновенная обратная связь. Это значит, что ты видишь в реальном времени, что и где ты выделил и что сейчас произойдет. Кроме того, выделение можно подкрутить, опять же, в реальном времени. В примере из статьи, «выделить всё вплоть до кавычки», а потом подвигать курсор плюс/минус один-два символа в зависимости от нужды. В мире Vim выделить до кавычки и выделить до кавычки минус один символ — две разных задачи, в современном мире — одна, решающаяся одним инструментом — двиганием курсора. Не происходит операционного перегруза мозга и комбинаторного взрыва (какой инструмент выбрать для вот этого частного случая?).

Мгновенная обратная связь не менее важна. Увидеть синий прямоугольник выделения перед тем, как ввести операцию — очень важно для человека, сокращает количество ошибок, дает возможность их корректировки, повышает уверенность. В Vim тебе не остается ничего, кроме как надеяться, что та шестисимвольная комбинация команд, которую ты ввел, сделает ровно то, что ты хотел.

Еще раз. Vim намеренно не использует однозначно удобные и полезные методы визуальной коммуникации только потому, что их было нереально использовать через очень медленный модем на 300 бод. Это единственная причина. Количество причин, почему современные люди должны так же себя ограничивать — ноль. Такую цену имеет смысл платить, если альтернатива — потратить полминуты на непосредственное выделение текста (помните тормозной модем?), но это давно уже не проблема. Это же практически шахматы по переписке. Зачем себя мучать?

It was really hard to do because you've got to remember that I was trying to make it usable over a 300 baud modem. That's also the reason you have all these funny commands. It just barely worked to use a screen editor over a modem. It was just barely fast enough. A 1200 baud modem was an upgrade. 1200 baud now is pretty slow.

9600 baud is faster than you can read. 1200 baud is way slower. So the editor was optimized so that you could edit and feel productive when it was painting slower than you could think. Now that computers are so much faster than you can think, nobody understands this anymore.

The people doing Emacs were sitting in labs at MIT with what were essentially fibre-channel links to the host, in contemporary terms. They were working on a PDP-10, which was a huge machine by comparison, with infinitely fast screens.

So they could have funny commands with the screen shimmering and all that, and meanwhile, I'm sitting at home in sort of World War II surplus housing at Berkeley with a modem and a terminal that can just barely get the cursor off the bottom line.

It was a world that is now extinct. People don't know that vi was written for a world that doesn't exist anymore.

Но зато в Vim удобные «шорткаты» (команды, окей) и их много! Да, но в современных редакторах их не то чтобы сильно меньше. Даже стандартные системные (!) справляются с перемещением текста весьма неплохо (Cmd+←→ == начало/конец строки, Alt+←→ == прыгать по слову, Cmd+↑↓ начало/конец документа, Alt+↑↓ вверх/вниз на страницу). Окей, на Винде чуть похуже.

Плюс команды в Vim всё-таки немного более избыточны, чем хотелось бы. Проще жить, когда один инструмент решает две-три задачи (даже так: работает в двух-трех разных ситуациях), чем когда у тебя на каждый специальный случай отдельная кнопка. Вот например специальная команда для вставки в конец строки («a»), это что вообще? В обычных редакторах туда можно просто поставить курсор, а тут отдельная «команда». Или «r» (заменить одну букву и выйти), тогда как в обычном мире просто Backspace (кнопка «забой» :), которая и удаляет, и заменяет, если на месте удаленного набрать новую букву.

Ну и самая большая цена, которую вы платите сегодня, пожалуй, это то что подход Vim не совместим ни с чем вообще. Vim работает только в Vim, поэтому во всех остальных местах вы будете постоянно чертыхаться, пытаясь нажать «i», «Esc» и ходить по тексту через «hjkl». Везде: в браузере, в календаре, документах, эверноте, чатах, спотлайте, везде ваши так долго тренировавшиеся привычки идут лесом.

Здесь еще я мог бы пожаловаться на архаичность и несовместимость Vim с современным миром. У него, например, два буфера обмена ¯\_(ツ)_/¯ и оба внутренние. Ни один из них не попадет в ваш системный, т.е. скопировать текст внутри Vim и вставить его еще куда-то не получится. Он не умеет различать вставку текста и набор, поэтому если вы скопировали какой-то кусок кода (скажем, со StackOverflow) и вставляете, он его будет набирать посимвольно, что медленно, смешно и хреначит все отступы к чертям. Да, только из-за этого есть специальный режим «paste mode» и да, его-то как раз легко забыть включить/выключить. Часть этих «особенностей» пофикшена в графических клонах, скорее всего, но все равно, знакомство с ними было забавным и это тот случай, когда «через свежую покраску все равно проглядывали признаки старого, очень старого материала».

Ну и немного про достижения Vim. Хочу еще раз заметить, что Vim такой, какой есть, потому что так получилось. За ним не стояло какого-то гранд дизайна или проверенных научных моделей, система команд не то чтобы какая-то особенно логичная или удобная. Он ни подо что не оптимизировался, кроме модема и клавиатуры автора, у которой Esc был на месте Tab, а физических стрелок не было, зато уже были картинки стрелок на «hjkl»). Да-да, именно поэтому всем поголовно вимерам приходится маппить Esc на Caps Lock.

Зацените кнопку «рубля», кстати

Так вот. Первое великое (и случайное) достижение: стрелки на home row. Действительно, тянуть руку в правый нижний угол очень далеко, а перемещение по тексту очень частая операция. Процентов 50% успеха Vim я отдаю тому, что люди просто осознают всю идиотскость расположения стрелок в правом нижнем углу на клавиатурах, а Vim — наиболее доступный способ эту проблему хотя бы частично решить.

Но это откровение никак особо Vim не принадлежит и в идеале неплохо бы сделать его отчуждаемым. Стрелки не становятся вдруг удобнее, когда ты выходишь из Vim и переходишь, скажем, в браузер. Я решаю это маппингом Caps Lock + IJKL (да, не HJKL) на стрелки. Очень удобно и главное: работает везде.

Вторые 50% успеха я отдаю высокому порогу входа. Тут надо объяснить. В устройстве человека есть такой баг (ну или фича): люди не начинают лучше владеть инструментами/навыками/привычками со временем просто так, сами по себе. После того, как они научились делать задачу как-то (неважно, как, лишь бы получался результат), они будут продолжать делать её именно так. Если не прикладывать осознанных усилий, через год пользования Idea, например, ты будешь пользоваться ей так же, как через первую неделю. Горячие кнопки сами себя не разучат, удобные фичи не найдутся. Нужно тренировать себя, читать обучающие материалы, смотреть, как пользуются другие.

В примере с Idea ты вроде как более-менее понимаешь, как редактировать текст (так же, как и везде), поэтому естественного толчка к самосовершенствованию не происходит. Ты продолжаешь редактировать, как умел.

С Vim же ты вообще не понимаешь, что происходит. НИ ОДИН твой навык не работает. Тебе приходится разбираться. Ну и пока ты разбираешься, читаешь, ты успеваешь захватить значительно больший кусок области «редактирование текста», просто потому что никогда до этого специально её не изучал. Плюс постоянный цикл «блин, новая ситуация, в которой ни один разученный мной навык пока не работает» заставляет какое-то время гуглить, читать и смотреть, как другие люди просто редактируют текст

Спорим, для условного «Ворда» вы никогда бы даже не подумали гуглить такую табличку?

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

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


Хром против веба
усы2
tonsky

Новый пост: http://tonsky.me/blog/chrome-intervention/


Сколько пользы от программиста?
усы2
tonsky

В твиттере нарисовался тред про то, маппится ли работа программиста на прибыль компании. Естественно, прибежал сотрудник букинга с безаппеляционным утверждением, что если ты не померил свою прибыль, то пользы от тебя 0.

Меня такой взгляд на вещи всегда шокировал своей недальновидностью. Ну то есть есть миллион вещей, которые:

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

При этом естественно программист работает над проектом не один, на рост прибыли влияют все и делают это в параллель. Как выделить роль отдельного человека? Стало лучше потому что я запилил фичу или потому что отдел продаж постарался (непонятно это в обе стороны — и для программиста, и для отдела продаж)? Или сезон сменился? Или просто тема по каким-то общемировым причинам скакнула в топ?

Сколько денег принес компании Google сотрудник, реализовавший функцию Crop в приложении Photos? Или вот у Apple вышел iPhone X. Сколько денег принес программист, запрогавший свойство safe-area-inset-top? Давайте предположим, что у вас есть на руках все данные, к которым есть доступ у самой верхушки Apple. Как бы вы это посчитали? То-то и оно.

Даже в самых лабораторных условиях — пресловутом аутсорсе — когда четко известно, что за каждый час программиста компания получает, скажем, чётко $200, есть миллион смежных факторов — сам программист добавляет не только $200, но и отвечает за имидж компании перед заказчиком (а это будущие контракты), за имидж в ИТ-среде (привести больше людей или отговорить их), он может отвлекать коллег или помогать им развиваться, поднимать боевой дух или ухудшать его, решать проблемы заказчика или косячить и выбивать продление контракта — всё это в конечном итоге скажется не на том, сколько компания заработала в этом месяце, наверное, но может увеличить/уменьшить прибыль за год или на горизонте в несколько лет.

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


Ворчание ягнят
усы2
tonsky

Завел блог на стороне, хе-хе http://grumpy.website. Там — про интерфейсы, тут  — про программирование (если полностью на английский http://tonsky.me не перейду, конечно).

Движок — кастомный на Clojure, написан в прямом эфире часов за 15.

Привет.


ЮАР туда и обратно
усы2
tonsky

Сб

Выгружаюсь из такси. В воздухе океан. Запах невкусный, но приятный. Три негра внимательно провожают взглядами. Лифт в доме — шкаф с дверью на улицу. Оказвается, они ждут диван.

Вс

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


Пн

Просыпаюсь от рева чаек. Водитель считает, что Никита — женское имя. Торопит заводить детей. Обнимаю в офисе пять человек. Девушка с работы узнала на улице, сияю несколько минут. Лунное затмение закрыло луну на четверть. Бегаю смотреть пять раз.

Вт

Самый теплый день. Переспрашиваю водителя. Четыре раза. Из шнура идет черный дым. Руководство дарит ежедневник на пять лет. Солнце полностью опускается в океан за 2,5 минуты. Бомжи представляются по имени, прежде чем просить денег. Дом стоит между двумя отелями, церковью и виллой, но возвращаться в темноте тревожно. Встречаются поровну крысы и люди.


Ср

Фен включается в розетку только под кроватью. Чайник со свистком не свистит, но течет. Туман крадет гору целиком. Погода закончилась. В городе засуха. Просят не принимать душ больше двух минут. Горячая вода идет только через минуту. Интернет невозможно рвется. Ставлю порно качаться на ночь. Засыпаю у обогревателя, как у костра.


Чт

Встаю в 6:30. Закипает чай, просыпаются чайки. Водитель спрашивает столицу России. Гарри Поттер стоит и в детских книгах, и во взрослых. В кино у Бессона волшебный пролог. Океан штормит. Ночь. Останавливаюсь смотреть на толщу воды, страшно до усрачки. Ветер теребит жалюзи изнутри.

Пт

Мне не срочно. Хожу смотреть на волны. Дождь падает обратно в океан. Работа заканчивается раньше пробок. Когда некуда спешить, начинаются самые интересные разговоры. Первый белый таксист-расист. Угадываю ему ответ в викторине. Все повторяется по второму разу. Туман уже был. Волны уже видел. Та же пицца с тем же авокадо. Объективы приходят смотреть на закат. Волны на фото получаются маленькие и глупые. Темнеет, нападают мухи. Во второй раз.


Сб

Через балкон живут римляне. Обедаю у греков. Официантка спрашивает, что я сегодня делаю. Из вежливости, конечно. Покупаю шарф, иду смотреть на рыб. У крабов дискотека. Рыбы плавают обиженные.

Вс

Обедаю с голубями и стариками. Утки останавливают день. Продукты хранятся без холодильника.


Пн

Ужинаю в порту. Порт светится и пищит.

Вт

Толстый хомяк лезет на дерево. Пингвины пахнут.


Ср

Киты приплывают, когда их уже не ждут. Дасси не получают никакой рекламы. Пингвины живут в норах. 


Чт

Рука замерзает за минуту вне одеяла. Окна выходят на океан, но вид преграждает отель.


Пт

Закат размазали пальцем. Альпака чешет себе пузо.

Сб

У овец стоит рекламный баннер. Овцам рекламируют телешоу. Ем бургер из страуса.


Вт

Возращаюсь в Москву. «Почему стоите, не проходите?» Начинается пост-путешественная депрессия.


В некоторые головы лучше не заглядывать
усы2
tonsky

Бурная история про Xored (it-компания из Академгородка, Платов — её президент):

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

Безотносительно того, что там произошло и кто с какой стороны сколько наплел, всё рухнуло, когда Платов добрался до микрофона. Даже если он на 100% прав и невинен в данной конкретной ситуации с Алексеем, никуда уже не деться от комментариев (ищите по нику platoff), из которых получается, что более-менее всех, кому с ним не по пути, он даже за людей не считает. Все программисты и комментаторы у него — долбоебы, лузеры, нищеброды, лохи, пидарасы (в терминологии автора — заднеприводные) по умолчанию. И остаются такими, пока не доказали обратное. Я не придумываю, так и написано. Судя по чуть более раннему твиту («Ксоред сбрасывает жыр. Жыр бежит в Yandex, JetBrains и Tinkoff Bank»), уход с должности это тоже предательство и потеря статуса «обычного» человека и «нормального» программиста.

Там еще феерический катарсис, из которого вообще получается, что человек у Платова остается человеком и имеет право на человеческое отношение только до того момента, пока он выгоден замыслу (компании, проекту, лично). Вне этого интервала о нем не думают, договоренностей не соблюдают, кидают («...за последние годы [через Xored] прошло человек 300, из которых кинули трёх-четырёх»), объяснений не объясняют, оскорбляют, высмеивают, травят и это типа нормально.

Серьезно, я собирался это между строк вычитывать, а тут он прям буквально текст подогнал. Там нечего уже исправлять, ребята. Нет никакой ситуации. Алло.


Панель Шрёдингера
усы2
tonsky

Классическое нытье: куча мобильных приложений и сайтов делает заголовки, которые прячутся по скроллу. Идея, как и все современные тренды, максимально дебильная: типа, пока скроллишь вниз, весь экран занят контентом: текстом там, картинками, не знаю. Но стоит руке дрогнуть и скрольнуть на один-единственный пиксель вверх, как тут же со всех сторон вылетают панели, кнопки, статусы и прибамбасы. Вот они вылезают, скажите мне, что бы что? Просто пораздражать своей анимацией? Или люди что, вверх не листают? Все с первого раза понимают? Штука еще и в том, что если (если!) эти гребаные панели действительно нужны и на них хочется посмотреть, ничто не подскажет, как их достать. Худший вариант интерфейса: вызывается случайно all the time, а когда нужно, то фиг поймешь как достать.

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

А как-же, как-же? Ведь мы хотим создать иллюзию легкого и воздушного интерфейса, в котором много места, в котором content first, зачем человеку пялиться на наши кнопки, пока он читает? Работает это так: мобильник — это уже маленькое окошко, вырезанное в нашей реальности. Ваш сайт/приложение — окошко, зона внутри мобильника. Контент — зона внутри сайта. И тем не менее человек может прекрасно сосредоточиться на любом куске реальности и смотреть только в него. Вокруг меня могут бегать кошки, я могу менять руку, которой держу телефон, и я всё равно буду видеть только то, на чем я сосредоточился: контент.

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

А как делать-то тогда?

Первое: не надо этих ваших анимаций. Хотите чё-то на экране показать — показывайте всегда, не надо случайно вызываемых жестов к нему приделывать. Чего нам точно всем не хватало [сарказм] — еще одного аспекта управления и так уже перегруженными многофасеточными контрольными центрами (мобильниками то есть). Если вы хотите чтобы гребаный хэдер с вашим гребаным лого мазолил мне глаза, ну будьте мужиками, примите решение, показывайте его всегда. Только не надо уменьшать его по скроллу, это их двух зол обе: вы и глаза мозолите, и анимациями заколебете.

И тут мы подходим ко второму решению, совсем старперскому радикальному: показывать хэдер один раз вверху страницы. Никуда его не скроллить и не прибивать гвоздями. Поскроллил вниз — хэдер остался наверху. Нужен хэдер — промотал в начало. Радикально? Может, по сегодняшним меркам и да. Но знаете, что я вам скажу? Ни один человек еще не умер от того, что не смог в середине чтения статьи очень быстро и без потери скролла вспомнить, какой же это сайт он сейчас читает. Ну нет такой задачи у людей. У брендов, может, есть. Всем остальным на меню вашего сайта, «доступное в любой момент» — глубоко и совершенно искренне пофиг.


Чем хуже, тем лучше
усы2
tonsky

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

Был когда-то такой медиаплеер Windows Media Player, шел в поставке с Виндой. Носил гордое звание единственного медиаплеера в мире, в котором пробел не останавливал воспроизведение. Натурально, надо было Ctrl+P жать (наверное, их ослепила красота шортката — P это и Play, и Pause).

Ну и вот. Тогда видео смотрели на компьютере, а сегодня — в интернете. И да, YouTube перехватил эстафету. В нем тоже пробел нихрена не делает. Точнее так — пробел в нем, та-дам, скроллит страницу!!!

Кем вообще надо быть, чтобы скроллить пробелом. Я знаю, что это стандартное поведение в вебе, но блин. Неужели ради вот того одного странно привыкшего к этому шорткату дяди должна страдать вся аудитория Ютуба?

Ладно. Допустим даже, вы тот самый дядя, который в детстве упал в колодец на стройке и с тех пор привык скроллить пробелом. Вопрос. Куда там скроллить-то?? Скроллить-то куда? Там? К комментам что ли? Комменты к видео это может не самая бесполезная в мире вещь, но в топ-5 наверное входит. Это просто добровольное окунание в помои. И это юз-кейс, на который они рассчитывают?

Ладно еще раз. Можно зато навести фокус на видео и пробел начнет работать. А еще знаете что начнет работать? Запоминание фокуса. Т.е. зашел ты в настройки, потом сидишь смотришь видос, тут хоп, пельмени убежали, ты такой жмак по пробелу, а он. А он. А ОН. Настройки открывает, тварь такая. То есть они вот натурально подумали, что кому-то может в жизни понадобиться пробелом, самой большой кнопкой, очень быстро, мнгновенно практически, открывать настройки видео. Ну я хз.

Ладно. А вот если громкость менял, то фокус будет на громкости. Вверх-вниз меняет громкость, и вправо-влево тоже! Это уже не говоря о том, что сам ползунок спрятан за ховером — ужасный, ужасный паттерн (нужно навести — именно навести, нажимать нельзя, — прежде чем менять, два действия там, где хватило бы одного).

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



Boo King dot com
усы2
tonsky

В линче вышла рецензия на интерфейс букинга:

Сергей Кулинкович, арт-директор, пишет:

В таких случаях (большой трафик, неразрывная связь с бизнесом) дизайнерские решения часто продиктованы статистическими данными и результатами многочисленных тестов, призванных добиться максимальной конверсии, возврата, суммы покупки и прочего. Нельзя просто взять и сделать, скажем, форму более «удобной», поскольку за этим могут лежать миллионы долларов упущенной прибыли. Однако раз в несколько лет руководители произносят: «Что же с нами стало?», проводят глобальный редизайн, и все начинается сначала.

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

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

Но это не единственный способ зарабатывать деньги. Можно пугать, обманывать, путать. Эксплуатировать, в общем. Внезапно, это вполне себе бизнес-модель. Как в наперстках — чем сильнее тебя запутали, тем выгоднее организатору. Только не надо рассказывать, что вы так делаете, потому что пользовательские исследования показывают, что людям так удобнее. Выигрывает всегда казино.


Принципиальный недостаток Git CLI
усы2
tonsky

Есть простой способ использовать Git: работаем только в ветке, мержим только в мастер. Если все идет хорошо, то выстраивается простой и понятный ритуал: branch, commit, checkout, merge, push, повторить. GitFlow называется, да?

Для такого сценария Git CLI достаточно. Для всего остального — недостаточно. Странно, что люди до GitFlow вообще пытались как-то по-другому с Git работать через CLI. Ну невозможно это.

Причина проста: как только запахло жареным, надо предпринять единственно правильные действия, а для этого нужно четко и однозначно понимать ситуацию. Запахнуть может даже в GitFlow: бывает, что и «мерж не мержится», и «кто там вперед меня запушил».

В таких случаях важно понимать, что происходит. Я, например, читаю историю ветки и пытаюсь воссоздать ход мыслей и направление изменений автора, с которым у меня возник конфликт. Чтобы решить конфликт правильно и осмысленно, мне надо пересмотреть всю историю ветки, прочитать диффы, посмотреть что вообще происходило и в какой последовательности. Просто смотреть на бесконтекстный 3-way diff — не вариант.

Простой и красивый вывод легкозапоминающейся команды git log --pretty=format:"%h - %an, %ar : %s" --graph:

Представьте, сколько нужно действий, чтобы заглянуть в каждый из этих коммитов

К сожалению, CLI в этом никак не помогает. Ты находишься в полной темноте. Единственное, что понятно: что-то сломалось. Сообщение совсем неадекватное, или вообще нет сообщения, просто «конфликт» и предлагается выбрать между двумя непонятно откуда взявшимися альтернативами. Я много раз наблюдал, как люди просто впадали в панику и ступор и не понимали, что делать дальше. У таких случаев всегда есть объяснение, и оно обычно совсем несложное, объяснимое, логичное даже, но только если разобраться. Не ситуация сложная, сложно её понять, сидя в CLI. Черт, во всех компаниях, где я работал, я очень быстро становился негласным экспертом по таким вот нестандартным разбирательствам ¯\_(ツ)_/¯

Итак, Git CLI работает только когда четко понимаешь, что происходит. Отсюда нужда в GitFlow: он сильно ограничивает пространство возможных ситуаций, поэтому когда shit hits the fan, у тебя ограниченное количество гипотез о происходящем. Паники меньше, шансов угадать и принять правильное решение больше.

Типичный репозиторий, разрабатываемый по GitFlow

Вообще-то все git-овые best practices оттуда же: не юзать rebase, бояться force push, всегда создавать merge commit, не переписывать историю. Если их нарушать, мир не рухнет, ничего страшного не случится. Но — проблема — коллеги не поймут, что происходит. Если бы они в таких ситуациях видели, что происходит, то разобраться с ними — раз плюнуть. Проблема только в том, чтобы их идентифицировать.

Есть еще одна стратегия поведения в сложных ситуациях. Я называю её «мёржить до последнего». Если ты видишь, что что-то где-то не сходится, мёржи всё со всем, пока не останется одна единственная версия.

Макклейн мёржит крупными мазками

Проблемы:

  1. Возможно излишнее количество мержей (по сравнению с четким пониманием ситуации и точным хирургическим вмешательством).

  2. Никто не возьмется предсказать, что выживет в результате. Мёрж — нетривиальная операция и момент повышенной опасности. Конфликты не на пустом месте возникают: это моменты, когда два предложенных способа решения проблемы не подошли и надо на месте придумать третий. Не просто выбрать из предложенных, а проявить креатив: создать что-то новое, что вобрало бы в себя свойства двух старых версий, сохранило их дух. Поэтому критически важно четко и однозначно понимать, что происходит и как действовать. Если ты не понимаешь, что с чем ты мержишь и почему, шансов принять правильное осмысленное решение очень мало.

Поэтому я так скептически отношусь Git CLI: он устроен так, что пытается «уберечь» вас от сложных ситуаций прямо сейчас, но каждым своим действием усложняет ситуацию на потом. Скажем, git pull по-умолчанию будет мержить, если обнаружит, что ваша ветка разошлась с удаленной. Это «прячет» от вас сложный факт того, что ветки могут расходиться, но мир устроен именно так — они могут и будут расходиться, это нормально. Абстракция, которая пытается это скрыть — дырявая. Зато упрощает ваше существование, потому что у вас якобы всегда будет одна «главная» версия.

Платить за это придется не сразу, долг копится постепенно: лишний мёрж коммит, запутанная история, иногда мержить придется вручную при пулле, хотя «я просто хотел скачать последние изменения» и «я еще не готов ничего отсылать, а уже решаю конфликты». Звучит невинно, но позже, когда понадобится разобраться, чё это за код и откуда он тут взялся, в этих мержах черт ногу сломит.

Фрагмент истории LightTable. Это ещё по-божески

Как тогда жить?

  • Визуальное представление графа коммитов. Многие GUI клиенты неплохо справляются
  • Fetch вместо Pull
  • Не бояться amend, rebase и вообще двигать историю

Про «церковь непереписывания истории». Особого смысла сохранять каждый чих в репозиторий ровно в том виде и тогда, когда он на самом деле произошел, нет. Наоборот: историю надо чистить, пропалывать и приводить в удобоваримый вид. Всякие коммиты типа «поработал», «поработал еще», «баг», «ой бля» в ретроспективе никому и никогда не будут уже нужны.

Бывает, люди путают git log с личным дневником и записывают свои мысли, настроения, погоду на улице

История должна быть осмысленной, атомарной (по еденицам решаемых проблем), аккуратной. Это всё окупится сто раз, когда с репозиторием придется по-настоящему работать. Git, его история — это не просто safety net, это еще один инструмент, еще одна форма существования кода, часть продукта. Вы же следите за кодом? Вот и за историей надо следить.

А практика непереписывания история имеет смысл только если у вас нет инструмента понять, что происходит вокруг, и вам лень разбираться. Сама по себе она безобидна и в целом работает на упрощение истории.


Десктопные UI
усы2
tonsky

Очевидно, самый правильный способ делать десктопный UI — индивидуально под каждую платформу. Мечта о том, что мы выделим «компоненты», из которых соберем экран, а потом «заскиним» их под каждую платформу, — абсолютно оторвана от реальности. Слишком много нюансов (размеры, отступы, порядок и расположение элементов, уникальные для платформ идиомы) чтобы обойтись просто скином и при этом притворяться нативом.

Кажется, что идея провальна с самого начала. Но в мире есть успешный пример кросс-платформенных UI которые прилично выглядят на любой платформе. Это веб. Да, веб-сайты не собраны из системных компонентов, каждый вебмастер рисует свои кнопки и панели с нуля. Но все привыкли и не возражают. Браузер аккуратно доделывает системно-специфичные детали: нативный скролл (с инерцией или без), рендеринг и выделение текста, системные контекстные меню, системное поведение внутри даже полностью перерисованных инпутов. Системные нюансы, даже в комбинации с полностью уникальным скином и лайаутом, создают вполне приятный пользовательский опыт. Решение оказалось в том, чтобы не притворяться нативным системным приложением, иначе попадешь в uncanny valley, область фальшивых елочных игрушек.


на фото: Transmission Remote GUI (Free Pascal) притворяется нативчиком

На основе браузера сделали Электрон — бандл из хрома, node.js и ваших html/css/js, упакованных в обертку как-бы-приложения. С точки зрения пользователя — всё классно. VS Code, Atom, LightTable, Figma, Zeplin, Slack, VK Messenger, Rocket.Chat, Github Desktop, GitKraken, Basecamp, Ghost, Brave browser, Hyper, SimpleNote — прекрасные, вылизанные приложения, очевидно, что как платформа Электрон уже состоялся.


на фото: системное контекстное меню в Visual Studio Code (Electron)

И это одно из ключевых преимуществ Электрона — возможность напрячься и сделать действительно качественно, круто. Не в том, что можно быстро накидать, а в том, что можно довести до конца. Этого нет, например, у JavaFX/Swing — накидать быстро-то можно, но довести до состояния, когда приложение хочется облизать, —  нет, как ни старайся. Оно так и останется фальшивым на базовом уровне.

Претензия к Электрону, собственно, одна — это такой Докер для десктопа. То есть он пакует огромную тучу всякой фигни ради несоизмеримо маленького функционала. То, что нужно Хрому для веба, например совместимость с IE 5.5, всякие quirks mode, не знаю, видеокодеки, non-strict JS, устаревшие CSS свойства и режимы и совместимость их с новым и современным — это раз в 100 больше того, что вы когда-либо сможете и захотите использовать. И это никак не отковыряешь. Меня даже не размер бандла беспокоит, а то что весь этот легаси серьезно мешает приложению достичь своего потенциала скорости, простоты, надежности. Тот же JS — явно не лучший язык, с кучей совершенно левых/произвольных проблем-ограничений, медленный просто потому, что он настолько плох что уже не ускоряется, явно не готовый к тому, что под ним будет файловая система, что бывают потоки — да, мы не можем выкинуть его в вебе — но на десктопе-то ради чего страдать?

К сожалению, с браузером только всё-или-ничего. Как и докер, это явно неверный вектор развития — бандлить кучу говна просто потому, что так получилось и проще. И все равно web это лучшая на сегодня UI платформа, с лучшим integrated developer experience.

Вопрос, собственно, про альтернативы. На случай, если я проглядел что-то.

На QT бывают хорошие, красивые приложения. QT бывает кросс-платформенный, но это C++. Он, конечно, обходит JS по категории sanity, потому что он не сильно умный и в любой ситуации ты просто делаешь то что тебе нужно, а не пытаешься бороться с тормозами вмененного тебе динамизма. Figma, например, компиляют C++ в JS, чтобы работать в вебе, но лишь бы не писать на JS. Но все равно C++ ужасный язык, низкоуровневый, долгая компиляция, без REPL-а — а UI работу я себе не представляю без REPL-а.


на фото: Telegram Desktop (QT5) с кастомным контекстным меню. Не видно, но скролл тоже фальшивит

Java-решения (Swing/JavaFX) страшны как черт. Я тут скачал демку JavaFX, которая прям с дистрибутивом идет, так у них даже ховер на кнопках тормозит. Плюс естественно всё не нативное — ни скролл, ни выделения, ни контекстные меню, а нарисованное как будто программистами. Окей чтобы накидать что-то по-быстрому для нетребовательной аудитории клерков, но вылизать, кажется, невозможно.


на фото: Modena demo app (JavaFX). Пойдет, но тормозит и всё ненастоящее

Я не уверен, насколько хорош в этом плане SWT — смогу ли я выкинуть весь look-and-feel и нарисовать что-то стильно-современно-плоское, например? Не хотелось бы, чтобы получилось что-то уродливое вроде Eclipse. Он вообще живой еще?


на фото: страница проекта SWT

Что еще бывает? Или выхода нет?

Напомню, что мне важно не «быстро накидать из готовых компонентов», а «сделать и вылизать», причем без привлечения сверхусилий, одному (ха-ха), в разумное время, для всех платформ. Мобилки — что, наверное, сегодня удивительно, но — не интересуют.


Читабельная Кложа
усы2
tonsky
Обнаглел настолько, что код вставляю скриншотами

http://tonsky.me/blog/readable-clojure/

Совет про советы
усы2
tonsky

Съездил на Riga Dev Days, словил новых ощущений.

Во-первых, я оказывается давно не общался с бэкенд-разработчиками и подзабыл, чем они живут. По ощущениям у них все прекрасно, но хочется еще лучше. Ну, из серии, в этом году GC всего на 10% стал быстрее, хотелось бы хотя бы на 15%. Или там, есть две системы сборки, одна хорошо подходит для больших монолитных проектов, а другая — для маленьких стандартизированных. То есть это проблемы, которые они обсуждают: какое из двух прекрасных решений выбрать. Никакого визга, никаких ощущений что мир катится в ад, а ты сидишь на дне колодца и рвешь на себе волосы (это я так себя чувствую с тех пор, как перешел во фронтенд и стал ездить по JS-конференциям). Больше всего похоже на стабильное, каноническое «работаем дальше».

Второе наблюдение проходит по категории накрытий (см. тег) и стимулировано выступлением Егора Бугаенко, но относится не только и не столько к нему, сколько к идее пропаганды вообще. Кратко: со сцены можно говорить что угодно, и люди тебя слушают. Собственно, почему я пишу это именно сейчас, потому что я сидел в зале и видел, как это работает. Что бы ты ни говорил, у зала открыты уши и информация просто записывается на подкорку. Качество информации не имеет значения. Доводы не имеют значения. Логика, аргументы не играют роли. Важен сам факт говорения. Аргументы за, стройная цепочка рассуждений — может быть, может не быть — не играет роли, она все равно пройдет мимо. Что скажешь, в то и поверят. Скажешь умную мысль — отлично. Скажешь глупость — тоже хорошо, еще и вопрос зададут, как её лучше применять.

Есть, впрочем, несколько фильтров, но они стоят не там где нужно. Фильтр авторитетности: чем важнее чувак, тем усерднее его слушают. Фильтр популярности: чем больше углов, из которых звучат ключевые слова, тем больше к ним интереса. Фильтр доступности: чем проще изложена идея, тем больше к ней доверия. Беда в том, что это все социокультурные фильтры, очень далекие и от науки, и от научного метода, и даже просто от рационального мышления.

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

Это всё не только со сцены, конечно: и блогах, и в твиттере, и на курсах, и в книгах, где угодно. Из известных DHH ровно этим занимается (особенно смешно, когда он меняет курс на противоположный), и много персон поменьше. Да что далеко ходить — тот же Design Patterns, задуманный как справочник решения конкретных проблем, постепенно превратился во вполне себе библию. Причем из него выкинули всю контекстную часть (что происходит, где, почему и зачем) и оставили только «советы». Такое ощущение, что широкой аудитории (да, знаю, ужасный прием — обобщение, но речь действительно об общем тренде) нужны не вопросы, а ответы.

При этом я как раз не против открытости к новым идеям. Мне это даже на руку, и мне хочется, чтобы люди охотнее принимали новое. Но только не какое попало, и здесь, конечно, начинается заковыка. Потому что нет никакого внешнего судьи и никто не скажет, что вот этот товарищ несет ерунду, а к этому стоит прислушаться. Единственный способ — 90% всего полная ерунда, пусть цветет 100 цветов, и т.д. и т.п.

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


?

Log in

No account? Create an account