Struggling for Competence
I've been developing software professionally for about 10 years.
I find software development quite difficult, in fact a struggle. My ignorance is exposed daily, there are not enough tests, the design is....suboptimal, and there's that thing when it's just much more difficult than it should be. I do want to get better though; improve my competence.
I believe that Software Engineering involves cutting code. In his essay What is Software Design?, Jack Reeves develops the idea that writing code is a design activity. The premise is that the source code provides the ultimate specification of the system. The compiler takes this specification and from it creates the product; the executable. The Source Code is the Design. A controversial view - perhaps.
Software clearly has a quality problem. Everybody has experience of tools which don't install correctly, and tools which don't work correctly. Hey, if you develop software I bet you've created tools like this too - I have. For me Test Driven Development (TDD) is "The Way" - the solution to this quality problem. I want all the code I write to be under automated test. This is currently only a goal though, not a reality. Understanding how to best deal with external interfaces, in particular the database and UI, represents an ongoing learning process.
All of the technologies and tools I now use, I have learnt in the past 4 years. All the framework and tooling knowledge I have from before this period is completely irrelevant. Clearly in software development you must make a commitment to learning throughout your career. Currently I work on the Microsoft stack, building web based applications. To do the job properly, you need to have capability across the whole stack; productivity occurs when you know something well. One of my current aims to deepen my knowledge of this technology, so I choose, for now at least, to focus on: Windows, IIS, SQL Server, C#, ASP.NET, JavaScript and jQuery.
My aims here are modest. I am not aiming to be a great programmer, just a competent developer.