• Какими наводящими вопросами деликатно определить, процветает ли в компании микроменеджмент либо нет?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Прямо спрашиваешь, кто будет давать мне задачи и кто будет контролировать.
    Есть ли почасовой контроль какими-либо инструментами.

    Ваш вопрос про "какая оплата" - ВООБЩЕ не про это.
    Может быть даже, что в компании может быть несколько проектов/команд и на какой-то одном проекте сидит "эффективный" менеджер, который увлекается микроменеджментом.
    Ответ написан
    Комментировать
  • Стоит ли идти в Embedded разработку?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Идти надо туда, чем интересно заниматься. Тем более, что в каждой области свои проблемы. У кровавого энтерпрайза может и красивые офисы на 37-м этаже, но из них тоже хочется выйти в окно. Как мне кажется, сейчас как раз такое время, когда спрос на железячников может сильно возрасти, а как следствие, и условия работы улучшатся.
    Ответ написан
    Комментировать
  • Есть ли статьи, которые приводят наглядные примеры того, как код на rust превосходит код на других языках?

    vabka
    @vabka
    Токсичный шарпист

    Особенно там, где был использован язык Си или С++

    (если исключить memory safety и fearless concurrency)
    1. Хороших плюсовиков найти всё сложнее, ибо молодые разработчики часто хотят что-то более современное/простое/приятное.
    2. Переход с какого-нибудь более высокоуровнего языка на Rust гораздо легче, чем на C++
    3. DX у Rust на порядо лучше.
    4. Код на Rust на порядок более выразительный, чем код на Си

    За счёт этого поддержка кодовой базы на Rust заметно дешевле выходит

    Например вот что Тинькофф пишет:

    Наш Процессинговый Центр занимается разработкой финансовых систем, критичных к даунтайму и времени обработки. Изначально мы делали все свои продукты либо на чистом Си, либо на плюсах (C++14), однако пару лет назад мы переписали большой кусок нашего бэкенда на Rust, и нам настолько понравилось, что теперь все наши новые процессинговые сервисы пишутся на нём.



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

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


    ну тут все-равно unsafe

    В проектах на Rust он явный и от него можно избавиться, завернув в безопасную обёртку, которая будет гарантировать корректную работу с памятью и ffi.
    В проектах на C++ у тебя по факту всё является unsafe.

    ну, нам еще нужен подсчет ссылок

    В плюсах тоже активно пользуются подсчётом ссылок и всякими умными указателями, если по коду не очевидно, когда можно будет освободить память
    Ответ написан
    6 комментариев
  • Как поддерживать модули, которые используются сразу в нескольких внешних приложениях?

    @Drno
    Ну так клонируйте модули. В отдельные, с доработками
    Чтоб не пересекались
    Ответ написан
    2 комментария
  • Почему нельзя в качестве результата match сделать impl Trait?

    ozkriff
    @ozkriff
    Rust э̶н̶т̶у̶з̶и̶а̶с̶т сектант, хобби игродел
    Потому что impl-trait это статический полиморфизм, работающий через мономорфизацию - т.е. при компиляции из абстратного дженерика через подстановку конкретных типов будет сгенерированно сколько-то конкретных версий функции.

    Если зачем-то нужен ржавый фабричный метод, то, как вариант, можно перейти на динамическую диспечеризацию:

    fn create(value: u8) -> Box<dyn C> {
        match value {
            0 => Box::new(A {}),
            1 => Box::new(B {}),
            _ => Box::new(A {}),
        }
    }
    Ответ написан
    3 комментария
  • Почему типы полей структуры в качестве указателя не соответствуют своим размерам в памяти (target wasm32)?

    Vindicar
    @Vindicar
    RTFM!
    Выравнивание по 32 бита.
    Некоторые архитектуры процов вообще требуют, чтобы целое размером N байт имело адрес кратный N.

    Для других это не обязательно, но доступ по адресам, кратным разрядности, быстрее. Так что компиляторы часто вставляют неиспользуемые байты в структуру, чтобы подвинуть следующее поле на "удобный" адрес. В плюсах (а может и в си) вроде есть директива #pragma pack, которая эти м управляет. Насчёт раста не знаю.
    Ответ написан
    3 комментария
  • Как получить буфер линейной памяти wasm модуля из WebWorker без его копирования?

    @desocrew
    Действительно, вы не можете передать ArrayBuffer, который используется внутри WebAssembly, через postMessage() с опцией transfer. Это происходит потому, что в этом случае браузер пытается оторвать буфер от исходного контекста и присоединить его к новому контексту (в данном случае, от worker'а к основному потоку). Однако ArrayBuffer, связанный с памятью, используемой внутри WebAssembly, не может быть оторван и перенесен в другой контекст.

    Есть несколько вариантов, как можно передать данные между основным потоком и worker'ом без копирования.

    1. Использовать SharedArrayBuffer вместо ArrayBuffer. Однако, как вы уже заметили, у SharedArrayBuffer есть ограничения на использование в некоторых браузерах. Кроме того, не все платформы поддерживают SharedArrayBuffer (например, некоторые мобильные устройства iOS). Чтобы использовать SharedArrayBuffer в вашем случае, вы можете создать его в основном потоке и передать его в worker через postMessage(). Затем вы можете использовать этот SharedArrayBuffer внутри вашего WebAssembly модуля.

    2. Вы можете использовать Transferable Objects для передачи данных без копирования. В вашем случае, если память внутри WebAssembly модуля уже инициализирована, вы можете передать указатель на начало памяти через Transferable Objects. Например:

    Основной поток:
    const mem = instance.exports.memory.buffer;
    const ptr = instance.exports.getPixelDataPtr();
    worker.postMessage({mem, ptr}, [mem]);

    Web Worker:
    self.onmessage = (event) => {
      const {mem, ptr} = event.data;
      const pixels = new Uint8Array(mem, ptr, numPixels * 4);
      // делаем что-то с пикселями
    }

    В этом случае, вы передаете указатель на начало памяти вместе с буфером, но не копируете саму память. Вы можете использовать TypedArray для доступа к данным в памяти. Обратите внимание, что в вашем WebAssembly модуле должна быть функция, которая возвращает указатель на начало памяти, который вы можете передать в worker.

    Однако, если вы измените данные в памяти на стороне worker'а, эти изменения не будут отражены в памяти, используемой внутри WebAssembly модуля.
    Ответ написан
    1 комментарий
  • Как изменить данные завернутые в Box, который завернут в Option?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых стоит познакомится с такой конструкцией, как if let.
    Но здесь, с Box, у Вас не получится обойти borrow checker.
    Нормальным решением будет использовать счетчики ссылок (Rc или Arc) и избавиться с их помощи от зависимости на лайфтаймы. А для ссылки на parent нужно использовать Weak ссылку, чтоб она не влияла на подсчет ссылок.

    https://doc.rust-lang.org/std/rc/struct.Rc.html
    https://doc.rust-lang.org/std/rc/struct.Weak.html

    https://doc.rust-lang.org/std/sync/struct.Arc.html
    https://doc.rust-lang.org/std/sync/struct.Weak.html

    use std::rc::{Rc, Weak};
    
    pub struct Node {
        parent: Weak<Node>,
        data: u32,
        pub left: Option<Rc<Node>>,
        pub right: Option<Rc<Node>>,
    }
    
    #[derive(Debug)]
    pub struct SetChildError;
    
    impl Node {
        pub fn new(data: u32) -> Self {
            Self {
                parent: Weak::new(),
                data,
                left: None,
                right: None,
            }
        }
    
        pub fn set_left(self: &mut Rc<Self>, mut child: Rc<Self>) -> Result<(), SetChildError> {
            let child_mut = Rc::get_mut(&mut child).ok_or(SetChildError)?;
            child_mut.parent = Rc::downgrade(self);
    
            let self_mut = Rc::get_mut(self).ok_or(SetChildError)?;
            self_mut.left = Some(child);
    
            Ok(())
        }
    }
    Ответ написан
    5 комментариев
  • Почему wasm код не генерируется при компиляции rust кода с сырыми указателями?

    bingo347
    @bingo347
    Crazy on performance...
    Начну пожалуй с того, что в первом примере у Вас UB (undefined behavior):
    #[no_mangle]
    pub fn test() {
        // Вот тут на стеке выделено 4 байта
        let mut idx: i32 = 10;
        // Указатель на эти 4 байта
        let ptr = &mut idx as *mut i32;
    
        // По сути указатель на те же 4 байта, но на деле указатель на 40 байт
        let buffer = unsafe { core::slice::from_raw_parts_mut(ptr, 10) };
    
        // И тут мы работаем с этими 40 байтами,
        // но нормальные из них только 4 байта в начале,
        // а остальные смотрят в глубь стека и меняют его
        // то есть перетирают адрес возврата и данные на стеке вызвавшей функции
        for pixel in buffer.iter_mut() {
            *pixel = 0x7d2b7500;
        }
    }
    То есть после завершения данная функция должна не вернуться в вызывающую функцию, а передать управление непонятно куда.

    Ну и еще один момент, это оптимизация, данная функция не имеет сайд эффектов и ничего не возвращает. После инлайна функции core::slice::from_raw_parts_mut и метода Iterator::iter_mut компилятор вполне может понять, что данный код не имеет сайд эффектов, а значит бесполезен и его можно вырезать. Вот собственно он его и вырезает.
    Во втором же примере у нас есть сайд эффект - изменение данных по указателю пришедшему извне через аргументы.

    P.S. Во втором примере кстати тоже можно увидеть работу оптимизации, цикл из 10 итераций, пишущих i32 в смещение по указателю, был заменен на обычные 5 записей i64 в смещение по указателю.
    Ответ написан
    1 комментарий
  • Как организована отрисовка ui в dos?

    vabka
    @vabka
    Токсичный шарпист
    Если я не туплю, то на скринах целиком в виде текста всё отрисовано. Только не могу понять, как имитация тени под кнопками сделана.

    Шрифт везде один и он моноширный. Меняется только цвет + используются всякие символы для псевдографики (треугольники, линии и тд)
    Ответ написан
    4 комментария
  • Как организована отрисовка ui в dos?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Насколько я помню (могу ошибаться, дело было лет так тридцать назад, в 1993 году), в досе текстовый экранный буфер находится по адресу B800:0000. Там он идет топорно просто - байт символ, байт атрибут, байт символ, байт атрибут. Атрибут - это цвет символа, цвет фона, яркость, мигание. Извращался я будь здоров, помнится.

    Во даже чего нашел - структура байта атрибута! Файлик - 1995 года :)
    F_BLACK  equ   0
    F_BLUE   equ   1
    F_GREEN  equ   2
    F_CYAN   equ   3
    F_RED    equ   4
    F_MAG    equ   5
    F_BROWN  equ   6
    F_LGRAY  equ   7
    F_INTENS equ   8
    F_YELLOW equ  0Eh
    F_WHITE  equ  0Fh
    B_BLACK  equ   0
    B_BLUE   equ  10h
    B_GREEN  equ  20h
    B_CYAN   equ  30h
    B_RED    equ  40h
    B_MAG    equ  50h
    B_BROWN  equ  60h
    B_LGRAY  equ  70h
    B_BLINK  equ  80h
    Ответ написан
  • Как организовать массив состоящий из разных участков памяти?

    @VitalyChaikin
    Во втором массиве хранить смещение элементов первого массива;
    mov bx, Mass2[ i ] ; Получаем offset элемента 
    mov ax, Mass1[bx] ; Получаем значение элемента в ax
    Ответ написан
    Комментировать
  • Как организовать массив состоящий из разных участков памяти?

    @rPman
    От задачи.
    Если тебе нужна скорость, то придется пожертвовать памятью и создать массив указателей на элементы (т.е. в твоем примере это массив указателей на элементы с индексом 2,3,6,7,8,10).

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

    Особенно грустно, если структура кусков и размер массива будет меняться. Первый подход сильно все упростит
    Ответ написан
    1 комментарий
  • Стоит ли делать книжку на заказ из iso стандарта?

    @rPman
    Мое мнение, бумажная литература, особенно техническая, невероятно неудобна! потому что нет возможности сделать поиск.

    Единственное достоинство бумажной книги, относительная дешевизна при высоком качестве (сопоставимое качество потребует достаточно дорогое устройство, хорошо когда оно есть, но это редкость), а еще очень часто технические документы по историческим причинам доступны только в pdf варианте (не для it области, спасибо), такие документы даже на 14" планшетнике читать не всегда комфортно (очень мелко все будет если меньше размеры экрана). А благодаря заградительно высоким ценам на eink экраны, приятных глазу читалок с большим экраном тупо мало (дорого).
    Ответ написан
    4 комментария
  • Насколько долгосрочна в обучении мотивация знать чего-то такое, чего не умеют другие?

    @super_lamer
    Лично мое мнение. Мотивации тут быть не может. У тебя есть любимое дело, мое например много кушать. И вот существуют миллиарды людей которые едят по тому что приходится, а у кого гастрит и они проклинают это дела, а мне приходится не давать себе есть. Так же должно быть и с программированием, оно должно тебе настолько нравиться что ты отрывать себя должен от этого занятия. И естественно в таком случае ты пройдешь путь "как все", и автоматически станешь знать то что мало кто знает...
    Ответ написан
    Комментировать
  • Насколько долгосрочна в обучении мотивация знать чего-то такое, чего не умеют другие?

    paran0id
    @paran0id
    Умный, но ленивый
    Знаете, поначалу многие хотят странного. Освоить FreeBSD, с нуля стать хакером, написать социальную сеть на ассемблере, первым автомобилем взять дедову Победу, научиться играть Цоя на гитаре, но чтоб на десятиструнной и без ладов.

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

    Знания "не для всех" придут с опытом. Кстати, совсем не обязательно, что эти знания будут ценными и полезными. Вы вполне можете слить лет пять на доскональное изучение какой-то местечковой фигни, которая нигде и никому больше не нужна.
    Ответ написан
    8 комментариев
  • Какие есть узкие, но востребованные специализации в программировании?

    afiskon
    @afiskon
    Помните, что вам предстоит проводить на работе примерно треть своей жизни (и еще примерно треть будете тратить на сон). Поэтому занимайтесь тем, что нравится. И станьте в этом специалистом.
    Ответ написан
    Комментировать
  • Почему у многих разработчиков общепринятое отрицательное отношение к работе в топовых больших компаниях (по крайней мере в России)?

    php666
    @php666
    PHP-макака
    Чем вызвана такая реакция?
    банальные вы@боны.
    в топовых компаниях всегда лучше, чем в зао "рога и копыта"
    гугли в яндексе "Выбор правильного места работы или как работая программистом не умереть от инфаркта" - я там описал почему в больших компаниях лучше.
    Ответ написан
    1 комментарий
  • Почему у многих разработчиков общепринятое отрицательное отношение к работе в топовых больших компаниях (по крайней мере в России)?

    @taktik
    Sr. QA automation | SDET
    Был опыт работы в корпорации из топ 10 IT-работодателей. Главными минусами для меня были узкая зона ответственности, поток тривиальных задач, которые не давали никакого горизонтального роста и отсутствие пространства для вертикального роста.

    На мой взгляд, крупные компании подходят тем, кто просто хочет просто выполнять свою несложную работу и получать хорошие деньги. Людям, которые хотят решать интересные задачи или имеют амбиции для быстрого вертикального роста, лучше идти в компании поменьше.
    Ответ написан
    2 комментария
  • Почему у многих разработчиков общепринятое отрицательное отношение к работе в топовых больших компаниях (по крайней мере в России)?

    opium
    @opium
    Просто люблю качественно работать
    Потому что не у всех амбиции заканчиваются на уровне винтика в системе
    Ответ написан
    Комментировать