Torrey’s Blog

My Application Development Ramblings

User Experience Headaches

October22

This week has been an eye opener into the reality that I’m a programmer and not a designer. I’ve nearly completed my second year as a professional software developer and have quite the project list for my resume, and still have so much to learn about software development. This post is about the user experience design problem I encountered with two clients.

The first example comes from an Auction Manager application I wrote that handles property auctions and contacts.

prux.png

This application was not based off any other application and was created from scratch. As I created this and went through various meetings with the client it was clear there are various steps and seperations during the process of property auctions. As an application that will grow over the years I imagined that using an Outlook style explorer bar would be benefitial and make the application easy to understand and learn. Once work started picking up for the client and the software was used more they found that this kind of style slows down the work flow, because of the extra clicks it takes to get to the various screens they need. After I visit them this week I’m sure I’ll come up with a better idea to repair the work flow and create a better user experience, but my question is how do you plan and prepare the great user experience if the application never existed? What works for some clients may not work the same for others.

The second example I have is a point of sales system I created for small businesses. This is still in development and I’m 100% sure this interface will change within the next two weeks.

spvux.png

While creating this software I searched the internet to view various screen shots of point of sales systems to get an idea of how I could improve the ease of use for users. A lot of systems out there are screens loaded with information that will completely confuse the user. By simplifying everything and making the whole process faster. The boss and other office co-workers liked the system and said it should be a really big hit with people. One of our clients that will be using the software soon came to have a sneak peek at it. Their first reactions were that all the information is displayed on the screen and there is no contrast between the various parts which will leave users confused. Her point of sale system that she is switching from is QuickBooks POS, so everything she compared to was that. If it doesn’t function like QuickBooks with the various screens they use, then it appears to confusing to learn? I just don’t understand the design side of things to accept feedback like this.

Every client is different, and small businesses seem less likely to have training sessions because their work schedules are so busy. In the last year I’ve heard multiple comments that clients want their software to look and function exactly like Microsoft products and other big name companies like Intuit. Their reaction really comes from years of using these products, which causes me stress because of the thought and ideas I’ve put into the making the software I’m presenting. New innovative ideas don’t stand a chance in a fast moving busy small business. I am confused on how to approach the user experience design side of things because all I’ve done is programmed most of my life.

If anyone has some great adivce on resources to read or listen to I’d be more than willing to take a look. Right now I try to learn as much as possible from various web searches on the topic and listen to the Pixel8 podcast.

Memory Leaks Cleanup Roto Rooter Style Snippet

June5

This could be one of the most useful snippets know to man kind. Shove this bad boy into a timer that executes every so many minutes or after loading up some datasets.

  try
  {
     Process process = Process.GetCurrentProcess();
     process.MaxWorkingSet = process.MaxWorkingSet;
     process.Dispose();
  }
  catch { }
posted under C# | No Comments »

Updating a DataSet Through a Webservice

May27

Alright, so I’ve been racking my brain around this whole n-tier architecture and started converting one client’s software to this type of solution. When it comes to creating the various layers and web service that just pulls data it’s easy as pie. Updating a DataSet through a data access layer that communicates to a web service is a whole other story. Here’s a quick overview of how I achieved the update.

1) The smart client issued an update event that called the DAL (date access layer) update.

2) The DAL passes the DataSet to the web service. Keep in mind during the first two steps I used the generic type DataSet. The smart client doesn’t actually contain the DataSet types that are stored in regular applications that could made the update a whole lot easier, that’s the reason why I’m using the generic DataSet type.

3) The webservice uses the method below for updating the DataSet. The more reference material I read lately, I may end up changing the update method, I believe that I’m doing it partially incorrect even though it works perfectly.

         [WebMethod(Description = “Updates the edited Job Log row.”)]          public String update_tblJobLog(DataSet tblJobLogDS)          {              DataSets.tblJobLogDataSetTableAdapters.tblJobLogTableAdapter tblJobLogTableAdapter = new Company_Webservice.DataSets.tblJobLogDataSetTableAdapters.tblJobLogTableAdapter();              Company_Webservice.DataSets.tblJobLogDataSet typedtblJobLogDS = new Company_Webservice.DataSets.tblJobLogDataSet();              typedtblJobLogDS.Load(tblJobLogDS.Tables[“tblJobLog”].CreateDataReader(), LoadOption.OverwriteChanges,                  typedtblJobLogDS.tblJobLog);              typedtblJobLogDS.tblJobLog.Rows[0].SetModified();              try              {                  tblJobLogTableAdapter.Update(typedtblJobLogDS);                  return “Success”;              }              catch (Exception ex)              {                  return ex.Message;              }          }  

There’s actually a way I can just pass the rows I need by using the GetChanges method, then cycle through the loaded rows to update the RowState. This style of programming definately has its pros and cons, but I think in the long run it’s going to work wonders for scalability since this particular client is expanding like their is no tomorrow.

[edit]

Just googled the magic phrase and found out Microsoft actually has a code snippet that shows an easy way to update a dataset through a webservice. It figures I nearly make my brain bleed trying to get the update to process earlier, and Microsoft has the solution sitting right there. Sometimes all it takes is the magic search phrase…

[WebMethod]         public DataSet GetCustomers()         {             SqlConnection con = new SqlConnection(“server=servername;uid=login;  pwd=password;database=northwind”);             SqlDataAdapter daCust = new SqlDataAdapter(“Select * From Customers”, con);             DataSet ds = new DataSet();             daCust.Fill(ds, “Cust”);             return ds;         }       [WebMethod]         public DataSet UpdateCustomers(DataSet ds)         {              SqlConnection con = new SqlConnection(“server=servername;uid=login;  pwd=password;database=northwind”);              SqlDataAdapter daCust = new SqlDataAdapter(“Select * From Customers”, con);              SqlCommandBuilder cbCust = new SqlCommandBuilder(daCust);              daCust.Update(ds, “Cust”);              return ds;          }
   

Beginning N-Tier Development

May22

Within the past week or so I’ve started studying up on N-Tier applications since I’ve been experiencing overload on one particular client expanding faster than I can keep up with application maintenance. This client has grown so much in the past 2 months that I have been working almost non-stop to develop a solution that works with their business. Now that I understand what N-Tier is and means, I really feel silly for not looking into that sooner. You’ll read that it’s mainly for large scale applications, but there is actually a need for such a architecture in small business too. From this point on I plan on creating layers for every project I work on. It makes perfect sense and will ease future projects because I can reuse the various layers.

I would keep typing more, but I’m half asleep right now, so I’ll try to catch up with more posts tomorrow. Goodnight!

Friday Night Hobby Coding

May10

Okay, sue me. This is my second post of the day, but I am feeling bored so I’ll post up what I was worked on last night. The wife had to work last night so I sat around for a little bit and started coding out a financial manager application. It keeps track of bills, accounts, transactions, etc. There’s still a lot more I want to do with it, but here’s a current screen shot.

Financial Manager

posted under C# | No Comments »

Last Minute Corporate Decisions

April29

One of the things I’ve come to know while being an application developer is that the people that run companies are the worst when it comes to finalizing plans or making decisions. If anyone reading this has an explanation of why they are so slow to make decisions, feel free to make a comment.

Last week one client decided they are going to open up a new company a little early in another state. In one weeks time I have to take the current software I designed that runs their business and alter it to work at both locations for either company. For example a manager could be in another state and pull up information for the other location all in the same program. That might cause you a bunch of stress when you have to make a huge change like that, but luckily it’s not as bad as it sounds.

I found a nice little trick (improper way) for achieving what I wanted when it came to dynamically switching database connection strings. If you were to open up Settings.settings in your project properties you’ll notice that the connection string has the type (Connection String). What I ended up doing was creating a combo box that lists the different companies, and when the user selects a different one it switches and saves the updated connection string. You might be thinking that it’s impossible considering that the scope is Application only, and you are correct. What I do before compiling the application is to switch that value to a String type and give it User scope. Now the user can use the program and change connection strings at his/her will.

If you need to make further edits and updates to the application, you’ll need to change back the type to (Connection String) and open up your App.config to add the provider. Which is:

providerName=”System.Data.SqlClient”

Add that back to your App.config connection string tag and you’ll be all set for editing data stuffs again.

In the near future I’m going to change the way I do this by creating a web service to serve out the datasets I need to access. This should also be useful for all my clients and give them the ability to access their SQL based application data from any location they have an internet connection.