The Biggest Mistake I See Engineers Make
thezbook.com
thezbook.com
Having said that, I would make the following points to writers who wish to engage outside of the narrow circle of their profession:
* It's nearly 250 words into this piece before we even get a hint that we are talking about software engineering here, and even then it's only because the writer mentions a PR. I know enough to know what a PR is, but a general audience would not. It's not until some 620 words into the article that software is actually mentioned and the general reader can say without a doubt that software engineering is what we are talking about here.
* Along with PR, IC is something that is never defined and this one was new to me (and a little tricky to search, but I now understand that it is an Individual Contributor). The PRD was easier to track down, but again not obvious, even from the context.
Again, I get it - I'm not the audience and this is a bit of industry in-talk. But I think it's something that worth thinking about - you don't have to dumb down your ideas for them to be understood by a much larger audience than your immediate colleagues.
Individual contributor sounds like a human resources rebrand for lower pay or power.
The people and places that handled well this level of fuzziness do so _thanks to_ a good amount of trust, care and shared vision.
I’ve been in companies using this term for the last decade and definitely do not think this is the case. If anything it’s a movement to empower people that don’t want to be on a manager track by offering them a precise term to describe their track.
It simply means people with no direct reports.
Trying to think of other words for this... programmer, software developer, software engineer. But those words are all role-specific. IC has the advantage of conveying that the person is not managing, but is generic with regards to role. Non-manager works, but that emphasizes the negative.
Hmm.....
I know very few PEs who say "Oh, I wish I had a whole team to manage, worry about hiring/retention, reviews, administration, etc"
Still, what is said here really applies to any type of engineering. I've encountered pretty much everything mentioned both for software engineering and electronics and mechanics. Just replace the software-specific lingo with their generic principles (e.g. PR = review by others).
Note: ECN's were how things worked when you had a draftsman. Most engineers do the CAD themselves nowdays.
Think of software design as a space with dimensions. You’re trying to optimize for something over that space. Development is ideally a series of incremental steps toward the optimum. The daily standup is where you check in and make sure your last incremental step was in the right direction. Generic developer of level N can make those steps. But what if you are stuck in a local minimum? How are you and your teammates going to find what is over that next mountain unless someone goes out there and brings enough provisions to spend the night? There’s gold in them there hills.
Sometimes a problem is hard and needs time to figure out. In a lot of cases adding too many people to the discussion can result in distractions and churn due to their individual priorities and limited understanding of the problem.
The best I’ve figured out here is to constantly ask for feedback from only the people who would be directly effected by the immediate task I’m working on. But that’s also deceptively hard to figure out sometimes.
If you cannot get your manager/boss/co-workers to buy into a method/strategy/path, you are setting yourself up for a harder path to success.
It is better to try to get buy-in earlier than the completion of project/code/documentation.
It's a complete waste of my time to completely finalize something, have him take a look at it for 2 seconds, and then say it's the wrong direction.
And yes, we have tried to specify tickets more but he wants more general stories to allow the engineer to identify and approach. He just wants us all to identify his approach without him telling us.
For my team, I even encourage them to publish PR before doing any test.
They can start writing tests, but please publish PR before.
However, when communicating a guideline like this, it is better to make it simple. Otherwise, then it would be equivalent to no guideline.
A guideline like this isn't meant to cover 100% of the cases anyway. If there are exceptions, I simply tell them to add some tests.
The biggest mistake engineers make, and they make it often for year after year, is not moving to another company when it is the right time to leave where they are.
To zeroth order, all engineers are overdue for a move.
When in doubt, I tend to favor change, but it's just gut feeling. Is there a more objective metric or it's just experience?
Usually it's an almost-chaos that's being held together by everyone pretending that it's all fine. And by following a bunch of rituals nobody bothers to modify out of fear not to speak up against the majority.
This is something I struggle with everyday. PhD students usually come from finishing their master and totally have this mindset. They feel like doing things only by themselves will be more valuable than if they seek collaboration. But we deal with very hard problems and previous experience is one of our best assets, collaboration with other team members is not only very well valued, but essential to get our work done.
A very importnat point, in my opinion, is that the students should not have to figure out all this by themselves. It is our job, as supervisors, to help them to change this mindset. Easier said than done...
You can't plan and iterate on a plan that's forming as you go along -- it's a creative process and that's mostly chaotic by nature. And that's a good thing when doing exploratory work.
I get it, companies want assembly workers but a good chunk of software engineering doesn't fit that mold.
The whole article smells of control mania and micromanagement to me.
--
I agree with some points. Devs are prone to using overly complex solutions and it does pay off huge dividends to bounce ideas with somebody 2-3 times a week just to make sure you're not going down a rabbit hole that won't help the problem you're looking to solve. Sure.
What the author fails to account for is that your average manager and dev team are usually not at all helpful. They want you to solve a big problem but still want it done quickly even if they do absolutely nothing to help you clear up the requirements or familiarize you with previous work. And then get grumpy because predictably you can't do the whole thing quickly.
Well, AT ONE POINT SOMEBODY has to invest the time and effort to untangle the big spaghetti and put it in orderly boxes. Either remove roadblocks for me or get out of the way and let me fight this herd of ducks alone. Grumbling about how not everything fits into your nice Scrum charts is not helping anything.
--
I sympathize with the overall sentiment that we should do our best to iterate and not have work done in one giant step. But that's not possible for some tasks and this has to be respected, not mercilessly micromanaged.
If your team is all a bit allergic to endless design doc discussion, dropping one of those in Slack might not work too great. But maybe pair programming with one or two others on the feature to help get feedback could!
Others do like to plan things out, so having the running Google Doc, or "one-page design docs" with recurring check-ins with a core group of people can do wonders.
There's the Amazon-style "write the marketing pitch", or internal-facing API documentation. And for some people iterative can mean shipping your API in layers, whereas for others it means shipping features bit-by-bit.
There are a lot of options, and I would love to see a huge compendium about it!
This, as so often, is a result of lack of time, patience and _planning_. It feels like "Agile" has become a convenient excuse to just start and figure out what it is we're building as we go along...
Any project no matter how big or small needs to start with an end in mind. Even if it's an open-ended task or you are building a prototype where everything is an unknown. It's not difficult to draw lines in the sand before you even start.
Understand the actual problem , write it down and repeat back to get confirmation.
write down the (non)functional requirements from the stakeholders, the exact scope of work before doing anything, again repeat back to get confirmation,
In the murky world of greyness where people do not really know information or the full set of data, agree (again before starting work) on little subtasks/ plans to get the information (PoC)
Write down the Risks/ Assumptions/ Issues/ Dependences of your actions and again get them signed off
all this takes time and can be extremely boring relative to getting stuff done, so a lot of people just do stuff they think is right
I get it - writing good specs and stories is hard work. But as a way of organizing and "guard-railing" work, they are priceless. If you can't explain in words the work that needs to be done and share and socialize that, you're not ready to start building the product.
I can count on one hand, literally, the number of engineers I've worked with who could magically craft an amazing product out of thin air and even then, there were parts of those codebases that were horrifyingly difficult to modify down the road.
There is a certain threshold in a team where incremental communication yields increasingly decreasing returns very quickly, and slowly starts to become a cost. If you can find the sweet spot, and leverage your engineering knowledge to peek in, this 'mistake' can be an advantage.
There's some similarity to big tech interviews: you often get an intentionally fuzzy task and your first job is to ask clarifying questions and tell your assumptions out loud. If you go straight to coding it's a big red flag.
In this vein, we can say that kind of interview prepares candidates to the real job where others are busy and don't have infinite time to write perfect specs and just hand them out to you to implement.
In my current role, I help 10-15 people weekly across multiple teams and domains. After a period of time, I discovered that it was a mistake. I can see that their's personal grown is limited, they would more likely lean on domain expert instead of becoming expert themselves. Now I am tired and distracted, partially because of lack of seniors.
These abstract counsels don't translate well to ability to identify when we actually need to apply them. Providing context, detailing one or more situations when the writer learned these things may contribute to transfer a bit of tacit knowledge.
First: Click the little greyed-out hyperlink next to the title of the submission that goes (thezbook.com): https://news.ycombinator.com/from?site=thezbook.com
Second: Query hn.algolia: https://hn.algolia.com/?q=thezbook.com/the-biggest-mistake-i...
The biggest mistake I see other engineers making is opting to build vs buy when it's commodity stuff that we could easily and cheaply buy (or even use FOSS for), e.g. log shipping software, monitoring agents, etc. I see folks building "frameworks" for agents they'd like to run, and dreaming up entire ecosystems, of course with complex message busses and cert strategies...
Please don't re-invent Fluentd / Logstash / Prometheus etc unless you have a very compelling reason to do so. Also, your UI will suck, and if you make support staff use it, they'll hate you and you'll lose trust. There are so many great free dashboard tools out there, just pick one and learn it / use it. For stuff like reporting, there are a dozen ways to do that with stuff like Jupyter notebooks running on schedulers (and please please please don't try to write your own enterprise scheduler, again there are many out there that have been hardened over years of battle).
Don't run your own mail server. Just do not. If you've never dealt with IP + domain + ASN reputation and deliverability issues before, please just trust folks when they tell you that you don't want problems like that. Just use SES / Mailgun / SendGrid / whatever.
Don't re-invent JIRA. JIRA can do what you want if you take the time to learn it, and maybe add a few plugins or integrations.
Don't re-invent Jenkins. Jenkins can do almost anything. That doesn't mean it's the right tool for the job, but in many cases it's probably good enough to get you by, and easily adds visibility + access control + logging + who + what + when + kinda why + where and SCM integration to any ad-hoc task-execution or [see above] task scheduling needs. Jenkins is probably one of the most heavily battle-tested pieces of software in the FOSS enterprise software world, along with Apache and MySQL. I run Jenkins at home.
Don't use Java when you could do it with Bash, or even systemd / built-in OS functionality. Learn how linux works and what facilities are available on your given OS. You will likely find that many common problems have already been well-solved in depth.
If you can just pay AWS to run the service, it's probably worth it. Their stuff is also quite well battle-tested (at least non-early-access products), and stuff like RDS, CloudWatch, SQS, etc work pretty darn well these days. If you're already in AWS, don't just run everything yourself and treat it like a virtual datacenter -- to do so is to miss the whole point of "the cloud". You'll save OpEx in the end until you're operating at huge huge scale, and even then, when your finance team negotiates with your AWS TAM, they'll work out a decent-enough deal.
Edit: and please please please do not try to write your own etcd / zookeeper / Consul / Vault / Cassandra / Kafka. There's a good reason almost everyone uses this stuff: they works well, the ways they fail are well-understood, and they get updated regularly. You won't do a better job. Even if you work at a 10k person company and can dedicate a team to building it, you won't do better. Your implementation will be buggy and suck for years. Just buy it (for free). When I interview folks with stuff like this on their resume that they've built, I usually see that as poor judgement (unless they actually worked on one that ended up actually getting used outside of where it was invented).
Don't even try to touch building your own SSO. Buy Okta, Ping Identity, or Google SSO (Google Apps).
I'm not saying don't invent anything ever, just that I see so much damn waste when it comes to over-eager engineers wanting to build stuff that already exists as their own career builder vs solving the actual business problems in the most efficient way possible, which I've found to more likely than not be just figuring out the process / workflows and gluing a few pieces of existing software together. Not every problem needs to be solved with 18 dozen microservices and GRPC.