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

Developer

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

Как работает ChatGPT: объясняем на простом русском эволюцию языковых моделей с T9 до чуда

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

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

Погнали →
Всего голосов 357: ↑350 и ↓7+343
Комментарии283

Перестаньте называть себя программистом и другие карьерные советы

Время на прочтение19 мин
Количество просмотров258K
Есть один курс, который я бы добавил в программу обучения по всякой инженерной специальности, и он не о компиляторах или сложности алгоритмов. Это “Введение в реальность индустрии”, ибо об этом не говорят и это приводит к никому не нужным обломам. Эта статья претендует стать README.txt для молодого инженера в деле построения карьеры. Ее цель — сделать вас счастливее, заполнив пробелы в образовании относительно того, как работает реальный мир. Я не призываю следовать написанному как подробному руководству, но я надеюсь, что эта информация окажется для вас более ценной, чем то ничто, что вам рассказали об этом в университете.
Читать дальше →
Всего голосов 251: ↑212 и ↓39+173
Комментарии175

Обзор альтернатив Proof of Work. Часть 2. Proof of Activity, Proof of Burn, Proof of Capacity и генералы

Время на прочтение7 мин
Количество просмотров23K
Продолжаем переводить крутые статьи с сайта Bytecoin.org. Сегодня — «Alternatives for Proof of Work, Part 2: Proof of Activity, Proof of Burn, Proof of Capacity, and Byzantine Generals» Рэя Паттерсона (Ray Patterson). Часть 1 можно найти тут.

PoW vs PoS: что еще?


Итак, энергоэффективность Proof of Stake – это палка о двух концах. С одной стороны, энергия-то не тратится, с другой – без этих трат модель распределенного консенсуса выглядит несколько неустойчиво.

Какие еще аргументы можно привести? Против PoS не раз высказывается мнение, что эта схема «делает богатых богаче». И в самом деле: тот, у кого больше всех монет, будет находить больше всех блоков и получать больше всех прибыли, увеличивая число этих монет. На самом деле, в таком виде это обвинение можно высказать и в лицо PoW: тот, кто вложил больше всех денег в железо, будет получать и больший доход, это естественно.

Но картина начинает выглядеть по-другому, если мы говорим о криптовалюте…
Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии4

Обзор альтернатив Proof of Work. Часть 1. Proof of Stake

Время на прочтение6 мин
Количество просмотров46K
Продолжаем переводить крутые статьи с сайта Bytecoin.org. Сегодня — «Alternatives for Proof of Work, Part 1: Proof Of Stake» Рэя Паттерсона (Ray Patterson).
Также читайте перевод «Краткой истории эволюции proof-of-work в криптовалютах»: часть 1 и часть 2.


Критика Proof of Work


Как мы все помним, Proof of Work родился в далеком 1993 году в семье криптографов; родители прочили ему карьеру защитника от DoS и спама. Однако в 2008 году ему поступило заманчивое предложение от некоего анонима с япоским акцентом: стать основой для распределенного сервера меток времени. Схема представлялась простой: узлы сети «голосуют» за свою версию истории транзакций, вкладывая свои мощности в вычисление «редких» хешей. Версия, получившая большинство голосов, принимается другими узлами в качестве эталонной.

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

И это все изменило.
Читать дальше →
Всего голосов 25: ↑23 и ↓2+21
Комментарии6

RICE и ICE Scoring: простые техники приоритизации для продвинутых менеджеров продукта

Время на прочтение6 мин
Количество просмотров184K
Каждый менеджер продукта рано или поздно сталкивается с вопросом приоритизации при планировании стратегии и роадмапа продукта. Всегда ли просто и быстро можно решить над чем работать в первую очередь?

image

Product roadmap требует четкого порядка. Только качественно разложив все «по полочкам» можно получить достойный и успешный релиз продукта. В этом случае не обойтись без удобного способа приоритизации.

Качественная система определения приоритетов поможет рассмотреть каждую фичу или идею, каждый проект или задачу и последовательно объединить все эти факторы.
Читать дальше →
Всего голосов 16: ↑15 и ↓1+14
Комментарии0

Пошаговый запуск программы в Linux x86, или как добраться до main()?

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


Статья предназначена для тех, кто хочет понять процесс загрузки программ в Linux. В частности, здесь пойдет речь о динамической загрузке файлов ELF x86. На основе изложенной информации вы сможете лучше понять, как устранять проблемы, возникающие в программе еще до запуска main.
Читать дальше →
Всего голосов 60: ↑59 и ↓1+58
Комментарии10

Шаблон проектирования «Спецификация»

Время на прочтение4 мин
Количество просмотров62K
Предпринимая попытки постичь DDD вы наверняка натолкнетесь на этот паттерн, который часто тесно используется вместе с другим, не менее интересным, паттерном «Репозиторий». Этот паттерн предоставляет возможность описывать требования к бизнес-объектам, и затем использовать их (и их композиции) для фильтрации не дублируя запросы.

Пример


Давайте для примера спроектируем домен для простого группового чата: у нас будут три сущности: Группа и Пользователь, между которыми связь многие-ко-многим (один пользователь может находиться в разных группах, в группе может быть несколько пользователей) и Message представляющий собой сообщение, которое пользователь может написать в какой-либо группе:
Читать дальше →
Всего голосов 31: ↑26 и ↓5+21
Комментарии64

Зарплата разработчиков могла быть выше на 30%. Результаты исследования

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

На Хабре есть истории о том, как в Кремниевой долине на опционах становятся миллиардерами.

А что в России? Если на работе предлагают опцион, это плюс или минус? Мы опросили более 600 российских IT-специалистов от junior-уровня до тим-лидов, а также узнали мнения менеджеров и фаундеров российских компаний.

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

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

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

Функциональное программирование — это не то, что нам рассказывают

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

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



Хотя люди обычно признают удобства ФП фич, ведь намного приятнее писать:


int Factorial(int n)
{
    Log.Info($"Computing factorial of {n}");
    return Enumerable.Range(1, n).Aggregate((x, y) => x * y);
}

чем ужасные императивные программы вроде


int Factorial(int n)
{
    int result = 1;
    for (int i = 2; i <= n; i++)
    {
        result *= i;
    }
    return result;
}

Так ведь? С одной стороны да. А с другой именно вторая программа в отличие от первой является функциональной.


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

Читать дальше →
Всего голосов 267: ↑259 и ↓8+251
Комментарии795

Германия, или Туда и Обратно — 1

Время на прочтение14 мин
Количество просмотров67K
Почти два года назад, под Новый год, у меня зазвонил телефон.

После пары дежурных фраз «как сам, как дети» меня позвали работать в Германию.



Я крепко призадумался.

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

Итак, под бой курантов мы с супругой приняли решение: «Ехать!»

Кто хочет прочитать про мой увлекательный, но весьма субъективный опыт переезда в Германию — добро пожаловать под кат.
Читать дальше →
Всего голосов 153: ↑149 и ↓4+145
Комментарии728

Устранение дублирования Where Expressions в приложении

Время на прочтение4 мин
Количество просмотров21K
Допустим, у вас есть товары и категории. В какой-то момент клиент сообщает, что для категорий с рейтингом > 50 необходимо использовать другие бизнес-процессы. У вас достаточно опыта и вы понимаете, что где сегодня 50 завтра будет 127.37 и хотите избежать появления магических чисел в коде, поэтому делаете так:

    public class Category : HasIdBase<int>
    {
        public static readonly Expression<Func<Category, bool>> NiceRating = x => x.Rating > 50;

       //...
    }

    var niceCategories = db.Query<Category>.Where(Category.NiceRating);

К сожалению, этот номер не пройдет, если вы хотите выбрать продукты из соответствующих категорий, потому что NiceRating имеет тип Expression<Func<Category, bool>>, а в случае с Product нам потребуется Expression<Func<Product, bool>>. То есть, необходимо осуществить преобразование Expression<Func<Category, bool>> => Expression<Func<Product, bool>>.

    public class Product: HasIdBase<int>
    {
        public virtual Category Category { get; set; }

       //...
    }

    var niceProductsCompilationError = db.Query<Product>.Where(Category.NiceRating); // так нельзя!

К счастью, осуществить это довольно просто!
Код под катом
Всего голосов 22: ↑18 и ↓4+14
Комментарии82

Functional C#: Primitive obsession (одержимость примитивами)

Время на прочтение6 мин
Количество просмотров28K
Это вторая статья из миницикла статей про функциональный C#.

Читать дальше →
Всего голосов 24: ↑22 и ↓2+20
Комментарии49

Дюк, вынеси мусор! — 3. CMS и G1

Время на прочтение10 мин
Количество просмотров147K
Часть 3 - CMS GC и G1 GC

Сегодня мы продолжаем цикл статей о сборщиках мусора, поставляемых с виртуальной машиной Oracle Java HotSpot VM. Мы уже изучили немного теории и рассмотрели, каким образом с кучей расправляются два базовых сборщика — Serial GC и Parallel GC. А в этой статье речь пойдет о сборщиках CMS GC и G1 GC, первостепенной задачей которых является минимизация пауз при наведении порядка в памяти приложений, оперирующих средними и большими объемами данных, то есть по большей части в памяти серверных приложений.

Два этих сборщика объединяют общим названием «mostly concurrent collectors», то есть «по большей части конкурентные сборщики». Это связано с тем, что часть своей работы они выполняют параллельно с основными потоками приложения, то есть в какие-то моменты конкурируют с ними за ресурсы процессора. Конечно, это не проходит бесследно, и в итоге они разменивают улучшение в части пауз на ухудшение в части пропускной способности. Хотя делают это по-разному. Давайте посмотрим, как.
Посмотреть, как
Всего голосов 33: ↑31 и ↓2+29
Комментарии42

Дюк, вынеси мусор! — 2. Serial GC и Parallel GC

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


В предыдущей статье мы познакомились с терминологией и основными идеями, лежащими в основе сборщиков мусора Java HotSpot VM и многих других виртуальных машин. Теперь мы, наконец, можем взять в руки лопату и приступить к разгребанию нашей кучи. Сегодня у нас на обзоре две лопаты два сборщика мусора, используемые огромным количеством Java-программ, зачастую даже не подозревающих об этом. Это Serial GC и Parallel GC. Их популярность объясняется просто — данные сборщики выбираются виртуальной машиной по умолчанию для большинства аппаратных конфигураций.

Используемые в этих сборщиках подходы к работе с кучей в том или ином виде применяются в более продвинутых реализациях, поэтому на данном этапе нам будет очень важно разобраться с заложенными в них идеями и возможностями.
Интересно, хочу разобраться
Всего голосов 36: ↑36 и ↓0+36
Комментарии22

Дюк, вынеси мусор! — 1. Введение

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


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

Попробуем в нескольких статьях пройти путь от описания базовых идей, лежащих в основе всех сборщиков мусора, до разбора алгоритмов работы и возможностей тонкой настройки различных сборщиков Java HotSpot VM (вы ведь знаете, что таких сборщиков четыре?). И самое главное, рассмотрим, каким образом эти знания можно использовать на практике.
Узнать
Всего голосов 36: ↑36 и ↓0+36
Комментарии7

Анбоксинг в современной Java

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

Сейчас новые версии Java выходят раз в полгода. В них время от времени появляются новые возможности: var в Java 10, switch-выражения в Java 14, рекорды и паттерны в Java 16. Про это всё, конечно, написано множество статей, блог-постов, сделано множество докладов на конференциях. Оказалось, однако, что мы все пропустили один очень крутой апгрейд языка - апгрейд обычного цикла for по набору целых чисел. Дело в том, что этот апгрейд случился не в языке, а в виртуальной машине, но заметно поменял на то как мы можем программировать на Java.

Вспомним старый добрый цикл for:

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

Лямбды и анонимные классы: кто больше жрёт

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

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

Читать дальше →
Всего голосов 74: ↑69 и ↓5+64
Комментарии35

Шпаргалки Java программиста 9: Java SE — Шпаргалка для собеседований и повторений

Время на прочтение32 мин
Количество просмотров135K
Данная статья в первую очередь предназначена для подготовки к собеседованиям на позицию Java разработчика (на самом деле, это шпаргалка, которую я писал для себя в течении многих лет, и повторяю при каждом новом поиске работы).

Предполагается. что вы знакомы с многими функциями из Java SE, поэтому в основном информация дается кратко. Конечно, можно использовать эту статью и просто для обучения основам Java SE платформы (но в этом случае, после чтения статьи вам скорее всего придется обратиться к другим источникам).

image

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

Внимание: я не буду касаться вопросов по самому языку Java (вроде для чего нужно слово final или чем overriding отличается от overloading), это потребует отдельной статьи, это вопросы именно по Java SE (6-9) платформе.
Читать дальше →
Всего голосов 30: ↑28 и ↓2+26
Комментарии10

Шпаргалка Java программиста 1: JPA и Hibernate в вопросах и ответах

Время на прочтение36 мин
Количество просмотров568K
image

Знаете ли вы JPA? А Hibernate? А если проверить?

В чем смысл серии статей 'Шпаргалки Java программиста'
За время работы Java программистом я заметил, что как правило программисты постоянно и планомерно используют от силы 10-20% от возможностей той или иной технологии, при этом остальные возможности быстро забываются и при появлении новых требований, переходе на новую работу или подготовке к техническому интервью приходится перечитывать все документации и спецификации с нуля. Зато наличие краткого конспекта особенностей тех или иных технологий (шпаргалок) позволяет быстро освежить в памяти особенности той или иной технологии.




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

Поехали...
Всего голосов 37: ↑32 и ↓5+27
Комментарии16

Справочник по Java Collections Framework

Время на прочтение6 мин
Количество просмотров739K
Данная публикация не является полным разбором или анализом (не покрывает пакет java.util.concurrent). Это, скорее, справочник, который поможет начинающим разработчикам понять ключевые отличия одних коллекций от других, а более опытным разработчикам просто освежить материал в памяти.

Что такое Java Collections Framework?


Java Collection Framework — иерархия интерфейсов и их реализаций, которая является частью JDK и позволяет разработчику пользоваться большим количесвом структур данных из «коробки».

Базовые понятия


На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» (словари).

image
Читать дальше →
Всего голосов 36: ↑27 и ↓9+18
Комментарии21

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Software Developer, Backend Developer
Middle