Jun 30, 2009

It's Starting To Look Like An Airplane!

It's actually looking like a real live web app! I can add, edit, and manage users! I can see a list of all users I've added, click a link for a user, edit that user, and be redirected back to the list! And the controllers are passing flash messages to the views. It is a beautiful thing.

Next steps for tomorrow:
Research an alternative to the jQuery pagination feature
Implement Delete User use case
Get Logon and authentication working

Speaking Slot Secured

I just got confirmation that I have a speaking slot at this fall's business educators conference to demonstrate my software. So I guess that means that I better have this thing done by then. I also emailed the state director and told her what I've been up to. So two hours of my morning has been spent on marketing. This surprises a lot of coders-turned-entrepreneurs, but it's a big part of starting a business.

Jun 29, 2009

Phase 1 Roadmap

I intentionally sat down and started pounding out code quite early in this project. I created the scope document and a few use cases but no project plan.

I will not be creating a formal project plan.

But this morning, I did sketch out a rough roadmap for the project. Basically just a list of things I need to do to bring the project to life. Most of the things on the list are on the business side, not technical. A lot of them have to do with marketing. This stuff is MORE important than the actual code to a software business.

When I see everything that has to happen between now and September, it looks like a very ambitious schedule. So I'll stop blogging now and start building. Yay.

Development Machine

My development machine is SO SLOW. It's a Dell Latitude 640; about four years old. It does everything I want it to, it's just painfully slow. Here's what I'm typically running when I'm in development mode:

Servant Salamander
Firefox - Yahoo Mail, PHP API, Localhost (my application), Mantis Bug Tracker
Eclipse
XAMPP
Mozy Backup
Microsoft Word (sometimes)
Windows Media Player (if the computer is being friendly)

This is enough to bring my computer to a crawl. I haven't timed out on localhost yet but I think I've come close. I want new hardware!

Jun 26, 2009

Incremental UI Improvements

I puttered away about two hours today marginally improving the UI. The colors go together better and I made a minor improvement to how the navigation tabs look. You could really waste a lot of time playing around with the UI if you're not careful. Also, because of the MVC approach that CakePHP follows, making UI changes really is trivial, even after the application code has been written.

So I'm semi-more satisfied with the UI for now and I'll make a commitment not to touch it again until the last week of the summer. If I do have ideas for UI improvements, I'll put them into my bug database.

What I really need to do is hire a designer. Unfortunately I have no money. Maybe there will be some nice advisor or student who'd be willing to help with this for free.

Jun 25, 2009

Spreadinh The Word

At the AP teacher training, I started spreading the word about my product. I knew a few of the advisors (read: future users of my product) there and mentioned to them what I've been working on. The reaction was overwhelmingly positive. "Wow, that would be awesome!" was the reply. I brought up the idea of a web-based registration system at some of the conference last winter, and everyone thought it would make things much easier.

I've been thinking a lot about my marketing and release strategy. What I don't want to do is spring a released product on everyone as a surprise. Consistent with the agile approach, I'd like the users of the system to give me feedback as I develop it. To accomplish that, I'll be inviting certain people to beta test the minor releases this summer. I'll also be talking to the state advisor about the product and getting feedback from her. I hope to speak at a teacher's conference next fall as well.

Originally I thought that the first year would be a beta test only, but I've changed my mind. I want to be making revenue starting this year, but I'll limit the release to my state only. I'll require conference organizers to pay for the software, but offer an unconditional money back guarantee. I've been in the software industry for about a decade and I know that this is a good approach based on my own experience and that of others.

Jun 22, 2009

AP Computer Science Teacher Training

Today was my first day of AP Computer Science teacher training. Yesterday, I wrote that I was worried about some of the other teachers being cluesless about CompSci. Actually, the other teachers taking the class were pretty knowledgeable. The pace of the class was good. I'd heard everything before, but I haven't touched Java in about three years, so it was a really good refresher.

There was one other teacher in the class who was kind of funny. The professor was explaining the difference between primitive types and objects, and the difference between pointers and variables. "That has something to do with inheritence, right?" said the funny teacher.

Actually, any time a topic was brought up that was beyond this teacher's knowledge, he said that it was "related to inheritence." He asked when we'd cover "advanced topics like inheritence".

My conclusion is that INHERITENCE is the last chapter that this teacher read in his Intro To Java book, and that it therefore must be a really advanced topic, and that all of the advanced topics he's never hear of before is "sort of like inheritence".

Strangely, after studying Java all day I don't really feel like coding PHP tonight. This will be a good chance for me to tweak the UI. The coffee shop closes in two hours. Best get to it.

Jun 21, 2009

Bug Zapping

I'm taking a course this week getting me certified to teach high school AP Computer Science. I'm in this cool small college town, and I had about an hour and a half before I had to report to school. I found a neat little coffee shop and banged out four of those bugs on my list.

I'm having second thoughts about the UI and am considering working on another iteration. I'd like to get the User functionality fully built first though.

They're using Java in AP Computer Science. Most business teachers have basically zero background in CompSci. Don't know why they're teaching kids about it. So I have a feeling that this course will be taught at a very, very basic level. Joy.

Jun 20, 2009

Authorization and Bugs

CakePHP comes with a built-in authorization component which helps defend against CSRF attacks. It's working great with Firefox but not with IE7. There must be something about how IE7 handles cookies that CakePHP doesn't like. I'll have to look into this.

I finally installed bug tracking software today. My initial choice, The Bug Genie, didn't work out so well, so I went with an open source product called Mantis. It's great. I already have 17 open issues (I was using Notepad to track this until now). I'm going to resolve these issues before I move on to developing additional functionality.

Many of these issues deal with refactoring, some are deployment notes (there are big differences between a dev environment and a production environment) and some are enhancements. Only one or two are bona fide bugs.

I Love Cake And jQuery + Security

I just can't say enough good things about this framework. I would NEVER attempt writing a web app without a framework of some kind. I've tried CodeIgniter as well, but CakePHP wins. No question.

Yesterday I got the validation working for the Add User page. Today, I'm working on the Manage Users page and the Edit User use case. I probably won't have time for Delete User today but that's next on my list.

After that's all done, I'll spend some time refactoring and then move on to authentication.

I've been thinking about security right from the start. I already have bulletproof measures in place to prevent against SQL Injection and XSS attacks, but I haven't put defenses up against CSRF attacks yet. The authentication functionality will solve that problem. Eventually I want to implement HTTP throttling as well, but that can wait until later. I'll be using that, CAPCHAs, and robots.txt to try to mount at least a measly defense against bots.

I'll also build anti-framing defense into the site to make it more difficult for other sites to put mine inside of a frame or iframe.

I've been jQuery plugin shopping too. I love jQuery just as much as I love Cake. It makes UI development so easy.

Jun 18, 2009

Some Success!!

I was able to put in a good five hours of work today. I had a few frustrating problems, two of which ended up being a result of silly typos. Those little mistakes can drive you nuts. I had a small bit of success. I successfully added the first row to the Users table in my database! I don't have validation or anything working, but still! Yay!

CakePHP makes it super easy to make CRUD applications. I mean super easy. If I had to hand code everything that Cake does for me, I'd easily have another eight hours of work to do.

I'm already accumulating a bit of technical debt, and I'm keeping a careful journal of all of the refactoring that I already need to do. I want to get the user model semi-working first, and then I'll spend some time on the refactoring.

Jun 17, 2009

One Step Forward, Two Steps Back

Subversion was more headache than it was worth:

You have to use Subversion to add files to or delete files from your project. For each file you add, you must manually add it to your subversion repository. There is no function for automatically adding all new files. You can't delete or rename files directly with the operating system; you must use Subversion. Human errors with this have already caused more problems than what version control can solve.

I'm going back to my daily backups method for version control.

The Subversion binaries that I installed automatically installed a second copy of Apache on my system. I already have Apache and the two instances weren't playing nice with each other. They were causing each other to crash. I was trying to develop a web app with crashy web servers.

Subversion also slowed down my file system a lot and added mysterious system folders to every directory within my project.

I uninstalled Subversion, uninstalled XAMPP, and upgraded to a new version of XAMPP. I'm getting CakePHP errors now when I run my application on top of my new XAMPP installation.

Today has been 90% sysadmin work and virtually no development work. I won't have a lot of time to work on this tomorrow either.

Death To Dropdown Menus

Yesterday, I spent about three hours working on a new iteration of the UI template. The previous version had dropdown menus, which everyone knows are evil. The new navigation system uses a tab interface with secondary menu items always visible directly below the tabs.

The UI looks quite good if I do say so myself.

I'm still learning a few things about Subversion. I'd like to automatically add all (new) unversioned files, and I'd like to automatically commit all files that have changed. I only know how to do this for an individual file or an entire folder. There must be a way.

Today, my goal is to finish up the UI template and start working on the User model. Could it be? Writing actual code? Why, yes! I think I'm ready!

Jun 15, 2009

Subversion and ACL

Subversion
Today, I got Subversion installed and configured on my system. The server software is pretty easy to use. I tried using the Subclipse plugin for Eclipse as my client software, but it was giving me a fatal error. I did some reserch, and getting it to work with my version of Apache would have required some additional configuration which I didn't really want to get into.

Then I downloaded Rapid SVN. I love it. I did some experimenting with Subversion and I have to say it's almost like magic being able to see any version of any file you've ever had. I fired up my Mozy automatic backups again today to get my stuff off to a remote server.

ACL
I've settled on CakePHP for my framework, and it comes with support for Access Control Lists. I knew right from the start that I wanted role-based security in my application, and the Cake ACL implementation seemed like a good choice. After doing some analysis, though, I realized that the permissions in my application get a bit more complicated than simple yes/no values for accessing methods. Controls on my UI pages will have different visibility, populations, and defaults depending on what type of user is logged in.

So, I'm scrapping the built-in Cake ACL and rolling my own. For a while, I considered writing security verification for each individual function, but I really want to keep the security role-based.

I'm sure this doesn't make sense to anyone but me. But anyway that's how I've spent my day so far. I still have a few hours left and plenty of stuff to work on!

Jun 12, 2009

Documentation and Prototypes

I did quite a bit of analysis work on this project last winter, and I even got some documentation done. I've been thinking about this project off and on for the last six months. I've considered a number of different designs, and I now have a clear idea of how I want the software to look.

This week, I spent some time on creating some UI prototypes, writing the Phase 1 Scope document, and fleshing out the first use cases for creating, reading, updating, and deleting users. I also finalized the entity-relationship diagram for the database.

Phase 1 Scope Document. I have big plans for this software, but I need to be realistic about what I'll actually be able to accomplish this summer. Phase 1 will include the minimum functionality for chapters to register students for conferences. Eventually, I'd like to add functionality for judges, schedules, locations, and scoring, but that will probably have to wait until next summer.

Entity Relationship Diagram. I don't have Visio, so I'm using Access to create my ERD. I tried using an open source product called MySQL Workbench, but I was using a beta version which was too buggy to be useful. The actual database will run on a MySQL engine, but Access provides some acceptable (not great) diagramming tools.

UI Prototypes. I have the basic template done, as well as some mock-ups of reports and add/edit forms.

Use Cases. I'll be using agile methods to create this software, but documentation is still important, even for a single-developer project. Designing this software is an iterative process; the use cases I wrote are meant as a starting point.

Since it's the first week of my summer break, I decided to take a full day off today and not work on the project. I'm away this weekend and will pick up the work on Monday. I'm satisfied with the progress I've made so far.

Jun 11, 2009

What Every Software Business Needs

There are certain things that a software company simply can not do without, no matter how big or how small the company is. Here is my list:
  • Remote backup
  • Source control
  • Bug tracking system
  • The best tools for the job

One of the first steps of launching this business was putting this infrastructure in place. A lot in the industry has changed since I started my last software business in 2003. After some research and trial & error, I've chosen the tools that I believe to be the current state of the art.

All of my software development tools, with the exception of remote backup, are free and open source.

Remote Backup: Mozy

I evaluated both Mozy and Amazon's S3 service with the Jungle Disk front end. Both services have received excellent reviews from other software developers. In the end, I chose Mozy for its ease of use and lower prices. If you use a very small amount of storage and bandwidth, Jungle Disk might be a better deal for you, but Mozy offers unlimited storage and transfers for only $5 per month. It's actually free if you use less than 2 GB.

I was previously using CDs for my backups, but there were several problems with this. First of all, the backups weren't frequent enough. I would only back up my data about once every two weeks. That, of course, is a serious problem. With Mozy, the backups occur automatically in the background every day. The service will back up only the folders that you tell it to. The remote server shows up as a new drive letter on Windows systems, and you can navigate to it just like you could with a shared network drive.

The other problem with CDs is that they were stored in the same physical location as my computer. One fire or flood, and all of my work would be lost. Five dollars per month is a pretty cheap insurance premium if you ask me.

Source Control

The systems I've used previously include Microsoft SourceSafe (shudder), SharePoint (shudder), and Surround SCM (shudder). These were all at my jobs. Other than the biweekly CD backups, I've never used source control for my personal projects.

I've decided to go with Subversion for source control. It's free, open source, widely used, and just pretty much the de facto choice for source control these days. Git and Mercurial are receiving a lot of attention, but I have no need for a distributed system, as I'm a one man team on a single machine. I'll be adding the SVN repository to Mozy's list of automatic backups.

I'm really looking forward to being able to start new branches of my project and roll back to previous versions of my files after I screw up. The ability to quickly diff old and new versions of source code will be really nice too.

I'll use Subeclipse and the command line interface for the front end. There are a lot of choices out there for client software but I want it integrated into my IDE.

Bug Tracking

This was done in a notebook in my other projects. Bugzilla is an obvious choice if you're looking for open source. I found another product called The Bug Genie, which is entirely written in PHP. Since I already have a WAMPP stack on my machine, setting this up will be really easy. I hope.

The Best Tools For The Job

I'm using a laptop that's three years old, but it still works just fine. I like the laptop because it lets me code anywhere I want to. I can't work from home; I get distracted way too easily. Eclipse is my IDE of choice.

Jun 8, 2009

Project Hatrick

Project Hatrick is my second software company (I haven't chosen a real name yet). A hat trick is when a hockey player scores three goals in one game. Quite an accomplishment. Pulling off this project will take the same amount of skill and determination.

I'll be creating web-based conference registration software for a very niche and underserved market. The market potential for this is huge. Even if my software ends up being a total market failure, I'll be able to use it in my own job. I'm an advocate of eating your own dogfood; the best kind of software to build is the kind you can use yourself.

This is my second software business. I ran a shareware business during and after college and I have no misconceptions about how much work building the project and launching the business will be. My first software business was a lot of fun, and I think this one will be too.

There are two main purposes of this blog: to document my work and to keep myself motivated. I write for myself and don't really expect anyone else to be interested in my posts. But if my posts do happen to help another budding entrepreneur, great. I want this to be a day-by-day account of what it takes to start a new software business.

You can read about my day job at my other blog, Teaching Technically.