Capytech Icon

OOP, Procedural Programming, Functional Programming

Programming Languages

Posted on: August 7, 2023

It seems every ex-Google ex-Facebook ex-[insert FAANG name] tech influencer on social media has their own video on how to become a software developer nowadays. And each of them tell you to learn different languages in different order. Confusing much?

I understand the reasoning behind them - skills required for software development varies greatly depending on the type of development you want to do. OOP languages might be the way for a certain application, while front-end web development with React will get you to use functional programming a lot more. Embedded systems, on the other hand, may require you to use procedural programming more often than not. But for a beginner, all this is confusing as hell.

As if this chaos on the self-taught programmer journey wasn't enough, it's only ever-so-slightly better in academia. At British Columbia Institute of Technology, you're pretty much free to learn almost any language or material in any order after Python and Java. Initially, you're taught the fundamentals of programming in Python and Object-Oriented Programming in Java - which makes sense, because Python is easy on the beginner with its simple, dynamically written, highly abstracted syntax, and Java is the language that will get you familiar with statically typed object-oriented programming. But those are pre-requisites that unlock a massive number of courses, and you're left to navigate in any direction you choose, and hopefully you're on the right track.

Thankfully, if you follow specific programs such as Applied Software Development or the Computer Systems Certificate, your studies remain more structured - you continue on from Java to learn procedural programming with C, where they also introduce data structures and algorithms. But you need to take a separate course on algorithm analysis and design in order to study concepts such as time and space complexity at a deeper level. C is a pre-req to C++.

Depending on the program, you also get to learn fundamentals of web development with HTML5, CSS3, JavaScript ES06 and relational databases with SQL, giving you a well-rounded range of knowledge. If you so wish, as have I, you can extend into back-end web development with Node.js and front-end web development with React.js, where you will learn functional and event-driven programming.

I personally have not had the experience of taking any programs or courses at other universities or colleges, but from what I heard from a number of CS students who transfered to BCIT, they are apparently excessively heavy on theory and severely lacking in practical skill acquisition, including actually coding in programming languages and developing applications.

From Programming to Design to Optimization

Personally, if I were to travel back in time and learn from scratch, I would order the learning in a slightly different way. It is my belief that you should first learn how to code, then learn to design - both front and back-end, then optimize your code. ThePrimeagen constantly tells us to build an application, then re-build it from scratch, and I think he has a very good point. It's not too late to learn the concepts and theory after you've had your hands on coding, because concepts and theory will make you a better coder once you know it.

Recently a friend of mine asked where they should start in order to learn programming. And this is the chronological order of materials I recommended him to study in:

  1. Programming Fundamentals with Python
  2. Introduction to Web Development with HTML5 and CSS3
  3. Object-Oriented Programming with Java
  4. Web Development with JavaScript
  5. Relational Database Design with SQL
  6. Business Analysis and Systems Design (Waterfall)
  7. Agile Development and the Scrum Framework
  8. UI/UX Development
  9. Procedural Programming with C
  10. Front-end Development with React.js
  11. Back-end Development with Node.js
  12. Algorithm Analysis and Design
  13. Application Development with C++

I told him to start with Python so as not to overwhelm him with the syntax of statically-typed and lower-abstraction languages, and HTML and CSS to discover the fun of developing static pages. Java is an excellent introduction to OOP, and will help him familiarize with the JS syntax, as they are similar - although vastly different in the way they work under the hood. Database design will help him understand the importance of keys and normal forms when creating objects, arrays, maps and databases. Agile will familiarize him with modern project management trends like ceremonies, sprints, reviews and retrospectives and user stories, and UI/UX development will attune him to user-focused development and efficient layouts and patterns/anti-patterns, as well as accessibility features. Procedural programming with C will expose him to close-to-the-metal, lower-level programming, pointers, bit and memory manipulation, binary trees, data structures, recursion, and code optimization. Node and React will allow him to learn some of the most popular frameworks currently in web development and introduce him to functional programming, components and states, single-threaded async operations, callbacks, npm, modules, promises and streams.

You may or may not agree with my recommended order, and that's OK. We all have different ways of learning, and for me, this would be a steady-paced progression in skill-acquisition and difficulty. My highest priority was to prevent my friend from quitting as much as possible, as I know how overwhelming it can feel in the beginning. That list is in no way exhaustive, and barely scratches the surface of the enormity that is the field of computer science. But I believe it will build a strong foundation for building and designing real-world applications.