Senior engineers are living in the future
zerobanana.com
zerobanana.com
Now I do it and do the same things they did with me: facilitate my thought and troubleshooting process rather than give me answers. I think the people that are successful in Senior+ engineering are that way because of certain technical and character traits they've developed.
One is a willingness to be right in the long run. When I was a young engineer I would make my cases hard with data. As a senior engineer I sit back and let the machine mull for a while because I know that's what the engineering machine will do regardless of how technically right I may be. Another is knowing that right isn't always right. Sometimes the right answer is technically wrong, or the learnings of wrong need to be made before we collectively can be right. Another is a lot of patience; patience for myself, patience for others. I recently admitted I was behind on work because my power was out for three straight days. Young me would've found a coffee shop and worked those days with a single monitor down to the bone. Senior me took my dog to the park.
Not everyone makes it to senior, had I not forked my path in certain places I don't think I would have. My advice, relish your time as non-senior and ask lots of non-technical questions. The technical stuff comes over time and by necessity.
As a someone who isn't a junior, having two years of game development (in-house game engine dev) and five years of enterprise (mostly web-based internal tools & some data engineering with big data) development under my belt, but hardly a senior either, what do you think as the alternative to not "making it to senior"? Asking out of curiosity.
A lot of intermediates used to be stuck in this limbo zone, but some companies entry level "senior" now is basically what high-band intermediate used to mean. Worst case - paid the same, more ego. Best case - the pay band start to cross over to higher realms without going that far into the "hardcore senior" zone.
Nothing is wrong with optimizing for actual life things. It's hard to not be a company man when you reach the higher echelons. Generally, your real life suffers some. Especially since the invention of pagerduty.
In my career, I quit my corporate job and I am now focusing on engaging myself with meaningful engineering work where I can collaborate with other passionate people to solve real problems. Just like my Dad, I could be making more money climbing the ladder, but I guess I learned from his example that there is a whole lot more to life then that....
Also, I once worked for a military contractor and one of the lead engineers told me the company valued people who wanted to remain engineers instead of moving into management. It was the path he'd followed himself as one of the founders of the company. I believed him and avoided management, only to find eventually that there was no such path to becoming a senior engineer who did no management. So I quit, which caused me a lot of trouble, but it also denied the company the benefit of many years of my learning on the job (there are few ways to prepare for a career in top secret military contracting because you have to get a clearance first before you can start studying many of the things they work on, so a trained employee is much more valuable than in many other jobs.) The senior engineer had the right idea, but he'd never actually checked that his career path was viable for anyone who was not a founder. I think this is a mistake that many companies make, essentially forcing people into management. It is very similar to the idea behind the "Peter Principle", that people rise until they reach their level of incompetence and then remain there. Engineers rise until they are forced into management and have to stop doing what they do best.
Right isn't always correct. Being correct is being free of error. Being right is being free of blame. We should be correct in the technical, and right in the moral. If the problem involves both we should make it someone else's.
Instead, I find it better (except for how long it takes) to walk them through finding the problem as if it's really hard and just nudging them to the steps they'd need to take to find it themselves. They learn even more, and it doesn't immediately show the difference in skill between you and them.
At the very beginning, even a small difference in skill can seem like a lot to the lower-skilled person.
Admittedly, when I started at the present company, I also remarked "this logging tool [Sumologic] is pretty difficult to use". The response from my senior engineer at the time was "it really isn't that hard." and then she didn't answer the question I had and made me figure it out on my own. It felt a bit brusque at the time, but it was very useful in the long run. I did end up figuring out how to query Sumo (I still maintain that its UI is gawd awful), and that's enabled so much debugging.
I think I also ended up authoring our internal documentation's page on how to effectively query in Sumo, which I feel has been read never.
That's a shame, because often I think people that have competence in a subject come naturally to them end up at a disadvantage later, because their foundational knowledge is lacking (at least in cases where that's possible and learning was self driven).
One example of this is learning a programming language through doing compared to actual study and research. By "doing" I'm not referring to a project to cement details, but for example how most people know bash.
Another example would be spoken languages and some of my college professors. I'm not sure I ever heard anyone speak with as good of a vocabularity and diction as one of my CS professors that English wasn't his first language.
Of course, you can always choose to learn something you aren't best at, but at least you know the trade offs (i.e. needing to spend relatively more time to reach the same level of competence as more talented person).
You just have forgotten what it is like to be a child who knows nothing. I've been speaking English since I was a toddler, I'm learning Spanish now and I make tons of mistakes and often can't understand even a basic sentence - but in fact I'm a lot better at Spanish than I was at English when I had equivalent amounts of study into English.
Once you are a minimal level of competency it is a lot easier to study as well. So if you have only a tiny head start you will be top of your class, and that is always more enjoyable.
The mental sphere is where it becomes super vague for me. Did John Von Neumann just study really hard? The anecdotes told about Feigenbaum of Chaos Theory make him sound like a savant among savants. They just kept that childlike curiosity? Doesn’t make any sense to me. It seems they are tuned differently.
....That doesn't track.
If there is such a thing as lack of talent, then "talent" is just "not lack of talent".
For good reason. Wisdom is recognizing which is correct for the current situation. There is no rule that applies to every situation. You have to make a choice and stick with it. Sometimes that means you try something decide it isn't for you. Sometimes you try something and even though you hate it, someone needs to do it so you keep at it - of those sometimes you will turn out to love it in the long run sometimes it was just a job. (it seems to me the only people who actually hate it are justifying a mid-life crisis that turned them to something new - if the mid-life crisis hadn't worked out they would have returned and been happy)
May God grant me the courage to change things that I can, the patience to endure the things that I can't, and the wisdom to know the difference.
if(/some really long boolean value with AND and OR clauses/); { /* some code to execute if TRUE */ }
He was sure that the if statement was FALSE some of the time, but the code inside the brackets would always execute. He spent more than an hour pouring over the code.
It took me a few minutes before I noticed the semicolon at the end of the if statement. I'm sure he felt stupid when I pointed it out.
He certainly did. There is no amount of experience that makes people not feel stupid about those. What changes is that you learn to not be affected by it, because you know that it's not a personal flaw (at least not one specific to you), and while you can improve on it, you can't completely fix it.
But the alternating between feeling like the dumbest person on Earth and the smartest person on Earth never goes away.
After at least a few hours away (ideally not coding) your fresh eyes will often spot it.
Similarly, demoing the bug to someone else is a good way, and often through the mere act of demoing it you'll find it yourself (also known as "rubber ducking" [1]).
bool condition = /some really long boolean value with AND and OR clauses/;
if(condition); { /* some code to execute if TRUE */ }
Two advantages of doing it this way:1. It's much easier to notice that incorrect semicolon
2. Even if you don't, you can stick a breakpoint (or log) between when condition is set and when it is evaluated, to convince yourself it works.
3. All modern compilers will produce the exact same code as they produce with it mashed into the if()
if(!condition) is a much better read and less prone to errors than trying to negate a long statement inside the if().
This pattern also eliminates duplication. I have fixed bugs in code where the same long if condition was duplicated several times within the same function (probably with cut and paste). This wastes cycles recalculating it each time and runs the risk of changing one of them without changing them all.
bool subCondition1 = /* something kinda long */;
bool subCondition2 = /* something also kinda long */;
bool subCondition3 = /* something absurdly long */;
bool condition = (subCondition1 && subCondition2) || subCondition3;
if (condition) {
/* do something */
}
where, ideally, the sub conditions all have meaningful, relevant names that succinctly express what they were testing for.Your change also got me thinking of unit tests: at some point it becomes worthwhile to have dedicated tests on that condition, and that's often easiest by putting it in a static method, and that also improves readability.
I take a different approach where I immediately point out the issue, and if they get discouraged about how fast I solved the problem, I remind them that I’ve spent hours banging my head against the same issue. They will probably run into this same issue again, and get stuck again, but next time they’ll figure it out faster, and the time after that a little faster, until it’s basically instantaneous. And then when they’re instantly able to solve a problem for a newb, they’ll have to give the same explanation as I’m giving now.
I've reflected on this point quite a bit because I really struggled with it when I was teaching myself how to code. It's extremely demoralizing in the beginning, because of a couple of root causes (IMO).
1. We place a lot of cultural value around "genius", and we often ascribe that quality to programmers, mathematicians, etc. While some of them undoubtedly are, it's not clear what that genius actually is, and a great deal of people mistakenly believe that they don't have the "right brain" for it, or are not "smart enough", because they don't feel like geniuses. When you make several mistakes when learning a new activity, every mistake reinforces that perception.
2. There are two relationships you can have with technology - that of a consumer , and that of the provider. As a consumer of technology, your perspective is that "technology works", and if it doesn't work, then something went terribly wrong. But once you become a provider of technology, that perspective is flipped. Technology is broken, and if it works, then something went wonderfully right. It takes time to develop that perspective, and so young engineers will have their programs break constantly, not realizing that "broken" is the default state of the world, and in fact now their job is to make things work. Of course it's broken.
If it were easy, everyone would do it and it wouldn't pay as much. It's supposed to be uncomfortable in the same way that exercising at the gym feels uncomfortable. Thinking is effort.
I've been coding for 15 years and could not imagine myself in your classmate's place - but I feel exactly the same while learning to draw.
I try to draw a somewhat straight line or something at least resembling a circle, fail, and feel like it's completely impossible to me, be close to tears, and everyone who can do it might as well be a wizard.
Most people naturally choose to focus on things they are relatively good at, instead of keep banging their heads on something they struggle at.
GP's comment seems to imply it was a negative experience for the newbie, but in all probability given the daily frustrations and chaos of software development in the real world, switching majors might actually be the "right" decision for that person.
> Most people naturally choose to focus on things they are relatively good at, instead of keep banging their heads on something they struggle at.
My parents told me I had to get a degree - they had very little appreciation for art, and some appreciation for engineering, but 0 understanding of computers. So I enrolled in CS so they would get off my back. Before college I had written maybe 50 lines of C.
I was never particularly good at CS - I just did OK enough under the pressure of having a clear goal (a degree) and there being no alternative to success (definitely not moving back in with my parents. I would have preferred joining the foreign legion).
When something goes wrong on the computer, there are two types of reactions: I am wrong, or the computer is wrong. The "I am wrong" person is discouraged and never gets very good at computes. The "computer is wrong" person persists until they bend the computer to their will.
Local football coach often says “failing is progress”:
You have an opportunity to distinguish yourself. You already stand out and break the mold as someone with a nonstandard background, and it will get noticed—and treated differently—if you excel.
There is nothing special at the top of the ladder, just more money sometimes. Money isn't the only way to build a good life, and that's all money is good for.
Point being, don't blame your age. And don't underestimate yourself. And definitely don't compare yourself to others. If you are growing, then good fucking job. Keep doing that and maybe switch positions to somewhere more conducive to your growth if you feel like that's necessary.
If you want to be an IC, don't short change your accomplishments. Eng Mgr is not a promotion from IC, it's a career change.
The SWE career progression is much more established, and is often much more formal and understood than an Eng Mgmt track.
Your younger manager has recently gone through a significant career change that requires a significant amount of self-education to advance further. It's possible he'll advance opportunistically (if there's a vacancy) or by being clever or political, but his competency will not necessarily advance with him without him putting a significant amount of effort into learning this new career.
It's not uncommon for established SWEs to make more than engineering managers until the engineering manager has progressed to a level where they are dealing with levels of stress (business & social) that would make most people's hair fall out.
Even then many companies have career tracks that pay as well in the upper echelons for individual technical contributors as for high level eng mgrs. The one thing they have in common is that there are very few positions at the top of any career ladder. It gets competitive. Hopefully your aspirations match your talents so that you can compete for those fewer positions.
I’ve been an engineering manager for over three years; and the skillset is completely different. So much so that I recently flubbed some easy LC questions.
Businesses may treat it as a promotion, but don’t make the mistake of thinking it really is one.
Which for me means that you don't yet know what advantage these 'wasted' years could give you in the future. Just trust yourself to make the best decisions you can given the circumstances and you'll get to where you want in as little time as you can.
Instead it turns out that I'm just piling little pebbles of knowledge and experience on top of other ones, and I couldn't look back and design a book or a course or a curriculum to bring my old self to where I currently am. There are some pebbles just sitting on the side that haven't had an opportunity to be integrated into the pile yet, and some never will. It's all so... random
- Have experience
- Self learning though above experience.
I met many experienced developers, but most of them failed at step 2. To me, they're still junior.
I am stuggling with helm/kubernetes and the new company's ecosystem where everybody is new in the team. We are expected to deliver according to a plan while we keep hunting for relevant info.
I would say the second point is a lot more nuanced than stated.
Even those of that had it working, it was a huge time sink.
(asking because my own team is currently moving in this direction, and I'm curious about the pedagogical challenges we might face)
And Helm is just closing the cycle of Samsara - if you really want to base your operations on string templating, just use bash lol. Or hand-written forms on paper, still faster and you still get a better idea of what's going on.
There's also the problem of many developers nowadays just not having the hacker mindset/actual high-level abstract thinking/attention span, so instead of seeing the whole of K8S as the pointless kludge it is, they only see the interface - yay, YAML, I know that language! (usually they know it from everyone's favourite "dead" tool, docker-compose; which is a gem) - and they go on to fight with it tooth and nail, with corresponding feelings of "achievement" and "mastery".
I think the "10 years PHP/Java -> 3 days Go" thing from granduncle's cousin post is meant to point out this particular paradoxical situations.
But it could hurt people's feels to say it like that so let's just let Google do all our thinking for us instead. We truly live in a gilded age of computing.
This _could_ be true for some, but it directly conflicts with the stated goals of the language. Most people (that I've spoken to) would consider Go to be a simpler language, with fewer features, than other comparable languages.
Concurrency is tricky, and that is true in every language, but less so in Go.
I can't speak for Helm, but working with Kubernetes in Go is almost uniquely difficult. Kubernetes modules are designed to be dynamic, and Go's type system doesn't make that easy, which leads to some cludge-y code out of necessity.
Plus the API is vast, and it's sometimes not clear what package you need for a particular use.
golang is a language designed for fresh graduates to write fast code without much thinking. It isn't tough at all. For engineers that never worked with CSP paradigm, or rather for engineers who only ever work with Java style OOP and concurrency, it might be weird to adjust, and they will spend 3/4 of their time bitching about how much it is easier in language X.
Idiomatic Go has some very large differences from idiomatic Java or PHP, including things like 1) the reliance on multiple return values and early exits for error handling 2) interfaces instead of inheritance 3) plain old data structures instead of everything-is-an-object 4) goroutines 5) table-driven testing 6) complete reliance on gofmt for formatting rather than doing it manually. And that's just the stuff that I'm aware of, as someone whose primary language is not Go but worked in it for about 3 months.
My definition of a senior dev would be someone who's aware that they can't just pick up a language in 3 days and write idiomatic good-quality code, but expects that they're going to have to keep learning for multiple years to really master a language. It's the metacognition of realizing how little you know and always continuing to learn.
We like to talk about how code is written, because we look at code all day. The rest of the world only cares about what your code does once it's compiled.
Senior engineers solve problems. They're not overly concerned with ticking all the boxes just so they can get a "good code" sticker.
While I do agree that many developers sometimes like to argue about "code quality" too much (and I've probably been guilty of that at times), "code quality" is definitely a real thing. I have have interacted with code bases that were a joy to read/modify, and I've interacted with code bases that made you pull your hair out at every turn (and also many levels in-between the extremes). It is not always a case of just "arguing for the sake of arguing".
But I strongly disagree with the sentiment that someone should not write code in a certain language, or should not contribute to a project until they know how to write idiomatically according to all the "accepted" best practices. It's a pedantic and elitist attitude which has little to do with making good software, and runs counter to the practice of learning how to use a language, which is necessarily a process involving ignorance, trial and error.
As a senior I can pretty quickly tell in the languages I write in often, when something is a smell, and if you keep repeating some code smells for a like a year you'll start seeing compounding effects on development speed. Understanding when to allow those with good reason and when to coach someone to stop doing those is an important skill for a senior imo.
But it's definitely not immediate, way more of a pernicious concern, the codebase will effectively rot until it's painful to make changes.
The point where this happens depends a lot on problem domain. If you're doing well-understood CRUD-screen database stuff but applying it to a novel business domain, you're probably not going to hit code quality issues. If you're doing heavy algorithmic, OS, financial, or networking stuff, though, where failures compound and any one bug might take the whole system down, you really want to pay up for experienced developers that have seen all the ways these systems can fail.
That said, I can really only speak to web api dev, data engineering and search. I'd say out of all of those search was the tightest area with regards to quality and even then I was lucky to be working with another very talented dev. Him and I didn't run into very many issues we were unable to solve with scaling the technology even after hitting 100m pages or so and we could have kept going on scale but we were cost constrained, navigating the business side was far more challenging for us.
I'll admit as well I've been pretty lucky so far to work in situations where code quality is considered and managed and haven't yet worked somewhere where the concerns were entirely ignored or the team didn't care.
People in your company (including non-engineers) definitely care, because code quality bears on how easy it is to debug problems and how easy it is to implement new features or fixes (or sometimes if a feature is even practicable).
The rest of it is learned (hopefully quickly) through the CRs, and any senior engineer should be comfortable making a few idiomatic mistakes in their CRs that they learn from.
I could do all those setup things in N days without ever learning any programming language.
“3 days into the job”
Any engineer should be able to do this because the team has written good wikis and has working build tools, tests, etc
I basically learned ideomatic go in a week, by skimming over the "effective go" guide and cross referencing concepts to other languages I know -- there is really nothing inherently 'new' in Go that would require years. It's a deliberately simple language.
Are you going to write elegant, idiomatic code in the first week? Of course not. But give the task "make the system do X", 90% of coding is knowing how computers work, and the other 10% is knowing how to search on stack overflow to be able to translate what you want to do into the desired syntax.
He had spent the 20 years copying the same html file and changing the text for whatever was needed.
Struggled heavily with the concept of a loop.
Dream job right there.
Can also describe a complex single-page web application :-)
I have long subscribed to "A programmer is not language specific", and I don't hire based on the languages you know. But that first task is "Here is access to the repo. Read and understand what our code does today please. I'll answer questions within reason." Acquiring the new language happens as a side effect.
Learning a language and mastery are separate things. An actual experienced dev should be able to hit "competent" in any new language within weeks so long as it's within the same family of languages they've used in the past. Procedural languages, like C, are pretty much squarely in the middle of what everyone has learned unless by some fluke they started and continued with Haskell and similar languages and never touched any of: Go, Rust, C#, Java, Javascript, Lua, Python, Perl, Ada, Pascal, Fortran, Matlab, BASIC (various forms), and a hundred other languages.
You would probably not want someone with little experience in given language, to touch production codebase without review, because there are always traps that you might've not encountered in other languages.
I typically don't touch low-level programming languages, but once I had to use C to write some small adapter to communicate with some Oracle product. I did it, it worked as expected, but I would not be able to use it efficiently for complex solutions without more experience with creating and managing solutions in C.
I can also write in Go with some basic proficiency, I felt confident at one point in my abilities, but when my code got reviewed by someone specialized in Go, he would propose several improvements that did not cross my mind, because I had less experience in Go.
I never said otherwise. This is part of the distinction between competence and mastery. I would not expect most people to master a new language in just weeks, but a senior developer should be able to be competent within weeks. Now, would they have a product or substantive (non-trivial) change to show after those weeks? Maybe not, that might take a few more weeks, or longer if it's larger in scope.
> I can also write in Go with some basic proficiency, I felt confident at one point in my abilities, but when my code got reviewed by someone specialized in Go, he would propose several improvements that did not cross my mind, because I had less experience in Go.
That's part of learning, but it probably didn't take you a year to learn enough Go to get something in a reviewable (if not passing review) state.
I wouldn't want anyone, in any language, with any level experience to touch production codebase without review.
Not even K&R themselves.
So that's a ridiculous straw man.
Everyone makes mistakes. And code review is also about knowledge sharing and avoiding single points of failure in staffing.
This feels like a town cop enforcing strict speed limits in the couple of miles that fall in their jurisdiction. If K&R show up at your door and want to touch your production code, you just let them, bring them coffees, and ask for autographs. Even if it breaks, it would be an amazing story.
As we all know, the subject of UB and the practical ramifications of particular instances is a topic few people could reasonably learn in weeks or even months.
Maybe six months if you're very good, but I'd wait a year before assigning a big project to someone new in a language/framework. Still wouldn't consider them a master with just one year of experience, mastery of a modern language can take years, you can always go deeper.
If you had 10 years of java, you can absolutely learn how to write Go in 3 days, unless your 10 years of java is "writing CRUD in Java 6 with libraries available in 2006".
So I don't think it's an issue, if that's been your job. My job exposes me to a lot of different technologies: many programming languages and endless different software that might be supporting a web application (databases, webservers, firewalls, etc.). I consider my value to be looking at problem and being able to spot 10 different possible points of failure in a system in my mind and order them by priority based on likelihood and ease of troubleshooting. And this is something that I think is only gained through experience and that's what separates me from someone who just started.
For a little annecdata - I've been a dev for 25 years, with a senior level (and above) title for about 80% of that, and I reckon I'd take at least a couple of months to get to a point where I was happy with golang. I guess that makes me a junior in your opinion. However, instead of being able to get up to speed with a language quickly I bring a fantastic level of respect for users, a talent for technical writing, a belief that documentation is actually important, a sense of fun and joy in making high quality software, and a deep understanding of browser-based software. If I was looking for a new team member I'd seek out someone a bit like myself rather than someone who can learn a new language faster.
This is, IMO, a hallmark of "senior" engineers and above. Much more important than language adoption/choice.
The whole stack? Takes about a month to get productive and about three months to really internalize. Think interned strings in Python vs symbol exhaustion in Ruby. Or serializers in Django Rest Framework working as both input validators and output generators compared to stock Rails views.
Super similar languages with lots of similar frameworks and libraries, but they have these edge cases that still crop up.
- Y-yes...
- You are fire!
Note: Sorry for the cheap joke, I also make frequent grammatical errors in English.
In 3 days someone should be able to fix a small business logic bug in a program in a new language, like copy-pasting a if-block to handle a new simple case, or improving an error message by grabbing a variable from context and for setting it for output, but not write a useful program.
Show me a mid-level engineer and I will show you someone busy walking straight into a trap.
* also me sometimes, but that's confusing since I just used the commercial definition of the word a few comments above.
Looking back, I accidentally turned my first full time into a senior position almost immediately
A local company gave this self-taught developer a chance as a glorified intern, but a few weeks in and I reimplemented a project they had given to a contractor in a weekend after overhearing their back and forth.
We ended up shipping my MDM on hardware across the country that Christmas, less than 3 weeks after that weekend project, and I spent the next 2 years extending it as a platform: completely driving the functionality that sales would then go and sell new clients on, designing and implementing an autoscaling analytics backend and frontend, embedded V8 so that client's engineers could script the product without mucking in my codebase about with source access ;)
I remember I got a 25k pay raise at one point by simply saying "I was thinking I'd make more once we got past the evaluation period"
I had actually been trying to ask for us to set up a performance review, but in retrospect they were probably terrified of losing this guy they were paying half a senior dev's salary to do 2x the work, and were ok paying 2 thirds of a senior dev's salary instead...
In some ways I feel like the work I did there was more senior than the work I do now, at least in a technical sense. I think it's the soft skills that come from experience
More than once I've proven my value as a senior engineer by refusing to do work that should be left to someone else. Sure I could figure it, but it would be a waste of time when someone else can. Sometimes because it is obviously an easy task, and thus good for a junior engineer to learn to figure things out on. Sometimes because it is something I'll never need again and I know we can hire a contractor who already knows how to do it.
I.e., the politics of resentment have reached even here. Do junior engineers prioritize avoiding embarrassment over learning?
This is a really, really tough nut to crack. And let's not always hand-wave about safe cultures.
When in senior roles, I try to model learning from failure and sharing everything, from short script tips and fantastic books to leads and gossip. Also sit together.
But still: juniors have literally complained that it doesn't matter when I fail, because I'm already "made". Their sense that they have to prove themselves, and advance on some ladder, hangs over them always. Even, or especially, at leading companies, where everyone there is good.
Part of it may be style: if after a while you drop all the "please" and "maybe", you risk people confusing assertiveness with authority (triggers).
Feed them achievable projects where they can hide failures and show success. And give them their say. Doing this adds a new dimension of complexity to meetings and work factoring, but they eventually chill.
If it's better to teach someone to fish, think of it as producing fishermen instead of fish.
They are not wrong. I've been around long enough to earn some trust. I can (and have) made some major mistakes that would be reflected on a junior's raise, but I get by with it. I'm also working in places where those mistakes are more likely because we don't trust juniors in them. I like to think I make less mistakes than the juniors would, but I'm not sure...
If you are a junior, just wait - your turn will come.
"Ensure that you are fulfilling the expectations of your manager"
Please please do not assume your manager is any good at their job. Talk to your users. Find a way to identify them and get feedback from them. Keep your manager in the loop sure. But don't wait for requirements to come down from on high.
"Every step up in job title is equivalent to living perhaps 1–2 days further into the future." No. If an organisation passes information down through the hierarchy then by the time it reaches you (it's more like 1-2 weeks if not months into the future) then it's already moved on.
The US military tries hard to put decision making at the front line where it is most up to date. At the Battle of Jutland the British ships in the fleet had to radio its positions and sightings back to London, so London could update its "board" and radio to the Admiral in the fleet. This Admiral was this working on data that ships a mile or two away from him had had hours ago, but he was only just getting. This lead to an inconclusive battle.
Anyway.
Open information is way important.
Granted this does not hold for 1) small startups where everyone has influence on the direction of the product and bureaucracy hasn't taken hold yet, and 2) FAANGS for the most part appear to operate under military like organization and allow for IC's to make decisions without 12 levels of approval.
But in general I feel if you want people to take risks for you, it's best that you pay them so much they stop having worries at home and just have worries at work. Executing people for failure looks like it gets results, but often it just gets results hidden
There is a point to not executing people for failures so that information isn’t hidden but when “not getting paid massive amounts of compensation” is equivalent to execution I think you’re going to have the same bad behaviors.
I can guarantee you that no matter how good or bad their manager, if you don't meet their expectations, you are in trouble. By all means, own your local decisions, be proactive, keep your manager in the loop - AND MAKE SURE THEIR EXPECTATIONS AND YOUR WORK MATCH. That doesn't mean waiting for requirements, but that means your manager knows what you do and agrees, at least in broad strokes.
Surprising your manager unpleasantly never leads to good outcomes for you. There's only one person holding power in that relationship. (Positive surprises do work, but they usually take the form of "I did what you expected, AND".)
Totally agreed that the 1-2 days in the future thing is wrong. As a senior you should be at least a couple of weeks in the future, better if it's months. At the staff level, 6-12 months. At the principal level, 2-5 years.
If it's just a few days between each level, a) somebody is failing at their job, and b) yes, information will be outdated by the time it reaches you.
Not quite 'my' manager directly, but a client's PM. They had a ... PM/PO type person who was quite insistent that we had to have feature X by date Y. Slightly aggressive, but... sure. Between that insistence (over weeks) and the date Y... that person left and a new person started.
4 days before a walk through (where new items were demonstrated to stakeholders, and company owners), I sent the completed functionality over to the new PM (he'd been there a few weeks, but obviously still... new). "looks good" he replied. I checked that he'd at least watched the video I'd sent over.
Demo happens and I show the functionality, with the "this is vital to have" from the previous PM. Silence. Then "we didn't know that was being worked on". Behind the scenes I was somewhat thrown under the bus, even though I had jira tickets, paper trail, video evidence and assorted other info. "Lowercased is ... subverting the process" and I made a whole team look bad. Even though... they all had signed off on what I was delivering. But behind the scenes, new PM had told people "feature X won't happen" (i have no idea why that was said) but apparently I made a lot of people look bad, because I'd delivered something they said wasn't going to happen.
So so so weird...
The lesson I've drawn for myself from similar incidents is "know all the stakeholders, and talk to them". Consulting/client work makes it extra hard, because stakeholders just keep coming out of the woodwork :(
Do as I say or else? Why not, credible mission, great story telling, compelling vision, a well argued rationale.
I mean. If we paid everyone UBI, then every compmay would look a lot like the Linux Kernel (insert preferred less shouty FOSS project here)
If you have to produce a well-reasoned argument, and successfully convince all peers that your argument is in fact well-reasoned, and comprehensive, and handles all concerns of all involved or potentially involved, and that all opposing arguments do not meet these criteria… it will take ages to get all stakeholders in agreement, and even when you do, you get a horse designed by committee (a camel).
Projects with no owner consistently end up in the same rut — always planning but never doing. Bikeshedding.
So you need the owner. But for someone to own the project/task, he needs to be in charge of it — he needs power. For what is power if not the ability to make a decision and have others follow through on it?
In arenas without defined power relationships, but manage to produce useful work, it’s usually the case that the power relationships still exist; they’ve just been made implicit. You see this in geopolitics, in your high school group projects, in Valve, etc. Determined not by corporate hierarchy, but instead charisma, money, social networks, physical/military strength, etc. Most of which is reflected by the corporate hierarchy anyways.
Businesses just make it explicit, and consider it valuable enough to attach higher pay. You might make the argument that managers don’t deserve higher pay than an individual contributor, but it’s clear enough that a manager has much higher potential impact than an IC — if you manage 100 resources, making them 10% more efficient than otherwise, you’re doing the effective work of 10 ICs. But in my head, a resource-managers role is primarily to make his team more efficient — by optimizing processes, clearing blockers, umbrella’ing against shit from on high, reporting upwards, to guide the overall direction of all involved — not to dictate the every individual activities of his underlings.
Also the Linux Kernel clearly has a power hierarchy, and while that power hierarchy doesn’t dictate what you work on, it does dictate whether your work can hold any value (by getting included into mainline). The difference just ends up being in the fact that it really doesn’t cost anyone anything for you to continuously do work that’s ultimately rejected every time, whereas for a business it obviously does (in the format of your salary). Obviously you can fork if you want and make it perhaps valuable… but you can exit the hierarchy just as well in business by quitting.
Maybe. Supply and demand is always at play. If any manager can make 100 developers more 10% more efficient, but only a few people who have any ability to be a developer at all, then the developers are worth more. Numbers are relative to supply - my company has discovered we have to get ICs better raises than their manager at the lower levels as our great developers were becoming managers. We can get managers from lots of different entry level areas, but not enough engineers.
Any tech manager even remotely worth their salt should be able to function as a senior+ IC if necessary. If that skillset is lacking.. maybe you want to rethink your hiring. You'll likely never see the effect of a good manager if you don't.
As for your argument that developer scarcity somehow makes managing worth less - the opposite. If you can hire a single person that can effectively give you 10+ devs without having to hire those 10+ devs, you want to hire that person.
And for the "ICs need better raises, or they turn managers" - uh, no. But you do need to offer parallel development tracks, with comparable advancement opportunities. (In reality, IC & mgr raises should be roughly similar in terms of percentages. If you value managers, at least)
Then you'd expect fewer developers, and fewer managers overall. Unless you hit some really low threshold (e.g. 5 developers, so the same manager is only worth 50% an IC) where the cost of manager doesn't "pay back" in developer-headcount-reduction, it'd still follow the same strategy.
And of course, the amount of "pay-back" you get from a manager would naturally be how one derives their value, and thus their paycheck.
But IC --> Manager as the only promotion track is completely unnecessary, and generally a mistake. That's just intentionally driving into the peter principle (promoted to the level of their incompetence), because you've simply left no other way to go. Usually you have the alternate track for IC's expanding into larger/more abstract/more important domains, but not head-count; technical/solution architects and what-not.
But the story hasn't changed -- if you assume the role of the manager is to make their resources more efficient, then a manager's value scales with the number of resources under him; an IC does not. It will always eventually make sense for a manager to be more valuable than an IC, and this only holds false at low headcounts.
Behind the scenes, without telling me, telling other stakeholders "feature X is not being done".
Demo feature X.
"Whoah, you really blindsided us and made people look like they don't know what they're doing".
Had this been, say, 5 weeks ahead of time, yeah, maybe. This was ... 3 days? Monday afternoon to Thursday afternoon - maybe you could count that as 4.
This had grown to the point where I wasn't allowed to directly talk to the major stakeholders. This demo meeting was the time to talk to them, for a dog and pony show only. 18 months earlier we had more regular (still in a group) communication, but it was possible to talk directly. As this grew, my own ability to talk directly to people was layered with middlemen, which exacerbated this sort of problem (had happened before, but never for something this 'important').
What's... funny about all this is that the earlier PM had made this feature of paramount important, but it turns out ... no one is using it.
EDIT: both at the time, and now, I looked at it as "mistake". we're human and things happen. but it was framed as "lowercased was hiding information, working in secret". this was not the case.
Business leaders love to imitate the military, but isnt it ironic they are emulating the institution that has the most government involvement and central planning?
As a senior engineer that is what my manager expects me to do. In fact I'm often expected to define the requirements before working on them. Often when I get the requirements refined enough I hand them off to other engineers.
Of course there is personality involved here. I pass things off before I don't enjoy the boring grunt work of putting the final polish on, but I work with people who prefer to put the polish on an already solved problem. This is a win-win as both of us avoid things we don't like. (note, putting polish on is at least 90% of the work, so I can't completely get out of that, and junior engineers never can). There are other problems that other senior engineers work on that I never touch - they are the experts not me
"Just tell me what to do" is like the anti-senior developer philosophy, particularly if you report to someone who is non-tech.
If you're senior you should be the one setting the expectations and lay out a (working) plan to fulfill them.
Perhaps I am saying that changing the game is better for everyone than learning to play the current one well.
Seniority in a lot of ways feels like the acknowledgement of being able to utilize people/soft skills in order to build things. I find at least 1/3 to 1/2 of my time, a roadblock in the project is caused by accidental miscommunication from top down, and the faster you can debug those, the happier everyone will be.
Personally I rather enjoy that hybrid of people and "hard" design, but it's definitely not for everyone.
I love this! It can feel frustrating to need to use these skills to exert influence: I sometimes feel disempowered by not having the full resources to throw around that I want.
But that doesn’t really limit my ability to do the work. I’ve just had to cultivate a different skill set. Persuasion, not coercion
I have yet to see a manager or organization that doesn't compare on some level, even if it's just implicit biases.
It’s obvious when someone is contributing to the organization in good faith / trying to do their job well, vs trying to edge out a colleague in specific eval criteria to look better. The second is not a good look, but I highly value (and reward) the first.
This has been the only way to increase our pay beyond measly 2-5% growth if you stay at the same company.
I would love to not jobhop and become a 'superstar' but making half the pay of your peers is really intolerable.
Another reason (which is why I do) is that life for some of us isn’t as stable. I move. I’m forced to sometimes because of rent. Sometimes that means having to find a new, cheaper, city to live in. Sometimes it’s to relocate for that new position.
Next time you see someone who has worked at several companies over a decade, ask why and understand their reasoning. I would love to work at a company for 20+ years. I can’t stay put in the same position for that long.
Often the superstars are just normal people who really knows the business well and therefore what makes sense to implement and what should be skipped.
When you earn enough money for a decent lifestyle, then I think this becomes the major reason for a lot of people to jump ship: you join a company but leave a manager. https://getlighthouse.com/blog/people-leave-managers-not-com...
Exactly. And isn't that memorisation by repetition? If you will come across something often you take a good guess on how it works.
Why not? Because stuff will fuck up if you don't do that.
Also, you have to deal with the "regional power failure" situation, where every one of your devices will call home at the same time. Do devices need provisioning before they work? Because if they do, you need to handle that load fast.
Do you believe a MAC address is unique and universal? It isn't as unique as you think, and not everything on the internet has a MAC address.
Essentially, someone who's been around for a while realizes there's a difference between the spec (correctness) and what needs to happen to get shit to keep working (customers).
I'm "yes and no" on this. The reason is that I often look at the work/process/product of others, as inspiration. There's a lot of folks that are better than I am, and it is a good idea for me to keep an eye on what they do, and how they do it.
What I don't do, is compete with others. I am not competitive, and I'm fine with that.
Unfortunately, that seems to be a bit of an aberration. I am constantly having others take a competitive stance with me, and it can add a lot of friction; when they refuse to share information, make a point of being "snooty" with me, or assume that, when I talk about my work, I'm trying to cast their work in a negative light.
That's not usually the case. I have very high standards, and I hold myself to them. If I will be incorporating the work of others, in mine, then I'll hold them to high standards.
Otherwise, I've actually found a lot of gems in things like sloppy StackOverflow examples. Their lashup code may solve my problem, and I can take their solution, and refactor it into one that meets my own bar. I don't waste any time, thinking negatively about the other person. In fact, I'm usually fairly effusive, in my thanks. The person is often coming from an academic point of view, and are not concerned about the practicalities of shipping software.
There's so damn much negativity, these days; often driven directly by competitiveness, that I feel I need to reduce my contribution to it.
It's all about attitude and egos. There are devs who call themselves senior who are theoretically proficient coders, but who lack the "street smarts" of how to develop a useful product, and how to architect it well.
The person with 10y+ more experience is going to run circles around them. Not because they can crank out code faster, or with fewer bugs, but simply because they can do a lot more with a lot less, and they can contextualize what they code in terms of what the business is going to need 3-6-12 months down the line.
As a junior you can either be resentful and try to compete from afar (job A), or you can realize you had access to a wealth of knowledge and experience that can give you a multi-year headstart on your peers (job B). Choose wisely.
As someone more junior, I've already seen this and realized what was up and I absolutely hate it.
In many cases there is literally no reason other than seniority that people can't do things. If you gave the same information access to a capable junior or mid level eng they would be able to solve these problems, write the document, etc but that doesn't happen because it's not explicitly part of your role.
My manager also has to balance what work to give to which person. It's very unlikely he's going to give me the opportunity to do high level work like synthesizing information, writing a design doc, etc and even if he does I'm at a structural disadvantage compared to someone who has full access to information.
I know from talking to the PM, more senior engineers on my team and sometimes my manager that this structural information advantage is real because they often talk about things I have never heard of, but they have been involved with for a long time.
The best way I have found to bridge the information gap is to actively bring it up during your 1:1s. Managers typically have an idea of what you "need to know" that is based on their idea of your current task. It's not always accurate and they may not always be able to see why from their vantage point. "I was working on project X and ended up being blindsided by changes from team Y, which blocked me for a week" is a really strong argument that you should perhaps be included in meetings with team Y. "I hear you and the team lead talking about our stack for Z a lot, I'm not really familiar with that. Can you tell me more about what's going on with it/can I get some time to work with it to get up to speed/where can I get information on it?" can help start a conversation on something you've just heard about. Keep abreast of "rumors" of where various teams are going and see if they have mailing lists or other places where they post general information for "stakeholders" (of which you are not, but often these are digests for people–often upper management–who are not fully familiar with the team, which would is useful for you too).
Of course, this requires work from your side, probably on top of your existing duties. Ideally you have a manager who is sympathetic to such efforts for the reasons I outlined above. A two-way communications channel is key. It's always possible that he'll tell you to keep your head down and that this stuff is "above your paygrade" but there's really not much you can do about a manager who is bad at his job ¯\_(ツ)_/¯
The flip side is that I used to suffer from agism-related depression, because I generally knew the answers but was powerless to sway anyone because they thought that I was too young to know what I was talking about. That didn't end until I hit middle age and realized that the problem wasn't so much about my performance, but my inability to communicate and set boundaries like older people do.
So yea.. it all depends where you stand.
Ps. You dont have to compare yourself to others. Ppl will do it for you. During interviews or internal reviews. You wont run away from that.