I might be able to top that. About eleven years ago, I went through this process:
1. I wanted to redo my web site. But I hated using PHP which is all my shared host allowed.
2. Maybe I'll design a little programming language that transpiles to PHP. Then I can program my site using that.
3. I have the parser working and producing an AST. You know, writing a little interpreter that walks that AST is practically trivial. I'll do the PHP backend later, but let's give that a try.
4. Whoa, I have a working language! Neat! But, man, that tree-walking interpreter is slow. Maybe I could translate the tree to bytecode and write a little bytecode VM...
5. Bytecode is so fun! But I'm relying on the .NET VM for most of the heavy lifting like the GC and object representation. I wonder how that stuff works. Maybe I should try writing a little VM in C++...
6. That wasn't as bad as I expected. I learned a whole bunch. Maybe I should write some of this down.
So, uh, now I work at Google on a programming language and wrote a textbook on building interpreters [1]. I never did finish that website. (I just ported my blog to Jekyll at some point instead.)
I read once that a famous author got started because they read some trashy novel and was so incensed that it had been published that they decided they could do better.
Jim Butcher with Dresden Files, or someone else? Because that pattern-matches to "highly promising book recommendation" for me.
"... struggled mightily until deciding (out of frustration) to reverse course and follow Chester’s rigorous writing techniques to the letter, doing all the plot outlining and character background sheets and so on that the English literature folks often scoff at as the workmanlike tools of genre hacks."
- So, tell me, how did you land a job on Google?
- Yeah, I was trying to redo my website...Roughly around this same time, I was a very burned out game developer at EA. My job was doing data analytics on telemetry data reported by games. Basically, any time you started a game of Madden, the game would phone home to an EA server and tell EA which stadium you picked, which teams, game mode, etc. EA wanted to use that data to know what to prioritize in future versions. I was working on some rudimentary code to scrape those log files. Nothing that felt like making games in the least.
At the same time, my employment contract prevented me from doing game stuff on my free time. Most game companies essentially own your brain and don't let you do your own game-related stuff on non-work hours. So here I was nominally in the game industry and because of that, I was doing less stuff that felt like making games than ever before. It sucked.
In a fit of pique, I made a throwaway account on Reddit to whine about this. A complete stranger saw and said, "Well, if you know C++, Google is hiring and I could give you a referral..." I already had an interview lined up at ArenaNet in Seattle at the time. The recruiter for Google rushed to get an interview with Google going while I was in Seattle. I wasn't super interested because what the hell do I know about working on search engines and server stuff? However, I wasn't about to turn down the opportunity to see a Google office. My plan was to stay in games.
Then I bombed the ArenaNet interview because the interviewer didn't know what amortized complexity was and I couldn't do a good job of explaining it. (They asked what the cost to append to a growable array was and I said "constant time on average" and they looked at me like I was an idiot.)
Somehow, I managed to squeak through the Google interview. I had no idea at the time how few people get offers. If I did, I probably would have been a lot more nervous and fucked up the whole thing.
So, yeah, I got a job at Google and moved across the country because of a whiny throwaway account I created on Reddit.
I've seen you around here a lot and enjoyed your comments, but until now, I never realized you're the author of "Crafting Interpreters" and "Game Programming Patterns"! These are some of the best resources I've ever read on-line! Thank you for doing those!
You're welcome! :)
For example, I included multi-lingual functionality as I wanted google to give me better result when people searched the keyword in my city.
As I had never been satisfied with my design, I found a way how to safely separate content and layout /color/etc. Then I was curious if anyone visited the website, a simple analytics was built. Wait, I also wanted to know in real time of any visit, so I set mobile notification if anyone visited the page or clicked on specific button. This list keeps.... haven't mentioned about my form builder, dynamic popup, and chatbot.
Thanks for sharing the experience, I thought I was that unique.
Off the shelf CMS ends up being a mix of feature factories and lock-in traps, though, which probably explains why NIH is so particularly pernicious in this case.
We need a SQLite for CMS.
It's similar to the benefit of teaching, my classmates and I always learned more (in undergrad) by teaching each other in a quasi-seminar format in the computer lab during our study sessions. Someone would naturally take over after a bit as the "teacher" for the session as they found that communicating what we were studying to the rest of us clarified their ideas. Blogging can be similar.
I would throw in "rubber duck debugging" as another similar activity known to produce similar results.
Perhaps make a tutorial? There are various neat tools (and combinations of tools) that lack approachable documentation. Won't be ground-breaking, but might be helpful and worth reading.
Writing the blog post is what forces me to actually learn about the topic and commit the concept to memory.
There are two answers I can see: The first is to keep learning, and leave breadcrumbs for the people who come after you. And maybe, at some point, join the top of your chosen field. It'll be a while, but the breadcrumbs are incredibly valuable to anybody coming after you.
The second is both more interesting, and harder: Find a couple of fields that you're good in. Not an expert, but good. Then write about the intersection. That is almost by definition a much smaller field, and you're much more likely to be at the top of that field. (For a made up example, how many people are really good at music, systems thinking, and gardening, and write about that intersection?)
The things you can generate in that particular field are adding to that particular field - and more importantly, they likely contain unfamiliar insights to people who are only fluent in one of those fields. You've added something new to both your field, and their discourse.
Most of us probably alternate between 1) and 2), and only very few of us will ever be recognized experts in a well-defined field and further that field through our expertise.
That's OK. We're still contributing to the discourse, we just target slightly different people.
The other thing to remember is that writing is just as much for you as it is for others (maybe even more). The act of writing down an explanation of how to do something or how something works ensures that you understand it was well as you think you do. I don’t publish nearly as much as I should, but I often write things down in a Markdown file because it helps me organize the thoughts in my head and lets me identify any gaps in my knowledge.
[1] https://jvns.ca/
- If you're worried about other people's opinion then blog anonymously.
- Many people are blogging without being worried about being redundant.
- Blogging on the Internet is like spitting in the ocean. You would be lucky to get some pageviews.
That’s my philosophy now. Always try to learn new stuff and how to do things better. Even if it doesn’t work out, at least you know why.
Maybe it's too soon. After 6 years of programming I had made pretty much nothing useful.
I've learned a few novel things from my unfinished side projects, but I've never really used them in my day job.
I strongly disagree. There are teenagers writing custom skin mods in Minecraft by Googling and copy/pasting. There are non-tech professionals making hello world android apps but are too novice or uninterested in getting a professional developer position. There are photographers who write plugins in Photoshop to create copies of their photos at various resolutions. You won't find any of them making github contributions but they're there.
And a lot of the skills you learn from side projects are internalized without being able to explicitly state it, like getting a feel for conventions in the framework or language you're using, or how much abstraction to use in your solution.
Real world example: I was building an app for myself to scrape some websites and Twitter to aggregate stuff I might be interested in. I had built an MVP that I wanted to get up and running on a web host somewhere so that I could let it run for a bit and then iterate. I was annoyed though, because while I was comfortable setting up servers, I hated all of the repetitive tasks involved in getting everything set up the way it needed to be. I’d tried writing shell scripts, but as anyone who’s tried that can attest, they are fragile and end up being almost as frustrating as doing it by hand. I’d heard about this thing called Chef that people in the Ruby community had great things to say about, so I set out to learn that so I could use it to set up servers for me (and my local Vagrant setup). Long story short-ish: I never did get my app deployed to a server, it’s still sitting on my hard drive almost 10 years later. But my Chef skills turned into a bit of moonlighting to bring in some extra money, and then ultimately let me make a career change and get out of a job that had become toxic. I don’t do Chef any more, but I’m still in a job I enjoy and I make a lot more money than I did.
I’m still going to get back to that app though. One of these days.
It's possible you are learning something.
A few days later (maybe literally the next day, I don't quite remember anymore), a coworker was having an issue where we needed tracepoints to catch who was overwriting bad memory, but the debugger was causing the thread race to not happen properly. So I looked up how to use perf to set hardware watchpoints, and we caught the issue almost immediately after that. I would not have thought to try that had I not been poking around with my side project.
Some of my key skills as a developer are my ability to debug issues quickly and my ability to spelunk through large code bases. These skills were developed largely through poking around code bases for incomplete side projects. Sure, the details of how CVS works is probably never going to come up, but when you stumble across time synchronization issues for code, or the different filesystem semantics of NFS--those details tend to be more relevant, and you might not think to look them up before embarking on the "useless" side projects.