Software development is difficult. Especially if you are working on a 25-year old enterprise software that has gone through multiple platforms, technologies, and has seen multiple generations of developers. All of which makes it hard to understand and difficult to develop. What can we do as developers? Turns out, a lot.
The role of software testing is to provide information about the quality of a product. In his book Perfect Software and Other Illusions About Testing, Gerald Weinberg, who is one of my favourite writers, lists a few reasons why developers, testers, and managers avoid testing the product that they are ultimately responsible for. 
Estimating how long a software project will take is a tricky business. Unless you have already worked on a similar project with the similar constraints, you are always guessing. In their book 'The Pragmatic Programmer', authors Andy Hunt and Dave Thomas provide useful tips to help software developers when the management asks how long it's going to take? 
In his book, Practice of System and Network Administration, Tom Limoncelli explains the importance of writing down the requirements for the system you are building. I think the list applies equally well to software projects.
One thing I am learning as a developer working on enterprise software is the importance of a configuration management system. When you have a software system that's installed on-premises for each customer, that is configured and customized separately, managing configuration becomes a challenge. You can't just use environment variables or simple files to store config. You need to have a good strategy to deal with the configuration.  
If there is one book that has had the biggest influence on me as a professional software developer, The Pragmatic Programmer would be it. I read the original book many years ago, and it changed how I view software development. I recently re-read the newer version of the book, which was published last year to celebrate its 20th anniversary. Here is a complete summary of the book. It’s not a detailed book review, but a collection of passages from the book that resonated with me the most.
As software developers, we have more power than we realize. Our programs directly affect people and influence their behaviour. It's a good idea to take a break from coding from time to time, and ask yourself this question.

Would I use this product myself?
One of the quirks of being an enterprise software developer is that when your users find a problem with the product, they actually call your company support. Most of the time, the support resolves the issues on their own, but sometimes, especially for complicated ones, developers have to get on the call and see what's going on. 
Though URLs are everywhere and part of every web developers day to day work, not many understand what they are actually made up of, including myself. So this morning I sat down and really tried to understand the parts that form a URL.  
John Ousterhout, in his talk at Google on 'A Philosophy of Software Design', talks about a special kind of programmers, called tactical tornadoes. 
Well, one obvious reason is that of programmer incompetence. I came across a more interesting theory while reading Fred Brooks' classic book, The Mythical Man Month this morning. 

Your users get sophisticated and find new bugs.