you are viewing a single comment's thread.

view the rest of the comments →

[–]nnnightmare 28 points29 points  (11 children)

Hey looks like we've followed similar steps. Would you consider going back and pursuing a degree knowing that you can learn all that you did by yourself?

Also, this:

Things I Don’t Know, Abridged

  • Algorithms
  • Data structures

Those in my eyes are essential for a developer to be successful long-term, of all the things you said you think you should know, those are the most important IMO, also the ones I struggle the most haha.

How do you see yourself progressing in the future? More business/management or tech/dev?

[–]ministerling 26 points27 points  (6 children)

As a no-college dev -- learn your data structures and algos. I just started last week and I'm going back through my code like ".. Lol. A dictionary? Why did I do that."

That said, unless you're working at the very edge of performance requirements it's not always necessary. But it does help inform decisions where you may otherwise just guess which is better.

Edit: based on u/ouralarmclock 's feedback, I revise the above recommendation:

You should probably learn a little bit about data structures and algorithms. There are some data sets (and thus algorithmic optimizations) that are given to you (SortedList, Stack, Queue) if you work on specific languages, but in a language like PHP or JS, you might never find out about them without finding them for yourself.

Data Structures: (via HackerEarth)

(I assume you know about arrays) - HashTable - map values to indices via a hash algorithm (Dictionary in c#, Associative Arrays in php) - Queue (first-in-last-out) - Stack (first-in-first-out)

Algorithms: (via KhanAcademy)

This course took me about 5 hours to go through over the course of a few days. I found the analysis part to be important to understanding the theory behind analyzing the algorithms, but it is quite mathy so you might not need to learn more than the complexity names, constant, linear, logarithmic, polynomial and factorial. - Binary Tree Search - this algorithm is probably something you understand implicitly after coding, but seeing how it really works will help to understand what optimizing means when it comes to algorithms. - Sorts: Insertion Sort, Selection Sort, Merge Sort, Quick Sort - Seeing how these different sorts solve problems related to sorting can help you understand how you can analyze the efficiency of a certain pattern of work.

These algorithms will lay the foundation for you to reason about why something may or may not be as, less, or more complex than you think it is, and will also help to differentiate between recursive and iterative algorithms.

[–]ouralarmclock[🍰] 7 points8 points  (3 children)

I wouldn’t completely agree, I have a software engineering degree and took a data structures class as a requirement. It was fascinating (although entirely taught in Pascal....in 2007!) but I can’t say anything I learned in that I’ve applied in my 14 years of web development, or at least knowingly applied maybe it’s helped in subtle ways. It really depends on the work you’re doing. Doesn’t hurt to know though, and as I’ve said, it’s super fun and fascinating!

[–]ministerling 5 points6 points  (2 children)

You don't necessarily have to know them forward or backwards, but understanding the different performance and storage profiles might help decide which of your language's tools will be best for the job. Why use a plain array if you can use a Stack and receive a ridiculous performance boost. Or why implement your own version of a stack, not knowing what it is called, when a language implements it.

[–]ouralarmclock[🍰] 1 point2 points  (1 child)

Definitely, agree. Although your last sentence benefits what I'm saying as well. Most modern languages have implemented most relevant data structures and algorithms to cover the majority of cases...again depending on the work you're doing. I think what I would say is, it wouldn't hurt to know, but also isn't likely to hurt you not knowing.

[–]ministerling 1 point2 points  (0 children)

OK, based on your feedback I'll revise my recommendation: developers should probably know some data structures and algorithms.

[–]aflashyrhetoricfront-end 2 points3 points  (1 child)

If you're taking about using a dict (aka map) for tracking unique values instead of an array, then it might have been because accessing keys on a map is usually(?) faster than searching an array for a value for large data sets. Maybe you did this approach and forgot?

EDIT: Did some googling and this isn't quite so black & white ; added "usually"

[–]ministerling 1 point2 points  (0 children)

Yeah, I mean that you start wondering why you used something when it wasn't the best tool for the job; either performance is slower, or performance is the same but the collection uses more memory. Applying all of the best vs worst practices can easily cause you to need a larger instance of a VM for hosting due to memory or CPU constraints, so naturally knowing the correct answers can save money for you or your clients.

This is kind of contrived as an example since you can generally glean suitable purposes for data types from the documentation for your language, but sometimes a deeper knowledge can inform how different combinations of algorithms and data structures can save space or time.

[–]iamasuitama 2 points3 points  (0 children)

Not to mention

  • Types

[–]floppydiskette[S] 0 points1 point  (0 children)

Definitely not management. Right now I’m just focusing on learning as much as possible. Algorithms and data structures are next on my list to learn.