Writing software, no matter what level, or how much, is very difficult. The most difficult thing about writing any piece of software is finishing it. Writing good software is even harder. It takes hours upon hours of time invested in the smallest of details to ensure each piece works together smoothly. It is precisely this that makes software such a rewarding and most difficult occupation.
One may be surprised, but to me, the most difficult part of writing software is actually writing it. Sitting down and typing out the code that forms the finalized program. Yes, the details can be very difficult and agonizing at times, but there are document after document written on how to write good software, so implementation details can eventually be solved.
One thing that has always amazed me is the amount of software that exists. The sheer volume is staggering. How many billions of lines of code have been written is a number that can never accurately be counted. So the question asked is often, "how do I go about getting my software noticed?" Whether it is free software like Artisan System, or proprietary closed source software, the answer is always: FINISH IT.
Several years ago when I was going to choose a college, I visited the University of Texas at Dallas, which eventually became my alma mata. During my visit there, I sat in on a presentation by famed game programmer Tom Hall (with slightly less hair at that time). The point of his presentation was how to write a game. By far, the thing he stressed most was: FINISH IT. No one wants to play an unfinished game, and the same can be said for software in general: no one wants to use unfinished software.
At that point in my life, I was dead set on being a game developer. To me, there was no greater glory than writing games. Years later, I realized I really didn't want to write games, and as the web became a very powerful platform for development, it attracted me more. I never finished any of the game software I started.
I think every developer has felt that at some point during their career: how do I go about finishing this, when is it considered done? Done can mean several things from a new stable release to the end of a service contract to the archiving of an old piece of software never to be touched again. The point being, reach that goal. For me, each new stable release (0.1, 0.2, 0.3, etc) of Artisan System means it is done, I have a finished product worthy of releasing.
This is especially difficult when starting a piece of software from scratch, such as Artisan System. Artisan System started as a desire for me to take years of PHP programming and turn it into a productive framework that other people, including myself, can use to make great web software.
Why is finishing software so difficult? Lets disect open source software for a moment, which generally starts off as more passion than anything. Artisan System started as a passion of mine and has now flourished into a fulltime hobby. Hitting the 0.1 release of Artisan System was the hardest piece of software I've ever written. Why? I now had the time to set an accurate deadline of everything I wanted to include in the 0.1 release. To that day, I had never personally released a piece of software to the public. Sure, I am a professional developer by day and I write software that my employer sells, but I see writing Artisan System as different since I am unpaid and doing it as a hobby. Hitting that 0.1 release meant that I was done. I had finished something. Thats not to say that Artisan System is finished as a product, not by any stretch, but I had finished that milestone. I now had a grouping of classes that worked together that people could use to build web software. Sure, there were bugs, as in most software, but for the most part, it was stable and well tested.
The 0.2 release was much, much easier to hit than the 0.1 release. I could feel it in me, I had already hit 0.1, so 0.2 must be right around the corner! It was! My drive for writing more of Artisan System was never stronger. I did small incremental releases: 0.2a and 0.2b, both getting a few hits.
Right now stop whatever piece of software you are working on and physically write down a finishing point. Again, this can be the next point release, or the fully finished product with as few bugs as possible, or anything in between. Hit that goal, let nothing get in your way of finishing it. By finishing a piece of software, you have now completed the hardest, most difficult part of ever writing any piece of software ever.