Monday, December 17, 2012

Systems Analysis Project

After working with a local non-profit agency, I was able to identify a critical business need within the organization. After meeting with them and discussing the issue, I was able to compile the issues into some analysis documents. I was able to generate a formal systems request, provide a comparative feasibility analysis for different solutions, as well as generate some user stories.

I'll be discussing this project as well as the organization as a whole in the video posted here:

Systems Analysis Presentation

The analysis of the solutions for the organization is still on-going. While the organization is still leaning toward developing a MS Access solution, I feel there may be some unexplored avenues that may provide the functionality they are looking for. It is my intention to see this project through to the end and to provide the agency with a usable product that addresses their needs.

For all developers out there, I'd highly recommend taking on some "pro-bono" work. It has given me an opportunity to reach out to my community and help those who do not have the financial resources to seek out solutions to their problems. I've come to find that there are many non-profits out there who struggle to find funding just to keep servicing their communities. Finding additional funding to hire developers is extremely difficult. In the end, I think the entire project will have taken me a total of around 20 hours to complete. While that's a significant amount of time to sacrifice for no money in return, I believe that it offers a chance to learn as well as a chance to grow professionally. In the end, I think it's a worth while investment.

It's been a blast working on this project, it has been challenging as well as rewarding. I look forward to completing this project and taking on more projects like it in the future.

Saturday, December 15, 2012

Cucumber Scenarios - Inventory Project

Currently, I am working on developing a software solution to address issues with inventory at a local non-profit agency. After analyzing their processes and problems, I have gathered their core requirements for the product. To ensure that I have captured the business requirements accurately, I utilized user stories and created a few cucumber scenarios. For those who are not aware of cucumber, it is a tool for running automated acceptance tests written in a behavior driven development style and is written in the Ruby programming language. Cucumber allows a developer to write acceptance tests in customer-understandable user stories.

Utilizing cucumber allowed me to accurately represent their requirements, step through the entire process, and generate a test scenario to test against in one step. I uploaded two of these cucumber features to github, you can view them at the following link :

GitHub Repository for Inventory Project

To UML Or Not To UML? That is the question...

UML was developed with the intent of standardizing the modeling language in the field of object-oriented software engineering. It utilizes graphic notation techniques to produce a visual model of an object-oriented software system. Specifically, UML is used to specify, visualize, modify, construct and document the artifacts of an object-oriented software-intensive system under development.

UML, at it's core, puts a strong emphasis on design. In practice, it is utilized to make attempts to model software in detail. The drawback with this approach, in general, is that potential for "analysis paralysis" is very high. In an age where extreme programming methods and agile development is becoming the norm, the "big design up front" method is becoming just another road block to developing working code. 

That being said, UML offers some very key advantages over any other non-standardized approach. The creation of a standardized method of representing data is a major advantage to all software engineers and developers. It allows everyone to have a common understanding of a single graphical representation with very little misunderstanding. 

UML has it's advantages as well as it's disadvantages, some say it's the standard while others say it's on it's way out. An argument can be made both for or against it. Personally, I find it has a place in developing simple applications, but it becomes extremely overwhelming when utilizing it with large scale applications. UML can be advantageous to any team given that they use it in the right context. 

Tuesday, December 11, 2012

Skill Of Programmer Limited by Ego?

It's very easy to be overwhelmed when programing software. At times, it seems as like there is so much to learn in order to accomplish your task. Other times, parts of a project seems so mundane that you lose interest. Overall, completing an entire program or simply learning how to program requires humility and focus. 

An excerpt from Code Complete, written by Steve McConnell, states this about the character of a programmer:

"Nobody is really smart enough to program computers. Fully understanding an average program requires an almost limitless capacity to absorb details and an equal capacity to comprehend them all at the same time. The way you focus your intelligence is more important than how much intelligence you have."

McConnell, Steve (2009-12-07). Code Complete (Kindle Locations 26572-26574). OReilly Media - A. Kindle Edition. 

This statement, in a word, summarizes my entire, at times turbulent, relationship with programming. It's a love and hate affair that has challenged me on an emotional and intellectual level. As McConnell stated, it is much more important to be able to focus your intelligence that it is to possess intelligence. That reminds me that regardless of how much one learns, one must realize that they will never be able to "know it all". To be successful, you must possess the humility to realize this fact and take steps to change your view of programming as a whole. If you allow yourself to think that you "know it all" and you don't have to keep learning, your skills, and ultimately your success, will be limited by your ego.

In addition to humility, a programmer must make a constant effort to remain curious in order to stay current with technology, one must be intellectually honest to understand their weaknesses and address any shortcomings, and one must possess the discipline to approach every task methodically and with purpose. 

McConnell accurately summarizes the necessary skills of a programmer in Code Complete, at least in my opinion. However, I believe that these skills mentioned are critical to just about any skill you wish to excel in. 

Friday, December 7, 2012

Feasibility Analysis for Parents And Children Together

This is a feasibility analysis for Parents and Children Together. The project seeks to modernize current inventory tracking methods as well as provide useful reporting functions to users.  The product will replace the current spreadsheet approach to tracking inventory with a more efficient database tracking solution. Parents and Children Together has decided to develop an access database to track inventory and monitor statistics. They have decided against a web based program and decided on a stand-alone database system with a simple GUI. The results they require can be achieved through Microsoft Access. 

The idea's technical feasibility (Can we build it?)
- Familiarity with Functional area - developer has familiarity with inventory tracking processes
- Familiarity with Technology - developer has been and developing access databases for many years
- Project size - small project
Compatibility - organization currently utilizes a few access databases and is familiar with the technology.
The economic feasibility (Will it provide business value?)
- Development costs - 3 hours to develop.  2hrs+ training of staff.
- Annual operating costs - 0
- Annual benefits - reduction in staff time spent on tracking inventory and more efficient tracking methods alowing staff to focus on other critical processes.
- Intangible costs and benefits - contributes to the organizations mission to provide to those in need
The organizational feasibility (If we build it, will it be used?)
- Project champions - Karen Cardenas, Head of Administration
- Senior management - Senior managements supports the effort as it would reduce time spent on task and allow them to reallocate man-hours to other tasks.
- Users - Parents and Children Together administrative staff
- Other stakeholders - customers of organization wanting to borrow items.
- Is the project strategically aligned with the business? Yes, this project addresses one of the major functions of the organization. Developing this solution will make this process more efficient. 

Tuesday, November 13, 2012

Project Idea #2 - Inventory tracking application

A local non-profit has a need to be able to accurately track it's inventory. They lend their assets out to people in the community and they would like to be able to easily view what is currently in their possession as well as what is loaned out and to whom the item is loaned to. In addition, they would like to store the borrowers personal information in order to ensure total accountability of all items. 

Currently, this process is managed on several excel spreadsheets. While the process works, it is very easy to lose track of items. The result is that many items are not returned and they are unable to track who last borrowed that item. 

The system will include a way for the agency to update their inventory, input and update all previous and new users personal information, as well as provide a reporting function that informs the user when an item has been out for a period of time set by the agency at the time of transaction. This will be a web based system that will allow all members of the agency to view their current inventory as well as have automated functions informing them of items past it's return date. 

This system, if used properly, will reduce the agency's losses as well as reduce man-hours spent tracking their inventory. 

Project Idea #1 - SIlent auction system for non-profit charity events

As I prepare to take on a volunteer programming project, my first thought is to create a system or product that would benefit a local non-profit agency. While there are many areas in my life where a new system could benefit me directly, I think it's important to reach out and help those who are unable to create, or pay for someone to create, a system for themselves. 

My mother works for a local non-profit agency called Parents And Children Together. They provide family and child services for those who are in need. On occasion, the agency hosts a silent auction where they auction donated items and services. These items are donated from various sources and are sold to the attendees of the silent auction. 

Currently, the agency uses multiple spreadsheets to track donated items and services as well as those who donated them. During the auction, bids are placed manually for each item with the bidder writing their bid down on a piece of paper. Once the auctioning closes, all papers are gathered and the winners are input into another spreadsheet which is then posted on the wall.

While the current system in place is functional, I believe that much of this can tracked much more efficiently. Creating a database to store donors, bidders, items, prices, and payments will give the agency a way to better access this information in a way that is helpful to all stakeholders. In addition, adding a front end system that would make data entry and reporting quicker and easier would greatly benefit the organization. If possible, creating an interface where bidders can easily enter their bids into a computer system would make the process much more streamlined and accurate. 

Most of this project is fairly "easy" in terms of creating the database to store the data. The challenge is creating an application that is easy for the agency to operate. The most difficult part of this system will be to create an efficient and non-intrusive/non-technical interface for bidders to enter their bids. 

Friday, November 2, 2012

The LoFi Approach

In the process of developing SaaS applications, we must always consider the end users experience. In fact, the user interface (UI) is the most important aspect when it comes to the usability of the application. Many times, we as programmers, are quick to think of the backend design of the application with little thought, in the initial planning phases, on the UI aspect of the design. 

The textbook "Engineering Long-Lasting Software" discusses behavior driven design (BDD) through the use of user stories. The concept is to design the application based on the users explanation of their processes and what they would like to see in the developed product. This process is implemented before and during development to reduce the chances of miscommunication. 

A critical element in the BDD process is to first identify what the customer expects to see in the application. In my personal experience, I have always done complex mock-ups and prototypes of software to present to the customer. These "prototypes" were always coded (in the simplest means possible). According to the text, this is overkill since: 

"Building software prototypes of UI can intimidate stakeholders from suggesting improvements to the UI. That is, software prototypes have just the opposite characteristics of what we need at this early point of the design."

Instead of these complex prototypes, we should take the "LoFi" approach. This approach involves paper-and-pencil mockup drawings of the UI. This approach is much less "permanent" and allows the customer to feel more comfortable with suggesting changes and modifying the application to meet their needs. In addition, this prevents programmers from wasting man-hours on developing prototypes that, in all likelihood, will be heavily modified or even discarded. 

This is a huge revelation for me as it is a practical approach toward developing a product. It's really a win-win situation for both the programmer as well as the customer. I'll definitely try to use this approach with my next project. That is, if my supervisors can get over their need to have everything "pretty and presentable". 

Wednesday, October 31, 2012

Ruby on Rails - Fad or Here to Stay?

Ruby on Rails, or Rails for short, is a web-application framework for the Ruby programming language. Since it's introduction in 2005, it has become extremely popular due to its ease of use and rapid development principles. 

The info-graphic shown above illustrates the growth in popularity of Ruby On Rails. Most notable on the info-graphicis the increase in usage over the past year as well as the increasing demand for developers with Ruby on Rails skills. 

While these statistics can't tell the whole story, it appears as though Ruby on Rails has become very largely used and adapted. At this time, there are over 230 thousand websites that have been built using Ruby on Rails including sites such as GitHub, Living Social, as well as Hulu.

The increase in demand for the Ruby on Rails skill-set implies the increasing popularity of the framework in the corporate environment. It appears, at least for now, that Ruby on Rails has gained a strong foothold in the marketplace. It's ease of use as well as the capability of producing products at a rapid pace makes a strong case for organizations to adopt this technology.

Monday, October 22, 2012

CSS Awesomeness!!

Admittedly, up until taking a class focusing on web software, I have never had much of an interest in any web development. I've maintained and assisted in the development of several web applications, but I have never truly immersed myself in "web development". For work, I maintain several simple websites that display various query results from a database I maintain. While they are functional, noting that I put very little effort into the presentation of this material, they are also very unsightly ugly. Why, you ask? It's because I never moved beyond the simple HTML language to incorporate CSS.

CSS is a simple mechanism that allows a developer to add a style and theme to a webpage or web document. It separates itself content from design which allows HTML to focus solely on processing the markup of the content and not layout and design. CSS allows a developer to utilize a standardized layout and design across multiple webpages without the fuss of formatting each page to mimic the theme and look of another. Simply put, it makes it much easier to make your sites more presentable and uniform.

I'm definitely interested in learning more about CSS. After looking over many of my favorite sites, I realize that mastering CSS is one key to building some outstanding websites. Here are some beginner links for anyone who may be interested in this as well:


Monday, October 8, 2012

SaaS - How it's changed our lives

Software as a service (SaaS) is a revolution in computing that has significantly affected our daily lives. Everyone one of us use some type of SaaS software whether it be facebook, twitter, yelp, or webmail. SaaS has changed the game in terms of how users view and interact with software. Gone are the days where we need to buy the software, install it on our machines, keep our hardware compatible in order to run it, and continually patch it to ensure the security of our machines. With SaaS, most of the time all we need is a web browser and an internet connection.

So no more manually installing software everytime I get a new machine, no more having to carry around an external hard drive with your saved files, and no more worrying about licensing fees. So how does this all work and how is it phasing out the old "locally installed" software approach? 

1. Compatibility and accessibility - SaaS applications are available on any device, any platform, and at any time you need it (provided you have an internet connection). Because it's on the internet, it's easy to find and the learning curve for usage is low. 

2. Lower cost - Most SaaS applications are subscription based, there is a lower investment needed to adopt the application due to  lower hardware, software, and personnel costs. 

3. No upgrade or installation - All SaaS applications are web based and require no patches or upgrades on the customers end. 

This all means that I can access all my social networking sites and information from any computer in the world. In addition, I can store all my files on the cloud and read and edit documents from my phone or on any terminal in the world. I can collaborate with co-workers and peers around the world at any time. In most cases, the only thing I have to worry about it having a platform (any platform) to access the internet. It's all 

In the end, it means lower costs, no compatibility issues, and unlimited scalability. All in all, it seems that SaaS is the way forward for software in the future. I, personally, am more than willing to pay a small subscription fee to have access to a well developed and maintained product that is accessible from anywhere with an internet connection. With the money I save on having to constantly upgrade hardware, I will have the money to pay for the subscriptions and probably have a lot left over. Good deal all around!

Monday, October 1, 2012

Is designing bug free software possible? A look into "Design By Contract" (DBC)

Design by Contract (DbC) is an approach for designing software. According to Eiffel Software, the originators of this method, DbC can be explained as follows:

"DbC is a metaphor on how elements of a software system collaborate with each other, on the basis of mutual obligations andbenefits. The metaphor comes from business life, where a "client" and a "supplier" agree on a "contract" which documents that:
    • The supplier must provide a certain product (obligation) and is entitled to expect that the client has paid its fee (benefit).
    • The client must pay the fee (obligation) and is entitled to get the product (benefit).
    • Both parties must satisfy certain obligations, such as laws and regulations, applying to all contracts."
It is said that utilizing this method guarantees that bugs will be prevented by implementing a system of checks and balances. This method also promotes coding to exacting specifications, providing no more or no less that is necessary. This implies that developers should not try to add more features or functionality into their code than is necessary to accomplish it's original task. In this way, the behavior of all code can be guaranteed, predictable, and consistent. 

Here are the benefits of DbC in a nutshell:
  • reliability
  • maintainability
  • well-documented
  • simpler and consistent code
Some drawbacks of DbC:
  • requires more diligence on the part of the programmer (= more work)
  • may result in performance issues - due to checking conditions at runtime

This all sounds great to me! 

However, while the theory of DbC sounds like an incredible idea, how likely is it that people will adopt and adhere to these concepts. 

Friday, September 28, 2012

Learning Ruby

This week I've been reading through "Code Complete" by Steve McConnell. He discusses the importance of choosing the right programming language for the task at hand. Now, there are many languages available for use today. How do we choose which language to use? Do we just stick with what we know or do we branch out and try to learn a new language? Every language has its strengths and weaknesses, if you limit yourself to only a few languages you may possibly be limiting your knowledge and capabilities.

Working in the IT field over the past 10 years, I've learned many programming languages over the years ranging from C to SQL. However, Steve McConnell brings up the interesting topic of utilizing high-level languages that allow you to be more productive and allows you to produce higher quality results. A study shows that 1 line of C++ is as efficient as 2.5 lines of C code and 1 line of Perl or PYTHON is as efficient as 6 lines of C code. This means that you can do more with less when utilizing high level programming languages! 

One specific language brought up was Perl. I've heard all about this language and have several co-workers who go on and on about how great it is. However, I never really took to even look into it, much less learn it. A few weeks ago my boss suggested I learn Perl and I brushed it off not thinking much about it. This week, I learned what it is capable of through Steve McConnell's book.

On a daily basis, I utilize the Linux command line and write SQL queries to retrieve data from databases. I do most of this manually with some shell scripting for administrative tasks in Linux. Today I learned that I can make my job 10 times easier by learning and using Perl! If that's not incentive enough to learn it, I don't know what is.

First stop, Google and YouTube! Here is some good links that I found for anyone who may be interested in learning Perl as well. Click here for a free online book and here for some tutorials.

Have fun!

The Pragmatic Programmer - Chapter 2: Here's What I Thought Was Good

In chapter 2 of The Pragmatic Programmer, we read about "tips and tricks that apply at all levels of software development". According to the text, these are virtually universal methods. Here is my opinion on what was good and informative about this chapter:

  • Tracer Bullets
    • Aside from the awesome analogy between software development and guns, this method of development makes a lot of sense to me. Why spend valuable time calculating all the variables before taking a shot at the target when you can fire off "tracer rounds" along side your "real ammunition" in a live environment? When operating in an unknown environment with the high likely-hood of changes occurring, rather than spending lots of time specifying and calculating in order to create something we hope will work we, instead, code a basic structure with minimal functionality to establish a starting point for further improvements. 
    • I, especially, like this because it's a technique which you can use to take that first step in coding a project. Sometimes when you take a high-level view of your project, it can seem like a daunting task. By starting with basic functionality first, then making incremental improvements to increase it's functionality, it allows you to get to work quicker and to make progress. For someone like me who likes to get into a project quickly and make immediate progress, this seems like a great technique. This all assumes that you have planned the project well in advance.
  • Orthogonality
    • The concept of Orthogonality resonated strongly with me. This describes the concept where two or more things are said to be orthogonal when changes in one do not affect any of the others. 
    • I've been a part of many projects where software modules are highly dependent upon others. Having been only a part of the "rebuilding" team, making changes to  one part of the non-orthogonal code required me to make changes in several other modules as well. Understandably, some code may need to be dependent upon other modules for functionality. However, if you can isolate modules so that they are not dependent upon others it makes changing and updating the code much easier and development time is reduced dramatically. In addition, changes to the code reduces risk.
    • I like this concept and will try to apply it in all future projects. While I have always had it in my mind that your code should incorporate independent modules, I have never been able to pen those thoughts as well as it was written in the text.