Featured

Introduction

Hi. My name is Eran and I’m a software consultant since I can remember myself. But this blog is not about me. It’s about something I care deeply about and want to share my experience of with you.

This blog is about how I’m endeavouring to optimise my life. Hopefully some of my experiences will apply to your life as well.

So, what do I mean by optimising my life? Quite a few things, really. I mean automating menial tasks so that I don’t have to spend time and the cognitive drain that ensues. I mean improving my experience when menial tasks are unavoidable. I also mean improving myself so that I can do things better, both at work and at home.

Now, these will be my personal experiences I’ll be sharing with you. I don’t believe there’s a one-fits-all solution to our daily problems. I’m hopeful some of my advice will be relevant to yours. If any of it is – I’ve achieved my goal.

Enjoy your read!

Want to reach out? You can find me on LinkedIn.

Get Off The Script

I just called a broker about a mortgage. The person on the other side of the line was extremely nice. We had a pleasant conversation, and I really felt I was getting a personal service. This was great.

And then, half way through the process, she started reading the marketing spiel off her script. About a minute’s worth of pure praise of their service, with statistics and random figures. The personal touch magic wore off immediately.

Now, I know it’s not her fault. She was instructed to read that speech to me. The problem is with whoever it was who thought that was a good idea. I’m sure they feel it’s important to convey their success rates to new clients. The problem is, this isn’t the way to do it.

Be creative. Give your representatives key points they should convey during the call. Don’t sabotage their efforts to give a good service. Let them be honest, and kind and sympathetic. A marketing script is none of that. Don’t kill the magic.

Help Me Help You

There are services we all use. Services such as Amazon, Netflix, Spotify and so forth.

All of these services spend tremendous efforts into giving us a personally tailored experience. An experience that would match our personal preferences.

Unfortunately, nothing comes for free. If we want an experience that is really a good fit for us, we have to put in some work.

All of these services rely on data they collect to make adjustments for us. We can modify much of this data to get better results.

So what should we do? Upvote content you like. Downvote content you don’t. Go through your activity history. Remove any items you are not interested in.

Pretty soon, you’ll start noticing the suggestions you’re getting become more relevant. Content will become less spammy.

A tailored experience is a better experience. Consider spending the time to make sure you get one.

Clean Android

As an Android developer, I spend a lot of my time worrying about app architecture.

Android has a long history of attempts at a convention. We’ve had Activity god classes. We then had fragment god classes. Along came MVP (Model-View-Presenter) with its presenters, which really improved things, but often led to god presenter classes.

More recently, Google introduced the Android Architecture Components, and we started using MVVM (Model-View-ViewModel). Somewhere along the transition from presenters to view models, I started seeing attempts at implementing clean architecture.

The problem with clean architecture is, it’s a bit of an abstract concept. If you read the Clean Architecture book, you are left with a vague notion of how a clean architecture would be implemented.

So it took a few iterations until my colleagues and I finally found a consistent architecture that works.

And this, very briefly, is how I now implement a clean architecture feature in an Android App:

I start with the domain. This is where my use cases are, as well as my domain models and my repository interfaces. Because it should not be coupled to anything in data or the UI, my domain layer is very straightforward. Repository interfaces are designed ignoring any APIs I would need entirely. They describe precisely what I need to present something to the user. My use case output is as simple: it defines all the data that should be presented to the user.

I wrap it up by stubbing my repositories, so that my upcoming presentation could start utilising the domain layer.

Once the domain is in place, I can proceed to my data and presentation layers.

The data layer contains repository implementations, data sources and mappers from domain to data and from data to data sources (APIs, databases, etc.) and vice versa.

I start by implementing my repositories. These are the entities that would eventually grab me the data I need and persist the data I need persisted.

The way repositories achieve this is by using data sources. Each data source abstracts a single source of data: an API, a local store or the Android API, for example. Since repositories should not be coupled to APIs either, their models reflect what the domain needs rather than what an API would provide. They mostly “speak” using data models. These are mapped from and to domain or data sources.

To wrap up my data implementation, I implement my data sources. The mappers from the data sources to the data is usually where most of the data massaging happens.

On the presentation layer I have my ViewModels and mappers to and from domain. This is where my presentation logic lives. It does not know about the UI. I usually like to imagine the UI as being a terminal, and then see if my implementation still makes sense. The ViewModel exposes function to the UI the describe the events presentation cares about. It also executes use cases and updates the view state and navigation.

Lastly, I have the UI. The UI layer is where my application, activities, fragments, custom views and mappers to and from presentation live. The fragments, activities and custom views can all act as views in the MVVM sense. They can all own ViewModels. They communicate with their ViewModels by calling the event functions. They observe the ViewModels for view state and navigation.

Everything is tied together using DI (Dependency Injection) in my main module. I use Dagger and Hilt, having had poor experience with Koin. This is what Clean Architecture refers to as the “dirty main”.

I tried to keep this explanation short. Clean Architecture is a vast topic, and its application to Android is quite complex as well. I hope this helps somebody!

Tightly Packed

I like efficiency. Sometimes life feels like a puzzle. Solving the puzzle means achieving the ultimate efficiency.

How do I fit as many dishes as possible into the dishwasher? How do I pack everything I need in this small suitcase?

Interestingly, I found there are different solutions to those similar problems.

Just like when solving a puzzle I would start with the corners and continue to find all the edges, most solutions follow an optimal pattern.

For the dishwasher, the most efficient way I could find was to go small to large. That way, your large dishes end up covering the smaller ones.

For the suitcase, I would start with the larger items, then go smaller, filling the gaps left by the larger items.

What similar challenges have you faced? What was your solution?

Not Good Enough

I’m a perfectionist. I know a lot of people testify this about themselves. But I truly am.

Nowadays, there seems to be a trend of “good enough”. It stems from a sensible idea that the final 20% of the work will add marginal value (not to be confused with the 80/20 rule). I get that. It’s usually true.

The problem is, it’s a slippery slope. Once you start loosening your standards, they tend to dissipate. How do you measure a quality of 80%? How do you know you’ve reached “good enough”?

It seems in most cases we all err on the side of less than enough. This is what I’m not comfortable with. So I try to aim above “good enough”. I’d rather spend a little more time than absolutely necessary than a bit less.

I firmly believe mediocrity is the enemy. This is what leads to disasters where people lose their lives. It’s no joke. OK, it also means my banking app isn’t as great as it could be.

Let’s ditch the “good enough” attitude. Let’s aim higher. We can do better.

Do One Thing Well

I’m an Android user. I’m also a Windows user. I tried the iPhone, and I’ve used a MacBook for a few years. The latter two didn’t grow on me.

Different operating systems offer different experiences. Which works best for you is an individual preference. Once you get used to one, though, it’s hard to switch.

This is why most successful apps are developed natively per platform. Using the same app on a different platform will feel different. It would feel natural within its environment.

Despite those distinct differences, the dream of multi-platform solutions lives on. PhoneGap (later named Cordova), Titanium, React Native and Flutter are just a few examples.

And all of these attempts, in my experience, are doomed to fail.

You simply can’t maintain a high quality user-experience between platforms in one code-base. You can develop to the lowest common denominator. Or you can support every feature offered by every platform. Your framework will essentially be at least a step behind the native environment.

You also have to rely on fewer developers. Most developers would specialise in a native technology.

My suggestion? Don’t fall for the woos of cross-platform frameworks. Go native. Native solutions do one thing, and they do it well. You will save money in the long run. You will develop faster, and your user-experience will be better.

Together, Nothing Can Stop Us

I have owned and managed several companies in my life. I ran none of them alone.

Choosing the right partner is a challenge. My intuition led me to seek people who were like-minded. Choosing someone who is also a friend kept me in my comfort zone.

It took me many years and an insight from a valuable employee to realise I was doing it wrong.

Today I know what to look for in a partner. You don’t need someone who thinks like you. You definitely don’t need a friend.

You need someone who’ll challenge your thinking. You need someone who can compensate where your skills are lacking.

Know your weeknesses. Know your strengths. Find a partner who completes you. And by your powers combined, I am Captain Pla… Sorry, got carried away there.

You Know What? You Are Right

I love to argue. Well, I used to love to argue. I used to love proving to everyone that they were wrong. That I knew better.

For me, arguing was almost a sport. It was like arm-wrestling intellectually.

Over time, I observed three things.

The first is I learned not all people have my patience. A lot of people would simply give up mid-argument. Not because I got my point across. They just didn’t have the patience to continue debating. This often left an awkward vacuum behind.

The second thing I noticed was that people not even involved in the argument were getting affected by it. Arguments bring tension. I never felt it, but I could tell people around me did.

The third thing is, after years of arguing, I learned it’s virtually impossible to convince most people by arguing. Ego tends to drive arguments, not facts.

The worst kind of arguments is online arguments. Why waste time and patience trying to convince a total stranger they are wrong?

My only hope when arguing with strangers is someone else reads my replies and doesn’t fall for, say, anti-vaxxer propaganda.

Arguing when I know something (or someone) is wrong is in my nature. This means not arguing isn’t easy for me. I do, however, care about the people around me. I also care about my time. So I’m practicing backing down.

I don’t have to win every single argument. It doesn’t even matter all that much if I do or don’t. And if someone says otherwise, well, we’re going to have to argue about it.

Not So Dumb After All

A lot of people gained weight during lockdown.

My wife and I didn’t. How we managed to get healthier during lockdown isn’t a secret.

Firstly, we kept a healthy diet. Admittedly, this wasn’t always easy. Without leaving home, with no delivery services, there were hard times. But we managed. We ordered from local markets. We ordered from hotel providers who had no hotels to deliver to.

Secondly, we never stopped training. It’s amazing how many exercises you can do at home.

One purchase we made that really paid off was a set of modular dumbbells. Instead of committing to a certain weight, we can adjust them as we improve. We can also train with weights suitable for each of us.

The bars I have are no longer available on Amazon, but the information below is adjusted for similar dumbbells.

Here is the order in which I would suggest buying everything. In parentheses I mention the additional options each purchase would open.

  1. 2 x bars (0.5kg x 2)
  2. 4 x 1.25kg plates (3kg x 2)
  3. 4 x 2.5kg plates (5.5kg x 2, 8kg x 2)
  4. 4 x 5kg plates (10.5kg x 2, 13.5kg x 2, 15.5kg x 2)
  5. 4 x 5kg plates (20.5kg x 2, 23.5kg x 2, 25.5kg x 2)

What I really like about these dumbbells is, they can easily scale from 0.5kg to 50kg. The bars themselves are sold separately. You can buy the different plates separately and over time as you improve. That’s pretty smart for a dumbbell!

I may get commissions for purchases made through links in this post.

Who You Gonna Call?

Many years ago, we used to have CRT screens. Remember those? They were these massive screens that would take up most of your desk.

Later on, plasma screens were trending.

Both of these technologies had a problem. Quite often, you’d leave the same image on the screen for a long time. When you did that, that image was “burnt” into the screen. The effect was known as “ghosting“.

Where there’s a problem, there’s often a solution. The solution in this case was screensavers.

I’ve had so many of them. From Sierra’s Johnny Castaway to the beautiful Dream Aquarium and the Living Snow Globe screen saver, people were getting really creative.

They years have passed, and most modern screens no longer suffer from ghosting.

Modern screens don’t suffer from ghosting. They have other, short-lived phenomena. But the screensavers prevailed. Instead of staring at a black screen when your computer is inactive, you can enjoy something that’s more colorful.

My current favorite is Aerial. There are Windows ports, too.

The ghosts are gone. Luckily, we still get to enjoy what they left behind. Eww. I don’t mean the octoplasm.