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?
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.
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.
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.
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.
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.
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.
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.
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!).
This doesn't work for all applications, but a good number.
I can promise you any company you go to has a shitty code base. Good luck, and have a happy career.
> … 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.
You could search for 'greenfields' in job ads, it's a common keyword for 'new systems' instead of existing large systems.
> 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.