As such, Advanced Beginners can break one of two ways: they can move to Competent and start to grasp the big picture and their place in it, or they can ‘graduate’ to Expert Beginner by assuming that they’ve graduated to Expert.
I think, that viewpoint is a bit narrow. The example, where the author tells the story how he started bowling the wrong way and reached a plateau, where he could not further progress, is a good one. And I'm sure there are numerous examples each one of us can tell of own experiences made when learning new skills.
In my opinion learning new skills fast is a great skill. And nowadays there are many resources available to us make this easy. But you will always reach a plateau, where further progression gets increasingly difficult. It's fascinating how this corresponds to larger patterns like the Gartner Hype Cycle [1].
The question is, what do you do when you reach a plateau? Do you invest more time and money? Maybe the skill level suits you well and you don't feel a need to progress further? Maybe deeper understanding is not necessary to do your job well? Maybe it's better to acquire different skills which you can combine instead of being an expert in one area alone?
I think there are many nuanced answers to that question and simply put blame on the expert beginner is not useful.
But you will always reach a plateau, where further progression gets increasingly difficult. It's fascinating how this corresponds to larger patterns like the Gartner Hype Cycle [1]
It’s not just about skill progression. To stay relevant and not be seen as an old out of touch developer, you have to know how and when to jump on the next hype cycle.
The question is, what do you do when you reach a plateau? Do you invest more time and money? Maybe the skill level suits you well and you don't feel a need to progress further? Maybe deeper understanding is not necessary to do your job well? Maybe it's better to acquire different skills which you can combine instead of being an expert in one area alone?
Is an appropriate response to not getting out of touch.
Exactly. If you reach a roadblock you need to be aware, that there are risks and rewards to whatever path you take.
For example you can invest a lot of time in learning some kind of framework and get really proficient. Maybe that opens up new opportunities to you. Maybe in a few years the framework falls behind and you should have better invested your time in something else?
I think you can do a lot of great things without knowing every detail of a black box. And it allows you to spend your time on other things which are maybe worthwhile in the long run.
What's important is that you do not avoid digging deeper into a topic just because of pure habit. Maybe that kind of self-reflection is a trait which is less prevalent in "Expert Beginners" called out in the article.
For example you can invest a lot of time in learning some kind of framework and get really proficient. Maybe that opens up new opportunities to you. Maybe in a few years the framework falls behind and you should have better invested your time in something else?
Every framework gets out of date after a few years. It’s par for the course in technology. You have to ride the hype cycle.
> If you reach a roadblock you need to be aware, that there are risks and rewards to whatever path you take.
This sounds pretty similar to the exploration-exploitation tradeoff in reinforcement learning (game playing AIs). Exploration comes at a cost, and exploiting current knowledge is safer, but if the agent doesn't explore enough it will have lower total score. A good exploration strategy is a must because knowledge comes from exploration.
Humans frequently get this wrong. Most low level players don't scout because it doesn't have a direct and gratifying impact on the game development plus it has a cost.
In most competitive games with scouting you have to move up the ladder quite a bit to find solid scouting.
True. You can always learn more. Even after you break through many ceilings, you will keep finding more things that you don't know. Also, the incentive to improve gets smaller as you get better - Doesn't matter how many ceilings you already broke through, the incentives for continuing will always go down because beyond a certain point, there are no financial or even career benefits to getting better.
It's possible for a developer to be skilled beyond a level which their bosses, recruiters and colleagues are able to grasp. You're not going to get paid extra for that surplus skill. Your pay is limited by your boss' imagination. Even though those skills are extremely useful and deliver real returns.
Proving yourself as a developer to a non-technical person takes years because that's how long it takes to see the results. In a big company it may even be impossible to prove yourself because your work is mixed in with that of many other people and the results average out.
Kind of true, when one wants to be seen as "Developer in Tech X" and that is only how they sell themselves to companies selling software solutions.
However there is also the path of understanding business domains, brushing up soft skills and embrace being polyglot across multiple stacks, delivering working solutions for companies that couldn't care one second what their IT cost center runs on, as long as they stay in business selling socks or whatever they actually care about.
Independent consultants are the first to get cut when the economy goes bad. Companies aren’t looking for “Enterprise Architects” and “Digital Transformation Consultants” when they are just trying to keep the lights on.
No, you can’t be 45 years old (I’m 46) and say I understand the business domain and I can give you a really cool VB6 Active X control to solve your problem that only works in IE6 on a Windows XP VM.
Yes, if the CTO doesn’t care that he is using somewhat modern technology he should be fired for incompetence. He’s going to find that he has a hard time recruiting developers who know how to write FORTRAN for a Stratus VOS mainframe. Yes I’m that old. Been there done that.
Saying you know the business domain but not keeping up with technology is just an excuse that people make and then scream ageism the minute no one will hire them because their idea of cutting edge technology is ASP.Net WebForms or Enterprise Java Beans.
Yes, my current position is a technical consultant working remotely for Big Tech who has to understand business problems and not just know how to reverse a binary tree on a whiteboard. But, if push came to shove and a meteor struck all of their data centers world wide, I could put my resume out their and get a job with a tech stack that is at the right point on the hype curve.
Well, if that VB 6 is what keeps business running they will be more than happy to pay for it.
Also not working alone helps to sort out the issues when cutting costs arrives.
Finally I am not saying not to learn, rather people should focus on their business value as a whole package, and not being "Expert on Technology X, Y, Z".
I am about the same age, apparently it was worked so far.
It’s about optionality. If I either want or need to change jobs. I would much rather call recruiters and say I know the latest .Net Core/EF Core/ASP.Net Core than saying my only experience is with .Net Framework (which is in permanent maintenance mode) and I can deploy to IIS on Windows (even Azure hosts more Linux VMs than Windows VMs).
Especially seeing that when working as a Corp Dev, salary compression and inversion are real and the best way to keep your salary at market value is by job hopping.
I currently develop for mainframes and I can say they are still very relevant today in multiple industries. For my own company, we get a lot more bang for our buck than if we were constantly worried about the hype cycles.
>if the CTO doesn’t care that he is using somewhat modern technology he should be fired for incompetence
A ridiculous statement. The last concern of the CTO should be "are we using the latest tech for the sake of having the latest tech". Their concerns should be about cost, what the business actually needs, and what the future will entail. Finding new developers isn't that difficult, even for something like mainframes which most college grads today are totally unfamiliar with.
Your point about being more easily hireable by staying up to date with the current hype is true and valid. However the CTO doesn't have the same concerns as you. This is the important difference.
Tell that to all the states struggling to get unemployment benefits out because they can’t find enough COBOL programmers to keep their systems from melting....
Every 'stage' is a plateau in itself. The beginner is able to quickly do tasks, but does not connect them together well. For example, they might know clean code, Scrum, Git, algorithms, TDD. But put them in charge of building a product and they can't. They'll stall. They'll overengineer.
To go to the Competent phase, they need holistic recognition. This means running experiments. They have to try to do things that can fail. They have to learn to plan towards a larger, meaningful arc, instead of simply finishing tasks that were assigned to them.
Finding a mentor is the most effective way to get through a plateau, but mentors aren't always available.
When interviewing new candidates it's interesting to see the difference between beginner/mid and seniors. The beginner/mid group seem to have a lot more confidence in their skills and not be as aware of what they don't know. The seniors seem to be more aware of what they don't know and maybe also a little harder on themselves.
That's what I've always done in interviews. I'm confident about the things I know well, but I'm extremely open about the things I don't know and would like to improve.
I think this is a common viewpoint, and a misconception.
I've seen a number of juniors who were very humble, and this humility was perceived as lack of knowledge.
I've interviewed some seniors who were not humble at all (nothing was an issue).
In general, skill level has little to do with humility and other personal traits. However, we like to project our reasoning into other's emotions, and we love to pattern match, e.g. "she's humble because she has 20 years of experience".
It's another bias you should look for when interviewing candidates. This one definitely does not serve you well.
> I think this is a common viewpoint, and a misconception.
Probably a common viewpoint, but definitely not a misconception.
I have had freshers tell me wrong answers which they know they are answering wrong with so much confidence. And you keep digging them on their answer and they would keep coming up with even more wrong stuff.
It would probably be about 2 or 3 out of 10 freshers who can say "i don't know that".
And I've had senior candidates (with 10+ years experience) do the same thing, even after throwing them a lifeline. This isn't a trait of junior-ity (is that a word?), it's a behaviour.
I suspect if you interviewed those 7 or 8 juniors in 10-15 years, many of them will continue to bolster.
I have sometimes interviewed to specifically find whether a candidate could utter “I don’t know” (and ideally add “, but here’s how I’d handle it, find out, learn it, etc.”)
It’s amazing (and a little amusing) how many people literally can’t admit they don’t know something. I have “passed” some otherwise very strong candidates who couldn’t admit that and made it a point to advise them after hiring how dangerous that limitation is both when doing the actual work and when interviewing. A not at all surprising fraction of them couldn’t admit/understand they even did it, of course.
> I have sometimes interviewed to specifically find whether a candidate could utter “I don’t know” (and ideally add “, but here’s how I’d handle it, find out, learn it, etc.”)
I've done the same. The problem is that in a lot of companies, uttering "I don't know" is perceived as a weakness, and makes you "not a culture fit," so I can completely understand the hesitation...
That happened in my interview for my first real programming job. One of the founders kept making the scale of the problem harder and harder, and at a certain threshold, I no longer knew what to do. I said so, and what I would try to do to figure it out. At the time, I was sure I had failed the interview. Turns out, it was exactly what they were looking for, and my life has wildly changed for the better for having worked with that company.
> It’s amazing (and a little amusing) how many people literally can’t admit they don’t know something.
It is a matter of culture too.
I'll take the example of the desk clerks you have to face as a citizen or customer in administrations and companies.
When I lived in a country of Northern Europe, they would often say "I am not sure, wait a minute and let me check in that book" or "I don't know, I will ask/check and call/mail you right away". And they did it and it was fine. A tiny delay and everything is solved for good. You come out from there with a smile and they have learned something for the next time they meet the case.
Now that I am back in my Southern European country, the guys (well, it's 99% women) in the same position will never admit they don't know or they aren't sure of something. They will assert whatever weird/outdated/wrong assumption comes through their mind with definite certainty. Even if you gathered information beforehand and tell them that the rule says otherwise. They feel that checking or asking for help would undermine their authority or make them look incompetent (as if anyone still had any hope about that...). And they will only call the higher up when, after 2 months and the 3rd visit for nothing except getting contradictory information and requirements, you start yelling and they feel that they are less than 30 seconds away from getting punched in their face. Then the higher up solves the problem (which should never have become a problem in first place) in 2 minutes. But they will keep on 'working' like this for 40 years, they'll never recognise that their work and service would be much more efficient if they just said "I don't know" instead of inventing wrong rules.
As another commentator said, the problem is often less the person and more the fact that saying 'I don't know' is a massive negative in most interview settings.
It was something I noticed when I was interviewing for job positions. Any time I said 'I'm not sure' or 'I don't know' and followed up with 'I'd have to look at the manpage' or 'look up the documentation' either the interviewer would express disappointment or continue to press the question in order to get even a wrong answer.
Many interviewers are looking for you to perfectly regurgitate canned answers rather than admit when you don't have something memorized.
Fair comment I can see where you're coming from in terms of humility and bias. Again I can only talk from personal experience but I notice this also from self assessment exercises in performance reviews. Humility aside the more senior developers (in my opinion) are more able to accurately gauge their strengths and shortcomings. And I can't help but wonder if these skills are part of what help them develop from junior/mid to senior.
Dunning-Kruger effect says that people with more skill are more confident in their skills, albeit it isn't a perfect correlation so skilled people underestimate themselves and unskilled people overestimate themselves relative to others.
I think this is related to relativity, one data feature missing, which is the level of job vs their previous exposure.
Basically with juniors you don’t know what they have been exposed before. In general less they are exposed, more confident they are. Ofc humility is also a factor in this.
> In general, skill level has little to do with humility and other personal traits.
Here, you're using "skill level" as a proxy to years of experience, because the OP used the term "seniority" which usually means years of experience.
So while I think you may be correct when it comes to actual skill level (though I have seen no evidence presented to support this claim), you're definitely incorrect when it comes to "seniority", unless you believe old people and young people do not present different levels of "humility" and "personal traits".
To avoid being accused of not providing evidence:
_you can reasonably presume a 66-year-old will be more conscientious, more agreeable, and more emotionally stable than their adolescent self._
_As you progress through adulthood personality becomes more stable and predictable because you fall into a pattern of thinking, behaving, and feeling._
_Conscientious-ness, a trait marked by organization and discipline, and linked to success at work and in relationships, was found to increase through the age ranges studied, with the most change occurring in a person's 20s. Agreeableness, a trait associated with being warm, generous and helpful, bucked the theory that personalities don't change after 30. On the contrary, people in the study showed the most change in agreeableness during their 30s and continued to improve through their 60s. This even happened among men, which debunks the concept of "grumpy old men," Srivastava says._
> The beginner/mid group seem to have a lot more confidence in their skills and not be as aware of what they don't know.
This might be misinterpreted though. A common advice for interviews is to underline your key strenghts.
A candidate rightfully plays their game by showing expertise and mastery of the things they believe they know and try to at least appear worth hiring.
It's up to the interviewer to try and move the conversation to a topic the candidate is not very familiar with and see how they react and handle it. In general, is down to the interviewer to go beyond the "oh yeah i know that" and ask specific question that demostrate actual understanding.
But then again, it's fair game to present your best self during an interview. You're literally selling yourself to a potential employer.
A way of putting it is that some beginners are fanatical in the rules they follow. I find they have strong opinions on using say, a string template, or SOLID, and be judgemental on those who don't.
The seniors can be extremely cocky, but they realize when to follow or break rules. They may have strong opinions, weakly held. They'll proudly challenge something to see if it hold weight, but back off once they're wrong. There's some special cases too, like people who are beginners in project management but experts in development, and they can have fanatical opinions on project management.
Also consider that juniors are all bright eyed and full of optimism and certainly tend to idealize things at first.
Then experience, hardships, victories and org politics teaches them the 'real' game and hopefully they use that experience to their advantage. You become a cautious optimist. And not a cynical ol' grumpy bastard like me.
On skill development: I mainly think of it as an exercise in emotional management, just like procrastination, or physical activities, and so forth.
It doesn't seem to ever become easy for me. I am always running into challenges and difficult obstacles once I overcome the procrastination issue. I am bullhorned about it, so I'll eventually get through. That, more than any particular strategy for learning, is the most important in skill acquisition.
Another component of skill acquisition is skill retention. You'll get rusty when you don't practice your skills, and in enough time, you'll lose your progress. This is probably more than anything else, a lifetime commitment so that you don't lose your progress in the knowledge or skills you picked up, so that in the long run you become better and better over time.
Think of it this way: You learned 10,000 useful "stable" facts about the world one year. Next year, you learned another 10K facts. But retention is exponential. Practice it long enough, the facts will last a lifetime.
Suppose a person have no strategy for retention. Let say he learned 10K facts, 75% decays away. Next year, he learned another 10K facts, but another 75% decays away. So he retained only 5,000 facts, but you retained 20,000 facts. Obviously, this is contrived, but it does illustrate why colleges and high schools aren't very effective. It's not that they don't teach, it's that the students forgot what they learned as soon as they finished a course.
I often get interested in a subject matter and then drop it some point. This often result in surface understanding of the subject. Just enough to sound smart. However the knowledge is retained. Should I ever return to a subject, I'll retain the knowledge from scratch, as sometime I do.
Sometime I was able to keep at a subject long enough to acquire some amount of true mastery.
> the students forgot what they learned as soon as they finished a course
A lot of times this is enough to dissuade me from learning about anything I have only a passing interest in. One time I blocked out an entire two months out of free time after school in an attempt to learn electronics, by assembling a commonly produced headphone amp. A month passed after classes ramped up and I forgot almost all of it, and moreover no longer cared. I still just don't care about electronics since then, honestly, and don't know why. So in my book that was just two months I spent doing nothing that would ultimately contribute to my future knowledge. I mean, it was an attempt, but only an attempt. I never got the circuit to work in the end either. If I had known that was the result ahead of time I would have just worked on a programming project instead because I was better at programming and I wanted to finish it, and also was competent enough to actually finish it.
Unsurprisingly the majority of my college education turned out exactly like this also, but at least I got the paper in the end.
Nowadays it feels like all I care about are the things I care too much about to ever forget, like the skills necessary for my job. As in, not knowing what the point of learning all this is if I don't care enough to remember it after a month. I feel this is a horribly limiting mindset for me to have, but I don't see any way around the "not caring" part. If I know I don't care, nothing I do to sweeten the deal like gamification or dreaming of the finished project will ever work, because I know I'm only doing that because I don't care, so my mind will defeat itself.
I especially don't like it because all these people around me are learning about machine learning and all these bleeding edge technologies that are having a material impact on the world, and I just sit there unable to care, as if I'm somehow allergic to learning. It becomes a "so you're just going to deny the existence of the entire field of X because you don't care and sit around playing video games instead" kind of irrational thing. I don't know how to resolve this, or if I even should.
One thing I will never forget is me talking to someone I knew for a long time and asking what they were doing, and they said "learning about nuclear fusion." For some reason I never felt brave enough to talk to them again since then.
I agree with a lot of your points, and it's one of the reasons I haven't focused on learning Angular, React, Vue, or any of the Javascript 'build' systems. I don't have a pressing need to use any of them and they will be replaced by something else in a few years.
Regarding machine learning, that field has been hijacked by the hype train and over half of what people post online about various ML techniques is just wrong.
'Allergic to learning' may actually mean that you are immune to bullshit. In that case the best approach for learning a topic you care about is to go to the seminal work / first papers and focus on understanding it and reproducing it, then evaluate for yourself whether the reality lives up to the hype.
You're totally right that "motivation" is probably the key to learning anything. We're taught that kids have aptitude for different stuff from birth, but I think the curiosity and intrinsic motivation parts are the most important. If something is fun enough you spend the time to become good, and then people say "oh how talented you are", but in reality you've just spent a lot more time working at it.
One way I've seen I can "hack" it myself is if I stumble on things that are actually fun and it becomes a "wedge" into an area I was too shy to try out. For example "Kerbal Space Program" taught me way more about rocket science than I've thought possible, but more than that, once I understood the core concepts and could play around with them in my mind it actually did become fun. I still remember how I was doing some hochman transfer calculations to figure out when should I do a lunch to get to Duna (KSP's Mars) with the limited tech I had unlocked in the game, and a sudden realisation hit me, I'm actually doing rocket science math for a game ... This got me into reading about rocket engines and I ended up reading through the whole of the "biblical" Ignition book just for fun.
Now I'm a web dev and as far away from Aerospace as you can probably get and still be somewhat of an engineer, but it opened a would of interesting news, data, discussions and theories at the bleeding edge of science, for which I'll be eternally grateful.
I guess what I mean is it's possible to start caring for something that's outside of your domain expertise, you just need to find somethings that's fun enough to keep you there.
You would probably care if you found the utility of the knowledge you’re about to acquire in order to acomplish a goal. Or at least that’s how I operate. I don’t care either about machine learning because I don’t have any personal project or anything that I am itching to acomplish with it.
Look Mr Blogger, take this in the kind hearted intent it’s meant by a 40yr old engineer who doesn’t have time for bullshit anymore.
Get to the point, fast and quick.
I’m sure you have many valid and interesting points of view about your job, experiences, and wants. I’m interested to hear about them. You could offer some unique experiences I can learn from or maybe there’s some tidbit I can offer you.
But unless you learn how to get to the point first, I don’t care. Even now after 3 minutes of perusing your entry I’ve lost any sense of what it was about.
To finish up, I’m not trying to be evocative, negative, or anything. I just want to encourage better ways of writing, thinking, and publishing.
Always consider your readers first. They don’t have as much time to parse what you write as it takes you to write it.
Sending a letter would take weeks, so it was important to make it count. Newspapers with long articles made more sense when anything written was much more expensive.
Long form is good when it helps the story and helps the story.
The problem I had with this story, besides that I don't think I buy the model of reality it's proposing, is that it doesn't get to the meat(The Expert Beginner) until past the halfway mark. The first 7 minutes wasn't particularly interesting or critical to someone understanding the subject. The bowling analogy was long and not necessary to explain a very straight forward idea.
From what I can tell, a "low hanging fruit" analogy would have been more apt and would have taken a short paragraph to preface the main content.
That aside, there are some reasons I have to not agree with the article.
Not to discredit the author's experience but, in my experience, I just haven't met anyone who believes they have reached expert status but is still a beginner. Pretty much every programmer I've met has some degree of imposter syndrome and, while most have some opinions about what makes "good code", I don't find it common that programmers have a strong belief in their own expertise. Totally subjective, I know, but that's one way in which the story just doesn't reflect my view of reality.
> They come to the conclusion that they’ve quickly reached Expert status and there’s nowhere left to go.
I just don't think I've met any programmer who thinks there's nowhere left to go once they've achieved a perceived status.
Moreover, the end of the story seems to conclude that "expert beginners" are the problem, as opposed to the symptom, although the author does recognize that somewhat via the "dead sea" effect. Looking at this from an economics perspective, the so-called expert beginners are the way they are because they're not incentivized to do better. If there was economic and internal political pressure for them to achieve supposedly greater things, they'd be more likely to do so. Having worked for some "dead sea" companies, I have to wonder why any beginner would want to effectively work harder for a company that pays an intermediate salary, makes advancement difficult, and does not reward excellence. The choice to dick around, not spend energy improving, maintaining the appearance of experthood having "worked on that tool" or having been around the longest, while collecting a reliable paycheck, is the most sensible one for those who don't live and breathe code.
The article comes from the angle of someone who lives and breathes code, blaming the programmers who aren't true believers, and leaves out the fact that the supposedly better programmers don't stick around to fix these situations.
My point is that you could turn the article around on itself to say that the "dead sea" problem, and the problem of "expert beginners" lingering at companies, is at least significantly caused by actual expert programmers.
> I just want to encourage better ways of writing, thinking, and publishing.
You could use more encouraging language. Phrases like "I don't care" and "[don't] have time for bullshit" make it seem exactly like you're trying to be negative.
I'm not trying to say anything, I just want to make you do better.
Always consider people who are different to you. Maybe they have so little time for bullshit they won't even bother being negative about someone else's writings from 8 years ago.
The author of that article clearly can describe his thesis in 3-4 sentences. He does so on the middle of the text.
But he decided not to add a summary at the beginning of the article. This is a perfectly valid option and helps him making his point, even though it did reduce his audience.
I'm currently into learning how computer audio works. Learning to program things like mono -> stereo conversion, panning the audio, normalizing, generating binary sound files,..
Currently going through a book (The Audio Programming Book) for all of this, doing it in C and then trying to make my own version in Go.
The reason I say "define significant" is because these are all new skills I am acquiring - but I'm doing so just for the fun of it. It's not something I had to learn for my job.
I actually have it planned to do 2 things a day, even on weekends. One technical thing (new language, IDE, shortcut, etc) and one larger project based thing. It doesn't have to be much. Even 2 minutes is fine. That 2 minutes tends to lead to 30 minutes.
I'm 60 next month, and have been programming for 40 years (everything from Basic, Cobol... to C#). I'm currently having a blast learning Java and Android programming.
Two weeks ago I learned how core dumps work on ELF-based operating systems. Last week I managed to write C code to produce symbolic stack traces from core dumps on at least 2 different operating systems and 3 different CPU architectures. This week I used that to identify why the Python interpreter is core dumping on an embedded target.
I'm closer to 60 than 50 years of age and am closing in on 40 years of professional software development experience. I like to think I can still learn new tricks.
Big significance: docker last 2 years iirc. It makes development and publishing very very flexible and easy. It's not an argument for me that it's essential in server based development.
Less significant: application locking with redis (redlock) last month. I've had a picture of it from long, but I'm surprised how neat and stable redlock is designed.
> As such, Advanced Beginners can break one of two ways
Perhaps a more clear way to think of that is in terms of comfort and bell curves. The left extreme of the bell curve is easy to both identify and understand for anybody beyond the left end. Those are the people at the low end who perform below accepted baselines.
Less well understood are people at the right end of the bell curve, who drastically out perform other developers. In all objectivity the people at the right end of a bell curve have as much as in common with the median population swelling into the middle of the curve as the supposedly incompetent people on the left end.
Think of this in terms of risk and popularity. When you are below the middle of the bell curve everything to the right of you is better performing. You can increase your performance by moving closer to the middle of the curve by doing what is popular.
Once you get to the middle of the curve you have to make a firm decision: remain comfortable in your current posture and let popularity dictate your approach or take risks to further increase performance beyond the population median. In that regard the populations at both the extreme left and right ends of the bell curve are doing things that are extremely unpopular. You cannot become an expert without fully embracing that reality.
An expert beginner is a person at the median of the bell curve or just to the left of it. They have mastered their skills to that point and refuse to make changes or take risks necessary to advance further.
As a front-end developer I frequently encounter expert beginners. People who have mastered some framework/convention, but doesn't really understand how their technology really works and are hostile to improvements that don't make use of their favorite framework/convention. To outside observers the expert beginner is clearly identifiable as performance is objectively measured with numbers without regard for approach.
Also any discussion of software competency without market analysis is incomplete. We have seen a big change from indy culture towards monopolies and their rules in the last 10 years. Almost all developers are required to play by the rules or Google (Chrome, Go, k8s), Apple, AWS.
I suspect this is intentional. What is contained in the article doesn't age out.
As a counter-point, the best article on salary negotiation _ever written_ [0] has the timestamp in the URL, which undoubtedly dissuades people from reading, given that it was written eight years ago.
If a potential reader avoids the article because of it's age, they're poorer for it.
IMO the author is doing the world a favor by not time-stamping the article.
Writing software is a bit like playing multiple sports. You can be good at one thing and poor at another, and as a result do great work on one project and be mediocre on another.
Writing code in the small, optimizing; architecting for change; architecting for scale in development; architecting for scale under load; architecting for scaling out vs up; all different skills.
Writing code functionally, vs procedurally, vs message oriented. Writing code with control flow vs data flow, and toggling between them. Crafting abstractions vs composing them. Many small parts put together elegantly vs one straightforward transparent monolith. Some skills are alternates, you can go either way and get as good results.
There are people who only know a few things. But on a suitably scoped project, that may be fine.
and it doesn't contradict the article. If you have always worked in one paradigm and think you are an expert in it, learning new development skills can make you see you were not that good in your previous area.
I consider the most reliable evaluation of expertise is working code. Something can be beautiful, but if it doesn't work, or doesn't solve the business problem, it doesn't count. If something objectively scales, I believe that the people responsible for building it are able to build that thing that scales.
If those people learn new things, they might learn how to do the job better. But maybe better isn't what the business needed. Maybe it would be better to invest that extra talent in something else, and hire people with the original skill level (who may be cheaper) to do the original thing.
This all might sound like an apologia for not learning new things, or limited developers who can only build a few things. In some ways, indirectly, I'm arguing against an unfounded arrogance or feeling of superiority which is driven by following the fashions of programming as a pop culture. But more of what I'm trying to get at is that the "best" isn't actually required, a lot of the time. And sometimes the best can be the enemy of the good; doing things the "right" way, according to an orthodoxy, can actually interfere with getting things done. And newcomers to orthodoxies can be - usually are - the most religious.
I've seen LOTS of beautiful code that doesn't work... in the real world, usually because it doesn't check the assumptions it makes. Is the data what is expected? Do the code's parameters span the space they should? Does the code inform the user of errors usefully and gracefully? Is it well documented, intuitive?
In my experience, when it comes to code, beauty and durability are natural enemies.
Sounds like you're contradicting the analogy but not the main point.
Many people would be completely happy with bowling a 160. In many contexts that's a great outcome.
But if you as a developer want to break past the equivalent stage of (beginner) expertise in any of the possible specializations or fields, you have to understand how to keep learning past the "know enough to be dangerous" phase.
Writing code functionally, vs procedurally, vs message oriented. Writing code with control flow vs data flow, and toggling between them. Crafting abstractions vs composing them. Many small parts put together elegantly vs one straightforward transparent monolith. Some skills are alternates, you can go either way and get as good results.
Many developers stop at one paradigm and avoid stretching themselves further out of discomfort. Other developers learn a new paradigm but never reach the point of understanding its limitations, while having convinced themselves that they're an expert on that paradigm. From what I've seen it doesn't really matter which paradigm, language, toolset, or discipline you're talking about, this particular behavior happens all the time, and it matches the "expert beginner" label pretty well.
Correction: not different skills: some of these are domains and subdomains; others are approaches; others are approaches and (sub)domains. They are all mixed up in your answer, which I found to be very insightful, by the way.
Although I am admitedly far from an expert in the field in question I am not a layperson either. I say the types of activities you mentioned are of the same group of skills, in different domains, which often requires a different but similar set of approaches (based on both convention and the subtleties of the domain).
For instance making wrist watches, grandfather clocks, steam punk sex dolls, and the ankagathera(sp) machine are different use cases and require different types of mental projections and organizational methodologies in execution (approaches), but the skillsets have an undeniable amount of overlap. They overlap more with each other than they exclude. In SQL terms the size of the output of the inner join is much greater than the same for the outer join. Therefore you can say that they are of the same skill set, just like doing abdomial flexibility helps with running and bicycling hill climbs helps your breast stroke. Different muscle groups, but share many types of synergy: all part of physical fitness.
Source: 10 years as a learning specialist in business setting and aspiring triathelete.
If you have less than 5 years experience doing anything, it's safe to conclude you are not an expert.
If you can't identify a single person who is better than you at something important you need to do, then you are a probably a terrible judge of competency and therefore not an expert.
From my personal experience, are you still writing things the same way you were six months, a a year, two years ago?
I look at code I wrote a couple of years ago, and not only can I identify how I would write it differently, I can identify /why/ I would write it differently - both what technique, concept, or methodology I have since learned, and how that would make the code better.
If you cannot, you have probably plateaued, like I did for a (far too long) while.
I noticed yesterday that I've implemented the same type of CRUD API call in 3 different ways in code I've written in the last 2 years. And I can see why I did that and what I was trying to optimise for in each case. I'm sure I would write it differently now, but would I write it better? I have no idea what "better" is any more. Faster? Easier to read/maintain? More loosely coupled? All of these?
I spent two weeks building a Go version of Webpack last month because it was either that or implement Webpack because the Vue components we're writing needed unit tests. Was that wise? It works fine, I don't have the gajillion shitty dependencies of Webpack, and it compiles, bundles, uglifies and minifies our entire Vue front end in <200ms but is that a good thing? Was I an idiot reinventing the wheel, or was I wise avoiding exposing us to the insanity of npm? When it needs maintenance in a few months and I have to spend a few days fixing it, is that time wasted, or have I saved time because every time Webpack updates a version everything breaks and we don't have that hassle?
To me, that sounds like you've hit a ceiling in your current stack, and probably workplace, and lack examples of people around you to learn from. What the solution to that is depends on your situation. Change of workplace? New career direction? New hobby?
> I have no idea what "better" is any more. Faster? Easier to read/maintain? More loosely coupled? All of these?
"It depends." As a gross generalisation, most juniors optimise for their bug-bear of one of these at the expense of all of the others. Most mid level devs try to balance them out, and hopefully, most seniors pick which ever is appropriate for the task at hand, with an eye on the long term consequences of their design - if there even is a long term consequence.
Re webpack replacement; Given the amount of time I've wasted dealing with webpack and it's madness, I'd back you up and say it's probably a net win - as long as it's documented enough to avoid the bus factor. It's not like golang is some esoteric language where it's impossible to find devs for.
P.s: I want to clarify here that I'm not necessarily a good programmer, I've just spent enough time stuck as a niche programmer & probable expert beginner and fighting my way out of it that I recognise the patterns. I'm probably a better study of dev behaviour than actual dev.
being the only senior in a tiny startup, I'm definitely lacking examples. I think I'll look for a Go expert freelancer to be that, when the startup is making enough money. Thanks :)
Well you could separate out any internal parts that can't be shared (secret keys etc) and put it out on a service like github. This might help you understand where you are at in terms golang and building something generically useful like webpack.
Have you grown in skills or just applied what you already know again and again? If you are doing something the same way you did a couple of years ago, chances are that you are repeating a year instead of growing.
Kinda the same thing over and over again, but in different ways. But then, like every commercial coder, I mostly spend my time building CRUD apis and front ends. But how do I know that this is growth as opposed to random brain spasms?
As said in one comment, PART2 (link at the bottom of the page), is where this begin to be added value compared to the existing theory.
That being said, very great article that describe well and nicely what I have personally experienced in a sme company that was bought by a big tech group at some point:
- when I arrived, the core team was already there with some having personal ties. A few beginners that took the mediocre manager as mentor, that took himself his manager as mentor
- they learnt by themselves, mostly there, they were responding to diverging opinion with anger.
- over the years, a few 'outsiders' arrived and try to change things by showing the problems and explaining that outside world do differently.
- but each of them had to face the seniority argument reinforced by the group effect to justify that they can't be wrong.
(Listen, we are 3, you are 1, it means that we are right and you are a pain in the ass to think otherwise. Doesn't count that you say that out of the company are unanimous on the subject...)
The worst (almost funny) case I remember was that:
- Person 1 (p1) and person 2 (p2) have a disagreement on how something has to be implemented.
- p1 is the boss favorite, so he is always right... so his solution will be implemented. No one listen to p2 that says that it is an inefficient idea, possibly problematic and that is why no-one does it this way outside.
(No-one? In fact they found one case over 100 of outside projects that did that, so that gave them confirmation that they were right...)
- p1 engine solution is implemented and p2 has to do a component working with that, but that does not work well at all, very slow for basic operations, lots of unexpected deadlocks and issues like that. Another manager complains about the issues.
- P2 decides to give a try reimplementing the engine with his solution. That is completed is no time and it is excellent: performance x1000, no lockup, no more issues with basic operations.
- results are shown to mediocre manager. But instead of accepting and going this way, he blocks the thing and can't accept that his favorite was wrong. So says that there should be a bug in P1 implementation and give him as much time as needed to test and look at it.
- after 1 months, P1 did everything he could with his solution to fix it without using the solution of P2. He comes proudly with his engine is now 10x faster than initially.
- but so, 10x vs 1000x is a no match, and P1 solution was still rigged with issues. So it is finally P2 solution that is used 'out of choices'. BUT... as manager still does not accept that he and P1 were not right. He said: ok we use P2 solution, but you will have to embed and support P1 implementation in the final product. Not to be used but maybe one day...
- conclusion of the story? Evaluation time arrived. Did P2 got a good eval? That would be logic, he saved the product, gave an important perf and stability boost to the solution. But no, he got the worst! Manager said that P1 had to take depression pills because of P2... Not because his solution was wrong and couldn't accept, learn and improve from it. Buuuut: P1 got the maximum grade!
I personally think there are multiple reasons for this situation.
* It is fun to learn initially, to see something new working. Once you get something working not many people see fun in spending a lot of time in getting it to work better.
* There is huge amount of introductory materials (guides, tutorials, examples) but the amount of available materials falls drastically as you start to progress.
* Only some people are able to actually think in abstract terms required to "create" new knowledge based on existing facts. Beginners can advance quickly by "recreating" -- executing tutorials, copying existing code, etc. It is relatively easy to use these as building blocks for a simple application. But as you progress you have to figure out more and more new knowledge, understand underlying principles. This is what many people either don't feel comfortable doing or don't feel is necessary to do or are just plainly incapable.
* It gets more difficult to work with other people in your team as you create knowledge in a given topic. There is tendency to push back when team member tries to introduce something new that is not clearly recreation of accomplishment of somebody else available on the Internet.
* Creating new knowledge in the topic is a huge risk in that it is unknown payoff for large amount of honest work. There is not much risk in following existing tutorials, it is pretty much guaranteed that it is possible to recreate accomplishment others did. When you create new knowledge (for example new patterns, principles, guidelines) it is likely you are going to make mistakes. This fact may cause people uneasy and dissuade them from further advancement in the topic.
* Getting mediocre in any specific topic is frequently seen as good return on investment. For example, as an architect I would maybe not want to get expert at any of the frameworks I know. I see this as a reasonable tradeoff which allows me to tackle other problems as soon as I think I know "enough" about particular topic.
> * There is huge amount of introductory materials (guides, tutorials, examples) but the amount of available materials falls drastically as you start to progress.
Aye. My coworker described it as being able to find 100 guides on how to hammer nails and build a small bench. "Shed building for beginners" or something. But then the next exercise is "build a house" and the one after that is "build a shopping mall".
I was assigned to work on machine learning three years ago. Literally an overnight "the project changed, you're doing this now, here's the project update memo for your contract."
Your post exactly describes ML on the internet: first you find a billion "check out my intro to ML" Medium articles and git repos that spin up OpenCV on Tensorflow ("small bench"), then you move to the Tensorflow docs ("build a house"), then you move to Arxiv.org ("theories of city planning"). Once you step into that middle zone, you're basically stuck reading academic texts. As a 50-something engineer, it was a kick in the balls getting started with this stuff. Fortunately this contract is related to hardware optimization, which I've been doing for decades, but this particular variant of it was a curve-ball.
It is an interesting back-and-forth: I find myself exchanging information with lots of new-college-grads (permanent hires, not contractors) that all have sharply coiffed beards and heavy denim jeans. Two of them are pretentious and fight to be top dog (which is hilarious from my old, jaded POV), but the rest are genuinely good kids that want to learn, and vice versa, teach me what they know. It's fun. I'll miss 'em when my contract ends.
I think the biggest reason is demographic in nature: The rapidly expanding population of professional programmers means that programmers are regularly building their skills on third-hand advice while simultaneously encountering situations nobody they know has seen.
In such a climate, they aren't really competing for the job on the basis of merit, so much as they are posturing that they are a good candidate - because they learned that that's what one does to get work and protect their family. And there is so little expertise around that nobody can call them out. When they get hired, the posturing turns into gatekeeping in short order. They aren't curious about the work, they just want to keep the position. When you fill the ranks with uncurious individuals you get stagnation, because nobody is pushing them forward.
In other professions the process of education and certification cuts most of these people out early on, which comes with its own downsides but does impose some minimum standard of capability which they may go on to use or misuse. But the problem in programming is that the tools of programming address a multitude of problem domains, outstripping what could be reasonably certified - that's why the profession has gotten so big, so quickly. It's all research, all the time - independent, unverified, unscientific research.
In response to this we've ended up with the whiteboard coding interview, which basically aims to do the task of certification within the span of a few hours. It's not very good at that - these interviews are run in an inconsistent and often unprofessional manner too.
My problem is that I’m expected to learn so many things that I never have time to become an expert in any of them. Html, css, sass, JS, Vue, Vue router, vuex, react, other react libraries, lodash, jest, webpack, Python, node.js, Java, sql, Oracle, Postgres, bash, regex, docker, kubernetes, aws, azure, etc. ad infinitium.
Looking at that list I’d say learn html, css, js, js browser apis like DOM, one backend language, sql, and Linux sysadmin. IMO if you understand those you get a lot of the rest by looking at where they fit and you can build a solution without having to use a lot of product-specific APIs.
Oh, I already “know” all of these things (I’ve been doing web development since the mid 90s). But it seems like as soon as I start to get a decent grasp on a technology, a new version comes along, or it is replaced by something new, or my boss/company directs me to use this other technology, or the industry as a whole moves. SVN > GIT, jQuery > Angular > Vue/React, JS > ES2015, managing our own servers > the cloud, etc. Jack of all trades, master of none.
It's like saying you are expected to ride a bicycle, electric bike, a scooter, a car, a truck, a minivan…
Not exactly, of course, but there is a huge overlap, especially in concepts.
It's not knowing how to "ride" all of those.. it's knowing how to "FIX" all of those. And that's where it gets tricky, while each might be similar in some way (they have wheels and maybe an engine), the vast devil is in the details.
What is a good developer? Isn't there more than one axis? For my case over the years I have honed my skills at problem solving, seeing the big picture, and finding the most efficient technical solution from a business perspective (not GAFAM scale obviously, but that's the exception). As a result, I can save companies a lot of time and money because I will help reshape the problem and rework the scope to find the max added value / work ratio, to deliver in days a working solution, instead of a big year long project with all the overhead. My productivity is high because I know where to cut the crap.
More than once I have seen a peer or a whole engineering department of brilliant people going down a technical rabbit hole for weeks for intellectual satisfaction, where instead I will just take a step back, walk to the manager and try to work a different take for a solution that can be implemented in a few hours/days even if the business goal is slightly moved.
Yet I'm definitely not a good professional software developer in terms of code "quality", and don't consider myself very smart compared to my peers.
That were exactly my thougts when I started reading the article. If you have a great developer that will leave on the first sign of trouble, maybe you're better off with an average developer that will understand the business needs and will "averagely" do it's part in solving whatever problems exist.
Most businesses don't need "great" developers. They just need to get the work done.
Getting someone who is really skilled can of course be beneficial but it certainly has the problems of retention, things like providing interesting challenges, high compensation. Not all businesses have deeply interesting technical problems. That's fine. There is plenty of use for the wide parts of the bell curve fpr both businesses and developers.
Yep. I once worked at a manufacturing company. Their clients sent order information via an FTP server. The orders were formatted as flat files, aka just simple text files. I had to create code that painsakingly looked through each format and imported it into the new ERP system. Every vendor was different in each flat file. I'm sure some had similarities, but abstracting the logic was more dangerous in this case.
A lot of business software is boring. It does not take skill to do. It only requires someone to know a handful of tools and be willing to put in the time. So my advice to non-FAANG developers: if you want to make development your career, learn to be bored. Still work on marketable skills, learn new languages, etc. But remember that not every task will be an interesting new technical issue, it's probably going to be something you've seen a hundred times before.
>So my advice to non-FAANG developers: if you want to make development your career, learn to be bored.
is life at FANG really that different tho? Can't imagine that everyone is working on exciting stuff all the time. Would appreciate if someone could enlighten me.
I can speak for only one of the FAANGs, but the work I do there is definitely the most exciting to me personally from all the companies I've been at. There are challenging technical problems that require discussion with other engineers to design a solution. In most companies I've been before the challenges were mostly organizational and I had to deal with all of the "agile" crap to please PMs and managers, while the actual technical work was boringly easy.
It's not always rainbows and butterflies here either but I do feel much happier with the work I do here.
> A lot of business software is boring. It does not take skill to do.
I guess it depends on your definition of "skill". ERP systems are complex, full of problems, inflexible and managed by bean-counters with "battle-axe" personalities. If you look at the work holistically, it does take skill and experience. There is a lot of room for improvement in these systems but the problems involve people as much as they involve technology.
Maybe if you have a lot of money lying around. But in my experience this enterprise forms of development leads to ballooning team size and mediocre software.
The same software build by a small team of experts would cost both less, and lead to a high quality result.
I agree with this. It's probably better to have an average, good developer who is reliable and consistent, than a brilliant developer with risks of overengineering a product or system, burn out, poached, or seek new pastures.
It might also relate to intellectual satisfaction. A "great" developer could be hungrier in that sense, that they need worthwhile projects to challenge their skills - and may get bored more easily.
That's been my experience as well. I've worked with some clever and / or highly effective (= fast) developers, but in practice the applications ended up overbuilt (like the tech lead who spent six months under water, only showing up to the office maybe once a week, while he was building a framework), or applications with a lot of features but missing the foundations (e.g. microservices architectures but with no end-to-end tracing, testing, interprocess communication standards, logging, etc).
These are not the qualities of an expert according to Dreyfus’s model (As referenced by the article). According to the model, as you gain skill you also gain the capability to bear responsibility. A beginner programmer can be responsible to program to a clear spec / wireframe. A senior dev can be responsible for making the client happy. It’s not obvious to a beginner, but those are very different tasks.
If you spend 6 months working on the wrong thing, you aren’t taking responsibility for delivery. It’s a mistake that most smart programmers seem to fall into at some point in their career, when they’re still learning. It’s a classic sign for me of a mid level developer made into a tech lead before they’re quite ready for the role. I’ve seen that happen way more often than I’d like.
If your tech lead is making mistakes like that, your team is operating without a real senior dev at the helm. That’s not insurmountable, but don’t mistake that sort of thing for real expertise.
Why would they? it’s still cheaper to have a talented dev overbuild a framework than it is to find bugs in the code of someone who didn't understand the problem they're solving.
You nailed it in the first sentence - businesses don't need developers, they really need problem solvers - but we often don't get a seat at that table to turn around a problem before it lands on our desk as a request to code some poorly understood idea someone had.
1) Identify the problem - it invariably isn't to do with code but a combination of time and cost.
2) Can the problem be solved without a line of code, such as changing the process and removing the issue that way?
3) Is there an off-the-shelf application, software or component that will solve the problem.
4) Maybe you do need to code something.
We are also all too quick to just dive straight in at (4) because that's what we identify as, that's what we enjoy and unfortunately what we get paid to do rather than getting paid to think, advise and value-add.
Some ideas that look poorly thought out are in fact pretty good, just different from what we would do ourselves.
In my experience it is a key skill to objectively evaluate ideas that are different from my preferences and accept those that are good enough, but not use my preferred way of doing things. This is a quick path to get a seat at the table and getting your opinions heard. My 2c.
I agree with your sentiment and yes, a workable solution is always the best solution. Idea was probably the wrong word, it's the highly vested, fully formed solutions that I've had issues with.
Also, in saying that, I do believe domain knowledge is far more valuable that programming chops, and not understanding the domain to be able to translate that into an application process is worse that someone with domain knowledge trying to come up with how it should be coded.
Some of the best projects I've worked on involved a lot of sitting and drinking coffee with the domain expert.
I think the problem is that getting the information from the domain expert and then running and programming with it is doable, but the domain expert cannot ask you for advice on programming and then build an application (at least not in the same timeframe).
> Some ideas that look poorly thought out are in fact pretty good
The only times I've ever found that to be true is when there's other details available that I'm not aware of. Business constraints "everyone knows" about but aren't documented anywhere, for example. Decisions made in a meeting that aren't communicated out, meaning, essentially, that you only are given a portion of the problem and request. This gets back to the 'seat at the table' concern above.
The 'seat at the table' is far more related to interpersonal/political skills than technical ones, but can be chicken/egg in some places.
My opinion is certainly skewed by my personal experience, so take it with a grain of salt.
That said, engineers are a highly opinionated bunch and a group of 5 will have 5 different personal preferences. But they are smart and will quickly recognize an objective opinion that is not hard-driven by personal preferences. Folks with good technical judgement who are willing to accept a different approach quickly become a highly respected member of the community. They frequently end up with more tables offering them seats, in a technical expert role, than they care to occupy.
This is one of those places where strong opinions, loosely held should be applied. And I can imagine those people getting more invites simply on the basis of possibly being more agreeable to interact with.
Programming is an abstraction (a perspective on what the computer is really doing) that is very much shaped by the tools we choose to use. Meta-religion is probably a fair way to describe it, and can be every bit as divisive in some circles.
Has anyone ever seen a medium-to-large-sized company, in any industry/vertical, that's solved the "[Engineers] often don't get a seat at that table" problem?
Anecdotally, because I've brought up this issue a lot, I've heard many responses from bother sides. From some engineers, not in the room: "I would never want to be in the room, because then I'd have to work with those people". From other engineers: "They'd never want us there, we're just resources to be used."
From the non-engineers who are in the room: "we didn't know you wanted to be there, of course you're welcome", or "we didn't want to interrupt your work for such a high-level meeting".
I find that the reason for exclusion is either incompetence (in which case, get out), or a lack of awareness that certain engineers are exceptional sources of opinion, in those rooms.
But I've never seen a culture that's pushed engineers into those strategy meetings; it's always been opt-in rather than opt-out. (It's always opt-out for the product org).
In my experience I don't often hear: "They'd never want us there, we're just resources to be used."
But: "Damn those stupid meetings again, wasting my time."
It is like a lot of developers don't consider meetings part of job. I am currently less and less into actual typing of code and much more into understanding what others are trying to accomplish.
As engineers, we are spoiled in that we are accustomed to (1) navigating high signal:noise ratio environments (2) systematically improving the signal:noise ratio in environments where it’s poor.
On (1), many corporate meeting rooms have terrible ratios, and so they intuitively feel unproductive. On (2), it’s much easier to improve the ratio in code than it is in words spoken by people.
It requires a lot of patience, but in the long game, engineers do improve that ratio in meetings and strategy discussions, and the company benefits from it.
My theory is that most engineers are not interested in playing the long game, because (1) it’s not as fun (2) they don’t plan on being at the company on time scales where the investment will have been worth it.
While I personally don’t emulate their behavior, I think the developers you describe could conceivably be acting perfectly rational for their career goals.
Ever considered that everyone is doing everything all wrong and you're just feeding into the frenzy?
That's where I've come as a professional. I couldn't give a fuck any more about anyone's problems and I've learned that it has everything to do with creating pathways for people to communicate.
People are difficult creatures and academia has made us into basket cases unable to tie our own shoelaces without help from someone who will evaluate us and dangle a carrot in front of us for the effort.
How about getting over yourself with your corporate lorem ipsum and use the technology at your disposal to fix this dumpster fire of a planet we've made for ourselves?
Software isn't going to fix the planet. That was all bullshit to make rich people feel better about taking most of the USD funny-money. Strong centralized planning in the form of a functioning government, structured around resilience, erring ever on the side of direct democracy, fluid representation, and lifting economic victims over perpetrators in power is what will fix the planet. It's common sense. The software will simply be reduced, so people stop building the same thing over and over: it's stupid, always has been, and the cries for more devs were always just to make it cheaper and more disposable.
Omg... you so good! you so profitable! you so effective! you know where to cut the crap! and yet so humble - you say you not smart, but you so smart! Yes, other devs so stupid going down the intellectual rabbit hole.. I think you not take step back, you take step up! You stand above! Other devs overengineer... you put all in one file! Need to find something? No problemo, just ctrl+f in that file. So easy, so clever, other guys so dumb.... Other guys use OO? Buh! Bad! You do the else-if-dance! So pragmatic. Others use a parser, you go regex... so good, so fast. I save money, you guys suck... I have the best words...
Well.. it's not like your comment bursts with cleverness either. But yeah, I clearly overdid it... I just got triggered by that presumptuous comment. I'm really sorry, but I have to work with code written by these "pragmatic, quick 'n dirty"-people everyday. Yeah, the kind of guy who is liked by the management because "they get things done"... IMHO people like that can go and write a poc.. or something that can be thrown to the garbage, but not something that has to be maintained over many years by a lot of different people. Please keep them away from anything serious. Their short-term pragmatic and profitable solution doesn't come for free - it is based on the debt left for others to pay in the future... I am not saying there isn't such thing as overengineering. There is a lot of that too, rest assured that I've seen it more than enough. But overall, I've seen 10x more code that is hard to maintain because it was written by a "cutting-the-crap" guy compared to a something that is problematic because it was overengineered... anyway, that's just my opinion.
When I was starting my career, one of my first jobs had two clear career paths for "programmers": Business Analyst and Software Engineer.
A Business Analyst focused on figuring out business solutions and constraining those to realistic technological limitations.
An Engineer focused on architecture and implementation.
Seems to me you just chose the BA area of expertise... there is a lot of value in that, but the Engineering side is just as valuable in my book as if you have great ideas and plans but the actual engineering is poor (and vice-versa), your company is going to suffer.
> More than once I have seen a peer or a whole engineering department of brilliant people going down a technical rabbit hole for weeks for intellectual satisfaction, where instead I will just take a step back, walk to the manager and try to work a different take for a solution that can be implemented in a few hours/days even if the business goal is slightly moved.
What do you do when management doesn't want to move their business goal? Now you look like you're incompetent and incapable of just doing the damn thing they asked for.
Asking rhetorically, not as criticism, but because I've been there and it fucking sucks when the people who aren't working on the problem think they might have a better understanding of the big picture than they do.
I think that there's often something simpler going on here. Some people are simple and small-minded, they simply do not enjoy learning new technical knowledge and skills, and would rather run what they have to failure even if it means losing out on a lot of income.
A fine example of this is a new hire getting anxious and defensive because the git branching strategy at the company isn't the branded one they're accustomed to (e.g. git flow).
I work with an expert beginner and I don't know how he's survived. He's got about 30 years of experience, but writes code like he's got 1 year of experience.
His code has absolutely no sense of quality, doesn't employ any sort of standard design patterns or style, has no semblance of architecture and is an absolute hacky rats nest of code that falls apart with any change because of how interdependent it is.
The other day I was sent some of his updated code, which had no version control and had randomly added an extra 150 files to the project. It turns out the majority of those files where duplicated from elsewhere in the project and apparently it was my job to find where the changes were among that mess.
It's like he learnt to program decades ago and then never opened a book or looked at anyone else's code since.
And he's still got a job. So who's the real genius here?
I don't want to be that guy, and i don't want to work with that guy, but i have to confess to a certain jealousy that people like him have figured out how to sit back and just phone it in and collect pay cheques for thirty years.
If he has any degree of self-awareness then perhaps those 30 years were riddled with anxiety over losing the job and not being able to find another one.
Yeah I genuinely don't understand it. His work is universally panned in the team, he's had multiple disciplinaries against him due to low quality work and keeps scraping through.
I could never be that person, I always strive to improve and become better.
Ah. I think it's an example of how you and your employer use different frameworks to attribute value to what your co-worker brings to the table.
Whereas you put focus on aspect such as maintainability, readability, adaptability, testability,... of the code he's writing, your employer might simply keep him around either because his code, well, simply "works" to a degree that is satisfactory, or because of a complex interpersonal relationships which have been established over decades turning him into much into a fixture.
Put more succinctly: No one wants to know what goes into making a sausage.
That is, there's little value in explaining or arguing the fine technical details of code optimization, architectural design, functional programming, etc. etc. etc. if you don't consider your audience.
Stakeholders who rely on your co-worker's work simply want to know what his work could mean to them, and how it helps them get the job done. Your concerns regarding code quality are totally valid, but unless you, as the maintainer, will be fully perceived by your employer as a formal stakeholder in your own right, your objections risk being thrown in the wind.
At that point, it's not just a co-worker issue, it becomes a workplace culture issue. If there's a dissonance in the manner in which he's held accountable for the quality of his work by the team on the one hand, and management on the other hand, then how does that same dissonance affect how your own work gets perceived?
If he gets to scrape through, does that then imply that you're putting the bar for yourself really high, whereas you could clearly get away with doing less? Or are you trucking on despite the fact that your work is held to a different standard because there's a different expectation towards your own performance?
I think striving to "improve" or "become better" is something that only means anything if you do it for yourself first and foremost. Because that's what you want for yourself. It's a valid pursuit to want that for yourself. Whereas you have to be mindful that few people selflessly care about that desire and go out of their way to let you self-actualize that. After all, your job is first and foremost a business deal between you and your employer, and the primary reason why you are there is because your employer feels there's value in what you bring to the table.
If you work in a group, it's equally important to understand how to compromise on where you set the bar for yourself and others. Of course, in your case, you don't want to compromise on what you want for yourself to the point where you start to cross personal boundaries, lest you want to end up resenting the entire situation.
This may be an example (rather dysfunctional) of a Domain Owner. Someone, who is by historical reasons is entrusted with guardianship of the particular part of the local knowledge management. The worse the code, the more the likelihood and indeed the need for a role like this. This is clearly systemic, and is a red flag for the whole org/unit.
Whether such a Domain Owner is aware of his standing - that's a philosophical question. Job security on the one hand, inertia on the other, compounded with the very much environment that gives such role more support.
Just wish these guys are willing to share the crusts of the tribal knowledge with you, as this is where their true expertise may be. Side note: if there's this perceived disparity in the technical skill, the seniority in such org may trump the merit. There could be a way to get such Domain Owners on your side; pointing out their lack of skill is not the one, in fact this can backfire literally.
I've worked with innumerable people like this over the decades. The thing is, they're usually not phoning it in. They're really trying hard. They just suck. It looks like they're working hard, because they often show up early, stay late, ask a lot of questions, and produce a lot of output.
It's hard to fire them, because to many outsiders, they're workhorses. They know just enough to scrape by on each task, but they also have institutional knowledge and social connections that make them seem invaluable. Often that institutional knowledge is that they're the only person who understands their own shitty code. Their more-capable peers usually know that they're incompetent, but management doesn't.
There are many reasons people like this can survive. Peers don't want to explicitly throw them under the bus. The best of their peers simply move on--to other projects in the same company, or more often, to greener pastures at another company. Their peers cover for them, because it's easier to work around a millstone like this than it is to get them removed. It takes months of concerted effort to get a peer fired for underperforming. If you want to try to get someone like this fired, it starts to look like you're the asshole with a personal vendetta. Especially because they've been there for a decade and you probably just arrived.
These millstones aren't outright incompetent. On paper they've got extensive experience. Socially they're well-regarded by everyone at the company except their immediate peers who know they suck. They've been faking it and faking it well since long before you arrived, and they'll be doing it long after you've departed.
Make no mistake, though. These people are rarely phoning it in. They are busting ass to tread water. Sometimes they believe their own lies, but more often they are terrified that someone will find out just how bad they are. That's why they work so hard.
It's a matter of perspective... someone, somewhere in one of your previous workplaces, might have thought of you exactly as you think of these people. So maybe don't judge too much.
Damn, that's me in 10 years. I'm so bad at my job that my only hope is that I go by unnoticed long enough so my time in the company becomes a strong reason not to fire me. It's been almost two years so far. The thing is I really try to improve, and in some ways I even do, but at a painfully slow pace. Even though I've been in this company for nearly two years I've been working as a software developer since 2012. And it hurts so much to see people coming fresh out of college outperforming me by orders of magnitude. It makes me feel really stupid. But is a really well paying job in a somewhat big company, so I hold onto the hope that if I don't screw up things too much my employers won't even acknowledge my existence. In the end I only feel bad for the people I work with (not those I work for) because they are nice and talented people and it must suck to work with someone that lowers the team's bar.
Maybe there's a better job out there for you? Either at another company where you'll get mentoring and support for growth, or in an entirely different career. It doesn't sound like you enjoy what you're doing now.
I've stagnated at jobs in the past. I've thought it was my problem. Then I moved on to better places, where coworkers helped each other to excel, where people placed a premium on improvement and education.
If your company shoves everyone into a cubicle and assigns them individual tasks, how are you ever going to learn? If you can get a job somewhere that embraces pair programming, you might find a whole different world. You can be mentored by your coworkers and collectively solve problems, instead of feeling like you need to put your head down and produce something on your own that may be beyond your expertise.
Fresh grads, especially grads out of code schools, often arrive with a lot of buzzwords ready to go, and a script of practices they've been told are the right way, but that's all flash and no substance. It can lead to overconfidence. There's something to be said for it, though; you can fake it until you make it. The important part is that you actually make it in the end, and to do that, you need mentoring. It sounds like you're not getting the mentoring.
I know it's hard to quit a well-paid job and take a chance, but I think that's better than going to work every day hoping you won't get fired, and not growing as an individual.
I actually like this job. We do pair programming regularly, which is the source of most of my worries that I'm not good enough. My team has a dedicated manager whose job is to mentor us in our careers. I like him and he seems to like me, he is always willing to listen and to offer help. I think the company is outstanding in providing a healthy environment. Which is why I feel so out of place. Everyone is so smart and grows so notably much and I feel I'm falling behind.
"The thing is I really try to improve", that statement alone makes me think you are not one of these people.
Don't underestimate the value of slow and steady in the world of corporate development. Many fresh out of college might seem like super stars developers that know all the latest buzz word technologies, I know this is a massive generalisation, but they don't like to work on "boring" or "legacy" and often quick to jump ship to the next opportunity.
Also, please be aware that this feeling is a common symptom of imposter syndrome.
A lot of these types are the first to get laid off with the best severance packages. Do this three or four times in a career and you end up with a sizable nest egg.
Maybe a challenging question, but did you give him feedback? IMO, that's the real way to stop people from ending up as an Expert Beginner. It's not that they need to adopt a new paradigm that they don't know about. It's that they need to know when they do something that sucks. People are amazing at self correcting of they have visibility into the problem.
But when people around you enable and tolerate poor code instead of correcting it gently but firmly, you don't know what to correct.
Yes, he has had years of code reviews pointing out every thing he's doing wrong, every way he could improve and still refuses.
Refusing to use version control is a prime example. The industry as a whole has unanimously decided that version control is necessary, but he still argues that his backup of an entire directory that he does once every 2 months is more efficient
> Refusing to use version control is a prime example. The industry as a whole has unanimously decided that version control is necessary, but he still argues that his backup of an entire directory that he does once every 2 months is more efficient
For what's it's worth, a lot of people who use version control treat it as a backup system instead of as a record of logical changes to the code base with a detailed description of what has changed and why.
It's still a hundred times better than some kind of a manual process. I can at least view the history of files with good tooling and the build pipeline etc. are manageable.
Do you have support from your manager on these principles? If this isn't enforced at an organizational level, I understand why he doesn't care to do it, and I would recommend managing up so that your lead/manager understands the importance of modern coding practices.
I worked at a place where the main programmer had been there 20+ years. To this day, they are still using a language which was popular in the 90's, but you rarely see today.
The day I interviewed, he said "I know I'm not the best programmer but I believe that after enough hours on the project you will end up with something that works", and he bragged about many nights sleeping in the office on a cot he had under his desk, keeping systems running and debugging live programs.
It was some of the ugliest code I had ever seen in my life. Every couple years, they'd hire an actual programmer, but he refused to change his methods, and the programmers would eventually find another job out of frustration. It was very easy to see which code was done by the other programmers, it just made so much more sense than his code, it was documented, etc etc.
Sounds similar. So many of the hours he logged were because of trying to shoehorn features into the ratsnest of code. If he had rearchitected chunks of the code into something more logical, then it would've saved time overall.
I don't think he understands the purpose of architecture is to make future development easier, and instead thinks that if you make all variables global to be changed anywhere at any time, then that makes it easier and faster
I definitely agree that his approach to code quality is bad and he should improve.
On the other hand, he still seems to be delivering value to the business by making things work, regardless of how awful the code is, and I feel like this is still an improvement over the other extreme which is chasing hype and buzzwords while delivering near-zero actual business value.
There's a lot of developers out there like this. It's best to avoid hiring them. I think would call this person a lousy developer and not an expert beginner.
Similar to the rise of the StackOverflow programmer. You can get pretty far just by Googling error-codes and brute-forcing a problem in a domain without any experience (I should know).
Maybe not the best way to learn, but in such a technologically complex world, it can sometimes be more effective...
Even when I know how to potentially solve a problem I often search it on StackOverflow anyway because I know often I'll find a much better solution from developers who are either more talented than myself or have simply spent longer thinking about all the edge cases.
Identifying the good developer with the frequent job hopper and the expert beginner with the developer who stays at the same place seems rather unfounded. I have also seen the job hopper who left just before it became clear that his architecture was actually not all that great. Also, wanting to use the standard stuff vs. rolling out your own is more a thing of incentives. If you are a frequent job hopper it is nice to learn something standard. If you stay at the same place you will have to suffer from the standard boilerplate that the not-so-great framework requires and that has to be typed over-and-over. It is more a matter of incentives than that one thing is necessarily better than the other, I think. One great advantage of the programmer who stays is that his decisions are backed by skin-in-the-game. S/he has to suffer through the consequences of his choices.
I like these sorts of analysis, whether I agree or not.
I've come to believe though, that they need humour. There's always a tendency to over-extrapolate, get hung up on typologies which crack under weight and to assume the model is the main thing going on. Humour gives them a productive "playing with ideas" vibe, keeps it honest.
In software development, for example, I always think that demographics play a big role. Every decade we get more young programmers than the last. Many older programmers "graduate out" one way or another. The resulting demographics are unusual, with a years of experience pyramid more like the military than most professions.
Technology, methods and philosophy change rapidly. This is both exasperated by and causal to the demographics, and the youth/pace of the field itself. A lot of software culture has this relationship with the demographics. Maybe 60yo developers are more likely to produce important new things, but they are outnumbered 100-1 by 20-somethings... enforcing youth biases, etc.
I think a lot of this essays thoughts on learning might be affected by software demographics. A lawyer, accountant or aviation engineer's thoughts on learning and career progression probably encompasses much longer time periods. In software, we think in much shorter timescales. Between the age of 22 & 27, a programmer has progressed through a "career." Between the age of 22 & 27, an accountant has progressed through a cadetship.
The difference is no accountant does accountancy in their bedroom for fun as a teenager. The software engineer who has significantly progressed their career by 27 probably started as a teenager, not as a 22 year old. It's more like being a musician than being a lawyer or an accountant.
There are plenty of cases where programmers only start programming for real at a post-college job. The majority case, even.
That said, sure. There are differences in substance, history, everything. Those might be the reason for differences between professions, but the question is "how much?"
I think we overemphasize legible, logical reasons for culture, but often it's incidental reasons path dependence, demographics, etc.
I think that programmers who first start programming for real at a post college job don't make significant career progression by 27 unless they are very talented. You are looking at outliers and saying look these outliers don't exist in accounting and law, and you would be right because very few people in those professions are so crazy about them that they live and breath it.
I’m not sure the “10,000 hours/5 years” rule is a particularly relevant one, these days. Tech mutates so quickly, it's near impossible to become an "expert." Also, many developers are...how can I put this...a wee bit obsessive. It’s quite possible to hit 10K hours well before 5 years.
I liked the analogy about the quirky bowling style.
That has happened to me -several times.
I’m primarily self-taught in most of my tech. It has tended to result in very highly-developed, but narrow, skillsets. Not necessarily a bad thing, but “brittle.” It has happened so many times, that I no longer feel that I am an “expert.” I am now “experienced.” At least the first five letters match.
But it has been a long road to where I am now. Humility has been forced upon me, and I now have a lot of “narrow skillsets,” to the point that they inform each other. For example, a lot of the stuff I did in PHP has helped inform my work in Swift, and vice-versa.
I’m choosing to specialize in a specific discipline and tech stack, which, just by itself, gives me a lot to learn. I am working to develop a “broad base” in a small-ish venue, with a lot of “sharp peaks.”
It’s really humbling. The more I know, the more I know I don’t know. Also, since I am constantly trying out stuff I don’t already know, I’m a perennial “n00b.” Usually, this manifests by not always being aware of the jargon (I know the tech, but not the name). This may result, I suspect, in my being treated rather shabbily by folks in the field (It may also have to do with my age. I have found that the way people treat me changes radically, as soon as they find out that I'm "long in the tooth," so I now make it obvious to avoid that). This has helped me to just keep my damn mouth shut, and open it only to eat my humble pie.
I haven't hit that point yet. It can get pretty close to overwhelming how quickly people are building new things and it's often not clear to me what problems the new things are solving (which likely means that I don't have those problems and shouldn't even worry about those new things).
Do you remember how it felt when you had that insight that tech is not mutating as quickly as it may seem?
What I got from it, is that there's a solid "baseline" of technology/technique that tends to remain fairly constant and relevant.
It will often be "discovered" anew, and repackaged with jargon, but the basics are still the same.
My experience is that the mutations are more of an "accretion," rather than a change. New stuff is added. An old technique might be formalized (like SOLID isn't actually anything new, but the definition is relatively new), which is really a way of "adding" to the older technique. We find ways to combine "classic" techniques, or specialize/derive from them, to provide a different service.
It's hard to find teachers that will keep up with the times. As someone who has done training, I can tell you that creating a course is a fraught process. It has to be correct. That means a lot of testing/review, and often "after the fact" fixes and refactoring, as students (invariably) find problems.
Keeping it updated is a pain. Also, it's entirely possible that the entire class may need to be binned, as the tech becomes irrelevant (I have a whole bunch of DU -Apple Developer University- certificates that are pretty much worthless).
Also, scope and scale. Projects are much bigger, nowadays, than they used to be, and we have found ways to apply classic techniques in new ways. Instead of learning how to write a device driver, we learn a device interface SDK. That's not a bad thing (as long as we choose a good SDK), as it frees us to do a better job on the higher levels.
One example I give, is that I started Apple programming with MPW[0]/Pascal (not Object Pascal)/ASM. It could take a week or two to produce a relatively simple GUI app.
Nowadays, with Xcode and Cocoa, I can spin up a fairly full-featured app in just a couple of hours.
Very little of what I learned with MPW will help me today, but the discipline that I earned is quite valid, and much of what I had to do by hand, is now done in the framework, so I do have a bit of an understanding of what is going on "beneath the sheets."
I see - strong fundamentals are always worth cultivating because they are invariant under shifting fads and trends.
The thing that I find difficult is how quickly trends and fads shift in this industry. I came out of mathematics, which moves much more slowly than tech in terms of what's fashionable. I think it's a function of the sheer number of people working on tech compared to math.
I've described it as the "disappointment of knowledge" in the past.
It's like hearing all the microservices hype, sitting down to read it and thinking that it's "just" SOA slimmed down with some of the more complex vendor offering replaces. And that both are "just" Smalltalk-style message passing that happens to occur on multiple machines. Or that Kubernetes is just a bunch of nodes running processes with Docker as a process manager (reading the paper on its predecessor, Borg, was very enlightening). That C# is "just" Java that has been cleaned up.
The disappointment is that there is all this hype that would imply the world has changed and you realize that it may be a serviceable tool, but it is "just" something you've seen before remixed a little.
It's one of the reasons that I have a hard time getting excited about learning another web framework or another C++/Java-ish programming language. I can learn by diff'ing pretty quickly, so I tend to read broadly, looking for stuff that looks like it might be highly differentiated. I tend to burrow deep onto things of either immediate use or that will provide a different world-view (for example, learning Prolog will probably teach you a different way to look at problems whereas learning, say, VUE.js after having done Angular might teach you a useful tool, but the world view is more or less the same).
446 comments
[ 3.3 ms ] story [ 100 ms ] threadPART 2 https://daedtech.com/how-software-groups-rot-legacy-of-the-e...
PART 3 https://daedtech.com/how-stagnation-is-justified-language-of...
PART 4 https://daedtech.com/up-or-not-ambition-of-the-expert-beginn...
I think, that viewpoint is a bit narrow. The example, where the author tells the story how he started bowling the wrong way and reached a plateau, where he could not further progress, is a good one. And I'm sure there are numerous examples each one of us can tell of own experiences made when learning new skills.
In my opinion learning new skills fast is a great skill. And nowadays there are many resources available to us make this easy. But you will always reach a plateau, where further progression gets increasingly difficult. It's fascinating how this corresponds to larger patterns like the Gartner Hype Cycle [1].
The question is, what do you do when you reach a plateau? Do you invest more time and money? Maybe the skill level suits you well and you don't feel a need to progress further? Maybe deeper understanding is not necessary to do your job well? Maybe it's better to acquire different skills which you can combine instead of being an expert in one area alone?
I think there are many nuanced answers to that question and simply put blame on the expert beginner is not useful.
[1] https://blogs.gartner.com/smarterwithgartner/files/2019/08/C...
It’s not just about skill progression. To stay relevant and not be seen as an old out of touch developer, you have to know how and when to jump on the next hype cycle.
Is an appropriate response to not getting out of touch.
For example you can invest a lot of time in learning some kind of framework and get really proficient. Maybe that opens up new opportunities to you. Maybe in a few years the framework falls behind and you should have better invested your time in something else?
I think you can do a lot of great things without knowing every detail of a black box. And it allows you to spend your time on other things which are maybe worthwhile in the long run.
What's important is that you do not avoid digging deeper into a topic just because of pure habit. Maybe that kind of self-reflection is a trait which is less prevalent in "Expert Beginners" called out in the article.
Every framework gets out of date after a few years. It’s par for the course in technology. You have to ride the hype cycle.
This sounds pretty similar to the exploration-exploitation tradeoff in reinforcement learning (game playing AIs). Exploration comes at a cost, and exploiting current knowledge is safer, but if the agent doesn't explore enough it will have lower total score. A good exploration strategy is a must because knowledge comes from exploration.
In most competitive games with scouting you have to move up the ladder quite a bit to find solid scouting.
It's possible for a developer to be skilled beyond a level which their bosses, recruiters and colleagues are able to grasp. You're not going to get paid extra for that surplus skill. Your pay is limited by your boss' imagination. Even though those skills are extremely useful and deliver real returns.
Proving yourself as a developer to a non-technical person takes years because that's how long it takes to see the results. In a big company it may even be impossible to prove yourself because your work is mixed in with that of many other people and the results average out.
However there is also the path of understanding business domains, brushing up soft skills and embrace being polyglot across multiple stacks, delivering working solutions for companies that couldn't care one second what their IT cost center runs on, as long as they stay in business selling socks or whatever they actually care about.
No, you can’t be 45 years old (I’m 46) and say I understand the business domain and I can give you a really cool VB6 Active X control to solve your problem that only works in IE6 on a Windows XP VM.
Yes, if the CTO doesn’t care that he is using somewhat modern technology he should be fired for incompetence. He’s going to find that he has a hard time recruiting developers who know how to write FORTRAN for a Stratus VOS mainframe. Yes I’m that old. Been there done that.
Saying you know the business domain but not keeping up with technology is just an excuse that people make and then scream ageism the minute no one will hire them because their idea of cutting edge technology is ASP.Net WebForms or Enterprise Java Beans.
Yes, my current position is a technical consultant working remotely for Big Tech who has to understand business problems and not just know how to reverse a binary tree on a whiteboard. But, if push came to shove and a meteor struck all of their data centers world wide, I could put my resume out their and get a job with a tech stack that is at the right point on the hype curve.
Also not working alone helps to sort out the issues when cutting costs arrives.
Finally I am not saying not to learn, rather people should focus on their business value as a whole package, and not being "Expert on Technology X, Y, Z".
I am about the same age, apparently it was worked so far.
Especially seeing that when working as a Corp Dev, salary compression and inversion are real and the best way to keep your salary at market value is by job hopping.
>if the CTO doesn’t care that he is using somewhat modern technology he should be fired for incompetence
A ridiculous statement. The last concern of the CTO should be "are we using the latest tech for the sake of having the latest tech". Their concerns should be about cost, what the business actually needs, and what the future will entail. Finding new developers isn't that difficult, even for something like mainframes which most college grads today are totally unfamiliar with.
Your point about being more easily hireable by staying up to date with the current hype is true and valid. However the CTO doesn't have the same concerns as you. This is the important difference.
The Dreyfus model of skill covers this quite well: https://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisi...
Every 'stage' is a plateau in itself. The beginner is able to quickly do tasks, but does not connect them together well. For example, they might know clean code, Scrum, Git, algorithms, TDD. But put them in charge of building a product and they can't. They'll stall. They'll overengineer.
To go to the Competent phase, they need holistic recognition. This means running experiments. They have to try to do things that can fail. They have to learn to plan towards a larger, meaningful arc, instead of simply finishing tasks that were assigned to them.
Finding a mentor is the most effective way to get through a plateau, but mentors aren't always available.
I've seen a number of juniors who were very humble, and this humility was perceived as lack of knowledge.
I've interviewed some seniors who were not humble at all (nothing was an issue).
In general, skill level has little to do with humility and other personal traits. However, we like to project our reasoning into other's emotions, and we love to pattern match, e.g. "she's humble because she has 20 years of experience".
It's another bias you should look for when interviewing candidates. This one definitely does not serve you well.
Probably a common viewpoint, but definitely not a misconception.
I have had freshers tell me wrong answers which they know they are answering wrong with so much confidence. And you keep digging them on their answer and they would keep coming up with even more wrong stuff.
It would probably be about 2 or 3 out of 10 freshers who can say "i don't know that".
I suspect if you interviewed those 7 or 8 juniors in 10-15 years, many of them will continue to bolster.
Seems so:
This word is first recorded in the period 1590–1600.
Source: https://www.collinsdictionary.com/dictionary/english/juniori...
It’s amazing (and a little amusing) how many people literally can’t admit they don’t know something. I have “passed” some otherwise very strong candidates who couldn’t admit that and made it a point to advise them after hiring how dangerous that limitation is both when doing the actual work and when interviewing. A not at all surprising fraction of them couldn’t admit/understand they even did it, of course.
I've done the same. The problem is that in a lot of companies, uttering "I don't know" is perceived as a weakness, and makes you "not a culture fit," so I can completely understand the hesitation...
It is a matter of culture too.
I'll take the example of the desk clerks you have to face as a citizen or customer in administrations and companies.
When I lived in a country of Northern Europe, they would often say "I am not sure, wait a minute and let me check in that book" or "I don't know, I will ask/check and call/mail you right away". And they did it and it was fine. A tiny delay and everything is solved for good. You come out from there with a smile and they have learned something for the next time they meet the case.
Now that I am back in my Southern European country, the guys (well, it's 99% women) in the same position will never admit they don't know or they aren't sure of something. They will assert whatever weird/outdated/wrong assumption comes through their mind with definite certainty. Even if you gathered information beforehand and tell them that the rule says otherwise. They feel that checking or asking for help would undermine their authority or make them look incompetent (as if anyone still had any hope about that...). And they will only call the higher up when, after 2 months and the 3rd visit for nothing except getting contradictory information and requirements, you start yelling and they feel that they are less than 30 seconds away from getting punched in their face. Then the higher up solves the problem (which should never have become a problem in first place) in 2 minutes. But they will keep on 'working' like this for 40 years, they'll never recognise that their work and service would be much more efficient if they just said "I don't know" instead of inventing wrong rules.
It was something I noticed when I was interviewing for job positions. Any time I said 'I'm not sure' or 'I don't know' and followed up with 'I'd have to look at the manpage' or 'look up the documentation' either the interviewer would express disappointment or continue to press the question in order to get even a wrong answer.
Many interviewers are looking for you to perfectly regurgitate canned answers rather than admit when you don't have something memorized.
[0] https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
Basically with juniors you don’t know what they have been exposed before. In general less they are exposed, more confident they are. Ofc humility is also a factor in this.
Here, you're using "skill level" as a proxy to years of experience, because the OP used the term "seniority" which usually means years of experience.
So while I think you may be correct when it comes to actual skill level (though I have seen no evidence presented to support this claim), you're definitely incorrect when it comes to "seniority", unless you believe old people and young people do not present different levels of "humility" and "personal traits".
To avoid being accused of not providing evidence:
_you can reasonably presume a 66-year-old will be more conscientious, more agreeable, and more emotionally stable than their adolescent self._
https://www.iflscience.com/brain/study-reveals-how-your-pers...
_As you progress through adulthood personality becomes more stable and predictable because you fall into a pattern of thinking, behaving, and feeling._
https://en.wikipedia.org/wiki/Personality_changes#Change_ove...
_Conscientious-ness, a trait marked by organization and discipline, and linked to success at work and in relationships, was found to increase through the age ranges studied, with the most change occurring in a person's 20s. Agreeableness, a trait associated with being warm, generous and helpful, bucked the theory that personalities don't change after 30. On the contrary, people in the study showed the most change in agreeableness during their 30s and continued to improve through their 60s. This even happened among men, which debunks the concept of "grumpy old men," Srivastava says._
https://www.apa.org/monitor/julaug03/personality
https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
This might be misinterpreted though. A common advice for interviews is to underline your key strenghts.
A candidate rightfully plays their game by showing expertise and mastery of the things they believe they know and try to at least appear worth hiring.
It's up to the interviewer to try and move the conversation to a topic the candidate is not very familiar with and see how they react and handle it. In general, is down to the interviewer to go beyond the "oh yeah i know that" and ask specific question that demostrate actual understanding.
But then again, it's fair game to present your best self during an interview. You're literally selling yourself to a potential employer.
The seniors can be extremely cocky, but they realize when to follow or break rules. They may have strong opinions, weakly held. They'll proudly challenge something to see if it hold weight, but back off once they're wrong. There's some special cases too, like people who are beginners in project management but experts in development, and they can have fanatical opinions on project management.
Then experience, hardships, victories and org politics teaches them the 'real' game and hopefully they use that experience to their advantage. You become a cautious optimist. And not a cynical ol' grumpy bastard like me.
It doesn't seem to ever become easy for me. I am always running into challenges and difficult obstacles once I overcome the procrastination issue. I am bullhorned about it, so I'll eventually get through. That, more than any particular strategy for learning, is the most important in skill acquisition.
Another component of skill acquisition is skill retention. You'll get rusty when you don't practice your skills, and in enough time, you'll lose your progress. This is probably more than anything else, a lifetime commitment so that you don't lose your progress in the knowledge or skills you picked up, so that in the long run you become better and better over time.
Think of it this way: You learned 10,000 useful "stable" facts about the world one year. Next year, you learned another 10K facts. But retention is exponential. Practice it long enough, the facts will last a lifetime.
Suppose a person have no strategy for retention. Let say he learned 10K facts, 75% decays away. Next year, he learned another 10K facts, but another 75% decays away. So he retained only 5,000 facts, but you retained 20,000 facts. Obviously, this is contrived, but it does illustrate why colleges and high schools aren't very effective. It's not that they don't teach, it's that the students forgot what they learned as soon as they finished a course.
I often get interested in a subject matter and then drop it some point. This often result in surface understanding of the subject. Just enough to sound smart. However the knowledge is retained. Should I ever return to a subject, I'll retain the knowledge from scratch, as sometime I do.
Sometime I was able to keep at a subject long enough to acquire some amount of true mastery.
A lot of times this is enough to dissuade me from learning about anything I have only a passing interest in. One time I blocked out an entire two months out of free time after school in an attempt to learn electronics, by assembling a commonly produced headphone amp. A month passed after classes ramped up and I forgot almost all of it, and moreover no longer cared. I still just don't care about electronics since then, honestly, and don't know why. So in my book that was just two months I spent doing nothing that would ultimately contribute to my future knowledge. I mean, it was an attempt, but only an attempt. I never got the circuit to work in the end either. If I had known that was the result ahead of time I would have just worked on a programming project instead because I was better at programming and I wanted to finish it, and also was competent enough to actually finish it.
Unsurprisingly the majority of my college education turned out exactly like this also, but at least I got the paper in the end.
Nowadays it feels like all I care about are the things I care too much about to ever forget, like the skills necessary for my job. As in, not knowing what the point of learning all this is if I don't care enough to remember it after a month. I feel this is a horribly limiting mindset for me to have, but I don't see any way around the "not caring" part. If I know I don't care, nothing I do to sweeten the deal like gamification or dreaming of the finished project will ever work, because I know I'm only doing that because I don't care, so my mind will defeat itself.
I especially don't like it because all these people around me are learning about machine learning and all these bleeding edge technologies that are having a material impact on the world, and I just sit there unable to care, as if I'm somehow allergic to learning. It becomes a "so you're just going to deny the existence of the entire field of X because you don't care and sit around playing video games instead" kind of irrational thing. I don't know how to resolve this, or if I even should.
One thing I will never forget is me talking to someone I knew for a long time and asking what they were doing, and they said "learning about nuclear fusion." For some reason I never felt brave enough to talk to them again since then.
Regarding machine learning, that field has been hijacked by the hype train and over half of what people post online about various ML techniques is just wrong.
'Allergic to learning' may actually mean that you are immune to bullshit. In that case the best approach for learning a topic you care about is to go to the seminal work / first papers and focus on understanding it and reproducing it, then evaluate for yourself whether the reality lives up to the hype.
One way I've seen I can "hack" it myself is if I stumble on things that are actually fun and it becomes a "wedge" into an area I was too shy to try out. For example "Kerbal Space Program" taught me way more about rocket science than I've thought possible, but more than that, once I understood the core concepts and could play around with them in my mind it actually did become fun. I still remember how I was doing some hochman transfer calculations to figure out when should I do a lunch to get to Duna (KSP's Mars) with the limited tech I had unlocked in the game, and a sudden realisation hit me, I'm actually doing rocket science math for a game ... This got me into reading about rocket engines and I ended up reading through the whole of the "biblical" Ignition book just for fun.
Now I'm a web dev and as far away from Aerospace as you can probably get and still be somewhat of an engineer, but it opened a would of interesting news, data, discussions and theories at the bleeding edge of science, for which I'll be eternally grateful.
I guess what I mean is it's possible to start caring for something that's outside of your domain expertise, you just need to find somethings that's fun enough to keep you there.
https://news.ycombinator.com/item?id=11327669
https://news.ycombinator.com/item?id=19467367
Get to the point, fast and quick.
I’m sure you have many valid and interesting points of view about your job, experiences, and wants. I’m interested to hear about them. You could offer some unique experiences I can learn from or maybe there’s some tidbit I can offer you.
But unless you learn how to get to the point first, I don’t care. Even now after 3 minutes of perusing your entry I’ve lost any sense of what it was about.
To finish up, I’m not trying to be evocative, negative, or anything. I just want to encourage better ways of writing, thinking, and publishing.
Always consider your readers first. They don’t have as much time to parse what you write as it takes you to write it.
I used to do some long form writing and I still remember feeling offended when I first got “too long didn’t read” comments.
Sending a letter would take weeks, so it was important to make it count. Newspapers with long articles made more sense when anything written was much more expensive.
The problem I had with this story, besides that I don't think I buy the model of reality it's proposing, is that it doesn't get to the meat(The Expert Beginner) until past the halfway mark. The first 7 minutes wasn't particularly interesting or critical to someone understanding the subject. The bowling analogy was long and not necessary to explain a very straight forward idea.
From what I can tell, a "low hanging fruit" analogy would have been more apt and would have taken a short paragraph to preface the main content.
That aside, there are some reasons I have to not agree with the article.
Not to discredit the author's experience but, in my experience, I just haven't met anyone who believes they have reached expert status but is still a beginner. Pretty much every programmer I've met has some degree of imposter syndrome and, while most have some opinions about what makes "good code", I don't find it common that programmers have a strong belief in their own expertise. Totally subjective, I know, but that's one way in which the story just doesn't reflect my view of reality.
> They come to the conclusion that they’ve quickly reached Expert status and there’s nowhere left to go.
I just don't think I've met any programmer who thinks there's nowhere left to go once they've achieved a perceived status.
Moreover, the end of the story seems to conclude that "expert beginners" are the problem, as opposed to the symptom, although the author does recognize that somewhat via the "dead sea" effect. Looking at this from an economics perspective, the so-called expert beginners are the way they are because they're not incentivized to do better. If there was economic and internal political pressure for them to achieve supposedly greater things, they'd be more likely to do so. Having worked for some "dead sea" companies, I have to wonder why any beginner would want to effectively work harder for a company that pays an intermediate salary, makes advancement difficult, and does not reward excellence. The choice to dick around, not spend energy improving, maintaining the appearance of experthood having "worked on that tool" or having been around the longest, while collecting a reliable paycheck, is the most sensible one for those who don't live and breathe code.
The article comes from the angle of someone who lives and breathes code, blaming the programmers who aren't true believers, and leaves out the fact that the supposedly better programmers don't stick around to fix these situations.
My point is that you could turn the article around on itself to say that the "dead sea" problem, and the problem of "expert beginners" lingering at companies, is at least significantly caused by actual expert programmers.
Do you have any evidence for this? It sounds like a typical reactionary take on new technology.
You could use more encouraging language. Phrases like "I don't care" and "[don't] have time for bullshit" make it seem exactly like you're trying to be negative.
I'm not trying to say anything, I just want to make you do better.
Always consider people who are different to you. Maybe they have so little time for bullshit they won't even bother being negative about someone else's writings from 8 years ago.
Go argue with Plato.
The problem is with your attention span, dude, and you'll do better if you can adapt yourself and demand less of others.
But he decided not to add a summary at the beginning of the article. This is a perfectly valid option and helps him making his point, even though it did reduce his audience.
I'm currently into learning how computer audio works. Learning to program things like mono -> stereo conversion, panning the audio, normalizing, generating binary sound files,..
Currently going through a book (The Audio Programming Book) for all of this, doing it in C and then trying to make my own version in Go.
The reason I say "define significant" is because these are all new skills I am acquiring - but I'm doing so just for the fun of it. It's not something I had to learn for my job.
1. Network -> Select Request -> "copy as fetch".
2. Then paste the fetch() statement in the JS console, and look at the network tab for results...
Pretty easy and handy for replaying random requests during development.
I'm closer to 60 than 50 years of age and am closing in on 40 years of professional software development experience. I like to think I can still learn new tricks.
https://news.ycombinator.com/item?id=23768931
Less significant: application locking with redis (redlock) last month. I've had a picture of it from long, but I'm surprised how neat and stable redlock is designed.
Perhaps a more clear way to think of that is in terms of comfort and bell curves. The left extreme of the bell curve is easy to both identify and understand for anybody beyond the left end. Those are the people at the low end who perform below accepted baselines.
Less well understood are people at the right end of the bell curve, who drastically out perform other developers. In all objectivity the people at the right end of a bell curve have as much as in common with the median population swelling into the middle of the curve as the supposedly incompetent people on the left end.
Think of this in terms of risk and popularity. When you are below the middle of the bell curve everything to the right of you is better performing. You can increase your performance by moving closer to the middle of the curve by doing what is popular.
Once you get to the middle of the curve you have to make a firm decision: remain comfortable in your current posture and let popularity dictate your approach or take risks to further increase performance beyond the population median. In that regard the populations at both the extreme left and right ends of the bell curve are doing things that are extremely unpopular. You cannot become an expert without fully embracing that reality.
An expert beginner is a person at the median of the bell curve or just to the left of it. They have mastered their skills to that point and refuse to make changes or take risks necessary to advance further.
As a front-end developer I frequently encounter expert beginners. People who have mastered some framework/convention, but doesn't really understand how their technology really works and are hostile to improvements that don't make use of their favorite framework/convention. To outside observers the expert beginner is clearly identifiable as performance is objectively measured with numbers without regard for approach.
"Sep 30", this one says. Hmm… can't be 2019, because I read this years ago, I'm sure.
The only indicator of year I could find is that the comments to the article are 7 years old.
We might be able to guess the missing city via street name search but impossible for dates
[Can someone explain the downvotes? I'd like to know if my information is incorrect.]
Someone may have taken your comment as a defense of the article not publishing year (which is a ridiculous defense) and hence the downvotes.
It is definitely really bad UX if you have to "view source" to find information.
It's also possibe to just go to some "unoptimized" part of the blog.
The whole wordpress theme seems to be trimmed to be "timeless", including URLs.
https://daedtech.com/?s=%22Rise+of+the+Expert+Beginner%22
shows: Sep 30, 2012, since it's feed by the same database.
WordPress dates are no authorative sourcem since they can by changed at any time to anything.
But the story has about a dozen submits including pre https times: https://hn.algolia.com/?dateRange=all&page=0&prefix=false&qu...
With the first one in april 2013, about half a year later.
As for the downvotes, I guess the nail that sticks up gets hammered down?
Posted on September 30, 2012 by Erik Dietrich
As a counter-point, the best article on salary negotiation _ever written_ [0] has the timestamp in the URL, which undoubtedly dissuades people from reading, given that it was written eight years ago.
If a potential reader avoids the article because of it's age, they're poorer for it.
IMO the author is doing the world a favor by not time-stamping the article.
[0] https://www.kalzumeus.com/2012/01/23/salary-negotiation/
Then why does it have a day and month?
Writing software is a bit like playing multiple sports. You can be good at one thing and poor at another, and as a result do great work on one project and be mediocre on another.
Writing code in the small, optimizing; architecting for change; architecting for scale in development; architecting for scale under load; architecting for scaling out vs up; all different skills.
Writing code functionally, vs procedurally, vs message oriented. Writing code with control flow vs data flow, and toggling between them. Crafting abstractions vs composing them. Many small parts put together elegantly vs one straightforward transparent monolith. Some skills are alternates, you can go either way and get as good results.
There are people who only know a few things. But on a suitably scoped project, that may be fine.
and it doesn't contradict the article. If you have always worked in one paradigm and think you are an expert in it, learning new development skills can make you see you were not that good in your previous area.
I consider the most reliable evaluation of expertise is working code. Something can be beautiful, but if it doesn't work, or doesn't solve the business problem, it doesn't count. If something objectively scales, I believe that the people responsible for building it are able to build that thing that scales.
If those people learn new things, they might learn how to do the job better. But maybe better isn't what the business needed. Maybe it would be better to invest that extra talent in something else, and hire people with the original skill level (who may be cheaper) to do the original thing.
This all might sound like an apologia for not learning new things, or limited developers who can only build a few things. In some ways, indirectly, I'm arguing against an unfounded arrogance or feeling of superiority which is driven by following the fashions of programming as a pop culture. But more of what I'm trying to get at is that the "best" isn't actually required, a lot of the time. And sometimes the best can be the enemy of the good; doing things the "right" way, according to an orthodoxy, can actually interfere with getting things done. And newcomers to orthodoxies can be - usually are - the most religious.
In my experience, when it comes to code, beauty and durability are natural enemies.
Many people would be completely happy with bowling a 160. In many contexts that's a great outcome.
But if you as a developer want to break past the equivalent stage of (beginner) expertise in any of the possible specializations or fields, you have to understand how to keep learning past the "know enough to be dangerous" phase.
Writing code functionally, vs procedurally, vs message oriented. Writing code with control flow vs data flow, and toggling between them. Crafting abstractions vs composing them. Many small parts put together elegantly vs one straightforward transparent monolith. Some skills are alternates, you can go either way and get as good results.
Many developers stop at one paradigm and avoid stretching themselves further out of discomfort. Other developers learn a new paradigm but never reach the point of understanding its limitations, while having convinced themselves that they're an expert on that paradigm. From what I've seen it doesn't really matter which paradigm, language, toolset, or discipline you're talking about, this particular behavior happens all the time, and it matches the "expert beginner" label pretty well.
There are people who only know a few things. But on a suitably scoped project, that may be fine.
That's sort of a counterpoint to the main point, which is why I wanted to pull the discussion back to the main point.
Although I am admitedly far from an expert in the field in question I am not a layperson either. I say the types of activities you mentioned are of the same group of skills, in different domains, which often requires a different but similar set of approaches (based on both convention and the subtleties of the domain).
For instance making wrist watches, grandfather clocks, steam punk sex dolls, and the ankagathera(sp) machine are different use cases and require different types of mental projections and organizational methodologies in execution (approaches), but the skillsets have an undeniable amount of overlap. They overlap more with each other than they exclude. In SQL terms the size of the output of the inner join is much greater than the same for the outer join. Therefore you can say that they are of the same skill set, just like doing abdomial flexibility helps with running and bicycling hill climbs helps your breast stroke. Different muscle groups, but share many types of synergy: all part of physical fitness.
Source: 10 years as a learning specialist in business setting and aspiring triathelete.
Am I an Expert Beginner suffering from Dunning-Kruger and delusions of competence?
Or am I an actual Expert suffering from Imposter Syndrome?
I'm working as tech co-founder in a small team with junior devs, and I do some things "differently" for what seem to me to be good reasons.
How do I tell?
If you can't identify a single person who is better than you at something important you need to do, then you are a probably a terrible judge of competency and therefore not an expert.
If you haven't failed, you're not an expert.
Is it 25 years of experience, or the same year 25 times?
How do I tell?
I look at code I wrote a couple of years ago, and not only can I identify how I would write it differently, I can identify /why/ I would write it differently - both what technique, concept, or methodology I have since learned, and how that would make the code better.
If you cannot, you have probably plateaued, like I did for a (far too long) while.
I spent two weeks building a Go version of Webpack last month because it was either that or implement Webpack because the Vue components we're writing needed unit tests. Was that wise? It works fine, I don't have the gajillion shitty dependencies of Webpack, and it compiles, bundles, uglifies and minifies our entire Vue front end in <200ms but is that a good thing? Was I an idiot reinventing the wheel, or was I wise avoiding exposing us to the insanity of npm? When it needs maintenance in a few months and I have to spend a few days fixing it, is that time wasted, or have I saved time because every time Webpack updates a version everything breaks and we don't have that hassle?
How do I tell?
> I have no idea what "better" is any more. Faster? Easier to read/maintain? More loosely coupled? All of these? "It depends." As a gross generalisation, most juniors optimise for their bug-bear of one of these at the expense of all of the others. Most mid level devs try to balance them out, and hopefully, most seniors pick which ever is appropriate for the task at hand, with an eye on the long term consequences of their design - if there even is a long term consequence.
Re webpack replacement; Given the amount of time I've wasted dealing with webpack and it's madness, I'd back you up and say it's probably a net win - as long as it's documented enough to avoid the bus factor. It's not like golang is some esoteric language where it's impossible to find devs for.
P.s: I want to clarify here that I'm not necessarily a good programmer, I've just spent enough time stuck as a niche programmer & probable expert beginner and fighting my way out of it that I recognise the patterns. I'm probably a better study of dev behaviour than actual dev.
That being said, very great article that describe well and nicely what I have personally experienced in a sme company that was bought by a big tech group at some point: - when I arrived, the core team was already there with some having personal ties. A few beginners that took the mediocre manager as mentor, that took himself his manager as mentor - they learnt by themselves, mostly there, they were responding to diverging opinion with anger. - over the years, a few 'outsiders' arrived and try to change things by showing the problems and explaining that outside world do differently. - but each of them had to face the seniority argument reinforced by the group effect to justify that they can't be wrong. (Listen, we are 3, you are 1, it means that we are right and you are a pain in the ass to think otherwise. Doesn't count that you say that out of the company are unanimous on the subject...)
The worst (almost funny) case I remember was that:
- Person 1 (p1) and person 2 (p2) have a disagreement on how something has to be implemented.
- p1 is the boss favorite, so he is always right... so his solution will be implemented. No one listen to p2 that says that it is an inefficient idea, possibly problematic and that is why no-one does it this way outside. (No-one? In fact they found one case over 100 of outside projects that did that, so that gave them confirmation that they were right...)
- p1 engine solution is implemented and p2 has to do a component working with that, but that does not work well at all, very slow for basic operations, lots of unexpected deadlocks and issues like that. Another manager complains about the issues.
- P2 decides to give a try reimplementing the engine with his solution. That is completed is no time and it is excellent: performance x1000, no lockup, no more issues with basic operations.
- results are shown to mediocre manager. But instead of accepting and going this way, he blocks the thing and can't accept that his favorite was wrong. So says that there should be a bug in P1 implementation and give him as much time as needed to test and look at it.
- after 1 months, P1 did everything he could with his solution to fix it without using the solution of P2. He comes proudly with his engine is now 10x faster than initially.
- but so, 10x vs 1000x is a no match, and P1 solution was still rigged with issues. So it is finally P2 solution that is used 'out of choices'. BUT... as manager still does not accept that he and P1 were not right. He said: ok we use P2 solution, but you will have to embed and support P1 implementation in the final product. Not to be used but maybe one day...
- conclusion of the story? Evaluation time arrived. Did P2 got a good eval? That would be logic, he saved the product, gave an important perf and stability boost to the solution. But no, he got the worst! Manager said that P1 had to take depression pills because of P2... Not because his solution was wrong and couldn't accept, learn and improve from it. Buuuut: P1 got the maximum grade!
* It is fun to learn initially, to see something new working. Once you get something working not many people see fun in spending a lot of time in getting it to work better.
* There is huge amount of introductory materials (guides, tutorials, examples) but the amount of available materials falls drastically as you start to progress.
* Only some people are able to actually think in abstract terms required to "create" new knowledge based on existing facts. Beginners can advance quickly by "recreating" -- executing tutorials, copying existing code, etc. It is relatively easy to use these as building blocks for a simple application. But as you progress you have to figure out more and more new knowledge, understand underlying principles. This is what many people either don't feel comfortable doing or don't feel is necessary to do or are just plainly incapable.
* It gets more difficult to work with other people in your team as you create knowledge in a given topic. There is tendency to push back when team member tries to introduce something new that is not clearly recreation of accomplishment of somebody else available on the Internet.
* Creating new knowledge in the topic is a huge risk in that it is unknown payoff for large amount of honest work. There is not much risk in following existing tutorials, it is pretty much guaranteed that it is possible to recreate accomplishment others did. When you create new knowledge (for example new patterns, principles, guidelines) it is likely you are going to make mistakes. This fact may cause people uneasy and dissuade them from further advancement in the topic.
* Getting mediocre in any specific topic is frequently seen as good return on investment. For example, as an architect I would maybe not want to get expert at any of the frameworks I know. I see this as a reasonable tradeoff which allows me to tackle other problems as soon as I think I know "enough" about particular topic.
Aye. My coworker described it as being able to find 100 guides on how to hammer nails and build a small bench. "Shed building for beginners" or something. But then the next exercise is "build a house" and the one after that is "build a shopping mall".
Your post exactly describes ML on the internet: first you find a billion "check out my intro to ML" Medium articles and git repos that spin up OpenCV on Tensorflow ("small bench"), then you move to the Tensorflow docs ("build a house"), then you move to Arxiv.org ("theories of city planning"). Once you step into that middle zone, you're basically stuck reading academic texts. As a 50-something engineer, it was a kick in the balls getting started with this stuff. Fortunately this contract is related to hardware optimization, which I've been doing for decades, but this particular variant of it was a curve-ball.
It is an interesting back-and-forth: I find myself exchanging information with lots of new-college-grads (permanent hires, not contractors) that all have sharply coiffed beards and heavy denim jeans. Two of them are pretentious and fight to be top dog (which is hilarious from my old, jaded POV), but the rest are genuinely good kids that want to learn, and vice versa, teach me what they know. It's fun. I'll miss 'em when my contract ends.
In such a climate, they aren't really competing for the job on the basis of merit, so much as they are posturing that they are a good candidate - because they learned that that's what one does to get work and protect their family. And there is so little expertise around that nobody can call them out. When they get hired, the posturing turns into gatekeeping in short order. They aren't curious about the work, they just want to keep the position. When you fill the ranks with uncurious individuals you get stagnation, because nobody is pushing them forward.
In other professions the process of education and certification cuts most of these people out early on, which comes with its own downsides but does impose some minimum standard of capability which they may go on to use or misuse. But the problem in programming is that the tools of programming address a multitude of problem domains, outstripping what could be reasonably certified - that's why the profession has gotten so big, so quickly. It's all research, all the time - independent, unverified, unscientific research.
In response to this we've ended up with the whiteboard coding interview, which basically aims to do the task of certification within the span of a few hours. It's not very good at that - these interviews are run in an inconsistent and often unprofessional manner too.
Expected by whom?
It's not knowing how to "ride" all of those.. it's knowing how to "FIX" all of those. And that's where it gets tricky, while each might be similar in some way (they have wheels and maybe an engine), the vast devil is in the details.
More than once I have seen a peer or a whole engineering department of brilliant people going down a technical rabbit hole for weeks for intellectual satisfaction, where instead I will just take a step back, walk to the manager and try to work a different take for a solution that can be implemented in a few hours/days even if the business goal is slightly moved.
Yet I'm definitely not a good professional software developer in terms of code "quality", and don't consider myself very smart compared to my peers.
Edit: formating
Getting someone who is really skilled can of course be beneficial but it certainly has the problems of retention, things like providing interesting challenges, high compensation. Not all businesses have deeply interesting technical problems. That's fine. There is plenty of use for the wide parts of the bell curve fpr both businesses and developers.
A lot of business software is boring. It does not take skill to do. It only requires someone to know a handful of tools and be willing to put in the time. So my advice to non-FAANG developers: if you want to make development your career, learn to be bored. Still work on marketable skills, learn new languages, etc. But remember that not every task will be an interesting new technical issue, it's probably going to be something you've seen a hundred times before.
is life at FANG really that different tho? Can't imagine that everyone is working on exciting stuff all the time. Would appreciate if someone could enlighten me.
And once you’re done with that, there’s a whole load more refactoring for the latest language update!
It's not always rainbows and butterflies here either but I do feel much happier with the work I do here.
I guess it depends on your definition of "skill". ERP systems are complex, full of problems, inflexible and managed by bean-counters with "battle-axe" personalities. If you look at the work holistically, it does take skill and experience. There is a lot of room for improvement in these systems but the problems involve people as much as they involve technology.
The same software build by a small team of experts would cost both less, and lead to a high quality result.
It might also relate to intellectual satisfaction. A "great" developer could be hungrier in that sense, that they need worthwhile projects to challenge their skills - and may get bored more easily.
If you spend 6 months working on the wrong thing, you aren’t taking responsibility for delivery. It’s a mistake that most smart programmers seem to fall into at some point in their career, when they’re still learning. It’s a classic sign for me of a mid level developer made into a tech lead before they’re quite ready for the role. I’ve seen that happen way more often than I’d like.
If your tech lead is making mistakes like that, your team is operating without a real senior dev at the helm. That’s not insurmountable, but don’t mistake that sort of thing for real expertise.
Do these folks face any consequences for behavior like this?
1) Identify the problem - it invariably isn't to do with code but a combination of time and cost. 2) Can the problem be solved without a line of code, such as changing the process and removing the issue that way? 3) Is there an off-the-shelf application, software or component that will solve the problem. 4) Maybe you do need to code something.
We are also all too quick to just dive straight in at (4) because that's what we identify as, that's what we enjoy and unfortunately what we get paid to do rather than getting paid to think, advise and value-add.
In my experience it is a key skill to objectively evaluate ideas that are different from my preferences and accept those that are good enough, but not use my preferred way of doing things. This is a quick path to get a seat at the table and getting your opinions heard. My 2c.
Also, in saying that, I do believe domain knowledge is far more valuable that programming chops, and not understanding the domain to be able to translate that into an application process is worse that someone with domain knowledge trying to come up with how it should be coded.
Some of the best projects I've worked on involved a lot of sitting and drinking coffee with the domain expert.
The only times I've ever found that to be true is when there's other details available that I'm not aware of. Business constraints "everyone knows" about but aren't documented anywhere, for example. Decisions made in a meeting that aren't communicated out, meaning, essentially, that you only are given a portion of the problem and request. This gets back to the 'seat at the table' concern above.
The 'seat at the table' is far more related to interpersonal/political skills than technical ones, but can be chicken/egg in some places.
That said, engineers are a highly opinionated bunch and a group of 5 will have 5 different personal preferences. But they are smart and will quickly recognize an objective opinion that is not hard-driven by personal preferences. Folks with good technical judgement who are willing to accept a different approach quickly become a highly respected member of the community. They frequently end up with more tables offering them seats, in a technical expert role, than they care to occupy.
Programming is an abstraction (a perspective on what the computer is really doing) that is very much shaped by the tools we choose to use. Meta-religion is probably a fair way to describe it, and can be every bit as divisive in some circles.
This. We don’t get to change the problem after the fact either.
Anecdotally, because I've brought up this issue a lot, I've heard many responses from bother sides. From some engineers, not in the room: "I would never want to be in the room, because then I'd have to work with those people". From other engineers: "They'd never want us there, we're just resources to be used."
From the non-engineers who are in the room: "we didn't know you wanted to be there, of course you're welcome", or "we didn't want to interrupt your work for such a high-level meeting".
I find that the reason for exclusion is either incompetence (in which case, get out), or a lack of awareness that certain engineers are exceptional sources of opinion, in those rooms.
But I've never seen a culture that's pushed engineers into those strategy meetings; it's always been opt-in rather than opt-out. (It's always opt-out for the product org).
But: "Damn those stupid meetings again, wasting my time."
It is like a lot of developers don't consider meetings part of job. I am currently less and less into actual typing of code and much more into understanding what others are trying to accomplish.
On (1), many corporate meeting rooms have terrible ratios, and so they intuitively feel unproductive. On (2), it’s much easier to improve the ratio in code than it is in words spoken by people.
It requires a lot of patience, but in the long game, engineers do improve that ratio in meetings and strategy discussions, and the company benefits from it.
My theory is that most engineers are not interested in playing the long game, because (1) it’s not as fun (2) they don’t plan on being at the company on time scales where the investment will have been worth it.
While I personally don’t emulate their behavior, I think the developers you describe could conceivably be acting perfectly rational for their career goals.
That's where I've come as a professional. I couldn't give a fuck any more about anyone's problems and I've learned that it has everything to do with creating pathways for people to communicate.
People are difficult creatures and academia has made us into basket cases unable to tie our own shoelaces without help from someone who will evaluate us and dangle a carrot in front of us for the effort.
How about getting over yourself with your corporate lorem ipsum and use the technology at your disposal to fix this dumpster fire of a planet we've made for ourselves?
Who ever speaks about our duty to our fellow man and the giants whose shoulders we stand on?
I blame a lack of classical education on this performance based meritocracy that's become a runaway train with no ethical brakes.
A Business Analyst focused on figuring out business solutions and constraining those to realistic technological limitations.
An Engineer focused on architecture and implementation.
Seems to me you just chose the BA area of expertise... there is a lot of value in that, but the Engineering side is just as valuable in my book as if you have great ideas and plans but the actual engineering is poor (and vice-versa), your company is going to suffer.
What do you do when management doesn't want to move their business goal? Now you look like you're incompetent and incapable of just doing the damn thing they asked for.
Asking rhetorically, not as criticism, but because I've been there and it fucking sucks when the people who aren't working on the problem think they might have a better understanding of the big picture than they do.
A fine example of this is a new hire getting anxious and defensive because the git branching strategy at the company isn't the branded one they're accustomed to (e.g. git flow).
His code has absolutely no sense of quality, doesn't employ any sort of standard design patterns or style, has no semblance of architecture and is an absolute hacky rats nest of code that falls apart with any change because of how interdependent it is.
The other day I was sent some of his updated code, which had no version control and had randomly added an extra 150 files to the project. It turns out the majority of those files where duplicated from elsewhere in the project and apparently it was my job to find where the changes were among that mess.
It's like he learnt to program decades ago and then never opened a book or looked at anyone else's code since.
"You can fly 400 hours, or you can fly the same hour 400 times."
Sounds like your coworker has had the same first year of experience 30 times...
I don't want to be that guy, and i don't want to work with that guy, but i have to confess to a certain jealousy that people like him have figured out how to sit back and just phone it in and collect pay cheques for thirty years.
I could never be that person, I always strive to improve and become better.
Whereas you put focus on aspect such as maintainability, readability, adaptability, testability,... of the code he's writing, your employer might simply keep him around either because his code, well, simply "works" to a degree that is satisfactory, or because of a complex interpersonal relationships which have been established over decades turning him into much into a fixture.
Put more succinctly: No one wants to know what goes into making a sausage.
That is, there's little value in explaining or arguing the fine technical details of code optimization, architectural design, functional programming, etc. etc. etc. if you don't consider your audience.
Stakeholders who rely on your co-worker's work simply want to know what his work could mean to them, and how it helps them get the job done. Your concerns regarding code quality are totally valid, but unless you, as the maintainer, will be fully perceived by your employer as a formal stakeholder in your own right, your objections risk being thrown in the wind.
At that point, it's not just a co-worker issue, it becomes a workplace culture issue. If there's a dissonance in the manner in which he's held accountable for the quality of his work by the team on the one hand, and management on the other hand, then how does that same dissonance affect how your own work gets perceived?
If he gets to scrape through, does that then imply that you're putting the bar for yourself really high, whereas you could clearly get away with doing less? Or are you trucking on despite the fact that your work is held to a different standard because there's a different expectation towards your own performance?
I think striving to "improve" or "become better" is something that only means anything if you do it for yourself first and foremost. Because that's what you want for yourself. It's a valid pursuit to want that for yourself. Whereas you have to be mindful that few people selflessly care about that desire and go out of their way to let you self-actualize that. After all, your job is first and foremost a business deal between you and your employer, and the primary reason why you are there is because your employer feels there's value in what you bring to the table.
If you work in a group, it's equally important to understand how to compromise on where you set the bar for yourself and others. Of course, in your case, you don't want to compromise on what you want for yourself to the point where you start to cross personal boundaries, lest you want to end up resenting the entire situation.
Whether such a Domain Owner is aware of his standing - that's a philosophical question. Job security on the one hand, inertia on the other, compounded with the very much environment that gives such role more support.
Just wish these guys are willing to share the crusts of the tribal knowledge with you, as this is where their true expertise may be. Side note: if there's this perceived disparity in the technical skill, the seniority in such org may trump the merit. There could be a way to get such Domain Owners on your side; pointing out their lack of skill is not the one, in fact this can backfire literally.
It's hard to fire them, because to many outsiders, they're workhorses. They know just enough to scrape by on each task, but they also have institutional knowledge and social connections that make them seem invaluable. Often that institutional knowledge is that they're the only person who understands their own shitty code. Their more-capable peers usually know that they're incompetent, but management doesn't.
There are many reasons people like this can survive. Peers don't want to explicitly throw them under the bus. The best of their peers simply move on--to other projects in the same company, or more often, to greener pastures at another company. Their peers cover for them, because it's easier to work around a millstone like this than it is to get them removed. It takes months of concerted effort to get a peer fired for underperforming. If you want to try to get someone like this fired, it starts to look like you're the asshole with a personal vendetta. Especially because they've been there for a decade and you probably just arrived.
These millstones aren't outright incompetent. On paper they've got extensive experience. Socially they're well-regarded by everyone at the company except their immediate peers who know they suck. They've been faking it and faking it well since long before you arrived, and they'll be doing it long after you've departed.
Make no mistake, though. These people are rarely phoning it in. They are busting ass to tread water. Sometimes they believe their own lies, but more often they are terrified that someone will find out just how bad they are. That's why they work so hard.
I've stagnated at jobs in the past. I've thought it was my problem. Then I moved on to better places, where coworkers helped each other to excel, where people placed a premium on improvement and education.
If your company shoves everyone into a cubicle and assigns them individual tasks, how are you ever going to learn? If you can get a job somewhere that embraces pair programming, you might find a whole different world. You can be mentored by your coworkers and collectively solve problems, instead of feeling like you need to put your head down and produce something on your own that may be beyond your expertise.
Fresh grads, especially grads out of code schools, often arrive with a lot of buzzwords ready to go, and a script of practices they've been told are the right way, but that's all flash and no substance. It can lead to overconfidence. There's something to be said for it, though; you can fake it until you make it. The important part is that you actually make it in the end, and to do that, you need mentoring. It sounds like you're not getting the mentoring.
I know it's hard to quit a well-paid job and take a chance, but I think that's better than going to work every day hoping you won't get fired, and not growing as an individual.
Don't underestimate the value of slow and steady in the world of corporate development. Many fresh out of college might seem like super stars developers that know all the latest buzz word technologies, I know this is a massive generalisation, but they don't like to work on "boring" or "legacy" and often quick to jump ship to the next opportunity.
Also, please be aware that this feeling is a common symptom of imposter syndrome.
But when people around you enable and tolerate poor code instead of correcting it gently but firmly, you don't know what to correct.
Refusing to use version control is a prime example. The industry as a whole has unanimously decided that version control is necessary, but he still argues that his backup of an entire directory that he does once every 2 months is more efficient
Just refuse to accept the code unless it's a PR; leave him no choice.
They're the one setting the standards for the team. Your colleague is just working to rule and the rules are lax.
For what's it's worth, a lot of people who use version control treat it as a backup system instead of as a record of logical changes to the code base with a detailed description of what has changed and why.
The day I interviewed, he said "I know I'm not the best programmer but I believe that after enough hours on the project you will end up with something that works", and he bragged about many nights sleeping in the office on a cot he had under his desk, keeping systems running and debugging live programs.
It was some of the ugliest code I had ever seen in my life. Every couple years, they'd hire an actual programmer, but he refused to change his methods, and the programmers would eventually find another job out of frustration. It was very easy to see which code was done by the other programmers, it just made so much more sense than his code, it was documented, etc etc.
I don't think he understands the purpose of architecture is to make future development easier, and instead thinks that if you make all variables global to be changed anywhere at any time, then that makes it easier and faster
I definitely agree that his approach to code quality is bad and he should improve.
On the other hand, he still seems to be delivering value to the business by making things work, regardless of how awful the code is, and I feel like this is still an improvement over the other extreme which is chasing hype and buzzwords while delivering near-zero actual business value.
The other 2 senior people never came up with the idea of introducing it.
One of them is still putting Tickets in Review which still lack basic quality expectations.
My biggest / most used quality right now is persistence and pointing out the same misstakes/issues over weeks and month...
And don't get me wrong, there are only two options to this: 1. Get your collegues up to speed and be persistent 2. Search for a new Team
The obvious choice of not caring doesn't work for me.
Maybe not the best way to learn, but in such a technologically complex world, it can sometimes be more effective...
I've come to believe though, that they need humour. There's always a tendency to over-extrapolate, get hung up on typologies which crack under weight and to assume the model is the main thing going on. Humour gives them a productive "playing with ideas" vibe, keeps it honest.
In software development, for example, I always think that demographics play a big role. Every decade we get more young programmers than the last. Many older programmers "graduate out" one way or another. The resulting demographics are unusual, with a years of experience pyramid more like the military than most professions.
Technology, methods and philosophy change rapidly. This is both exasperated by and causal to the demographics, and the youth/pace of the field itself. A lot of software culture has this relationship with the demographics. Maybe 60yo developers are more likely to produce important new things, but they are outnumbered 100-1 by 20-somethings... enforcing youth biases, etc.
I think a lot of this essays thoughts on learning might be affected by software demographics. A lawyer, accountant or aviation engineer's thoughts on learning and career progression probably encompasses much longer time periods. In software, we think in much shorter timescales. Between the age of 22 & 27, a programmer has progressed through a "career." Between the age of 22 & 27, an accountant has progressed through a cadetship.
That said, sure. There are differences in substance, history, everything. Those might be the reason for differences between professions, but the question is "how much?"
I think we overemphasize legible, logical reasons for culture, but often it's incidental reasons path dependence, demographics, etc.
I liked the analogy about the quirky bowling style.
That has happened to me -several times.
I’m primarily self-taught in most of my tech. It has tended to result in very highly-developed, but narrow, skillsets. Not necessarily a bad thing, but “brittle.” It has happened so many times, that I no longer feel that I am an “expert.” I am now “experienced.” At least the first five letters match.
But it has been a long road to where I am now. Humility has been forced upon me, and I now have a lot of “narrow skillsets,” to the point that they inform each other. For example, a lot of the stuff I did in PHP has helped inform my work in Swift, and vice-versa.
I’m choosing to specialize in a specific discipline and tech stack, which, just by itself, gives me a lot to learn. I am working to develop a “broad base” in a small-ish venue, with a lot of “sharp peaks.”
It’s really humbling. The more I know, the more I know I don’t know. Also, since I am constantly trying out stuff I don’t already know, I’m a perennial “n00b.” Usually, this manifests by not always being aware of the jargon (I know the tech, but not the name). This may result, I suspect, in my being treated rather shabbily by folks in the field (It may also have to do with my age. I have found that the way people treat me changes radically, as soon as they find out that I'm "long in the tooth," so I now make it obvious to avoid that). This has helped me to just keep my damn mouth shut, and open it only to eat my humble pie.
I write about that here: https://medium.com/chrismarshallny/thats-not-what-ships-are-...
An awful lot of "Büzzwürd du jour" is repackaged old stuff.
It does not make me friends, to point that out.
That said, sometimes, the "new way" does help add something to the "classic" way.
Do you remember how it felt when you had that insight that tech is not mutating as quickly as it may seem?
It will often be "discovered" anew, and repackaged with jargon, but the basics are still the same.
My experience is that the mutations are more of an "accretion," rather than a change. New stuff is added. An old technique might be formalized (like SOLID isn't actually anything new, but the definition is relatively new), which is really a way of "adding" to the older technique. We find ways to combine "classic" techniques, or specialize/derive from them, to provide a different service.
It's hard to find teachers that will keep up with the times. As someone who has done training, I can tell you that creating a course is a fraught process. It has to be correct. That means a lot of testing/review, and often "after the fact" fixes and refactoring, as students (invariably) find problems.
Keeping it updated is a pain. Also, it's entirely possible that the entire class may need to be binned, as the tech becomes irrelevant (I have a whole bunch of DU -Apple Developer University- certificates that are pretty much worthless).
Also, scope and scale. Projects are much bigger, nowadays, than they used to be, and we have found ways to apply classic techniques in new ways. Instead of learning how to write a device driver, we learn a device interface SDK. That's not a bad thing (as long as we choose a good SDK), as it frees us to do a better job on the higher levels.
One example I give, is that I started Apple programming with MPW[0]/Pascal (not Object Pascal)/ASM. It could take a week or two to produce a relatively simple GUI app.
Nowadays, with Xcode and Cocoa, I can spin up a fairly full-featured app in just a couple of hours.
Very little of what I learned with MPW will help me today, but the discipline that I earned is quite valid, and much of what I had to do by hand, is now done in the framework, so I do have a bit of an understanding of what is going on "beneath the sheets."
[0] https://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Works...
The thing that I find difficult is how quickly trends and fads shift in this industry. I came out of mathematics, which moves much more slowly than tech in terms of what's fashionable. I think it's a function of the sheer number of people working on tech compared to math.
It's like hearing all the microservices hype, sitting down to read it and thinking that it's "just" SOA slimmed down with some of the more complex vendor offering replaces. And that both are "just" Smalltalk-style message passing that happens to occur on multiple machines. Or that Kubernetes is just a bunch of nodes running processes with Docker as a process manager (reading the paper on its predecessor, Borg, was very enlightening). That C# is "just" Java that has been cleaned up.
The disappointment is that there is all this hype that would imply the world has changed and you realize that it may be a serviceable tool, but it is "just" something you've seen before remixed a little.
It's one of the reasons that I have a hard time getting excited about learning another web framework or another C++/Java-ish programming language. I can learn by diff'ing pretty quickly, so I tend to read broadly, looking for stuff that looks like it might be highly differentiated. I tend to burrow deep onto things of either immediate use or that will provide a different world-view (for example, learning Prolog will probably teach you a different way to look at problems whereas learning, say, VUE.js after having done Angular might teach you a useful tool, but the world view is more or less the same).