One of the best things that I’ve done for myself, career-wise, came during a 6-month sabbatical between jobs. I had a bunch of projects that I wanted to do, but I kept finding myself stymied by scope creep - when you don’t have any constraints, it’s hard to decide how big a project should be, and the projects would grow to these massive unfinishable beasts.
I decided to constrain myself to one week per project - whatever I could get done in a week was what I’d do for this project. The experience of going from zero to something useable in either a new language or a new framework or a new field in a week was enormously confidence-building - learning that I was actually pretty good at this whole programming thing and breaking through a bunch of walls I’d run into previously in my professional career gave me an incredible amount of trust in myself to be able to take on new challenges that really helped me when I was looking for a new job. At the same time, it reminded me what I loved about programming - in a week, I was able to build something that solved a problem I had or that someone I knew had, and I got to do so in a creative and intellectually challenging fashion.
If ever you find yourself in a position to take a couple months off between jobs, skip the leetcoding or whatever else and just build some toy projects - you’ll be amazed how much you already know.
I would just add that gen AI can actually be a fantastic aid when you're building some toy projects just for yourself.
I am primarily a backend engineer, though I am capable on the front end, just not particularly fast. I am especially slow at the voodoo that is CSS. In the past, I would have been turned off from doing some end-to-end personal projects because I know I would have been bogged down just battling CSS for hours and hours (it's particularly problematic that I'm slow at CSS but also a stickler for how I want things to look). With AI tools I can literally just say "make it pretty". It gets me about 85% of the way there, but importantly it gets me to the point where it puts in all the styling framework and then I just have to fix bugs/edit/tweak it, which goes very quickly.
So now I've found myself much more likely to build personal projects because I know I can get past things that in the past felt a bit like quicksand to me.
On the one hand, the machines can spin up these bridges over unfamiliar code chasms.
But on the other hand, you (at least I) have no investment in the code. No familiarity with it. No "skin in the game" when I can tell the AI to just redo it.
One way around that is by using the "Chat bots as search engine", and then, rather than cut and pasting stuff into your project, type it in by hand. Even if you're just straight up copying it, by typing it in you have a bit more connection to it. When I do that I can better see the unfamiliar patterns rise out of the code. It's much better for me than just reading it.
Also gives me opportunity to tweak it as I like, which can break things, which can teach me things.
Mind, I've been advocating this "type it, don't paste it" philosophy for years and years, for any code snippet found in a book or tutorial or wherever. It's just now with the bots, the code is more tuned to our exact use case, and the incentive for moving it over is less.
But I find grabbing a blob of code, pasting it into my project, and getting errors so that I can tell the bot whats wrong is not particularly satisfying.
Watching Claude figure out its own errors even less so. (It's very cool to watch, just not very joyful to me outside of "wow, that's cool".)
On the other hand, I have no problem pasting a snippet back with a "what exactly is this doing here" to get better explanations of what I'm seeing.
> rather than cut and pasting stuff into your project, type it in by hand
This type of mechanical copying is probably very important for learning and staying familiar with what it is doing.
Just last night I had ChatGPT help me with some algebra and geometry for a hobby project I'm working on. I'm rusty and got stumped so I asked the bot to unblock me. It helpfully walked through the entire simplification / substitution / solving process step-by-step, which I manually copied down using pencil and paper. Following along like that, mechanically, really helped it click for me. I plan to do more of that.
I've come to the point of using current AI tools as "search on steroids". For coding tasks, I now ask questions using more generic language, looking for references, and when the AI comes back with specific examples, I try to refine the question in terms of the example that the AI has given me. "Kinda like that, but inside of Book, I actually want to do X with the Author"
This makes it so that I have to manually translate code that the AI is showing me to my specific case, typing it out myself in my code's context. This has helped immensely with developing my familiarity with a couple of new (to me) frameworks, and with slowly adding to my overall understanding of what I'm /actually/ building.
The joy of personal projects is they can look like shit! You'd also be surprised how much you can learn by just screwing around with something for a day. A big part of the whole exercise for me was getting out of my comfort zone and learning that I can learn. I'm primarily backend as well, and came up through the ops side (as opposed to formal CS), which always led to a lot of imposter syndrome, so a lot of the benefit came from just putting myself in an uncomfortable position and just staying there long enough to work my way through it.
That said, my goal for this was to wear the hair shirt (and also this was before GenAI was really a Thing) - if you just want to make something neat, absolutely vibe your way there.
When I have gen AI create a starting point for the CSS for me, I still go over every line, and I always have to do a bunch of fixes and edits to get this to look how I want. Frankly, dicking around with the esotera of CSS is something I absolutely don't want to do and don't care about - it's really just reminding me of syntax that I forget because I don't do it often enough. This is also why I find gen AI invaluable for shell scripting. Hunting through reams of man pages doesn't make me learn any faster than just looking at the specific arg flags gen AI outputs (and potentially asking AI more about the details of that command). I just don't do enough shell scripting to really remember the command/arg specifics long term for things I don't commonly do.
> So now I've found myself much more likely to build personal projects because I know I can get past things that in the past felt a bit like quicksand to me.
I'm the opposite of you (my strength is in voodoo) but my experience is the same. Whereas before I'd spend 2-3 weekends getting bogged down on elements that aren't my strengths and never complete, now I can easily whip up a mostly functioning web app (just for me) in just a few hours.
This is how 100% of non-technical executives view software engineers, really. And probably explains a lot of the hysteria (unfounded as I may believe it to be) around LLMs eating the industry.
A good reality check is: if a stranger asks you about a specific part of your toy project, would you be able to explain it?
If you can't, it means there's something there you don't understand, and you lost an opportunity to learn. Of course, this is also true for reusing libraries and stuff.
Within a job, what matters is the _team learning_, and it's roughly the same idea. At least one person in the team should be able to explain anything the team does. Trusting it to an AI puts the whole team in a precarious situation, even if it is something as simple as a CSS layout.
I would argue that, at least for me, gen AI helps me learn things much faster.
E.g., like I said, previously I would have been turned off from doing some projects because I wouldn't have spent a ton of time dicking around with things that are just inefficient. Now I have gen AI create a starting point, and it's very clear to me "Ah, this is how I would use grid layout to get what I want". I can tweak things and it's very clear to me how things are working.
>A good reality check is: if a stranger asks you about a specific part of your toy project, would you be able to explain it?
I like that as a benchmark. I think it also works with LLMs too. I have had best results with AI generation of code when I pass that check. When using a LLM, the chatbot is the stranger.
In fact much of the frustration I have with using AIs seems to be for models tuned to the situation where the user does not have the ability to explain it specifically and it has to make broad assumptions. This may be the best result for a lowest common denominator, but it's frustrating when it provides a generic solution to a specific problem.
I can see specialised models diverging to focus on different levels of assumed knowledge and expectations. Perhaps to have modes of thinking, maybe as a more tone based MOE. Is anyone doing mixture of finetunes?
unless you own/write the whole software stack(not the web stack), i doubt anyone can fully explain their project.
For example, if in your project you have to write a file, and someone ask you how does the kernel cache file writting, that would not be an easy question.
You're missing the point and taking it to an extreme.
Let's say I write a toy project to log all sites I visit to a text file. The goal is to learn browser extensions, not learn kernel cache. There's a clear boundary, and anyone asking me about kernel cache would sound very weird. It's obviously a lot of layers of knowledge deep into the stuff I'm learning.
If my toy project is a beautiful web app, then CSS is _not_ several layers deep. It is in the front of it. It's a dependency I _need to learn_ in order to own my project.
If my toy project is a web app, and doesn't matter if it looks beautiful or not, then I want to spend my time away from CSS (either writing it by hand or interacting with an AI). I am fine with having it ugly.
Understanding these dependencies and layers of knowledge is part of the learning as well.
Again, this works for teams as well. There are certain things, at a certain level, that if you don't have someone in the team that knows it, leads to a precarious situation.
The fact that people don't recognize this, and mistake it for not made here syndrome and other nonsense, is actually scary. It means those recipes (don't reinvent the wheel, good is better than perfect, etc) became mantras that people repeat without actually understand why they exist, and those boundaries have become arbitrary and meaningless.
my current opinion is that uf i can get an ai to write details into a file that another team member's ai can read and then know whats up, thats close to the same as the team member knowing it, as long as theyre either reading the file that the ai read, or working through the ai and providing that file(s) as context.
> If you can't, it means there's something there you don't understand, and you lost an opportunity to learn. Of course, this is also true for reusing libraries and stuff.
Yeah, in libraries that's the aim, software composability and reusability, you don't need to keep everything in your head. Same here.
A "lost opportunity to learn" can be preferable to not making the thing or making it much slower.
I ended up migrating to fixing things in the libraries I use because they piss me off.
Bad onboarding docs, broken or bent SDLC, major performance issues. I spent all day yesterday fixing perf issues in a library that competes with one I loathe for trying to complect an entire problem domain.
You probably have the same thing I do. Teamwork is a very different motivation than working on something either never intended for others or with a long MVP cycle that makes it too easy to get bogged down with side quests. "It would be way less tedious to deal with X if I did Y first. But now Y is blocked so I do nothing."
In my younger years, classic ASP + SQL was easy, and I had IIS + SQL Server set up on a server at my house. And I could write HTML/CSS/JavaScript.
Deployment was... run update scripts, push ASP files via FTP.
Now I know there are newer ways to do things, and I'd love to set up CI/CD in my personal life, but every time I want to do a "toy project" I get hung up researching and thinking about my own personal software development life cycle.
What you choose for hosting and deployment for your toy projects?
I've got a VPS and domain I've had for a long time - for most of these, docker compose + the VPS did the job just fine. I was in the same boat - I'd fallen behind on a lot of the ops stack, and project setup wound up being a tar pit for a couple projects before I got frustrated and just said "Fuck it" and did it the dumb way, which wound up being the correct approach.
I found the trick with the personal projects was to pick the thing I was trying to learn with that project and focus on that - if I was trying to learn React, don't also try to learn kubernetes or lambdas or anything else. You really have to be comfortable with your project kind of sucking for all this to work.
So I'd say if you want to learn proper modern deploy + CI/CD + etc, take a project where you already know the rest of the stack (hell, make it Hello World if you have to) and use that. Keep things simple and in scope, get something stupid working, and then iterate to make it better.
For most of my toy projects, it's a systemd service file and rsync + restart command for deploys. Might have to SSH in and run an install command occasionally.
You can get a VPS in any cloud provider and treat it as your server, just copy files to it. It depends on the scope of your projects, though, if you need a lot of resources it can get pretty pricey for just toy projects.
I pay $12 for a server on Digital Ocean, and I host multiple servers behind an Nginx. But I am primarily a frontend/Desktop developer, so they are simple.
I am in such a phase as I write this. What should have been a week-long project has already gone through three and not finished. This is a simple multi-platform app I am building in Flutter.
One challenge I face is to be able to build something useful within a week. In two projects, I could make wirhin two days each.
For the Flutter one mentioned above, it took me two-three days just to get the tooling/SDKs to work and get me to a hello-world program working on Windows. Then it took about a week to program with all features I needed.
And then, damned again -- Took me a couple days to get it to build APK (random errors; the issue in the build tooling is still open). And then a week of craziness to sort out Android permissions. I still have the latter unresolved.
It took me 8 months of active shopping to find a job w/ 25 years of experience. Unless you are really good at interviewing with an interesting resume, I'd suggest caution until the job market recovers.
What do you think the bottleneck was in your search?
Was it finding openings, getting interviews, or passing those interviews?
In my niche I’m finding that there are very few opening in the city I live in, but that getting interviews might not be too hard. Not sure how easy it would be to pass those interviews.
Most of my issues were around interviewing, I got plenty of them but somewhere in the 3+ rounds of interviewing I'd choke. I have always been nervous during interviews and had previously got most of my positions through my network, but none of their companies were hiring. Next time this happens I'm going to try an interview tutor to see if that helps and probably take some Xanax or something to help settle my nerves.
Take it or leave it - I tell myself i already failed the incomming interview and whenever I notice i get nervous I tell myself im just talking with friends
I'm single, rent controlled, and was working at a FAANG-ish company.
The fear was real, for sure, but it honestly made a huge, huge difference for both my mental health and my employability afterwards. I also got to spend some time figuring out what I actually wanted to be doing, so I had a much clearer picture of where my skills and interests aligned after, which helped the search as well.
For what it's worth, the two tricks I found for leet-code interviews were 1) do the simple stupid thing first - get something _working_, and then make it good and 2) explain what you're doing and what you're thinking about to your interviewers. I'm still not Great at the leet-code style, but you can get a lot of the way there with some basic knowledge about algorithmic design and complexity and data structures. In general, I've found finishing the problem and being able to talk coherently about it trumps finding the ideal solution.
(I also code like a psychopath - I'm constantly rewriting what I'm writing while I'm writing it, so a) slowing down and b) telling interviewers what I'm doing and why made that look less chaotic.)
I'm also not the person you want to hire if you're looking for deep algorithmic knowledge, though - I've got a long career of delivering high impact systems and solutions, but if you want someone to rewrite the index parsing algorithm in your mature database software to minimize lookup speed, you've got the wrong guy.
I actually just started telling interviewers that I'm happy to discuss code, problem solving, etc at a high level during an interview or walk them through problems I've solved in the past, but I won't do leetcode problems
It hasn't outright disqualified me yet. I also think it's a good "is this team a good fit for me" filter
I decided to constrain myself to one week per project - whatever I could get done in a week was what I’d do for this project. The experience of going from zero to something useable in either a new language or a new framework or a new field in a week was enormously confidence-building - learning that I was actually pretty good at this whole programming thing and breaking through a bunch of walls I’d run into previously in my professional career gave me an incredible amount of trust in myself to be able to take on new challenges that really helped me when I was looking for a new job. At the same time, it reminded me what I loved about programming - in a week, I was able to build something that solved a problem I had or that someone I knew had, and I got to do so in a creative and intellectually challenging fashion.
If ever you find yourself in a position to take a couple months off between jobs, skip the leetcoding or whatever else and just build some toy projects - you’ll be amazed how much you already know.