Как стать автором
Обновить
1
0

Пользователь

Отправить сообщение

Rust без прикрас: где мы ошибаемся

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров7.7K

Привет, исследователи Rust! Сегодня хочу поделиться своим опытом (не всегда радужным) работы с Rust. Да, язык классный, безопасный, быстрый — все мы это знаем. Но, как и в любом инструменте, здесь есть свои подводные камни, на которые я благополучно наступал.

Читать далее
Всего голосов 29: ↑25 и ↓4+31
Комментарии28

Развлекаемся с итераторами в Go

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров2.8K

Релиз версии Go 1.23 добавил поддержку итераторов и пакет iter. Теперь можно перебирать константы, контейнеры (map, slice, array, string) и функции. Сначала создание итератора показалось мне неудобным, хотя в то же время его использование выглядело простым.

Моя проблема с подходом к итераторам в Go заключается в том, что их нельзя «связывать» так,как это можно делать в JavaScript:

Читать далее
Всего голосов 10: ↑10 и ↓0+12
Комментарии3

Асинхронный Rust в трех частях. Введение

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров3.9K

Async/await, или «асинхронный ввод‑вывод», — это относительно новая функция языка, которая позволяет программам выполнять несколько задач одновременно. Это своего рода альтернатива многопоточности, хотя программы на Rust часто используют и то и другое. Асинхронный ввод‑вывод особенно популярен в веб‑сервисах и сетевых приложениях, работающих с большим числом подключений одновременно.

Эта серия статей представляет собой введение в "futures", задачи и асинхронный ввод‑вывод в Rust. Наша цель — понять основные механизмы, чтобы асинхронный код не казался магией. Мы начнем с преобразования (так называемой «рассахаризации») асинхронных примеров в обычный Rust и постепенно создадим собственную асинхронную «среду выполнения». На данном этапе под «средой выполнения» мы понимаем библиотеку или фреймворк, которые используются для написания асинхронных программ.

Создание собственных фьючерсов, задач и механизма ввода‑вывода позволит понять, что именно делает для нас среда выполнения. Предполагается, что вы уже немного писали на Rust и читали The Rust Programming Language \или аналогичный источник.

Давайте начнем с выполнения нескольких задач одновременно с использованием потоков. Сначала все пойдет хорошо, но затем, с увеличением количества потоков, начнутся проблемы. Затем мы добьемся того же, используя async/await. В этой части мы разберем примеры, а в следующей мы начнем углубляться в них.

Читать далее
Всего голосов 16: ↑16 и ↓0+20
Комментарии7

Асинхронный Rust в трех частях. Часть вторая: Tasks

Уровень сложностиПростой
Время на прочтение12 мин
Количество просмотров1.9K

Во введении мы сказали, что async/await это про futures и задачи. В первой части мы рассмотрели futures и теперь пришло время задач. Благо, мы с ними уже встречались, хоть мы их так и не называли.

Читать далее
Всего голосов 11: ↑11 и ↓0+14
Комментарии73

Асинхронный Rust в трех частях. Часть третья: IO

Время на прочтение11 мин
Количество просмотров2.2K

Конечно, async/await были придуманы не для сна. Нашей целью с самого начала был ввод‑вывод (I/O), а в особенности сетевой ввод‑вывод. Вооружившись futures и задачами, теперь мы можем перейти к реальным примерам.

Читать далее
Всего голосов 14: ↑14 и ↓0+19
Комментарии5

Разбираем выравнивание данных и структуру памяти в Rust

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров1.2K

Мне нравится оптимизировать код — определение и исправление неэффективных участков кода приносит некое особое чувство удовлетворения в отличие от закидывания проблемы железом. Ведь последнее — пустая трата ресурсов и выбросов углерода!

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

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

Читать далее
Всего голосов 11: ↑11 и ↓0+11
Комментарии3

Монады как паттерн переиспользования кода

Время на прочтение24 мин
Количество просмотров71K


В предыдущей статье мы обсуждали, почему функциональное программирование это совсем не то, что распиарено, и что оно совершенно не противоречит ООП, так, что даже сам "Дядя Боб" пишет про хороший ФП дизайн порождающий хороший ООП дизайн программы (и наоборот).


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


Но ведь в интернете буквально сотни статей про ФП и монады, зачем писать еще одну?


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


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


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

Читать дальше →
Всего голосов 89: ↑85 и ↓4+100
Комментарии256

Паттерн Наблюдатель в Golang на котиках

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров1.4K

Привет, Хабр! Сегодня будем разбирать паттерн Наблюдатель на примере наших любимых пушистиков — котиков. Ведь кто, как не коты, могут быть идеальными субъектами и наблюдателями в нашем коде?

Читать далее
Всего голосов 18: ↑10 и ↓8+5
Комментарии4

Проверка готовности приложения к работе в реальном ненадежном мире. Часть 2

Время на прочтение6 мин
Количество просмотров964

Вторая часть статьи, в которой Виталий Лихачёв, SRE в booking.com и спикер курса Слёрма «Golang-разработчик» рассказывает, о чём стоит подумать перед выкаткой сервиса в жестокий прод, где он может не справиться с нагрузкой или деградировать из-за резких всплесков при наплыве пользователей и по вечерам.

Статья состоит из 5 частей, которые будут выходить по очереди:

1. Надежность.

2. Масштабируемость/отказоустойчивость.

3. Resiliency/отказоустойчивость.

4. Безопасность. Процесс разработки. Процесс выкатки.

5. Наблюдаемость. Архитектура. Антипаттерны.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Проверка готовности приложения к работе в реальном ненадежном мире. Часть 1

Время на прочтение6 мин
Количество просмотров1.7K

Опытом делится Виталий Лихачёв, SRE в booking.com и спикер курса Слёрма «Golang-разработчик». Он рассказывает, о чём стоит подумать перед выкаткой сервиса в жестокий прод, где он может не справиться с нагрузкой или деградировать из-за резких всплесков при наплыве пользователей и по вечерам.

Считайте это некоторым чек-листом, но не применяйте все пункты as is, потому что каждая система уникальна и иногда вполне допустимо построить менее надежную систему с целью значительного сокращения затрат на разработку, поддержку и эксплуатацию (например, отсутствие резервирования). Однако бэкапы обязательно должны быть 🙂

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

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

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

Статья состоит из 5 частей, которые будут выходить по очереди:

1. Надежность.

2. Масштабируемость/отказоустойчивость.

3. Resiliency/отказоустойчивость.

4. Безопасность. Процесс разработки. Процесс выкатки.

5. Наблюдаемость. Архитектура. Антипаттерны.

Читать далее
Всего голосов 11: ↑10 и ↓1+9
Комментарии2

Проверка готовности приложения к работе в реальном ненадежном мире. Часть 3

Время на прочтение18 мин
Количество просмотров541

Третья часть статьи, в которой Виталий Лихачёв, SRE в booking.com и спикер курса Слёрма «Golang-разработчик» рассказывает, о чём стоит подумать перед выкаткой сервиса в жестокий прод, где он может не справиться с нагрузкой или деградировать из-за резких всплесков при наплыве пользователей и по вечерам.

Статья состоит из 5 частей, которые выходят по очереди:

1. Надежность.

2. Масштабируемость/отказоустойчивость.

3. Resiliency/отказоустойчивость.

4. Безопасность. Процесс разработки. Процесс выкатки.

5. Наблюдаемость. Архитектура. Антипаттерны.

Читать далее
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

An incursion under C#. Протаскиваем F# в Godot

Уровень сложностиПростой
Время на прочтение18 мин
Количество просмотров2.6K

Godot — игровой движок, который имеет нативную поддержку dotnet. К сожалению, эта поддержка до такой степени заточена под C#, что F# она выходит боком. Почти все проблемы разрешимы, но при недостатке опыта они скатываются в большой пластилиново-волосатый валик у самого входа в подземелье, который иногда приводит к преждевременной и бессмысленной гибели. Чтобы избежать этого в данной статье я дам программу-минимум, которая позволит выжить в Godot, но не выжать из него максимум.

Это не значит, что у сочетания F# + Godot нет своих плюшек. Просто мне хотелось съесть вначале сосредоточить всех мух в одном месте, а котлетами заняться потом и в более свободной манере. Также я предполагаю, что на данную статью будут натыкаться как новички в F#, так и новички в Godot, поэтому местами я буду дублировать базовые руководства.

Читать далее
Всего голосов 10: ↑10 и ↓0+11
Комментарии1

Система инвентаря на Godot. Костыль первый

Уровень сложностиПростой
Время на прочтение15 мин
Количество просмотров9.6K

Годот, немного костылей и прямые руки (по желанию).

Самый подробный гайд о создании системы инвентаря, без воды, по факту и с кодом!

Начать гайд
Всего голосов 19: ↑19 и ↓0+19
Комментарии9

Шестидесятилетний заключённый и лабораторная крыса. F# на Godot. Часть 3. Алгоритмы c пересадками

Уровень сложностиПростой
Время на прочтение18 мин
Количество просмотров1.3K

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

Читать далее
Всего голосов 4: ↑4 и ↓0+5
Комментарии0

Шестидесятилетний заключённый и лабораторная крыса. F# на Godot. Часть 2. Выражения

Уровень сложностиПростой
Время на прочтение16 мин
Количество просмотров1.8K

В прошлой части я говорил про адаптацию API Godot к F#. Далее в планах было разобраться с общей структурой приложения, но я столкнулся с необходимостью закрыть серьёзный пробел в публичном корпусе текстов. Так что в этой и последующих частях я буду объяснять нечто странное — как из обычной функции путём эволюции получается работающая программа на Godot.

На мой взгляд, у большинства F#-новичков тактический и стратегический уровень находятся в разных вселенных. Типа вот здесь в локальном пространстве у нас ФП, а на глобальном внезапно тащит только ООП. Это, конечно, хорошо, что мы можем склеивать две парадигмы, но мне кажется, что эта непреодолимая стена на границе сферы деятельности ФП не такая уж непреодолимая. Существование её обусловлено не объективными причинами, а недостатком опыта.

Читать далее
Всего голосов 9: ↑8 и ↓1+11
Комментарии2

Шестидесятилетний заключённый и лабораторная крыса. F# на Godot. Часть 1. Встреча с фреймворком

Уровень сложностиПростой
Время на прочтение16 мин
Количество просмотров2.9K

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

Читать далее
Всего голосов 9: ↑8 и ↓1+11
Комментарии0

Как реализовать DDD в Go

Время на прочтение25 мин
Количество просмотров34K

С помощью микросервисной архитектуры можно построить масштабируемое и гибкое приложение. Однако, если команда бессистемно использует этот подход в своей работе, то скоро столкнется с разочарованием и неконтролируемой сложностью. Избежать этого поможет DDD (Domain-Driven Design, предметно ориентированное проектирование). Не так давно я ничего не знал про этот подход, но сейчас я постоянно натыкаюсь на эту тему.

Представляю вам перевод статьи "How to Implement Domain-Driven Design (DDD) in Golang". Повествование буду вести от лица автора, иногда прерывая собственными мыслями в таком же формате, как и это отступление. Приятного чтения.

Читать далее
Всего голосов 23: ↑20 и ↓3+19
Комментарии24

Golang. Паттерн Adapter

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров7.7K

Постараемся рассмотреть шаблоны проектирования на примере языка Go

В первой статье цикла рассмотрим один из самых простых паттернов - Adapter.

Читать далее
Всего голосов 6: ↑4 и ↓2+2
Комментарии12

Простые правила, которые помогают мне писать на Go без побочных эффектов

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров11K

Роб Пайк сказал, что простое лучше, чем сложное. Я бы добавил: простое лучше, чем прикольное. Ведь Go спроектирован, чтобы писать программы в простом стиле. 

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

Читать далее
Всего голосов 25: ↑23 и ↓2+24
Комментарии11

Шпаргалка по структурам данных в Go

Время на прочтение6 мин
Количество просмотров72K

Некоторые компании проводят собеседования с online написанием кода. Требуется решить олимпиадную задачку на скорость. В таких условиях нет времени посмотреть подробности реализации структур данных — нужно сразу реализовать идею. Но курсы по алгоритмам и структурам данных дают примеры или на псевдокоде, или на С++. Ещё эталонные решения задач написаны зачастую на С++. Готовясь к собеседованию, составил шпаргалку библиотек — аналогов контейнеров STL, что бы не тратить драгоценное время на поиск.
Читать дальше →
Всего голосов 52: ↑47 и ↓5+42
Комментарии11
1
23 ...

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность