My Android internship at Tango

Before the time for an internship comes you have to choose the company where you could gain experience. When the process of recruitment started I preferred to work in one of the big IT corporation like most of my colleagues. Why? There are a few reasons but most important for me were:

  1. The earnings. Let’s be honest, money is also important. You don’t go to study Computer Science only for the satisfaction that you can create a code that is marvellous and which lets other consider you as a good programmer. It is important, though.
  2. The process of recruitment based on multiple choice tests.
  3. Working on the real project with the experienced programmers, whose knowledge is not based only on some theory that we can learn from the books for programmers.

Months passed on studying (yeah, right) and searching for my dreamed company. As I was lazy and have never sent my CV anywhere, I sent it only to three huge companies with the establishment in Krakow.

I went on the test to two of them. The third did not even answer on my CV despite the fact my competence did not differ at all from many of my colleagues on CS, who were invited to write the test. I should have probably sent my CV earlier. Most possibly, all the places had already been occupied.

There was another option. An internship on my university. Usually, an artificially created project just to get rid of the problem. The project dies, you get your paper, everyone is happy. But not me. I wanted to work on a real project.

I think I should have tried in other companies, where the recruitment process starts with an interview. It is much faster but requires more bravery and developed soft skills — one of my weaknesses.

Then one of my friends said that a company in Cracow is looking for one person for Android internship program. I have never been programming in Android, though I’ve been writing Java. Moreover, I’ve never been on a job interview but decided to have a shot. Here at least I could learn something.

Somehow the interview went well. In the opinion of my future leader, I have answered good enough on questions about algorithms, design patterns and Java. He was aware of the fact that I hadn’t been writing a lot in Android but “took the risk” and a few days later I was preparing for the first task.

Dude, you are doing it wrong :)

So now my internship is under way. I cannot say that everything goes flawlessly, that I don’t have problems with some of my tasks, that something that is easy for my co-workers is easy for me, too. I still make many mistakes. But I realise that I make them thanks to the fact that I sit near to my team lead and other colleagues. Everyone can look at my code and say: “Dude, you are doing it wrong :P”. Then, usually, if there is a coffee break or lunch, they help me to solve my problem and explain what I have done wrong.

Now, let’s stop for a moment and consider how does it look in some corporations. It is said that you had your mentor and you could tell him everything but please:

  1. How can I assert that things I’ve done are done properly — just like the professional would do it — if I am a really inexperienced developer?
  2. Do you believe that one person for X trainees would be able to control well the progress of every person under his care?
  3. Workers who are designated to be mentors have their own “usual” duties. Most often they have 4 or more trainees to teach, so the time that is given for individual talk is limited and has to be divided by the number of trainees.
  4. Some of the companies have a big mess with organising time and environment for trainees. Believe me. I have friends that went on the internship to the big companies and till now they wait for the access to Jira or VCS and other essential tools.
  5. Sometimes you won’t have a chance to work on a real project because no one there would be capable of taking the responsibility for the changes and potential damages that you could make as an inexperienced developer. That’s why they often create for you and your internship-colleagues kind of a sandbox project similar to the one that is created on the academy.

It is hard, I bet it’s much harder than at the corporation internship… but I don’t regret my decision. Despite there are often tasks which are complex for me, I am surrounded by the people who can help me. There are the moments that I am stuck and they give me the solution. But they don’t do it immediately. They prefer to give me a fishing pole instead of a fish. Most often they know the solution but will give me only the guidelines to find the proper way. Sometimes I say to myself:

It is impossible. I won’t cope with it… Why do you do this to me?

Then my lead comes and presses me even harder, gives me some tips, advises me on what should I focus and what steps should I take to get closer to the solution because he knows it is not a rocket science and even I can solve it.
When the lead is busy then other Android developers take over the role of my guide.

That’s why, I guess, in a few weeks I have learned much more than in a few years of my CS studies. Now I started to understand how important are the rules that my professors tried to put into my head without the practical basis. Especially courses related to object oriented programming and algorithms.

Of course, you practice coding on academy — you write projects but they will never consult all the aspects that the real project has (e.g. real clients, real users and their problems with an application, bugs that most often can be noticed only if the app is used by the large group of customers)…

Here, in Tango, it’s even better. Not only I learn practical things but I can also experiment with the latest frameworks and libraries available for Android developers. I have an occasion to work on three android applications. Two that are already released and used by thousands of customers every day and one which development started when I came to Tango. It is a precious experience for me because I can watch, or rather be the part of, the process of application development in its different stages.

Two main design patterns that I use now are MVP and MVVM.
For dependency injection, we use Dagger 2. HTTP API calls are realised with Retrofit 2.0. Thanks to Retrolambda I can use lambda expressions in Java 7 what makes my and other developers’ life much easier by improving the readability of code.

For API tests and Unit tests, we use Mockito and JUnit. The flow of view models in MVVM or presenters in MVP has to be tested well. Otherwise, forthcoming changes in code can potentially cause errors. Without good code coverage, it is almost certain that required changes in old implementation would not be noticed soon enough. Thanks to RxJava I could learn in practice how to “go reactive” and boost the application’s performance thanks to the asynchronous tasks realisation in relatively easy and effective way.

Despite DataBinding is a new framework I can use it in MVVM for view binding and to control them with a view model in really convenient way… I could write here more but I think it’s enough.

However, all of the stuff mentioned right above would have changed into a big bulk of mud if they weren’t used skillfully with the fundamental design patterns and rules that every programmer should stick to.

There is also another thing. Keyboard shortcuts of your IDE. I remember when I could not use a mouse for a day (kind of a developer’s training). It is difficult not to use it at all. But you should not use it in IDEs like IntelliJ. When you learn it, soon you will notice that you can code way faster than before.

Clean Code by Robert C. Martin

That’s why I have to read the books, watch tutorials and improve my knowledge at every possible moment. Recently I am finishing Robert C. Martin’s “Clean code” — one of the books that I can check out from our company’s library. On Thursdays, we watch Android conference talks on YouTube that we choose from the list we compose with our lead every two weeks.

As I’ve realised here, efficient code writing does not only base upon the knowledge of the design patterns, frameworks, libraries, programming languages and so on. The other pillar is a good planning and a work time organisation. Sticking to the Agile principles, using Scrum and making the use of stand-ups (or sit-ups if you wish :P ) is at least as much important as your programming skills. Not only you know better what you are supposed to do but also you still practice your soft skills.

I’ve learned a lot and know better what I have to learn and do to become a professional programmer.