Pragmatic Programmer

Description
Мысли о прикладном программировании вслух.
Advertising
We recommend to visit
HAYZON
HAYZON
5,791,257 @hayzonn

👤 𝐅𝐨𝐮𝐧𝐝𝐞𝐫: @Tg_Syprion
🗓 ᴀᴅᴠᴇʀᴛɪsɪɴɢ: @SEO_Fam
Мои каналы: @mazzafam

Last updated 1 month, 1 week ago

Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.

Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support

Last updated 1 month ago

Канал для поиска исполнителей для разных задач и организации мини конкурсов

Last updated 1 month, 3 weeks ago

2 months ago
Хочу сегодня поговорить про деньги.

Хочу сегодня поговорить про деньги.

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

Так вот, очень часто владельцы бизнеса, пытаются сместить деньги с первого плана, мол у нас интересные задачи, мол мы меняем мир и прочее. Но если вы не бизнес партнёр, который принимает решения, то слушать такие сказки от C-уровня управленцев не стоит. Посмотрите на этот разбор о ситуации с Mozilla: https://itdm.com/mozilla-firefox-usage-down-85-but-why-are-execs-salary-up-400/2050/

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

2 months ago

Часть вторая: 4. Limit Function Size — старое доброе "код функции или метода должен умещать на одном экране", что-то из разряда "дорогу стоит переходить только убедившись в безопасности её перехода". Тем не менее в расте есть lint для ограничения размера…

2 months ago
Случайно наткнулся на интересный блог и …

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

2 months, 1 week ago
Принцип бойскаута, ну или некое подобие …

Принцип бойскаута, ну или некое подобие оного. Когда встречаете проблему в прямой или транзитивной зависимости вашего проекта, иногда стоит попробовать потратить пару часов своего времени и решить её.

Например так я сделал с https://github.com/tari-project/randomx-rs/pull/73 — у которых была проблема со сборкой на моём странном окружении.
Это стоило мне минут 40 времени на переделку build.rs и тесты, но это явно быстрее, чем ждать пока кто-то другой займётся исправлением за меня. Несмотря на всяких финов, OSS продолжит жить и развиваться.

2 months, 1 week ago

Интересно как чтение This Week In Rust помогает быстрее осваивать новые инструменты языка. Только вышел 1.82.0, а я уже использую "облегченный" сопоставитель шаблонов (a.k.a. pattern matching) в своём коде:

```

let Events::ViewKeyAdded { view_key } = payload;
view_key

```

А какие новостные рассылки читаете вы? Делитесь в комментариях ⬇️

2 months, 2 weeks ago

Красота sqlx.

Как многие из вас знают, sqlx это попытка поиска баланса между ORM и чистым SQL.
Не буду делать обзор на библиотеку, но поделюсь примером того, как можно это выгодно использовать. Был у меня простой запрос:

SELECT MAX(height) FROM blocks

И в одном из тестов, на пустой таблице мой код

```

sqlx::query_scalar("SELECT MAX(height) FROM blocks")
.fetch_one(database)
.await?

```

начал падать с ошибкой, ведь MAX в таком случае вернёт null, а я ожидаю i64. И это вам не какой-то Javascript, тут за меня никто не будет пытаться магически свести одно к другому.
Сначала я пошёл на автомате менять код программы, fetch_optional, unwrap_or и другие средства Rust. Но затем подумал, а нужно ли это на делать на уровне языка программирования?
Может быть запрос и уровень базы данных - это более подходящее место для исправления ошибки? И написал:

SELECT COALESCE(MAX(height), 0) FROM blocks

Keep it simple, как говорится.

2 months, 2 weeks ago

Кусок кода или абстракция?

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

Было

```

fn decrypt_transaction(...) {
if let Ok(value) = decrypt_with_key(key) {
...
} else {
decrypt_with_key(another_key)
}
}

fn decrypt_with_key (...) {
...
}

```

Стало

```

fn decrypt_transaction(...) {
fn decrypt_with_key (...) {
...
}
if let Ok(value) = decrypt_with_key(key) {
...
} else {
decrypt_with_key(another_key)
}

```

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

Более формально можно выделить это так, при N < 3, где N это число возможных мест вызова функции и L < 20, где L это количество строк кода этой функции, стоит максимально ограничить её видимость. Это может быть ограничение внутри модуля, а может быть и внутри функции или другого блока.

2 months, 3 weeks ago
Небольшой пост выходного дня, после нескольких …

Небольшой пост выходного дня, после нескольких лет скитаний я бросил якорь и расчехляю свои старые пидорки. Решил попробовать не танцевать с бубном и взять стандартную экосистему с RPI Imager и Raspberry Pi OS. Очень удобно - в настройках при записи на карту памяти указываем имя для хоста машинки, пользователя с паролем, включаем SSH доступ по паролю или ключу. Также сразу указываем данные для подключения к WiFi, малина будет готова к работе как только получит питание и прогрузит ОСь. Я доволен. 😊

2 months, 3 weeks ago

Итак, следующее видео из #oldbutgold не такое уж и старое. Здесь автор канала Low Level разбирает 10 "основных" правил NASA по написанию критически важного ПО. Я решил не просто сделать краткий пересказ, но и сравнить каждое правило с тем, как пишется код…

2 months, 3 weeks ago
Завтра сделаю нормальный пост, обещаю — …

Завтра сделаю нормальный пост, обещаю — а пока зацените крутой ролик (другой классификации я не придумал) от команды deno (which is written in Rust btw)😅️
https://www.youtube.com/watch?v=swXWUfufu2w

We recommend to visit
HAYZON
HAYZON
5,791,257 @hayzonn

👤 𝐅𝐨𝐮𝐧𝐝𝐞𝐫: @Tg_Syprion
🗓 ᴀᴅᴠᴇʀᴛɪsɪɴɢ: @SEO_Fam
Мои каналы: @mazzafam

Last updated 1 month, 1 week ago

Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.

Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support

Last updated 1 month ago

Канал для поиска исполнителей для разных задач и организации мини конкурсов

Last updated 1 month, 3 weeks ago