Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (8)

Наибольший вклад в теги

Все теги (31)

Лучшие ответы пользователя

Все ответы (32)
  • Неужели порог вхождения в андроид разработку настолько высокий?

    Программирую на всяком-разном 30 с лишним лет, пишу под Андроид с самого его начала - начал незадолго до того, как приобрёл HTC A3288 Tattoo, почти 10 лет уже как.

    Не имею опыта работы, но понимаю как работает: Dagger, RxJava2, Moxy, разнообразное юнит-тестирование и всякие либы поменьше. Ничего не помню наизусть, даже методы класса Object. Имею смутное представление о том, как работает многопоточность, какие там есть виды списков и в душе не понимаю, как устроено хэширование объектов. Без IDE с подсказками и онлайновой помощи глух и слеп как котёнок.

    Без работы не сижу. Считаю себя успешным.

    Постараюсь сообщить минимальный набор, который помогает мне и, надеюсь, поможет вам найти себя, работу и всё, что пожелаете. Это всё - очевидные вещи, но, возможно, вы увидите что-то новое.

    * В первую очередь, необходимо иметь и культивировать четыре вещи: здравый смысл, уверенность в себе, внутреннюю свободу и аккуратность. Даже если вы ничего не знаете сейчас, вы должны осознавать, что узнаете это всё потом. И то, лишь в случае, если считаете необходимым. А благодаря аккуратности вы будете понятны большему числу коллег.

    * Поскольку библиотек с дублирующейся направленностью пруд пруди, важнее знать принцип работы, а не какую-то конкретную библиотеку.

    * Вы должны понимать, что все эти Dagger, RxJava и прочие Moxy - тупо библиотеки тупо пацанов, которые сидят в трусах перед компами и всё такое. То есть, изначально это всё - нонконформистская прогрессивная адова самописуха с присущими ей концептуальными и арфогрофичесскими ошибками, которая в нечастых случаях превращается в продукт примерно корпоративного масштаба. Потому, надо стараться не переоценивать их значимость на вегетативном уровне.

    * Держитесь корней. То есть, за корни. Ну, в общем, за JetPack, AndroidX и всё, что выдумал Google. Это основное и самое важное.

    * Старайтесь обходиться минимумом зависимостей.

    * Кроссплатформа - это совсем другая индустрия. Надо определиться, нативщик вы или кроссплатформа.

    * Обычное трудоустройство напоминает обучение вождению в автошколе: вы учите кучу всего, что требуется, потом сдаёте экзамен, получаете водительское удостоверение и через год помните только правило правой руки и полдюжины дорожных знаков. Ездите по городу по привычке, страдаете от того, что где-то повесили новый или убрали старый знак.

    * Устроиться на работу при наличии свободного времени можно очень просто: нужно найти достаточно большую группу вакансий, связаться с любым техническим руководителем, узнать, что конкретно надо знать. Ни один нормальный лид не откажет направить вас в нужную сторону с перспективой получить специалиста требуемого профиля практически без затрат на начальную подготовку.

    * Иногда важнее знать русский язык, нежели Java или Kotlin. Впрочем, иногда технический английский ещё важнее.

    * Даже если днище, безнадёга и фриланс, надо понимать, что есть два типа клиентов: те, которым надо красивый код в стартап и те, которым код не надо.
    Ответ написан
  • Какие знания нужны, чтобы создать такой продукт под android?

    Вот примерный список зависимостей, покрывающий описанные вами нужды:

    implementation "com.google.firebase:firebase-core:16.0.1"
    implementation "com.google.firebase:firebase-auth:16.0.2"
    implementation 'com.firebaseui:firebase-ui-auth:4.0.0'
    implementation "com.android.support:appcompat-v7:${supportLibVer}"
    implementation "com.android.support:support-v13:${supportLibVer}"
    implementation "com.android.support:recyclerview-v7:${supportLibVer}"
    implementation "com.android.support:design:${supportLibVer}"
    implementation 'com.android.support:multidex:1.0.3'
    implementation "com.google.android.gms:play-services-maps:${gmsVersion}"
    implementation "com.google.android.gms:play-services-location:${gmsVersion}"
    implementation "android.arch.lifecycle:extensions:${aacVer2}"
    kapt "android.arch.lifecycle:compiler:${aacVer}"
    implementation "android.arch.persistence.room:runtime:${aacVer2}"
    kapt "android.arch.persistence.room:compiler:${aacVer}"
    implementation "com.squareup.retrofit2:retrofit:${retrofitVer}"
    implementation "com.squareup.retrofit2:converter-gson:${retrofitVer}"
    implementation "com.squareup.okhttp3:okhttp:${okHttpVer}"
    implementation "com.squareup.okhttp3:logging-interceptor:${okHttpVer}"
    implementation 'com.karumi:dexter:4.2.0'
    implementation 'com.google.code.gson:gson:2.8.4'
    implementation 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'ch.acra:acra-http:5.1.2'
    implementation('com.afollestad.material-dialogs:core:0.9.6.0') {
        exclude group: 'com.android.support', module: 'appcompat-v13'
    }
    implementation ('com.squareup.picasso:picasso:2.71828') {
        exclude group: 'com.android.support', module: 'animated-vector-drawable'
        exclude group: 'com.android.support', module: 'exifinterface'
    }


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

    Самый главный и ценный навык - технический английский. Определенный уровень даже в режиме "только чтение" позволит вам быть в курсе всех технологических новинок в данной отрасли.

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

    Далее вы должны по поводу и без повода обращаться к руководствам Google по разработке для Android. Если вы Android-разработчик - вам без них никуда. Вникайте в методологии и методики, предлагаемые разработчиком платформы. Это очень важно, поскольку 90% возможностей приложения нормального человека так или иначе завязаны на сервисы Google.

    Затем следуют отраслевые ресурсы. Сайты с библиотеками кода и средствами разработки, через которые обменивается знанием подавляющее большинство разработчиков - ещё один ключ к успеху. В наше время лучше всего не изобретать колесо, если вы не заявляете себя в качестве изобретателя и конструктора колёс. Старайтесь в первую очередь использовать наработки людей, которые уже потратили своё время на решение конкретной задачи. Множество драгоценных камней сверкает в таких местах как https://android-arsenal.com/ , например.

    И пара советов лично от меня:
    • Изучайте Kotlin.
    • Приобретите 16 gb памяти, SSD и процессор с четырьмя или более ядрами. Установите и освойте Linux, хотя бы в объёме, необходимом для разработки приложений. Впрочем, я уверен, когда привыкнете, он вам понравится сам по себе. Я рекомендую Linux Mint.
    Ответ написан
  • Как определить объём работ и цену если в ТЗ одни общие фразы?

    Предлагайте клиенту "вилку" с разницей, соответствующей детализации заказа. Если заказ описан несуразно, кое-как, вилка, соответственно, будет большой (например, от 100 до 1000 чего-нибудь). Если заказ описан хорошим языком и Вам всё в нём понятно - разрыв можно уменьшать до нуля.

    В этом случае у вас будет объяснение, которое, возможно, мотивирует заказчика переписать техзадание более понятно для исполнителя.

    Ну, или найти другого исполнителя.
    Ответ написан
  • Почему люди уходят с фриланса в офис?

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

    Вообще, исторически, любая биржа труда - это днище. А фриланс-площадка - это биржа, как ни крути. Быть фрилансером - вынужденное состояние. Вот я, например, живу в относительно небольшом городе, где локальный уровень доходов меня не устраивает. Я не хочу переезжать, но хочу больше зарабатывать. Я иду на биржу и нахожу заказ, который позволит мне иметь доход, средний между столичной и местной зарплатой. Меня это устраивает. Как-то так.
    Ответ написан
  • Как выполнять код с определенной периодичностью?

    AndroidManifest.xml
    ...
    <receiver android:name=".MyAlarmReceiver" />
    <service android:name=".MyService" android:process=":my_app_alternate" android:enabled="true" />
    ...


    MyAlarmReceiver.java
    public class MyAlarmReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            context.startService(new Intent(context, MyService.class));		
            setupAlarm(context);
        }
    
        final long intervalMs = 60000; // Интервал в миллисекундах
    
        public static final void setupAlarm(Context context) {
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            Intent i = new Intent(context, MyAlarmReceiver.class);
            PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
            if (am != null) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalMs, pi);
                } else {
                    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + intervalMs, pi);
                }
            }
        }
    }


    MyService.java
    public class MyService extends Service {
    
        Thread workThread = null;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (workThread == null) {
                workThread = new Thread(run);
                workThread.start();
            }
            return Service.START_STICKY;
        }
    
        final Runnable run = new Runnable() {
            @Override
            public void run() {
                try {
                    while (true) {
                        //todo Что там надо делать раз в секунду
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException iex) { }
    			
                workThread = null;
            }
        }
    }


    Когда необходимо запустить выполнение кода, вызываем MyAlarmReceiver.setupAlarm. Последующие вызовы происходят из MyAlarmReceiver.onReceive.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (14)