Удивлен, что никто до сих пор не поинтересовался. Если не секрет, почему волосы отрезали?
Сам пользуюсь простыми стяжками, благо идут они в комплектах к малкой технике (телефоны, фотоаппарат, внешний хард и т.п.), и набралось их предостаточно.
Создается впечатление, что автор имеет весьма и весьма поверхностные знания о Java.
HashSet — в большинстве языков программирования, в которых есть множества объектов, они реализованы именно таким образом. Тут не добавить, не убавить — как говориться, вам шашечки или ехать. В большинстве случаев скорость работы структуры данных много важнее ее размера.
Вы может быть еще byte используете для чисел? В современном мире byte может понадобиться только при работе с бинарными данными. И то, обычно продолжают использовать int, которому практически на всех аппаратных платформах соответствует машинный тип.
Default logger, Clonable, System, Runtime, Properties — результат исторического развития платформы. Шестнадцать лет назад у нас было гораздо меньше опыта построения крупных объектно-ориентированных систем. Джош Блок еще не писал Effective Java — он писал реализацию collections API и сам учился писать правильно. А затем никто уже ничего менять не стал из-за обратной совместимости. И поверьте мне, на сегодняшний день обратная совместимость — основная причина, по которой бизнес не боится использовать Java.
Integer, Boolean и т.п. — это результат компромисса между скоростью исполнения и удобством API. Джаве нужны были примитивные типы, которые при этом вели себя нормально с точки зрения объектной модели. Да, в современных языках умеют сделать это элегантнее, а на тот момент могли только так.
Switch — каждый Java-разработчик знает, что свич плохо пахнет. Если нужно полиморфное поведение, то в языке уже есть три механизма, его обеспечивающие. Если не хочется городить огород, то:
1. Если значения переключателя известны в момент компиляции, используем свитч.
2. Иначе — цепочку if else if — смотрится она вполне нормально.
Скажете, а как же строковые константы? — а enum на что? Или вы любите stringly-typed-код?
Многопоточность: все отлично в Java с многопоточностью, большинство языков нервно курят в сторонке. Java предлагает целый спектр возможностей: от реализаций data-parallelism через Fork/Join и Hadoop, software-transactional memory и actor model в Clojure и Akka до самого низкоуровневого взаимодействия через wait(), notifyAll() и т.п. Эрланг предлагает одно решение, бесспорно хорошее, и считает, что оно подойдет для любой проблемы. Java может все, что и Erlang, даже hot code reload можно реализовать через ClassLoaders. Единственное, что от вас требуется — выбрать наиболее подходящий инструмент для задачи. Подсказываю: wait-notify — не подходящий в 99.99% случаев.
String — про Юникод мсье не слышал? Вообще прекращайте уже на байты мастурбировать.
Замыкания: зачем ждать? Groovy, Scala, Xtend, Clojure, Mirah, javac.info Выбирайте. Annonymous Inner Classes тоже никто не отменял. Громоздко, но не более.
Числа. Точность нужна только для финансовых расчетов. При этом никто не мешает вам использовать long или int и делить на 100 при выводе. Опять же, никто не мешает вам всю работу вести с BigDecimal, а описанный мною способ применять в случае сложных вычислений. В других языках на JVM есть поддержка чисел с фиксированной точкой на уровне синтаксиса.
Java немного староват как язык, но отнюдь не плох. Вы вряд ли найдете настолько солидное сочетание скорости работы и огромного объема уже реализованной функциональности. 99% языков до нее не дотягивают: некорректно работают со строками, или с числами, или с датами, многие из них имеют нестабильные реализации, у многих проблема с обратной совместимостью. С другой стороны вас никто не заставляет все делать на одном языке: use right tool for a job.
Ну, понятие «вечер» у всех разное — я где-то по часу-полтора в день трачу. У меня нет цели сделать все за один раз — просто, не особо напрягаясь, занимаюсь потихоньку.
В AI больше времени выходит из-за вопросов посередине. Бывает, что задают серию вопросов через каждые три минуты, и каждый вопрос — не совсем тривиальная задача: надо и подумать, и ручкой почеркать.
Потянете. Лексика весьма специфическая и привязана к предметной области, поэтому с пониманием не должно быть проблем. Однако имейте в виду, что они отнимают достаточно много времени. Например, на machine learning на этой неделе дали два батча видео (где-то по часу-полтора на каждый), после каждого из них нужно пройти тест. Задание на покодить дают, если ты выбрал advanced track. У меня выходит когда как: вчера, например, всего минут 40 потратил, а обычно бывает, что затормозишь где-то, и три-четыре часа как не бывало.
В целом, на ML я трачу три-четыре вечера, на AI два-три. Т.е. если выберете два курса, вполне может статься, что времени больше ни на что не хватит.
А меня нервирует нажатие на колесико — постоянно думаю о том, чтобы случайно колесико не прокрутить. Особенно неприятны ситуации, когда срабатывает и нажатие, и вращение колесика — почему-то все программы навешивают на эту комбинацию какие-нибудь функции для «power user»ов. В результате нажимаешь на колесико и вдруг — раз! — и сидишь в замешательстве: «Что это было?»
Да, случается это редко, но ведь думаю об этом какой-то одной извилиной мозга я каждый раз, — и это очень-очень раздражает.
А я еще и в другом часовом поясе оказываюсь. Из-за этого надо быть аккуратным: если перед сном в телефоне не выключить WiFi, то весьма велик риск проспать.
Вместо этого опт-аута лучше бы сделали сервис, через который подобные ошибки можно репортить.
Глядя на график, думаю, что хорошо хоть от IE7 и FF3.6 как-то с отвязались. Вообще сейчас политика версий такая: IE >= 8, остальные — latest stable. Первый релиз будет в следующем году, пока же ограничиваемся демонстрациями продукта. Поэтому и возлагаем надежды на WebGL, который к тому времени появится у всех, кроме Восьмерки.
С IE8 все весьма печально: тратим на него около 45% всех ресурсов и постоянно идет разговор об отмене его поддержки, но я исхожу из того, что в каком-то виде degraded experience у нас уже есть, поэтому пока терпим.
Ну, можете не рассказывать — сами пишем на Canvas и Svg — в Опере, IE8 и Firefox в плане скорости совсем туго. В результате портим логику на флэш и WebGL. — портим логику на флэш. Причем проблемы с производительностью не возникают только в IE9, даже с Хромом не все гладко, чего я, прямо скажем, не ожидал.
Вообще это длинная история, полная профайлинга и изворотливости. Если интересно, могу статью написать.
Реализация открытая, и сама спецификация, кстати, тоже — все доступно уже два года на BitBucket. Идея как раз была в том, чтобы другие вендоры добавляли свои замечания и расширяли протокол, если это необходимо.
Вспомните про любой новый продукт от Гугла или любой редизайн одного из существующих сервисов. В львиной доле случаев при запуске в Опере вас встречает надпись, мол, пользуйтесь хромофоксом, товарищ — мы в вашем браузере не работаем. Причем смена юзерагента на Хром или Фокс помогает в 95% случаев — внезапно оказывается, что сервис в Опере прекрасно работает.
Добавьте к этому абсолютное нежелание поддерживать Оперу в компиляторе GWT — из-за этого как раз и не работал в ней Google Wave, — а также полное непризнанеи норвежцев как инноваторов индустрии. Например, когда зарелизили Chrome, в комиксе и в документации, а также во всех видеопрезентациях Google с радостью рассказывали о том, как они взяли лучшее из Firefox, IE и Safari, но функции, изобретенные в Опере, преподносили как свои. Сейчас припомню только табы выше адресной строки, но на момент релиза я насчитал штук семь или восемь таких вот «нововведений».
На всех презентациях Google Опера если и фигурирует, то очень и очень редко.
В Опере есть такая штука, как browser js — с его помощью исправляются баги в некоторых крупных сайтах. При каждом обновлении какого-то гуглового продукта, которое ломает что-то в браузере, ребятам из Оперы приходится, засучив рукава, разбираться, что же именно не так. Часто, как я писал выше, дело ограничивается простым удалением соответствующей проверки "if (isOpera())" из гуглового кода. Но иногда все-таки всплывают какие-то баги, и чтобы их исправить, прихдется разбираться в минифицированном и обфуцированном коде Google. Я не говорю, что они должны давать Опере свои исходники, хотя такое сотрудничество пошло обеим компаниям на пользу. Но полностью запрещать доступ к своим продуктам — это, имхо, никуда не годится. Особенно с учетом того, что различия между Opera и WebKit-браузерами минимальны.
Да Adobe своего не упустит: уже давно говорят о том, что они инструменты для разработки под HTML5 делают. Уверен, что в какой-то момент в том выпадающем списке появится Flash for HTML5 — и все флэшеры не останутся в накладе.
Первыми remote debugging запили в Опере — это была одна из стартовых фишек Dragonfly, и было это на год или два раньше, чем об этом подумали другие браузеростроители. Тогда же они предложили открытую спецификацию по связи отладчик-браузер или отладчик-javascript-runtime: dragonfly.opera.com/app/scope-interface/index.html Если бы дело пошло, то сегодня каждый из нас мог бы взять любимый отладчик — тот же Firebug — и использовать его для отладки в Хроме или в браузере Андроида, например. Или Chrome Dev Tools для работы с Opera.
Но поскольку в Гугле всем сотрудникам разослана секретная директива «не поддерживать Оперу», они решили разрабатывать свой велосипед. Параллельно с ними велосипеды изобретают все, кому ни лень, а в результате разработчики должны пользоваться зоопарком несовместимых костылей.
По поводу контактов: мне нравится видеть лица людей, с которыми часто общаюсь. Вот примеры того, как оно выглядит: encrypted.google.com/search?q=android+quick+actions+contact Имхо, удобно — на один контакт одна кнопка. Если хотите, можно настроить, чтобы по нажатию вообще сразу звонок шел. Но я сделал в два нажатия, чтобы избежать случайных звонков.
Виджеты — тут я, в общем-то, согласен — штука бусполезная, и без них вполне можно жить. Вернее так: их полезность предельна мизерна и во многом зависит от конкретного пользователя.
Например, в свое время общался с одним фанатом Твиттера, причем он был именно генератором новостей — писал много и часто. Особенно ему нравилась сиюминутность данного сервиса — он считал, что очень важно делиться впечатлениями именно в тот момент, когда что-то происходит, — 10 минут спустя и эмоции не те, и вероятность того, что то, что ты написал, уже известно твоим читателям, выше. Т.е. для него возможность постить всегда и везде была критичной. В результате у него на компе были твиттер-клиенты, в браузере стоял плагин, позволяющий отправлять твит прямо из адресной строки. А на телефоне у него был виджет постинга.
Но это весьма редкий юскейс. Знаю людей, которые вовсю пользуются календарями и планировщиками — у них висят соответствующие виджеты — глянув на экран, человек сразу видит список задач.
У меня висит виджет-плеер, как описал выше. Я переключаюсь между треками в одно нажатие — в приложение мне переключаться не нужно. Или переключатель wi-fi — можно включать-выключать антенну где-то в настройках, а можно иметь маленькую кнопку-виджет на рабочем столе.
Скажете, почему нельзя то же самое делать через приложения? В том-то и дело, что можно: виджеты — это не ключевой функционал системы. Другое дело, что через виджет вы можете экономить по одному-двум-трем операциям на каждое ваше действие (меньше жестов и нажатий). И если подобную операцию вы выполняете по нескольку раз в день каждый день, то экономия времени может выйти вполне приличная.
Виджеты — это удобно. Другое дело, что просто раскидать их по рабочим столам как попало — недостаточно.
Все рабочие столы находятся на разном уровне удаления: первый стол доступен по одному действию: кнопке home, слева и справа от него — по двум действиям (home — свайп влево и home — свайп вправо). Соответственно, на первом рабочем столе должны быть наиболее часто используемые ярлыки и виджеты или то, что используется «на ходу» — ведь не всегда где-то на улице удобно листать телефонное меню. На двух соседних — то, что не влезло на центральный. На остальных можно разместить что-то еще.
Например, на первом рабочем столе у меня есть контакт своей второй половины — часто используемый элемент, и ярлык на SoundHound — часто использую в торговых центрах или кафе, чтобы узнать, что за музыка играет.
Что в этом неудобного? Никто же не говорит, что все полезное пространство нужно занимать кучей виджетов, не оставляя ничего путного. Если вам так удобно, расположите на рабочем столе только ярлыки программ — получите тот же iPad. Другое дело, что в отличие от iPad любой андроид-планшет может сделать что-то еще. Например, у меня висит виджет плеера с кнопками пауза-вперед-назад — ваш iPad так может?
Странный сервис в стиле Adobe AIR — с тем тоже можно было писать приложения на HTML5, при этом они интегрировались в операционную ситему и даже указывались в списке установленных программ. Видимо, фишка как раз в том, что приложения очень легковесные: кликнул — и оно открылось. Но раз так, то вряд ли что-то дальше вариаций на клиенты онлайн-сервисов получится.
Сам пользуюсь простыми стяжками, благо идут они в комплектах к малкой технике (телефоны, фотоаппарат, внешний хард и т.п.), и набралось их предостаточно.
Map<MyKeyObject, PersistedPlan> plansById = newHashMap();
из Guava? Или вы в 2011 году не пользуетесь?
HashSet — в большинстве языков программирования, в которых есть множества объектов, они реализованы именно таким образом. Тут не добавить, не убавить — как говориться, вам шашечки или ехать. В большинстве случаев скорость работы структуры данных много важнее ее размера.
Вы может быть еще byte используете для чисел? В современном мире byte может понадобиться только при работе с бинарными данными. И то, обычно продолжают использовать int, которому практически на всех аппаратных платформах соответствует машинный тип.
Default logger, Clonable, System, Runtime, Properties — результат исторического развития платформы. Шестнадцать лет назад у нас было гораздо меньше опыта построения крупных объектно-ориентированных систем. Джош Блок еще не писал Effective Java — он писал реализацию collections API и сам учился писать правильно. А затем никто уже ничего менять не стал из-за обратной совместимости. И поверьте мне, на сегодняшний день обратная совместимость — основная причина, по которой бизнес не боится использовать Java.
Integer, Boolean и т.п. — это результат компромисса между скоростью исполнения и удобством API. Джаве нужны были примитивные типы, которые при этом вели себя нормально с точки зрения объектной модели. Да, в современных языках умеют сделать это элегантнее, а на тот момент могли только так.
Switch — каждый Java-разработчик знает, что свич плохо пахнет. Если нужно полиморфное поведение, то в языке уже есть три механизма, его обеспечивающие. Если не хочется городить огород, то:
1. Если значения переключателя известны в момент компиляции, используем свитч.
2. Иначе — цепочку if else if — смотрится она вполне нормально.
Скажете, а как же строковые константы? — а enum на что? Или вы любите stringly-typed-код?
Многопоточность: все отлично в Java с многопоточностью, большинство языков нервно курят в сторонке. Java предлагает целый спектр возможностей: от реализаций data-parallelism через Fork/Join и Hadoop, software-transactional memory и actor model в Clojure и Akka до самого низкоуровневого взаимодействия через wait(), notifyAll() и т.п. Эрланг предлагает одно решение, бесспорно хорошее, и считает, что оно подойдет для любой проблемы. Java может все, что и Erlang, даже hot code reload можно реализовать через ClassLoaders. Единственное, что от вас требуется — выбрать наиболее подходящий инструмент для задачи. Подсказываю: wait-notify — не подходящий в 99.99% случаев.
String — про Юникод мсье не слышал? Вообще прекращайте уже на байты мастурбировать.
Замыкания: зачем ждать? Groovy, Scala, Xtend, Clojure, Mirah, javac.info Выбирайте. Annonymous Inner Classes тоже никто не отменял. Громоздко, но не более.
Числа. Точность нужна только для финансовых расчетов. При этом никто не мешает вам использовать long или int и делить на 100 при выводе. Опять же, никто не мешает вам всю работу вести с BigDecimal, а описанный мною способ применять в случае сложных вычислений. В других языках на JVM есть поддержка чисел с фиксированной точкой на уровне синтаксиса.
Java немного староват как язык, но отнюдь не плох. Вы вряд ли найдете настолько солидное сочетание скорости работы и огромного объема уже реализованной функциональности. 99% языков до нее не дотягивают: некорректно работают со строками, или с числами, или с датами, многие из них имеют нестабильные реализации, у многих проблема с обратной совместимостью. С другой стороны вас никто не заставляет все делать на одном языке: use right tool for a job.
На xkcd даже продается постер:
Вот доли IE6-8 — это больной вопрос.
В AI больше времени выходит из-за вопросов посередине. Бывает, что задают серию вопросов через каждые три минуты, и каждый вопрос — не совсем тривиальная задача: надо и подумать, и ручкой почеркать.
Базы данных не брали, кстати?
В целом, на ML я трачу три-четыре вечера, на AI два-три. Т.е. если выберете два курса, вполне может статься, что времени больше ни на что не хватит.
Да, случается это редко, но ведь думаю об этом какой-то одной извилиной мозга я каждый раз, — и это очень-очень раздражает.
Вместо этого опт-аута лучше бы сделали сервис, через который подобные ошибки можно репортить.
Глядя на график, думаю, что хорошо хоть от IE7 и FF3.6 как-то с отвязались. Вообще сейчас политика версий такая: IE >= 8, остальные — latest stable. Первый релиз будет в следующем году, пока же ограничиваемся демонстрациями продукта. Поэтому и возлагаем надежды на WebGL, который к тому времени появится у всех, кроме Восьмерки.
С IE8 все весьма печально: тратим на него около 45% всех ресурсов и постоянно идет разговор об отмене его поддержки, но я исхожу из того, что в каком-то виде degraded experience у нас уже есть, поэтому пока терпим.
Вообще это длинная история, полная профайлинга и изворотливости. Если интересно, могу статью написать.
Добавьте к этому абсолютное нежелание поддерживать Оперу в компиляторе GWT — из-за этого как раз и не работал в ней Google Wave, — а также полное непризнанеи норвежцев как инноваторов индустрии. Например, когда зарелизили Chrome, в комиксе и в документации, а также во всех видеопрезентациях Google с радостью рассказывали о том, как они взяли лучшее из Firefox, IE и Safari, но функции, изобретенные в Опере, преподносили как свои. Сейчас припомню только табы выше адресной строки, но на момент релиза я насчитал штук семь или восемь таких вот «нововведений».
На всех презентациях Google Опера если и фигурирует, то очень и очень редко.
В Опере есть такая штука, как browser js — с его помощью исправляются баги в некоторых крупных сайтах. При каждом обновлении какого-то гуглового продукта, которое ломает что-то в браузере, ребятам из Оперы приходится, засучив рукава, разбираться, что же именно не так. Часто, как я писал выше, дело ограничивается простым удалением соответствующей проверки "
if (isOpera())" из гуглового кода. Но иногда все-таки всплывают какие-то баги, и чтобы их исправить, прихдется разбираться в минифицированном и обфуцированном коде Google. Я не говорю, что они должны давать Опере свои исходники, хотя такое сотрудничество пошло обеим компаниям на пользу. Но полностью запрещать доступ к своим продуктам — это, имхо, никуда не годится. Особенно с учетом того, что различия между Opera и WebKit-браузерами минимальны.Но поскольку в Гугле всем сотрудникам разослана секретная директива «не поддерживать Оперу», они решили разрабатывать свой велосипед. Параллельно с ними велосипеды изобретают все, кому ни лень, а в результате разработчики должны пользоваться зоопарком несовместимых костылей.
Виджеты — тут я, в общем-то, согласен — штука бусполезная, и без них вполне можно жить. Вернее так: их полезность предельна мизерна и во многом зависит от конкретного пользователя.
Например, в свое время общался с одним фанатом Твиттера, причем он был именно генератором новостей — писал много и часто. Особенно ему нравилась сиюминутность данного сервиса — он считал, что очень важно делиться впечатлениями именно в тот момент, когда что-то происходит, — 10 минут спустя и эмоции не те, и вероятность того, что то, что ты написал, уже известно твоим читателям, выше. Т.е. для него возможность постить всегда и везде была критичной. В результате у него на компе были твиттер-клиенты, в браузере стоял плагин, позволяющий отправлять твит прямо из адресной строки. А на телефоне у него был виджет постинга.
Но это весьма редкий юскейс. Знаю людей, которые вовсю пользуются календарями и планировщиками — у них висят соответствующие виджеты — глянув на экран, человек сразу видит список задач.
У меня висит виджет-плеер, как описал выше. Я переключаюсь между треками в одно нажатие — в приложение мне переключаться не нужно. Или переключатель wi-fi — можно включать-выключать антенну где-то в настройках, а можно иметь маленькую кнопку-виджет на рабочем столе.
Скажете, почему нельзя то же самое делать через приложения? В том-то и дело, что можно: виджеты — это не ключевой функционал системы. Другое дело, что через виджет вы можете экономить по одному-двум-трем операциям на каждое ваше действие (меньше жестов и нажатий). И если подобную операцию вы выполняете по нескольку раз в день каждый день, то экономия времени может выйти вполне приличная.
Все рабочие столы находятся на разном уровне удаления: первый стол доступен по одному действию: кнопке home, слева и справа от него — по двум действиям (home — свайп влево и home — свайп вправо). Соответственно, на первом рабочем столе должны быть наиболее часто используемые ярлыки и виджеты или то, что используется «на ходу» — ведь не всегда где-то на улице удобно листать телефонное меню. На двух соседних — то, что не влезло на центральный. На остальных можно разместить что-то еще.
Например, на первом рабочем столе у меня есть контакт своей второй половины — часто используемый элемент, и ярлык на SoundHound — часто использую в торговых центрах или кафе, чтобы узнать, что за музыка играет.
Что в этом неудобного? Никто же не говорит, что все полезное пространство нужно занимать кучей виджетов, не оставляя ничего путного. Если вам так удобно, расположите на рабочем столе только ярлыки программ — получите тот же iPad. Другое дело, что в отличие от iPad любой андроид-планшет может сделать что-то еще. Например, у меня висит виджет плеера с кнопками пауза-вперед-назад — ваш iPad так может?