Grön Android figur

11 years of Android: A brief history of time

Hello dear reader. My name is Ivan and I did 11 years of Android so you don’t have to!

Yes, this is a cautionary tale for any young mind foolish enough to venture into the dark depths of the tech industry. It is a personal story full of excitement and wonder, ups and downs, struggles and breakthroughs, trials and errors, exaggeration and oversimplifications for your entertainment. It is also filled with domain specific engineering jargon like: domain specificcontext leaksif (!isAdded()) returncrippling anxietycoroutine exception scavenger huntscreen orientation lock,

Android kod

From what you’ve read so far, you might assume that I dislike Android. That is not the case. It would be silly to spend 33% of my entire and 100% of my adult life working on something I don’t like.
I do like Android, in fact. It made me how I am today. It allowed my financial freedom and mobility. It allowed me to work with amazingly brilliant people on awesome ideas. I’ve traveled, advocated, started, failed, learned, managed, led, created, connected thanks to Android.

But, we have to be real: Android development is not great!
It never has been. It may never be. Sure, it has gotten better lately, but it is not the prince that was promised. It is just a John Snow.

Krigare med brinnande svärdMy bet is on Bitcoin now.

To walk you through my bold claim, I would match my subjective experience with Android to the historical periods of human development, starting from prehistory all the way to the present post truth era. Brace yourselves for a brief history of time:

The Prehistory

Yes, you read it right, prehistory. You may not be personally aware of this, but we are on the exponential curve of development heading straight towards singularity. So many things have happened in recent years, 11 years ago does seem like prehistory. Few hundred years ago, if your father was carpenter, chances were you would be one too (under the assumption that you managed to survive your childhood). Nowadays, if you choose one framework, chances are in 12 months you would need to refactor everything. *coughs* RxJava *coughs*. Except for Fragments of course. They are here to stay. Like the appendix in our body, Fragments are laying dormant, waiting for someone to restore the instance state or pop the back stack and wreck some havoc.

Little is know about prehistory. The tools we used were made from wood, they did not survive the elements, they decomposed over time. What we can recall is from the paintings on the walls of the deepest caves. The Activities were the deities, the God classes, containing all logic, leaking contexts left and right. Things that give modern developers a mini heart attack today were common back then. Manual network requests, manual image loading and caching, network on main thread, yes, network on main thread, dreadfully slow and unusable emulator, trackballs, hardware keys, jars, Eclipse IDE, svn, SOAP. Simple Object Acquisition Protocol. Oh my, what a misleading name. The person that made this up sure had the last laugh.

The only SOAP you should be aware of. Stay healthy, stay strong in these odd pandemic times!

Indeed a time of great hardship, but also a time of great freedom. No design guidelines, zero requirements for publishing on Android Market (yes, Google Play was called Android Market once), no libraries to tell you to initialize them in the Application class, no doze mode, no limits to background execution, no data to process, no stack traces to analyze. The path to greatness was straightforward, you just copy the first answer from Stack Overflow, you don’t really need to understand what attachToRoot parameter means during layout inflation.

The Ancient History

Ancient History, referred also as the Classical Period, named after the emergence of the classical Android problem: fragmentation. Every person in the world with a stable internet connection downloaded the AOSP code and made their own version of Android. You want Hello Kitty icons? You got it! HTC UI on a ZTE device? Why not! An ad blocker with root privileges? Yes sir! Oh, the Bluetooth is not working, the camera only captures portrait and there is a high possibility for bricking? No worries, the cyan Android is worth all that.

CyanogenMod

Tiny civilizations formed around these early attempts of consolidation, each with their own similar, yet distinct culture. The platform was maturing, the Contexts in the AsyncTasks were being wrapped in WeakReferences. JSON was the language most servers could speak. Git became the one version control system to rule them all. Steve Jobs unleashed an oversized phone (that would later on be referred as tablet) which made development needlessly more complex. Whispers traveled from the far East about an exotic IDE and a new build system that will make development a breeze. No more jars, no more ants.

Language evolved as well. People started talking about and partially understood the previously unheard topics of ViewHolders, Fragments, Tablets, Holo Themes, SherlockActionBars, Hamburger Menus. There are written evidence of Android apps that managed to look good while NOT being an exact copy of the iOS one, a groundbreaking progress made by early design pioneers and courageous explorers.

While there were sparks of civilizations here and there and the future looked bright (ex. Instagram just got ported to Android), keep in mind these were still barbaric times, a wild free for all with little structure, excessive wake locks, permanent background processes and massive battery drainages.

The Dark Ages

At this point of history, Android became the weapon of choice for the masses, offering a wide variety of mostly functioning low/mid end devices. Blackberry was moved to museums next to where the dinosaurs were kept and while still early for a full on flagship battle with iOS, the ecosystem provided everything you would need from a smart phone for a price that would not require your parents to get a short term, high interest loan for you to look cool. It may sound silly today, but these were times when iOS vs. Android rivalry was taken quite seriously.

The worthy knights had to pledge their alliance, worship and defend their consumer preference honour vigorously.

According a scientific census that I made up for the purpose of this article, the dark ages officially began when the first production app hit the 64K methods in a single DEX file limit. This signalled that the limits of the intended platform usage have been reached and now fragmentation is running amok. This, together with few other cataclysmic events like Samsung consolidating a large chunk of the market with the worst phone in the history of phones – S3, brought upon the dark ages.

In the fist company that I worked in, we had a whole team dedicated to handling S3 specific bugs.

Google did their best to fix the leakages, address the platform bugs, force OEMs to push OTA updates of their OS (if you don’t know what these abbreviations mean, just read forward and save yourself a google search) and provide useful APIs and guidelines to developers, but to avail. The manufacturers were slow to react, Views were filled with if-else branches for handling device/platform specific bugs and 3rd party libraries were using AlarmManagers to upload entire phonebooks, call logs and messages to their servers while you were sleeping.

Development felt more like trial and error, patch and ship than a structured approach. It still took three Hail Mary’s and a process death to start up the emulator (hello Genymotion), build speeds slowly deteriorated and up until this day they never fully recovered. It became a common practice development teams to have dummy projects that compile within reasonable times, develop features and especially UI there, then just copy paste them to the main project. It did also not help that Google was pushing for the worst API ever created for Android – Loaders to compete with already terrible ones like AsyncTask, ContentProvider, ContentResolver, ListView, RecyclerView (View in general for that manner), Camera, Bluetooth, Resources, Styling, Theming, Keyboard,…

The Renaissance

Regardless of how dark it gets, human ingenuity will never let darkness prevail. The Renaissance, the great awakening, the age of enlightenment started when Google figured out that you don’t really need to wait for device manufactures to push fixes updates to their users, they can delegate that responsibility to the developers. Thus, the support libraries were born, a massive overhead of code and complexity that you need to include and maintain in your project to patch an OS that cannot update fast enough to compete with Apple.

This forward thinking started rolling the ball forward and brought even forwarder thinking. Just like the great renaissance Renaissance painters that drew inspiration from Ancient Greek culture, Android developers wondered what can be learned by studying ancient cultures. Was there any wisdom hidden in backend or web development? Did they know something we had forgotten?

Hello World code
What is this cryptic language trying to tell us?

 

It turned out there was! For example, you can actually organize your code, not just stuff everything inside an Activity or a Fragment. By doing so, you can split the presentation from the domain layer and even test them separately.
I did not believe it when I first heard it. Writing your code in a way that is testable and reusable seemed wasteful. What was next, writing your tests first, then writing your code? Heresy! I wanted none of that.

But, just like in human history, science prevailed. Uncle Bob figured it out. It turned out that the MV(C/P/VM/I) is a good way to organize your code and all the boilerplate is just worth it. Sure you would copy and paste the same thing in dozens of different files for a while, but it is a matter of time until someone writes an annotation processor or a command line tool that will generate this for you, confusing the Gradle build system and setting you on a google search quest that will ultimately lead to deleting the build folder, invalidating the cache and restarting the Android Studio.

Support libraries grew to become behemoths (remember when just including the GSM megalith pushed your app over the 64K limit), but also enabled creating better user experiences. Android was not the underdog anymore. An opportunity for taking the lead arose. For the first time in history Android became cool.

Of course, some forward thinking went too far. Reactive programming became a fad, but ultimately caused more problems that it solved. Same goes for any ORM libraries that tried to abstract out the limits of SQLite (hello Realm). Google also got excited and went ahead of themselves with Ahead Of Time compiling, Jack, Instant Run,… All these ideas were awesome in theory and received massive highlights during Google I/O events, but ultimately failed to deliver on the promise of making Android development great.

The Industrial Revolution

Once people find something that is working, they are amazing in scaling it up, iterating over it, finding more and more ways to squeeze every last drop, consolidating the market, removing the noise, silencing the competition. Enter the machine dear developer, rejoice! Gone are the days of you being stuck with a bug from a dependency because the repo maintainer went on a vacation and never came back. Gone are the days where you would have to rely on Jake Wharton‘s pet projects to find views by ids in a fancy manner. The capitalists took over. The old gods are dead. You will heed to what Google “recommends”.

Grön Android figur
And if you don’t like it you can always use Huawei‘s services

Development was moved to the assembly line. It was not longer art and experimentation. It was no longer “we do what our introvert tech lead genius tells us to”. We now know what works: Kotlin + MVVM + Coroutines + the full Google suite of support libraries and services. You inject stuff now. Inversion of control or something. You don’t need backend even, you have Firebase that cost practically nothing under the assumption that you excessively duplicate and nest your data to avoid multiple queries. Everything is documented and everything works as intended except when it doesn’t.

You don’t even need to think, the Android Studio new project wizard generates all the boilerplate for you, sets up the navigation, the annotation processors that never affect your build speeds, decides what flavours to be built on your CI/CD build machines, it tracks every user action and reports their feedback in a Slack channel that the PO/tech/team lead needs to monitor to demonstrate to management that all that talk that branding and marketing came up with about caring for our users is actually true.

Sure, you still need to write Adapters and bind ViewHolders for your RecyclerViews like is 2010, you still have to guess if the keyboard is up or not, you still need to google on how Service can communicate with an Activity, you are still uncertain what library update will break the incremental compilation, forcing you to think that at this point the only thing that may reduce build speeds is Apple Silicon.

But, that is all fine. At least now you have social login out of the box, mature design system – Material with solid principles and extensive guidelines that everyone knows, except for some reason, your designer. That is not all, you also have streaming operations for lists and extension functions you can use to puzzle the junior developers as you chain your way to the most elegant piece of code you have ever written.

        viewModelScope.launch {
            firstFlow
                .zip(secondFlow) { first, second ->
                    first.takeIf { it.contains(second) }
                }
                .mapNotNull { it }
                .distinctUntilChanged()
                .collect { Log.i("TAG", it) }
        }

The Modern Times

People in the early 20th century envisioned the future as this bright, modern place with flying cars and Jetpack. No flying cars yet, but at least we have Jetpack now to fly us places. Showing late to the party, Android finally embraces declarative UI with Compose, hopefully just in time to prevent some young kids venturing into Flutter or god forbid React Native with their false promises of covering multiple mobile, web and desktop platforms with a single codebase, hot reloads, a simpler way to deal with UI, navigation, multithreading, theming, styling, animations,…

But what about performance fellow kids?

Updates nowadays are more incremental polishes than meaningful changes. Except for the top notch, that was a game changer, it triggered a movement of millions of developers spending at least few hours adapting their layouts to account for the brilliant stunt that Tim Cook and Jony Ive pulled to break the $1000 mark for a phone. Can wait for the $2000 mark for the foldable displays.

Edges alternate between square and rounded every season, because groundbreaking design progress happens once a decade or so. In between you go from AlertDialogs to BottomSheets, from Rose Pink to Crimson Blue. After more than a decade of maturing, UI or end-to-end flow testing is still not viable, the amount of effort that takes to setup and maintain is really not worth it, business wise is easier and/or more cost efficient to outsource and let people with names you struggle to pronounce to click through hundreds of test cases. You can use your precious developers time to round off that Toolbar, so your app does not look exactly like million others in existence.

The European Union with their concern for user’s privacy in collaboration with hackers interested in obtaining that privacy, shrank the limits of what you can you as a developer. Permission and consents pop up all the time, users promptly deny or ignore them, depriving companies from the much needed data, resulting in even a stronger push to get it by any means necessary.

And this is what modern times development is, tricking the users into giving up their data. It is less about solving a problem or providing a service and more about figuring out an ad placement that will yield +0.6% of revenue through a masterfully crafted A/B test. It is about integrating tracking libraries to segment your users and serve them personalized content based on a model that your data team trained and your backend delivered via Server Driven UI.

Modern times come with modern fancy tools, you can now monitor network, memory, CPU, object (de)allocation, memory leaks, query local databases, peek into the layout hierarchy, drag-and-drop constraints,… Still, most of the time you will not spend using them, but figuring out why they need plugging and unplugging the USB cable in order to work or something completely unrelated like why the horizontally scrolling nested RecyclerView within a vertically scrolling parent one does not retain the state upon orientation change.

The Build Analyzer is here to ensure you that there is nothing you can do to improve your build speeds until you remove all that legacy Java.

The Future

If we 2012 and the Maya ever thought us anything, is that no one can really predict the future with great confidence.

Planeten Mars
And if you don’t like it you can always use Huawei‘s services

Android has matured so much, that I can imagine being somewhat difficult for new developers to catch up. Activity/Fragment/Service lifecycles, Adapters and ViewHolders, FragmentManagers, ViewModels, LiveData, the complex topic of multithreading with the added spice of coroutines and of course, Flows can be quite overwhelming if you are just starting.

In my free time I play around with ReactNative and Flutter and I will now say something that myself from few years ago would never dare to say it: It is so much better! Not the best, these platforms still have some maturing to do, but much better.

Maybe even Kotlin Multiplatform one day, TypeScript and Dart are just so last century.

And I can recommend these frameworks (with a preference towards Flutter, but this is personal) to people who would want to get into mobile development. It just makes more sense. Why limit yourself to just Android by learning Native when you can pretty much do the whole frontend with a single framework. Mobile, web, desktop and whatnot. Include few Firebase dependencies and you are full-stack now.

And as more and more beginners are starting with multi-platform, as more and more tech leads are pushing the idea to management that a full refactor is needed to sustain the business, as more and more complex use cases emerge, these frameworks will mature and not be just a great tool for pushing out MVPs to get series A round of funding and give up significant part of your start-up ownership to people that have more money that they can ever use.

Fear not, Android Native will not die out. There will be plenty of work for Native Android developers in the coming years. It still needs to exist in order to support the multi-platform, there are still specific use cases where multi-platform will not work yet (ex. IoT) and there are huge companies around the world that have invested in Native so much, that it will not be easy to switch to something else.

The OS will still exist, there are individuals and huge teams at Google, Android, Huawei that continuously contribute (albeit, on their own forks of the AOSP) and evolve the system to fit in many other places, not just your smart phone.

Tjej med Google glasses
I am still nostalgic about the timeline in the parallel universe where Google Glass became a thing.

And there you have it, a brief history Android. A small glimpse of the evolution of a framework through my subjective experience.
If there is anything to be learned from all of this is that change is the only constant. Things change at such a fast pace that is practically impossible to try, catch (hehe) and learn them all. And that is perfectly fine. There is a joy of missing out, not just fear.

The wisdom I want to leave you with is not of a technological nature, but of a human one. Take it easy. Do not value yourself by how much frameworks you are proficient in, trends you follow, buzz words you know, libraries in alpha you have in your pet project, lines of code you push to your side hustle after work hours. Do not gamify your profession jumping from one achievement to another, comparing yourself with others under the pressure of being constantly productive.

Instead, value collaboration over competition. Find the value you are providing to your team, your company, your product and ultimately, the end user. The greatest challenges our industry faces are not from a technological nature, communication is the greatest friction point. How do I get in touch with my inner self, so I understand how I feel, begin to understand others, and develop the necessary skills to communicate this efficiently with the people I work with. Your career progress is much less dependant on what you know and can do, but on how well can you learn and incorporate that in a collaborative environment.

True progress happens in teams and organizations that have understanding for personal preferences, practice open, honest, non-violent communication and nurture an environment that encourages learning through inclusion, empowerment, exploration and experimentation. These are the key words every tech person should be learning. Android, iOS, Fuchsia, Native, Multi-platform are just tools, they do not manifest ideas by themselves. We do, and we do so by working together.

Ivan is a yogi mindful leader, principal software engineer, a multi-platform enthusiast with a passion to bring mindfulness into the tech world. A passion so great that he decided to quit his day job and start a company together with his wife that does exactly that.
Ivan also gives talks on how to become a better human by making small tweaks and incremental adjustments to your daily life, the agile way. His next talk is titled 27 tips and tricks for navigating the pandemics (or any other hardship) and if you are reading this before 18 May 2021, you should definitely register by following the link. Thanks for reading fellow human!

Bild på frilanskonsult Ivan Dimoski

Ivan Dimoski
Freelancer and member of DevBay community

Vill du veta mer om oss på Developers Bay?


Vi behöver inga fler snygga kundresor, vi behöver organisationer som tar ansvar för sina kunder!

Design har äntligen hamnat i fokus hos ledningsgrupper de senaste åren. Företag som Google, Apple och Facebook har påvisat att genom att fokusera på design går det att bli framgångsrik. I takt med att allt flera organisationer börjar prata om design börjar även olika verktyg och metoder dyka upp inom området. Ett myller av begrepp och termer som gör att även jag som jobbat 20 år med design, har svårt att förklara likheter och skillnader mellan de olika definitionerna.  

Fokus på kundnytta

Design thinking, kundresor, design sprints, Lean UX, Customer Experience, User Experience, Service Design, tjänstedesign m fl. är begrepp, metoder och verktyg som egentligen består av samma sak, designprocessen. En process som hjälper organisationer att skapa framgångsrika företag med fokus på kundnytta. Där design innebär utformning och utseende av en produkt, och är den skapande process som används från idé till färdig produkt.

Designprocessen är en viktig del i den digitala transformationen

Designprocessen finns på olika nivåer i organisationen men alla har samma utgångspunkt, att förstå kunderna på djupet, för att sedan kunna leverera kundnytta, kundlojalitet och engagemang. Att implementera designprocessen på olika nivåer i en organisation är en viktig del i den digitala transformationen. Idag anlitas konsulter för att på en strategisk nivå ta fram kundresor. Ett fantastiskt verktyg som genom user research (inte internt tyckande) kartlägger kundernas kontaktytor och interaktion med företaget. Resan utgår ifrån målgrupperna, deras behov och beteende och organiseras därefter: utifrån och in istället för inifrån och ut.

Kundresor som process med mätbar användarnytta

Kundresor blir tyvärr allt för ofta fina presentationer som inte bidrar till kundnyttan. Presentationerna blir liggande i en byrålåda eller som hyllvärmare, eftersom organisationen inte har förmåga att exekvera på förändringar och förbättringarna som identifierats i kundresorna. Det finns även en förställning kring att kundresor är färdiga dokument, men istället skulle jag vilja se det som ett verktyg som ska uppdateras och ändras varefter fler insikter görs om kunderna. Arbetet med nya och fler insikter är en ständigt pågående process som ska genomsyra hela organisationen.

Vi behöver inga flera snygga kundresor. Vi behöver organisationer och ledningsgrupper som tar ansvar för sina kunder, och möjliggör att företaget organiseras för att stötta designprocessen med att arbeta kunddrivet. Organisationer ska möjliggöra att det finns tid att förstå och utveckla sina kundrelationer samt att alla i organisationen får ökad kunskap om kunderna. Företaget utvecklar ständigt nya kontaktytor utifrån hur kund- och användarbeteende förändras. De företag som är, och kommer att bli konkurrenskraftiga, är de som snabbt kan ställa om för att möta förändringar i kundbeteende eller lösa nya problem. Faktum är att varje gång kunderna kommer i kontakt med företaget, testas dess förmåga att förstå och möta kundens behov. Förutom tydliga designprocesser behövs tydlig vision, strategier och mål. Få organisationer idag har KPIer för att mäta användarnytta. Hur vet man då att man lyckats med sina investeringar? Allt för ofta överskuggas användarnyttan av affärs-KPIer och det är därav det som får fokus.

5 komponenter för att arbeta med designprocessen och skapa kundnytta i din organisation: 

Organisationsstruktur 

Företaget måste organisera sig på ett sätt som underlättar att arbeta med kundnytta. Detta innefattar både tydligt styrning och ledning, tydliga KPIer för kundnytta, möjliggöra samarbeten mellan avdelningarna och definiera processer för att samla och sprida kunskap om kunderna.

Tekniska möjligheter

För att kunna leverera nya digitala tjänster till kunderna behövs en snabb stabil infrastruktur. Rent konkret innebär detta möjlighet att lansera tjänster dagligen, för att sedan mäta och förädla.

Lyssna på dina medarbetare

Lyssna på företagets säljare, teknisk support, kundtjänst etc. som dagligen har kontakt med era kunder.

Lyssna på dina kunder

Analysera hur kunderna beter sig på webben eller i era appar. Gör beteendeanalyser genom djupintervjuer. Förstå vilka problem kunderna vill lösa, förstå deras värderingar och beteendemönster. Ta reda på vad kunden vill ha. Varför de misslyckas med sina köpflöden? Varför köper dom samma tjänst från konkurrenterna etc.

Arbeta strategiskt och operativt med kundnytta

Möjliggör att verksamheten har utrymme att arbeta strategiskt och operativt med designprocessen. Få organisationer har hittat balansen mellan dessa två. En del organisationer arbetar för operativt och det finns inte tid att göra det långsiktiga arbetet. Ex. vilka nya målgrupper eller beteendeförändringar måste vi ta hänsyn till om ett år? Andra organisationer jobbar för strategiskt och då blir ofta resultatet dokument, men det tänkta resultatet av strategier levereras aldrig till kund.

Designprocesser är inget nytt. Pyramiderna i Egypten, kinesiska muren och Leonard da Vincis uppfinningar konstruerades precis enligt samma principer. Men det som saknas idag i allt för många företag och organisationer att ta ansvar för att arbeta utifrån kundperspektivet. Det är dags att sätta kunden i fokus och på riktigt ta ansvar för sina kunder.

Kommentera och dela gärna om du gillar detta inlägg. Hur arbetar ni med kundresor och designprocesser hos er? Dela gärna med dig, vi är alla nyfikna! Hör gärna av dig om du vill diskutera vidare. Anette Lovas, konsult inom digital produktutveckling, förändringsledning, UX/CX 

Denna och fler artiklar hittar du här.

Anette Lovas
Konsult UX & Webb