Ask HN: Self-taught webdev with lots of free time. What should I learn?
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 ] threadI 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
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.
What was it about Go that made your Python code better, though?
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
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 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.
And
https://247reading.group
Although I'm not sure you can get this kind of job as a self-taught dev with no degree/certifications.
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...)
https://www.coursera.org/learn/progfun1
The techniques you learn there will transfer to javascript and make you a better web developer.
- Mythical Man-Month
- Design Patterns
- Code Complete
You'll thank me later.
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.
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.
Good security firms are the last ones to gatekeep over a degree or other paper.
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.
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.
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.
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.
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.
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.
Can you recommend any literature?
Undefined Behaviour: Stuff like this - https://twitter.com/jfbastien/status/1280709082626666498
Or something completely orthogonal to computing. Something you enjoy. For fun.
Does anyone do anything just for the hell of it anymore, or is it all driven by money?
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'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!
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...
Or do similar using Hasura's Event system but with webhooks.
https://3factor.app
[1]: https://theartofpostgresql.com
https://www.executeprogram.com/courses/sql
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".
Learn by watching short videos and practicing: Mastery with SQL (paid course, $49) - https://www.masterywithsql.com/
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.
I've been using Gremlin for crud ops in my apps. I recommend these two resources on Gremlin:
https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html
https://github.com/datastax/graph-examples
- 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
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
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.
However the more I work remotely the more I find that not to be the case.
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...
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-...
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.
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!
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.
Just curious, why is being self taught a guarantee for having massive holes ? Can you give some likely examples ?
If only there was some way for people to communicate these linked topics in some sort of portable written format!
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.
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.
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).
- 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.
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.
The book is great but not what you seem to be looking for.
However, the book is definitely relevant to mobile applications. The backends for all the most popular apps are built with systems described in it.
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.
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
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!
I have no idea how they work under the hood though !