DEV Community

Ben Halpern
Ben Halpern

Posted on

What computer science concepts should devs without a CS background prioritize learning?

Oldest comments (64)

Collapse
 
rkichenama profile image
Richard Kichenama

Data Structures and Algorithms.

Data Structures for a basis of how individual parts of data can be modeled and managed in groups.

Algorithms, without doing into a 401 course, would help get into the mindset of seeing problems as a set of repeatable actions to accomplish a goal.

Collapse
 
nezirzahirovic profile image
Nezir Zahirovic

Basic stuff, data types, algorithms.

Collapse
 
antonfrattaroli profile image
Anton Frattaroli

The bits and bytes of storage to know which data types are appropriate to use, avoid overflows, utilize resources efficiently, flags.

Recursion - although recursion usually has sub-optimal examples. I think a good exercise would be to emulate a SQL WHERE clause with objects.

Loops - looping backwards. Not getting stuck in a loop.

Basic array knowledge. They'll probably never use (or realize they're using) a stack, heap, linked list but more will use dictionaries, ordered and unordered collections. Don't bother with sorting algorithms. I don't think trees would be a priority.

Inheritance, encapsulation...

Know just enough to be able to decide how secure you need a crypto class to be for a specific use. Random() usually doesn't cut it.

DB Indexing, maybe, if that's what you're in to.

Collapse
 
schaary profile image
Michael Schaarschmidt
  • Finite State Machines
  • Rewrite Systems and Reduction Systems
  • Lambda Calculus and the basics of Computability theory

and then basic data structures and algorithms

Collapse
 
davidkpiano profile image
David K. 🎹

Glad you mentioned finite state machines. It's something that can make most applications we write (if not all of them) much more robust. Most developers unknowingly write half-baked versions of finite state machines (in the form of if/else if and switch statement spaghetti sprinkled all over the codebase) that are hard to understand cohesively.

Collapse
 
adambrandizzi profile image
Adam Brandizzi

Besides data structures and algorithms, there is some math stuff that is surprising helpful. Calculus is fundamental to model a lot of real problems and to think in terms of velocity and aggregation. Linear algebra is pure computing: once you get to think in terms of matrices, a lot of very, very complex stuff becomes way simpler. Number Theory is fundamental for a lot of disciplines. But the most important math subject IMHO is Probability and Statistics: it permeates everything.

Besides that, the basic of networking and cryptography are very useful as well.

Collapse
 
janpeuker profile image
Jan Peuker

+1. The one thing I do regret most not paying attention to in my CS degree (which might be a good way to think about the question above) was probability and statistics. With ML this is becoming ever more important. Personally, I still don't feel 100% confident about my maths.

Regarding data structures and algorithms: I find most lists out there not really useful as they tend to cover data structures either not really in use anymore (e.g. linked lists) or so frequently used that a CS degree doesn't add detail (e.g. hash tables). The biggest advantage of a university course is that it should teach you concepts and ideas you might one day find useful (e.g. bloom filters) - instead of tools that make you productive right now. As such, I believe graph algorithms, binary search, finite state machines, lambda calculus and yes, complexity analysis, are the most useful ones (all mentioned below) - alongside various Patters which are also mentioned below.

Collapse
 
courier10pt profile image
Bob van Hoove

I guess that very much depends on what you are working on.

For example when I first started working with LINQ in C# I loved it. How on earth did they make that work?? So I watched some channel 9 videos (eg. Bart de Smet on 'Ana, Bind and Cata'). I did a course on functional programming @ edX. It no longer seems like magic to me. Not sure if that makes me a better developer, guess I just don't like to rely on magic :o)

If you write many sql queries (either directly or via an ORM), learn about b-trees and indexing. It will help you understand how to make efficient use of your database.

So to wrap it up, prioritize what's relevant to your part of the puzzle so you can reap the benefits.

Collapse
 
jt_grimes profile image
J.T. Grimes

Big O notation, an understanding of what algorithms are "expensive," and an understanding of what happens with "expensive" algorithms at large scales.

Collapse
 
ben profile image
Ben Halpern

I second Big O notation and this whole idea. I didn't do an entire computer science degree, but I did some, and these concepts are what have stuck with me as considerations that come up a lot.

Collapse
 
georgeoffley profile image
George Offley

Time to write my Big O practical applications essay. Still need to fully understand it though. I read a great book about CS concepts written by someone who didn't have a CS degree. Not an ad but a good book.

bigmachine.io/products/the-imposte...

Thread Thread
 
patriklarsson profile image
Patrik

Ah, someone beat me to it I see :)

I couldn't agree more about this recommendation.

Collapse
 
mattbidewell profile image
Matthew Bidewell

For some reason at my CS degree we hardly touched on Big O. Does anyone have some great resources for gaining a better understanding?

Collapse
 
evanoman profile image
Evan Oman

I know it is expensive and massive but I really think every developer should have a copy of CLRS. It is well organized, well written, and extremely thorough. In fact I was just paging through it today to review a few graph algorithms.

Collapse
 
alrz profile image
Alireza Habibi

layering and that what belongs to where. "how" i.e. algorithms, usually come next.

Collapse
 
liversedge profile image
Mark Liversedge

Agree with all comments about Algorithms and Data structures.
Would then add O/S Internals and Compiler fundamentals.
Then OOP, the UML and Patterns.
Then Agile .. Business Change .. Human Centred Design.

.. then takeover the world ! :)

Collapse
 
high_rigour profile image
Josh Burke

How to structure systems to support concurrency.
We are entering a major shift in industry where concurrency is going to become mandatory. Programming with shared data and interwoven state is going to cause massive loss of time and energy in the future.
The sooner we begin the shift toward a more stateless asynchronous programming methodology the better we will all be.

Collapse
 
ggdupont profile image
gdupont

Apart from the already cited topics, I would add system engineering ;-)
It might appear obsolete in this cloud/container area but it struck so often that software developer have no idea on the hardware powering their applications and thus on the many possible issues that could be fixed easily by taking it into account.

So system design to avoid looking only at the current code at hands and have thoughts on the system level.

Collapse
 
danidee10 profile image
Osaetin Daniel

There are a lot of things to learn, But the most important IMHO should be Data Structures and algorithms.

With some basic knowledge about both, Writing code becomes less about "Let's get this to run / work." and more about "how efficient is this? / could i do this is a more efficient way?"

Naturally the search for efficient ways to do stuff will lead to some other important concepts like concurrency, caching etc

Collapse
 
etresoft profile image
John Daniel

Stand-alone code.

At my current employer, I am one of the few people, if not the only person, with a computer science background. Yet almost everyone is a "coder". Some are writing Stata, some R, some Python, and I've heard rumors of a couple of web and db developers. They know far more math than I do and can Google the rest.

But what what they can't do is write stand-alone, automated code. One of the skills someone with a CS background must learn is how to write code that compiles and runs on someone else's machine. CS students have to submit source code that the professor will compile and run. The "but it works on my machine" refrain doesn't cut it in a CS class. Code has to run and run correctly under someone else's account, on someone else's machine, and maybe with different input data. That is a skill you can only get from a CS class, not Google, and not Coursera.

Collapse
 
josesaldana profile image
Jose SaldaΓ±a

Hi John. Could you please elaborate a bit more on this? A bit more of explanation would be very appreciated. Thanks!

Collapse
 
etresoft profile image
John Daniel

Most of the responses here are technical issues, like Big O notation or lambda calculus. Anyone can figure that stuff out on their own. I am talking about engineering issues that are important when building something. The differences between being a coder and a software engineer are not new. These engineering issues can be learned too, but someone learning on their own might never be aware of their existence to begin with.

I saw this in action at my (now former) employer. They knew about Big O notation, math of all kinds, and git. But they couldn't make a program run the same way twice, or on a different machine. There was no knowledge of UNIX, environments, dynamic loading, databases, information theory, text encoding, testing, validation, chain of reference, etc. Yet, by the only metric that mattered, securing more funding from wealthy donors, they were wildly successful.

I also see this in the Apple Developer forums. To get an app in the App Store, all you have to do is get it to launch once, for about 30 seconds, and maybe change a screen, on an Apple reviewers device. That is a challenge. Those indie developers, whether working alone or with a roomful of people just like them, don't understand the issues necessary to make an app run on someone else's device. They can figure it out eventually of course. But it is much more frustrating than having worked through those issues in a 2nd year data structures course in University.

Thread Thread
 
atanask profile image
Atanas Kostovski

I understand your point, but the question was specific to CS, not Software Engineering as a topic. But I'm sharing your opinion here - CS is not that hard to learn on your own, while I notice that self taught devs lack the Software Engineering skills and practices, and don't even know about the existence of them.

I'd guess it's like that because CS topics are very hot and trending buzz-words that you can easily hear about and google random course/book. But Software engineering topics are a bit more specific, and you have to know about them before searching for materials.

Collapse
 
edunham profile image
E. Dunham

I think that aspiring developers should get comfortable with version control as early as possible in their careers.

Math and abstract computer science topics are often easiest to learn once you find an application for them. However, you can't experiment confidently with any major change to your code until you know the experiment won't destroy all your progress! I'm a fan of Git, but any modern VCS will allow you to time travel through your project's history and undo any change you later regret.

Collapse
 
julesgdl profile image
Jules

I think Theory of Computation would be great to learn, so it would help a lot to understand the foundations of regular languages, automatas and so on. Even though they might not be directly applicable to a solution, will help to understand and think in another approaches to solve a problem.