How to be a wizard programmer
twitter.com
twitter.com
If you run into problems none of the senior devs have experience in and have no answers for, my first concern is that you're massively over complicating something we've solved in a simpler and less risk-exposed way. My second concern is that you're intentionally reinventing the wheel in a way that is massively over complicating something we've solved in a simpler and less risk-exposed way just for your own interest.
None of us has any experience with the actor model, but rather than dismissing the question, we're investigating.
If the senior people have never had to solve the problem before, how can they know if it's a valid problem?
"No experience in and no answers for" implies a gap in your knowledge, not a bad question.
I never bothered to fix it, so I believe it's still in production. You better hope you're not assigned to maintain that module.
The one bug at my last job that gave me trouble was one where somebody deep in the stack called the C close() on a filehandle managed by the interpreter. The bug report was "My reports are showing up empty when I run them". The language interpreter kept track of its filehandles separately and wasn't informed about the close, and this led to an off-by-one error when you later went to write to a language-managed filehandle. I noticed stat'ing the filehandle gave a different inode than the temporary file it was supposed to be opening. I moved over to an ext4 filesystem so I could use the debugfs command to look up the inode, but the error only showed up on the same xfs filesystem. A brute-force search of the filesystem turned out that the report was being written to one of my Perl source files, which was opened read-only and so the writes were being rejected. The commit that introduced the error caused it by adding an include, which shuffled the order that filehandles get allocated, which exposed the off-by-1 error that had been around for 10 years which usually didn't cause any trouble.
Took me a solid week to track that one down.
I'd much rather have someone ask when they get stuck, or even if they're kinda stuck. If someone happens to ask me a question that's easily found via poking around a bit more, I'll show them how they could have found the answer, and then they'll have learned two things: the thing they wanted to know and a new pattern for solving problems.
As a result, I rapidly find myself surrounded by people who ask smarter and smarter questions, and who can solve harder and harder problems. And I love that result.
The style I favor when the junior devs ask me questions is to ask questions right back at them, kind of like in a Socratic dialogue. This makes them reluctant to come to me for easy answers and think more about the problem first.
In the end I get a team of people with steadily improving skills to whom I can delegate ever more complex tasks.
That's been my experience at least. My very first job was especially bad. There was an entire culture built up where tech leads and senior engineers would never answer chats/emails sent by junior engineers. If you really needed a clarification, you had to hunt them down in their cube, where if you're lucky, they would answer your question without any condescension. At my very first performance review, I was even dinged for "asking too many questions."
At the time, I thought there was something wrong with me. Looking back, the reason why I had to ask so many questions was because there was zero documentation, the code base was horrific, and we were using stone age tooling. My only regret is that I hadn't left even earlier than I did.
I was contributing from day one. I had introduced unit tests to their code. I implemented a Stripe integration for subscriptions. I added new features. After receiving one of my questions, the senior dev would take a long hard look at me, thinking of the dickest thing to say, then he'd say it. The responses were always condescending and rarely helpful. I became afraid to interact with him.
No matter what I did, I did it the wrong way. He didn't offer solutions, just criticism. When I mentioned that working with this guy was incredibly difficult, my employer said that he understands, but this individual is so good at what he does, it's just something they'll have to deal with. Life is too short to deal with these toxic individuals.
I used to do that. What would happen is people learn they _dont need_ to poke, because this sucker has all the answers on a platter, so why bother.
However, if you intervene too late you can make a student go on his way for too looking for an answer that's too complex(for the time frame given to solve the problem) or that's in wrong direction(like trying to optimize a small part of a project that's not all that important) or even more commonly, the student can remain oblivious regarding a shortcut that can make his life a lot easier.
I always think of those problems when dealing with a new intern and I'm still unsure on how to deal with it, but one thing I'm starting to understand is that different people have different personalities(that are constantly changing), so they require different approaches at different moments
As the man says "there is no silver bullet".
Bad:
> "I have an error. What do I do?"
Better:
> "I have this error: {BLAH}. What do I do?"
Best:
> "I'm trying to do X. I have this error: {BLAH}. I read the documentation and tried doing Y, but it didn't fix it. How I can I do X?"
Similarly, I try to avoid giving answers that are just "change this line to x". You're just a code-fixing machine into which you pump questions and answers are spat out. Nobody learns anything that way, and you're going to answer the same question over and over again, and get annoyed.
I like answering questions, especially when this leads to someone's growth; it's a satisfaction to me when the junior goes from newbie questions to more and more advanced ones.
But, even if I disliked answering questions, I'd still very much prefer answering questions than having to clean after a junior that didn't dare to ask a question.
Seniors like to help learn, not to be used as a walking manual.
Being a wizard developer also requires a wizard manager that the developers can trust completely.
And even the concept of "search for the error message" is a pattern someone needs to learn, once. Ideally it's one they'd learn very early on when learning. But I've found that very few people talk about or provide guidance in the processes of learning themselves. Which is why I'm glad that people write down advice like the page tweeted here.
> even the concept of "search for the error message" is a pattern someone needs to learn
I suppose if we're talking about a graduate or intern this is okay, but when you have somebody that supposedly has a few years experience this is just infuriating.
There is also the point that you shouldn't be getting a graduate/intern to be doing work they haven't the capability to google the terms of ...
You know how sometimes programmers on Hacker news talk about toxic team mates who are hard to work with and bog the whole team down through arrogance?
Becoming furious when someone asks you a question and truly wishing they'd waste half a day deriving it from first principals themselves rather than just asking you and having an answer in 30 seconds makes you one of those toxic team mates.
Modern software development is a team game. The average speed of the team is what matters, not your personal speed.
Given the choice, I don't want a "10x" programmer who works alone or only wants to work with other "10x" programmers. I want a 2x programmer who turns everyone around them into a 2x programmer while becoming a 4x programmer, and who then turns all those 2x programmers into 4x programmers while becoming an 8x programmer, and whose newly minted 2x programmers turn everyone around them into 2x programmers while becoming 4x programmers.
That sort of attitude gets seriously wearing.
As long as someone isn't being willfully ignorant, I'm more than happy to help them, as them doing their job better helps me do mine better.
Note also that there's a subtle difference between senior devs and experienced jerks.
Obviously, you could have someone that will always ask and not try. My gut, though, is that spending that thirty seconds just a couple of times will save you hours of future work.
1. Write Code
2. Read Code
3. Learn how to find out things for yourself
4. Find new ways of doing things and contribute to the team
5. Try to give more than you take
I ended having to learn details on how C++ work (how vtables work? why?, etc...), what some common stuff on the code was (reference-based smart pointers, locks of various kinds, thread-related stuff, alignment-based custom fast allocators, STLPort stuff, etc...), reading papers about why some things were done that way (yep, the game I choose has lots of papers and talks about its coding!), and so on.
In the end, I couldn't find any of the things I wanted to find, and couldn't convince the game IP owner to let me patch some bugs I found (that are actually killing the game review ratings on Steam), but I don't regret it one bit, I felt like I learned in the 3 months I fiddled with that, the same amount of information I needed to learn in 2 or 3 years of coding my own projects.
Lots of the stuff involved are borderline illegal, or in some countries completely illegal, this is why also I don't say the name of the game on my post.
I don't want that to come haunt me later.
(Am I the only one that gets put of by job ads asking for nonsense titles like these?)
The first type of company is a great place to learn new things if you're quite junior. The second is a good place to demonstrate your ability to hack solutions together fast if you're mid-level.
If you're more senior then you should probably avoid all of those sorts of companies because neither will want to do things in anything resembling a sane way.
Nowadays I'm more interested in people that are effectively building stuff and just s/[:buzzwords:]//g.
In job ads rockstar is definitely the most annoying/lame one.
But, yes, wizard is better.
/s