Ask HN: Not liking my first dev job. Any tips?

18 points by MathCodeLove ↗ HN
Hey all! So I'm a self-taught developer and got my first jr position a few months back. I really enjoy programming, I didn't sign up for a bootcamp or follow any "0 to Employed" type course, I just did what I love and eventually got a job doing it - which I'm very grateful for. Yet... the job isn't what I thought it'd be.

I did some freelance work prior to this and those gigs involved me developing a full application for the client. They'd give their idea/requirements and I'd make it from the ground. up. I loved that. I love being able to see a program come to life in front of me. I love to start with that blank canvas and through sheer will and dexterity forming it into something beautiful. That's what I like about software development.

At my new job, however, I've been thrown into a massive legacy codebase and am given specific features to add to implement on top of this already incredibly complex monolith that I can hardly understand. The technology being used is actually pretty interesting and novel, it's not just another Java enterprise app or massive Angular webapp. But I'm not able to really create anything. Any productivity I could have is drained by just navigating the existing maze of code. I might get to add a new feature, but there's not true creation happening. None of those features are challenging or novel. I feel like I'm filling in a coloring book rather than painting on a canvas.

Not sure what the point of this rant is, I'm just a little frustrated. I was so happy to have the chance to get paid to do what I love, but I'm not loving what I'm getting paid to do. I'd try to find another job but I don't want to have short periods of employment on my resume and my lack of a degree or any other credentials would make it difficult to ever get to the interview stage. Any suggestions for how I can find passion in my existing job or how I could pivot early in my career so that I can get in at projects inception and be a founding developer?

31 comments

[ 3.1 ms ] story [ 128 ms ] thread
You are missing some low hanging fruit in this legacy project you’ve been assigned. Don’t just do the boring tickets you are asked to do. Of course that’s snor city. Instead do them but then also work on little tools to make the whole system easier to understand. Stop waiting for your boss to give you interesting tickets, invent them!
Good suggestion! I'm just a little skeptical as the job is remote and paid hourly. I submit my hours at the end of each week. I don't want to submit my timesheet and then be like "Oh hey yeah by the way these X hours are for something completely unrelated to what I was assigned. Hope that's okay." If it were salary based or something else I'd be totally willing to dive in but as is I don't want to ask to be paid for something that they may not have even wanted me to do.
Donate to them 20 gifted hours of your time. I’ll bet whatever passion project you make in those hours they will love and want to fund for real.
Honestly not a bad idea. If I can find something I'm passionate enough about I think I'll do this. I'd be making something in my free time anyway - might as well make it something that could potentially make my time on the clock better. Thank you!
It's actually an awful idea. The whole benefit of working for a large company is that you DON'T need to sacrifice outside of your 9-5. This is that outdated grind mentality that managers sell to convince people this is needed to get ahead before they hand out promotions to their mates anyway.

Secondly, and I don't mean to disrespect you in any way, but if you're self-taught, and your prior experience is one man jobs working on small sites then I wouldn't expect the quality of your code to be great. I would be wondering how much time it would take to ensure whatever you build is really readable, documented, fully tested, maintainable, in line with the company's current tech stack, performant and scalable.

The benefits of working at a large company is that they have products that run on massive code bases that are, for the most part, REALLY STABLE. They move slowly, but they also move surely. New code won't be scrappy and volatile. Old code can stagnate, but it's because it hasn't broken in years. All of these things are learning opportunities you can take with you even if you strike out to start/work at a startup.

Do something small, submit on your timesheet, and then ask for feedback. If they don't like it, it's just a couple hours, so less of a big deal than a couple days or weeks of work.

If you ask your boss for feedback on what's possible to submit on a timesheet, I'm pretty sure you're guaranteed a response.

I consider refactoring as part of the job and submit it on the timesheet. However, be careful because as a junior you might be approaching it the wrong way.
Talk to your coworkers to find a mentor who can help you. I have read this story before and the folks that don't ask for help (and learn their dev tools, both standard and internal) are let go regardless of whether they want to move on or not. Difficulty navigating code is the tell tale sign - if others are being productive and you're not, ask them what they are doing and how they work. You will learn the tricks and tools of the trade.

It's fun to start new projects because it's easy and there's quick payoff. That said, no one really has a place for a serial project-starter on their team and the majority of your work in your career will be like this. Learning how to explore and modify/test a large existing codebase is crucial not only to how we work on software, but also to learn how to build (or not build) new projects from scratch in the future.

That's not to say there aren't codebases that are easier or harder to learn, shops with crappy tools, or that there aren't awesome startups doing new things all the time. If you want my advice, I'd say stick around for at least a year to eighteen months and learn how to navigate and work in a big codebase with tech debt and legacy, because when you move on to start a new project you'll know how to avoid the pitfalls or how to deal with it as it arises in that project.

Thanks, all great advice. Really appreciate it.
THIS. Please ask your coworkers for help. If the company isn't a toxic shithole your colleagues will be happy to help out. Modern screen sharing, code pairing and mobbing tools have made doing this in a remote working environment incredibly easy, almost more so than in meatspace.

As for the massive codebase, try to specialise in an area and own it. Take lots of tickets around that module / namespace / whatever and you'll end up in a niche with lots of ideas about how to modernise, optimise or otherwise improve that code base, as well as teach you a lot about the companies coding standards and practices when you're ready to move horizontally into other parts of the code base. You will become trusted as an expert in that area and valued by your colleagues.

Large code bases are a reality in programming. All of your smaller app and websites are built on top of the massive code bases of your favourite JS frameworks, web servers and web browsers, which are built in operating systems that also have massive code bases. All of those code bases, by the way, started out small as well, and grew to meet bigger and more demanding requirements.

You are kneecapping your potential if you decide to stop at the software development equivalent of barre chords.

Stick with it. I had the same experience but things will get better in 3 months
This sounds exactly like me when I started my job and I was a month in. All I can say is it gets better. Give yourself some months to get more familiar with the way things are done and learn about the code.
Well, once you get more comfortable in a codebase, you will start to get a broader view of where it needs to improve. That's the point where you can start being the architect behind new creations.
> I might get to add a new feature, but there's not true creation happening. None of those features are challenging or novel. I feel like I'm filling in a coloring book rather than painting on a canvas.

> … how I could pivot early in my career so that I can get in at projects inception and be a founding developer?

You’d like to skip the years of experience and knowledge and jump right into the fun parts of owning large projects and making the fun decisions.

Start an open source project and perhaps not look for your job to provide this outlet, especially this early in your new career.

There's two possibilities here. One is that the code is very efficient for what it does, and the design is there as a form of bureaucracy to prevent further problems or make certain processes easy to do and bug free. Then try to learn from and understand why it's that way.

The other option is it could just be overengineered and inefficient. This is more often the case. The main symptoms are people are just creating hacks to get around it and everyone dreads coming to work. Good code feels like the programming language was designed

Often overengineering happens for a good reason. Ask why it's that way. The worst code I've seen uses "clean architecture". So I worked to understand what clean architecture was really about. Don't just say that it's bad - look at what it's trying to do and understand why that's not working or what is being implemented poorly.

In our case, the business logic was done entirely on back end, but the front architecture was designed for extensive logic, so it just led to weird situations like most functions executing only one line of code. Some things were also on the wrong layers - business logic should be below the repository layer, but a lot of it snuck in above it. Again the symptom of people writing hacks because the code was too hard to work with.

Even though you might not enjoy this, it's a good opportunity to learn why you don't like it.

I have roughly the same background with you (self-taught, no bootcamp, freelance, etc). The difference is that I got my first dev job in 2017. What you have experienced is what I have experienced as well.

Learning and understanding legacy codebase is part and parcel of being a software engineer. So be prepared that you will take a long time, especially at the initial stage to add feature. And for legacy codebase, a lot of work revolves around maintenance, cleaning, minor improvements. While looking at it individually, it might not sound like much, but taken together, it has great impact to performance, maintainability and speed of development in the future.

What I have learn is most software engineers understand this. And they also do not expect you to contribute in terms of adding the challenging features that you talk about.

What I can encourage you to do is to ask questions as much as possible. And if you know someone in your team is working on the challenging features, maybe request to pair with the person, or ask the person if he has the time to go through what he has done with you.

lol welcome to capitalism 101. you are a servant paid to do work no one else wants to do. your feeling is called alienation.

> I love to start with that blank canvas and through sheer will and dexterity forming it into something beautiful.

I have built many beautiful tools for clients, but there is extreme alienation when no one uses it, when you find out it's just a marketing gimmick.

love/passion is for projects you own.

New code builds on a pyramid of legacy (internal and external) code. As painful as it may be, learning how to work with legacy code is a critical skill for most new projects or features.

When you encounter issues requiring a deep dive into stack traces, you will find sloppy code that is no longer maintained and can no longer be traced to a source (frustrating!). You will also find elegant code that has worked for decades with minimal issues (amazing!).

welcome to the real world
You get paid for the pain dude. That’s what the money is for (Draper’s speech in Mad Men: https://youtu.be/w2MV-x924KA).

I can promise you any company you go to has a shitty code base. Good luck, and have a happy career.

Some advice that gets passed around and is useful - understand the database schema. For a good number of applications, if you can understand the database schema you can guess at a lot of the functionality and a lot of the code base will just be taking data back and forth from a database to either a UI or an API endpoint.

This doesn't work for all applications, but a good number.

Starting with a blank canvas is the exception. Most programming work is fixing bugs, incrementally adding features, adding interfaces to other systems. Only early stage startups and research projects start with a blank canvas. Even new systems in existing businesses have infrastructure, staffing and technology constraints.
Lots of "get used to it" advice here, which is honestly pretty good and honest. Like, if you were a founding developer, you'd have the joy of watching your creation turn from an exciting new thing into a legacy product. Since all products become legacy codebases, learning to work in one is vital if you want to be more than a dilettante.

With that said, don't let the passion for fun and interesting projects die! Small, start-to-finish projects are exactly what hobby, side project, and open source is for.

I'm seeing some good advice here. I'll also say: some of this is just part of working in a large organization.

On your own or in small companies, you get requirements and you go build something. Most of your time is spent creating.

In large companies, you have to do a lot of exploration which could involve reading existing code or talking to other employees to figure out what to change. Most of your time will be spent researching and communicating, not purely creating.

The number of opportunities to build something totally green field are quite rare. Even a lot of startups are going to be using some off-the-shelf stuff to some extent just to get going.

This is true with most work. Whether it’s programming or landscape design or what have you, there is a shed load of work to do that no one is really excited about. This is why the whole “do what you love” is dangerous.

From my own experience, I find the best way to scratch this itch is to find a passion project and spend time on that as you can. This has the added advantage of getting you more time with code. You’ll pick up tips and tricks and tools.

Finally, don’t lose your optimism. Many of us work on projects that are fulfilling outside of work for just this reason.

Greenfield coding projects are very rare, except in consultancy, but even there you'll have to maintain what you build. Refactoring however can be the same type of thing. IMO use this opportunity to write tests and learn to refactor. Most developer jobs will be exactly like this, learn to embrace the suck and find the joy in the refactoring. Eventually you'll get the skills to get a better job or start a consultancy. You might also prefer being a business systems analyst where you spec projects instead of build them. IME BSAs work on a lot of the stuff you mention you like and developers just slog through the coding parts.
It’s hard to avoid doing a few such stints in a programming career. Being able to navigate and wring value out of an existing code base can be a superpower at times. But don’t let this be the predominant part of your programming career.

Some tips for your current situation:

1. Accept the slowness and irreducible complexity that comes with large codebases. There is no quick fix. Don’t beat yourself up. Even people who wrote a codebase find it frustrating to come back later and make changes to it.

2. Understand the data model and the core data flows of the codebase from a business point of view. Make diagrams and notes to capture this, but do it for your own reference and not to share it with others.

3. Understand the technical architecture of the project to a sufficient extent that you’re not getting bogged down in technical questions when trying to follow the logic. This is one of the reasons that simple languages like Java or Go are preferred over more complex languages. Understand what flavor of OO or any other paradigm applies in the codebase.

4. Create a fork or branch of the codebase where you can annotate the code and add any documentation. This doesn’t need to be kept in sync with the main code as long as it’s substantially the same.

5. When you’re working on a piece, look up git blame and commit messages to see how that piece came about.

All these steps will yield results, but slowly. My feeling is that there tends be an inflection point when all the various bits of knowledge start to add up. Until then it will be slow going.

First two years in the industry are literally just a stepping stone to greater things. I usually give my mentees the advice that they might as well try out some companies despite red flags because this is the time where you figure out what you don't like so you can figure out what you actually want to look for. This is also your time in the trenches as a junior dev, anyway, so might as well make the most of it!
That's basically the job, and it sucks a lot of the time. That's also why they have to pay us so much - otherwise, most people would just go do something else (aka golden handcuffs).
You get most freedom as a solo developer, but most jobs involve teams, otherwise freelancing.

You could search for 'greenfields' in job ads, it's a common keyword for 'new systems' instead of existing large systems.

(comment deleted)