For the past five years, I have been building stuff on Android. During this time, I have collaborated with engineers from different backgrounds and with different experience levels. Some engineers came from an enterprise background with years and years of experience, while some were just fresh out of college and the only thing they knew was what they learned in the university/college and their experience building mobile apps in their free time. Some people did not even get a formal CS education and are self taught. During this time, I have seen what each engineer of the categories above were capable of delivering and how they were delivering it.
So, if you are hiring a so-called: Android Software Engineer for your company, read this article. Why? Because, at first, mobile app development can be mistakenly seen as being easy. After all, a mobile app is merely about putting together different pages that just outputs whatever a monolith backend asks it to output. Right? This couldn’t be further from the truth. In fact, if you look at the quality of the apps on the PlayStore, you will notice that the distribution of the apps by their quality describes a Gaussian distribution: There are a few very poor apps, just as few very good apps a LOT of mediocre apps.
Let me try to define what I mean by mediocrity here:
At the very fundamental level, a mediocre mobile app is one that does not cooperate well with the environment (platform/OS) it is running on. First, it does not comply with the visual language defined by the platform and therefore it confuses users. Second, it does not integrate the fact that it is running in a constrained environment (memory, CPU, network bandwidth, battery) and therefore it ruins the user experience of the entire device. Third, it just doesn’t work under certain conditions (faulty network for example). This final point is global to the majority of softwares out there.
In a nutshell, the three points above sum up the challenges of building good mobile apps. On top of that, the app needs to integrate properly with your company infrastructure and it has to be coded with a huge volume of constantly evolving business domain problems.
Therefore, if I had to hire a Software Engineer to work on these challenges today, this is what I would look for:
Finally, I would not worry about how much the candidate knows about the SDK itself. As long as: the candidate is good with most of the above concepts, the candidate knows the Android platform as a user at least and is motivated by mobility in general and finally the candidate is a fast learner. That being said, if you are lucky enough to find a candidate that has both a great CS background and pretends to know the Android development ecosystem, make sure they understand some fundamental concepts.
Such concepts include (not exhaustive):
As you can see the emphasis is put on verifying that the candidates know the core fundamentals and concepts that indicates whether they can adapt to any set of problems that you might throw at them. For crying out loud, don’t hire a candidate just because they know how to use one or two libraries. You don’t want to hire library users, but engineers who not only can use them when necessary (better not reinvent the wheel of course), but are also able to take a step back, analyse the situation, foresee problems way before they arise and provide solutions which are unique to the problem set you are having.
For crying out loud, don’t hire a candidate just because they know how to use one or two libraries.
A good rule of thumb is to challenge, heavily, the candidate on a topic that s/he is good at. If that’s UI, then cover that extensively.
Of course, the candidate I am describing here is a rather senior one. You can, and you should, also hire junior engineers. But in that case, make sure that you keep a good ratio between junior and senior engineers in your organization. If you have a team mostly composed of junior engineers, you are in for a tumultuous journey as your team will learn a lot of things on the job, fixing one critical production bug after another, iterating over and over again until they can get a decent maintainable and testable code base etc.
If you are a Software Engineer building Android apps and want to improve on some of the concepts listed in this article, I recommend going through the following (short) reading list:
Software Engineering and Craftmanship:
Data Structures and Algorithms:
Problem solving skills:
Blogs worth following for Android specific knowledge and critical thinking (not exhaustive, please suggest in comments):
If you tolerate and excuse mediocrity, you’ll get more of it. If you accept ‘average’ as okay, you’ll get lots of average (and in so doing leave a lot of money on the table). And if you accept nothing but the best from your people, you will create a magnet for the best talent in the market. Attraction and retention challenges will be a thing of the past. (source: https://www.hiringsmart.com/articles/533/You_Attract_What_You_Tolerate/)
This past year and a half, I experienced two intense athletic activities that seriously pushed me to my limits: the first was Kyokushin-kai Karate training and the second was General Physical Preparedness to help me improve my performance in Tennis. The common points between the formal and the latter? First, those trainings were so intense, they almost made me cry. Second, I did not regret any of it after the training was over. In fact, I cherished those after training moments because I felt different; stronger; healthier; my mind was clear and I felt I was able to sustain more.
The morale of this little story? Pain is good. I honestly don’t think we can achieve anything worthwhile in this world without going through a certain amount of pain.
Pain is temporary. It may last a minute, or an hour, or a day, or a year, but eventually it will subside and something else will take its place. If I quit, however, it lasts forever. (Lance Armstrong)
The common point, between people who avoid pain? Mediocrity. They tolerate it for themselves, they tolerate it for the people around them and they let it run their lives.
Mediocrity is the result of compromising too much when facing a difficult task, in order to achieve something worthwhile, in favor of something easier. By compromising, the author of the decision wants to avoid the pain that s/he could expose her/himself to.
Going back to the martial art and sport metaphor. In Shotokan Karate, the kumite part of the training does not permit kicking with full power, instead you should control your kicks and punches (meaning, you should barely touch the skin of the opponent). On the other hand, Kyokushin-kai Karate is a tougher form of Martial Art where you don’t refrain from actually fighting with full power. In fact, Kyokushin-kai literally mean: The ultimate truth. In other words, you endure a training that is extremely hard but fair. Should you defend yourself in a real situation, the latter will really prepare you for it as you will not be surprised if you get punched or kicked. Actually, you will mostly likely have endured even harder situations during training.
You can look the other way once, and it’s no big deal, except it makes it easier for you to compromise the next time, and pretty soon that’s all you’re doing; compromising, because that’s the way you think things are done. (Jack Bauer, 24, Day 1).
By using the word compromise, I am not talking about technical tradeoffs such as space vs time, consistency vs availability and not even talking about the famous triangle: quality, time and feature. The kind of compromise that is being discussed here, is the lazy one. The one that allows you to free yourself from having to do the hard work and endure the pain.
The problem with compromising, is that it’s viral. Sloppiness calls for some more sloppiness and before you know it you are already swimming in a bath of mediocrity. If you are a leader, you should demand nothing but commitment to achieve excellence from your team. You should never tolerate sloppiness, never. Because its consequences are disastrous.
Mediocrity is contagious
In the software industry, compromising can manifest itself in many different ways. For e.g.:
The alternative is hard? Painful? I never said it would be easy. Wake up and embrace the suck like the military say.
We do code reviews at work. And one of the thing that I care about when reviewing any Pull Request, is whether the commit message is easy to read and whether it represents the change that was introduced in a meaningful and clear way.
In fact, a good commit message goes a long way in ensuring that collaborators understand what is going on in the project at a higher level, before diving into the code itself. It can also help while debugging as it will help you decide which hashes to use with git-bisect. Finally, taking the time to write a good commit message allows the author to reflect on the change that s/he just introduced.
Unfortunately, while writing a good commit message may seem like a simple topic, it is surprising how very few developers actually care to do it right. There are two aspects to it: The form and the content. Both of these aspects have been written about by Chris Beams, who described 7 rules to writing a good commit message. If you use any form of source control at Work and care about the sanity of your team, then go read it, pretty please.
I have had the occasion to write in the past about my experience as a remote software engineer. Recently a developer asked me whether I had a few tricks to land a remote job in France, so I thought it would be a good idea to share my ideas as a blog post instead. Without further ado, here are my 5 strategies for landing a remote job in the tech industry:
The first strategy is pretty simple. You want a remote job? Ask your employer nicely whether it is possible to become a remote worker. This is how I got mine. Obviously the odds of your employer to accept your request are not in your favor, but you can improve them by making sure that your request makes sense. What do I mean by that? Well, first of all you need to be able to formulate precisely the reasons why you need to become remote. The reasons can vary from the necessity to relocate somewhere else to needing more flexibility to accommodate a chosen lifestyle. Whatever your reasons are, make sure that you articulate them clearly. Secondly, it doesn’t hurt to talk to your team, to make sure they are comfortable with the idea of having a remote teammate as it will impact them directly.
Another obvious possibility is to become a freelancer. In fact of all the strategies this one is the one that has the best chances to succeed.
There are plenty job boards that specialize in advertising remote jobs, for example https://weworkremotely.com/. I will let you Google the other job boards in your favorite language and in your favorite area.
If you use Stack Overflow you will sometimes come across a job ad with a remote tag, for example:
The nice thing about these ads is that they are targeted according to your favorite languages and stack (here Android for me).
Or for a company that supports one or many open source projects.
Note that the more proficient you are in your job, higher are the chances for you to find a remote job, as your employer will likely let you work remotely for fear of losing you. Same applies for contributing to your community which could help you land a job in open source. What’s the conclusion to this? Being remote is most of the time the result of having a good professional reputation as well as having an opportunity presents itself to you.
Finally, please ensure that this is really what you want to do before considering a remote position. I invite you to read again this blog post and do your research on this topic. Don’t just hear the voice of those who love working remotely or those who benefit directly or indirectly from advertising this lifestyle. Keep in mind that working remotely is definitely not for everyone. So do yourself a favor and ask yourself a few questions: Am I capable of enduring this lifestyle? How would I feel without checking in to an office everyday? How would I feel if I didn’t have any social interactions at work? On that note, if you think that a coworking space will solve all the issues you can think of, then you are likely wrong 🙂 Coworking spaces do solve some issues but you will still feel a bit isolated because you will be surrounded by people working on completely different things and you won’t see the same ones everyday.
So the best way, like anything in life really, is to experience with the idea a little before diving into it completely. May be try for a few days and see how it works for you and your team? You can also talk to current or past remote workers and hear their opinions on this topic.
So I am going to close this blog post by telling you that I am indeed open to discuss my own remote experience if you wish 🙂
This is a blog post that I wanted to write down for a long time now but never found the time to do it. This post is about my experience as a, time and location, remote worker (I live in Paris, most engineers work in San Francisco). For most people, working remotely sounds awesome. The reality is unfortunately more nuanced than that. Sure, the ability to define when, where and how you want to work is definitely a plus. But you also have to be disciplined enough to focus on accomplishing your goals and cope with the disadvantages of not being in the same location as your team. This post is all about describing these nuances to the best of my ability.
All of the above is true, but we should not occult the dark side of working remotely:
All this said, it’s REALLY hard to be remote. I propose that most remote workers work at least as hard, if not more so, than their local counterparts. This is fueled in no small part by guilt and fear. We DO feel guilty working at home. We assume you all think we’re just hanging out without pants on. We assume you think we’re just at the mall tweeting. We fear that you think we aren’t putting in a solid 40 hours (or 50, or 60). Because of this, we tend to work late, we work after the kids are down, and we work weekends. We may take an afternoon off to see a kid’s play, but then the guilt will send us right back in to make up the time. In my anecdotal experience, remote workers are more likely to feel they are « taking time from the company » and pay it back more than others. You might poo-poo the guilt, but ask around to your remote brethren. It’s there, they just don’t talk about it.
The web is packed with information and the more curious we are the more we spend time consuming this information. This is not a bad thing of course, but sometimes this can interfere with our productivity even if we try to control it. You start reading an interesting blog post that you accidentally found on your favorite social network, but this post is filled with links, a LOT of links. Before you know it you have 10 tabs open and now you have to catch up on reading these 10 articles which themselves link to other interesting ones. That’s how you can waste a full day, by just reading stuff instead of making stuff.
I have been thinking about this recently and I think the key to gain control over the time that we spend reading stuff on the internet is to ignore those links.
In this spirit, I have quickly put together a Chrome Extension that removes the links from a webpage after it loads. I called it: Unlink and you can download it here!
Not sure if there is already an easier way to accomplish that or if an extension already exists for that, I have done some research with a couple of keywords but nothing really came out. Also, I have never written a Chrome Extension before so this was the perfect occasion to try my hand at it.
This is an issue that I encounter very often when programming with ADT on Eclipse.
In short, there seems to be a couple tasks that are waiting for another task to complete which is blocked. It doesn’t matter how many times you restart Eclipse or restart your computer, Eclipse will still be in this situation, preventing any work to happen.
After doing some research on Stack Overflow, I figured there were 2 effective solutions to this problem and 1 other solution that is less optimal:
Launch Eclipse with the clean flag
This is what should be tried first. After running this command, Eclipse will open in a special cleaning mode which should cancel all those hanging tasks.
Create a new workspace
Another way to solve this problem is to recreate your workspace from scratch.
Delete the .metadata folder in your workspace
Finally, and this is the less preferable solution, you could remove the .metadata folder all together in your workspace (note: this is a hidden folder).
Keeping this as a memo to my self in case I encounter this again, as well as to help anyone facing the same problem.
Recently I moved from Paris to San Francisco, where I work for Lookout, and one of the first challenges that I had to face on my arrival was to find a place to live. If you don’t know it yet, finding a place in the Bay Area (and in San Francisco in particular) is very difficult due to the sky high rents, so instead of looking to rent a place downtown, I decided to widen my research a little bit to either the East Bay or the Peninsula.
The East Bay presents a couple advantages like being substantially cheaper than any other region in the Bay Area and a fast commute to San Francisco thanks the BART connection, but it also suffers from insecurity (specially in Oakland) and downtown Berkeley has too much of a campus feeling to it. So I knew rapidly that the Peninsula would be more appropriate for me, and the first place that I visited there was Menlo Park. As my first impression of the city was good and as the apartment itself was well located and also had a lot of space, I decided to call Menlo Park home.
Of course, during that period, a lot of people were asking me whether I found a place yet and when they knew that I decided to live in Menlo Park, their reaction was always the same and could be summarized as: What the hell are you going to do in Menlo Park, it’s very far from San Francisco and you’ll spend most of your time commuting! My response? I don’t care since I will be seated.
Exactly. Everyday, I spent nearly 2h in the train and I enjoy every second of it as it allows me to take my time. Taking the time, is the simplest thing that we can’t seem to be able to do anymore in this ultra-connected world. Nowadays we are so connected to everything that we are always busy doing a lot of things even when we don’t want to. It’s like we are living in constant interruption and being constantly interrupted prevents you from feeling the pleasure of enjoying one activity at a time.
So thanks to my new commute, I can now take my time to:
– Read. I am not talking about reading my Twitter feed or unrelated blog posts, but about quality reading.
– Close my eyes and relax. Yes just that, I just try to focus on my breathing and listen to the environment that surrounds me.
– Reflect on the course of my life. It is very important to take a step back from your everyday life and think about what’s going well, what’s not going so well and what actions you can take to improve it.
Finally, I found that Menlo Park is a great place where you could not only enjoy the nature but also have all the commodities close enough and that’s just the icing on the cake.
How about you? Do you have the occasion to unplug from everything during your day or do you live in constant interruption?
Life is too short to be wasted, we all know that. Yet, most people live a default life, forcing themselves to think they are happy even though they are not. Why? Because, we let the society dictates how our lives should be lived and what success and happiness should be like. Things like money and prestige are given too much importance to the detriment of focusing on what is really essential to us: living a life in line with our inner values, accomplishing valuable things.
If I had to give an advice to anyone starting a life (my future child for example), these are the 10 commandments I would strongly encourage him/her to follow:
1/ Don’t compare yourself to others.
From the day we enter school, we are stimulated by the spirit of competition through grading, forgetting that the primary purpose of education is to learn. Parents want their children to be the first, or to be better than X because they want to be proud when meeting X parents at the school door. So we grow up with this mentality of wanting to be better than others, instead of wanting to become a better version of ourselves.
2/ Only surround yourself with brilliant and positive people.
Negative and mediocre people are everywhere and their influence on you can be devastating. You might be a positive person, but if you let yourself listen to pessimism all the time, you might end up the same one day. Thus, the best way to avoid any negativity get to you, is to eliminate these gloomy people from your life. Of course, if you care about them, then you owe it to yourself to transmit your positive attitude to them.
3/ Don’t be afraid to fail, failure is the best thing that could happen to you.
In the eyes of society, failing is the worst thing that could happen to you. Personal fact: I failed once, very hard. It could have had disastrous effects on my life, but instead, it made me much much stronger, not just twice as strong but in proportions you cannot start to imagine. The truth is that failure builds character, it makes you think about what went wrong and what you can change in your life to never ever be in that situation again. It is so easy to content yourself in a status quo, when things seem to be going well for you . Failure challenges that. If planes are as safe as they are today, it is because they have failed in many situations in the past. Similarly, if you look at all the great men and women in history, you will find that they have all encountered a severe failure at some point in their life. So don’t be afraid to try things and fail.
4/ Find your vocation and have pleasure doing it.
Everyday, I hear stories about people studying or working in a field they have no interest in at all. Most of the time, it is the result of the pressure exercised by their parents to choose a path that they thought was prestigious in the eyes of society. They wanted to be able to say: My daughter is a Doctor or My son is a lawyer. On a more general note, we are living in a world where appearances are all that matter, so we keep doing things we don’t like to be able to appear more successful in the eyes of our friends and family. Does it make us happy? I doubt it. When somebody asks you what do you do for a living, their intention is always implicitly or even explicitly to figure out whether you are doing something prestigious or not. How about just asking this very simple question: « Do you like doing what you do?« . This is the only thing that matters, because the only way to achieve something substantial in life, is through real passion.
5/ Be careful when listening to people.
Pretty much, similar to the previous point. People like to give advices based on their own experience, but their own experience will likely be different than yours, so don’t always listen to them and follow your own instinct instead.
6/ Be generous, share when you can.
There are many proven researches that demonstrate a direct correlation between generosity and happiness. The basic idea is that by helping others we are shifting our focus off of ourselves which makes us less vulnerable to our critical inner voice, by seeing the positive impact of our actions on someone else. This is a good article to read on the subject.
7/ Stay healthy, eat healthily, exercise and balance your life.
This is a no-brainer. It is in your best interest to stay healthy, in order to be able to accomplish more of your goals in the best possible conditions. Although, there are certain things we can’t control in life, it is obvious that we can avoid plenty of diseases by keeping good eating habits and by exercising regularly.
8/ Don’t be afraid to disappoint anyone.
Because if they love you, they won’t be. Some people are more fragile than others and tend to go through mental breakdown when facing adversity or any kind of pressure. Sometimes this is due to the fear of disappointing someone they care about in case of failure. Failure is good as stated above, and someone who cares about you will never blame you for trying. Similarly, don’t be afraid to disappoint your parents by choosing your own path.
9/ Don’t watch TV and don’t follow the media too much.
Their job is to frighten you, that’s how they make money. Besides, their second job is to manipulate you and distract you from real problems. If you don’t know them already, the 10 media manipulation strategy by Noam Chomsky is always a good read.
10/ Have strong values and stick to them, no matter what.
These are the values that will make you happy in life and be successful. Society values money and social status. Let’s change those rules and let’s teach our children new values based on happiness.
Share this post if you agree. Debate if you disagree.
Most of us have watched a hacker movie, at least once. I have personally watched a fair amount of those: War game, Takedown, Hackers, Swordfish, The social network, Pirates of the Silicon Valley to name a few.
These movies are so exciting to watch, even for the general public who doesn’t give a pineapple about computers. Of course, excitement easily comes from fiction rather than reality. So, not only are these movies all fictional (some of them less than others though) but to some extent they all include a good dose of spurious stereotypes. The most recurring one, is that programmers or hackers spend most of their time ragingly hitting on their keyboard, like if writing code was a second nature to them and everything is supposed to flow quickly and then the magic happens…
The truth is that if you randomly walk in a cubicle of any tech company, you will more likely see people starring cluelessly at their screens scratching their heads rather than typing on their keyboards. If you want to see it from your own eyes, there is an excellent documentary that I wholeheartedly recommend you to watch, it’s called: Code Rush. In this documentary, a team of journalists followed the Netscape Communications on their adventure to release the source code of their navigator, best known as Mozilla.
It was released under the Creative Common licence so you can watch it for free from the Internet Archive. Do it, I’ll wait.
Two things about the documentary:
You can read Steve Jobs former phone number written on a whiteboard (I don’t remember when exactly but I guarantee you it’s there. Well, almost… only 2 digits were missing!).
These guys were under extreme heavy pressure. I mean it.
To picture the amount of pressure that was floating around, you can read Jamie Zawinsky‘s diary. Or, if you don’t have time, here are some interesting excerpts:
Marc wants me to be done with the Unix client in time for SGI to ship it along with Irix 5.3. That means that it has to be rock solid in, like, less than two months. I’ve got so little of the code written that I don’t even have a sense yet of whether that’s even remotely possible; it’s all over the floor. We’ve got bits and pieces, but I don’t see the big picture. It’d be really easy to let him bully me into agreeing, but I don’t want to miss; the stakes are too high this time, too many people are watching us for us to be able to screw up at all…
I slept at work again last night; two and a half hours curled up in a quilt underneath my desk, from 11am to 1:30pm or so.
I just got home; the last time I was asleep was, let’s see, 39 hours ago.
I’ve had a sore throat and a cough for about a week now, but I haven’t done anything about it, because I don’t have time.
My hands have been really been hurting lately; I hope all this typing hasn’t finally blown out my wrists. If I can’t type, my life is over. My right hand especially is flaking out — the last knuckle of the middle two fingers ache, as if they’re badly bruised.
We’re doomed. We’ve finally announced a public beta to the net, and there are loads of bugs, and they’re hard bugs, sucky, hardware-dependent ones. Some of our private beta testers crash at startup on some SunOS 4.1.3 systems, and I’ve got what seems like an identical system here and it doesn’t crash. And scrolling text doesn’t work with the OpenWindows X server, though it works fine elsewhere. And the cache is still fucked. We’re doomed. Fuck fuck fuck fuck fuck fuck fuck. Doomed doomed doomed doomed doomed. I’m tempted to just stay home tomorrow. I’m so fucking burnt. Existence is suffering.
I’ve spent most of the day so stressed out that my skull is rattling from the pressure of my teeth grinding together. I feel like I have finally exceeded my stress limits and am about blow a gasket. But I can’t go home, because if I do, the world will end, right? I’m trying to work, but every few minutes I have to stop typing and make fists so tightly that my whole body shakes.
I’ve just noticed that there’s still purple ink on the inside of my right wrist spelling the word VOID: the hand-stamp from a concert that I went to last week. I left work, went to the show, and came back to work immediately afterwards. I’ve been here since.
You get the idea.
But what is more interesting is that if you dig enough into the Internet Archive, you will find some uncut video footage. They are goldmine because you will be able to watch some discussions between the documentary crew and the engineers. The most interesting one (to the point of this article) shows an engineer by the name of Don Milton, debugging the Mac version of Netscape. It’s funny to see how he was absolutely clueless about why that bug was happening.
He wasn’t even sure about the context in which that bug could be reproduced and thus couldn’t even start thinking about the solution. You can see him starring at his screen for a couple of minutes, touching his nose and you can constantly read the expression on his face saying: I have no idea what’s going on here…
So if the idea of spending countless hours solving challenging problems is not appealing to you, and if you are more interested into impressing your girl friend with some crazy typing skills, then the HackerTyper has got your back. Joke aside, I guess the purpose of this article is to encourage the right people to join the IT industry (I am looking at you, ladies!) by encouraging you to focus on what Software Engineering is really like (solving problems) rather than believing in the typical/common nerds stereotypes broadly instrumentalized in the film industry.