I am a quite good bad programmer
I never "studied" computer science in a regular way, but I am in the industry more than 20 years. I started as a hacker, reverse engineering, assembly code, moved to C and C++ and now web development in Node.JS, Go (golang) and Rust and Vanilla JS. Touched of course Python and Arduino and Raspberry PI.
I find it that my code and overall look as much better (if I can be a bit non modest for a second) than other developers even seniors.
- My code is highly readable with good comments and other can take over my code responsibility quite easily
- My code runs (and also complies) faster than other - I understands the usage of Hash / Map instead of searching arrays and many other small things that actually enhance the code performance
- I know how to KISS (Keep it stupid and simple) and so I am able to write complicated software because the basic is simple and separated so my feasible to comprehend
- I understands Object Oriented correctly and knows where to use it and how and when to avoid it
- I know not to search always the latest new shiny thing (library or framework) and use legacy software that actually do the job when needed without complications
- I understand how the computer works, from BIOS, BUS to OS (Linux and Windows internals)
- I have (again if I may say) good product skills and some UX guts which helps me manage things on my own
All of this together allowed me to build and sell already two startups. Develop and maintain easily many web sites and SaaS which creates me nice passive income (such as https://gematrix.org).
So am I a good or bad programmer? - Still I will score quite low in job interview questions ...
159 comments
[ 4.6 ms ] story [ 377 ms ] threadIt's nothing personal, but many developers tend to think about their skills higher than they are in reality.
What i can suggest you, is to ask for feedback after interviews. You will get more specifics there
EDIT: I forgot to actually add a verb in the first sentence and some punctation
I don't think you have to take the label "bad programmer" because you don't ace job interviews. Those are contrived games anyway, if you practice you can learn to ace them but from your position it doesn't sound nessecary.
I'll also throw out that it's not binary in the other direction either.
There is always more to learn and as long as it's still fun I find that reading one more technical book usually does add value somewhere I wasn't expecting.
When I was a Junior dev one of the first lessons my boss taught me was to always always speak up if something looked off to me. Maybe I’d get an explanation and be enlightened or maybe I’d actually sniffed out a mistake or code smell. It always seemed like a win win.
But if the entire job is based on “here swallow this bullshit pill before you’re let in the door”, isn’t it going to be hard to get the devs who are allergic to bullshit?
This is exactly the reason why any big enough company is eventually going to s*hit
And why founding team doesn’t stay long in a successful startup.
Doesn't the founding team get to determine the hiring practices?
One of the factors — it’s too risky for a big company not to hire based on obedience.
Maybe that’s what they want, namely a self selection of devs who will be happy and okay inside an org that is filled with bullshit.
Mostly it selects for people who can turn this on when needed, which honestly is a critical skill. Sometimes life is just bullshit, either you're a person who makes that easier for everyone or you're a person who makes that harder for everyone. But an inability to get past it is a red flag.
(if it is not explcitly defined, and there is state based behaviour, it is by definition then implicit)
At the moment I'm trying to overcome the inertia on this issue in the general process/industry sector with child standards from IEC 61508 - 61511 and 62061.
I am guesssing you apply the medical standards IEC 60601?
Or at design of devices at component level then IEC 61508?
Interested to know how it fits in to the overall Functional Safety approach.
This is what makes you successful in some large organizations, unfortunately.
Let's be real, that's exactly what most mid+ companies are looking for.
I'd say it's more a measure of how well you can learn an arbitrary skill. They could change it to solving Sudoku puzzles, grading SAT essays, or wood carving and most of the same people who do well in leetcode interviews would pick up those skills and ace the interviews.
But you don't need arbitrary skills, you need solid development skills to do the job. So they're always going to miss out on people who aren't good at learning arbitrary skills but already have solid development skills. But many big companies seem alright with that tradeoff.
Time is finite. You can learn to write better programs, or grind Leetcode. Leetcode interviews favor the one who can put enough time on the latter.
A better explaination is it's a chain reaction. People who know only to Leetcode enter the industry, and ask only Leetcode questions.
But category theory?
"Tell me your opinion of the emperor's apparel."
A given programmer might blaze through an interview task like a superstar, yet take two days to get started on it if it's an actual job assignment.
Everyone can put on their Gets Shit Done hat in an interview, in other words
That is why interviewers ask questions about previous job experiences and contact references.
That's true, but only because companies are bad at interviewing. It is possible to do much better than companies typically do at this. It's just a really hard skill to master, and involves more than just standardised testing.
this is the bizarre thing - these are qualities that actually make a good product developer, but many companies pretend that they are hiring people who will be coming up with new algorithms and not just make db records when someone clicks or submits a form.
A few years ago I was applying to a well-known consulting firm, a role in data analytics. I got rejected due to "not knowing SQL" (which at that point I've used professionally for 8 years) and they hired someone else. A few months later, the same company made me an offer for another team in a more business driven role. I've ended up as a lead solution architect for a pretty involved WASM-based product with them and managing the guy they hired instead of me before. The guy couldn't code a for-loop in Python and I ended up doing all the engineering work for him until we could offboard him.
Moral of the story: perceptions, culture, and internal team politics might play a way bigger role in seeing your value as an engineer than we might acknowledge.
Say no more, you're hired.
Companies need those 10xdevs because they are bloated with dead weight.
But office politics make it very hard to cut that dead weight.
Anyway, I've worked with plenty of people who can get stuff done, and I've been able to get stuff done myself sometimes. However, it's all relative and if I'd been at Xerox Parc in the 70s I'd have been a 0.001 for sure.
>Copy/pastes code snippets from Stack Overflow, Glitch, Codepen, or wherever they find answers.
>Gives credit where credit is due.
>Spends time on things outside of engineering, like hobbies, friends, and family.
>Doesn't act surprised when someone doesn’t know something.
>Willing to admit when they're wrong, and aren't afraid to say "I don't know."
>Doesn't riddicule entire professions within engineering, especially not when in a position of leadership.
I would consider this an assumed skill for any developer with a college degree. It’s basically the point of the entire Data Structures class, which is a degree requirement.
Me: “why don’t you just use a hash table here? That array you’re iterating through each time has like 200,000 entries”
Him: “I can’t. I need to be able to get both the key and the value and hash tables don’t store the key”
Me: “…sigh, school has failed us again”
Now I'm wondering about something like:
You could probably have they key be a container object and allow changing its internal value, which would then communicate to the hash map that it belongs to, that it should do some internal changes: That logic could take an internal hash map, remove the element by the old key and add it with the new key. So, to an outside user it would seem like you can change the keys.The only problem would be that depending on the language you're using, you wouldn't change the objects directly, but would use those containers and it would essentially just be some boilerplate around a regular hash map. For example, Java has MutableInt and similar classes, which here would be hooked up to the MutableHashMap that they belong to.
Then again, I can't come up with many cases where something like that would be nice to have, since if you want to "change" a key, you can just do the following manually:
> Him: “I can’t. I need to be able to get both the key and the value and hash tables don’t store the key”
How could he do well in the data structures class? This is the definition of a hash map or hashed dictionary, so this is basic knowledge of data structures that is taught in this class and central to know to even have a chance of passing the exam.
In practice it's not the case, but very technically from a purely theoretical standpoint, I think he's right.
EDIT: untrue on any finite sized array, due to collisions. See below, and sorry for the brain fart!
> There's no theoretical way for a hash map to work without storing the key - the reason for that is hash collisions in presence of which you do need to run equality comparison with stored keys otherwise you would overwrite data just because of hash clashes.
There's a ton of material in a Data Structures course. I'm sure the point about storing the key was mentioned at some point, but it's not the focus when talking about different hashing strategies etc. For people with a bunch of experience (e.g. I'd been writing Perl for years before this, so being able to iterate across a hash and get (k,v) pairs was obvious) it's a detail that is already there in your brain, but if the DS course is your first exposure to a hash map, it's a detail that can easily get lost in the huge forest of other brand new things to learn.
My experience differs: It is the common situation that the theory is taught in the lecture, and then each week you have to do quite some exercises to implement all the newly learned data structures in code (lots of work to do each week :-) ). So, if you forgot such a "detail", the code to write for next week simply won't work - 0 points.
This way, it is rather unlikely that you will forget such a "detail" in the forest of new things to learn. This statement in particular holds for students who had done pretty well in DS as the one you are talking about.
I loved it all and had a great time. Lots of people really did not.
> So, if you forgot such a “detail”…
Sure, very true in the short term. Next semester though? That code doesn’t matter and most people don’t have flawless long term memory.
Besides, just because you are storing the keys, it doesn't mean it is viable to retrieve them. On the collision aware maps you see on CS, iterating through the keys is extremely inefficient.
The OP's description is clearly somebody that has learned the theory, but don't have any practical knowledge.
For example:
1. When n is small, an array is almost always better. Arrays have very little overhead compared to even a hash map.
2. Algorithms with the same O() may still have significant differences at runtime and might be balanced differently between insert and search times. AVL trees take longer than Red Black trees to insert, but might be 1 level better in height. That means one less access. Useful for a routing table, for example.
So, in summary, if your looking at other people’s code and see lots of arrays don’t get too smug…n is usually small.
weirdly, in all my recent algorithm work, only the big-O has mattered (or it's all just NP-hard or even EXPTIME.)
Knowing the theory doesn't mean people apply it in practice.
Some companies have a more straight forward interview process. Try to stay away from big companies. There are startups paying very well.
I'd take people that have initiative, want to learn and are coach-able over someone that can excel at taking tests.
Now I went through with them some extra things in the interview and fixed some things about the code and handled some things a bit better. After this investment of time I was told I didn’t handle errors well enough in this 100% coverage tested example code of a library. This in my opinion was not true or even discussed in the interview, error handling was certainly not specifically mentioned in the assignment.
Anyway to address your point, I don’t think you should necessarily believe what other people say about you in job interviews; there are various types of interviewer but mostly the feedback is post rationalisation of “that’s not how I would have done it” even if your solution solves the problem perfectly. For this reason I’ve decided unless I can’t afford to feed myself I will avoid doing at home coding exercises that are deliberately vague in the future.
If you want to get better at in person/under pressure coding exercises I highly recommend taking on Advent of Code [1] one year, these are the opposite of the vague problem specified above as there is an exact and clear right answer to collect each star.
[1] https://adventofcode.com/
Some of these places expect your first draft of a weird abstract problem to be perfectly readable in a live coding environment. Without any pressure my first draft is feeling out the problem and then trimming everything up.
In any case I landed at my preferred company, which is very exciting.
The company added a take home project into the interview process retroactively
Said the task would take 2-4 hours
It took me days of research and development
And then I re-did the project in a few hours, simulating github commits to a new repo so they could see the time it took
They graded unknown things
Are you kidding me? The IoC research was probably good experience if you've never seen them before, but yeah you ran into the "easier to criticize than do".
I almost guarantee none of the people involved went through the same interview process where they had to code something for two days. This is how the hazing cycle begins, because everyone thinks "man I had it hard, and my hard experiences forged me, so I'll be really hard on the next round of people".
Dumb idea. That is a conscious thought bubbling up from subconscious "trauma" and humans for whatever reason replay / reinflict their repressed emotional damage on others. I believe this is because trauma makes you feel alone, and it makes a person feel less alone.
But anyway, so the organization hazes people, who then haze the next round even worse, who then haze the next round even more really bad worse.
This basically is what IT interviewing is after 20 years of collective downward spiral hazing.
The military generally has this figured out with basic training. Basic training is basically hazing to toughen up and desensitive normal humans into becoming soldiers. But the military seems to have a policy / training feedback loop that prevents the hazing from getting worse, and staying at the level of psychological impact that they get the desired result from.
Interview gauntlets have a desired result: filter out the chaff, get good candidates. As google itself shows, one of the progenitors (along with MIcrosoft) of the great interview hazing feedback loop, that it doesn't work. The end goal of "good employee/developer" isn't enhanced by the gauntlet/hazing. And yet everyone does worse and worse variants (look at Amazon: people hate working there, and the reputation of a horrible workplace IN IT, not just on the warehouse floor, is now ubiquitous in the industry).
Anyway, fuck our industry interviewing hazing. What a stupid bunch of apes we all are, interviewing in ostensibly a purely mathematical/technical domain has been reduced to a bunch of Lord of the Flies level dystopian human psychology.
Interviewing is a nightmare on both sides of the fence, though. There's a reason why it's a good idea to build up and leverage your network of coworkers.
I did this for a while and realized that it typically panicked the people we were interviewing, especially if they were on the junior/mid side of things and as a result, gave lower-quality answers.
> I would also expect error handling to be addressed in any piece of software written for any purpose
I guess it depends on what people are hiring for but in the long list of things I need out of that person, this ends up lower on the list
I always view assignments and live coding in interviews as a startup that has runway of an hour or two. Would error handling help this startup survive another day? No. But properly covering the main use case - may in fact be.
It's fair to want the candidate to mention the edge cases and tests for it in the end verbally, there I agree. But expecting 120% performance giving out vaguely formulated problems with extreme time constraints and the pressure of an interview to me seems almost delusional.
The Senior Architect that interviewed me asked a question about correct infrastructure state management giving as an example their current infrastructure, giving me a hint that number of environments will grow expenentionally.
Ive shortly explained to him that the architecture they chose will be really hard to maintain when the numbers of environments grow past single digit numbers and a better approach would be to store the state per part of environment.
He got really mad at me for pointing that out (on the meeting were also other ppl) and tried to force me to chose the same approach as he did. I refused and proposed IMHO a better solution.
Long story short - did not get this job. So yes, sometimes ppl will dump you because you are overqualified and not only underqualified.
I've given dozens of interviews over the past 3 years. I'm fairly certain everyone got out of the interview with me feeling like they did very poorly, when in fact a lot of people were doing well. All of the people I ended up hiring told me "I was sure I completely failed your interview".
You don't know what interviewers are looking for, so don't make assumptions. I'm almost never looking for a "correct" answer. I'm always looking for your behavior and attitude when answering those questions. My definition of a good programmer is someone who understands that it's a team sports, who values clear communication and who knows how to read the doc on their own. You may or may not have implemented your own lisp in your spare time, but this is secondary.
If you ask me to review the quality of your code, I'll spend more time reading your commit messages and variable names, than you realize. It's as important as the choice of algorithm and data structure.
Other interviewers value other things. There's no one thing.
TLDR: You don't know how well you did in interviews, it's very likely you're better than you think.
A successful entrepreneur, perhaps, but not necessarily a good programmer.
There's really nothing wrong with being dead average. The interview process is backwards in this industry anyway. No need to worry. It sounds like you're doing fine.
Now to be fair to them, I was asked to do a certain task and I failed to do that task. It's pretty cut and dry.
But I also walked away glad they turned me down, because if they're going to try and force me to do something a specific way when that way is inefficient, or troublesome or just plain not the best answer, then I wouldn't really want to be working there anyway.
Being that cut and dry (read: binary) is a problem of its own; and it's probably the more important one to solve.
How they react to that is telling. I've had interviews where they say "great point, that's exactly the kind of thinking we need!" and other interviews where they take it as a challenge to their authority. The latter is of course a red flag and you should excuse yourself from any further interviews.
It's worth knowing that while you have successfully articulated everything, some people will still see your mistakes as red flags for future communication. Some might even assume that you will be making trivial code mistakes, too; despite there being no evidence of that.
That kind of prejudice is common, and difficult to confront.
There is no real need for you to improve your English skills: your writing isn't ambiguous or missing anything. Even so, it's worth recognizing the social dynamic that is likely to happen, and how that affects you.
Unfortunately, we can't expect all the people we work with to overcome their prejudices, so it's probably still useful for you to improve your English skills.
KISS is “keep it simple, stupid”: https://en.wikipedia.org/wiki/KISS_principle