Teaching myself to code: Resources I used to learn to code

Teaching myself to code: Resources I used to learn to code

Background

Unlike most software engineers, I did not study Computer Science. In fact, I did not even take a single computer science class during my undergraduate program. However, I still managed to learn to code on my own and wanted to share what resources I used to become comfortable with coding.

I studied Biochemical Engineering at Jacobs University Bremen, in Germany. I did want to take a few classes in Computer Science as elective classes, however, I was strongly discouraged from taking them by one of our CS professors. That professor made it sound like his classes are only for extreme CS enthusiasts, and that it would take a lot of effort to successfully complete them. What he was saying in simple terms is “if you are not pursuing a CS degree, don’t bother taking my classes”. In hindsight, I believe that he strongly discouraged many non-CS students from trying out CS.

My first introduction to coding

After my graduation, I had a lot of free time. I was still curious about CS and I knew that there were some classes from Open CourseWare programs. Over the summer, I went through Programming Methodology at Stanford University, and it was surprisingly intuitive. I was very surprised by how easy it was to get started with coding. It was not at all demanding, and I felt like I could already write some meaningful code. Overall, the class is based on Java, however, the most important thing I learned during this class was the fundamentals of coding, such as different types of statements, loops, object-oriented design, decomposition, encapsulation, abstraction, and testing. Assignments were usually very practical examples, such as the Bouncing Ball game.

Untitled

Figure 1: Bouncing Ball game

Programming Methodology, Stanford University, Stanford Engineering Everywhere

https://see.stanford.edu/course/cs106a

Language-specific courses

After that class, I took a few classes on Udemy, specifically to strengthen my Java skills. Classes on Udemy were very concise and they focused on very specific topics and applications. I don’t remember specifically which courses I took, but this one is very similar in terms of topics covered:

Java Programming Masterclass, Udemy

https://www.udemy.com/course/java-the-complete-java-developer-course/

More CS fundamentals – algorithms and data structures

Apart from that, I started to broaden my knowledge of CS by taking more fundamental classes on algorithms and data structures. Knowledge of algorithms and data structures is very important for a software engineer, regardless of language, platform, or framework. Every software engineer should be able to understand the most common algorithms and data structures.

I took these two classes from Stanford University on Coursera:

Algorithms Part I, Princeton University, Coursera

https://www.coursera.org/learn/algorithms-part1?

Algorithms Part II, Princeton University, Coursera

https://www.coursera.org/learn/algorithms-part2?

Further resources

While the resources I listed above were very helpful for me to get started, I still needed to learn a lot of other things. I am talking about only the technical skills (or hard skills as some say). Here is a diagram of what I think I needed to learn to become a software engineer

I would group the technical skills into three groups:

  1. Language & Framework
  2. Computer science fundamentals
  3. Processes and good practices

Untitled

1. Language & Framework

A lot of people ask “what language should I learn?”. The choice of your language depends a lot on the framework you want to work with. If you want to become a mobile developer, the most popular options are:

  • Native iOS, languages: Swift, Objective C
  • Native Android, languages: Kotlin, Java

And there are a few cross-platform (you can build your app for both Android and iOS from a single code base) options:

  • Flutter, language: Dart
  • React Native, language: JavaScript
  • Kotlin Multiplatform, language: Kotlin

Hence, it doesn’t make sense to learn JavaScript and try to use it for native Android development.

Some books that I found useful for learning Java:

Head First Java, by Bert Bates and Kathy Sierra

https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

Effective Java, by Joshua Boch

https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/0134685997

Resources I used for learning Android:

Android Documentation

https://developer.android.com/docs

2. Computer science fundamentals

Apart from language and framework, one must learn other fundamentals of computer science. I am not an instructor myself, but here are a few things I would include as must-learn topics to become a good software engineer:

– Algorithms & data structures

– Network communication

– Databases

– Security

3. Processes and good practices

In order to become a good software engineer, there are a few things someone should learn:

– Version control

– Code review

– Clean code

– Testing

I wouldn’t say that you need to be very good at these things when you start your first job but being familiar with what each one of these helps each entry-level developer big time. I wish I documented each resource I used, but sadly I don’t remember what exactly I used in order to learn about these topics.

Some books that I found useful for learning Java:

Head First Java, by Bert Bates and Kathy Sierra

https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

Effective Java, by Joshua Boch

https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/0134685997

Samat Kadyrov
Samat Kadyrov
Software Engineer (Android)

Android enthusiast, launched several successful apps from scratch, some of them which went on to win “Best of Google Play” and “Editors’ Choice” awards.