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

Java разработчик

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

Особенности распределения фонда оплаты труда в больших предприятиях РФ

Время на прочтение33 мин
Количество просмотров85K
Оказывается, в свободном доступе есть интересная информация от HeadHunter о повышении фонда оплаты труда (ФОТ) в 2015 году. Со страницы проекта "Банк данных заработных плат" идет ссылка "Сравнивайте зарплаты вашей компании с рынком".

Прямая ссылка на pdf: Зарплаты в России. Итоги 2015 года.


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

И вообще, многим придут на ум уже затертые шаблоны:
  • Надо не завидовать, а больше работать, и станешь таким же высокооплачиваемым топ-менеджером.
  • Не нравится – уходи и работай на себя / аутсорсь за валюту на западные компании / переезжай в другие страны.


Но эти выводы и советы слишком уж лежат на поверхности.
We need to go deeper.
Давайте посмотрим, насколько же глубока эта не кроличья нора…
Читать дальше →
Всего голосов 100: ↑89 и ↓11+78
Комментарии156

Ищем замену Digital Ocean среди отечественных хостинговых компаний

Время на прочтение14 мин
Количество просмотров73K
Я поклонник виртуальных серверов, так как в большинстве случаев они дают больше свободы и возможностей чем классический виртуальный хостинг и при этом удобнее в эксплуатации по сравнению с выделенными серверами.
Всего три года назад практически не было альтернативы виртуальным серверам от Digital Ocean. В России аналогичных сервисов практически не было. А цены на зарубежные предложения начинались с 5 долларов США в месяц, что в пересчёте по тогдашнему курсу составляло около 150 рублей и было сравнимо с обычным хостингом. Однако, когда доллар и евро подскочили в цене в два раза пользоваться услугами зарубежных провайдеров стало весьма накладно.
Читать дальше →
Всего голосов 37: ↑33 и ↓4+29
Комментарии103

Становимся профессиональными PHP разработчиками. Часть 3: Работа в команде

Время на прочтение4 мин
Количество просмотров11K
Предлагаю вашему вниманию перевод третьей части цикла статей «Becoming PHP professional».
Первая часть. «Недостающее звено»
Вторая часть. «Важность других людей»

Поскольку мы уже обсудили общий курс по достижению уровня «среднячок» в сфере РНР разработки, а также роль окружающих людей, в этой статье мы сфокусируемся на социальных аспектах работы в команде и инициативе. Эта статья послужит вступлением к следующей, где мы углубимся в это понятие.
Важно заметить, что когда я говорю «работа в команде», я не имею в виду только большие команды – корпорации или компании, где вы всего лишь на вторых ролях. Командой может быть также группа фрилансеров, работающих над проектом – находясь рядом или удаленно. Когда вы работаете с кем-то над чем-либо, вы – команда. Небольшая, но, тем не менее, команда.

Читать дальше →
Всего голосов 12: ↑6 и ↓60
Комментарии5

Коллекции в Java: о чём многие забывают

Время на прочтение6 мин
Количество просмотров141K
Из опыта code-review и ответов на StackOverflow набралось немало моментов, касающихся Java Collections API, которые мне казались очевидными, но другие разработчики о них почему-то не знали или знали, но не чувствовали уверенности их применять. В этой статье я собираю в общую кучу всё, что накопилось.

Содержание:


  1. List.subList
  2. PriorityQueue
  3. EnumSet и EnumMap
  4. Set.add(E) и Set.remove(E) возвращают булево значение
  5. Map.put(K, V), Map.remove(K), List.set(idx, E), List.remove(idx) возвращают предыдущий элемент
  6. Map.keySet() и Map.values()
  7. Arrays.asList может быть ключом
  8. Collections.max
  9. LinkedList, Stack, Vector, Hashtable
Читать дальше →
Всего голосов 58: ↑57 и ↓1+56
Комментарии37

Spring MVC/Security, REST, Hibernate, Liquibase запускаем в две строки

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

Современные системы сборки позволяют полностью автоматизировать процесс компиляции и запуска приложения из исходников. На целевой машине необходим лишь JDK, все остальное включая и сам сборщик загрузится налету. Надо лишь правильно построить процесс сборки и по запуску двух команд получить, например, следующее: запуск базы данных, выполнение SQL скриптов, компиляцию Java, Javascript и CSS файлов, запуск контейнера сервлетов. Реализуется это с помощью Gradle, HSQLDB, Liquibase, Google closure compile и Gretty. Подробнее в статье.
Читать дальше →
Всего голосов 9: ↑8 и ↓1+7
Комментарии8

FP на Scala: Что такое функтор?

Время на прочтение15 мин
Количество просмотров32K
Специалист, приступающий к изучению функционального программирования, сталкивается как с неоднозначностью и запутанностью терминологии, так и с постоянными ссылками на «серьезную математику».

В этой статье, не используя теорию категорий с одной стороны и эзотерические языковые механизмы Scala с другой стороны, рассмотрены два важнейших понятия
  • ко-вариантный функтор
  • контра-вариантный функтор
которые являются стартовой точкой для понимания всего множества категориальных конструкций, куда можно включить
  • Exponential (Invariant) Functor, BiFunctor, ProFunctor
  • Applicative Functor, Arrow, Monad / Co-Monad
  • Monad Transformers, Kleisli, Natural Transformations

Объяснено происхождение категориальной терминологии, указана роль языковых механизмов в реализации категориальных абстракций и рассмотрено несколько ковариантных (Option, Try, Future, List, Parser) и контравариантных (Ordering, Equiv) функторов из стандартной библиотеки Scala.

Первая статья в «категориальной серии»:
  1. FP на Scala: что такое функтор?
  2. FP на Scala: Invariant Functor

Если Вы желаете сильнее погрузиться в мир Scala, математики и функционального программирования — попробуйте онлайн-курс «Scala for Java Developers» (видео + тесты, всего за 25% цены!).


Читать дальше →
Всего голосов 25: ↑24 и ↓1+23
Комментарии7

Работа в офисе? Нет пути

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


Я - фрилансер

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

Поэтому фрилансеры очень редко ходят на собеседования. За более чем 10 лет своего профессионального стажа я был на собеседованиях 4 (четыре) раза, включая вчерашнее.

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

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

Однако, было поставлено условие — работа только в офисе. Никакой удалёнки.

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

Я постараюсь рассказать, почему удалённая работа — это особенный статус, от которого очень сложно отказаться.
Читать дальше →
Всего голосов 63: ↑57 и ↓6+51
Комментарии239

Потоковая обработка данных при помощи Akka

Время на прочтение5 мин
Количество просмотров39K
Привет, Хабр! Все привыкли ассоциировать обработку больших данных с Hadoop (или Spark), которые реализуют парадигму MapReduce (или его расширения). В этой статье я расскажу о недостатках MapReduce, о том, почему мы приняли решение отказываться от MapReduce, и как мы приспособили Akka + Akka Cluster на замену MapReduce.


Читать дальше →
Всего голосов 47: ↑44 и ↓3+41
Комментарии50

93 видео-лекции по Scala

Время на прочтение4 мин
Количество просмотров38K
В ходе подготовки спецкурса «Scala for Java Developers» под платформу онлайн-обучения UDEMY, я анализирую другие «лекционные» видео. В библиотеке накопилось какое-то количество ссылок на дельных учебные материалы по Scala (видео на английском).

Для большинства видео указано количество просмотров. Надо сделать несколько замечаний:
1. Количество просмотров не является главным критерием качества и полезности видео, но этот может служить каким-то указателем на ценность.
2. Здесь не все популярное видео, что я встречал, а лишь то, что ценно по моему личному мнению.
3. Если кто-то знает еще хорошее видео — пишите, добавлю в списки.


Читать дальше →
Всего голосов 21: ↑19 и ↓2+17
Комментарии5

«Перегрузка операторов» в Scala

Время на прочтение14 мин
Количество просмотров17K
Некоторое время назад я анонсировал курс по Scala. Он стартовал и выкладывается на MOOC-платформу UDEMY — «Scala for Java Developers». Больше о курсе вы можете прочитать в конце статьи.

Сейчас я бы хотел представить материал по одной из тем курса — перегрузке операторов в Scala.



Читать дальше →
Всего голосов 21: ↑19 и ↓2+17
Комментарии28

Исследование андроид-вируса

Время на прочтение13 мин
Количество просмотров105K
Всем привет. Недавно мне valdikss рассказал об андроид-вирусе, который может немало навредить пользователю, если он недостаточно внимателен. Мне захотелось узнать его внутренности, т.к. более или менее в последнее время занимаюсь ресерчем андроид приложений, но вирусы никогда еще не исследовал. До его рассмотрения, мне сразу бросилось в глаза название файла — android_update-1.apk. Первым делом делаю то, что делает каждый андроид ресерчер — распаковывает его dex2jar-ом (ну и параллельно можно посмотреть WinRAR-ом список файлов).

dex2jar


Когда я распаковал файл dex2jar-ом у меня получился красивый jar. Я обрадовался и кинулся смотреть его в JD-GUI.

image

Но, к сожалению, JD-GUI не смог полностью декомпильнуть получившийся файл, зато в самом конце файла были интересные строки.
Читать дальше →
Всего голосов 66: ↑59 и ↓7+52
Комментарии71

Разработка микросервисов с использованием Scala, Spray, MongoDB, Docker и Ansible

Время на прочтение7 мин
Количество просмотров31K
Цель данной статьи — показать возможный подход для построения микросервисов с использованием Scala, RESTful JSON, Spray и Akka. В качестве базы данных мы будем использовать MongoDB. В результате нашей работы мы упакуем наш проект в Docker-контейнер, а Vagrant и Ansible позволит нам управлять конфигурацией приложения.

В этой статье вы не найдете подробностей о языке Scala и других технологиях, которые будут использоваться в проекте. В ней вы не найдете руководства, которое ответит на все ваши вопросы. Цель статьи — показать технику, которую можно использовать при разработке микросервисов. На самом деле, большая часть этой статьи не завязана на конкретной технологии. Docker имеет более широкую сферу использования, нежели только микросервисы. Ansible позволяют быстро развернуть любое требуемое окружение, а Vagrant — отличный инструмент для создания виртуальных машин.
Читать дальше →
Всего голосов 35: ↑32 и ↓3+29
Комментарии8

Компиляция вложенных классов: javac и ecj

Время на прочтение7 мин
Количество просмотров13K
Как известно, в языке Java существуют вложенные (nested) классы, объявленные внутри другого класса. Их даже четыре разновидности — статические вложенные, внутренние (inner), локальные (local) и анонимные (anonymous) (в этой статье мы не затрагиваем лямбда-выражения, появившиеся в Java 8). Всех их объединяет одна интересная особенность: виртуальная машина Java не имеет понятия об особенном статусе этих классов. С её точки зрения это обычные классы, расположенные в том же пакете, что и внешний класс. Вся работа по преобразованию вложенных классов в обычные ложится на компилятор. И здесь любопытно посмотреть, как разные компиляторы с ней справляются. Мы посмотрим на поведение javac 1.8.0.20 и компилятора ecj из Eclipse JDT Core 3.10 (идёт в комплекте с Eclipse Luna).
Читать дальше →
Всего голосов 18: ↑18 и ↓0+18
Комментарии10

Физические и функциональные объекты (Продолжение)

Время на прочтение9 мин
Количество просмотров23K
Есть три способа описания процесса:







Чем они отличаются?

Описание сущего


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



Природа пространства-времени


Начнем с того, что воспринимаемый нами мир – это четырехмерное пространство-время. Но не то пространство-время, которое используют математики в своих рассуждениях. Скорее это то пространство, которое используют физики. Разница в том, что в физическом мире нет точек. Есть объекты, которые с точки зрения наблюдателя можно считать точечными. Но при ближайшем рассмотрении эти точки могут рассматриваться как бесконечные пространства. Мы часто не различаем воспринимаемый нами мир и математическую абстракцию, созданную для описания этого восприятия. В абстракции, созданной для описания воспринимаемого мира, есть понятие точка. В реальном мире нет точек. В этом огромная разница между моделируемым миром и его моделью. В неразличении этих двух сущностей кроется причина части холиваров, возникших на основе предыдущей статьи. Например, мы не способны воспринять срез пространственно-временного континуума поперек временной оси, как нам предлагает поступить ИСО 15926, для определения понятия событие. Поэтому далее я продолжу рассуждения, не отвлекаясь на такие понятия как точки, срезы пространственно-временного континуума и прочие абстрактные объекты. Мы будем работать только с реально воспринимаемыми нами объектами 4-Д пространства-времени.
Читать дальше →
Всего голосов 16: ↑12 и ↓4+8
Комментарии79

Пишите компараторы правильно

Время на прочтение5 мин
Количество просмотров149K
В Java для введения порядка среди определённых объектов можно написать компаратор — класс, содержащий функцию compare, которая сравнивает два объекта. Альтернативой компаратору является естественный порядок объектов: объект реализует интерфейс Comparable, который содержит метод compareTo, позволяющий сравнить этот объект с другим. Сравнивающая функция должна вернуть 0, если объекты равны, отрицательное число (обычно -1), если первый объект меньше второго, и положительное число (обычно 1), если первый больше. Обычно реализация такой функции не представляет сложностей, но имеется один случай, о котором многие забывают.

Сравнение используется различными алгоритмами от сортировки и двоичного поиска до поддержания порядка в сортированных коллекциях вроде TreeMap. Эти алгоритмы завязаны на три важных свойства сравнивающей функции: рефлексивность (сравнение элемента с самим собой всегда даёт 0), антисимметричность (сравнение A с B и B с A должны дать разный знак) и транзитивность (если сравнение A с B и B с C выдаёт одинаковый знак, то и сравнение A с C должно выдать такой же). Если сравнивающая функция не удовлетворяет этим свойствам, алгоритм может выдать совершенно непредсказуемый результат. Причём скорее всего вы не получите никакого исключения, просто результат будет неверный.

Как обнаружилось, несоблюдение этих свойств — не такая уж редкая ситуация. Проблема возникает при сравнении вещественных чисел — float или double.
Читать дальше →
Всего голосов 82: ↑76 и ↓6+70
Комментарии36

Как работает декомпиляция в .Net или Java на примере .Net

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

Сегодня хотелось бы поговорить про декомпиляцию приложений (все применительно к той же Java, да и любому языку с некоторыми допущениями и ограничениями, но поскольку сам я — .Net разработчик, примеры будут совсем немного MSIL'овизированы :) ).

Для вводной, перечислю текущие средства декомпиляции в мире .Net:
  • JetBrains dotPeek (поддержка R# хоткеев, сервер символов)
  • Telerik JustDecompile (также не плохой, множество хоткеев)
  • RedGate Reflector (аналог dotPeek, но платный. Изначально был основным в мире .Net, но пока был бесплатным)
  • icsharpcode ILSpy (хороший, opensource. Полезен, когда вы сами пишете код, использующий Mono.Cecil, т.к. Это даст лучшее понимание его работы)
  • 9rays Spices .Net Decompiler
  • Dis# с функцией inplace editor

Для программной декомпиляции:
  • Mono.Cecil (основной, самый крутой декомпилятор в мире .Net. На выходе получаете объектное «зеркало» содержимого сборки. Т.е. Максимально-упрощенно, без наворотов типа конвертации массива IL в DOM).
  • ICSharpCode.Decompiler (надстройка над mono.cecil, переводящая array[MSIL] в DOM, где есть циклы, switches и if'ы. Является частью SharpDevelop/ILSpy)
  • Harmony Core (аналогичное от меня, но сохраняющее информацию о символах. В среднем состоянии, не готова для прода, помощь приветствуется).


А теперь, хотелось бы описать как они работают (вам же интересно, как работает машинка от JetBrains?). Чтобы как минимум понять, насколько это сложно: написать свой декомпилятор .Net сборки обратно в код на C#.



Читать дальше →
Всего голосов 45: ↑41 и ↓4+37
Комментарии28

Информация

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