Telegram Web Link
Отзыв на обучение в Стратоплане

Продолжаю серию отзывов про обучение в Стратоплане. На этот раз отзыв на модуль "Работа с людьми".

Начнем с прикольных вещей - вы знали, что прерывать задачу может быть эффективнее, чем ее завершать?

В психологии есть Эффект Зейгарник-Овсянкиной. Его суть в том, что когда мы прерываем действие, не достигая результата, то внутри нас возникает острая потребность в завершении действия.

Как вообще "открыли" этот эффект - взяли 2 группы людей и дали им задачи на математику, логику или усидчивость. Одна группа завершила свои задачи, а вторую группу прервали. Оказалось, что спустя перерыв, вторая группа намного лучше помнила свои задачи.

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

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

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

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

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

Всегда интересно узнать про то, что ты много раз наблюдал, но не замечал - когда отходишь от чего-то интересного и незавершенного и потом постоянно думаешь об этом, а потом возвращаешься и как будто не прерывался. Это могут быть и пет-проекты, и рабочие задачи, и игры (в последний раз я так играл в Age of Wonders 4 - к сожалению нельзя играть 12 часов в сутки, поэтому приходилось прерываться прямо по середине сценария, но возвращаться было очень легко)

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

В целом, в поиске разницы между состояниями А (текущая должность) и Б (желаемая должность) нет ничего нового, но подход с резюме одновременно простой и интересный.

Из того, что не понравилось в модуле: модель Батерейка и шкалы мотивации.

Модель Батарейка - если вы когда то видели ретроспективу, где в начале надо указать свой "заряд" батарейки - то вы в целом понимаете что это. Но, оказывается, есть более менее описанная модель мотивации "Батарейка". Проблема в ней в том, что непонятно как её использовать т.к. все нормальные люди имеют заряд 30-50%, а остальные - либо выдающиеся люди, либо какие-то явные нарушения. Когда разбирались в примерах, оказалось что можно быть по поведению на 60+, а внутри 30-, хотя батарейка основывается на поведении. Короче, вообще не понял как использовать

Также была дана модель для развития сотрудников через 2 шкалы: шкала компетенций и шкала мотиваций. Обе шкалы от 0 до 10. Почему обе шкалы равнозначны и как сравнивать мотивации людей - непонятно. Цифры дают ощущение, что это какая-то строгая модель - но это не так. Лучше бы просто давали шкалы в виде классификаций - эксперт, опытный, новичок.





#stratoplan #note
👍217👎3🔥3
A JavaScript Developer's Guide to Go

Недавно я постил ссылку на гайд по C# для JS-разработчиков. Здесь похожий контент, но теперь гайд по Go. Т.к. Go простой язык, то и гайд достаточно короткий - занимает ровно 1 страницу.

Гайд показывает основные концепции и показывает сходства и отличия Go и TS

https://prateeksurana.me/blog/guide-to-go-for-javascript-developers/

#development #javascript #go
🔥18👍4
Дайджест за 2025-06-23 - 2025-06-25

Announcing Rolldown-Vite
Vite меняет сборщик на Rolldown. Rolldown написан на Rust и является частью экосистемы Oxc, в которой есть Oxlint, о котором я недавно писал.

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

Отзыв на обучение в Стратоплане
Продолжаю серию отзывов про обучение в Стратоплане. На этот раз отзыв на модуль "Работа с людьми".

Начнем с прикольных вещей - вы знали, что прерывать задачу может быть эффективнее, чем ее завершать?

A JavaScript Developer's Guide to Go
Недавно я постил ссылку на гайд по C# для JS-разработчиков. Здесь похожий контент, но теперь гайд по Go. Т.к. Go простой язык, то и гайд достаточно короткий - занимает ровно 1 страницу.

Гайд показывает основные концепции и показывает сходства и отличия Go и TS

——————————————

Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегам или друзьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
👍11
Релиз Prettier 3.6

Вышел Prettier 3.6, в котором за экспериментальным флагом можно запустить более быстрый CLI. Этот cli, судя по всему, разрабатывали полтора года, т.к. текущий пост ссылается на предыдущий про ускорение CLI от ноября 2023-го года

На сколько стало быстрее и за счет чего - пока не описано. Еще из обновлений - можно подключить плагин OXC, который подключает быстрый oxc парсер для JS и TS

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



https://prettier.io/blog/2025/06/23/3.6.0

#development #javascript #prettier #releaseNotes #performance
👍11
Ecma International approves ECMAScript 2025: What’s new?

25 июня зафиксировали стандарт ECMAScript 2025.

Что зафиксировали: импорт-атрибуты (нужны для JSON-модулей), хелперы для итераторов, новые методы Set, немного улучшили RegExp, добавили Promise.try и поддержки 16-битных чисел с плавающей точкой

Import attributes
Добавили в язык возможность импортировать не JS код. Для этого понадобилось добавлять синтаксис, который бы объяснял движку или рантайму, что сейчас будет импорчено
import configData1 from './config-data.json' with { type: 'json' };

// Dynamic import
const configData2 = await import(
'./config-data.json', { with: { type: 'json' } }
);


Хелперы для итераторов
Для массивов есть удобные методы, а для итераторов - нет. Решили исправить эту несправедливость и перенесли часть методов на итераторы
const arr = ['a', '', 'b', '', 'c', '', 'd', '', 'e'];
assert.deepEqual(
arr.values() // creates an iterator
.filter(x => x.length > 0)
.drop(1)
.take(3)
.map(x => `=${x}=`)
.toArray()
,
['=b=', '=c=', '=d=']
);


Адаптированные для итератора методы
- iterator.filter(filterFn)
- iterator.map(mapFn)
- iterator.flatMap(mapFn)
- iterator.some(fn)
- iterator.every(fn)
- iterator.find(fn)
- iterator.reduce(reducer, initialValue?)
- iterator.forEach(fn)

Также сделали аналоги slice
- iterator.drop(limit) возвращает новый итератор без первых limit значений (по сути slice(limit))
- iterator.take(limit) возвращает новый итератор с первыми limit значениями (по сути slice(0, limit))

Еще сделали удобный метод для преобразования итератора в массив iterator.toArray()

Новые методы Set
- Создание нового сета из двух существующих:
- Set.prototype.intersection(other) - пересечение - только те значения, которые есть в обоих наборах
- Set.prototype.union(other) - объединение - значение из обоих наборов
- Set.prototype.difference(other) - позволяет достать множество, которое получится если из множества А убрать все элементы множества Б
- Set.prototype.symmetricDifference(other) - позволяет достать множество, которое содержит элементы которые входят только в одно из множеств
- Определение отношения наборов:
- Set.prototype.isSubsetOf(other) - является ли набор А - подмножеством набора Б
- Set.prototype.isSupersetOf(other) является ли набор А - надмножеством набора Б
- Set.prototype.isDisjointFrom(other) - возвращает true, если у множеств нет пересечений

assert.deepEqual(
new Set(['a', 'b', 'c']).union(new Set(['b', 'c', 'd'])),
new Set(['a', 'b', 'c', 'd'])
);
assert.deepEqual(
new Set(['a', 'b', 'c']).intersection(new Set(['b', 'c', 'd'])),
new Set(['b', 'c'])
);
assert.deepEqual(
new Set(['a', 'b']).isSubsetOf(new Set(['a', 'b', 'c'])),
true
);
assert.deepEqual(
new Set(['a', 'b', 'c']).isSupersetOf(new Set(['a', 'b'])),
true
);



Улучшения RegExp
RegExp.escape(text) позволяет вставить текст в RegExp и быть уверенным, что вставленный текст не сломает RegExp

 const regExp = new RegExp(
`(?<!“)${RegExp.escape(text)}(?!”)`,
'gu'
);


Флаги теперь можно применять не ко всему RegExp, а к отдельным группам
 /^x(?i:HELLO)x$/.test('xHELLOx') // true


Можно использовать одинаковые имена для групп
const RE = /(?<chars>a+)|(?<chars>b+)/v;


Promise.try
Promise.try немного упрощает создание промиса с синхронными функциями
 return Promise.try(() => {
const value = syncFuncMightThrow();
return asyncFunc(value);
});


Если функция syncFuncMightThrow бросит исключение, то Promise.try вернет реджектнутый промис.

Работа с 16-битными числами
По дефолту числа в JS представлены 64-битными числами с плавающей точкой. Но есть кейсы, когда необходимо вести все вычисления в 16 или 32-битных числах. В JS добавили разные хелперы для работы с такими числами, например Math.f16round делает округление в пространстве 16-битных чисел

console.log(Math.f16round(2**16)) // Infinity

console.log(2**16) // 65536


https://2ality.com/2025/06/ecmascript-2025.html

#development #javascript #ecmascript #releaseNotes
30👍3
What's coming to JavaScript

После релиза нового EcmaScript в блоге Deno описали пропозалы, которые обсуждаются сейчас в TC39.

Stage 4
using уже доступен в Chrome, Firefox и Deno. using позволяет описать использование ресурса, который будет освобожден в конце текущего скоупа.
Например, нам нужно открыть файл для чтения и закрыть его после чтения. Вместо ручного закрытия, можно использовать новый Symbol.dispose и using

class FileHandle {
constructor(name) {
this.name = name; /* open file... */
}
[Symbol.dispose]() {
console.log(`${this.name} closed`); /* close file */
}
}
function readFile() {
{
using file = new FileHandle("data.txt");
// read from file...
}
// file.[Symbol.dispose]() was called here automatically
}
readFile(); // logs "data.txt closed"


Array.fromAsync - позволяет собрать массив из асинхронного итератора
async function* generate() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
}
const nums = await Array.fromAsync(generate()); // [1, 2]



Error.isError - метод, позволяющий проверять аргумент на то, является ли он инстансом ошибки. Этот метод нужен ровно по той же причине, по которой нужен Array.isArray - не всегда проверка err instanceof Error возвращает true на ошибки т.к. некоторые ошибки могут быть созданы в другом пространстве. Я, честно сказать, плохо помню всю эту тему с Realm'ами в JS, но помню что теоретически ошибка или массив могут быть сгенерированы в другом пространстве и прилететь в текущее.

Stage 3

Immutable ArrayBuffer
Как понятно из названия, добавлены методы для преобразования буферов в неизменяемые и наоборот
let buf = new ArrayBuffer(100);
let imm = buf.transferToImmutable();
// buf is now detached (byteLength 0), and imm is a new immutable ArrayBuffer of length 100
console.log(buf.byteLength, imm.byteLength); // 0, 100

// attempting to modify imm will throw a TypeError
imm[0] = 1; // TypeError: Cannot modify an immutable ArrayBuffer



Stage 2
Random.Seeded - добавляет возможность генерировать псевдо-случайные числа из сида.
const prng = new Random.Seeded(42);
for (let i = 0; i < 3; i++) {
console.log(prng.random());
// prints the same sequence on every run given seed 42
}


Number.prototype.clamp - функция позволяет привести число к промежутку. Например, мы делаем какой-то функционал, где стоимость услуги зависит от объема, но градация скидки за объем начинается от, например, 10 (без скидки), и заканчивается на 1000 (т.е. клиенты с объемом в 1000 и 1100 получат одинаковую скидку за объем). clamp позволяет как раз привести входное число к нужному диапазону

(5).clamp(10, 1000); // 10
(500).clamp(10, 1000); // 500
(1000).clamp(10, 1000); // 1000
(1100).clamp(10, 1000); // 1000


Stage 1
В Intl.NumberFormat добавлена возможность выводить висящие нули
new Intl.NumberFormat("en", {
minimumFractionDigits: 2,
trailingZeroDisplay: "auto",
})
.format(1.5); // "1.50"



Proposal-inspector - попытка стандартизировать сравнение объектов и вывод результата в человекочитаемом виде. Необходимо для стандартизации инструментов разных платформ (Node, Bun) и было бы полезно для тестовых фреймворков

Random Functions - добавляет пространство Random с вспомогательными функциями, которые обычно пишутся на коленке в каждом проекте
// Случайное число из диапазона
Random.int(-5, 5); // -1
Random.number(0, 10); // 8
Random.number(0, 5, 0.1); // 1.1 (0.1 - шаг)

// Выберет 2 случайных из массива
const name = Random.take(["Alice", "Bob", "Carol"], 2); // ['Alice', 'Bob']

// Выберет 1 случайный из массива
Random.sample(["Alice", "Bob", "Carol"]); // 'Bob'
// Перемешивание массивов
Random.shuffle([1, 2, 3, 4]); // [4,2,1,3]
const shuffled = Random.toShuffled([1, 2, 3, 4]);



https://deno.com/blog/updates-from-tc39

#development #javascript #ecmascript #deno #proposal
16👍7🔥3
Announcing LogTape 1.0.0

Вышел релиз 1.0.0 библиотеки для логирования LogTape. Выглядит интересно. В фокусе проекта: перформанс, стабильность, интеграция с существующими решениями.

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

Также в LogTape сделаны интересные интеграции как с внешними тулами, так и с экосистемой. Интеграции с внешними тулами это интеграции с AWS CloudWatch, Windows Event Log. А для экосистемы сделаны адаптеры для winston и pino - популярных библиотек для логирования

Пример интеграции с winston

Простая интеграция
/ Quick setup with winston
import "@logtape/adaptor-winston/install";

Кастомизируемая
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";

const logger = winston.createLogger({/* your config */});
install(logger);



В общем, выглядит интересно, стоит присмотреться

https://hackers.pub/@hongminhee/2025/announcing-logtape-1-0

#development #javascript #library #logging
👍12
Рекомендую вакансию: SkyPro ищет тимлида

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

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

Итак, в небольшую команду разработки SkyPro ищут тимлида. У ребят хорошая культура разработки - реальный agile (работа микро-итерациями), реальный CI\CD (реальный - это когда код разработчика постоянно интегрируется в общий бранч, а не только когда все завершено и протестировано и, дай бог, раз в день), пишут автотесты, поощряют автономность и самостоятельность, используют AI везде где можно.

SkyPro занимается образованием в IT. Построили успешный бизнес на идее "войти в айти", как яндекс практикумы, скилбоксы и другие. Команда занимается разработкой платформы для обучения, но также я точно знаю, что команда сама периодически участвуют в доработке своих курсов.

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

По тех. стеку - angular и php.

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

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

В треде пишите любые вопросы - вам ответит чел из skypro

https://vacancies.skyeng.ru/dev-team-lead-skypro?utm_source=msosnov

#note
👍7
Дайджест за 2025-06-30 - 2025-07-04

Релиз Prettier 3.6
Вышел Prettier 3.6, в котором за экспериментальным флагом можно запустить более быстрый CLI. Этот cli, судя по всему, разрабатывали полтора года, т.к. текущий пост ссылается на предыдущий про ускорение CLI от ноября 2023-го года

На сколько стало быстрее и за счет чего - пока не описано. Еще из обновлений - можно подключить плагин OXC, который подключает быстрый oxc парсер для JS и TS

Ecma International approves ECMAScript 2025: What’s new?
25 июня зафиксировали стандарт ECMAScript 2025.

Что зафиксировали: импорт-атрибуты (нужны для JSON-модулей), хелперы для итераторов, новые методы Set, немного улучшили RegExp, добавили Promise.try и поддержки 16-битных чисел с плавающей точкой

What's coming to JavaScript
После релиза нового EcmaScript в блоге Deno описали пропозалы, которые обсуждаются сейчас в TC39.


Announcing LogTape 1.0.0
Вышел релиз 1.0.0 библиотеки для логирования LogTape. Выглядит интересно. В фокусе проекта: перформанс, стабильность, интеграция с существующими решениями.

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

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

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

——————————————

Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегам или друзьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
4🔥3
Релиз Deno 2.4

Вышел Deno 2.4. Очень много работы над developer experience, а также часть фичей вышли из экспериментальных в стабильные

Восстановили deno bundle. Это команда, которая собирала приложение в 1 бандл. Работала как для серверных приложений, так и для браузерных. В какой-то момент ее задепрекейтили, теперь снова вернули с esbuild под капотом. В будущем обещают программное API для создания бандлов.

Добавили возможность импортировать не код.

Ранее картинки и другие файлы необходимо было считывать в рантайме
const image = Deno.readFileSync(import.meta.resolve("./image.png"));
const text = await Deno.readTextFile(import.meta.resolve("./log.txt"));


Теперь же можно использовать обычные импорты с атрибутами
import message from "./hello.txt" with { type: "text" };
import bytes from "./hello.txt" with { type: "bytes" };
import imageBytes from "./image.png" with { type: "bytes" };

console.log("Message:", message);
// Message: Hello, Deno!

console.log("Bytes:", bytes);
// Bytes: Uint8Array(12) [
// 72, 101, 108, 108, 111,
// 44, 32, 68, 101, 110,
// 111, 33
// ]

Deno.serve((_req) => {
return new Response(imageBytes, {
status: 200,
headers: {
"Content-Type": "image/png",
"Content-Length": imageBytes.byteLength.toString(),
},
});
});
// Shows image.png at localhost:8000


Кроме того, можно импортировать и wasm-файлы

Поддержку OpenTelementry сделали стабильной. До этого релиза OpenTelemetry была экспериментальной фичей, включаемой флагом. Теперь дополнительный флаг не нужен - достаточно установить переменную окружения OTEL_DENO=1

Добавили флаг --preload для указания кода, который должен запуститься до запуска основного скрипта. Может быть полезно для задания каких-то глобальных настроек или создания глобальных сущностей.

Добавили явный флаг --coverage для сборки покрытия кода. Вывод coverage в консоли представлен в виде markdown-таблицы, которую легко вставить в любой markdown-документ. Также и benchmark таблицы теперь тоже в markdown формате. Забота о разработчиках, которой нам не хватало :)

Добавили DENO_COMPAT=1 - переменная окружения, которая устанавливает все флаги, сделанные для поддержки работы с package.json

Доработали систему разрешений. В --allow-net можно указывать вайлдкарты доменов и пространства сетей CIDR - --allow-net=*.foo.localhost, --allow-net=192.168.0.128/25. Также добавили флаг --allow-import и --deny-import для разрешения и запретов импортов из определенных источников --deny-import=cdn.jsdelivr.net

В Deno 2.3 ввели возможность использовать локальные нпм-пакеты через поле patch. Получили фидбек от сообщества, что patch может запутать т.к. в npm это используется по-другому. Поэтому локальные пакеты теперь надо указывать в секции links

Кроме этого:
- Улучшили совместимость с nodejs
- Добавили во встроенный линтер поддержку XML и SVG
- Улучшили поддержку tsconfig
- Улучшили свой LSP

https://deno.com/blog/v2.4

#development #javascript #deno #releaseNotes
🔥92
Repomix: Pack your codebase into AI-friendly formats

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

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

https://repomix.com

#development #javascript #library #ai
👍11
Modern Node.js Patterns for 2025

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

Из банальных советов: используйте ESM, fetch, async await, воркеры для сложных вычислений, кастомные классы ошибок. Менее банальные стоит расписать подробнее.

В основном бест-практисы связаны с использованием внутренних инструментов nodejs, вместо использования внешних библиотек, либо с использованием общих web-стандартов, вместо использования специфичного для nodejs решения.

В nodejs завезли test-runner, теперь можно запускать автотесты без внешних библиотек

В nodejs с самого начала была хорошая поддержка потоков (Streams). Теперь же потоки есть и в Web-стандартах, поэтому пора переходить на работу с ними, делая свой код кросс-платформенным.

Завезли новые удобные флаги для разработки - --watch, --env-file, которые убирают необходимость во внешних библиотеках типа dotenv и nodemon

Также в nodejs теперь есть возможность ограничивать возможность приложений как в deno. Правда, пока за экспериментальными флагами

# Run with restricted file system access
node --experimental-permission --allow-fs-read=./data --allow-fs-write=./logs app.js

# Network restrictions
node --experimental-permission --allow-net=api.example.com app.js


В nodejs теперь есть возможность мониторить перформанс, что, опять же, убирает необходимость во внешних библиотеках


import { PerformanceObserver, performance } from 'node:perf_hooks';

// Set up automatic performance monitoring
const obs = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.duration > 100) { // Log slow operations
console.log(`Slow operation detected: ${entry.name} took ${entry.duration}ms`);
}
}
});
obs.observe({ entryTypes: ['function', 'http', 'dns'] });

// Instrument your own operations
async function processLargeDataset(data) {
performance.mark('processing-start');

const result = await heavyProcessing(data);

performance.mark('processing-end');
performance.measure('data-processing', 'processing-start', 'processing-end');

return result;
}


Если вам нужно доставлять nodejs-приложение единым файлом, то nodejs теперь умеет делать это сама (опять же - убирается зависимость от внешних тулов)


# Create a self-contained executable
node --experimental-sea-config sea-config.json


Также следует использовать новые возможности node:diagnostics_channel. Можно создать канал диагностики, куда можно публиковать события, которые можно затем передавать в специализированный тулинг

import diagnostics_channel from 'node:diagnostics_channel';

// Create custom diagnostic channels
const dbChannel = diagnostics_channel.channel('app:database');
const httpChannel = diagnostics_channel.channel('app:http');

// Subscribe to diagnostic events
dbChannel.subscribe((message) => {
console.log('Database operation:', {
operation: message.operation,
duration: message.duration,
query: message.query
});
});

// Publish diagnostic information
async function queryDatabase(sql, params) {
const start = performance.now();

try {
const result = await db.query(sql, params);

dbChannel.publish({
operation: 'query',
sql,
params,
duration: performance.now() - start,
success: true
});

return result;
} catch (error) {
dbChannel.publish({
operation: 'query',
sql,
params,
duration: performance.now() - start,
success: false,
error: error.message
});
throw error;
}
}


https://kashw1n.com/blog/nodejs-2025/

#development #javascript #nodejs
👍21🔥64
Speculative Optimizations for WebAssembly using Deopts and Inlining

Статья в блоге V8 про ускорение WASM в недавнем релизе V8. В целом WASM ранее не нуждался в каких-то спекулятивных оптимизациях т.к. сгенерированный wasm-код уже был эффективный. Но вот мы дошли до создания WASM Garbage Collector, чтобы позволить языкам типа Java, Kotlin, Dart компилироваться в WASM. И вот в WasmGC уже можно заниматься спекулятивными оптимизациями.

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

https://v8.dev/blog/wasm-speculative-optimizations

#development #javascript #v8 #wasm #performance
👍10
Дайджест за 2025-07-07 - 2025-07-10

Релиз Deno 2.4
Вышел Deno 2.4. Очень много работы над developer experience, а также часть фичей вышли из экспериментальных в стабильные

Восстановили deno bundle. Это команда, которая собирала приложение в 1 бандл. Работала как для серверных приложений, так и для браузерных. В какой-то момент ее задепрекейтили, теперь снова вернули с esbuild под капотом. В будущем обещают программное API для создания бандлов.

Repomix: Pack your codebase into AI-friendly formats
Repomix - библиотека, которая запакует ваш репозиторий в формат, удобный для AI. Собранный документ затем можно кидать в любую LLM как проект, с которым можно работать.

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

Modern Node.js Patterns for 2025
Список современных бест-практисов nodejs в частном блоге. Часть бест-практисов уже "старые", часть - достаточно интересные. В любом случае полезно ознакомиться, возможно найдете что-то для себя

Из банальных советов: используйте ESM, fetch, async await, воркеры для сложных вычислений, кастомные классы ошибок. Менее банальные стоит расписать подробнее.

Speculative Optimizations for WebAssembly using Deopts and Inlining
Статья в блоге V8 про ускорение WASM в недавнем релизе V8. В целом WASM ранее не нуждался в каких-то спекулятивных оптимизациях т.к. сгенерированный wasm-код уже был эффективный. Но вот мы дошли до создания WASM Garbage Collector, чтобы позволить языкам типа Java, Kotlin, Dart компилироваться в WASM. И вот в WasmGC уже можно заниматься спекулятивными оптимизациями.

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

——————————————

Спасибо что читаете, ставите реакции и отмечаетесь в комментариях. Если вы хотите помочь каналу - расскажите о нем своим коллегам или друзьям. Также оставляйте фидбек по формату, материалу и чему-угодно еще 🙂
👍11
Introducing the first alpha of Turso: The next evolution of SQLite

Не только JS-тулинг переписывают на Rust. Очередь дошла и до sqlite. Turso - новая СУБД на RUST, которая совместима с sqlite, но также имеет дополнительные фичи.

Собственно ради дополнительных фичей все и переписали. Технически, можно было бы доработать sqlite, но, как сообщают авторы Turso, сообщество sqlite достаточно консервативное и не принимает доработки от сторонних авторов.

Поэтому они решили сделать свое решение, которое было бы полностью совместимо с sqlite, но еще и обладает дополнительными фичами.

Что это за фичи:

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

Встроенный векторный поиск, что крайне полезно для ML и AI проектов

Пока проект в стадии альфа-тестирования. Что обещают в будущем:
- Индексы
- Многопоточность
- Тригеры
- Views
- Saveopoints

В общем ждем. Может быть в будущем будем читать как кто-то построил интересное веб-решение на основе Turso.

https://turso.tech/blog/turso-the-next-evolution-of-sqlite

#development #sqlite #rust
👍7👎21🔥1
zshy - The no-bundler build tool for TypeScript libraries

Zshy - билд тул для typescript библиотек. Это инструментарий, который был создал для Zod, но теперь его адаптировали для широкого использования и выложили в опенсорс.

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

https://github.com/colinhacks/zshy

#development #javascript #typescript #library #github
👍2👎1
jsonrepair

jsonrepair - библиотека для починки сломанного json. Библиотека умеет чинить типичные проблемы - копирование JS-объектов в JSON, пропущенные запятые или незакрытые скобки, учитываются особенности вставки JSON из разных источников.




https://github.com/josdejong/jsonrepair

#development #JSON #library
👍151
Поговорим про клавиатурки

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

Давайте разберем, что значит каждый атрибут:
- Механическая - используются механические переключатели
- Сплит - клавиатура разделена на 2 независимых части
- Эргономичная - обычные клавиатуры неудобны для человеческих кистей. Поэтому все клавиатуры, которые как-то подстраиваются под человеческий организм называют эргономичными
- Программируемая - на клавиатуре около 60 клавиш и им можно назначать различные действия через прошивку или ПО. Так как 60 клавиш - мало для реальной работы, то используется концепция слоев - каждый слой содержит свой мапинг клавиш, а слои переключаются по определенным тригерам
- Ортолинейная - если вы посмотрите на свою клаву, вы увидите, что клавиши выстроены не в ровные колонки, а со смещением. Это сделано из-за особенностей строения старых печатных машинок - рычаги под клавишами не должны были задевать друг друга. Рычажков давно нету, а раскладка осталась. Но наши пальцы - они прямые, без сдвигов, поэтому сдвиги клавиш избыточны. Вот в ортолинейных клавиатурах все кнопки выстроены в ровные колонки. В сочетании со сплит это позвляет печатать двигая пальцы вперед-назад, не двигая их влево-вправо. Рука, в этом случае, печатает неподвижно.
- Низкопрофильные - клавиши с коротким ходом (низкие)

Когда-то я использовал обычные клавиатуры и все было хорошо. Я умел печатать в слепую (спасибо за это тысячам наигранных часов в World of Warcraft). Но мне стало неудобно использовать обычную клавиатуру, когда я стал писать много веб кода.

Я пишу код быстро. Ял знаю основные хоткеи, которые позволяют мне навигироваться по файлам и сущностям без использования мышки. Когда я парно программирую с людьми, которые так не умеют - я стараюсь их переучить, т.к. использование мышки настолько замедляет работу, что мне становится больно наблюдать за этим. Скролить Tree View мышкой для поиска файла (вместо jump to file или, на худой конец find in directory) или искать метод в файле через скрол (вместо jump to symbol) - это примерно как купить феррари и ездить со скоростью 20км\ч - в целом легально, но это какая-то мука.

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

Но даже знание хоткеев не спасает - иногда нужно использовать клавиши, которые требуют полной перестановки кистей на клавиатуре: <>, стрелочки, pgup и тд. 

Какое-то время я, для упрощения работы с этими клавишами, использовал разные костыли на уровне ОС (благо в линуксе с этим все очень просто). Но в какой-то момент мне показалось, что это какие-то костыли и нужно "нормальное" решение. В этот момент я задумался о приобритении программируемой клавиатуры, которая разделена на 2 части. Как правило такие клавиатуры уже содержат в себе раскладку, которая не требует движения кистей вообще.

Я пробовал разные варианты клавиатур, но последние несколько лет работаю с lilly 58pro. С этой клавиатуры и пишу пост. Навык печати на обычных клавиатурах еще не потерял, но переход с классической клавиатуры на сплит занимает где-то часик-два (обычно проблемы с клавишами на краю клавиатуры - win, cmd, f12, т.к. они могут по разному располагаться на клавиатурах). Я использую низкопрофильные свичи kailh choc, линейные и тактильные. Тактильные для обычных клавиш, а линейные для модификаторов и того, что надо зажимать.

Отдельный неожиданный прикол - каждый гость спрашивает, почему у меня "сломанная" клавиатура.

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



#note #keyboards
🔥133😁1💩1
How to test React Server Component

Удивительно, столько движа вокруг серверных компонентов React. Но при этом нет никаких официальных туториалов как тестировать эти компоненты (по крайней мере я не видел таких туториалов и в статье говорят что их нет)

В статье приводится функция для тестирования серверных реакт-компонентов, которую можно завести в свои проекты, пока нет никакого официального тулинга.


https://www.nico.fyi/blog/how-to-test-react-server-component

#development #javascript #react #reactServerComponents #testing
👎4👍1
Expert Generalists

Статья в блоге Мартина Фаулера про T-shaped специалистов. Точнее, все текущие термины (T-shape, П-shape, и другие) плохо подходят, поэтому в статье вводится термин Expert-Generalist, который означает, что человек одновременно является и экспертом (в противовес generalist) и использует свою экспертизу во многих областях (в противовес эксперту в одной области).

В данном случае имеется в виду, что человек является экспертом в фундаментальных понятиях, которые позволяют ему быть успешным в областях, которые построены на этих понятиях. Классический пример из IT, это когда человек имеет опыт написания ПО на 3-4 языка программирования и ему после этого уже не так важно, на каком именно другом языке писать код, пока этот язык следует общим парадигмам (основан на том же фундаменте). Условно, человек, который писал на JS, PHP, JAVA, C++ с легкостью может войти в Go, Rust, Kotlin. Но, вероятно, столкнется с некоторыми проблемами при входе в Haskell. Но, скорее всего, сможет это сделать в короткие сроки.

В профессиональных кругах не любят генералистов, т.к. у них нет глубоких знаний ни в одной из зон.

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

В чем сила таких специалистов:

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

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

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

Ключевые качества экспертов-генералистов:
- Любознательность
- Умение сотрудничать
- Фокус на клиенте (бизнесовая направленность)
- Ставка на фундаментальные знания
- Широта знаний
- Способность понимать позицию смежных доменов (например, понимать проблемы SRE или DevOps)

Многие эксперты-генералисты вырастают в технических лидеров

Встает закономерны вопрос: "где брать таких специалистов?". Текущий найм устроен так, что мы скорее наймем ультра-эксперта в технологии, чем наймем человека, который любознателен и умеет погружаться в новые домены. В статье предлагается подход из двух решений:
- Перестать смотреть только на узкие хард-скилы. Вместо этого следует проверять человека на обучаемость, любознательность, создание условий для совместной работы
- Проводить внутренние тренинги и воркшопы, цель которых - погрузить специалистов в смежные области. В Thoughtworks есть 3 воркшопа, в которых специалисты делают решения из смежных областей. В рамках воркшопа они реализуют простые прототипы kafka, kubernetes, delta lake (штука для работы с данными). Создав прототип, люди начинают понимать базовые принципы, на которых основаны эти системы и начинают видеть рабочие ситуации с другой стороны

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

Для каждой ключевой компетенции в команде нужен 1-2 специалиста.

---

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



https://martinfowler.com/articles/expert-generalist.html

#managment #tshape #martinFowler
👍8🔥61
2025/10/04 21:36:09
Back to Top
HTML Embed Code: