Пишу на: Java/Kotlin (Spring/Hibernate/Reactor), иногда PHP (Symfony/Doctrine, Yii2)
Знаю, но почти не использую: Javascript/Typescript (React, Vue, jQuery)
БД: Oracle, Postgresql

Инструменты: Gradle, Git, IDEA, Vim
Контакты
Местоположение
Россия

Достижения

Все достижения (24)

Наибольший вклад в теги

Все теги (160)

Лучшие ответы пользователя

Все ответы (348)
  • Компания просит уволиться из текущего места работы перед собеседованием, нормально ли?

    @Akela_wolf
    Extreme Programmer
    То есть вам они ничего не гарантируют, но хотят чтобы вы уже уволились? Скорее всего попытаются прогнуть на условия оплаты или (что вероятнее) на условия работы. Потому что вы уже уволились, работа вам нужна уже сейчас, а значит вы будете сговорчивее. Собственно это сразу показывает отношение к персоналу в данной конторе - нагибать и ставить ультиматумы. Поэтому, лично я бы после такого предложения не раздумывая сказал бы "до свидания. Хотя нет, прощайте"

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

    @Akela_wolf
    Extreme Programmer
    Мощность блока питания - это максимальная мощность, которую он может выдать. Если подключить к вашему БП (85 Вт) потребителя, который требует 100 Вт - блок питания не справится с такой нагрузкой (как конкретно это проявится - зависит от схемотехники БП)

    Если же к нему подключить 60 Вт (да хоть 5 Вт) - это будет означать только то что БП работает "вполсилы", у него остается запас мощности т.к. не БП определяет сколько он "впихнет" в потребителя, а, наоборот, потребитель определяет сколько он "заберет" у источника питания. Поэтому резерв мощности никогда не может навредить потребителю. Из этого же, кстати, следует что заряжаться макбук быстрее не станет.
    Ответ написан
    4 комментария
  • Разница между if else и try catch?

    @Akela_wolf
    Extreme Programmer
    Есть такой принцип: "если убрать все обработчики исключений, программа должна нормально функционировать при условии ввода корректных данных" (Д.Томас, Э.Хант "Программист-прагматик"). Поэтому вопрос - является ли введенный пользователем нуль корректными данными? Если да - то его надо оборачивать в if. Если же это некорректные с точки зрения программы данные - то можно кидать исключение.

    То есть исключение должно выбрасываться при поступлении на вход программы некорректных данных. А какие именно данные считать некорректными - это определяет разработчик (или заказчик) программы.
    Ответ написан
    5 комментариев
  • Правильно ли я понял принцип инверсии зависимостей?

    @Akela_wolf
    Extreme Programmer
    Главная идея принципа инверсии зависимостей "детали зависят от абстракций, но не абстракции от деталей".
    В приведенном вами примере класс Main зависит от всего: от интерфейса INumberOperation и от обоих классов NumberOperation1, NumberOperation2. То есть тут принцип инверсии зависимостей вообще не работает. Никак.

    Проявляется же он в следующем примере. Пусть у меня есть некая абстрактная логика "прочитай число, выполни над ним операцию, запиши результат". Эта абстрактная логика (потому она и абстрактная) ничего не должна знать ни откуда она читает число, ни какую операцию над ним выполняет, ни куда и как записывает результат. Таким образом, у нас есть модуль, состоящий из
    interface NumberInput {
      int read();
    }
    interface NumberProcessor {
      int process(int a);
    }
    interface NumberOutput {
      void write(int a);
    }
    class Processor {
      private final NumberInput input;  
      private final NumberProcessor processor;
      private final NumberOutput output;
    
      public Processor(NumberInput input, NumberProcessor processor, NumberOutput output) {
        this.input = input;
        this.processor = processor;
        this.output = output;
      }
    
      void process() {
        output.write(processor.process(input.read()));
      }
    }

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

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

    Этот принцип очень хорошо объяснен в книге Р.Мартина "Чистая архитектура", по крайней мере у меня все встало на свои места именно после прочтения этой книги.
    Ответ написан
    1 комментарий
  • С чего начать изучение программирования школьнику?

    @Akela_wolf
    Extreme Programmer
    Насчет линукса. Да, на мой взгляд однозначно стоит. Опыт работы в линуксе даст тебе более глубокое понимание как функционирует операционная система, возможность заглянуть "под капот", увидеть на практике такую вещь как разные реализации одного и того же (например разные оконные менеджеры - суть у них одна, но каждый реализует это задачу разными путями). Поэтому советую что-нибудь "конфигурябельное", типа ArchLinux (Gentoo - это уже совсем-совсем хардкор, новичку с ней будет тяжко). Что касается повседневных задач - да нет там никаких непреодолимых трудностей, если не брать какую-то прям специфику. Браузер - есть. Просмотр видео, прослушивание музыки - есть. Работа с документами - есть. Работа с графикой и 3D-моделированием - есть. Игры - тоже есть, хоть иногда и с приколами (но сказано что игры не интересуют, поэтому не так важно).

    Насчет языка. Вообще язык программирования выбирают под задачу. Если хочется заниматься, например, системным программированием (драйверы, файловые системы, загрузчики, ядро ОС, виртуальные машины/гипервизоры, СУБД и пр.) - то это C/C++. Если хочется заниматься нейросетками - там хорош Питон. Фронтендом - без Javascript/Typescript сейчас никуда. Но если говорить об языке программирования общего назначения (на котором можно написать множество прикладных программ), то я рекомендовал бы следующие критерии:
    • Статически типизированный. Особенно важно, на мой взгляд, в начале обучения, так как закладывает базу - навык писать код строго. Динамически типизированные языки, такие как PHP, Python, Javascript и пр. позволяют программисту писать код "как попало", что чревато трудноуловимыми ошибками, формируют "плохие привычки", которые потом будут мешать.
    • Поощряющий декларативный (функциональный) стиль программирования. Функциональный стиль программирования сейчас набирает популярность, так как позволяет писать более сложные программы и проще тестировать их по отдельным частям.
    • Кроссплатформенность. То есть возможность создавать программы для Windows, Linux, MacOS, Android и т.д. Это не столько про язык сам по себе, сколько про его окружение - наличие кроссплатформенных библиотек и инструментов для разработки.
    • Востребованность. Ну тут все просто - учить, например, Паскаль сейчас вряд ли целесообразно - реальную разработку на нем практически не ведут. Поэтому лучше изучать что-то с чем потом будешь сталкиваться на практике (в чужих проектах) и с которым легче будет найти единомышленников чтобы совместно разрабатывать большие проекты. И, в перспективе, строить карьеру в этой области.

    Итак, смотрим что у нас есть на этот счет:
    1. C/C++. Статически типизированный и довольно строгий. Очень сложный. На нем можно писать программы в любом стиле, включая метапрограммирование. Кроссплатформенный до жути. Позволяет решать задачи, максимально близко к "железу". Востребован ограниченно. Уникальная ниша - системное программирование и программирование микроконтроллеров. В силу его очень большой сложности - лично я не рекомендую.
    2. Javascript/Typescript. Динамически типизированный (у Typescript есть статическая типизация, но с приколами унаследованными от Javascript). Поддерживает как императивное, так и декларативное программирование. В первую очередь предназначен для браузеров, хотя сейчас есть кроссплатформенная платформа node.js. Востребован в первую очередь на фронте. Так что к нему стоит сразу присоединять в плане обучения HTML/CSS и какой-нибудь фронтовый фреймворк: Angular/React/Vue и т.п. Также пригоден для написания бэкэнда (node.js), десктопных приложений (Electron), мобильных приложений (React Native). Перспективное направление, но лично я не рекомендовал бы как первый язык из-за определенного бардака в экосистеме. В этом направлении легко нахвататься "плохих привычек".
    3. С#. Статически типизированный, поддерживает декларативное программирование, имеет реализацию для Linux (Mono), но в целом заточен на Windows. Вполне востребован, в частности используется в Unity (движок для разработки игр). Насчет него не имею личного мнения, так как не использую в своей работе.
    4. Java. Статически типизированный, поддерживает декларативное программирование, запускается на всем где есть JVM (включая Android). Write once, run anywhere. Востребован в основном в суровом энтерпрайзе, в больших проектах для серьезного бизнеса. Также применяется в вебе.
    5. Kotlin. Улучшенная Java, разработка фирмы jetBrains. Статически типизированный, очень хорошо поддерживает декларативное программирование. Позволяет легко писать асинхронный код (корутины). Запускается там же где и Java (так как использует ту же JVM), плюс имеет возможность компиляции в JavaScript и в native код для Windows/Linux/MacOS. Kotlin для JVM - вполне зрелое решение, Kotlin Multiplatform - пока еще нет, но быстро развивается. Является официальным языком для разработки под Android. Востребован пока не очень (в основном в области мобильной разработки), но его популярность растет и он начинает теснить Java в её традиционном сегменте. В перспективе может стать языком способным охватить большую часть сфер прикладного программирования: backend, frontend, десктопные и мобильные приложения. На мой взгляд - перспективно.
    6. Scala. Еще одна улучшенная Java. Статически типизированный, очень хорошо поддерживает декларативное программирование. Кроссплатформенный как и Java (сейчас вроде появился компилятор в JS, как и Котлина). Сложный. Очень легко написать конструкции в которых "без поллитры не разберешься". В силу сложности востребован мало. Есть уникальные фичи, но не так много по сравнению с Котлином (большая часть реально востребованных фич Скалы в Котлине есть). Ознакомиться в перспективе стоит, рекомендовать как основной язык не буду.
    7. Haskell. Статически типизированный, декларативный язык (не просто поддерживает декларативное программирование - на нем сложно писать иначе). Кроссплатформенный. Востребован в специфических областях. С моей точки зрения - король функционального программирования и в силу этого сложный (математические абстракции в полный рост). Ознакомиться также стоит, просто чтобы почувствовать всю мощь функционального программирования - мозг переворачивает очень хорошо и позволяет глубже понимать другие языки. Как основной язык - рекомендовать не буду.
    8. Python. Динамически типизированный, поддерживает декларативное программирование, кроссплатформенный. Вполне востребован в вебе, в научных исследованиях (нейросети). Опыта работы с ним имею мало, но рекомендовать бы не стал из-за динамической типизации.
    9. PHP. Динамически типизированный, поддерживает декларативное программирование, кроссплатформенный. Весьма востребован, но практически только в вебе (разработка сайтов). Очень низкий порог вхождения, из-за чего очень много плохого кода (хотя сейчас появились достойные фреймворки - Symfony, Laravel, Doctrine и т.д.). Как язык для изучения - не рекомендую.

    Конечно есть и другие языки, которые я не упомянул в силу того что не знаком (или плохо знаком) с ними.
    Из приведенного списка я бы в первую очередь выделил C#, Typescript, Kotlin. Мой личный выбор на данном этапе карьеры - Котлин, но думать, сравнивать и выбирать, разумеется, вам.

    Еще в перспективе стоит познакомиться с такой темой как СУБД и язык запросов SQL. В вебе, как я уже писал, пригодится HTML/CSS. Ну и далее конкретные специфичные вещи, подбираемые уже под конкретную задачу.

    Теперь о книгах. Книги по языкам рекомендовать не буду. Но назову несколько книг, которые, по моему мнению, обязательно стоит прочитать любому программисту:
    1. Э. Хант, Д. Томас. Программист-прагматик
    2. Р. Мартин. Чистый код.
    3. По мере набора опыта: Р. Мартин. Чистая архитектура
    4. При желании стать профессиональным программистом: Р. Мартин. Идеальный программист
    5. Сложная, но тем не менее умная книга: С. Макконнелл. Совершенный код

    Это то что пригодится в любом случае. А дальше - все зависит от выбранного языка и области его использования.
    Ответ написан
    12 комментариев

Лучшие вопросы пользователя

Все вопросы (9)