Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
485 - Telegram Web
Telegram Web
Большое количество разнообразнейших учебных курсов, вроде «Выучить PHP за месяц» и повышенный спрос на такие курсы уже не дают просто отмалчиваться. Еще и масса предложений прорекламировать курсы в «Экстраполяции» постоянно не дают игнорировать эту тему. И я попытаюсь сэкономить пару сотен долларов тем, кто хочет войти в айти через курсы.

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

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

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

4. Некий базовый набор знаний все-таки получить можно, но он настолько фундаментален, что легко учится самостоятельно. Гит, основы юникса, алгоритмизация, немного математики. Плюс ещё некие основы для конкретной профессии. В веб-программировании, например, нужно понимать html, css, http и все такое прочее.

5. Целью любых курсов принципиально не может быть получение первой работы, иначе курс превращается в интенсив по оформлению резюме и подготовке к всевозможным тестовым заданиям. «Помогаем с трудоустройством» — фраза маркер таких курсов.

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

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

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

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

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

Пока существуют люди, которые не могут однозначно сформулировать задачу, существуют и программисты. Так-то.
С 0x100 праздником, коллеги!
Совершенно очевидно, что за работу программиста нужно платить. Уже менее очевидно, но все ещё достаточно понятно сколько конкретно нужно платить тому или иному программисту. И совершенно неочевидно и совсем запутанно с тем, что же ещё влияет на желание работать и продуктивность разработчика.

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

Главными же побудителями хорошего настроения на работе является то, что составляет подавляющую часть рабочего процесса.

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

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

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

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

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

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

Другие пытаются разобрать новое до знакомых кирпичиков и осознают новое снизу вверх. Общим паттерном такого изучения будет попытка взять и написать самому эту технологию. Если хочешь понять как работает операционная система, сядь и напиши свою, короче.

Есть ещё те, кто просто запоминает то, что прочитал и вовремя это применяет. Ну, а если в памяти не находится ничего такого, то гуглим и запоминаем и см. сначала. У таких всегда под рукой блокнотик и ручка с кучей пометок и записей.

Есть ещё четвёртый тип, к которому отношу себя я. Чтобы что-то понять, нужно это кому-то объяснить. Ну, прям прикинуться экспертом и взять и начать объяснять. Само собой, сначала читается кучу литературы, блогов и стэковерфлоу. Потом, конечно, безуспешные попытки что-то закодить или воспроизвести. А потом это нужно кому-то рассказать так, чтобы этот кто-то понял. И вот тогда наступает катарсис. Прямо в процессе объяснений все знания упорядочиваются и становится всё понятно и просто.

У кого ещё какие способы? Делитесь в чатике.
Зачем на собеседованиях тупые алгоритмические задачки? Да-да, алгоримтические задачки из собеседований применяются в дальнейшей работе в чуть менее чем нуля случаях, но на собеседовании смысл в них вполне есть.

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

И тут есть несколько правил.

1. У задачи должно быть больше одного решения. Даже самый умный человек в мире не всегда приходит к решению за короткое время. А если решение всего одно, то ответ «решил/не решил» выдаёт очень много ложноотрицательных результатов. Ещё лучше, если задачу можно решить достаточно большим количеством способов, чтобы сформировать градиент качества решений. Чтобы хоть как-то можно было бы сравнить два разных решения.

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

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

4. Ничего другого, кроме пытливости ума такой тип задач проверить не в состоянии. Не надо искать подтекстов и проверять что-то ещё. Решения одной задачи не достаточно, чтобы определить насколько хорошо испытуемый пишет тесты, задаёт вопросы, называет переменные или что-то там ещё. Тем более если добавить к этому лёгкое ощущение экзамена или собеседования. Сейчас такие задачи стали чем-то вроде культа Карго и перешли совершенно в другую категорию собеседований. Проверяют скорость написания кода, оптимальность решения, чистоту кода и написание, простигосподи, тестов. Это настолько же тупо, как отсеивать козерогов и водолеев на основании совместимости гороскопов.

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

Дано: массив случайных натуральных чисел X в случайном порядке, среди которых могут быть дубликаты. И целое число C.
Вопрос: может ли число C быть сформировано суммой двух элементов массива? Другими словами, существуют ли такие i, j, что X[i] + X[j] == C?
Ответ нужно только true или false, сами числа знать не обязательно.
Если захотите вдруг решить эту задачу — вот вам специальных гист, чтобы проверить решение.
По роду своей деятельности доводится много общаться с теми, кто принимает решения, всяких там CEO, COO, PO и прочих офицеров и порутчиков. Подавляющее большинство из них рассказывают о вынужденной удалёнке и как бы здорово было бы работать всем из офиса. Аргументов называют разных и много, но основных всего три.

1. Командный дух. Мол, сплотить команду, думать, как один и чувство локтя можно только на расстоянии вытянутой руки друг от друга.

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

3. Производительность. Офис — место концентрации рабочего процесса и сосредоточиться в офисе намного проще, чем у себя дома с иксбоксом и орущими детьми под рукой.

Остальное всё, как правило вырождается в один из этих пунктов или зависит от них. Например, «контроллировать сотрудников проще в офисе» — совокупность первого и третьего пунктов, «не нужно тратить время на планирование разговоров, а просто подошёл и спросил» — совокупность второго и третьего. Ну, и так далее.

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

Понять от чего зависит интеллект мы не знаем. Казалось, что он зависит от размера мозга, но это не так. Думали, что на него влияет размер конкретного учатстка мозга или объем какого-то вещества внутри, но это тоже не подтвердилось. В общем, теории есть, но доказанных нету.

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

В общем, говорить, что один человек умнее другого можно исключительно субъективно, никаких объективных критериев нет.

(лайк, если хочешь ещё об интеллекте)
«Есть два подхода к программированию. Первый — сделать программу настолько простой, чтобы в ней очевидно не было ошибок. А второй — сделать её настолько сложной, чтобы в ней не было очевидных ошибок»
Отнюдь не каждую операцию, которую совершает человек, он совершает «на личном воображении». Большую часть операций человек (во всяком случае, взрослый) делает без участия воображения как нечто рутинное, привычное, регулируемое уже сложившимися ассоциациями. И механизм таких операций не отличается у животных. Это и называется обучением.

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

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

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

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

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

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

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

Как пример, допустим, у вас в коде есть отложенный вызов процедур и фреймворк отложенных задач. Контроллировать надо, очевидно, свой код и код фреймворка. А вот проблемы редиса, на которых основывается фреймворк — уже не ваша проблема.

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

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

Началось с того, что сантехнические новички, когда приходят в профессию, допускают одну и ту же ошибку, хоть и с разными причинами. Одни сантехджуны хотели сэкономить материал и проложить трубы более коротким путём. Другие ленились и пытались придумать способ сделать работу попроще. Ещё бывают те, кто пытается сделать всё настолько лучше, что становится слишком запутано и усложено. Короче, принимают ситуативные оптимальные решения.

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

Недавно, в разговоре с коллегой обнаружилась устойчивая ассоциация, что тесты — это всегда дополнительное время на разработку. Мол, «мы пока тесты не пишем, потому что время нужно экономить. А вот, как время не надо будет экономить, вот тогда и напишем». Да, можно, конечно, начать убеждать, что такого времени не настанет никогда и что тесты — это неизбежное зло и просто накидывай 15% времени к оценке, но это в корне ошибочная риторика.

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

Тесты — это не пятое колесо в разработке, это не вынужденная мера. Это самый ленивый и быстрый способ писать код. Возможно, разработчик, который никогда не писал раньше тесты, первые пару недель будет бороться с фреймворком и много гуглить, но это так с любым новым инструментом же. Тут бесполезно требовать соблюдения каких-то там TDD-практик, и объяснять, что нужно «сначала тесты, потом код», нет. Нужно просто донести мысль о том, что тесты — это универсальный способ быстрее и эффективнее писать код.

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

UI в целом такой же на стороне пользователя.

Единственное, теперь на нём мерзко мерцает blank state, когда сначала показывается пустая таблица, а потом она идёт за данными, и если всё не прям шустрое-шустрое, ты успеваешь увидеть ‘You have no teams’ или там ‘Data loading’.

Других фундаментальных прорывов пользовательского интерфейса, достигнутых при помощи доминирующей технологии разработки UI, по сравнению с тем, что мы делали эпохи назад на js.haml и jQuery я пока не разглядел. Мы делали не хуже, но это было понятно.

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

Да, да, я/мы просто не умею это готовить. Старческое брюзжание.

#dimoneverything
Так, ещё одна очевидная вещь. Переписка и общение внутри команды должно быть публичными. Внутри команды, само собой. Под явное табу попадают личные переписки в мессенджерах и личные p2p письма. И, судя по опыту, мысль эта крайне непопулярная. Почти все команды, которые удалось наблюдать, используют приватные сообщения, как основной способ общения с коллегами. Созвоны — в приватных чатах, переклички там же. Обсудить, договориться, спросить. Всё в приватных чатах. А плохо это вот почему:

1. Полная изоляция от процессов, происходящих в проекте. Приходится изобретать дополнительные способы синхронизироваться и постфактум узнавать о жопе буквально в соседнем файлике.

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

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

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

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

#dimoneverything
2025/07/05 22:07:46
Back to Top
HTML Embed Code: