We all know that bootcamps don't spend a ton of time teaching computer science topics/principles and focus more on the skill of coding and learning how to learn. Those who are self-taught may or may not concentrate on it as well. I know that understanding CS principles is important to ones success as a SWE, so I want to pose this question:
What do y'all think are the most important CS principles that someone with a non-traditional background should concentrate on before landing their first job?
I want this to be a resource for people with non-traditional backgrounds to get an idea of what is most important to know / concentrate on before entering their first software engineering role; this way, we can try to make the gap in knowledge for a non-traditional professional the tiniest bit smaller.
Let's do our best to try and help others improve instead of putting others down.
Top comments (40)
Get a General Overview of the History of Computing
Understand the fundamental history of digital computing. Look at how the late industrial revolution uncovered challenges and problems to bureaucratic logistics which required mechanized calculations and how those shaped the 20th century. Furthermore, look how the world wars in the early 20th century shaped computing demands and drove technology. Some specifics to consider from that era are aerospace engineering, the Manhattan project and early digital signal processing. Finally, it's worth taking a look at the space race and cold-war era developments; think DARPA and NASA tech. This will give you a macro overview through the human lens of why we're doing this computer stuff. Hopefully, those historical and anthropological explorations will lead you to understand that mathematics, physics, and engineering are the bread and butter of computing, and ultimately that software is what tells computers what to do. Without functional software a computer is nothing but a bunch of complex circuitry which wastes electricity and generates some thermal radiation (I'm sure we've all reduced a computer to such a useless state).
Know The Machine
Understand how the machine runs. What the role of the CPU, Mobo, Ram, and storage devices and types are. You don't have to be a electrical/computer engineer on this stuff, but have generalist's view on the core functioning of a computer. Storage hierarchies are important too: From your hard-drive to the cloud, which is more efficient and which should be used in what scenario?
Also, knowing the different core layers Hardware, firmware, system, application layer model. This helps separate concerns and sort out the hundreds of different domains of software development by giving them taxonomies.
Data Structures and Algorithms
Become familiar with core data structures and their use cases. Bite sized chunks here. There's a lot of dense information there and it gets abstract and complex fast. It's easy to look at hash tables, and before you know it you're learning about hashing functions. A curious mind will want to do a deep dive on hashing functions and find themselves in the world of cryptography, which will lead them to the field of mathematics known as number theory. One good outcome of such a deep dive is that you discovered that a common CS data structure's fundamental science is rooted in number theory. The bad part is if you're an aspiring front end developer you're not on track to building awesome react components or solving UI patterns with good CSS.
Furthermore, a big element of data structures is performance. There are formal models and theories (Big O for example) in CS which you can use. Having a deep grasp on Big O will lead you down the enlightening path of numerical analysis and concepts in calculus (optional).
Same thing goes for search and sort algorithms. Be careful of the rabbit hole and understand what is important to you.
Rationale for Topics Suggested
As someone with a CS degree I can't stress enough to non-CS people looking to get into software development how important sticking to macro concepts in the beginning is. Deep dive on demand is my mentality. You can spend a life time studying concepts in CS and write dissertations; if you want to be a CS academic researcher that is. Don't forget the human element. Remember, we humans made all this complex stuff for reasons. I think there is value in making that human connection. Making a human connection can build confidence and make topics more relatable.
CS !== SWE
Computer Science is to Software Engineering what Physics is to Electrical Engineering. Physics explains and measures quantities and interactions in the natural world, while electrical engineering seeks to create things using principles in physics. Same goes for CS vs. SWE. In CS you are tasked with understanding how a search algorithm works and understand its performance. In SWE you are tasked to decide when and why to use a search algorithm in a larger software system.
Know Yourself
What you need to learn depends on what you want to create/solve. If you need to create software that deals with graphics you will need linear algebra and vector algebra skills. You'll want to learn about transformation functions, linear mappings, 3d to 2d projections and eigenvectors, while having a solid grasp on doing computations in two or three space ([x,y],z) depending on need. Doing business logic? Well, you'll be studying databases and logic. Domain specificity is a real thing and something to learn to embrace. We have limited time to live, being smart about sorting out what to learn and what not to is as important as learning the thing itself. Not working on crypto problems? Don't waste a month on cypto material TRUST ME :D.
Hope some of this helped. I needed to sort these thoughts out myself and have been asking similar questions lately. Feedback always welcome.
I'm so happy you mentioned the historical aspect. To me, that was what finally clicked, seeing where all this came from, the decisions that shaped software as we know it now. I highly recommend the Command Line Heroes podcast... it covers the entire history of computing. I especially liked the JavaScript episode and Framework Wars.
Where can I get the Command Line Heroes Podcast
redhat.com/en/command-line-heroes
Thank you so much Nicholas! This was incredibly helpful.
I'm glad to know my B.A. in History is coming in handy in regards to knowing a lot about the Cold War, Manhattan Project, and the Industrial Revolution. I'll be more than happy to brush up on some of that information. 😊
Glad my comment added some value to the discussion. I think CS topics can become really boring and impersonal for non-cs-academics real fast. Losing that interest is terrible for the movement. Gotta keep people interested and learning.
I highly recommend the book Tools for Thought for an engaging history of computers and interactive computing.
This is possibly the best thing I have ever read on this topic... 👏
Very elaborate and well defined explanation of how to go about choosing the right path for ones self, only wish i had known before deep diving into several rabit holes haha
I think Big O is a good concept to have in the bank. I think calculus also pays off more than we think.
A lot of computer science is typically learned along the way eventually I think. Where computer science ends and software development begins is pretty hazy. So many folks will put data structures and algorithms, but I really think you pick that up no matter what.
The basics of cryptography is useful, though I don't think it matters as much in software day to day for many folks as much as for having a mental model of how a lot of privacy-based systems need to work.
I learned some CS before dropping out, and I feel like it was valuable but not critical for what I do before and after.
PS, here's another thread on the topic with more reading in addition to what folks post here.
What computer science concepts should devs without a CS background prioritize learning?
Ben Halpern ・ Feb 7 '17 ・ 1 min read
I 100% agree with Big 0, but not calculus.
As someone who struggled greatly with calculus, and had to try very hard to get through it. I can firmly say I haven't use calculus professionally what-so-ever.
I can see it coming in handy if your doing physics, but if your not making game engines you probably wont need calculus.
If you struggle with calculus (like me) I can really recommend the book Infinite Powers: The Story of Calculus - the Language of the Universe by Steven Strogatz. It is an easy to read (I am dyslexic) and fun book, which explains calculus in a more meaningfull way.
Alternatively, the people that learned calculus enough to apply day to day have a secret advantage over you that you'll never know about
Its possible there is a point where I understand calculus enough that it applies to my day to day dev work, but from what I do know of calculus, it hasn't helped me and it doesn't seem like it would help me much even if I were to go out and get a PHD in it. Again, if you go into work that relates to physics, calculus will pop up.
I found other types of CS math like discrete mathematics and finite automata
to be more relevant and useful for day to day programming work. The names sound crazy, but the ideas are very relevant to basic programming concepts, algorithms and data structures.
(fun fact) Calculus was invented by Isaac Newton (at the same time as Leibniz 😉) when he was trying to explain why the planets orbits the way they do at the age of 25.
Same.
This is great information. Thank you for always being so helpful Ben!
I'm self-taught and one of the things that I have seen is recommended almost everywhere is Harvard's cs50 course, which is freely available for anyone. I think that to be a good starting point for learning CS principles.
I have too followed the cs50 course, and I recommanded it. I learned the basics there. It was really helpful
I'd say basic calculus (especially limits, derivatives and such) and Algebra (using matrices to solve a set of equations and the opposite of a matrix).Then, using this knowledge, data stuctures and algorithms. I believe these 4 classes (can be found in Coursera and YouTube) can go a VERY long way in making everyone a better programmer, regardless of specific field of work.
I'm curious why you think this kind of advanced math is useful. Do you have a specific type of programming job in mind where it is useful?
I personally learned those things, but never used them as a self thought web developer. Maybe other jobs like game dev, machine learning, image processing?
Well, for two reasons - the first being that Math knowledge is required for a true understanding of Data Structures and algorithms runtime analysis (working knowledge of lim calculation is required for the simple understanding of Big O notation). Second, while this knowledge is probably not required for web development, it may come handy in other development fields - I found Matrix inversions to be very useful when I needed to work with physical objects in three dimensional world model (in the autonomous vehicles industry), and that wasn't even using Machine Learning or Neural Network.
Third, understanding of data structures is very handy if you work with big data and limited resources (and yes, for me, even 2k processors running at once is considered "limited resources"), this knowledge is super useful for small tweaks that improve performance (using dicts instead of lists/arrays, performing operations on arrays instead of item at a time).
Sure, one might pick up most of this knowledge, including the required math on the fly, but my answer was on basic topics of CS, not specific topics for certain fields of the industry.
I’d disagree a bit. Time complexity doesn’t necessitate an understanding of advanced mathematics for you to use it practically. While it helps to understand quadratic and exponential complexities, it isn’t necessary. Additionally, understanding a data structure and algorithmic efficiency in certain circumstances doesn’t necessitate advanced mathematics. If you’re building a physics engines or building neural networks, sure. I’ve worked with software engineers who understand data structures and algorithms on a deep level who weren’t so good at advanced mathematics. It comes down to right tool for right problem and being able to discern what that tool is. While admittedly those with mathematics background have an advantage, I wouldn’t say it’s required.
If you need to figure out how your website is going to scale, how much traffic your site can handle, and where to invest resources in performance tuning. Calculus can help you figure things out in a fraction of the time.
It's like writing without conjunctions. You can do it, but it's nice to have them.
this might be a non-intuitive answer but I feel like the best thing my degree did for me was force me to NOT use frameworks. For example, I wrote a lot of vanilla PHP that manually connected to a database, a database whose schema I literally drew out with pen and paper before building in the MySQL terminal. not only did this give me an appreciation for things like ORMs but it helped me understand the underlying concepts, leading to better interpretation of error messages now.
Similarly, learning C/C++ fostered a better understanding of even lower level concepts, again helping me understand what's going on when I get weird error messages.
So the TL;DR is that I guess CS concepts didn't help as much as being forced to walk before I could run did
This is one thing I am really thankful to Flatiron School for. They taught me how to do things the "long" way first and then they were like "oh and by the way here is this awesome ORM/framework that does all of that for you." As a SWE coach right now, a good bit of our students get frustrated with this learning style, but they'll come to realize that it's beneficial to know the how and why of the magic going on behind the scenes of frameworks and ORMS.
I think the BaseCS series by @vaidehijoshi is a good resource.
medium.com/basecs
It can help you gain awareness of CS topics over time in easy to digest chunks.
I think another good exercise is to write a simple web server in C and deploy it on a cheap cloyd host (like a $5 Digital Ocean instance). I think this is valuable because it takes away a lot of the magic in modern web development and can provide exposure to the lower level networking and programming constructs that powers the web.
I like this guide for the networking aspects of this:
beej.us/guide/bgnet/html/
You can find lots of other resources though across the web.
As others have mentioned, data structure and algorithm exposure is important too. The level of familiarity you'll need is highly dependent on where you are in your career and what type of software you're developing, though. I think for most folks it's just important to know what is out there and where to learn more as it becomes relevant.
Just my two cents. 🌠
Not sure if this is what you're looking for Victoria, but I would say be a self learner. Going from a non-IT role to a dev role is a pretty huge pendulum swing.
You will be working with different personalities and abstract concepts that are unfamiliar. Focus on your strengths. Nobody is an expert at everything. Some of you will be Python champs. Others will be better at network security. And other will be better at project management. That's ok. It takes a lot of frustrating days seemingly going nowhere and loops (heh) on the development merry-go-round before you can find your groove.
Labs and virtual machines are your friend. Because no amount of textbook reading will translate to real world understanding of CS or information systems. I have yet to find textbooks in my studies that aren't outdated (on some topics) by 5 years or more
Glad to see another Yellowjacket here! Those were my two favorite courses, but when I tried to take CPU design in Verilog all of a sudden I was in way too deep over my head. I guess I did not pay quite enough attention to CS 2200
Hi there! I think that the SWE skill set is fairly easy to learn as you go.
I agree with Ben that you would definitely pick up data structures as you go, but I would always anticipate that someone who is hired to be a SWE already knows those concepts.
However, I think at a minimum there should be a solid understanding of object-oriented programming and the different data structures that fuel them.
A good grasp of time and space complexities would also be nice, but not entirely necessary. It's not like I have every variation of a sort memorized by run time. (There's the internet for that!)
Nicholas has done a wonderful job laying out the skeleton of what someone should do to stay passionate and informed about computer science and software engineering. Since I cannot do better, I will recommend some resources for doing each of them as a starting point.
Get a General Overview of the History of Computing
Go to the Computer History Museum! If you are fortunate enough, visit the museum in real life. Not only can you see all the computing devices throughout the history, you can try the Arithmeter, punch your own punch cards, see an IBM sorting machine in action, and stand inside a super computer.
Know The Machine
Custom build you own computer with PCPartPicker! You don't need to build the beefiest monster on earth. Compared to reading descriptions and looking at drawings and photos, it is infinitely more exciting to actually hold the motherboard in your hands, put the CPU in the cage, screwing on the cooler fan, insert RAM the right way, find where to plug power on the GPU, to close the case, to turn it on, and to see the BIOS screen... or nothing, which then teaches you about power consumption.
You can also go reverse and buy a cheap old machine for 50$ and take it apart. This doubles as a history exploration of obsolete hardware standards. Why do we not use 3.5mm anymore? What are IDE, SATA, M.2, NVMe? What are VGA, DVI, HDMI, DisplayPort, Thunderbolt? What's different among USB 1.0, 2.0, 3.0, 3.1, 3.2?
Well you can see how much a rabbit hole it can be. Don't sink too deep into it.
Data Structures and Algorithms
Practice applying the data structures and algorithms you have learnt to the questions on LeetCode! Many test cases there test with very big datasets, giving you real life feedback on the run time complexity of your code.
When you are bored with the language you started with, go to Rosetta Code to see how people write the same algorithms in other program languages! Every language comes with its own preferences and philosophies. Pick your favorite, but don't be constrained by it!
CS !== SWE
Involve yourself in a big open source projects! There are many opportunities every year ranging from Mozilla Grants to Google Summer of Code. Every famous open source project is almost always looking for contributors. They have mentors from whom you can learn a lot!
If you are a student, you can participate in hackathons in the Major League Hack. If you are not a student, you can participate in commercial hackathons which you can find at Devpost.
If you are into gamedev, definitely check out the gamejams at itch.io!