Code coverage

Кратко про тему, на которой иногда копья ломаем. Code coverage — штука, которую в 3/4 мест агрессивно игнорируют, а в другой 1/4 агрессивно используют. Равнодушные встречаются не так уж часто.

Вся фигня в том, что это количественная метрика, на такие у разработчиков аллергия ещё со времён попыток оценить работу через LOC (кто больше строчек написал, тот и победил). Доведённый до абсолюта CC звучит вот так:
У тебя код тестами покрыт?
Да.
А почему покрытие 53%?
Потому, что остальной код — это обёртки с сотней тупых get/set.
И что? У нас покрытие должно быть 100%!
Иди нафиг, я увольняюсь.
Расскажу байку из жизни. Контекст: Python, сервис с некоторым покрытием тестами и некоторой документацией, живёт в production не первый год. Нахожу багу. Исправляю. Вроде исправилось, ништяк. Выкатываю. Проходит совсем немного времени. Сервис падает. Как оказалось, фикс баги открыл доступ к куску коду, который пару лет (емнип) не исполнялся вообще. И если бы хоть раз выполнился, сразу упал бы, что и произошло, там явная ошибка категории «что будет, если у null вызвать метод». Не хватило всего одного однострочного тупого теста, чтобы избежать пятисотящего прода.
Так вот. В нынешних условиях главная и важнейшая роль code coverage — показать вам код, который НЕ покрыт тестами и, быть может, вообще никогда не дёргался. Это полезно и для самопроверки (а не забыл ли я MyCoreServiceTest написать). Полезно для сторонней проверки (а есть ли в our.core.service вообще тесты). Полезно для оценки покрытия тестами ветвлений в том, что вы всё-таки решили потестировать (внезапно один if оказался за кадром).
Давайте ещё раз, пока не кинулись сразу же закидывать тухлыми тапками. На практике code coverage НЕ о том, СКОЛЬКО у вас тестов, фиг с ним. Он о том, есть ли вообще у вас тесты в нужных местах, а в ряде случаев и про качество этих тестов. Всё.

Но это… Честно говоря, мне гораздо спокойнее рефакторить код, который таки покрыт этими самыми тупыми и нелюбимыми 100%. Вот просто спокойнее. Не надо думать о том, правильно ли N лет назад Вася Иванов решил исключить что-либо из тестирования. Не надо прикидывать, написал ли Иван Петров в прошлом году тесты для того кода, что месяц аврально вклеивал. Если 100%, так хоть как, хоть одним вызовом, но весь код отработал.

О самостоятельности, часть I

Сначала про обычный фейл руководителя: делать всё самому. А если и не самому, то оценивать сделанное строго с позиции «как бы это сделал я». Начинающие (особенно из технарей) с этой грабли начинают, после чего либо стремительно умнеют, либо стремительно уходят из руководства (что тоже равно «умнеют»), либо становятся тем, что вроде бы должны изгонять — проблемой.
Если руководитель умнеет, он старается выделить самостоятельных бойцов и делегировать им задачи. Иначе говоря, не делает то, что могут (и/или для чего были наняты) другие. Не потому, что ленивый, но потому, что у него задач на тыщу человек, можно лопнуть лягушечкой на глобусе.
И вот тут начинается интересное. Какие качества должны быть у потенциально самостоятельного бойца (часть I)? Что такое самостоятельность и где её границы (часть II)? Как ею создать коллектив и как развалить (часть III)?

В этой части обойдусь интуитивным пониманием термина, т.к. требования к кандидатам от формализации не изменятся. Сами же требования подам через отрицание.
Во-первых, не надо давать тем, кто не хочет, пусть и может. Относится ко всему, конечно, работает и тут. Если делаешь что-то против воли, толку не будет, пусть вам и кажется, что вознаграждаете человека. Для него это наказание.
Следствие: практики «никто другой не согласился» и «только ты можешь спасти планету» плохи и далеки от оптимальности.
Во-вторых, не надо давать самостоятельность в области деятельности, в которой человек не разбирается достаточно для ожидаемого уровня решений. Это не значит, что ворота в стене Трампа только для возвысившихся senior’ов — junior вполне может получить собственную песочницу. Важна прямая зависимость между площадью песочницы и знаниями/умениями.
Следствие: хороший руководитель в ключевых областях знает и умеет больше подчинённых.
Следствие: при правильном процессе невежа никогда не получит право на решение.
В-третьих, не надо давать тем, кто не готов к негативной стороне ответственности. Отдельная и большая тема, но упомяну. Важна причиняемым вам ущербом в случае ошибок, которых вы могли объективно избежать. Поленился? Протупил? Мало знаешь? Проигнорировал инструкцию? Вплоть до увольнения с занесением в трудовую (что крайность, но нужна и вполне применяется). Не готов? Сиди кодером дальше, пиши по указке.
Следствие: очевидно, дети (и не всегда таковые по биовозрасту) к ответственности редко готовы. Массовая инфантилизация сдвигает взросление всё дальше со всем вытекающим, потому даже 30-летнего кандидата на песочницу требуется оценивать как 20-летнего лет сто назад (про Гайдара вспомнили, ага).
В-четвёртых, не давать тем, кто не готов принять всё, включая скучное или неприятное. Когда вы впервые получаете своё первое (пусть и съёмное) жильё, в «контракт» самостоятельности включается и уборка, и платежи, и воспитание соседей, и ежедневная готовка и прочее. В разработке та же фигня. Чем больше песочница, тем больше в ней работы с людьми, тестирования, сбора и обработки требований, документирования и остального, не шибко любимого разработчиками.
Следствие: кандидат на самостоятельную песочницу должен разбираться (и понимать нужду в) не только в разработке.

Что в итоге? Самостоятельность для тех, кто:

  1. Хочет её получить.
  2. Достаточно квалифицирован.
  3. Созрел для ответственности.
  4. Понимает и принимает выход за границы разработки.

Этого чеклиста безо всяких нюансов уже хватает для оценки и постановки. Да, в реальном мире такого бойца поди найди. Но чем дальше, тем увереннее думаю (а пару раз и точно знаю), что «я тебя слепила из того, что было» зачастую убыточнее по всем ресурсам, чем, скажем, бездеятельность в направлении за отсутствием человека нужных качеств.

Продолжение следует.

Элементы античности

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

Расширение файла в три символа. В 1974 году в свет вышла операционная система CP/M, в которой имя файла могло состоять из восьми символов, точки и трёх символов. Потом пришёл MS-DOS, взявший то же ограничение (как и дисководы A: и B:, кстати). Так и повелось.
80-символьные строки. Самое бесячье, когда начинают впаривать как аксиому. У нас тут давно широкие мониторы и шрифт меняется кеглем, но раз в 1928 году IBM выпустили перфокарты с 80 колонками, давайте продолжать.
QWERTY и ЙЦУКЕН. В 1870-х базовая раскладка латиницы завоевала мир с помощью печатных машинок Ремингтона. Ну а наш ЙЦУКЕН, видимо, «появился» в начале XX века. Если у вас были какие-нибудь фантазии на тему исследований частотности символов, органичности и т.п., то нет, ничего такого. Просто так получилось. А даже если и было, то за почти 150 лет человечество немножко изменилось. Но не раскладки клавиатур.
Байты и биты. Ребёнком меня это здорово удивило и удивление не прошло. До 1964 года в мире был бардак. Количество битов в байте колбасило в зависимости от фантазии производителя конкретного железа. Но тут IBM выкатили IBM System/360 с его 8-битным байтом. Казалось бы, ещё одна машина, и шо? Да, ещё одна. Только ставшая мегапопулярной, завалившая собою рынок, вышедшая на государственные уровни. Потому у нас 8 бит в байте, привет. Будь компьютер менее удачным, могло быть 4 или 16 (думаю, от степени двойки не удрали бы).
Итая, житая, катая. Вы же привыкли для целочисленных переменных использовать имена i, j и k? Так вот, история мутная. В 1954 году появился первый мануал по FORTRAN’у и сказано там буквально следующее:

fortran

Думаю, это и есть то, что повлияло на разработку. А вот на сам FORTRAN, похоже, повлияли обычаи математиков, которые в какой-то мере сформировал Рене Декарт работой La géometrie 1637 года (тут детальнее).

Алголоподобность. Если вам нужен строго один язык, повлиявший на весь мир и приучивший к определённым конструкциям, вам нужен ALGOL. Пусть к концу 50-х далеко не все его элементы были чем-то новым, но вот их совокупность выстрелила далеко и надолго.

algol

Почти все языки, что приходят вам на ум в первую минуту, отнаследованы в итоге от ALGOL. Также лет на 20..30 этот язык стал стандартом de facto для описания алгоритмов в научной литературе (вон на скрине почти всё должно быть вам понятно, а ведь почти 60 лет). Как мне нравится думать, почти всё в программировании придумали в 50..60-х, а мы наблюдаем за волнами разных реализаций одного и того же.

Против goto. Кто не сталкивался, тому повезло, но с 1968 года поднялась волна против goto (заодно и switch достаётся), да такая, что название эссе стало нарицательным в программировании: Considered harmful. Возможно, не будь этого эссе, современные языки (и современные программисты) выглядели бы иначе. А так… круги по воде до сих пор идут. Напоследок напомню, Дейкстра допускал использование goto в машинных кодах [читай “на низком уровне”]:

Later I discovered why the use of the go to statement has such disastrous effects and did I become convinced that the go to statement should be abolished from all «higher level» programming languages (i.e. everything except —perhaps— plain machine code).

Это несколько отличается от привычного у фанатиков полного неприятия, согласитесь.


Во всём этом занятно, как один человек или одна частная контора могут на столетия вбить свой частный выбор. У Петрова зелёный гвоздик, у Иванова красный гвоздик. Петров успел выйти на рынок раньше. Теперь все гвоздики зелёные. И вовсе не обязательно потому, что это особенно удобно и цвет победил в эволюционной борьбе.

Miscellanea VIII

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

Думаю, любой разработчик сталкивался с проблемой синхронизации данных из разных часовых поясов, да и просто с разным временем. Тем занятнее было в статье «Первая машинная обработка траекторных измерений спутника Земли» встретить следующий эпизод:

Когда, наконец, мы получили желанную орбиту спутника (точнее, хорошо наблюдаемой визуально ракеты-носителя второго ИСЗ), она привела нас в шоковое состояние. Оказалось, что в южном полушарии орбита проходила… под поверхностью Земли. Это, конечно, не могло быть правдой, так как данные наблюдений были недельной давности, а появления спутника регистрировались и позднее. Пришлось разбираться. Мы обнаружили, что в измерениях присутствовали ошибки времени их выполнения, доходившие до 5 секунд (около 40 км вдоль орбиты)! При таких ошибках и с учетом малой доступной базы измерений (лишь в пределах территории Советского Союза) точное вычисление эксцентриситета орбиты практически невозможно (полуось орбиты мы определяли хорошо, зная период обращения). Стала очевидной необходимость создания системы единого времени на пунктах наблюдения, что очень непросто, если пункты находятся достаточно далеко, например, на разных континентах

60+ лет прошло, а отсутствие точного единого времени всё так же наносит удары.


Кстати, про историю. Восьмибитный байт в СССР появился не сразу. Дело в том, что отечественные машины использовали в основном либо семибитный байт (Минск-32), либо шестибитный (БЭСМ-6, Весна, М-220 и др.), либо вообще переменной длины (привет Уралам). Потому решение взять IBM System/360 и всюду насадить в середине 60-х было очень интересным с точки зрения миграции софта. Ну и вообще история процесса любопытна в контексте дискуссий о том, почему в какой-то момент отечественный компьютерпром «по решению правительства и партии» свернул в другую сторону. Если кратко, то заигрались в зоопарк. А любой нормальный производственник терпеть не может зоопарк. С остальным всё было неплохо, но вот.

Любопытная (и уже слегка устаревшая) деталь китайского импортозамещения. В Китае суперкомпьютеры Тяньхэ-1А и Тяньхэ-2 построены на базе Intel. В 2015 году США решили, что нефиг китайцам ядерное оружие помогать считать, потому поставки процессоров Intel в вычцентры были запрещены. И тут в 2016 году ход конём: на архитектуре ShenWei китайцы внезапно делают процессоры ShenWei SW26010, на которых делают самый суперкомпьютер в мире — Sunway TaihuLight. Понятия не имею, в какую сторону всё-таки отразятся санкции на России (и спорить об этом не хочу), но вот Китай, на котором гроздь санкций не первый год, вполне толково выкручивается во всех областях, ещё и умудряется экономически рычагами поигрывать в нужных местах. При этом их IT/CS сообщество живёт в резервации, в собственном мире. Оттуда нет новостей, нет учебников, нет широко известного сугубо китайского софта (кроме Alibaba’шного). Есть забор. За которым миллионы программистов успешно что-то делают.

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

8e49a97e331143d7a092574c5a2cc333
СССР, конец 70-х, язык для школоты

Ну… Да. Как-то так. Пожалуй, хорошо, что английский не родной.

Про выбор андроидофона

Эссе для тех, кто твёрдо решил купить именно андроидофон в начале 2018 года. Я долго изучал и выбирал, пришёл к годному варианту. Может, кому из прочитавших путь пригодится.

Сначала сформулировал требования. Мне нужен боевой смартфон. То, что постоянно таскается в куртке, в рюкзаке, в руках, болтается на столах. Отсюда и набор.
Во-первых, не сверхдорогой и не уникальный. Если разобьётся, я не должен мужественно глотать слёзы и постить фоточки погибшего артефакта в соцсеточки. Комфортный потолок цены — 35К рублей. Плюс-минус пара тысяч. Ну ок, максимум 40К, но это вот прям если на душу железка ляжет. Так отвалились топовые Samsung, всякие Gresso и Huawei в Porsche Design, а также неадекватный по цене Google Pixel 2.
Во-вторых, должна быть влагозащита. Не хочу в морось на каждый слой капелек думать, не помрёт ли телефон. Так отвалились OnePlus 5/5T. Жаль, но номинально у них защиты почему-то нет вообще.
В-третьих, без этого новомодного закругления экрана. Отношусь к тем, кого бесит. Так снова отвалился Samsung S8 и пара интересных моделей других производителей.
В-четвёртых, камера. Очень важный для меня пункт. Много фотографирую и хочу, чтобы в смартфоне совокупность {сенсор, оптика, алгоритмы} выдавала нужный мне результат (потому и надо смотреть много фото, а не только считать числа). Перечитал множество статей, пересмотрел множество фотографий, намедитировался на отчёты DxOMark. При кажущемся разнообразии на рынке мало игроков, у которых всё в сумме хорошо. Samsung S8 (отвалился ранее), Huawei Mate 10, HTC U11, Sony Xperia (перебор цены), Google Pixel 2 (перебор цены), Xiaomi Mi6 (внезапно), OnePlus 5/5T (с некоторыми косяками, но всё равно отвалились по защите).
В-пятых, если наличие или отсутствие 3.5 не особо волнует, то возможность воткнуть карту памяти считаю одной из ключевых (предположим, мне есть чем заполнить). Так отвалился Xiaomi Mi6. Что любопытно, на форумах Xiaomi попадаются чуваки, сначала покупающие телефон и карточку, а потом спрашивающие, мол, а куда?
В-шестых, вычислительный запас начинки. Чтобы в потенциале хоть пару лет мне хватало на всё. Так отвалилось всё, у чего не 6GB оперативки и не Snapdragon 835 процессором (ну или эквивалент). Игры почти никак не волнуют, но обычно в паре с этой конфигурацией идёт и графика нормальная, потому как-то не парился совсем. Так вылетел LG V30+, который не попал в цену, не выстрелил ранее камерой, да ещё и в топовом флагмане ставит 4GB RAM, что теперь штатно даже в китайских нефлагманах (при этом уже и 8GB попадается). Странный ход, учитывая, что Android 7.x с обычной загрузкой обычными приложениями отгрызает 2GB+ со старта.
В-седьмых, экран. Строго говоря, на практике вполне хватает 1920×1080 (FullHD), но после того, как ознакомился с экранами большей плотности, субъективно захотелось всё-таки не FullHD. Для глаз отличие есть. Фиг уловишь, не сформулируешь, а есть. Это срезало чуть ли не половину актуального рынка.
В-восьмых, отзывы пользователей. Начитался Я.Маркета и офигиллиард страниц форума на 4pda. Таким образом накопил понимание pros и cons всякого в чужих руках — от глюков софта до лёгкости перепрошивки. Тут снова пожалел, что отвалился OnePlus 5/5T. Будь защита, были бы близки к идеалу. Обращал внимание на отзывы о царапучести стекла, качестве сборки, количестве брака, сервисных центрах и т.п. В общем, если предыдущие пункты достаточно объективны, то в этом набивал субъективность.
В-девятых, прогноз развития. Одни компании считают смартфоны основным бизнесом, другие равным, третьи побочным. Одни задирают цену маркетингом, другие близки к себестоимости. Одни выпускают полноценные версии прошивок с удобным окружением, другие ляпают абы было. Из всей совокупности происходит субъективное впечатление будущего. Скажем, у Sony всё хорошо, N лет делают одни и те же плоские кирпичики, поклонники довольны. А вот Lenovo колбасит в экспериментах. Если мне понравится текущая модель, хочу, чтобы через год-другой мог купить похожую следующую, а не странный разворот ряда на 180 градусов.
В-десятых, ваще полная субъективность. Могут спросить, а где Meizu? Не зашло. Взять тот же флагманский Meizu Pro 7 Plus. Есть бесполезный второй дисплей, но нет NFC. На ряде тестов показывает странную скорость внутренней памяти. Не хочу. Или вот Nokia. В конце 2018 года обещают выпустить чудо из чудес, а пока ничего интересного. Или ASUS — как-то… ничем не цепляющие смартфоны.

Неважным для себя посчитал следующее:

  • Как сказал уже, чип графики — мне не особо надо, а в выбранном диапазоне почти у всех норм by default.
  • Толстый аккумулятор — бОльшую часть времени провожу либо дома, либо на работе. Там есть розетки. Современный смартфон при штатном использовании (не танчики 8 часов подряд) спокойно живёт пару суток на одной зарядке, проверял. Этого хватит.
  • Дизайн задника — чехол всё скроет. Мало того, что он защищает железку и повышает ухватистость, так ещё и позволяет не любоваться отпечатками пальцев на всяком прекрасном с переливами.
  • Внешний звук — есть люди, всерьёз обсуждающие качество звучания музыки из динамиков смартфона и наличие или отсутствие ЦАП. Удачи им. Когда мне понадобится хороший мобильный звук, куплю специализированный плеер, полно их.
  • Двойная камера — как по мне, штука интересная, но учиться её правильно делать и использовать будут ещё с год. Пока это баловство.
  • Свистелки-сопелки — второй дисплей на заднике, реакция на сжатие, распознавание лица, датчик загазованности воздуха и т.п. Всем этим интересно поиграть пару дней, потом забрасываешь. Действительно полезные штуки через год появляются уже у всех.

Достаточно проанализировать свой последний год использования смартфона, чтобы вычленить реально нужное и отшелушить бесполезное.


Что осталось? Две модели. Huawei Mate 10 и HTC U11 128GB. Хоть монетку бросай. Монетка попала на HTC. Довольно любопытная компания, многим засветившаяся в истории Android, но в последние годы ушедшая с громкой сцены. Они всё ещё делают смартфоны. Они всё ещё дружат с Google. Google за $1.1 миллиард купил 2К+ сотрудников HTC R&D для разработки. Они делают Google Pixel 2. Они несколько последних лет выпускали трешак под своей маркой и демонстрировали все варианты провального маркетинга. Но внезапно выпустили крайне удачный U11 (не путать с другими U!).
Отличный фотонабор. Отличный дисплей 2560×1440. Топовый на данный момент процессор. 6GB RAM, 128GB internal у флагмана линейки. Вполне удобоваримая оболочка с оперативным выходом обновлений. Аккумулятора хватает для жизни. И при этом в декабре почему-то вместо обычных 45К рублей продаётся за 36К, что в сумме с другими финтифлюшками победило.
Фактически сейчас за адекватную цену можно купить гармоничный набор железа, который потом прошить удобной оболочкой. Правда, надеюсь, у HTC дела наладятся и вот этот годный флагман среднего звена не оказался случайной удачей.
Уф. Как-то так.

Итоги блогогода 2017

Полистал записи за год. Хочется зафиксировать сухую выжимку — что-то вроде среза текущего понимания происходящего как внутри, так и вокруг. Пусть это и будет итогами года у этого блога.

У вас нет времени на фигню, если хотите стать профессионалом. Время человеческой жизни конечно и не так уж велико. Из него время осознанной разумности работы мозга ещё меньше. Из него время, доступное для развития, ещё меньше. Из него время, которое вы тратите на подходящее (голове, характеру, историческому моменту, etc), ещё меньше. Как распорядиться этим огрызком — ответственность сугубо ваша. Важно в дальнейшем понять и принять следующее: причины, по которым вы решили потусить в баре с друзьями вместо более профитного занятия, интересуют только вас. Фразы типа «не, ну не могу ж я всё время работать[ и потому не знаю и не умею X, Y, Z]» заставляют собеседующих и работодателей только плечами пожимать. Вон в соседнем кабинете собеседуют Петю, Петя не тусил с друзьями, Петя знает и умеет X, Y, Z, Петя будет нанят. Вы же отправитесь в бар жаловаться на злобных дядек. Злобным дядькам от этого ни холодно, ни жарко.

У всего, относящегося к профессии, должен быть профит. Новые знания, новые умения, новые деньги. Если вам по занятной советской инерции успели вложить в голову некоторое отвращение (или стеснение) к словам «профит», «выгода» и т.п., назовите другим словом — «польза». До того, как чем-либо заниматься, сформулируйте цель и пользу от достижения цели. Максимально честно. Если хочется тупо с братанами побегать в стрелялке, не надо формулировать «изучение групповой геймификации в целях прогнозирования рыночного спроса на элементы игровой механики». Цель не формулируется? Скорее всего, вы собираетесь заняться фигнёй.

Профессионал — человек, обладающий глубокими знаниями и умениями в избранной области, AND актуализирующий и пополняющий знания и умения, AND зарабатывающий своими знаниями и умениями на жизнь. Я таких знаю. На их фоне несколько смешно и жалко выглядят «специалисты», находящие миллиард причин НЕ знать и НЕ уметь и НЕ хотеть. Да, смешно и жалко. Даже извиняться не буду. Пусть вас и много таких, знайте, хватает и другой породы. А вас однажды заменят автоматы, которые будут работать точнее и быстрее. Как вариант, появятся инструменты, которыми делать вашу работу сможет и дворник. К тому идёт.

Работу сейчас вы всё равно найдёте. Или не потеряете. И даже можете на текущем месте выстроить карьеру. Время такое. Вроде и плодят разработчиков миллионами, а всё равно задач выше маковки. Потому в диалогах и жарких дискуссиях занятная ловушка. Человек удачно сел в кресло. Вот нужен был его работодателю «нажиматель квадратных кнопочек». Потом middle нажиматель. Затем senior нажиматель. Ну а что? Стабильный бизнес. Роботы пока не умеют, дешевле выращивать специализированные растения в собственных горшках. Потом пытаешься обосновать такому нажимателю узость, шаткость и общую ущербность его позиции, но… он же SENIOR KNOPOCHKA DEVELOPER. У него оклад верхней четверти рынка. Весь его удачный опыт говорит об обратном. А ему впаривают про какие-то алгоритмы, структуры данных, сборщики мусора, Linux, мониторинг и прочее. Ха. Ха. Ха. Нажимать квадратные кнопочки — вот настоящее дело. Не получается дискуссия. Так вот, рекомендую хоть раз в квартал задумываться, не превратились ли вы в такое же существо в кадке.

Программист должен быть рациональным. Как и разработчик. Мы инженеры. Всё, с чем мы работаем, так или иначе, но в итоге измеряется линейкой. Субъективность и «я не знаю, но мне кажется…» возникают от незнания и лени. Никого не интересует, в какую мякотку вас в детстве покусали PHP, C++, Java, ZooKeeper, MongoDB, линейная алгебра и т.п. Это инструменты. Вы либо уместно их применяете, либо многозначительно шепчете «мне кажется», что по факту обычно означает «понятия не имею, а даже погуглить палец не поднимается». Суворов расстреливал каждого второго за «не могу знать», а стоило бы и за другое.

Солженицын ни разу не относится к любимым моим авторам, но слова его от этого менее верными не становятся:

Инженер?! Мне пришлось воспитываться как раз в инженерной среде, и я хорошо помню инженеров двадцатых годов: этот открыто светящийся интеллект, этот свободный и необидный юмор, эта лёгкость и широта мысли, непринуждённость переключения из одной инженерной области в другую и вообще от техники к обществу, к искусству. Затем эту воспитанность, тонкость вкусов; хорошую речь, плавно согласованную и без сорных словечек; у одного немножко музицирование; у другого немножко живопись; и всегда у всех — духовная печать на лице.

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


Да, стройно и цельно совместить всё сложно. Но если не пытаться, то ничего и не будет. А бесплодное барахтанье уныло. С наступающим вас. Барахтайтесь плодно.

Книги: The Busy Coder’s Guide to Android Development

busy
Mark L. Murphy.
The Busy Coder’s Guide to Android Development.
CommonsWare, 2017.
Во-первых, речь о версии книги 8.8 (о чём на обложке и сказано), это важно. Во-вторых, и здесь я пока успел прочитать 300+ страниц, но предварительно дальше полистал, чтобы устаканить мнение.
Пожалуй, если кому (мне) требуется чуть ли не единственный почти полный учебник / справочник разработки под Android, то вот оно. 4400+ страниц текста и скринов, на которых понятным языком рассказывается буквально всё. Постепенно, последовательно, с нужной детализацией. Т.к. книга электронная, обновляется постоянно, уже всё переписано для Android Studio 3.x, например. Актуальные ссылки и примеры, актуальный код (на который не желтеет инспектор).
Есть нюанс. Если предыдущий учебник больше для практиков (сначала пишешь код, потом думаешь и читаешь), то этот больше для теоретиков (сначала читаешь, потом думаешь и пишешь код). Мерно впитываете тонну информации.
Да, это хорошая книга. Рекомендую тем, кто не забивается от многабукав в уголок, чтобы поплакать. Чёт детальный обзор не получается, ибо ну… брать и читать, чё. Тот случай, когда не к чему докопаться.