Ask HN: Self-taught webdev with lots of free time. What should I learn?

212 points by thatcodingdude ↗ HN
Hey HN,

I'm a self-taught webdev with 10 years xp. I have lots of free time right now with a bit less freelance projects coming in, and I'm getting a bit bored of building web CRUDs and feel like I'm not learning much anymore.

I'm thinking it'd be better to specialize more, but I'm unsure which direction to go. I'm actually selling myself as a full-stack web developer, knowing JS/react/vueJS, PHP/Laravel, bit of design, server management etc.

If possible I'd like a job that can be fully remote or at most 1 day on site, which probably excludes security and high level stuff.

I have lots of time to learn so I'm open to any advice even if it's just to git gud and read SICP.

tl;dr webdev having done every type of CRUD under the sun - what do now

Thanks for your input !

325 comments

[ 1.8 ms ] story [ 244 ms ] thread
I found that learning and writing some Clojure and Go made me think better about the code I was writing in my main language (python).

I enjoyed working through Clojure for the brave and true: https://www.braveclojure.com/clojure-for-the-brave-and-true/

and the go tour is probably the best introduction I've ever had to a language: https://tour.golang.org/welcome/1

I came here to suggest these two languages, too. On the other hand, you could focus on building something non-web. A language, a video game, etc.
That's a good idea. It'd probably be great for me to start a non web-app side-project.
Because the syntax alone is already so different it was a great way for me to "re-learn" programming. Even for the very short while I played with it, it really thought me to look further than the default go-to patterns I used to use.
This is my recommendation as well, although since you mentioned it, I would throw in SICP as well,

You can work through SICP to help learn Clojure/LISP at the fundamentals level, and then expand out to more practical use cases with the recommendations above.

I can imagine the impact Clojure had; learning about Lisp had a big impact on my programming journey.

What was it about Go that made your Python code better, though?

Go helped me learn about designing good interfaces, and how to write tests using dependency injection rather than just patching stuff out.
I quit webdev after 3 years and I'm now trying more and more thing in the gaming world. Mostly cpp and opengl. Emscripten(was) and WebGL are very nice to make shiny doodles. So maybe try one of those. Or make simple art with css.
Were you able to get a job or freelance gigs in the gaming field ?
I'm still studying Computing science right now and will start with a master in Game Technology next year. But it is really hard to get a job or do freelance work in the gaming field so no not yet but hopefully soon TM.
Project Euler is also always nice to learn more things about math.
You could learn python/machine learning.

https://www.coursera.org/learn/machine-learning

There are a bunch of guides like the coursera course I mentioned and on youtube there is the official tensorflow channel also!

https://www.youtube.com/channel/UC0rqucBdTuFTjJiefW5t-IQ

I also highly recommend ML, not for the experience (though it may certainly come in useful) but because it's surprisingly entertaining.

Last year I had a lot of fun playing with GPT-2 on Google Colab (you can run it yourself on a decent GPU tho). My friend and I were trying to generate the funniest possible output to make each other laugh -- as an aside, this might be the only category where GPT-2 beats GPT-3 hands down :)

Python is also a joy in its own right. xkcd said about Python "programming is fun again!" and that has certainly been my experience.

I second this. With Webdev + Machine Learning skills, you could build interesting products.

I give you an example from my life. I build PredictSalary (https://predictsalary.com), a browser extension to predict salary range from job opportunities which don't disclose salary range.

A browser extension is basically a bunch of JS files injected to web pages. If you know webdev (frontend), you are set to build a browser extension. All you need to learn are machine learning and deep learning. You don't need to dive deep (unless you want to). In my case, basically I just use basic regression to predict salary range.

If you're not already well-versed: get familiar with Google Analytics, Google Tag Manager, Funnels, a/b Testing etc. It's cool to know other tools as well, but privacy concerns or not, GA + GTM are the default. They're largely underused, but my experience is that clients love it when you can set it up for them, especially in combination with Adsense/Adwords to optimize their campaigns.
Soft skills.
Under the broad heading of soft skills you could learn how to spell and become a better writer. Most technical people aren't good communicators so taking a course in composition and storytelling would put you in better standing compared to most.
(comment deleted)
That's always a good answer, but I'm not sure how one would go about 'learning' soft skills. Perhaps simply focusing on them is enough to improve.
Besides all kind of data science/machine learning, what about learning the "greybeard" mastering of Unix servers? This will connect a lot of old-grown idioms (think about daemons, classical TCP services, etc.) and get you a lot of knowledge in networking (which has connections to event-based networking and thus asyncio, greenlets and all that).
That's probably the most interesting part of my job ! Making some small scripts, managing the build step, servers etc.

Although I'm not sure you can get this kind of job as a self-taught dev with no degree/certifications.

Absolutely you can. Just build up some real experience. Some certifications help as well. Just be careful the ones you spend time and money on.
I’m also a mostly self-taught freelance webdev, and recently I’ve been learning about Rust which I’ve found to be very interesting.
What kind of projects are you taking on with Rust ?
not op, but there was a post today about how to build single page apps using Rust on the front page: http://www.sheshbabu.com/posts/rust-wasm-yew-single-page-app...
I read that one too with great interest. I’m still only learning and reading, though. I’m hoping someday I’ll be able to use Rust in some professional capacity, but for now it’s just to have fun and play with something new.
Same here. I started going through the excellent guide a few weeks ago.
(comment deleted)
I'd expand on one of your best skills you already have. The "stack" gets more and more complicated so "full stack" will stop to be a thing in the future.

If you are already good in react, learn more libraries / frameworks in that ecosystem and increase your day rate. You are a frontend architect now.

I'd start with things like nextjs, Gatsby or Redux saga.

You could also go into the devops side of Frontend. Learn the different approaches of deploying / scaling a Frontend with server-side rendering (vercel, digital Ocean, docker...)

Build / Deploy / Scaling is the most interesting part of my job right now, so it makes sense to focus on this part. Thanks !
Any specific resources you recommend for learning react, gatsby, devops and stuff
If you haven’t done any functional programming I can recommend this course:

https://www.coursera.org/learn/progfun1

The techniques you learn there will transfer to javascript and make you a better web developer.

Great time to read some books if you haven't already.

- Mythical Man-Month

- Design Patterns

- Code Complete

Get into security, specifically web app security pentesting.

You'll thank me later.

This and the servers/linux stuff is the most interesting part of my job. I do have my doubts about being able to get into it since I suppose you really have to master low level dev (which I don't) and I don't think I can get a job as self-taught in this field.
Why not try it out by start messing around with it and get a feel for it? But to answer your question: no, you don't. You already have more than enough prerequisites for an easier transition.

https://pentesterlab.com

https://portswigger.net/web-security

Have fun!

Edit: I'm completely self-taught and I've been working in the field for a few years. No dev or even IT background prior to getting into network pentesting and web app pentesting.

Neat, thanks for the advice. Pentesting got a spot on mr. learning list's wild ride.
If you like devops and security, have a look at SRE (Site Reliability Engineering) positions. Companies look for software engineers to fill these positions. And you'll work on security related stuff. Not necessarily pen-testing per se, but network security, operational security, etc.

Also, teams with SRE expertise most likely use modern tech because SRE itself is a rather new way of managing infrastructure. So you'll probably be able to get your hands dirty with lots of cool tech.

Nice, thought you needed sysadmin background for SRE. I'll look into that, thanks.
> I don't think I can get a job as self-taught in this field.

Good security firms are the last ones to gatekeep over a degree or other paper.

Curious - why do you suggest this field?
I'm looking to go into this field too and would also like to hear why
It's a rapidly growing field that has more jobs than people. Meaning, at this point if you have a solid dev background and strong practical skills in security you're most likely going to make bank.

While anecdoctally speaking, I know people who switched from senior dev positions at two of the FAANG companies to smaller security companies and basically doubled their income and making north of $500k/year.

Any way to contact you for learning/career advice ?
What I can share is my roadmap how I manage to break into the field without any prior professional IT experience.

1) Linux. Learn it and live in it.

2) Linux servers and databases.

3) CompTIA Network+ (only for the knowledge, didn't bother getting the cert)

4) CompTIA Security+ (same as above)

5) OSCP certification (not a golden ticken by any means but it helps to bypass HR)

That's basically it. While going down that road I focused on hands-on practice by actually hacking into machines with the help of following resources:

A) Hack The box (hackthebox.eu)

B) PentesterLab (pentesterlab.com)

I also really like Portswigger's Web Security Academy (portswigger.net) and Try Hack Me (tryhackme.com) but they weren't around when I was starting out but I would definitely check them out, especially if I was completely new to security today.

All in all it took me roughly a year but get comfortable enough to start applying to junior pentesting positions and eventually I got hired.

There are probably better and easier ways to do it but that's how I did it at least.

Not OP but did you got a remote position after learning and practising all this because I'm interested in only remote positions.
I did not get a remote position. I eventually left the company though and started do consulting instead so I'm mostly working remote (and 100% at this point due to covid).
Hey thanks for this! I'm a senior dev and I just left my job. I'm going to be learning and studying full time but hopefully it doesn't take an entire year before I can get a job
Why not mentor?
I second that idea. You can learn a lot about your field from trying to make people understand it.
Yes. And do some teaching. Short course?
Learn C. Then maybe one of the newer systems languages like rust, zig, D, nim, etc. If you’re bored with CRUD, there’s a whole other (bigger) world to explore when you get a little closer to the metal. It’s tremendously empowering and fun as hell to get you’re hands dirty a bit, so to speak. You’ll also become a better and more employable programmer as a nice side effect.
C or C++ ? Thought about it, at the very least it would make me a bit more well-rounded.
C is probably better, less abstractions.
You should learn C. Life is too short to struggle with C++ now that we have better alternatives such as Rust.

You can also ignore the people who ignore the complexity of web apps. Classic C programs are very often much simpler than full web apps IMHO.

C it is then. Thanks for your input.
Happy you chose to learn C. That's exactly what I would recommend.

If you are so inclined, I'd look into how to write your own home-grown version of Objective-C—given that valid C is valid Objective-C.

Because then you would learn Smalltalk and the whole ladder of it all! Smalltalk is far and away one of the greatest joys on programming. :) http://objective.st

The "Gang of Four" explains the patterns in Smalltalk and in terms of entrepreneurship—Patrick Collison's first startup was written in Smalltalk and I think early introduction to it leads to the clean design and success you see coming from Stripe.

Building a language would certainly be a crowning achievement. Thanks !
You might find it interesting to write some native macOS or Windows software (ie using the native GUI library). If you've mostly focused on web software you might find the different strengths and constraints of truly native code inspiring.
Modern C++ is fairly easy to learn. At-least easier than either Rust or C.
I personally don't think this is true. I worked a lot with C++ before and I'm still confused by the syntax and logic behind some concepts like (just randomly selecting some links from the dynamic memory group).

https://en.cppreference.com/w/cpp/types/remove_extent https://en.cppreference.com/w/cpp/memory/shared_ptr https://en.cppreference.com/w/cpp/memory/polymorphic_allocat...

I think the basics that are similar to other languages (data types, basic pointers, basic references, classes and OOP) are indeed easy to learn as they are basically the same in most programming languages, but the more specific memory management and weird syntax around some standard libraries make it harder to learn, use and read. Let's be hoest, correct C++ code usually looks ugly and verbose.

shared_ptr is fairly understandable at-least from an application developers usage point of view.

std::remove_extent is only used for template metaprogramming and generally in linear algebra libraries. polymorphic_allocator is an expert facility.

Apart from shared_ptr, the other two are for very specialised purposes - 99.9999% of all C++ code ever written will never have them. But if you need them, you can leverage them.

I came from high level languages (JS/Java) and I found modern C++ pretty good - wow I can code native!. I found writing in plain C very difficult and laborious. I found Rust conceptually far more difficult than C++. Also you can't take your traditional data structures and write them in Rust. You have to do it the special Rust way, which makes it a plain when you are just trying to follow the code/pseudocode in a paper.

Admittedly, the Rust compiler catches pretty much everything you do wrong. But I code C++ with all warnings treated as errors along with static code analysers and they catch all my mistakes too.

I've written 5-line C++ programs which have stumped experts for hours. There's a trilogy of books about all its edge cases and best practices for working around them... C++ still has a place, but not as a beginning systems language.
I hope we never judge how easy is it to learn and use a programming language by obfuscated code contests. All languages will fail by that measure in their lifetime as they accumulate cruft.
This wasn't obfuscated code. This was a MWE, where I was trying to understand why it wasn't working as expected.
This language is so extensive and seemingly has so many dialects that I find it really hard to make sure that what I'm learning is modern C++.

Can you recommend any literature?

zig is a fantastic alternative to C. The community is mostly C programmers who are sick and tired of undefined behaviour and #includes in C, but if you let them know you're a webdev looking to learn zig as a first low-level language I think you will find a relatively welcoming community.

Undefined Behaviour: Stuff like this - https://twitter.com/jfbastien/status/1280709082626666498

Second this. I used C for the first few exercises of the 2019 Advent of Code and it was SUPER fun. Granted, things that could been a single line of Ruby or Crystal took a few hours for me to cobble together in C, but my level and depth of understanding went WAY up. Totally worthwhile.
Entrepreneurship? Getting more technical has a diminishing ROI after 10 years.

Or something completely orthogonal to computing. Something you enjoy. For fun.

> Entrepreneurship? Getting more technical has a diminishing ROI after 10 years.

Does anyone do anything just for the hell of it anymore, or is it all driven by money?

I'm driven by money because everything is getting more and more expensive :)
Well money is a requirement to live, and if you can do what you enjoy and get paid the money you need to live doing it, what's the problem?
I disagree on this. A senior developer in any language will make far more, 2x-3x, what a junior developer will make.
There is a hard plateau on how much you can make as an employee though. If you can build something and own the business, it's unlimited.
There’s also a floor when you’re an employee. The floor for an entrepreneur is $0.
Yes, you should have some sort of income, hence I'd recommend working for others until your own business makes enough to support you.
I'm not sure if this scratches an itch for you, but I would learn more about business via the route of launching a small side-hustle. By having skin in the game, you'll learn a lot about product trade-offs, marketing, selling, etc.

In the best case, you get a profitable side hustle going for yourself (and increase your financial independence). Worst case, you go to your next programming job with a ton of extra skills and insights that have excellent commercial value in the workplace.

I recorded a few videos showing the big picture of my first side hustle (code + marketing) and these might make it concrete and real for you: https://www.semicolonandsons.com/episode/Bird's-Eye-View-of-...

I'm a self-taught webdev too and I would strongly recommend learning SQL, not just `SELECT * ...` but really learning it!

I've been digging into postgreSQL and in quite a few applications it's possible to greatly reduce the complexity of the backend by receiving exactly the data you need from the DB. It is so much so that in cases you can even "get rid" of the backend completely (yes, no writing controllers and endpoint, etc.) by using a tool like postgREST (postgres to REST) or Hasura (postgres to graphQL)

Best of luck on your search!

Any specific resources to recommend?
My favorite has been https://pgexercises.com/. Instead of going through theory, you practice writing progressively more complex queries to achieve a specific result.
The postgresql documentation is actually a pretty good start (and finish!).

I like learning by doing something so I took an old side project and I'm making it on PostgreSQL with PostgREST in front of it. It is crazy all the things that the DB can do! Triggers after an actions happens, virtual columns, JWT Tokens, Unit Testing...

I've only used it as a reference, but the art of postgresql is pretty solid. In general any webdev who isn't skilled at SQL is missing out on an easy way to level up. SQL is crazy powerful, versatile, and scalable, and takes a small amount of time to gain proficiency, and stays with you. I methodically read one 350 page book in 2012 and still feel I understand SQL better than most I come across. That's kind of silly. I recommend learning enough to understand the gist of aggregates and window functions. Once you understand what they can do, you can easily reference the syntax when needed.

[1]: https://theartofpostgresql.com

I would recommend SQL and Relational Theory by CJ Date.

It completely changed how I use SQL. Before reading it, I had about a decade of experience with SQL. I didn't really understand the theory underneath. I also didn't understand how to write SQL in a way that adheres to the theory.

You can think of this book as being the closest we have to "SQL: The Good Parts".

Another option is to learn Graph Databases. I notice there's still a big shortage in people with Graph DB experience, and they're not that hard to learn. Try Neo4J, for example.
As a self taught developer I also found Neo4j's query language (Cypher) to be way easier to read than sql. Especially for building complex relationships between data which I find to be kinda a pain in sql. Also the web interface for viewing your database is really easy to use. Although I should say I've switched to using more sql databases over the past year or two because there are way more hosting solutions that support them out of the box.
Exactly. SQL is great for data that's mostly tabular, but despite their name, relational databases are not great at dealing with relations. We had some queries that required 10 joins. The same query in Cypher is trivial.

But yes, hosting solutions are terrible at supporting graph databases. Some do have a thin Graph DB layer (often using Gremlin as QL) over a Mongo-like database, but it's not the same thing.

postgREST the worst thing ever. Just use the DB to store things, thank you.
I don't see what's so bad. Seems like it would be a convenient way to skip some boiler plate back end code used for CRUD. Probably not optimal for a complex application, but it looks very neat for something quick and small.
If you're learning backend services, don't start by things like postgREST, it's just bad habbit, would be better to start by the basis with API servers / DB ect ...
As a seasoned TypeScript backend/fullstack developer I don't understand

- why is it such a bad tool, and if it is because of the tool and not the concept, it seems possible it will be fixed in the future

- why is it a bad habit; I consider the boilerplate CRUD code I write to be a bad habit that I should've automated years ago, and that's exactly what PostgREST does

- why can't you learn the basics of API services and databases with PostgREST

It's a bad habit because of separation of concerns.
You're not forced to write your app code in the DB as SQL procedures, you can also write TS or whatever else and use it next to PostgREST.
Check this thread[1] for a previous discussion about "separation of concerns" and PostgREST.

tl;dr: business logic can be done with views/sps on an isolated schema. More layers makes the overall OLTP system less performant and harder to scale.

[1]: https://news.ycombinator.com/item?id=21438307

Great suggestion on learning SQL. Also, learn how to normalize, at least to 3rd normal form. Clean data, enforced in the DB with constraints, makes debugging easier.

Consider getting a used Jeep in stock form, and get the shop manual. Methodically go through all of the maintenance items. Then start some easy mods, like a block heater. Good life skills.

Also learn to denormalize. Because performance matters.
I thought knowledge of sql and RDBMS's was table stakes for a Web developer job? Same with html, CSS and js.

However the more I work remotely the more I find that not to be the case.

That is not always a great idea. There is a reason APIs exist, and backend service layers exist on top of databases. It is a larger abstraction of the interface design pattern.

It only makes sense if you're absolutely sure you'll never need to extend or change the interaction between front-end and back-end.

Think just about schema migrations on the database. If you change your schema, you have to change your front-end. Maybe that's okay for the time, but that can get out of hand pretty quickly.

On the other hand, with a service layer, you could completely decouple that dependency on the front-end, by providing the front-end an interface (the service layer / API). The migrations on the database layer don't affect the front-end whatsoever, because the front-end communicates with the interface. You can change the underlying implementation without changing the front-end's interaction with the interface.

http://best-practice-software-engineering.ifs.tuwien.ac.at/p...

Don't forget that the database is not only tables. Abstraction can be done at the SQL level with views.

With views you can maintain backwards compatibility despite migrations happening. No need to change your front-end.

Check this section of the PostgREST docs for more details:

http://postgrest.org/en/v7.0.0/schema_structure.html#schema-...

Yeah, views can definitely fit certain use cases. I've just never encountered cases where I eventually don't need to /do something else/ in between those two layers. Granted I'm doing a lot of systems integration on a lot of complex legacy infrastructure, so that might just be me!
How about getting back to the basics? You know, taking some maths classes, CS fundamentals, algorithms, data structures, that kind of stuff. It is timeless, and if you are self-taught, I can guarantee you that you have massive holes in your knowledge.

Also, might sound off topic, but learning a new language (not programming, human) could be an amazing step forward, in ways you cannot even imagine now.

Yeah, found out about https://teachyourselfcs.com/ which seems decent enough, it's about time to learn this stuff.
As a self-taught dev, this was a very helpful curriculum. I will say that it can be a little hard to stay motivated on some of these things if you have little chance to apply them, but at least skimming the various topics and understanding the terminology / primitives of each area is a big benefit. For example, understanding what processes and virtual file systems are is helpful even if you're not implementing page tables or whatever.
Re: human languages

I recently discovered that it is possible to learn Latin by listening to it. I struggle getting through written material so I had given up on my dream of learning Latin, until I found out there's audiobooks [0] and even YouTube channels where people speak it! [1]

[0]: Lingua Latina per se illustrata by Hans Ørberg, also available in audio -- this one's entirely in Latin, yet I could understand the first few chapters very well just from knowing English and some Spanish

[1]: Luke Ranieri on YouTube https://youtu.be/j7hd799IznU

He also has Skype lessons and conversations, super cool!

My observation about most of the new spoken Latin courses and lessons is that they're teaching Vulgar Latin or something akin to early medieval Latin.

That's cool, and very interesting. As you alluded to, you're basically learning proto-Romance.

However, as you likely know, people should not expect to be able to read classical Latin based on that knowledge. They should be able to read many medieval Latin works (including many notable scientific works!), but forget Cicero, Ovid, or Tacitus. Those will require significant additional study.

Luke Ranieri has some of the best advice on learning Latin. But note, even though Lingua Latina Per Se Illustrata is one of the best Latin books available, he doesn't recommend starting with that. It's more effective to first learn your noun, accusative, dative, genitive, and ablative cases, plus verb tenses and moods, by brute memorisation. Then move on to the Ørberg readers: http://wcdrutgers.net/Latin.htm
> and if you are self-taught, I can guarantee you that you have massive holes in your knowledge

Just curious, why is being self taught a guarantee for having massive holes ? Can you give some likely examples ?

Not OP, but I think there are two main reasons for this. Firstly if you are a professional you probably only had time to teach yourself what you needed for the job at hand. This is a great skill in and of itself but by definition it favors practice over theory. Secondly, if you're self-taught that means you didn't have a mentor and likely you don't know what you don't know. It's impossible to study topics you've never heard of, or whose connection to your field you're unaware of.
As a self taught person this lines up with my experiences and it depresses me that I 'missed out'. But I try to make up for it by continuing to learn, I'm just now really getting into Information Theory though and can't help but think how this intuitive understanding would have helped me twenty years ago.
> It's impossible to study topics you've never heard of

If only there was some way for people to communicate these linked topics in some sort of portable written format!

I think that in general you CAN learn and skip those holes if you have someone to guide you that already knows the subject well.

But as a person who may be really new to the subject of development and computer science I think it's obvious that without a lot of research and prep ahead of time you might start with a book or topic and keep moving forward, but you may not be exposed to all of the same things (some probably really useful, some are likely bullshit) that you'd get in a more structured learning environment.

Because when you learn alone you don't know what to learn. You usually only learn what you need now.

I would not say "massive holes", as that would somewhat imply that this knowledge would be actually required, even though it's usually the optional, nice-to-have knowledge that you are getting from an actual CS degree.

You can still create whatever you imagine even if you are self-taught, but going through university would make it a lot more likely that you understand better the tools that you are using (algorithms, microprocessors, logic gates, electricity, quantum effects, etc.) so you will better know how to use them and what their limitations are.

I don’t know if it’s guaranteed, but here’s my perspective (as someone with 2 BScs and an MSc, who also self teaches a ton of stuff):

My personal drive for self-teaching generally stems from either a specific problem I’m trying to solve on a project or a desire to dig deep into something “cool” I’ve come across.

In the first case, I’m tugging on the strings that seem most likely to get me to the solution to the problem I’m trying to solve. There’s a bit of backtracking here and there as I choose dead end paths, but it’s usually a depth first traversal. I’m not trying to learn all of a field, I’m just looking at what I need to know to move past the hurdle I’ve encountered.

In the second case, the goal is different but the process is pretty similar. When I’m learning for fun there is usually a bit more breadth, since I’m not trying to solve a specific problem in the immediate future, but I’m also probably not building a robust implementation of anything. I’ll usually end up with a decent surface level understanding of a topic; this is useful in that, if I encounter a related problem in my work, I’ve got at least the concept in my mental toolbox already and can do a deep dive more easily.

Over time I’ve built up a pretty wide and deep understanding of a lot of things as I’ve built them, but I am also fully aware there a ton of gaps (and have a big topic list that I occasionally visit during a slow period).

You had me at 'a depth first traversal'.
Well said. I can relate to this as self taught. I don’t work in the SE field though so I feel no need to learn the silly whiteboard interview puzzles. It’s never been a hindrance to making my ideas come to life.
Heh, the closest I've come to "silly whiteboard interview puzzles" was back in undergrad competing in the ACM Programming Competition stuff. Our team made it to regionals a few times, but we never really took it all that seriously.
Everyone has massive holes in their knowledge, but holes which formal education tries to address tend to stand out more.
My best guesses for likely examples:

- Pointers and understanding how operating systems address/access memory at a low level.

- Hashing (This one may seem a little insulting but I have seen otherwise good developers confuse hashing with encrypting and it seems like an easy mistake to make if you haven't worked specifically with either concept)

- Binary math, logic, and encoding.

- The OSI model.

- Parallel programming, the program counter, and how operating systems execute/switch programs.

I would not count these as "massive" holes and it is also likely that these concepts would be discovered by a self-taught developer especially if she has looked for material from college-level CS courses.

None of this stuff is necessary to make great software but having this knowledge can help make other things easier to learn or understand. It's like the difference between knowing how to use common git commands and understanding how trees of objects are used to form a chain of commits.

For anyone not aware, Ben Eater on YouTube does a really good job explaining a lot of these topics
I'm a bit biased since I run a Kubernetes training platform, but even basic Kubernetes knowledge will allow you to deploy all sorts of architectures with a few YAML files without having to patch several external services together
I read this book. https://www.amazon.com/Designing-Data-Intensive-Applications...

And it was really enlightening. I would heavily recommend it. It starts off by teaching different types of implementations of different parts of DBMS. Then goes on to teaching about how distributed systems deal with various problems.

It's actually recommended in the teach yourself cs curriculum, so I'll get around to reading it !
i'm a mobile application developer aspiring to learn backend. will this be a good read for me if i have negligible experience on server side of things?
Not really in my opinion, the book is really about the data aspect. Probably your best bet is to just pick your favourite programming language and build something in it.

The book is great but not what you seem to be looking for.

i'm not looking to learn backend through this book, I find the content of the book interesting and just wanted to know if my inexperience with server-side hamper my ability to grasp the content of the book.
You would definitely benefit from doing general backend side projects and reading before reading this book. I don't think you'll have enough context for it otherwise.

However, the book is definitely relevant to mobile applications. The backends for all the most popular apps are built with systems described in it.

Just my two cents: I'm a front-end dev, and I found this book to connect with me a lot more once I also learned some backend.

Earlier this year, I read a few chapters of the book, and it was really abstract to me, so I stopped reading it.

On a whim, I had two developers teach me SQL and relational database theory. I spent a few weeks creating a few databases and connecting them to the front end to mimic real life application, before picking up the book again and the book made way more sense.

Update your skills, php is hard to market, learn python or rails, that would have high roi
PHP is used a lot in France where I'm based, so that probably differs a bit from the US market.
However, the market will eventually change and it's better to be prepared. Plus with PHP being the mainstream I wouldn't be surprised if you could make better $$$ by going after the (still) relatively niche technologies.
Starting an independent project or two in an area you haven't played in before might be both fun and useful. I have a somewhat long list of ideas I don't have the time to do if you're looking for inspiration -- feel free to email me if you want 'em (soham at soh dot am).
How is your knowledge of regular expressions?

Spending a few days to learn them well² is really worth it.

--

² it's also worthwhile to know how they are working under the hood if you want to write high-performance regular expressions

^^^^ I'm not a dev, but regex is so much better when you understand what it's doing (I'm not claiming that knowledge in full!)

The Book: http://regex.info/book.html

I bought an older edition for a lower price, got through 7 or 8 chapters, and never touched it again- and I STILL gained huge amounts of knowledge and am much better at regex than I ever thought I'd be.

Highly recommended!

Honest question, why would you read a book about Regex? I personally find it a lot easier to learn how it works just by going to sites like https://regex101.com/ and trying things out while reading their docs.
Because it was highly recommended to me by a sysadmin I respected who was extremely proficient with regex. Sure, there are sites too, but after reading the book, the sites weren't really needed. I personally got more value from the book. It's subjective, of course.
I love them and went through https://regexcrossword.com/ for fun, they're great tools.

I have no idea how they work under the hood though !

Knowing how they work under the hood will help you to write better expressions that perform well and don't waste performance.