Category: Blog

  • Been Doing A Bit Of Housekeeping

    How do! It’s been a couple of weeks since my last post, in that post I said I was going to take a week to re-consider my application’s internal architecture, which I did. I’m now ready to proceed with a pretty heavy clean out of the app, moving some of the code out from gui objects into some sub-classed classes that can be re-used as and when.

    Before getting stuck into my “re-design” I had a quick re-read of some of the RealBasic User Guide, which turned out to be an extremely useful thing to do. I had read a couple of posts on the NUG that discussed Interfaces that piqued my interest. Interfaces are an area of Object Orientation that had totally confused me before; I just didn’t understand what their use was. It seemed to me that they were just an inconvenience, why would you make more work for yourself by creating interface classes that didn’t actually do anything, and then have to code those interface methods in any object that “implemented” that interface? Well, it turns out that this concept of interfaces is very useful indeed (yeah, I know, why would it exist otherwise 🙂 ).

    By creating some specific interface classes, and setting some objects to implement them, you can automate a lot of the relationships between objects, because of the fabbie IsA operand (in RealBasic). For example, say you have a gui object, a button say, and when pushed you want your program to go to the database and grab the latest data, and then all the other gui objects on that window should refresh to show that latest data. In normal programming you could end up writing a lot of code in that button’s action method or some other object’s method that specifically references those ListBoxes and other gui controls that need to be refreshed. Whereas if you use the concept of interfaces you can pretty much automate this refresh without any specific references to objects, which is great when you want to change the controls on your window etc. If those ListBoxes etc were actually a sub-class of ListBox, and also “implemented” a “DataConsumer” interface for example, and that interface had a function called DataAvailable, then an object that provides the new data could loop through all objects that are of type “DataConsumer” (e.g. IsA DataConsumerInterface) and call their DataAvailable methods so that they can refresh themselves. And, because the objects that implement the DataAvailable method of the DataConsumerInterface could be of pretty much any type of object, they could have very different ways of using the available data, but your DataProvider doesn’t care, it just tells the objects to do what they like with the data. This chaining of interface methods could go quite deep, here’s a noddy little example method calling chain:

    Button.Action –> DataProviderInterface.GetData –> DatabaseInterface.GetData –> DataProviderInterface.DataAvailable –> DataConsumerInterface.DataAvailable

    There could be many of the objects at the end of a “–>”, each getting called in turn to do whatever is required purely because they are of the right type (i.e. implement a specific Interface). This means your application gets quite loosely coupled internally, objects start providing services to others in a fairly loose knit way.

    So, I’m really starting to see the benefits of Interfaces, it’s kind of a way of implementing your own Events scheme. That was week one.

    Week two, I didn’t actually get around to coding any of these changes. Because I realised I needed to pull a lot of my code out into new classes, I also thought it might be prudent to change Source Control Manager (SCM) software, as CVS just wasn’t going to cut it. Why? Because I’ll no doubt be creating a number of external objects while refactoring my code, and that may including renaming them occasionally, and CVS is rubbish at that, history isn’t going to be maintained, and I would like to keep that.

    So, I went on a World Wide Wander in a search of a better SCM than CVS. The obvious upgrade would of course be Subversion, and I looked long and hard at it, and didn’t like what I could see. It doesn’t matter what some people say, there are dependencies that I can’t deal with, and I’m just not quite comfortable with it’s maturity just yet, and I guess I don’t like the idea of using a database to store the code. I just have some funny feelings about SVN, so I’m staying clear for the moment.

    I used c2.com and Version Control System Comparison to get a head start, whittling it down to a few candidates, including (but not restricted to) GnuArch, Monotone and Perforce.

    I’ve used GnuArch before, and really liked it, but it’s a bit fiddly, and the tools are a pretty basic, I was looking for something a little more mature and with a few nice gui interfaces.

    I’ve not used Monotone, and was tempted, but I’d have to build it (I’m using Mac OS X which doesn’t have a binary available), and frankly I don’t have a lot of time to go learning what seems to me to be a fairly complex application. And again, I couldn’t see any nice gui programs for it.

    So, I’ve gone for Perforce, and so far, I’m totally over the moon with it. It was an absolute delight to set up, just dropped a couple of binaries in my path (/usr/local/bin) and started up the server with a couple of environment variables set to tell it where I wanted to store the data. And that was it really, the Command Line Interface (CLI) is a doddle, very straight forward to use, but also very powerful, and there is a pretty good gui app too. And to round it all off, it’s got one of the best web interfaces I’ve seen. I like the fact that the meta-data is kept separate from the actual source control, and I particularly like that the source is held in RCS files, makes it really simple to extract from if I should want to change SCM, I trust RCS. It may be a little out of my budget to buy (even though it is pretty cheap), but thankfully it’s free for two users, and there’s only one person in my company, so I’m covered!

    So, this week I are be mostly getting my code into shape, honest!

  • Brent Simmons gave me a sleepless night.

    I had a really sleepless night last night, and it’s all down to Brent Simmons’ Black Box Parsing post on his weblog.

    Why am I blaming him? Because it finally brought to the fore that I really need to clean up my code and make it far more object orientated (OO), something that has been nagging me for quite some time.

    I’m afraid I’m a bit of a perfectionist, and this is probably one of my biggest sources of procrastination, something I realised just recently when listening to The Procrastinator’s Handbook: Mastering the Art of Doing It Now. Wanting to do something perfectly, is most definitely the reason I procrastinate the most, the idea of not getting something done to a high standard creates a lot of fear in me, and can stop me in my tracks.

    However, I’ve already developed some of my application in a way which is congruous with OO development, and each time I add a new feature or need to modify a bit of code, I improve it a little and usually move it towards better using the OO features of RealBasic, probably because I’m learning so much more each time I sit down and start developing. I’m now at a point though that I really need to clean up a core part of my project, there are some new features I want to implement and can not do cleanly and efficiently with the current layout and communication between the data model, gui objects and controlling functions (see what I did there, Model-View-Controller 🙂 ).

    What’s really bad is that I’ve been fully aware of the benefits of the Model-View-Controller (MVC) pattern for a year or two, since I first started looking at development on my Mac. Objective-C is a great OO development platform, and I’ve played with it and run through a number of tutorials and created a few play apps using the great free IDE called XCode on OS X, usually using the MVC pattern. So, why is it I didn’t use MVC properly from the outset when I started doing some serious development? Who knows, maybe I’m just lazy, or maybe I’m not lazy enough to use the productivity gains when OO is used to its full potential. Or maybe, I just got carried away and fell into the trap of whipping up a quick prototype, but not enforcing the fact that it really was a prototype and that it should be thrown away and developed afresh correctly with longevity in mind. Mind you, there are some people that believe a prototype should never be thrown away, that it should simply be improved upon and brought up to scratch rather than writing off the investment in it. I think I may go down the hybrid route; I can easily save elements of my project as classes, and even enforce this in my mind by making them external classes that can be picked up by other projects if I wish. This will help me get started in shifting the code around to get rid of some of the dependencies I built in between the model and view, and allow me to work on parts individually and swap in improved objects as necessary. That’s where the Black Box approach really comes in handy.

    So, I’ve decided that next week will be an architecture design week, I will sit down and design the architecture of my app properly, making sure to keep the model, view and controllers separate, and to ensure that I allow the application to use different models without changing anything in the view, and only adding one hook in one of the controllers. I want to make my app able to switch between different database schemas with so much ease that I can quickly and easily add new models as new databases come to market in the area I’m targeting.

    Should be fun, and once I’m happy with my design I may start sleeping properly again, until the next big idea hits that is!

  • Realese Early, Release Often

    As Lachlan has also concluded, releasing earlier with a reduced feature set and improving from there with customer feedback is a very good idea.

    I might not have any experience in the commercial software business yet, but in corporate and bespoke software I see this happening all the time. Release something that gives a good base to work from, based on initial customer requirements, let the customer see and work with what they have asked for. You’ll then get lots of feedback that will improve the application for the customer, which is the most important source of feature specification you can get, feedback. A tricky part in writing bespoke software is stopping the customer asking (or rather insisting on) the bells and whistles that are unlikely to be used, and that take a lot longer to develop for. The obvious answer is to quote high for these things, which inevitably leads to them being dropped from the initial requirements and pushed into a second delivery phase. What usually happens is that once the customer gets their hands on the application, even in User Acceptance Test, they see that they can work just as well without these extras, and can identify far more important improvements to take their place in a second delivery.

    Again, the feedback loop is the key here, the shorter it is, the better, which just so happens to be a key principle of eXtreme Programming (XP) and most of the Agile methodologies.

    I believe this is the only way to go if you want to make a sustainable software business, I might yet be proven wrong, but as long as you have a product that on initial release has just enough features to make a good portion of the potential market take interest, the feedback you get from them will be hugely important and will steer your subsequent development for quite some time.

    Deciding what is a good initial feature set is however very important, it needs to be enough that you satisfy some need of your potential customers, but not so much that it takes a decade to write the software. This is obviously tricky to get right. In my product my feature set is quite skimpy in a particular area that I think I will get lots of requests for, I know I will, but I also know that it will take a lot of time to get it right (and may require some expenditure for a third party component). In the mean time, the similar feature that I think is going to be more important will be there, almost in full, and that feature is the core that will be built on and expanded in later releases. There are important features that I intend to introduce along the way that will further improve the application, some I expect to introduce before the one that may require a third party component, they all build up to give the user flexibility in this area, and ultimately many users may not even want this key feature because they can integrate other tools into their workflow that they already own and know, and can do a lot better than my app can initially. When I get the feedback, I’ll be able to decide what’s next on the list, what’s the most efficient new or improved feature that will make my existing customers happier and will maybe win new customers.

    You need to think organic, grow your software slowly as your customer base grows; this is one of the primary principles and advantages of being a micro-ISV. Nurture your software, feed it, water it, and keep an eye on the leaves and fruits to determine what is needed to keep it fruit bearing for a long healthy future.

  • The Big Think – Part 4

    What the heck, this project is fun, I’m learning a tonne of stuff every time I get coding, every time I read some more about marketing. I’m learning loads from all the blogs and web articles that I’m reading in the area of small independent ISVs and shareware marketting. Maybe I should quit worrying and just get on with it.

    The best thing about it is that it’s not really costing me a lot, there’s the initial outlay for RealBasic, which wasn’t much, then there’s the time I spend on coding and research, but that’s negated by my enjoying every minute. The biggest cost is probably the time I spend locked away in my office away from the wife, which isn’t good. But, to be honest, I’m completely addicted to computers, have been since a kid, my wife understands this and accepts it, I think. This doesn’t mean I’m allowed to go over-board though, I do occasionally get a kick up the rear for not spending enough time with my wife, although curiously it’s usually phrased as “spending too much time on the computer”, I think she’s jealous, and probably rightly so. I do spend way too much time on my computers, I recognise that. I go through phases of moderating my time, but after a while things do slip and I have to be reminded that I’ve got a life outside of computers. Is there such a thing as “Computers Anonymous”, hope not, and if there is I’m not going to join anyway, I’m enjoying coding on my project way too much!

    I’ll talk about how I’m combatting the imbalances in my life in a later post (and yes, I’m aided by computers!).

    Anyway, it’s Friday night, DVD, couple of nice beers and snuggle up with the Mrs on the couch night.

  • The Big Think – Part 3

    As mentioned earlier, I do see a wider market for my app, if I build and market it correctly I believe I can grow it to encompass other similar web apps (and there are many) that rival my current core vendor’s product. I’ve yet to decide whether this is a good idea. Should I concentrate on making it a niche product that meets a very distinct need? Opening up the app to be compatible with a number of vendor’s competing web apps may just pollute the brand weakening it. If I open up the brand in this way I’m sure to get a few extra sales, but probably at the cost of sales in the initial market. It’s an age-old quandary. If I keep the brand intact, and very focused, there’s nothing to stop me creating other versions of the app for other markets, and branding them differently I suppose. There’s a lot of talk in The 22 Immutable Laws of Branding and Marketing about just such things, their advice definitely seems to be to keep each product very focused and not to line extend. This brings me back to the naming problem; do I keep it very focused on the core vendor’s product name as it currently is? I guess from what I’ve just said the answer is yes. Maybe there isn’t the market for the other platforms anyway, maybe I should just concentrate on the one I know and believe there is a demand I can satisfy.

    The only competition there potentially is for my product is the vendor itself if it adds features that negate my advantage, and some much more expensive and un-focused apps that take a lot more setting up and tweaking to get productive with. But am I deluding myself? Is there really a market here? Why has no-one else got an application that does what I’m planning to do? It’s not anything really complicated, so is it just a case that no-one can be bothered with such a small market, or do they see that there really isn’t a market at all?

    Maybe I’m worrying for nothing, maybe I’m really just procrastinating. The fact is that when I do get a chance to do some real coding on this project, I really do enjoy it. I love programming in RealBasic, it’s really fun, a real blast, and a real breath of fresh air compared to my current full-time occupation. Really 🙂

  • The Big Think – Part 2

    One downside of my app is that it obviously needs to connect to the database directly. This could be an issue for some companies that might not want to open up the necessary ports on their server so that a little app from an unknown company can connect to one or more of their key databases that potentially have some very mission critical data in them. Although my app in its initial form is going to be read-only, how would a company know that there isn’t some malicious code in there that deletes all entries from a table? They don’t, they have to trust me and that could be a hard sell. And I’m not ruling out creating a version of the app that can update the target database if enough customers ask for it, and if the core vendor gives me the nod.

    Which leads me onto another potential problem, although I hope I’ve read the core vendor correctly and it will not be an issue. What if the vendor of the web app takes offence at me trying to make some money out of providing some complimentary tools for their product? I don’t really think this is an issue as the company’s track record is good, they have other products that have gained some complimentary tools and I think I have even seen them recommend them in their forums. I believe having complimentary tools like I intend to sell generally help the core product as it creates a community around it that attracts more attention. It’s still something to think about, and I fully intend to have a little chat with the vendor in due course to sound them out, and hopefully get their blessing.

  • The Big Think – Part 1

    So, this last month I’ve been having some serious second thoughts about the viability of the software I’m very slowly creating.

    I’ve spent a lot of time re-assessing whether there really will be a market for my product and whether there is going to be any potential growth from it into complimentary products and services. Even the name I’ve given it is looking a little shaky at the moment as it doesn’t scale to other uses, but the application could be used with multiple types of servers with a little work.

    This is important stuff, and I’m still not quite sure whether it is a goer or not, so I’m going to ramble here, maybe something will come to light.

    Part of the problem is that this product is an add-on for a product that is gaining features all the time, and there is quite a chance that some of my key features will be added to the main product. If this happens, then why on Earth would someone buy my product?

    Ok, my product is a desktop application, this is probably a selling point for a good percentage of my potential market and is very unlikely (at the moment) to be added as an option to the core product which is at the moment browser based. However, the initial features that would actually add value to the current product could be added to it, and most likely are being added in the next major version. The whole reason for me creating this app is that users of the core product keep asking for certain features, as such the vendor would be amiss to not include them in a very near term update wouldn’t they?

    I guess a big positive of my app being desktop based is that the features I can add are potentially going to be far more user friendly in execution than with a web app. I can update subsets of the displayed data as and when I need to, and manipulate it without connecting to the server far more efficiently and without any browser standards compliance issues. Simple things like re-ordering data in a list is so much easier on a desktop app than a web app, there’s no need to connect to the database, no network traffic, and no fragile JavaScript or such like to be broken by the browser.

    As a consequence of being a desktop application, it’s entirely possible that I could make the app able to function in a disconnected state, this could be a bonus for some people, but I’m not sure whether it’ll be a huge benefit for the majority of potential customers. The work involved in adding this kind of functionality pretty much requires that I hold off until it becomes a regular feature request from paying customers. But first, I have to actually get some customers!

  • Comments now need authorisation.

    So, the spammers have found this site, and decided it would be a great idea to add comments offering various dubious products to any reader with links.

    I don’t like that, so as a first try I’m enabling admin approval of comments, so that readers don’t see those frankly offensive SPAM comments. I’ll do my best to authorise valid comments as soon as I can, but obviously, sometimes it may be quite a few hours, or even a day or two before comments get authorised. I’m sorry for the inconvenience, as always it’s the few that spoil it for the majority.

    Update: I’ve made some slight changes that mean most comments will be authorised automatically, while SPAM comments hopefully get trapped for authorisation. Unfortunately, some valid comments will still get trapped for authorisation though. We’ll see how it goes.

    Update #2 (01/12/2004): That didn’t work, still getting way too many SPAM comments, so authorisation is back, until I have time to update the software to pick up the improved SPAM handling in WordPress 1.3.

  • Flipped A Bit.

    000001
    000010
    000011
    000100
    000101
    000110
    000111
    001000
    001001
    001010
    001011
    001100
    001101
    001110
    001111
    010000
    010001
    010010
    010011
    010100
    010101
    010110
    010111
    011000
    011001
    011010
    011011
    011100
    011101
    011110
    011111
    100000

    Phew, quite a lot of years when you look at it that way!

  • People that email then phone.

    After reading the comments on my previous post, I’ve spent my lunch hour reading through a few posts in Michael Hyatt’s Working Smart site.

    Michael’s latest post titled Taming Your E-mail Inbox, Tip #1 deals with scheduling your email processing to times that suit you, not processing everything that arrives as it does so. This gives you time to complete your tasks for the day and deal with new requirements in a timely manner.

    It’s great to be able to schedule your email processing to particular points in the day that fit in with your schedule, I do that already, but also have a quick scan between tasks. But how do you deal with people that insist on phoning you if you don’t respond within ten minutes?

    I understand that Michael may not regularly have this problem, seeing as he’s in a position to have someone else field his calls, but how do you politely deal with these people?

    Because these people are constantly chasing their own rear-ends, and have no process for dealing with their day to day tasks, they tend to get in the position where everything is a last minute crisis, and this inevitably gets pushed onto those who can help them out, i.e. myself.

    How do I deal with that?