DEV Community

loading...

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

Collapse
nickfazzpdx profile image
Nicholas Fazzolari

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.

Collapse
eblairmckee profile image
Blair McKee

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.

Collapse
ziddahedem profile image
Ziddah Edem

Where can I get the Command Line Heroes Podcast

Thread Thread
eblairmckee profile image
Collapse
philly profile image
Phillipe

This is possibly the best thing I have ever read on this topic... 👏

Collapse
torianne02 profile image
Victoria Crawford Author

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

Collapse
nickfazzpdx profile image
Nicholas Fazzolari

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.

Collapse
derekenos profile image
derekenos

I highly recommend the book Tools for Thought for an engaging history of computers and interactive computing.