I think there are multiple issues needing to be addressed, but the main one I want to resolve is in the question title.
Some background context:
I'm somewhere between a junior and mid level software developer; I have 3 years of industry experience. I work in a relatively small company (< 20 software devs) and am usually put on projects either solo or in a very small team. These are managed by a high-level PM who has almost nothing to do with development and is barely involved in the project beyond the initial and final stages, and there is also a team lead, usually a more senior developer, although their role is more of a scrum-master type since they're typically not actively involved in development.
Because we're such a small company, we have to:
- Take whatever work we can get, and
- Be as cheap as possible
The way we stay cheap is to basically compress development into as short a timespan as possible. This means we almost never actually have enough time to do the work if we worked normal hours; as such there is an implicit requirement that we'll do overtime. Projects usually have a turnaround of a few months.
I usually come into projects at the point where we've got some basic, vague user requirements and agreed timescales, and am then basically told "go do it."
I then need to do the following:
- Understand the domain and any existing code and tools, which can be quite complex and require very specific knowledge
- Understand the user requirements, make any designs
- Create work items and associated time estimates
- Develop, test and document the solution
It seems like the only thing that has been factored into the overall project timescales is the development time.
There is typically not much support. Internally, the team lead can sometimes help with general software development issues, but because they're not really involved with the project's development at a low level, any specific blocking issues are up to me to resolve alone. The customers are also largely absent except for sprint reviews and occasionally responding to emails.
The worst cases are usually modifying existing legacy projects which have bloated codebases and are poorly documented, and the original developers are nowhere to be found; these take me so long to understand and work with.
I usually feel like I'm right up against it, and it can be exhausting. Tasks almost always take longer than my initial estimates, which then makes me look bad, like I'm not being productive. I usually end up having to rush things towards the end. I do tell my team leads about this, and they usually say something like "Well, just do as much as you can."
The projects get delivered (usually) on time and on budget but I'm never really satisfied with them; I'm not convinced I've actually made a product that satisfies what the users wanted, even though it technically adheres to most of their requirements (several things usually have to be de-scoped due to lack of time).
I think the main issue for me is the project timescales (which I'm not involved in creating); I don't mind doing all this work but I almost never feel like I have enough time to do it without overtime, which I can't do indefinitely because I'll just burn out (as I have done in the past). Is this normal? Am I just a slow developer? If I am slow, in what ways can I still be an effective worker?