loading...

What Are the Most Important CS Principles to Learn as a New Dev from a Non-Traditional Background?

torianne02 profile image Victoria Fluharty ・1 min read

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.

Spongebob and Patrick giving each other a high-five

Posted on by:

torianne02 profile

Victoria Fluharty

@torianne02

["Software Engineer @ FireHydrant", "Cat Mom", "Ruby Enthusiast", "Forever Learner"]

Discussion

markdown guide
 

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.

 
 

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... 👏

 

I love this question!! I've been doing a lot of thinking lately about how we as an industry can better serve folks that come from non-traditional backgrounds.

How do computers really work?

This is probably the single biggest point to focus on in my opinion. At Georgia Tech we have a class called Computer Organization and Programming, which is probably the most influential class offered here. The class starts with describing (at a high level) how transistors work, then shows how transistors can be combined to create logic gates. Once you have logic gates, you can put them together to create things like registers and do math, as well as create RAM. You can then take those components and assemble them into a CPU. To make the CPU do stuff, you can write machine code, and if you want to write programs more quickly, you can write assembly code. If you want to write programs even faster, you can write C, which becomes assembly, which becomes machine code, which switches transistors on and off in the CPU to actually do things like add numbers together, or surf the Web! Being able to comprehend and internalize these aspects of how computers really work has been key for me to be able to grow as an engineer and as a computer scientist.

Even if you're working way above the guts of the machine, knowing how the underlying internals work will enable you to think like a computer. No matter what kind of code you write, you're still manipulating the bits in the registers and RAM of the machine, and you'll eventually come up against an issue that can only be solved well by knowing the machine intimately.

Layers of abstraction

To understand computing as a concept, you must understand the idea of a layer of abstraction. Our entire field is basically devoted to finding better and neater layers of abstraction; they are the power that gives computing its semblance of magic. One of the things that fascinates me about computing is that it is based on math, which doesn't really have any anchor in the real world. Binary Search Trees? Those don't grow anywhere. And yet this layer of abstraction, this different way of thinking about data and how it's organized, gives us real results in terms of lookup speed. There's no BST inside your computer – the data is still organized in a long row of transistors in memory. But having the BST layer of abstraction suddenly makes finding some of that data faster, even though nothing physically changed about the computer.

As you can tell, I really like talking about CS fundamentals! I think we as a community should try to find better and more accessible ways to educate everyone about these concepts. Hopefully discussions like these can inspire more folks to explore these fundamentals and take away some of the fear and apprehension that often surrounds these topics!

 

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

 

Is there any books you would recommend?

 

Hey Brian! I'm not a huge book learner, and a lot of what I've learned I've gotten from classes I've taken at Tech. This is the syllabus for CS 2110 (Computer Organization and Programming), the class that started my love for all things systems/fundamentals. I'd recommend finding resources that cover the topics in this syllabus. There are two textbooks mentioned, both of which I used intermittently while taking the class, but which contain most of the concepts.

Once you've looked at that, I'd recommend taking a look at the concepts covered in the next systems class at GT, CS 2200. The class site has a link to the textbook, which I'd definitely recommend. This class is basically a deeper dive into topics introduced by 2110, including more stuff on processor architecture, basic OS design concepts, and networking.

That seems like a lot, and you definitely don't need to become an expert in any of these areas or even cover all of them. Since my main experience with a lot of this stuff is in college, these are some of the best resources I have to recommend. If you want to actually take free college CS classes, I believe that Harvard and MIT offer several of their core CS classes online for free. Focus on things like architecture, operating systems, and networking.

Finally, my own personal goal is to be creating more accessible resources for folks to learn these concepts online, without the college classes. I'm doing a lot of thinking about how to best do this, so keep an eye out for more stuff that I might potentially make!

 

The program we used to learn logic gates was called Logisim and is freely available. There was one TA who pretty much made the class worthwhile when I took it. He knew the content leagues better than the professor who wrote the textbook, created all of the exercises and projects himself, and overall was a super awesome human being. I was struggling hard with depression when I took the first class, and would have majorly failed if that TA didn't help motivate me through it.

 
 

Hi Rasak! Thanks for asking, but unfortunately I'm pretty busy these days with wrapping up school. Check out the resources I linked above for some direction on how/where to learn. Good luck! 😁

Thank you Jahziel for reaching out.
Would appreciate if I can get links to some of those topics rather that toiling the wilds.

Sure! This is a comment I left on this thread with a couple of links to get you started. They take you to course descriptions of classes that were particularly influential for me.

 

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.

 

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.

 

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.

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

 

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!

 

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!)

 

I started reading Code: The Hidden Language of Computer Hardware and Software1 last week after numerous tweeters raved about it in a thread. I've been in the industry for ~20 yrs. and this book is targeted at total laypeople, but so far I've found it really enlightening.


  1. microsoftpressstore.com/store/code... 

 

One tiny practice to try is: whenever you're looking at code and you see a loop — ask yourself about its complexity in terms of Big O notation. This comes up all the time in interviews, and having an intuitive understanding of complexity (time and space!) helps you write more performant code.

 

I created this to document the book, concepts and videos I recommend to every professional programmer. peterwhelan.com/petesprofessionalp...

 

Engineering mindset is much more important than any concept here mentioned.
Can you accept it if you dont have technical background, posible, but are you going to depends on many factors...
All true engineers have accepted engineering mindset that you learn only by truly studying in technical field on neverending quest for knowledge (you need to be somewhat masohistic).
But to do Software development and programing one doesnt need to have these skills. Question is do you want to be Software Engineer or Developer and is cherry picking from the CS Concepts Tree gooing to do you any favors?

btw
Saying math is not important in programing gets you developers that don't know what modulo is...

 

What is hard.

Knowing the hard problems in Donald Knuth's The Art of Programming means that you won't try and solve one of the PhD disertation level questions in your project that is due in three weeks, but rather you will spend a day redesigning it so you don't need to solve a super hard problem.

 

"No."

Hehehe it's good to learned

Also, community college.