I am absolutely sick of UI work, and JavaScript. It’s not a bad craft, there is a lot of amazing stuff being done, and yet to be done. But as an engineer, I’ve just been doing it for too long, and don’t find it rewarding. It’s become quite tedious.
Again, I think front-end development is not a bad craft or trade.
That said, I’m looking to get further into the back end and I’m figuring out some small projects to help me figure out which direction to dive deep into.
What I’m thinking:
Distributed systems - This just sounds cool, and I think it’s really interesting stuff. I really don’t know how they work, and I certainly do benefit from their existence
Low-level systems programming - This could be work on the OS, but I’m thinking more a long the lines of networking and gaining a real hands on understanding of TCP, UDP, etc…DNS
Here are the smallish projects I have in mind:
Is anyone else in this situation? Or made it through this transition? Any advice?
Thank you
I and a group of people are on this path as well. You can join us remotely. http://frostbyte.cc
Two years ago I put together a reading list for myself with fundamental topics and have pretty much been following it: https://begriffs.com/posts/2017-04-13-longterm-computing-reading.html
(As you can tell from my other lobste.rs submission, I just finished the Unicode section)
Thanks! I’ll check it out.
I definitely am in the same sort of situation. I find myself to be an apt web developer, but strive to become a systems engineer: one with know-how of networking, OSes, databases, and the like. I’m partial to structured learning supplemented with projects as opposed to more free-form project-based learning, so my resources reflect that:
Teach Yourself Computer Science has really helped me get structure a learning path to gain a better understanding of computers and computation. The quality and variety of the resources is fantastic, the sequencing is also quite nice. It’s not a strict curriculum but will definitely get you on the path. Before I found it I had already done many of the things mentioned in the Programming section, but have since gone through a good part of Computer Architecture and Algorithms and Data Structures (the practices, I found better learning through Coursera and EdX). I’m going to start the OS section this week (ordered a physical copy of Operating Systems: Three Easy Pieces).
The Morning Paper Definitely something I don’t read enough of. It’s an incredible blog where Colyer writes a deep summary of a paper from some computer science field everyday.
Class Central A MOOC aggregator that’s served me will to find good classes.
Learn theory and compare ideas critically. If you follow the hype and what’s popular you’ll find yourself bored again soon.
I think it’s so easy to fall into that trap. And in the front-end world, even if you don’t fall into that trap, it’s the status quo. So you end up dealing with dev culture with the wrong values.
My strategy is to find things that are genuinely interesting, and to also keep in mind that it may not be interesting forever. There will be a time in the future where I will be bored again. But as you’re saying, if I remain critical and focus on fundamentals, that time will be a long ways out.
On the other hand, in this move towards CS fundamentals, it’s all connected. Maybe I’ll just end up floating around, taking periods of time to focus on different areas of computation.
Thanks for all these links! I’ll check out that book. Sounds like a great way to ease myself into the ocean.
Since you cited distributed systems - you might consider looking at IPFS and the Fediverse. Both have a number of interesting ‘child’ projects hanging off them that might pique your interest.
Small and tracktable project like you just listed seems a perfect way to do it (if you have free time). I would advise using a modern language like go and rust, since the ecosystem and tooling is easier to get started.
Some other learning projects: https://cstack.github.io/db_tutorial/
This db tutorial looks amazing. I was thinking about using C, but perhaps Rust or Go is the right way forward. I’ve been getting similar feedback. Especially around Go since it’s used in production quite a bit. On the other hand Rust is genuinely a step forward in terms of PL tech.
What fsaint said. I’ve done a small CI system in Golang and cli tools like ps and a pseudo MIPS assembler in Rust. Great languages. If you want to do PL type stuff, writing a interpreter/compiler in Go are good books.
What languages do you know now? Are there any you don’t know that you are particularly interested in learning?
Any idea what kind of application you want to get started with? You could start building web backends, or CLI apps, or GUI apps. From the project list you wrote, it sounds like you’re more interested in CLI apps. Or at least things that don’t need to bother with high-level web and GUI interfaces. I don’t know what you’ve done so far, but small CLI helper apps are a decent place to start for learning new languages and frameworks.
I know JS, python, some ruby. A long time ago I had a lot of experience writing C. I’m very interested in Rust, moderately interested in Go, and I’m also thinking about just diving back into C.
Thanks for the ideas! Yeah perhaps a CLI would be a good start. I was thinking about writing something with a terminal dashboard. That just sounds like a lot of fun. Thats part of the reason why the htop clone seems like a great direction. Make some system calls to get information and just display it.
Look into Elixir or Erlang if you’re interested in distributed systems!
I’ve done the backend / front-end oscillation repeatedly in my career. Some advice:
Stepwise transitions are the easiest and most employable approach, so for you, front-end => full-stack (front-end + servers / scalability / AWS / DB stuff). You remain valuable throughout the transition and can slide back if you change your mind. Many employers will agree to this migratory path. Node.js is popular enough that you might not even need to switch your primary language.
Check out the “T-shaped” model of knowledge workers / engineers - the idea is to develop depth of specialization, as well as breadth of (shallower) knowledge across related areas. This is a term managers tend to understand, and you can pitch this personal growth model at work to get permission to move in the new direction, while still providing value and having impact doing the old thing.
Also, if you can find people around you who want to learn front-end stuff, you’ll have the double opportunity of getting experience teaching your front-end replacement, while yourself learning a new technical area. If you don’t know anyone, your manager might. This tends to be easier at bigger companies or startups that are growing.
Good luck!
If you are interested in distributed systems you should read this book, it’s great https://dataintensive.net/
I work with distributed systems, although not at a scale like Amazon. Like all CS fields there’s a big difference between practical distributed systems and academic topics you read about. When working with distributed systems what your really concerned about is bugs, how do we debug a distributed system, and timing issues. As well as typical infrastructure concerns: high availability, security, reliability etc.
My advice is to talk to people who work with these systems everyday and see if you like what it’s like.
Great idea. I would expand on your suggestion, and say that in all systems we’re concerned about bugs. How would I debug a system call for example? I think that’s a really great question to ask for every area of computation, because the answer leads to more depth of knowledge. Thanks!