Welcome: Hello World!
First post, first time writing, but no one ever gets good at anything until they start. The goal with this substack is to explain technical concepts in simple terms that anyone can understand. Our goal for our readers is the following:
Understand concepts in Computer Science/Electrical Engineering (think Hardware)/Mathematics. Most tend to focus on one area, but we believe (and have seen) that those who understand all three areas are significantly stronger as professionals
Develop (or solidify for our experienced readers) foundations to ensure you have a fulfilling career
Bolster your presence among your peers since being able to market yourself is always important. As BowTiedBull says, sales is a skillset that everyone must have. Knowledge and learning how to properly display and apply it are quite different
Keep in mind that the technology industry is a rapidly changing field, and to always keep an open mind, and be willing to keep learning. This substack is not meant to be treated as the holy grail, nor are we trying to compete, we are trying to help others win. Treat this as a collection of observations, experiences, and information to serve as a guide (and eventually a framework) to help you evaluate and make the right decisions for yourself in this particular niche.
Let’s get started!
Basics Part I: Math
Many will suggest learning a specific language such as Python or JavaScript. In reality, an understanding of mathematics will take you far in this field. It is not necessary to know mathematics, but again, we are trying to help anyone interested in the field shine relative to their peers. To give an analogy, there are many programmers who do not understand math well, and are holding strong positions, running their own SaaS businesses, etc. We will have a separate post on the types of roles you can pursue, but think of certain roles as almost ‘vocational’ (as we get better at writing we’ll do better with the word selection), where not knowing everything about the field is necessary. Think about construction businesses, one can do very well for themselves in that area, but they do not need to know everything that a material scientist does. When developing software, a similar analogy can be applied.
Now, how to get started on mathematics beyond what one learns in the US high school education system? Calculus, Linear Algebra, Differential Equations, and Discrete Mathematics (in that order) are a solid start. Again, not required, but you want to be the best you can be, right? There are other branches of mathematics you could learn, but we have been deeply inspired by BowTiedBull since about 2014/2015 before the rebrand, and quote them when they say to focus on the A- if it yields the same results as an A.
Looking at courses or books to take, this is up to your learning style. If you need external discipline, enroll as a non-degree student at your local college. If you have your own discipline, MOOCs are an excellent resource (check out MIT OCW, have personally enjoyed their teaching style). We can recommend others if there is interest, but have refrained from doing so in this post as many have different learning styles, and which professor one enjoys does not translate to the same outcome for everyone else.
As you get your mathematics foundation down, let’s move on to the next step!
Basics Part II: Problem Solving With a Programming Language
No, there is no contradiction here compared to Part I. Notice how it was mentioned that many will suggest learning a *specific* language. What is being said instead is to try solving simple problems with a specific programming language. There is a fine line here, and to explain this in greater detail:
Learning about a programming language is useless. It is like learning about bodybuilding, you can read and learn all about squatting, but until you actually squat, you won’t learn.
Boxing yourself into one language as you learn is not helpful, you do not yet know all about the basics to appreciate the differences between one language and another, along with what foundation a specific programming language helps with (for the Java school graduates, think of LinkedList vs. ArrayList)
Now that we have this out of the way, what problems do we try to solve for? No, do not try to create a social media clone, an ecommerce clone, etc. Most consist of “copy and paste what I’m doing without thinking” not to be harsh, but you don’t actually think when going through these courses. If anything, we would recommend those types of courses for experienced individuals that just need a taste of what is involved (IYKYK!). This does not mean going on popular competitive programming sites, or sites focused on interview prep.
Instead, we highly recommend intro courses here such as MIT’s MOOC on Introduction to Computer Science and Programming in Python (LINK: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/). Notice how the title (and the course itself) focuses on concepts rather than the nuances of the Python programming language.
Basics Part III: Algorithms and Data Structures (The Good Stuff)
Congratulations on making it this far! The difficult parts have passed, but now this is where the real work begins. Most of software engineering is around handling data in memory, and processing through logic efficiently. Most of what you learn here will be covered in interviews should you be junior. As you progress in your career, its more about what you have built (yes, we know the current state of the interviewing world is focused around this even for senior engineers, and we will get to this in a separate post).
Now, there are many resources here and again, what works for someone else may not work for you. Based on our experience, this is what tends to be the best courses to learn more about algorithms:
Algorithms, Part I (LINK https://www.coursera.org/learn/algorithms-part1)
Algorithms, Part II (LINK https://www.coursera.org/learn/algorithms-part2)
Algorithms Specialization (LINK https://www.coursera.org/specializations/algorithms)
There are additional supplemental books for those who would like to read and study independently. We can do a follow up substack post focusing on this area of the basics depending upon interest.
To comment on our eaarlier note around software engineering focusing on handling data in memory, and processing through logic efficiently, this is essentially what is covered in any algorithms and data structures course (like the ones shared above). Keep in mind that when it comes to formal education, the instructors are not liable to get you a job, or build a business. They will not always clearly state real-world applications of each topic you learn about. Sure, there may be some explanations, but not all of them may make sense. To give an example, linked lists and arrays are two fundamental data structures. When you read about one and the other, sure you will learn about how they are stored in memory, how long it takes to insert, access, etc. But how can you use this in the real world? How does this make you US Trash Tokens? The broad answer here is to think about the implications it can have on the business your product serves. If you are building a system that is latency sensitive, and you know you only have to deal with a finite number of elements, storing them once at system startup, accessing them frequently, it may make more sense to use an array. There are always tradeoffs, and one data structure or algorithm does not dominate over others. We will go into specific details in future posts (i.e. how to determine what to use when getting requirements for your product, etc.), but hopefully this helps you develop the initial thought process to have.
Conclusion
This alone does not make one the best in the field, however the goal of this post to get started with the basics. Getting through this alone will take you a few months (or less, knowing how autistic the Jungle is!). Our next post aims to dive deeper into what to do next. To give our readers a taste, we want to focus on solving problems you see in real life. This helps in a few ways:
You are able to build something tangible
As you focus on #1, you learn how to gather requirements for your project, what constraints you have to deliver in
Solving problems in real life = portfolio of projects, can help with landing a job since you prove that you actually *did* something instead of just memorizing concepts
One of your projects can lead to an actual business! This, at a very high level, is what a SaaS is
Feedback
Please voice your opinions on what you would like to see as our goal is to serve you and provide the right information. If there is anything we could do better on, anything we did not explain correctly, or any other constructive feedback that you may have, please please do feel free to share. Always learning, always growing.
Getting Started With Computer Science
From a formal CS background - there were a few aha moments I had that lead to dramatic improvements in my competency. Fundamentals are important - and I agree that a sound understanding of data structures and algorithms are invaluable. However, my understanding of software engineering changed dramatically when I started doing it professionally. The ability to leverage libraries and abstractions provided by more commonly used frameworks & languages - I feel is the difference between theoretical and practical computer science. But maybe that is because I already knew the theory.
I think it is important for a novice to identify their objectives when learning software development. There is a very different pathway for someone who wants to learn theory and work with more challenging CS problems vs. someone that hopes to do some scripting and basic web/application development. I think the advantage to learning the theory is that it gives you the toolset to adapt and self educate to solve any problem and learn any framework. Looking back on my education - I wish I was exposed to more practical applications than theoretical ones.
I now wonder how valuable some of my fundamental skills are today for the projects I typically work on. I suppose even if you're using built-in data structures and algorithms - understanding time complexity and Big O notation is still valuable, but perhaps it is more valuable to understand how unindexed queries perform and what a full table scan is? Do you need to know what a finite state machine is or how pointers and memory allocation work in C or will you get further knowing how to find and install a library that solves a requirement in a current project?
I know having no fundamentals is a recipe for disaster - but with the way software is built today I wonder what the prerequisite fundamentals actually are.
Great introduction. Self-taught data engineer here so I still lack depth in the mathematics part of CS. Will look into the MIT courses. Looking forward to what you cook up.