Hi everyone, I'm Jalmari Ikävalko, a software developer in my early 30s. In this article, I’ll share my whole journey from my first contact with code to becoming the professional developer I am today.

I'll start from my childhood when I first got interested in programming.

My Introduction to Programming

I was around 12 years old – give or take a year – when an unexpected summer storm was keeping us stuck indoors in the otherwise sunny Costa del Sol of southern Spain. It was the only time I was properly abroad as a kid, as the financial situation of my family wouldn’t typically allow a vacation beyond the confines of our home country.

My cousins and I were in our grandfather’s tiny apartment – as his operated-on lungs did not agree with the Finnish winter – and there he had a computer. The computer had no internet access, but at the time Microsoft Word happened to include a Visual Basic editor and compiler.

Then it was that my cousin, older by a year or two, showed me some basics of programming, in Visual Basic.

A screenshot of Microsoft Visual Basic editor

As far back as I can remember, I’ve been interested in computers and enjoyed spending my time on them.

At my mom’s place, where I lived most of the time, we didn’t have all that many video games, and the computers tended to be a few generations behind the current crest of the wave. Still, I could spend a lot of time just exploring what the computer was able to do. Trying out DOS commands, going through random files I found, and so forth.

So when I realized that anyone could program these machines and create new applications on them, I was of course immediately intrigued.

How I Started Learning to Code as a Kid

My journey started off pretty bumpy. At the time, I had no idea where a little kid with poor English skills could find usable resources for learning to code. I bugged my dad, who had done some websites and had some general understanding of programming as a phenomenon, and he showed me some HTML, CSS, and JavaScript.

JavaScript, at the time, was relatively new and hadn’t yet properly established itself as the de-facto language of the web. In fact, most websites avoided relying on it.

I went through the books in our small local library, but most of them were completely unintelligible to me (the librarians there were awesome, though. They’d suggest books to me while I hung there after school and there was a computer available with good Internet access).

I got my mom to buy me a book on C++ and I trudged through it, mostly not understanding what I was reading.

Challenges of Dyslexia and ADHD

In those first years of learning to program, I didn’t really focus on learning very consistently and wasn’t really able to finish any projects – not even the tiniest of projects.

I would often feel very frustrated when I was trying to make something work and just couldn’t understand why it didn’t work like I imagined it should.

At the same time, school was not going very well. I was diagnosed with dyslexia in the first years of elementary school and was in remedial education for English. I also struggled with motivation – and bullying – and ended up only barely getting through without having to repeat a grade.

When I was around 15, I discovered IRC (a text-based chat system) and a Finnish programming community with its own website and an IRC channel. At the time we finally had gotten a broadband internet connection, which let me spend most of my days online. Having people to talk to and having resources in my native language accelerated my learning process.

I also got interested in demoscene – a scene of computer artists revolving around what is known as demos. These are programs that programmatically generate video and audio at runtime, without the video and audio being pre-recorded and stored inside the program. I got interested in creating visual effects programmatically.

Still, I was struggling with understanding graphics programming and how more advanced visual effects were created. I was stuck creating some pretty simple ones, like a basic tree fractal.

A simple tree fractal

Meanwhile, I had some peers, not necessarily any older than I was, who were doing complex 3D effects, full-duration demos, fully playable games, and more.

I often felt pretty dumb in comparison, as I wasn’t nearly as quick a learner as they were, and I struggled with making sense of complex code.

In retrospect, it’s not too surprising – my dyslexia and the ADHD I was later diagnosed with definitely affected, and continue to affect, my ability to discern symbols from each other. They also make it difficult to make sense of long lines of text, whether the text is in a human or a programming language.

Even still I get mentally exhausted from reading text with sentences that are too long. The first ten or so pages of Dostoevsky’s Crime and Punishment, to me, felt like reading a full book on advanced algebraic geometry.

Still, I pushed on, motivated by the thought that one day I would be able to create visual effects, games, physic simulations, and so on.

My First Job

I did some small demos and some physics demonstrations, nothing very special, and overall they were pretty crude, but somehow they still managed to land me a trainee job in a small local company working on a 3D engine for phones.

This was in 2008 or so when I was 18. At the time I didn’t even own a smartphone. The first iPhone had just come out a year earlier and I’ve always been a bit behind with the latest tech.

I was pretty sure that a 3D engine for a phone made no sense – who would want to be looking at 3D content from that tiny screen? And I was, of course, completely right! Well, okay, I wasn’t, but worse though – and somewhat to my horror – I was completely out of my depth.

I had managed to fake some sort of an impression of skill in the interview, but in truth, I had no idea about how to properly program shaders or improve and optimize a rendering engine.

I wasn’t able to do the job and my contract wasn’t continued – I felt embarrassed enough to never have included that short stint in my future job applications.

Getting Involved in Open Source

Around that time, I also made some small contributions to a couple of open source games and 3D engines. It wasn't anything very special, or mathy, or bleeding edge – just adding minor features like copy-pasting constant values to a list from some specification or adding a feature for picking up multiple items at the same time instead of just one item. Stuff like that.

I was still learning quite slowly and wasn’t able to finish complex tasks on my own. This was frustrating, since I'd been aware of programming for around six years and had more actively practiced it for two years. The people involved were very helpful though, and I did learn a lot of small things from everyone helping me.

My University Experience

The year I turned 19 I applied to university. I did not have the formal prerequisites for enrolling in a Finnish university, as I hadn’t completed the Finnish matriculation exams (roughly comparable to SAT in the USA and the A-levels in the UK).

Still, I wrote them a letter asking for special permission to participate in the exams for computer science. I was granted permission and scored high enough in the exams to enroll.

Unfortunately, I still wasn’t a very good student. On one hand, I was a bit too proud and felt the beginner courses were somehow too menial for me. On the other hand, if a course got hard, I quickly lost the motivation to study.

After a few years of finishing only a few courses and without having learned much of anything, I got kicked out.

I was around 21, out of school, jobless, and back to living at my mom’s place. I still kept to programming as a hobby. Writing minor features for open source software, trying out a few short gigs (and failing them all). Then I noticed someone on one of my IRC channels looking for help with their startup. I volunteered and ended up getting hired.

Working at a Startup

I remotely knew the person, as they were partially involved in the same communities as I, though we hadn’t directly talked before I joined his company.

It was a bit of an unusual setup. We shared an apartment, which was kind of unofficially part of the pay, and my salary was something like half of what the company I now work in would pay for trainees and juniors in their first job.

I would generally not recommend these sorts of contracts to people, but in my case, it didn’t work out too badly. I was finally able to be somewhat useful, could live on my own, and was making at least a little bit of money – not that any of it was ever left at the end of the month.

I still wasn’t very good at finishing tasks on my own and the quality of my code was rather bad. But with that pay level, my friend’s startup didn’t truly have all that many options. Mostly, I was doing minor feature improvements, fixing bugs, and adding some new functionality to the software.

A year or two later I met my then-future wife. We moved together, I changed cities, and left that startup behind.

Junior Game Developer

I then applied to another startup, with a slightly better salary, and with more than 2-3 people working for them. My assignment for the technical interview was to add a mirror effect to a 3D scene with a skater on ice.

Typically, you do reflections by placing a virtual camera on where the reflection is and then render the scene from the perspective of that camera. I had never done that, though, and ended up using another hack that I had done previously.

I simply rendered the scene again, just flipped on the X-axis. It’s an imperfect technique but was commonly used in older games and works well enough for flat surfaces that are underneath the camera by a sufficient distance.

The job was a bit all over the place, in regard to the skills needed. The fact that I had contributed – even if insignificantly – to a large bunch of diverse projects finally paid dividends.

Over the same day, I might be coding shaders for graphics effects. I might be fixing up a web backend, configuring installers, or maintaining servers (having run Linux through much of my teens was worth it! Though it had never made me as popular in school as I was told it would).

From Junior Dev to CTO

When I started, I was a junior game developer by title. Over time we got more and more projects, the work got more challenging, and then one day our CTO left. With no one else to replace him, I became the replacement.

At roughly the same time, good ol’ Adobe Flash was dying and its support was ending, and our products happened to be mostly in Flash. So I ended up leading a major rewrite of our main products from Flash to the Unity game engine.

At the same time, we expanded our repertoire of web products, and I led the development for those, too – sometimes more successfully, sometimes less. I still wonder how exactly I managed to keep up with it all and not crumble under the stress, but I suppose that when you give someone responsibility, they just might rise to the occasion.

A noise meter & crowd camera product of a startup I worked for (from Uplause promotional materials)

I ended up working at that company for six years. But at some point, I started to feel that my chances for professional development were exhausted. We had trainees and juniors coming by, staying half a year to a year, and a lot of the time I was the only experienced full-time developer.

I also didn’t feel very invested in the projects anymore. They were fun enough to do, but I didn’t own any of the company and my salary wasn’t at the level where it would have been elsewhere.

At the time, I wasn’t very well aware of the wider Finnish IT scene. I mostly knew about our biggest game companies – which weren’t and still aren’t that many – but I didn’t really know what the big consulting or product companies were.

So, I ended up applying for a new job by simply googling for job openings and finding a company with a stated mission and values that seemed like a good fit for me.

I didn’t know it at the time, but that company had actually won a bunch of awards for being one of the best places to work at. And it was, in a sense, somewhat prestigious to work at.

I arrived at the interview woefully underprepared, but the cultural fit was good and my technical skills were deemed decent enough to proceed through the interview rounds and I ended up getting hired.

From Startups to Software Consulting

So, around three years ago, I moved away from the startup world to become a software consultant.

When I joined my current company, I was quite self-assured in my skills and considered myself to have grown into a very good and clever programmer. I wasn’t completely wrong, but it did turn out that I went from being the large fish in a small pond to being, at best, an average fish in a much larger pond.

My old enemies, concentration and focus (or the lack of them) were again orchestrating quite the discord to deal with. I doubt I’ll ever be fully free from having to regularly repeat the struggle of finding motivation and keeping my discipline up.

There were also parts of my technical skillset that I had badly overlooked. In the first year and a half, I ended up significantly improving my functional coding skills and my ability to write easily testable code.

I also needed to modernize a lot of my knowledge. Getting used to newer continuous integration tools, cloud services testing tools, and libraries, was quite the process. (At the small barely-getting-by type startups, we typically used virtual private servers since they were cheaper and cloud services weren’t yet quite as mature as they are right now.)

Practical work is one of the best ways to improve, though, and improve I did – and at a pretty decent pace, in my opinion.

Today, our company isn’t much for titles and we sometimes use purposefully inflated titles just for the cheap laughs. But if I have to give a title to a client, I’m typically a senior software consultant. It’s a descriptive enough title.

And after an arduously long journey to become a developer who can kickstart projects, lead feature development, participate in all stages of software development, and whose help and feedback others can rely on, I think I’ve finally matured enough to check all the boxes for what’s expected from a senior developer.

I’m still constantly learning new things. Lately, I’ve started to feel like I would like to try out working on data engineering, data analysis, and machine learning tasks.

Since I mostly ended up skipping school, I’ve been taking statistics courses at the open university of Helsinki to better understand the terminology and methodologies that data analysts are using.

On the other side, I’ve also started to study for key cloud certificates, like data administrator and data engineer certificates, to further up my credentials in client offerings.

And, funnily enough, after finally having had some success in studying through difficult courses, I’ve also started to feel that maybe a Bachelor's Degree wouldn’t be impossible for me either. Though I am not sure if after all this time I still want it in Computer Science!

"Luck is What Happens When Preparation Meets Opportunity"

So that was my journey, from the first time I saw code to what I am doing today. It was at times a frustrating and bumpy road, and I know many people have had an easier time learning to program than I had. Still, I consider myself pretty lucky overall.

One ex-coworker used to have a quote by the Roman philosopher Seneca as their signature, “Luck is what happens when preparation meets opportunity”. But there’s a lot more to it than just that. Your childhood environment affects your preparation and the opportunities you get are down to statistical chance.

I consider myself lucky for having had so many opportunities despite also failing them due to lacking preparation.

And I consider myself lucky for having had supportive parents and a smart, programming-aware cousin to show me stuff.

Today I am lucky for having some pretty amazing, extremely skilled co-workers and a work environment where neurodivergence is accepted.

Yet, there is a bit of truth to the quote. If preparation is what you get as a product of hard work, I did put in the work even when the work was mostly hitting my head against the wall.

The truth is that if you have a disadvantage like dyslexia or ADHD, things can take a lot longer for you to learn than for someone else. But that doesn’t mean it’s impossible to learn. The end result just might be all the sweeter, too. The skills you end up with will be hard-earned, a testament to your ability to overcome difficulties.

Today, it is absolutely awesome how much better resources fresh learners have available to them. When I was younger, the quality of free resources – when they were available at all – was often dubious at best, and many tutorials didn’t teach things well, if even correctly at all.

We have the likes of the University of Helsinki’s MOOC.fi available for everyone, for free. And we of course have freeCodeCamp. There are many learning communities spread over Reddit, Discord, and so on.

Make good use of these services and, one day, after having made it, perhaps look back and see how you could contribute to them in turn.

One last piece of advice I’d like to give to people new to programming: Programming is at its best when it’s fun. If you’re bored with your current courses and don’t feel like you’re enjoying your time, try out something different.

Generate sine waves and combine them into chords. Create some fractals programmatically. Try making the most annoying website possible, with flashing lights and sound effects when clicking buttons.

Make programming fun. You’ll also learn surprisingly much while doing it.

In addition to the freeCodeCamp editorial team, I'd like to credit Liisa Toivonen for helping out with proofreading and some suggestions.

Thanks for reading!