• Возвращение GOTO
    +2
    При рефакторинге забыли ситуацию, когда файл настроек существует, но пустой. Изначально функция не выбрасывала исключение в этом случае, а после рефакторинга этот код его выбросит:
    if (loadedProperties.isEmpty()) {
        throw new RuntimeException("Can`t load workspace properties");
    }


    И теперь, чтобы восстановить правильное поведение, надо или возвращать null, если файла нет, и пустые Properties, если файл есть (а возвращать коллекцию null — это костыль). Или добавлять класс типа
    class LoadFileResult {
      Properties properties
      boolean fileExists
    }

    И возвращать этот класс из функции чтения файла. И в результате получается ничуть не лучше, чем изначальный флаг boolean throwIfNotExists.
  • Размышления на тему ООП и состоянии объектов
    –1
    Получается, что код выглядит рабочим, даже после перестановки вызовов, а результат оказывается неожиданным.

    А это уже проблема того, кто переставляет методы, не разобравшись сначала в коде. Как можно вообще что-то менять в коде просто так, не понимая, как он работает?

    Придётся приписывать всякие флаги или прочее, чтобы отличить «нет данных» от «даже не запрашивали».

    Можно сделать объект Prices, если «даже не запрашивали» он будет null, а если «нет данных», тогда будет подкласс EmptyPrices или просто цены с пустым контентом, не null. И тогда не надо даже писать Objects.requireNonNull(product.getPrices) — второй метод и так упадёт с NullPointerException, если не вызвать первый.

  • Часть вторая. Как проходить code review по версии Google
    0
    Лично я в этом случае каждый день делаю коммит «daily commit».

    Зачем вообще делать коммиты каждый день? Можно доделать задачу и уже по ней сделать один коммит.
  • Как выстроить процессы и перестать издеваться над командой
    0
    У нас есть WIP-лимиты, но никто на них не смотрит. Задач гораздо больше, чем в лимитах, вся доска красная. Ну и ладно, вроде ничего страшного не происходит.
  • Как мы пишем микросервисы и почему не делаем этого быстро
    +3
    А мне не нравится идея ротации, лучше знать свою программу хорошо, чем всего по чуть-чуть и ничего в деталях. Может, это у нас сложный монолит, в котором человеку нужно полгода, чтобы въехать в общих чертах, как что работает, и несколько лет, чтобы разобраться во всех деталях.

    Я вот не один год на проекте и чувствую, что это даёт ощутимое преимущество. Когда проблема на лайве, обычно сразу понимаю, в какой файл смотреть и что может быть причиной. Если кто-то поменял код в одном месте, я пишу в ревью, что нужно поменять во втором и третьем, чтобы система работала одинаково (или просто чтобы ничего не сломалось).
  • Статический анализ IntelliJ IDEA против человеческого разума
    +1
    Я вот тоже не пойму, зачем делать статическим какой-то метод сервиса (спринг бина), если вдруг так совпало, что он не вызывает другие сервисы? Сегодня не вызывает, а завтра будет вызывать. Ну и я не собираюсь вызывать метод в статическом контексте (MyService.method()), это даже хорошо запретить. Правильно вызывать через экземпляр бина.

    Поэтому раздражает инспекция «Method may be static», и я её отключил.
  • Мины под производительностью ждут своего часа
    0
    saveAndFlush удобен тем, что если при сохранении будет ошибка БД (например, constraint не даст сделать вставку), то исключение вылетит сразу же, и будет видно, на какой строчке кода и на каком объекте это произошло (первом, десятом или сотом). Если сохранять без flush, то исключение будет потом, на последней строчке метода, где находится закрывающая скобка. Попробуй тогда разберись, что случилось. Поэтому везде flush используем, кроме редких случаев, где нужно сохранить больше тысячи объектов за раз.
  • Всё ли могут деньги? Юзабилити-аудит сайта на три миллиона
    0
    Только мне сразу бросился в глаза совершенно дурацкий логотип сайта? Его даже прочитать невозможно, и непонятно, на каком он языке. Последние 2 буквы (перевернутая e и q) говорят про английский, получается тхомекв — странный набор букв. На втором скриншоте уже ТНОМЕР — это уже по-русски или всё ещё по-английски, но с ошибкой? Я бы на этом этапе скептически отнёся бы к фирме, у которой даже нет внятного названия, и пошёл бы на другой сайт.
  • Хакнуть Госуслуги – можно, если очень нужно
    0
    Надеюсь, на скриншотах не настоящая серия и номер паспорта автора? А то его будет легко вычислить.
  • Умная форма китайских школьников помогает снизить количество прогулов
    0
    А если положить свою форму в портфель к однокласснику, а самому идти прогуливать?
  • Топ-10 фильмов про ИТ
    0
    Кому смотреть
    Тому, кто в «Мстителях» смотрел не на Скарлетт, а на Криса.

    А что делать тем, кто Мстителей не смотрел? :)
  • Идёт мобильный разработчик по лесу, видит — Котлин горит. Сел в Котлин и сгорел
    +2
    Большинство из написанного есть в Groovy, и мне нравится. Половина из этого — плюсы, а не минусы.
  • В любой непонятной ситуации — пиши скрипты
    +1
    Главная проблема со скриптами — хакеры могут выполнять произвольный код на сервере, если в приложении пользователи могут редактировать скрипты через UI. Или сами напишут вирус, или, если UI доступен только админам, то могут поменять скрипты через XSS, если не предусмотреть защиты. Или, если скрипты в БД, то могут через SQL-инъекции их подменить.

    Так что, если можно обойтись без скриптов — лучше обойтись.
  • За Oracle JDK нужно будет платить. Какие теперь варианты?
    0
    Стоимость десктопной версии составляет $2.50 за пользователя в месяц

    Я правильно понял, что если у компании сайт на Джаве, на котором зарегистрировано 1000 человек, то нужно платить 2500$ в месяц? А если за следующий месяц зарегистрируется ещё столько же, то платить в 2 раза больше? Это же грабёж.
  • Парадокс времени ожидания, или почему мой автобус всегда опаздывает?
    +3
    Сначала автор написал кучу программ, загрузил нас интегралами и пуассоновскими процессами, а потом сделал вывод, что всё написанное неправильно, так как оно соответствует действительности. Зачем было тогда писать всё это, почему бы сразу не написать правильно?

    По-хорошему, надо было сначала взять файл реальных данных и посмотреть, что там гауссово распределение. А потом уже писать программу.
  • Вышел Skype 8.0: запись звонков и секретные чаты
    0
    Только открыл эту статью на Хабре — тут же Скайп прислал сообщение:
    Доступно новое обновление
    Skype (версия 7) для рабочего стола Windows в ближайшее время перестанет работать. Получите Skype 8 ...

    Совпадение, или они за нами следят?
  • Hibernate — о чем молчат туториалы
    +1
    Проблему неправильного часового пояса при сохранении даты и времени в БД решаем четвёртым вариантом. Написали свой маппер, который преобразовывает Instant в String и передаёт эту строку в БД. Таким образом, если у нас Instant 10:00 UTC, то в БД будет всегда 10:00, независимо от часового пояса сервера и БД.
  • О значении доброжелательности в команде
    +4
    Почему-то в статье прямота противопоставляется доброжелательности. Можно написать прямо и доброжелательно одновременно, не задевая человека: «Этот код не будет работать, потому что такого-то поля нет в БД» или «У нас есть константа такая-то, используй её», или «Лучше сделать так и так, чтобы код стал понятнее».

    Выражения типа «код — говно» или наезды на человека — это банальная грубость. Она и есть противоположностью доброжелательности. Почти всегда можно сказать то же прямо, но без оскорблений.
  • Открытая бесплатная трансляция Java-конференции JPoint 2018
    0
    Можно и день 2 тоже перезалить, пожалуйста? Обрывается на 6 часов 10 минут. www.youtube.com/watch?v=VNHFXmikVZU Видимо, ютуб не любит долгие трансляции и обрезает.
  • Spring Boot. Фоновые задачи и не только
    0
    Потому что этот StringBuffer — локальная переменная, которая используется только внутри метода. Если метод sendMailToUsers() параллельно вызовется другим потоком, то это создаст второй StringBuffer, а к первому буферу никакой другой поток доступа не получит. Если бы этот буфер был полем класса, тогда ещё можно было бы говорить о многопоточности.

    Менять на StringBuilder смысла нет, так как можно написать гораздо проще:
    String message = "Happy Birthday dear " + user.getName() + "!"
    

    А дальше компилятор сам заменит этот код на StringBuilder.
  • Нужно ли менеджеру уметь программировать
    +5
    редактировать файлы при помощи Vim

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

    А это уже может сыграть медвежью услугу. Например, если менеджер знает только монолит с SQL базой, а команда делает микросервисы на NoSQL с событийно-ориентированной архитектурой. Это всё работает по другим принципам, и если менеджер начнёт требовать делать «так, как раньше», то хорошим это не кончится. Зависит от человека.
    предложить, что нужно рефакторить

    Тут явно перебор.
  • Разбор перформансных задач с JBreak (часть 4)
    0
    90% случаев достаточно использовать подходящие структуры данных и алгоритмы.

    И писать оптимальные SQL селекты. Если там несколько join-ов, которые выдают 50 тысяч строчек по 100 столбцов, а потом данные фильтруются Java-кодом, то тут даже ассемблер не поможет.
  • Интернет-магазин цветов, или как мы облажались на День Святого Валентина
    +7
    Статья (а именно скриншоты переписки) в первую очередь характеризует автора и владелицу как нехороших людей, которые не уважают разработчиков, а безосновательно считают их идиотами и лохами. А себя, видимо, самыми умными. Ещё пойму, если бы это сказали на курилке в частном разговоре, но выкладывать на весь Интернет — явно перебор.

    Я бы на месте программистов перестал бы работать с такими клиентами, раз они не умеют по-человечески относиться к людям. Работать с ними — себя не уважать.
  • Чего боятся программисты?
    0
    Я всегда боюсь, что у меня в продакшене что-то внезапно само отвалится.

    Как отвалится, так и пофиксим. Ну посидят пользователи немного без одной нужной страницы, это же не конец света. Не медицинское оборудование разрабатываем, никто не умрёт.

    Если бояться что-то поменять, то говнокод никуда не денется. А если взять и порефакторить, то хотя бы текущая страница будет работать нормально, а количество плохого кода на проекте уменьшится.
  • Spring AOP. Маленький вопросик с собеседования
    0
    зачем может понадобиться посередине одной транзакции создавать другую
    Не так уж редко это нужно. У нас используется в таких ситуациях:
    * Фоновый процесс, который рассчитывает много данных за несколько месяцев. На методе посчитатьЗаОдинМесяц() стоит аннотация @Transactional(propagation = Propagation.REQUIRES_NEW), и этот метод вызывается в цикле. Если считать несколько месяцев в одной транзакции, то соединение с базой разрывается по таймауту.
    * Обработчик ошибок 404, 500. Если веб-страница упала с ошибкой 500, и транзакция на странице откатилась, то исключение нужно записать в базу в новой транзакции, чтобы оно сохранилось.
    * Сложная валидация объектов. Например, есть у нас в базе 2 объекта, один работает с 8:00 до 12:00, а второй с 12:00 до 16:00. Нужно, чтобы время не пересекалось. Пользователь редактирует второй объект и пытается поставить время с 10:00 до 16:00. При сохранении объекта Hibernate вызывает валидацию, которая пытается выбрать из базы первый объект (чтобы проверить, не пересекается ли время). При этом, перед select-ом второй объект автоматически сохраняется, даже если он неправильный! Валидация возвращает ошибку, но неправильный объект уже сохранён в базу. Чтобы это побороть, сделали валидацию в отдельной транзакции, и тогда второй объект не сохраняется автоматически.
  • Почему мне кажется, что студентов учат ООП неправильно
    0
    Представить класс в виде чертежа — хорошая идея, но этот пример кода полностью всё портит:
    ЧертежСамолета тотСамыйПотрепанныйБоингНаКоторомМыЛетелиВТурцию = new ЧертежПассажирскогоСамолета();

    Самолёт = новый чертёж самолёта? Что за бред, мы сделали новый самолёт, а не нарисовали новый чертёж. И тип объекта, который получился в результате — самолёт, а никак не ЧертежСамолета. Меня бы это всё ещё больше запутало, чем в примере с котами и собаками.

    Лучше уже сделать класс Боинг737, тогда хоть код логичный будет:
    Самолет тотСамыйПотрепанныйБоингНаКоторомМыЛетелиВТурцию = new Боинг737();

    Или делать чертёж как factory:
    Самолет тотСамыйПотрепанныйБоингНаКоторомМыЛетелиВТурцию = ЧертежПассажирскогоСамолета.построить();
  • Обработка ошибок в формате JSON со Spring Boot
    0
    Exception тут, по-моему, явно лишний. С точки зрения сервера, если клиент прислал неправильный ИД, то он сам виноват. Никакой ошибки сервера здесь нет, значит, и Exception не нужен.

    Я бы лучше в контроллере проверил, если user == null, то ответить кодом 404. В результате программа будет делать то же самое, только без лишних классов и быстрее (так как при создании Exception-а заполняется stack trace, а это относительно тяжёлая и долгая операция)
  • Конференция Joker 2017: удивительные истории
    +2
    Ввёл в смятение при просмотре приём, опробованный в докладах этой серии первый раз — правильным из четырёх ответов сначала объявлялся вовсе неправильный!

    Меня ввёл в смятение другой приём — рассказ про спиннеры, где показали с виду обычный println, что продаются спиннеры по 2 евро. И, внезапно, варианты ответа, покупать или не покупать. Сначала думал, что это лирическое отступление, а не реальный паззл. Вот это было круто.
  • Готовимся к Java 9. Обзор самых интересных улучшений
    0
    List.of(1, 2, 3)

    Неожиданно, что это возвращает неизменяемый List. Типичная ситуация в моём коде — создать List или Map с парой элементов, а потом добавить туда ещё несколько. Через List.of это сфейлится в рантайме с Exception-ом. Думаю, многие проограммисты на этом обожгутся.

    Как теперь лучше создавать изменяемые списки, вот так?
    new ArrayList(List.of(1, 2, 3))

    Лучше бы сделали ArrayList.of(1, 2, 3)
  • Как мы починили свой процесс и стали меньше отвлекаться
    0
    7. Передача кода

    А бывает, что второй программист, который делает code review, плохо разбирается в коде и ломает то, что работало? У нас исправляет тот, кто написал код, и в моих code review было много комментов, где люди не понимали, как это работает и зачем я добавил этот кусок кода.

    6. Done-консилиум. 7. Передача кода.

    А почему не наоборот? У нас сначала code review, потом тестировщики проверяют, а потом уже демо. Если окажется, что код кривой и его надо переделать, то вы проводите демо и Done-консилиум ещё раз?
  • Русскоязычная спецификация языка Java
    +1
    В повседневной жизни программистов почти никто не пользуется словами «оператор», «операция», «инструкция» и т д — наверное, поэтому не заморачиваются по поводу перевода. Достаточно сказать «в case 2 ты забыл написать break, а результат метода trim забыл присвоить переменной message». Никогда не нужно было задумываться, «case 2» — это оператор, выражение, инструкция или как его ещё можно назвать.
  • OWASP Top 10 2017 RC
    +2
    По сути, то же самое, что остальные 9 пунктов, но применительно к API. Например:
    • Легко сделали веб-сервис, добавив аннотацию Resource к доменному классу, но забыв настроить права доступа к веб-сервису. Думали, что веб-сервис разрешает только чтение, а на самом деле он разрешает также изменение объекта
    • SQL инъекция в одном из полей JSON
    • На клиенте проверяют доступ, скрывая недоступные пункты меню, а на стороне API — не проверяют. Любой может послать API запрос к административной функции
    • При конвертации объекта в JSON также конвертируются лишние поля (или всё дерево объектов). Не только ИД и имя пользователя, а и пароль, адрес, номер паспорта и т. д.
  • Избавляемся от ConcurrentModificationException
    +2
    collection.removeIf(element -> iDontLikeThisElement(element))
    

    — и велосипеды больше не нужны
  • Три ветки продукта и контроль версий
    0
    Когда-то делали похожим образом, но тут есть проблемы:
    1. При рефакторинге большой шанс сломать старый код. Например, переделываете вы механику осад, в объекте осад были поля String startTime, String endTime, Date date. Переходите на Джаву 8, решили сделать через правильные Instant: Instant start, Instant end. Старый код работает со старыми полями (ожидая, что они not null), новый — с новыми. Большая вероятность, что тут что-то сломается, особенно во время первода часов.
    2. Трудно делать миграции базы данных. Тот же пример с осадами. Старый код вставляет в базу 3 старых поля, новый — 2 новых. При этом падает с ошибками, что не указаны значения для not null полей.
    3. Не всё можно спрятать за правами доступа. Особенно, если это переделка уже работающих механик.
  • Лучезарный китайский станок и окрасочная машина им. Франкенштейна
    0
    Удивительно, что надписи приборной панели на русском, а не на китайском, английском или картинками.
  • Лучезарный китайский станок и окрасочная машина им. Франкенштейна
    0
    По тексту, заказали третью часть, а когда появилась 1, 2 и 4-я?
  • Простой способ презентовать свои UX-решения потенциальному клиенту
    0
    Я бы на месте пользователя перетащил чат в нужную папку, без всяких кнопок и чекбоксов (как письмо в почте).
  • Прекрасное настоящее и светлое будущее Scala
    +1
    val a : A | B
    

    Хочу! Почему до такого раньше не додумались за столько лет развития программирования?
  • Что произошло, когда я освободила свой дом от лишних вещей
    0
    Неужели, чтоб сделать уборку, надо читать аж две книги? Казалось, для этого достаточно выделить выходной и пересмотреть всякое барахло.
  • 6 «вредных» советов разработчику
    +1
    > 3. UI можно сделать и самому
    Если это внутреннее корпоративное приложение, такой подход вполне работает. Конечно, про юзабилити думать надо, но и нанимать дизайнера нарисовать обычные формы и таблицы — перебор.

    > 6. «Стэлс-режим» или «Alone In The Dark»
    Мне больше помогли статьи о том, как надо (и не надо) делать, и книги вроде Clean code, чем работа в команде. После прочтения и опыта в команде можно и самому писать хороший код, даже если проект для себя.