Are your requirement documents full of C.R.U.D?

Wednesday, January 18, 2012 by Scott Lohner
A requirements document should capture the customers needs for a system. There are many guidelines that may and should be considered when writing requirements. This post is focused on the information, or data, that exists within the system.
Here I will discuss the need for C.R.U.D in your documents. This acronym stands for
  • Create
  • Read
  • Update
  • Delete

All systems deal with data. A system will need the ability to create data, read the data created, update this data, and in most cases have the ability to delete the data.

During interviews with the user you will find that almost everything discussed has something to do with data. C.R.U.D is a good thing to keep in mind when conducting these interviews.

C.R.U.D can help provide a framework for these discussions. I have found it useful in getting the users to focus on the information that the system should handle and not the "bells and whistles" that most users want to talk about.

The information that a system needs may be in several different formats (e.g. paper, word, RDMS, video etc.). Once these entities are identified the focus can now turn to how this information will be used in the system. This is where the concept of C.R.U.D comes in.

For each piece of information you should ask yourself

  • Where is this information created?
  • Who creates this information?
  • Can this information be created outside of the system?
  • What type of information is this?
  • Who can read this information?
  • Are there any special condition on when this information can be read?
  • Who can update this information?
  • Are there any special condition on when this information can be updated?
  • Can the information be udpated outside of the system?
  • Who can delete this information?
  • Are there any special condition on when this information can be deleted?
  • Can the information be deleted from outside of the system?

There may be other questions that will need to be asked but this should get you started.

C.R.U.D is a guideline that can be very useful in identifing the information that is needed in a system as well as providing a framework for discussing the functionality that the system will need. Business Process Management, Technology Consultants Indianapolis, Business Technology Consulting, Business Performance Management

Project risk and holiday shopping

Tuesday, December 20, 2011 by Jerry Loza
Black Friday chaos

What does Black Friday shopping have to do with risk management? Sure, both may include being up late at night and rushing from one location or meeting to another. And then there is the pushing and shoving (oh… wait… that one is just for the shopping). But seriously… there is an interesting parallel that I would like to share.

 

On a trip to scout out some laptops, I encountered a number of people lined up (with tents) outside of a Best Buy store Wednesday evening, waiting for the doors to open sometime Friday morning. There was a television they wanted to purchase (yes, I asked them) at what I would hope was a near give-away price. Obviously, the problem is that the store probably would not have enough of the televisions for everyone who might want one at that price. Put another way, there was a risk that a person wanting to purchase one of those televisions may not be able to do so. The obvious means of mitigating the risk in this scenario is to be among the first people through the door when the store opens. So how does one eliminate almost 100% of the risk? Well, in this case it means missing Thanksgiving dinner with family and spending 36+ hours in very chilly weather. Can you avoid paying such a high price? Sure, you can line up later or arrive after the store opens, but you would also run an increased risk of not reaching your goal – the great deal on the television.

 

A business needs to make the same trade-offs. I have seen managers who believe that they need to eliminate 100% of a particular risk occurring on a project, or an organization who insists that the system must be available 24/7 with zero down time (no, it wasn’t NASA). While it might be possible to get to 100%, or at least very close, the cost of doing so is usually prohibitive. In fact, careful examination usually reveals such a high degree of system availability may not even be necessary.

 

On Black Friday, I was not willing to pay much for the deal I sought. It was at least noon when I entered the store Friday after the crowds had faded. There was a very real chance that the product would not be in stock, but I was prepared to live with that, should it happen. In other words, that was an acceptable risk for me. As it turns out, there was product sitting there waiting to be transferred to my shopping cart. That was the case for many other things on the shopping list, as well.

So allow me to summarize what this recent shopping event was a reminder of, and possibly open myself up to criticism for stating the obvious: every person and every client will value things differently, be it keeping a project on schedule, or purchasing a 60-inch HD television. One neither wants to take on too much risk, nor pay too much for avoiding trivial risk. Fortunately, there is an abundance of tools and techniques that a skilled consultant can bring to bear on the issue. An experienced professional can help identify hidden project risks, assess their impacts, and help prioritize them. As for me, I am glad I took the chance on Friday and did not camp out for my shiny new 16GB USB drive. project management, developer, allegient, technology consultants indianapolis

Hungry for a Startup

Wednesday, November 16, 2011 by Tom Hunter
I was a hungry young programmer. The first ‘Internet Wave’ was crashing on America, and ‘Dot-Com’ businesses were epidemic. It was under these circumstances that I entered my first startup. The year was 1998, and my best friend Buck didn't know code, but he did know how to run a company.

Buck brought the idea my way.  He was always an admirer of the rich and knew a rich dabbler playboy, Rocky, who had this one idea, to make a piece of software called ‘Emerald City’ to help new- and used-car customers get afterhours information by entering a number from a windshield tag.

It was explained to me that Rocky had the one good idea and the money to stake it.  So Buck was going to run the place, I would write the code, and "we will all make a million dollars,” as Rocky said. Rocky explained the basics of what he wanted.  I was working around my day job at the time, but I coded it up, and planned to give him a demo the very next day.  When I brought it to Rocky, he wasn't satisfied, and wanted the whole thing re-done. I of course felt I had no choice, so I re-wrote everything to the newest specs.

I worked several days on the new designs and worked long hours over a weekend implementing the new designs. The next night, after I returned from work, I scheduled a face-to-face meeting with Rocky. Buck came too, but he stayed mostly quiet out of fear that I would say something wrong.

I turned on my PC and gave Rocky a ‘Dog & Pony’ show on his new designs. Rocky frowned and cupped his chin in dismay. "No, no, no, not at all," Rocky said, outraged, as if I had descicrated his ideas.

Buck stepped forward, trying to clutch Rocky's elbow. "Rocky, I'm sure that we can get this right now that we fully understand the problem," Buck said, fearing that he would get screwed yet again. I stood silent, having dumped a month of work into the project's codebase.

"No, that's not good enough," Rocky said, with a faintly offensive tang of aristocracy. "Give me the code," the rich, one-idea man said. "All of it."

I was young and naive. Like all Americans, I was intoxicated by the idea that any individual with a great idea and a deep hunger could make it. Emerald City and Rocky were intertwined, and so I copied all of the source code onto a floppy drive and handed it to Rocky. "Thank you for this," Rocky said, holding the floppy a bit too close to his face. It had all the source, which was in VB. 

You no doubt are unsurprised to hear that neither of us, Buck or myself, ever saw Rocky again. He ran off with his tiny scrap of code. I learned a cheap lesson, and Rocky received nothing but infamy.  Development, Design Development Indianapolis

Databases and Other Extreme Sports

Tuesday, November 15, 2011 by Tom Hunter

GDG Files Full of Money

After I made a monumental blunder with a GDG [Generation Data Group] file, my manager gave me a monumental project that intended to bridge the gap, dynamically, between "DB1" and "DB2."  I was a brand new programmer--kind of like a brown belt in TaiKwon Do--knowledgeable enough to be dangerous. My manager, Phyllis, who herself had worked her way up from nowhere inside a staid Midwest Insurance Company, gave me the assignment.

There was a single file--called a GDG or Generation Data Group file. The file had the same name, but yesterday's version was called 'TheGDGFilename(-1).' Today's was called 'TheGDGFileName(0)' and tomorrow would be called 'TheGDGFilename(+1).'  It's a convenient way to automatically version files such as the one I had to work on.  In the file, every record represented a draft (check) for thousands of dollars that was going to be sent out to pay a doctor or hospital. My manager Phyllis explained there were some bad records from Pennsylvania that I needed to sort out.  I found there were 7 Pennsylvania records.

I wrote my bubble sort and it worked perfectly. When I was done with the run, I was surprized to see there were still bad records--the same ones I had sorted out. I ran my COBOL program again and again and the Pennsylvania records were still there.  I ran it 7 times.

At about this time, in the basement of the home office, five stories below me in the print room, a color printer went crazy. It started shuttling in the check-blanks paper like lightning. As the flood of draft checks started to pile up and the envelope machine worked to get those checks into envelopes, a wise old pressman--Hans, no doubt with a handlebar moustache--slapped the red button on top of the check-writing machine and got Phyllis on the phone.

When Phyllis got it all sorted out, she realized my mistake. I had not written as I should to the +1 generation but back to the same 0th generation that I had read it from. So, I failed to delete the Pennsylvania records overall and raised the number of rows in the file into the thousands.  Phyllis sent me into a room where a SWAT team had assembled, trying to get rid of the duplicates.  She told me "Don't say a word ... just sit in there and watch all the people cleaning up your mess."                       

The Generation Data Group                      
IMS Is Running Out of Space: Help, DB2!

A few months later, after the issue with the "drafts" had faded, Phyllis and our team were facing a huge problem: we had one of our systems that was stored on an IMS hierarchical database--a non-relational beast that resembled an Alexander Calder mobile sculpture.
Mobile Sculpture by Alexander Calder, Illustration of an IMS database.
We stored Claims in the IMS database because it was so fast, but we were running out of physically addressable space in IMS. So, we had to purge our data off to a long-term DB2 database and a claims table with 60 million rows. So, because the IMS database was almost out of space, we constantly shuffled slightly old claims--a few weeks--off of the IMS database and on to the DB2 one.  It was a batch job.
Structure of an IMS Database
If someone called in and asked a Claims Examiner about a claim from last week, it could be found right away. But if that same customer wanted information about a claim from two weeks ago, tough beans: call back tomorrow. And if tomorrow you ask for another old claim, tough beans: call back tomorrow.

We brought in a very smart DBA, and in two hours he described what needed to be done to solve this problem. It took me a year, among other tasks, to complete what that DBA outlined. It involved making a dynamic COBOL module, about the closest you could get to OOP without leaving COBOL behind.
DB2
For a few weeks during the Christmas lull, I mapped out the entire old mainframe system.  That effort taught me about the value of mapping systems and made it possible to untangle the spaghetti, make a dynamic COBOL module, and run it in both dynamic and batch modes. It was hugely important to our company, and I didn't mess it up, as Phyllis noted with satisfaction. 


What Does Quality Mean to You?

Thursday, November 10, 2011 by Eric Tinsley

What are the characteristics of software development and integration projects that result in the highest sense of quality, success, and satisfaction? 

The traditional view is that the "deliver on-time and on-budget" mantra typically hailed as the central project metric is the only thing that matters.  However, experience doesn't bear this out.  An on-time, on-budget project that doesn't meet the business need or is unusable by the target audience clearly doesn't deliver success.  Budget and schedule remain important, but a higher value result easily justifies more money and more time.  Likewise none of us would want a project that's delivered under budget and early if it didn't address our real world business need.

The client perspective of the quality of a consulting or project engagement may be quite different than the typical consultant's perspective. The client's perception of quality in both the work product and the engagement itself combines the key elements of satisfaction – value, efficacy, and experience. 

We consistently push the team to look for ways to measure ourselves and deliver on these key elements of client satisfaction in addition to the simplistic measures of cost and schedule.   I believe it’s the ability to maintain this balance of both the client’s satisfaction values and the project timeline/budget metrics that has built our high percentage of returning clients that have come to trust our delivery services since 2001.   Technology Consultants Indianapolis, IT Consulting


Partnering with CroMagnonSoft: Where I Learned Never to Assume

Tuesday, August 23, 2011 by Tom Hunter
I was the personal architect for Max Charisma, VP of AwesomeSoft, in my previous work. He had seen my merit, plucked me out of a sea of other hungry developers and put me to work. Along with my regular projects, Max would come up to my desk and plop down a napkin with some idea he had for a software project. I loved getting Max's napkins, and I would generally have some new system, fully functional, ready to go the next day for a demo. A few times, they saved us from losing million-dollar contracts. One involved doctors.
 
Insurance companies generally cut a check to doctors one at a time, no matter how small, one claim payment to each check. That usually means a $1 wire transfer fee per claim. The project we bid on was to consolidate a collection of payments that totaled say $25,236.00, and instead of mailing that out in 120 money transfers at one buck a piece, we would consolidate them into one money transfer. Easy money right? Not so fast.

Say the original payments were each a chunk of XML. You would think you could just string them together, make a grand total and be done with it, right? Nope, these are insurance documents--you had to keep track of subgroupings of claim payments, keep internal totals and grand totals correct as well as a whole set of internal metrics.  It was challenging to say the least. We would have to process millions of these XML consolidations per hour to achieve what our customers required.

I don't know who it was, but some one high enough--maybe even my hero Max, who warned me to never come to work without shaving--had picked CroMagnonSoft as our partner. CroMagnonSoft was a company out of Texas--Austin--and they said they had a special server appliance that could handle our millions of XML transactions. So we partnered up, and I was sent to Austin to meet these guys as Max's representative. Their office was mostly desolate and had lots of broken computers filling up the halls. Little pockets of shocking filth--a far off cubicle with green fuzzy pizza, desiccated and forgotten. I sat by them while they tried to get their server running for us--and their scripts were sloppy, my pet peeve--and they didn't seem to know what to do.

"Tickle is a strange language," said Droopy, their scruffy chief developer with a John Wayne t-shirt and hush puppies. I spent two days there and brought back my concerns to Max. We--up North--and they--down South--continued through the project plan. I worked on the services and interfaces leading into CroMagPro, their server product. They were really late in their tasks.

They always proclaimed the incredible speed of their product.  "We can process millions of transactions an hour--maybe tens of millions," Droopy said in phone meetings. The doctor's group that was paying for the thing had precise requirements--it had to process X many insurance-claim payment checks. They had it in the contract that we would not get paid unless we made our numbers.

As we got closer to our deadline, we were anxious to do full system and load tests, but CroMagnonSoft always had an excuse and we put it off until two weeks before our first load-test demo in front of the customer.
The CroMagPro developer, Droopy, had his final interfaces and I coded against those. Right away there was a problem. We encoded our typical 835 document, which is the standard code format for payments to doctors, and CroMagPro consistently choked. We tried to modulate the size of the 835 Healthcare Claim Payment/Advice. We started with 100 claims inside a single 835, but CroMagPro choked again. Droopy was coding like mad, sending us new dlls and jars and gems and tars every morning. I was surprised not to receive any trofs files.

During the delay while Droopy rewrote his code, Max came to my desk with another napkin. "You know," Max said, "These docs are always whining that they want to be able to view their own 835s and even run queries against their payments." Max shook his head and rolled his eyes. "Why don't you see if you can whip something up..." 

Droopy was still not finished with his latest hack, so the next day we distracted the docs from the lateness of our primary functionality by showing them my tool. It allowed them to see everything, from their 835 traffic, their totals and any sort of reporting they might want. For the background of the application's screen, I happened to use a picture I had taken of the Superstition Mountains near Apache Junction in Arizona. [Didn't know it but their CEO was from Scottsdale and loved it.] My dog-and-pony show kept them happy for a day, but the next day they were back to their concerns about CroMagWare and its server.

Right about then we figured out what was wrong. No one had ever bothered to ask CroMagSoft the obvious question: "When you processed your millions of transactions an hour, how big was each transaction? "About 14k," Droopy said.  Each of our 835s was about a meg in size. We were in trouble. 

We had 13 days to go before our deadline. Max and I met and decided that I would expand the pre-processing and the post-processing. I wrote hard-core full-tilt-boogy Java code that ended up taking 75% of the load off of CroMagPro. Though we had greatly reduced the work to the point where CrogMagPro had very little to do, we kept CroMagnonSoft in the project so as not to look like fools. But the bottom line was this -- nobody asked "How big is your transaction?"

In this case, we delivered a working solution that met the numbers and processes transactions to this day. Max and I went on to many other projects that were highly successful, and I learned never again to assume. Java Development, Development, Technology Consultants Indianapolis, Allegient
     

Information, Noise, Symmetry and the Utility of Clean Code

Monday, August 22, 2011 by Tom Hunter

The compiler doesn't care if the code is sloppy, just as long as it's right.  That is sadly the attitude of many developers I've worked with over the years. They know the compiler removes all unnecessary spaces, ignores comments and doesn't give a hoot if their code is sloppy, if variables are badly named, or if it's all a huge pile of spaghetti.  But when it's time for modification ... I care.

Compilers don't have to enhance someone else's code, nor do they need to dig through the mess to figure out where the bug is.  Sloppy code is a bug magnet.

It's all about the signal-to-noise ratio. For example: I am a native speaker of English. If someone hands me one hundred sentences in English, it's likely that I will understand all 100 of them. All the information is signal. There is no noise among the 100 sentences. But what if 40 of the sentences were in Mandarin Chinese which I don't even read. Then 60 sentences would be information--and 40 sentences would be noise. From those 40 Chinese sentences, I get no usable signal--it's just noise.

When I see a chunk of code like this--all of the information is embedded tightly with the noise.

public class SignalIsHiddenAmongTheNoise{
   public SignalIsHiddenAmongTheNoise(){
       A a=new A();
       B b=new B();
       C c=a.getIntrusiveMethod(b.getSpecialObject().buriedObscureObjectList().getLast(  b.omnibusUtilityMethod().randomInterfaceMethod( (ArbitraryCast) X.getStaticObject())); 
      return c.getResultObject(new UnecessaryTemplate());}
}

  • The code is squished together vertically, making it all a dense chunk of type.
  • The curly bracket begins--as is Holy Writ among C++ developers and other misguided folks--right after the method name, thereby breaking the obvious symmetry in the placement of the curly brackets.
  • The developer has also chosen to use the code style called method-chaining. That style of coding is perfectly legal. It also makes the code unreadable and subject to errors during re-factoring. If the developer wants to debug that section of code, the only convenient way is by giving names to the anonymous objects.
  • The same objects need to be created using anonymous objects. There is no advantage to coding with method chaining.
  • Method chaining is popular among lazy developers.

The squished code above, SignalIsHiddenAmongTheNoise, makes it hard for me to separate the signal from the noise. I cannot glance at that class and tell what it does, because it is coded in a way that hides the signal in the noise. I can't look at it and tell: I have to pick it apart. The developer is not making it easy to read the code.

public class SignalIsSeparateFromTheNoise
{
   public SignalIsSeparateFromTheNoise()
   {
      A a = new A();
      B b = new B();
      ArbitraryCast ac                  = (ArbitraryCast) X.getStaticObject();
      OmnibusUtiilty omUtil             = b.getOmnibusUtilityMethod();
      omUtil                            = omUtil.randomInterfaceMethod( ac );
      SpecialObject so                  = b.getSpecialObject();
      List<BuriedObscureObject> listBoo = so.getBuriedObscureObjectList();
      BuriedObscureObject boo           = listBoo.getLast( omUtil );
      C c                               = a.getIntrusiveMethod( boo );
      UnnecessaryTemplate ut            = new UnnecessaryTemplate();
      ResultObject ro                   = c.getResultObject( ut );

      return ro;
   }
}


To the compiler, the two versions are identical. When the program runs, the memory footprint is no different. The difference is the second version has several problems fixed.
  • Because the curly brackets are placed symmetrically, it's easier to see where the method scope begins and ends. As we nest code this becomes significant.
  • Lots of white space appears and is used to make logical groupings
  • Lining up the curly brackets makes the code easier to read.
  • It delineates the scope of a patch of code.
  • Instead of lazily chaining together the methods, I spend a tiny fraction of memory to make the objects named. There are many benefits to this.
  • Immediately, it's much easier to see what the program is doing.
  • Instead of piling up a bunch of method calls in a confusing manner that forces me to pick it apart to understand what it does, I can see the code one statement at a time--the way it actually runs.
  • I see the types of the objects created.
  • If I want to debug what their variables contain with an IDE, it's much easier with named variables.
  • If I want to change the the type of a variable used in several places, I won't catch these anonymous uses of the class until run-time, when I get an exception.
  • When I line up my variables in a line, it shows clearly they are all in the same scope.
  • (And you only should line up variables that do share a scope)
  • I can clearly see on which objects the methods are executing because they're lined up in a row.
The first code example has hidden the signal inside the noise. The second code example clearly separates the signal from the noise. At a glance, I can isolate the signal. The second code is much easier to read and understand. That is why the second style of coding, easily mocked as being too prissy, is the better style.
   
I have taught several university-level Java classes, and students prefer to learn when the lectures are prepared using code in the latter style.  It allows them to pick out the signal more easily. For that reason, I do now and have always favored the coding style advocated in this post. In the long run, it produces code that is more easily understood.

The compiler does not know a difference, but since people and not compilers must maintain code, I stand by my style of coding. Development, Java Development, Indianapolis Technology Consultants, Allegient

.NET Developer Position (Mid to Senior) - Allegient Indianapolis

Friday, August 19, 2011 by Allegient Job Blog

Position Summary
The Mid to Senior .NET Developer to work in a team to design and implement a new system from the database to the UI.  Must have good to excellent experience with .NET 2.0+, C#, ASP.Net, SQL Server 2005/2008, and experience working at a consulting firm.
 
Responsibilities:
• Experience with developing Microsoft-based server applications, using service oriented approaches and .NET Frameworks for integration with business partners, transaction processing, web-based interactive applications, relational databases and full lifecycle development
• Implement solution architecture by building components and custom designs; prototyping; data migration; maintaining technical integrity and consistency; documenting system
• Ability to participate in a team structure, articulate solution risks and barriers; recommending project approaches; preparing time and cost estimates
• Validate system performance by developing and conducting test scripts; completing bug fixes
• Manage customer relationship by communicating architecture standards and frameworks; answering questions; resolving concerns and issues
• Conduct and participate in peer code reviews
• Conduct and participate in code build and merge processes for system build
• Validate system performance by developing and conducting unit test scripts; completing bug fixes
• Enhance overall team accomplishments and competence by planning delivery of solutions; answer technical and procedural questions for less-experienced team members; teach improved processes
• Improve information usefulness by tracking emerging technologies; evaluating their applicability to business goals and operational requirements
• Increases organization effectiveness by identifying opportunities to leverage solutions to other engagements
 
Requirements:
• 3 years of Information Technology development experience
• Demonstrable understanding of UML and business process modeling
• Familiarity with web based application development and technologies like Microsoft SharePoint, Microsoft Biztalk, J2EE, XML, etc
• Experience with software development lifecycle
• Excellent business function and process analysis and visualization skills
• Very strong written and oral communication skills
• Problem solver with strong analytical skills
• Outstanding interpersonal skills, strong work ethic, self-motivated, and excellent presentation skills
• Self initiated, enthusiastic and driven to succeed
• Ability to work independently, but also successfully work on a team
• Detail oriented and sound independent judgment
• Excellent Desktop Tools Skills, including Office, Visio, MS Project
• BS in Engineering, Computer Science or related field preferred

Please email resumes to jobs@allegient.com

Allegient is a leading provider of business and technology solutions for mid-sized and enterprise organizations, leveraging best practice methodologies and proven technologies to improve business processes, collaboration, customer relationship management, information management and business intelligence. Headquartered in Indianapolis since 2001, Allegient is known for providing consultants hailing from Big 4 and Fortune 500 companies with strong professional and technical skills along with a good project management foundation.  Allegient is ranked the 2nd largest regional web site developer by the Indianapolis Business Journal and is currently the only Microsoft Services Ready Partner for Portals and Collaboration for Indiana and among a select few Microsoft Gold Managed Partners in Indiana.

Bringing Best Practices to Hackville

Tuesday, August 16, 2011 by Tom Hunter

By the second day my jaw was on my desk. I could not believe that the developers in such a large and prosperous company had written such a hacked-up system.  We developers define "hack" as a style of software development that, while it may get the job done, is substandard.  It represents a "bug magnet" or a style of coding that invites errors.

I had been hired to work as a contractor for a big, famous New York corporation. Their existing stable of Java developers had not updated their skills in about ten years and so I was stunned at what I found.

  1. Plain old JSPs with view code and database-access code intermingled in the JSP.
  2. Java methods created on the fly in their JSPs.
  3. Hard-coded usernames and passwords inside the JSPs.
  4. No source control
  5. No upper case letters used anywhere except in captions.
  6. A JSP-Servlet environment with no servlets.
  7. JSP pages wide open to SQL Injection
Lets look at these problems in turn and see why they were bad.
  1. One of the most fundamental ideas of modern software development is the pattern called MVC for Model-View-Controller. The idea is that you don't just do anything anywhere. Instead, you confine any code that deals with the way a page looks in the JSP or the View layer. You confine anything having to do with the data and its access to back-end resources to the model. The Controller controls how requests originating in views find their right model. The benefit of this design means you can modify the view without affecting how the data is accessed. However, in Hackville any change to how the page looked inevitably affected how you accessed the data because the two were co-mingled.
  2. Normally, all Java code will be confined to the Servlets or deeper back-end layers. However, the JSP spec does allow a developer to make the damn-fool mistake of creating a new Java method in the JSP. At Hackville, Inc, they were doing that.
  3. It seems pretty obvious that hard-coding a database username and password in the JSP is a bad idea. Not that any user on the web-page could see them--they could not--but it just meant, among other design considerations, in the least you would need to change a password in multiple JSPs. Such things as database usernames and passwords should be confined to a property file that is accessed only from a DAO layer far away from the JSPs.
  4. No source control meant that the developers at Hackville had no idea what source they were using. Each developer stored the source code for the code they had written in their Unix home directory. Within the first week of my start, they had lost the source code for a departed developer. So, the only way to recover was to decompile the .class files or find any possible source, compile it and see if the resulting class file sizes were the same. In short, a nightmare.
  5. One of their major developers apparently didn't feel like using the shift key. So, all of the source code he wrote was strictly lowercase.
  6. The presence of all the Java code in the JSPs was given as the reason why no servlets were "necessary."
  7. Finally, a practice had been followed of accepting input directly from textbox fields and then using that data to directly build a SQL query that was used in a Statement to access the database. That meant that any clever user could bypass the need for pesky things like a password and inject any arbitrary SQL code directly into the database--no questions asked.
After my first week, I compiled a list of all these Worst Practices and went to see my manager.  I started into the first two items on the list and my manager stopped me. She got up and closed the door to her office. Then she said, "Go on." I described all these problems and why they represented Technical Abominations. She smiled, nodded her head and said, "That's precisely why I hired you--to fix all that."

I had just come from the environment that I described in my blog post "Betting The Company on Agile"--a supremely professional, best-practices environment. To say I was shocked at the Worst Practices in Hackville is an understatement. She explained that her long-term developers had acquired bad habits and a lazy attitude. I had been brought in to silently fix everything, rebuild it all using best practices, and then when my contract ended, the existing staff would be tasked with maintaining it. 

I was on contract for 18 months. Over that time, I rewrote all of their internal systems ... the right way.  In many cases I had to live with the screwy database practices in the new code I wrote, but in every case possible, I made sure it was done the right way. I went to the mat, insisting that we would not create any new tables without primary keys, as the legacy tables had. I remember the look of shock when I said, "We need a primary key on this new table."  The legacy developer, the one who didn't like upper-case letters, scrunched up his forehead in shock. He could not be convinced of the utility of a primary key on a database table.  Fortunately, the manager was on my side and the key got added.

I couldn't get away with putting in any Hibernate or services because the long-term staff could not maintain it, but I did get proper 3-tier applications built, including some strategic AJAX. A few applications that I built brand new, from the DB tables to the JSPs, were top notch. No Struts or Tapestry or even complicated CSS ... they wouldn't have been able to maintain that. 

Nice people there at Hackville, Inc., but it taught me that not everybody knows or appreciates the idea of Best Practices. There are many ways to get the job done, but the difference between dumb and smart is orders of magnitude. Fortunately, I left them with the latter. Java Development, Java Indianapolis Consultants, Technology Consultants Indianapolis

Build vs. Buy – Finding the right solution

Sunday, August 14, 2011 by Jerry Loza

It is fairly common for a business to determine that it needs some type of technology solution. The important question that follows, however, is whether the solution should be built from scratch, or purchased "off the shelf." Here, the right choice can save a company huge sums in both the short and long term, and help avoid an endless morass of run-away work arounds, ill-sought functionality, and critical compatibility issues. That said, some of the factors affecting the choice might even surprise you.

 

Your Business is Unique

For the most part, no two businesses are exactly the same. It only makes sense, therefore, that a unique business will need a unique solution. There is a serious advantage to having a system that matches your company's needs and processes. Some of the advantages are:

  • Less training by the staff because they are using a familiar process
  • Screens may be made to match familiar forms, further reducing training and errors
  • If the new system has processes that match those that have already passed regulatory muster, certification and approvals will be greatly simplified
  • Unique pieces of information normally tracked by the company will not get lost, or have to be managed outside of the system,  because it is not included in a commercial solution
  • You can avoid unnecessary steps and constraints that are contained in a generally marketed package

Custom fitting comes at a price

Like having a suit custom made from scratch, a custom-built technology solution is probably going to be more expensive than a solution taken straight off the rack. Unless your organization has a track record of successfully completing this type of work, you definitely want to seek the help of a qualified consultant. It has been my experience that most companies greatly underestimate the immediate cost of developing a system from scratch, and managing it to a successful conclusion. Here are some of the factors to consider when evaluating the build option, and some of the benefits you can expect from your consultant:

  • Assessment of the specific needs to be addressed by the new system is critical
  • Once scoped, a clear definition of what is to be built will be needed
  • As with any major business solutions undertaking, there will need to be a breakdown of the project into manageable tasks
  • Estimation of the materials and effort needed to build the system is essential (do not underestimate this effort as it can be a challenge for the most seasoned professional)
  • Defining of parameters that will serve to track progress and success
  • Identifying the skill sets needed throughout the lifecycle of the project
  • Expert project management
  • Testing and other quality-related activities

Whether a company goes it alone, or brings in professionals to aid in development, do not underestimate the costs. I've seen many projects halted because of budget overruns that were solely the result of poor initial estimates. This is not to say this approach is to be avoided. It is essential, however, that the return on investment be realistically evaluated.

 

A Case for COTS

A Commercial Off-The-Self (COTS) package is software and/or hardware that can be purchased and implemented without the need to create the software and build the hardware yourself. Because multiple customers are using the package (just think about how many people are using Microsoft Excel), the costs of development are spread among multiple companies, thus resulting in less expense for any given customer.

 

Consider a word processor. There is no need to reinvent the wheel, and create a word processor from scratch. The off-the-shelf word processor has all of the features you need, but with so many people using the product, the cost of it is relatively low. Even though there are some features that you may never use, they are easy to ignore, and the price is low enough that you still receive significant benefit relative to the cost.

 

Another benefit to consider is that the overall quality of the package may be better. Unless you are the first customer to purchase the system, odds are good that many of the bugs have been worked out before you ever acquire the product. Further, because the package is intended to appeal to a broader audience, it is also likely to include many more features than a custom-built system. There may well be features present that you just don't need, or want. On the other hand, do not be surprised if you find awesome features that you would never image existed.

 

One last thing to consider is that the procedures and workflow in the COTS system is different from what you currently use. While that may sound like a disadvantage at first, that would only be true of the current processes are better. This could be an opportunity to improve procedures by adopting those within the new system. It would not be the first time that I have seen a company implement much needed procedures and discipline after installing a professional COTS accounting system.

 

Middle Ground

In many cases, it may make sense to harness the best of both worlds. What that means in this case is making modifications/enhancements to a commercial package. Like the build decision, evaluation of this option should be done with a consultant very familiar with this approach. Some things to consider are:

  • Making modifications means undertaking a development project, and all of the pitfalls mentioned above, apply here
  • Not all packages can be easily modified or enhanced
  • Modifications (and likely the original package) will probably not be supported by the package manufacturer
  • When a new version of the package is available, the modifications will probably have to be recreated in the updated package software
  • Features that modifications depended upon may not be available in newer versions of the package

An expert assessment is essential before pursuing this option. I am familiar with one company that spent a small fortune on a software system designed for wineries, and proceeded to modify it for use in a life science application. Years of work were needed to adapt the application with relatively simple additional functionality. If a consultant had assessed the package prior to its acquisition, the magnitude of the package's shortcomings would have been known, and perhaps a different decision would have been made.

 

On the other hand, a package that serves more as a framework, and is designed to be customized, can serve as a cost-saving and time-saving shortcut. An application such as Microsoft SharePoint provides tremendous functionality that eliminates the need for development, yet it can be customized if necessary to better fit a company's needs.

 

Pay Now or Pay Later

Whether you choose to build, buy, or customize should be an educated choice based on a careful evaluation of your needs, the cost of the various options, and the anticipated benefits of each. I have worked with many companies who are not very good at this potentially complex endeavor. Work with an experienced consultant, and avoid the nightmarish problems that can come from one bad initial decision.


Have you ever had a COTS nightmare, or a custom-built success? Leave a comment – I would love to hear your story.