Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Уровень pet project (android), с которым не стыдно идти на собеседование?

Привет,

Собственно, весь вопрос в заголовке.
А вот расскажите мне, пожалуйста, каким должен быть проект, чтобы быть достаточно убедительным подтверждением познаний и навыков кандидата? Каким функционалом обладать, с какими сущностями уметь работать etc.

Мнения, примеры... ?

Есть собственная наработка, которая после некоторого косметического допиливания отправится на андроид-маркет, вот хочу для себя понять, уже можно хвастаться потенциальному работодателю, или еще не очень.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Итак, мое приложение

(Ссылку можно, да ? Если нет — я уберу)
play.google.com/...spot.droidcrib.indoortest

Что использует, из того что здесь рекомендовано:
— Fragments
— SQLite, ContentProvider
— кастомный UI, стили, включения
— Работа с bitmap, canvas
— логирование и ловля ексепшенов
— Intents, intent filters, URI
— Реализация поддержки жестов

Остальное из рекомендованого (REST, facebook API, JSON, service etc) пока не релизовано, за ненадобностью в данном конкретном проекте.
На подходе еще парочка проектов, где все это будет использоваться.

Буду рад констуктиву.

И, да, ищу работу :)
Есть предложения — прошу в приват.

А можно здесь же узнать, дабы не создавать отдельно тему, уровень pet-project для Java джуна без коммерческого ОР?

И никто не упомянул верстку XML layouts

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

Другими словами, копипаста будет правильным решением. Если ты не в стартап собеседуешься, сделай так чтобы они увидели не что-то новое, а наоборот — «хорошие практики», то что уже видели.

— работа с вебом обязательна сейчас для большинства апп. Так что REST;
— все что тянешь из єтого веба должно бьіть где-то сохранено. Так что SQLite, ContentProvider;
— тянуть єто все будешь в бекграунд потоках. Так что Service;
— UI пусть будет матириал либо кастомньій, но не из стандартньіх виджетов. Так что Custom View;
— естественно нужно обвешаться шарингом во всякие социалки. Так что FoursquareAPI, FacebookApi, etc;
— ну и конечно же заюзать 100500 кастомньіх либ от Square, Nostra13, etc

С таки стеком технологий не то что на интервью, но и на маркет идти не стыдно ;-) Из недавнего сета проведенных собеседований с печалью обнаружил, что есть коммерческие проекты где люди до сих пор через AsyncTask-и запросы в сеть кидают. Так что если кандидат всем выше описанных владеет — то честь ему и хвала.

А чем плох AsyncTask? Не сарказм, я не андроидщик, но из интереса делал пет-проект для смартфона, именно в асинк-таске и вытягивал данные с сервака. Почему это плохо и что лучше использовать в этом месте?

пробовал во время стаскивания с сервака вертеть телефон в лендскейп-портрет?

Не приходило в голову, у меня довольно быстро там все скачивалось.
А что использовать вместо?

Ради єксперимента запусти свою апп на ємуляторе и поставь скорость интернета GPRS или EDGE. И тогда асинктаска проявит себя). Service обьічно используются вместо асинктаски. Ну или сама асинктаска стартуется в ретеинфрагменте, которьій не будет пересоздаваться, либо викреференсьі на активити делать, либо лоудерами тащить. В общем, костьілей много, и, не поверишь, бьівали ситуации, когда вместо 3-4 асинктасок я прикручивал 3-4 разньіх костьіля, ибо хотфикс в пятницу вечером)))

Немного уточню.
1. Асинктаска сама по себе не хороша и не плоха — это просто красиво обёрнутый выделенный поток с постом результата на UI Thread.
2. Service — это вообще не способ делать запросы в сеть. Она работает в юайном потоке. Новичёк поймёт Ваши слова буквально и сделает запрос прямо из OnStartCommand.
3. Неплохо было бы уточнить, что асинктаск нельзя юзать именно в активити, или фрагменте, если ваше приложение поддерживает поворот экрана (а зачастую коммерческие приложения этого не поддерживают, так что асинктаск там можно пихать куда хочется).
4. Если уж мы так обираем асинктаск, предлагайте альтернативу. Сервис — это не альтернатива, говорил же уже, он работает в том же потоки, что и активити и запросы из него будут фризить юай. Если имели ввиду IntentService, так пишите уже корректно имя класса, т.к. вы вводите новичков в заблуждение, а то вскоре увидите в коммерческих проектах http-запросы прямо в OnStartCommand в сервисе.

Думаю, перед тем как начать использовать сервисьі, новичок зайдет хотя бьі на Андроид девелоперс и все єто прочитает, и про интентсервисьі и про необходимость создания другого потока в сервисе. Наводку я дал, дальше дело за новичком)

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

у меня довольно быстро там все скачивалось.
Весьма смелое допущение :-)

Бросьте, там всё ровно. Асинктаск — норм штука,юзает под капотом Executor framework, единственный момент, это то, что у него глобальный контекст(если не задать ему явно тред пулл), тоесть будут разные на первый взляд асинктаски выполняться последовательно.

Пошел принемать валиум... Старается Гугл, старается. Тратит время на конференции, гайдланы, туториалы, обучающие видео и т.п. А на дворе 2015 год и народ пишет что

Бросьте, там всё ровно. Асинктаск — норм штука,юзает под капотом Executor framework
занавес... FYI: В нормальной штуке асинктаск, минимум уже два раза меняли поведение, т.е.
то у него глобальный контекст(если не задать ему явно тред пулл), тоесть будут разные на первый взляд асинктаски выполняться последовательно.
— далеко не факт.Ну и асинк такс позиционируется как инструмент для быстрых операций в бэкграунде, учитывая что время запроса в нетворк вы предсказать не можете (по куче причин, например, скорость ответа может быть ниже ожидаемой, сервер перегружен, длинный респонс, низкое качество связи, и т.п.) то использование асинк таска может потянуть за собой написание кучи костылей, так что уж проще и эффективней будет освоить сервисы или лоадеры.
Пошел принемать валиум... Старается Гугл, старается. Тратит время на конференции, гайдланы, туториалы, обучающие видео и т.п. А на дворе 2015 год и народ пишет что Бросьте, там всё ровно. Асинктаск — норм штука,юзает под капотом Executor framework
 — что за вброс? Коль пошёл такой разговор — давайте будем аргументированно дискутировать, фразы типа: «А на дворе 2015 год, Старается Гугл». — не аргумент, вы ведь считаете себя Тех Лидом. Вы что сомневаетесь, что у асинк таска глобальный контекст?) Знаете, хотел бы я вас пособеседовать, думаю много весёлых вещей услышал бы.
Ну и асинк такс позиционируется как инструмент для быстрых операций в бэкграунде
 — никто и не спорит, а рекомендуют это именно потому, что могут лочиться по этой причине другие таски.
Знаете, хотел бы я вас пособеседовать,
Боюсь что не доросли еще)
не аргумент
Конечно не аргумент, в гугле сидят ребята явно гулпее вас, тратят время на написание вской куйни, когда асинк таск давно реализован его можно совать туда — сюда, там глобальный контекст, тред пул, экзекутеры и т.п. Ага...
Контекст там не может быть глобальным хотя бы потому, что трэд пул там является статиком, дальше вспоминаем о том, что приложение выполняется в песочнице своего процесса, а чуть ли не каждую активити можно запускать в своей процессе — то это уже не работает (вы вместо последовательной обработки запросов получаете гонку потоков на ровном месте). Потом, абсолютно не понятно, что это вам дает, после сбора системой активити вы все равно не сможете получить результат операции без написания кучи поддерживающего кода (которая уже реализована в лоадерах).
Ну и его поведение меняли при переходе с 2.x на 3.x, начиная с 4-ки опять вернули 2.x реализацию. Что как минимум уже вносит некую лепту в фрагментацию ожидаемого от класса поведения.
Этого хватит или вы еще какие-то смешные вещи от меня хотите услышать?
— никто и не спорит, а рекомендуют это именно потому, что могут лочиться по этой причине другие таски.
Ну и? Вы будете продолжать настаивать на том что выполнять вызовы в сеть через асинк такс это ок?

Асинк выполняется в глобальном контексте ПРИЛОЖЕНИЯ? Мы можем сказать асинктаску выполняться ,в несколько(n*2+1, где n — количество ядер) тредов, но если тасок вдруг станет больше n*2+1, будем ждать. Ограничение глобального контекста можно обойти задав кастомный екзекьютор и будет те счастье.

Вы будете продолжать настаивать на том что выполнять вызовы в сеть через асинк такс это ок?
- sure.
в глобальном контексте ПРИЛОЖЕНИЯ, запомнил?
Спасибо поржал...Пиши еще :-) Интересно, найдутся тут еще люди которые подтвердят ваш бред насчет глобального контекста приложения? Ты даже тупо не видишь разницу между потоками и процесами, о чем с таким животным вообще еще можно говорить? Давай почитай вот этот топик developer.android.com/...rocesses-and-threads.html утри сопли и возвращяйся на серьезные темы говорить, если что-то поймешь.

Уточни у Романа Гая как работает асинктаск, Гуглу ты ж веришь.

А можно простым смертным пояснить — что значит выполняется в глобальном контексте приложения?

Поки не закінчить свою роботу asynctask, не оновиться ui activity.
Але можу помилятися.

Ошибаетесь.
AsyncTask не рекомендуется применять как inner class activity, потому что внутренние классы хранят ссылки на внешние, и в этом случае возможны memory leak, вот и все, никаких ссылок на Context в AsyncTask нет.
Впрочем можете сами посмотреть :
grepcode.com/.../AsyncTask.java#AsyncTask

Абсолютно верно, касается не конкретно асинков, а inner классов вобщем.

но мы можем сделать внутренний класс AsyncTask статическим и просто привязать к конкретному экземпляру активити. Впрочем, юзаем лучше лоадеры)

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

new AsyncTask<object[], void,="" object="">() {

private int mСounter;

@Override
protected Object doInBackground(Object[]... objects) {
while (mСounter< 10) {
mСounter++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}

}.execute();
— в активити, например, и сервисе, то первая стартанувшая асинка не даст второй начать работу, пока сама не выполниться(serial mode, так называемый). Неверующие можете попробовать сами. То есть, несмотря на то, что мы используем разные инстансы асинктасков, они, как бы, выполняются в глобальном контексте приложения, а если быть точным процесса приложения, то есть у каждого процесса свой глобальный контекст, heap, ну и т.д.. Это нужно понимать. Обойти это поведение можно либо сказав асинке работать конкурентно через пул — executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR), в этом случае таска если все треды в пуле будут заняты добавится в очередь(если будут места)) и будет ждать своего часа. Также вы можете вообще реализовать свой кастомный экзекьютор и сказать асинке его выполнять, все коллбеки в этом случае будут работать корректно. Касательно того, что не рекомендуется выполнять долгие задачи в асинке — это справедливо для serial mod’a, в параллельном режиме используйте для любых(и долгих тоже) задач на здоровье.

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

Могу добавить:
— работа с NDK
— красивый код на Git (архитектурка там чтобы была)
— логирование и ловля ексепшенов
— нотификейшены

ORM в андроиде от лукавого, ContentProvider наше все. По библиотекам неплохо было бы увидеть Dagger 2, Mortar, Flow, Picasso etc. Ну и Material design конечно же

От лукавого говоришь? Ну надеюсь тебе не придется столкнуться с новым проектом где на клиенте надо держать несколько десятков перевязанных по самое не балуйся таблиц с инкрементальной двусторонней синхронизацией. Почему «новым» — потому как все оно со временем может меняться от версии к версии ;)
Насчет ContentProvider — часто предоставляете доступ к данным «наружу»? ;)
И, кстати, сравнивать ORM с ContentProvider это примерно как сравнивать Java с Android ;)
Одно другому не мешает. Ваш КО :)

Не пишите глупости, а лучше и не делайте...ORM на мобаиле — антипаттерн, так как «устройство с лимитированными ресурсами», и т.п. Если бы это реально работало — то уже бы давным давно кто-то да внес в свою SDK/API какую-нибудь ORM (как єто происходит с Support Library на Android куда пихают все юзабельные опенсорс либы). Но тем не менее, несмотря на далеко не первый год развития да и не первую версию SDK/API никто (не Google, не Apple, не даже Microsoft с его .NET Entity Framework) не додумался внести поддержку ORM на уровень мобильной платформы. Вообще, единственный кейс где ORM реально юзабелен — это вам надо состряптаь на коленке быстренько БД в одну таблицу для демки.

Если бы это реально работало

Ага, ага.. «Не читал, но осуждаю» ©.
ЭТО реально Работает :)

Вообще, единственный кейс где ORM реально юзабелен — это вам надо состряптаь на коленке быстренько БД в одну таблицу для демки.

Для ОДНОЙ таблицы ORM как раз абсолютно не нужен, спокойненько самому можно в DAO слое все прописать.

ЭТО реально Работает :)
Конечно работает...куяк-куяк и в продакшен. А чё? Я вам могу рассказать почему то что вы сделали плохо, и не совсем и работает, но учитывая ваше рвение в отстаивании своей позиции, боюсь что это будет напрасной тратой времени.
Для ОДНОЙ таблицы ORM как раз абсолютно не нужен, спокойненько самому можно в DAO слое все прописать.
В вашем случае он тем более не нужен, книга по SQLite вам в помощь.
P.S.: Кроме того что вы каким-то костылем решили свою проблему (которая вообще непроблема на самом деле), я пока от вас ничего внятного не услышал, давайте приведите хоть одну ссылку на использование ORM в гайдлайнах или как Best Practices от Google, а потом поговорим.

Не только ОРМ, но и разные DI, перебор с паттернами и т.д.. А вообще быстрее и гибче чистого SQL с курсорами ничего нет.

но и разные DI
 Сейчас вас набегут бить адепты Дагера и всяких ивент басов (они кстати тоже антипатерн, гугл для таких вещей LocalBroadcastManager сделал).

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

И чего же EventBus это антипаттерн? И Dagger 2 намного лучше чем Dagger

И чего же EventBus это антипаттерн
Непрозрачная диспечеризация операций, сингелтон — не работает в мультипроцессорной среде.
Dagger 2 намного лучше чем Dagger
Да ради Бога, только это ничего не меняет.
— работа с NDK
Это overkill. Даже гугл не особо рекомендует залазить в эту плоскость без особой необходимости.
— красивый код на Git (архитектурка там чтобы была)
Ни о чем, «красивый код» — понятие растяжимое (кому-то будет красивый, а кому-то — overengineerin).
— логирование и ловля ексепшенов
- да ладно?! А может лучше эксепшены избегать (ну там не знаю, предусмотреть все мыслемые и немыслеммые кейсы) чем ловить? А то так и весь код, тупо, в try..catch завернуть можно.
— нотификейшены
Это детский сад, который можно тупо скопировать из туториалов.
Это overkill. Даже гугл не особо рекомендует залазить в эту плоскость без особой необходимости.
— грамотной работой с нативным кодом, как минимум можно выделяться среди куевой тучи клепателей убийц фейсбуков, не говоря уже о других возможностях. В *опу что там гугл говорит, если он не предоставляет SDK под необходимый функционал, то заказчики не ждут, и не плачут в тряпочку как нам быть, и не пингуют гугл а делают нужные либи и внедряют их зеленого робота.
Ни о чем, «красивый код» — понятие растяжимое (кому-то будет красивый, а кому-то — overengineerin).
— человек должен писать удобночитаемый, даже самодокументируемый код, а не *овно брошеное на вентилятор. И вообще странно такое услышать от тим лида. Такое ощущение что вам абсолютно все равно как новый человек излагает свои мысли/код? Вам же с ним(абстрактный програмист) работать дальше.
— да ладно?! А может лучше эксепшены избегать (ну там не знаю, предусмотреть все мыслемые и немыслеммые кейсы) чем ловить? А то так и весь код, тупо, в try..catch завернуть можно.
— вы видимо самсунговского тачвиза мало хлебнули! О кастомных прошивках я вообще молчу. Там иногда такие перлы вылазят что повеситься хочется когда в сапорт пишут гневные письма, а вы не сном не духом, ибо бага не репродюситься на десятке выших тестовых дивайсов. Пойдете к гадалке?
Это детский сад, который можно тупо скопировать из туториалов.
— копипаста — грех! в общем согласен. Но это такой же детский садик как и Rest, фрагменты, сервайсы и все остальное.
И вообще странно такое услышать от тим лида
от тимлида такое услышать нормально, а вот от техлида это звучит дико

Ну, вам видней. Че тут спорить.

Давайте еще добавим RenderScript, OpenGL -)
Джуну все равно какой пет проект, скорее всего его и смотреть особо не будут.
Так как будут спрашивать основы — то в проекте лучше использовать чистый Android SDK, что бы потом не было — «я не использовал сервис — Retrofit все делает за меня».

Кто не собрал под виндой ffmpeg в конфигурации с встроенным сервером — тот жизни не видал)))

Ну если чел разобрался и с рендером, и с OpenGL — это ведь круто и прибавит шансов.

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

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

Заниматься сейчас джуну чем то экзотическим в ущерб стандарту — считаю плохой идеей, потом приходят такие люди и доказывают что LinkedList везде лучше ArrayList. -)

то заказчики не ждут,
Ага...а заказчики ждут пока вы нативный код додебажите, а потом еще чуток подождут пока вы решите все проблемы с мемори ликами, обратной совместимостью и т.п.
Такое ощущение что вам абсолютно все равно как новый человек излагает свои мысли/код? Вам же с ним(абстрактный програмист) работать дальше.
Я разве это где-то написал? Если да то приведите ссылку. Я лишь отметил что понятие «красивый код» — весьма растяжимое. Кто-то будет фапать на 100500 интерфейсов и уровней абстракции находя в них все мыслемые и немыслемые паттерны, а кто-то посмотрит на это все и скажет что это все оверинженеринг, всего этого ООП-головного мозга там не надо, все тоже самое можно было проделать с помощью обьектной модели в 2-3 класса и за пол часа, и будет прав, кстати, ибо YAGNI, DRY и KISS. Для новичка грань между ООП головного мозга и «красивым кодом» весьма размыта, это приходит с опытом.
— вы видимо самсунговского тачвиза мало хлебнули! О кастомных прошивках я вообще молчу. Там иногда такие перлы вылазят что повеситься хочется когда в сапорт пишут гневные письма, а вы не сном не духом, ибо бага не репродюситься на десятке выших тестовых дивайсов. Пойдете к гадалке?
Нет, я к вам пойду, чтобы вы мне все в try..catch завернули и на каждую строку кода по логу приходилось :-)
Но это такой же детский садик как и Rest, фрагменты, сервайсы и все остальное.
У нас вакансия открыта, загляните на огонек. Расскажите как вы в детском саду ориентируетесь.

Підписатись на коментарі