Обновить
3
0

Software Engineer

Отправить сообщение
Senior developer это E5, team lead — E6. E7 это руководитель продукта, у него несколько команд в подчинении и это большой начальник

Не совсем так. E5, E6, E7 — инженерные левелы, у всех трёх нет никого в формальном подчинении. На всех этих уровнях надо писать код, разница в размере проекта и в том, насколько взаимодействуешь с другими людьми/командами.
Чтобы иметь кого-то в подчинении, нужно быть EM (Engineering Manager).
Можно быть E5, формально руководить проектом в роли лида (при этом в проекте могут быть и другие E5/E6/E7), но быть всей командой под колпаком одного менеджера, а может быть проект из людей из-под разных менеджеров (кросс-командный проект). Если делаете несколько проектов/фич в одной команде, то разные люди могут быть лидами разных фич.

China Unicom

Всегда читаю как China Unicorn

В винде тоже такое — хочешь поставить маленькую программулину типа Paint.NET, сначала поставь .NET Framework.
В новых виндах дотнет предустановлен, и это аналогично тому, как если после установки линукса сразу предустановить либы Qt/GTK/etc.

Все в комментариях ругают сбербанк, а в это время в США редкие банки выпускают карты с NFC, банкоматов с NFC почти нет, зато на многих банкоматах есть слот для вставки платёжных чеков :)

А если карта из Европы и счет у неё в евро? И нужна конвертация

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

Мне this нравится тем, что во всяких парных методах (compare, equals, etc.) можно называть аргумент that и обращаться к полям как this.field, that.field.

Многие из Java мира имеют альтернативное мнение и называют это
Checked exceptions — Java’s biggest mistake

Я тоже так думал в Java, пока не пописал год на C#. После этого изменил мнение на противоположное :)

В джаве сложно с ветками наследования)
Есть базовый Throwable, у него подклассы Error и Exception. При этом Throwable — checked, а Error — unchecked.
Потом идёт Exception, у него подкласс RuntimeException. При этом Exception — checked, а RuntimeException — unchecked.
Сделали бы две базовые ветки (как вариант, просто переименовать RuntimeException в RuntimeError и запихнуть в Error) и было бы норм.

Как быть с интерфейсами? Checked Exceptions — это свойство интерфейса или реализации?

Свойство интерфейса.
Как вы пишете


interface Foo {
  Either<Result, Error> getResult();
}

так можно и писать


interface Foo {
  Result getResult() throws Error;
}
Если они нужны для того, чтобы декларировать какие вообще исключения могут выбрасываться методом — то их будут сотни в любом методе, пользоваться этим будет невозможно (даже с автоматическим выводом).

То же самое можно будет сказать про Either/Maybe из поста.
Допустим, у нас есть OneOf, который работает как Either с несколькими типами. И тогда у вас будут что сотни эксепшенов, что сотни видов результатов.


OneOf<GoodResult, OpenError, ReadError, FindError> result = getResult();
if (result.first()) {
  // good
} else if (result.second()) {
  // open error
} else if (result.third()) {
  // read error
} else if (result.fourth() {
  // find error
}

эквивалентно:


try {
  GoodResult result = getResult();
  // good
} catch (OpenError) {
  // open error
} catch (ReadError) {
  // read error
} catch (FindError) {
  // read error
}

На это вы можете возразить, что мы не хотим использовать OneOf<GoodResult, OpenError, ReadError>, а хотим использовать Either<GoodResult, BadResult> из только двух состояний.
В этом случае и с эксепшенами можно писать:


try {
  GoodResult result = getResult();
  // good
} catch (BadResult) {
  // some error
}
достаточно перед открытием файла проверить, что он действительно существует

Если проверили файл перед открытием, а потом между проверкой и самим открытием случилось удаление файла, то будут проблемы)
В этом случае нужно именно атомарное открытие с одновременной проверкой.

так и надо вводить для них соответствующие сущности

Эти сущности и есть исключения)
Checked exceptions — это ожидаемые ошибочные состояния. Если мы читаем из сети, то мы ожидаем или ошибку, или ответ. Если мы читаем из файла, то мы ожидаем или ошибку, или данные.
Unchecked exceptions — неожидаемые. Типа, закончилась оперативная память и не получилось аллоцировать объект. Или случился assertion, который ну никак не должен был случиться, но из-за бага кто-то его допустил. Или деление на 0 (которое по-хорошему надо делать checked exception, или оформлять в виде отдельной сущности — Either<Integer, DivisionByZeroError> result = 10 / 0;, — но это сильно замусорит код).

И при этом я не знаю, какие исключения надо обрабатывать в том или ином случае, это никак не отражено в сигнатуре, это приходится отдельно указывать/читать в документации.

Я считаю, это ошибка создателей C#. Они наслушались жалоб про то, какие эксепшены неудобные и как их надо постоянно обрабатывать в Java, и сделали unchecked вариант, где обработчики не форсируются компилятором. В итоге получили, что всё пропало из сигнатур.
Стандартный вариант в Java (checked exception) аналогичен использованию maybe/either — при использовании в коде всегда нужно описывать как минимум два пути: один для положительного результата, другой для ошибки.

FileNotFoundException,… DirectoryNotFoundException, PathTooLongException и т.д.
И всё это вместо Result<Stream, FileOpenError> Open(string fileName).

Так все те эксепшены — это и есть ваш FileOpenError (или IOException, как это на самом деле назвали). Семантически одно и то же, просто синтаксически выглядит по-другому.

Потому что оно гарантированно не случится (например, парсинг константы)

Подход с Maybe/Either для парсинга тоже заставит обработать негативный результат (если метод parse возвращает Maybe), так что разницы не будет.


checked исключения несовместимы с функциональным стилем программирования

Можно попробовать прикрутить дженерики для исключений вместо оборачивания в RuntimeException и пробрасывать их в дженерик-виде во все места, которые их вызывают.
Типа:


public <E extends Exception> void doSomething(String s) throws E {
  ...
}

В дополнение хочется вариабельных списков (как в темплейтах в C++), чтобы можно было перечислять их, если нужно несколько исключений, или указывать список нулевой длины, когда они не нужны, но такого в джаве нет. Тогда можно было бы починить имеющиеся map/reduce/filter/etc.

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

Фактически DSL запускает реальную копию MS-DOS на виртуальной машине QEMU и запускается с нее

При этом зачем-то DSL запускает MS-DOS внутри QEMU. Зачем системе, запущенной из DOS, запускать MS-DOS?
Формулировка какая-то неясная

государственный суверенитет над сетями
люди опытные, такие, как Президент и большинство в Конгрессе США, а также КПК во главе с товарищем Си со мной согласны

Эти опытные люди видели интернет только на бумажных распечатках :)

тем более Wechat не так уж ценны

Думаю, миллионы китайцев в США не согласятся :)

Есть же Android Auto Wireless. Автопроизводители медленно подтягиваются, но у сторонних производителей Pioneer/Kenwood всё уже работает

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность