Thursday, May 8, 2008

To Every Manager, His Day

Let me tell you the story of a semi-young, very agressive man; who has worked his way up through the ranks of corporation mania. At first a trainer of the system, then for a short time a programmer (of some sort, he says JAVA), until finally a Manager of a group (of what, we don't know), and now the chance to start his own branch as any title he chooses. Now before you critic him in back of your of your and say he didn't deserve it. Imagine the amount of talking it would take, or the odds to overcome, to get a company to invest in your ideas of a new branch that you would lead to produce a new version of the company product; that is is badly needed. Certainly you would be a believer in whomever speaks the loudest for the longest is surely correct and the winner.

You are probably thinking at this point, who cares?! Met a thousand of them! They are always on walking on everyone around them to get to where they want to be. Don't care the cost of any given issue as long as it doesn't cost them... I understand all that, but the one thing that just pushes my buttons right now is someone who has become a GURU (apparently over night) on an IT area (like architecture or Frameworks or even .NET programming techniques because they have discovered Team Foundation Server and followed its instructional training) or many of them for that fact.

First he shows a brief presentation of the previous product (written in PHP and using mySQL). His presentation in short is, it is badly written, performs poorly, the customer is complaining about it; so, we (as sales persons) have promised the customer a brand new look and feel and outstanding performance and we will let them look in our progress as we produce these new products or versions. I knew right then he (and likely the VP) were trying to save a large client for the company. And this customer was apparently large enough to the company to justify this new branch of an investment. They had already tried the overseas solution because it was cheaper. But they couldn't communicate with these folks, so it seemed. So they never produced what was asked of them per the specifications. The company even sent the director of development (who originated from that country) back to India to get them straightened out. But he was there for like four days in daily meetings with us, then disappeared for a week. I think that was a prearranged vacation or something. Just always it seemed that the left hand had no idea what the right hand was doing and in the meantime, this new Branch boss (a self proclaimed know it all on every topic, just ask him) was running loose learning how to do this or that daily through experiment or calling someone for guidance. And in the end, HE HAD THE SOLUTION! HE HAD THE ARCHITECTURE of the new product, and he knew exactly what we were to do as programmers. Just follow the guidelines of TFS, it can't be so hard!

So he jumped right in the middle of the programming group, said, YES, I need some of the patterns and practices, I need Workflows, I need webparts for a web 2.0 portal, and I need widgets.... And as LEAD, I stood up and said, that is not the way to do that. What you have presented is NOT architecture for .NET coders. And what you have assembled is an alphabet soup at best of .NET frameworks that now comprise your primary product root folder. It is a mess and will be impossible to support.

I even submitted a document, requested by the Director of Development, stating the details and what the architecture should look like. Later that day, I was informed that I was released.

There were lots of other corporate agendas going on as welll within the ranks making it impossible to LEAD the group. The VP was calling one of the programmers in my group telling him to do this or that while the programmer appeared to give a daily report on the branch boss. And all the while, even though communication with the offshore group was diffifcult, they were always ready to listen to guidance and assignments. And maybe the real issue was that I did not stand up to the VP or Branch Boss and say, you hired me to LEAD this group of programmers; now back up and out, lend your suggestions and designs, but let me LEAD the programmers in a solution we can support. Pretty sure that one would have gotten me fired too. And as an old professor from UMC said in my BS days in education, not only do they not know, they don't even suspect how deep they are.

Thursday, April 17, 2008

Giving it your all, no matter...

In reviewing my own blogging, it seems that I have something always negative to say in review of most topics. Perhaps I do not feel the need to blog on the topics that are positive or that do NOT need our attention. But I do think it important to celebrate those successes in life when achieved. I do think it important to tell your coworkers GOOD JOB when it truly applies. And I think it most important to keep a smile and something humorous to create smiles each and everyday, at home and at work. And last but not least, leave home problems at home and work problems at work. If you cannot do these things, then talk to someone professional about them. A professional can always make a difference.

Windows Workflow Foundation, oh boy!

There are two references you need to read, entirely, if you are considering WWF. And if you are considering WCF, also be aware of its preferences to webservices. Here are WWF references:
http://msdn2.microsoft.com/en-us/library/bb887609.aspx#Multithreaded_topic1
Essential Windows Workflow Foundation
by Dharma Shukla; Bob Schmidt
Publisher: Addison Wesley Professional
Pub Date: October 05, 2006
Print ISBN-10: 0-321-39983-8
Print ISBN-13: 978-0-321-39983-0
Pages: 480

In review of the book, I thought it was very well written and covered the topic in great details with good exercises. I followed through the exercises to understand the value of WWF. Business processes, and especially the automation of such processes, has always been a difficult and complex coding operation. I have coded such requirements at least twice for large companies. OOAD makes it much easier. And the .NET languages are a great choice for tackling the processes of coding. But after following the book, all I can say is, GEE Microsoft, why do you wish to make it so difficult?

The article, mentioned above, is a MUST READ. In summary my impression of the article basically said that they felt WWF was an essential part of their solution while the details they after talk about how they had to recode WWF libraries to make it work as they required. And they also mention what a memory hog WWF is and how slowly it truely loads.

My crew are now in the midst of the same requirements. And my captain has stated that WWF is the key to the solution. As the chief coder, I only have questions at this point considering all that has been stated and knowing the details of what I have written in the past.

Saturday, April 12, 2008

Agile intentions, Waterfall reality

I have always been humored by the new thoughts and introductions of AGILE models, practices, methodologies, or ANYTHING for that matter. The ideas that we will produce a product (a piece of software that may become a total enterprise) and although we work only on this or that piece for the moment, keep in mind that in the end, we want the whole pie. And of course, in the meantime, we may change our minds about certain pieces. AGILE to me means we have thought about the whole pie, PERIOD. Everytime I hear a manager speak these words, the next thing I hear is, but here are the next few pieces. Then we will see that we are still on track with user requests and continue on from there. OK, AGILE approach using WATERFALL development techniques. Even if the manager passes us a total time line with milestones (deadlines) for each phase (now called INTERATIONS in Team Foundation Server), the presence of deadlines suggest waterfall production. True AGILE development is a continuation of the development of a product to enrich it with new features and functionality. But you must have the base product to start this path. And in reality, what I hear most of the time is, OK, we will write 1, 2, and 3. And then I will tell you what to do next. That is not AGILE management either. That is piece meal programming in a waterfall management style. AGILE means that you a vision of the total product. NOT a suggestion of seeking a base product and I will make decisions about future parts later when I know something. We are so desparate in this industry to seek new ways of doing the same old thing that we make up words to denote old processes. AGILE is one of them. I always loved the word EXTREME programming. I have read several books on the subject and in all cases end up asking myself, what has changed? Why is this new? A developer has a short term development cycle, high demand, and total focus of the end product; GET-R-DONE! That is EXTREME programming to me. Many times done without a production document. While AGILE management should produce a production document for each production cycle and a total map (UML diagram or workflow diagram) of the total product when completed. And I personally get tired of hearing a word thrown around in casual conversation or meeting presentations that has no bearing on anything concerning the programming tasks at hand. And it is really being used because it is the LATEST FAD of lingo to use. It has no meaning.

The Power of Microsoft

I have never met a developer of any language who does not respect nor acknowledge the contributions Microsoft has made to the computing industry and indirectly to many other industries. I have met a few that do not like Microsoft for their business practices and distributions, me included. But I wish to be clear about this perspective to my readers. Microsoft makes some of the best programming languages in the world. They sell some of the best applications in the world. Their business practices of consuming smaller software production businesses who have great products is ruthless in most cases in their tactics. But then others would call that smart business sense. I mean really! After you have gone over the top of a multi-billion dollar company, don't you have a responsibility to help the smaller guys grow up; not consume them.

But the one practice that bothers me most personally is Microsoft's continued way of shoving unfinished, unproven software models down the throats of many developers, including me. They have done this since day one. Well, you say, you do not have to use their methodologies and practices in your programming projects. In fact their own gurus encourage you, as architects and developers, to come up with your own models, practices, and solutions to suit your business requirements. And I cannot begin to tell you the number of contracts I have programmed where I have relayed this advice to one manager after another only to hear the manager respond with, we are doing that way because that is the way Microsoft does it and their consultants told me this was best. Why recreate the wheel when Microsoft gives it to you for free?

So while there is an apparent contradiction of advice between the consulting received from the gurus in the webinars and the Microsoft consultants sent to your company site (when you hire them); they need to emphasize that the models and practices offered in MSDN and from Microsoft Press publications, are merely suggestions, nothing more.

Sunday, March 9, 2008

Testing your Prospects

This will be a short one. This subject is easy. Brain Bench versus Prove It versus What? How do you test for skillset? Answer: Ask your candidates to write a project, similar to what they will be asked to do when working for you. Take note of the amount of time it took for them to return the result to you. Review their code for coding standards and poor coding techniques. Read the rest of this blogg for current techniques and coding standards required to create a current standards web site. You will not find these methods tested by Brain Bench, Prove It, or any other testing site using textbook exam methods. It is a waste your money and your candidate's time. If you are not sure how to test the skillset of your prospective staff, then I might even suggest that you are the wrong candidate to be managing them or selecting them.

Here is another viewpoint from another contractor: http://blogs.techrepublic.com.com/project-management/?p=195&tag=rbxccnbtr1, speaking about education versus experience. And once you finish reading that great article, figure out how to put real world experience testing into Brain Bench or ProveIt. It just can't be done. That is why they don't work.

Which Platform Pattern should I be using for my business?

This past week I had three interviews for new contracts. All three were with major established companies asking if I would fill the part of LEAD developer and drive the development. All suggested deadlines and goals to be obtained with a reassessment of the future thereafter. In other words, no commitment of a total product solution from an Agile development viewpoint; but rather a waterfall approach to interim expectations for customer driven requirements and an acknowledgement of the current state of the market. A recession will turn any Agile solution into a waterfall production everytime. Directors and managers simply don't have the promise of new sales to guarantee employment of anyone, including themselves. So they typically make decisions 3 months at a time with no promise of thereafter. So now the decisions you make, as a contractor, become even more important as you bet your family income on their business decisions, the company's ability to market and sell their products and services, and their apparent interest and motivation to keep you.

During these last interviews, I found it interesting that all were telling me their current dilemmas and asking my opinion about possible solutions. Now although I love these kinds of intelligent discussions to assess my knowledge and contributions for the current position; I always leave there wondering if I should have charged a consulting fee. Another point I noticed about all three was they had all bought into some flavor of Microsoft Model and Practice and were asking about security and extending the models.

Now there is little doubt in my mind that Microsoft (with the release of 3.5 Framework) has finally gotten to the point where they are writing a large percentage of the backend business logic and business entities pages. I am not sure of their marketing strategy of this other than to get developers more hooked on free Microsoft work and dependant to the point they can never let go of the Microsoft offerings. Likewise, I advised one of those interviewers (who develops and maintains banking software products) that if I were accountable for this software development and support, that last thing I would ever want to tell my boss is how the Microsoft patches now need to be applied because Microsoft missed this or that security issues. His next question to me would likely be, why did you expose us like that? Do you think Microsoft would take an interest if I called them? Here is the answer: Why customization beats source code modification.

I know one thing for sure. If I am responsible for the success of this web site as LEAD, Manager, or Director; then we will be doing the production my way. And it will be architected as a good solid foundation for classification and layering and optional client features will be extensions of current foundation layering. I talk about this with suggested examples in my book (due for release, next month). But I want to know every line of code, its purpose, and its costs.

Here is the point and purpose of this discussion. I prefer to put the root functional files in the root directory of the web application. Images go under a folder called images. Scripts go under a folder called _ScriptLibrary. Middle tier and all other classes go under the App_Code folder. And the backend libraries that offer data separation and layering, utilitarian functionality, and error and events logging are all compiled separately into their own DLLs and reside in the bin folder. If I need to add another feature to the web site (in essence, another web application), then I may put it in a subfolder if it is only applicable to that web application; or if I have several clients looking to use this new feature, then I will put it in a new web application folder. It all depends on required functionality, customized settings per clients, and how generic I can make it for everyone's purpose. But these are decisions you, as a developer or architect, need to make to mirror your business processes. You should not be listening to anyone tell you that you need to follow this pattern or that one because everyone is doing it that way. My book tells the details of this discussion and makes suggestions for design.

Friday, March 7, 2008

C# Language Features new to v3.0

I have not personally had the chance yet to use v3.0. Who knows, I may fall in love with it. I have reviewed this article from 15 seconds (http://www.15seconds.com./issue/080228.htm) talking about these 3.0 enhancements. It is a well written article. My hat is off to the author. However, I am not so impressed with the features. Seems to me we are taking another step backwards in programming technique. We seem to be in this endless loop of programming ideas and features. First we use a language, like Java or Javascript, where we don't have to do anything but describe all variables as generic variables and the compiler will figure out the rest for us (classic ASP v2.0/3.0). Then we move to the .NET languages where everything must spelled out in great detail from case (in C#) to datatype to initialized values. And now in v3.0, we are back to letting the compiler figure it out again. Perhaps someone at Microsoft is looking down the road and saying, in v4.0, we will go back to demanding GREAT detail and definition for every variable, but this time it will require an XAMELV xml file to describe all variables and controls.

OR perhaps the reorg that Microsoft practices every year to shake up the chicken coop has finally taken its toll; no only Microsoft and but all Microsoft users. I don't see Microsoft contributing to the community anymore but back to their practices of trying to change the world. And their product output is looking like that of a spoiled child. FOLKS, it may be time for a new vendor and a new language that builds in a common sense way and compiles the old stuff as well as the new stuff, when it is four versions down the road. Give it some thought. I know I will.

Tuesday, March 4, 2008

Developing a Content Manager System

Every good business web site that is the center of your business should be founded on a good content management system (CMS). I recently entered CMS into myUltraSearch site, looked through the major search engines and found something in excess of 2500 possible links promoting various kinds of content management. And then of course there is always Sharepoint portal that Microsoft gives you for free in your Windows 2003 servers. We even offer our own flavor of CMS which originated in classic ASP in 1997 and offers more features than Sharepoint or many of the others called The Frameworks.

The overall mission statement of a content management system is to provide a web based home from which the departments and personnel of your company may operate to share documents, post reports, and enter data. This system should offer security so when a user logs into the system, they only see what they are allowed to have access to; both in documents and database tables or reports. The layout of the business or private pages of the web site should intuitive so there is not much training required; especially for the average computer user. And it should offer total administration so new departments can be created, users may be enabled or disabled, and access groups may easily be created and assigned to departmental folders and subfolders. It is always nice to have a system that allows departments to manage themselves; even in menu enhancements and folder or document access rights. And certainly the system should cater to the ability to house other web based applications or links to important vendor sites offering services in use by the company or department.

In my opinion, any CMS requiring programmers so the system may operate normally for the business, is not a well designed CMS for the user or community in mind. Examples of these would be Sharepoint Portal, DotNetNuke, Joomla, among MANY others. And then there are many addon packages out there just for the developer (i.e. Iron Speed Designer) to enhance or speed up development.

A good CMS on the other hand, can be the center for speedy communications, reports, company status overviews, accounting, accountability, time tracking, project status, and global company assets management. Easy to access. Quickly get to what you need when you need it. For instance, a manager who is prone to micro-manage his staff can easily make assignments to his staff, tell them to drop their finished product in their assigned folder within the CMS, and the micro-manage the folders rather than hang around looking over the staff member's shoulder and asking if it is done yet.

Salesforce.com is not a CMS. It is a web based framework that houses thousands of other plug-in applications that you can subscribe to and try to make work for your company purposes. Let me point out to you that most business processes are composed of a database table for saving data, templates to present the data and for data entry, and backend pages that do the work. It is much the same thing, over and over again, pertaining to many different processes. As an IT group, we just need to start thinking in terms of database driven web pages, editor, and presentors, using variable templates, and reporting for every purpose required by users. We need to get past the Get-R-Done web development mentality and start designing and programming for support and growth, mirroring the company business centered around the CMS.

Sunday, March 2, 2008

Modeling vs Real World Programming

This is a topic that honestly leaves a thorn in my side. I have taken two formal post-graduate classes whose primary topic was Modeling via UML Designs. These classes included an intense discussion about actors and objects sending and receiving actions. All in all, I must tell you that in my opinion, there is no real way to represent a 3D object oriented world in a 2D space no matter what program you may use to manage it. The best you can ever do is consider single issues presented within your projects and manage them with your choice of tools (VISIO vs MS Project Manager or other of your choice) and calculate their ROI over time. There truly is a need a good 3D modeler that works hand in hand with VS2005 and later and allows Project Management reporting, Developer scheduling and tracking, and truly brings a global 3D view to the solution. Were this tool available and truly enhanced for the purpose, I believe 2D or flat modeling (as I call it) offered by the aforementioned programs or by web sites (i.e. http://www.softmetaware.com/oopsla2004/mdsd-workshop.html) would instantly become obsolete. And most of all, perhaps this would be a tool that instantly gave meaning and understanding to the relationships between objects, processes, classification, and layering. Certainly the finest tools available today for solution management for the developer and project manager alike, make solution management a full time job on top of actually doing the real work of programming a solution.

Tuesday, February 12, 2008

Building Your Solutions

I just had the most interesting conversation (on this day, Tuesday, February 12, 2008). A Microsoft HR person (I would guess a gal in her upper twenties) called me to say she had found my resume on Career Builder and would I be interested in joining the Microsoft Consultants team. If so, please submit my resume to the Microsoft page describing the job position and then we would talk. She also sent me email asking and saying the same thing.

So I submitted my resume, as requested (though if she had already seen it and decided to contact me as a result, why would I need to pass it to her again?). Then, while talking on the phone, she proceeded to ask me several questions concerning the Microsoft .NET Framework 3.0, my abilities as a developer in C#, and the implementations of 3.5. She also wanted to know when was the last time I had used a white board. Now she admitted to me in the course of this conversation that she was not a technical person nor did she understand much about the technologies. But she proceeded to tell me how I wasn't this or that and would not pass the next rounds of interviews because I had not used a white board, leading a group of developers, recently enough.

To be honest, I was speechless. She would ask the difference between 2.0 and 3.0. I would mention the Enterprise Blocks and she would say, there is more to it than that. So I ask, give me an example of what you are thinking. And she said, well, I don't know the technologies but I know there is a lot more to it than that. And then she ask about Sharepoint Portal and whether I had actually coded it or extended it in any way. Or have I used Biztalk Server. I said, NO, I was not aware that it was incomplete and needed more coding. She was not amuzed.

The point to be made here is, this is a perfect example of how Microsoft produces and operates. And unless you want to deal with this kind of cooperation everytime you have a problem, I suggest you build your own solutions. Then you know where to look and how to fix it when it needs more features or something appears to be broken. And that truly is the magic of the .NET programming languages. Their ability to give you, the developer, the power to create your own workable solution to fit your business. Don't let Microsoft (or anyone else for that matter) tell you anything about your business. They don't know your business, your customers, or your requirements.

Perhaps in other posts I offered, you read about a banking software company that hired Microsoft Consultants to write their first .NET version of their software. Two years later, they are scrapping it, at the insistance of the next group of Microsoft Consultants who reviewed the work and said, START OVER. Amazing. Are they going to refund all that money paid them originally for CRAP work, too? Or how about the architect at a government contracting agency, who invited two Microsoft Consultants to review their architecture. And then spent the next few weeks arguing with them about his configuration. They would say, that is not the Microsoft way; do it this way. And he would argue, I don't want to do it that way. I want to do it this way and this is why. And they would say, that is not a good reason. And he would say, it is my reason, and that should be good enough for you. I personally listened to that one for two weeks until the consultants threw up their hands and finally went away. No one was getting any work done with all that bickering going on constantly.

So I say it one more time. BUILD YOUR OWN SOLUTIONS. Build your own content management servers, transaction servers, and web applications. Layer and classify so it makes sense to your business and mirrors your business processes. Create a software library and build on it; extend it; nurture it. It is truly one of your greatest assets.

As far as I am concerned, personally; I build total working solutions for my clients. Solutions that fit their businesses processes per their own descriptions and requests. And she was right, I am NOT a Microsoft Consultant. I am a Solutions Provider that uses Microsoft Technologies. And there is a huge difference.

My Best Advice to you: Do not chase technologies, seek solutions that support and mirror profitable business processes. Technologies come and go. Business processes may last the lifetime of the business.

Friday, February 1, 2008

The Power of the Virtual Office - Telecommuting

figure 1.0 My Home Office today is more sleek and efficient.


figure 1.1 My Home Office I built to monitor
Sprint Network Engineering, LDD.
in 1997.




For many of us, I realize that we need a place to go everyday, called the office. We need that social interaction of our co-workers. We need to live in the small cube area whose layout and design is similar to the parking area for my car in the parking garage. And my manager has a need to be able to reach out and touch me at a moments notice because the client has called him again with more changes to the pages and database. This is the scenario for most contractors (and employees) of most of the IT shops in this city (where I have worked). I also realize that many young men and women (ages: 21 to 44), they may have children at home, lots of pets, or other things that can constantly distract a person from focusing on the current day's work tasks. So they REALLY need to get out of the house and come to work, so they can focus on their job. And they easily accept the social environment (both online and in the cube area) where user profiles dictate what the user may do on their own machine while working in these half walled closets called cubes. Let me give something else to consider.

Imagine for a moment that (as a company), we have only three rooms to our company. One is the data center where our servers live and the other is a conference room with the latest presentation devices, conference phones, webcams, aurial microphones, and whiteboard with attached PC. And this attached PC is also attached to the overhead projector and fully online with the internet. Our server room offers CITRIX or secure VPN connections for our employees. And the last room is our meet and greet room with a receptionist, a great presence of our company, and maybe even designated areas with PC and webcam so a guest can sit in conference with their sales rep and whomever else is required for the interaction (a project manager or LEAD or DBA) to discussion the details of the prospects contract and quotes.

Now for sales reps, this scenario is not uncommon since they typically are on the phone calling someone about business or traveling to meet with someone about business. They are used to working from their home, cars, and motel rooms. For the manager, the rules change a little. Certainly the manager can call a meeting that requires his group to meet in the conference room on a given day and hour if he wishes to reach out and touch his people in his group. But for the most part, he manages the group via online meetings and monitors the work area for completed project phases and monitors the CMS for task reports. In turn, he writes his report of progress as required by his director or CIO and submits it via email or back into the CMS system for his director's review. All employees of the company log into the CMS and in doing so have punched the time clock, if you will. And we know they are available and online because they are logged into the system and available for chat or webcam conference at any time of the work day. In fact, we may have employees whose are hours are best for them at odd hours of the day for us. Still this is not a problem since the CMS is available 24x7, 7 days per week. So they can really work as needed to complete their deadlines and turn their work into the CMS for review.

Now this is a great scenario for the owner of the business. The only overhead he has is the server room, the conference room with electronic devices, and the receptionist area. It never grows or is required to get bigger. As we bring on new employees (project managers, developers, DBAs), they work from their home offices. No space is required in the three room office area. Oh sure, the hardware administrator comes and goes as required, but he does most of his work from his remote office unless he needs to move wires or something that requires physical hands on. And the receptionist is the center of all that goes on. She knows the schedule of everyone as she monitors it from the CMS. For new clients who need to see a presence, the receptionist can meet and greet, put the client in a conference area, and the many faces of those required to meet with that client are instantly available for discussions. NO WHITE ELEPHANTS of specifications. No false requests (well I think he said this and was talking about that). And certainly the opportunity to record all that transpires and put it into the CMS for accountability. And if you find a data server center vendor you like and can trust, you don't even need the server room or hardware personnel. Contract it out yourself. If you need more servers, let them worry about for a service price you can deduct at the end of the year.

And owners and managers, when this idea of a company works for you with bigger profitability; put the extra money in the pockets of those who serve you so you build loyalty in your corporate family. Believe, a happy corporate family is one that grows exponentially and makes all even happier. This is also the ideal setup for the startup that is concerned about initial operational costs of doing business before they have scored any real paying clients.






Proof By Example

I worked for Sprint Network Engineering, LDD as LEAD/Manager Developer from 1997 to 2002. During that period of time I had as many as five working for me and in the final years, they cut us back to three to support 1200 concurrent users of our systems, world-wide. While the two that worked for me went to the Sprint cube city each day, I worked as a telecommuter from my home office (shown above, figure 1.1). From this studio office, I could see a better view of the network, the traffic, the transactions in real time, or monitor any single user or group activity required. I spent most of my time not just writing and enhancing user web applications that were requested, but also building software robots that would monitor servers and application for key factors and flag me if current parameters would fall outside the limits for that particular robot. SO while my staff were in the Sprint city cubes contending with the social environment and trying to keep focused on their work; I kept us out of trouble because I was totally focused on the view of everyone's work, plus my own. And the VP of Engineering realized it too. That is why he left me stay there for five years as the telecommunications managers I reported to changed each and every year.

My home office today, figure 1.0, is more sleek using the multiple screens video adapters. I actually use two computers for most of my daily operations. One dedicated to development and the other dedicated to email clients, message clients, and daily tasks operations monitors. For some reason, I just don't get this kind of office when I do those contracts in the cube. I typically get a 2 gig laptop with 1 gig of memory, 40 gig hard disk, and maybe a fraction of the software utilities to which I am accustomed; not to mention complete internet access. And I have even had several where the user profiles prevented me from administering my own machine. And that is a real problem when you do .NET development. I have never understood why someone would contract me at $55 per hour, ask me to come into the cube area as a MASTER developer, and give me a ballpene hammer to do my work. It takes me 10 times as long to do the work given their restrictions and tools and is wasteful of their money toward project profitability. But then again, it is their money and their management.

Thursday, January 31, 2008

The Future of Desktop Application Execution and Management

When Microsoft first got started in the eighties, some of us were there (that are still here) to take the ride and build our businesses around their support. As we developed relationships with Microsoft to help debug and suggest better methods, they were building their languages and software distribution networks. When those of us developed commercial products, if Microsoft had an interest and thought the product had commercial value, they would offer to partner with us. Of course, it cost us money to be their partner. If we refused and the product was a great idea (showed trends of true innovation), it was common for Microsoft to come up with their version of a similar product and give it away as a business strategy to demise the current innovator. Microsoft was so powerful in such a short time that none of us truly thought there would ever be anyone on this planet that could challenge them. Anytime anyone had a great idea that could build a great business, it seemed that Microsoft was right there to be a part of their business, buy their business, or create a like product and give it away. We used to kid that someone should come up with a similar product to WORD and just give it away; or to Windows OS and just give it away.

Then GOOGLE came along. Amazing. They used Microsoft's own business strategy against them. GOOGLE literally gave away, EVERYTHING while using the internet for their distribution and reaching the WORLD, with very little overhead. And went back to the advertising model while expanding that business model so GOOGLE was making money off of the average user and business with Adwords and Adsense. Soon after came other great ideas like GOOGLE DOCS, SPREADSHEET, and PRESENTATION. And now with GOOGLE GEARS, all those applications can run OFF LINE, and then sync when back online again.

So what does the future hold? While GOOGLE has learned to make money while helping the average user or business compete in the real world; and Microsoft continues to expand it services to portable devices and new cars; there is not really a good interface for the general home or office user of the PC running Windows XP or Windows VISTA to really pull all these offered services together in a common sense way, much less make sense of the web pages of information or aid in true multitasking. THAT IS, UNTIL NOW....

PRESENTING EBOOK BROWSER (http://www.heartheweb.com/). One single application, running on the user's desktop, truly compatible with any of your browser applications (i.e. GOOGLE PAGES), that is meant to the center of all the user's activity. The user can set it up for their specific needs to runs the programs they desire, visit the web pages they require, and even create workspaces for general purposes comprised of text files (lists of tasks), Calendars (with daynotes), have the computer read their journals and articles to them while they do other tasks on the computer (truly multi-task). Every web page speaks to you. It truly gives the internet a whole new personality. It is NOT meant to replace your default browser. It works in conjunction with your default browser. EBook Browser is meant to be the center tool for ALL that you do. It is FREE to download and use in a shareware mode. EVERY STUDENT, EVERY PROFESSIONAL who reads journals and articles to keep current, every person who uses the internet to get their favorite information; NEEDS and should be using EBook Browser. EBook Browser is the future of Desktop Application Management. And it is a total solution for the administrator of an Enterprise. A great compatible tool for those reading from online services like Safari Books online or using Salesforce.com.

Don't have good voices on your computer? JOIN THE EBOOK COMMUNITY MEMBERSHIP and use our community voices for $15 per month. With membership you may automatically download the latest pronunciations libraries and parental filters. Hear good voices, click here.
Download your copy today at the link above.

The Proper Way to Create SQL Tables and Other Tips

I am not going to debate this process with any of my DBA friends so you all can just keep your thoughts to yourself. Typically we get into these discussions about the use of NATURAL KEYS. I do use them nor do I believe in them (unless I have a client who SPECIFIES their usage in an RFS). Here is the way I see it:
  1. A database serves a purpose. Don't try to apply it to broadly (say, to a company and all processes).
  2. A table serves a purpose, similar to a database, but a sub-process of that database.
  3. A table is comprised of fields, keys, indexes, and houses data. Fields, Keys, and Indexes are functional parts of the table (like the wheels on a car, that has nothing to do with the cargo). Every table should has a row dedicated to the Indexing of the table called an ID field. This ID field is the primary key. I personally like to make its type a GUID. If you like Int or BigInt, that is fine with me. As long as you are not going to merge databases for analysis or historical purposes later. Think of the table as a container, much like a food container with separate compartments. You wash and store the container when you don't need it and when it is full of food, you want the food to stay fresh and separated from one another. And if you have lots of these containers, then they are like the rows of a table, all stacked on top of each other. Yet the only thing they have in common is that the fields (compartments) are the same size. And if I ask you to reach into the refrigerator and pull out food tray number 4 and food tray number 6, you look at the labels and pull out those marked 4 and 6; easy. The order of the food trays in the refrigerator all stacked on each other is referred to as their Index. And we want the index to be directly coupled to a functional part of the table, not data part of the table. When we start using data as keys for indexing, typically we have to have more than one key because of duplicate row data, and it gets very messy, very quickly. Unmanageable, really! Cross-reference tables are another issue, still they have an ID row.
  4. Each field in each table should have a description in the properties of the field and if it cannot be NULL, then it should also have a default value. In doing this, you protect the code from failing when NULL is not properly handled for this field and the description provides information for those developers who follow you in production or must must make fixes or enhancements.
  5. Database, table, and field names should be functionally descriptive for the purpose they serve so their meaning and purpose is intuitive.

Those are the rules of thumb for creating SQL Databases, Tables, and Fields.

Not All Working Solutions ARE Good Solutions

If you have had any time in this industry at all, I would be surprised if you didn't also have your own stories about projects passed to you that worked, but left much to be desired in terms of an easy to maintain solution. Although I too have those, this one I am about to tell you is a little different and may leave you thinking about the solutions you approve or write.

I was contracted to a transportation company. They had an application that had many business processes conducting the business of scheduling to routing to collections; and even lag time of the drivers to create efficent routes and efficient employees. Unfortunately, it was written in VB6, originally by a programmer who was just learning to program and had a background in programming interfaces on top of Access. So, if you can imagine, there were memory resident objects for navigational purposes that hooked the database tables in persistence for large quantities of data. And there were numerous examples of textbook coding 101 that were just simply bad choices for the functions they attempted to serve; but they worked. Unfortunately too, this application was to the point that you could not add another feature or sometimes fix a current problem without causing a host of other problems. The company knew they needed to migrate the functionality of the application to .NET while rewriting the code for greater stability and supportability. It is always a sign of a poorly written application for the purpose when the largest group growing is the help desk staff. And in this case, this group was growing about two to one over the development staff, even though new features were being requested every quarter.

Likewise, as developers we would have code review sessions. I really liked the people and the environment at this place. Some of the developers were somewhat new to the .NET languages, but very good students and came up with ideas and coding examples that would never have occured to me as important. But they would later serve some other function in the new applications that gave great new appearance and feel to the applications. Well, one day, the manager of our group handed me an assignment. He said the VB6 application, in this particular area, is consuming tons of memory and never returning it back to the system. Sooner or later, the application overtakes the stack and the application crashes. It would force them to literally reboot the machines running the applications from time to time. So he asked me to look into it and see if I could come up with a solution. I worked on it for two weeks, diagnosing the details of the situation; who was running in memory and why. How long were they running and why. And finally I realized the real problem was the set of controls being used in the winform just simply never refreshed or released memory when the application was done using them. Kind of like a timer control that is only needed for a few minutes in a given cycle, yet runs all the time while the application is loaded. It just wears the machine out, so to speak. So I created a new class, implemented a few new methods. I created a memory resident database that would load and unload, retaining its values from each processing action and using some hard coded business rules to make it behave as I wished. And finally, after two weeks, I had a solution that worked well under all tested conditions and I turned it into my LEAD and Manager. Iwas so proud.

A few weeks later, we had another code review. The LEAD was a wonderful guy and great programming talent. He was stern on the new programmers (sometimes too much I thought), and he was gracious to me when he spoke. On this particular day, he went around the room and reviewed the code (his comments) of each of the developers. When it came my turn, he turned to me and said the following. I reviewed your class and methods for solving the memory problem in the (such and such) module. I personally worked on that problem last year for six months and could not resolve it. Dick, you came up with a solution in two weeks and works great. But I am not going to release that code into production because if any of these other guys had to debug in the future for some reason; I don't believe they could do it. Understand that I cannot put GURU coding into a standard product. The product has to be supported by our staff of the programming levels we ask of them. But other than that, a great solution. Now I cannot think of a better way to get kissed and slapped at the same time and feel good about it. But that day I did. And even though it was a working solution, he deemed it as not a good solution for that company.

Saving the LOCAL World

For the past four years, I have watched the .NET developer's market revive in an up and down pattern, much like the waves of the ocean coming upon the beach. It is March and high tide is upon us. There are new budgets established and Managers are looking for the best talent to form new teams. It is a great time to be in the market for a new position and looking for a new career home.

The new projects begin, their development phases established (in the best organized groups with great vision of their mission statement for the coming year), all are assigned to their groups and tasks, and off we go programming to meet the production schedules. Some industries like advertising and marketing are aggressive and client driven. Clients are allowed to take their time in making decisions of what it is they want next in production, then want it NOW, when they make that decision. Developers start showing up with cotts and futons in their cubes to survive the production push. While others in the government and insurance industries seem to just float along, got their routines and patterns and new expectations; but these are new features or fixes to a currently working product. There is no rush to break the product. And as the year progresses, the developer positions come and go as some decide they do not like their current position and move on; while new requests sometimes requires more talent and expansion of the current group. Typically by November, all has gone its cycle for the year and is winding down to cruise through the holidays. Anyone seeking talent at this point on a project is typically in a panic state as they likely missed their production schedules altogether. To take on one of these projects is usually high stress and little reward. Nor are you typically retained after you complete the current exercise. It is year end and the budget was gone months ago. Your paycheck is a liability; that is why you are not appreciated. This is not all companies. But it has certainly been my experience over the last few years.

In fact in the last two years, I seem to have run into a number of companies, one after the other who all had serious programming deliquencies in their schedules and needed MASTER programmers who could kick projects quickly to help them catch up. Of course they don't advertise the job opening as a project or COME HELP US; they advertise it as 3 months to hire. And I usually find out inside the first two weeks, they have no intention of taking another staff member; they have a crisis and you are there to fix it. An unfortunate fact in most of these cases is the client does not have clue what they want or desire to complete the request nor do they have a good specification; which would make the production so much easier. Most just have an idea, well, it should go like this or that; do these things for those people; and other than that, you figure it out! Can't tell you how many times I have heard that; as if it was a software specification. Don't be surprised when you don't come close to what they were thinking. Imagine building a house for someone. Their explanation of what they want is: well, my daugther should probably have her own bedroom, I need a bedroom and a bath, there should be a central bathroom and kitchen area, and probably need a livingroom for the big screen television. You figure it. I'll let you know when you show me what you've got. Tell me what you would do. Would you just walk, saying, Thank you, but no thank you. And find the next position (takes 30 to 60 days for a qualified developer to get the next contract, typically). Or would you nuture this undecided manager into a solution and save your income schedule from disaster? Most developers I know (whom I have discussed this question), work the project for the next few weeks doing their best and putting up with the manager, while seeking the next gig as quickly as possible. Of course when the manager senses this is the case, they usually cut the cord to the contract leaving you feeling like toilet paper. And sometimes, what seems to be complete mess, turns out later to be something really good; like the following.

I was contracted by an agency to come program a project for which they had a specification that read:
  • A windows based application that manages the business rules of a AS400 database.
  • Should be easy to use and intuitive.
  • Should be have a visual interface so business rules can be dragged and dropped under other rules to create a heirarchy of business rule succession.
  • Will use the previously purchased 3rd party vendor control for visual reprentation.
  • Should save all business rules to a db2 database of specified table name.
  • Should be written using VB.NET and ODBC database connections.

Now this whole project may sound pretty easy if you just read the specification and get the sales pitch from the agency on why you might consider doing this project. But here were the circumstances they forgot to mention (that I discovered after taking the project).

  1. Two previous programmers had already coded a solution to this project, got to the part of using the 3rd party control and couldn't figure out how to make it work per the spec.
  2. The 3rd party control was purchased by the agency because they thought it a solution to the problem and got sold on the control by the vendor who offered little or no assistance in really using the control. (it was expensive).
  3. Since two programmers had already burned hours on this project, the budget was close to depletion and could I do the remainder of this project for 40 hours since the other programmers had already burned 120 hours of the budget.

My response was: yes, I am happy to take on the project. There is a part to the solution that is missing that makes the control work for the application process and that is a schema the couples the visual components of the control to represent business rules and memory resident relationship so when visual components change relationships, business rules follow. I cannot promise that it can be done in 40 hours. I can promise that I will give it my devoted attention until completed. I had two meetings with them over the current status and work flow reconsiderations during the course of the production. It took 80 hours in the end when I turned it in. And because I went over the 40, they fought me on paying me the total for 90 days after delivery and were not kind about it. I am not sure really why they did finally pay the final invoice. But here are the comments I received a year later from the project manager in charge (I have blanked out the company names since they are not important to the topic):

The Email Reads:
...The deliverables to the company were met with good reviews. I was able to apply a quick finish to your foundation. The company compared what we built to what the original vendors created and we won in every category. Especially the visual interaction.

While we won the battle, we lost the war to India outsourcing. A manager at the company lost his job because he opposed the 1st choice of India and supported the 2nd choice - of the agency. I left the agency before this battle occurred, but still assisted with the proposals and was on deck to come back to the agency if the company contract materialized.

- Rick

In Summary:

In summary, always rememer this: Do the best job you can as a developer, regardless programming situations or obsticles if you accept the project. It is a very small world out there and I am always surprised at the faces that keep coming around again and again in the course of these projects. Network and make friends with those doing the business like you; you need them and they need you. What goes around, comes around (an oldie, but true). Treat others in every situation as you wish to be treated. There is no problem so great that two people cannot sit down and discuss it like adults in a civil way with respect for each other's opinions and decisions. And when the WOLF comes knockin' on your door, know that you can stand firmly on the solutions you have created. I once had a manager who did not know the difference between SQL Server licensing and the use of SQL Express (that requires no license). Someone pointed out SQL Licensing costs to him, he thought of the number users he had, and he would go balistic everytime with dollar signs in his eyes. I tried to point out to him that SQL Express was a great solution for this application and didn't have those requirements. As soon as he heard me say the word, SQL, his next words simply dismissed me from the project. I was trying to Save the LOCAL World since that IT staff didn't seem to get through to their manager. And it cost me my position and contract. Not my fault the manager is not educated on the topic; not my surprise the staff doesn't stand up to him; and not my place to Save the world. It was the right thing to do and the professional thing to do. I left him with a finished configurable product; so he could use whatever he wished (even Access, as he said many times). I do good work. I think I need to work on my communication skills and bone up on my human behavior management classes.

Tuesday, January 29, 2008

The TRUE COST of That Code

I recently had an interview with a prospective client. I always do that to see if the client and I are compatible in our business foundations and business arrangements. Makes it so much easier when it comes time to make decisions about the finer points of the web pages or application; that actually do the work or make the presentation. If I am on the same page as the client, then the probability is high that I will make the right decisions about the page direction of growth or preferred presentation on points that were often, not discussed in our interview. And I call this, the cost of the code. Let me explain.

The True Cost of the Code
It really has a lot to do with the experience of the coder. Here is what I mean. The coder is five years out of school or less is likely to look at the client requests, get out the IDE, and Get-R-DONE. His coding will look good, be efficient, and get the job done quickly per page posting or transaction. When it comes time for modifications, he is back into the IDE and making his changes as requested and repeats the process. This, by the way, is the Microsoft textbook formula for web design and production described in their five step SDLC (software development life cycle).

The coder who is 10 to 15 years or less in the business professionally has had more time, more problems over the years, and knows that the developer that doesn't think about 1000 concurrent users hitting his web pages, will likely have a very bad day unless he codes for it in the beginning; thinking about slim, trim, tight code that uses the best of the resources.

And the coder who is 15 years and more, not only knows the paragraph above, but he also knows that life changes. People change their minds, even in the best contracts, best RFS, and most stable companies. And since the client is writing the check, we do it the client way. But the master builder doesn't want to code anymore if he can help it. Let's see if we can just make a few configuration changes and meet those needs. So the master builder codes it completely different than the others; he uses CONFIGURATION LAYOUT and DESIGN architecture. And in this way, as the business grows, the web site follows.

So, What is the true COST of Code?
Well, when the first coder was reviewed and asked to make changes, he took the next 30 days and totally rebuilt those pages. The client paid for that effort.

When the second coder was reviewed and asked to make changes, his code was tighter and faster than the first coder; but back into the IDE and coding he went for the next 30 days. And the client paid for that effort.

The MASTER BUILDER said OK, change some configuration settings, perhaps made a page or two adjustment (took two days); and the client paid for that effort.

WHOM do you think kept the account and received more from referrals?

Mentioned also elsewhere, this is a great supporting article for these comments from TCS, one of the number consultant agencies in the world.

And here is a prime example of what happens when your HOT Get-R-Done programmers take over the architecture (Security Hole Found in ActiveX development). Facebook and mySpace have both been great ROI offering their version social networking. While this web site offering make your own social network is headed right down the same path. I wonder how long before they have 2 million users and find a security hole in their web site that leaks all the user names and profiles information.

Gosh, I received a letter recently from T. Rowe Price telling me that my account information was housed on a computer that had been stolen from their facility. And they were doing everything within their power to recover the stolen property but I should be aware of it. Now let me tell you why that excuse does not make sense. I am sure my information is stored on a SERVER, not a laptop; SO, did they steal the SERVER? If so, how did they get out of the building with it? T.Rowe Price, billions of dollars in account information, not under data center security like Fort Knox? Doesn't make sense. OR did an employee download all the customer account information to his laptop and walk out the door with it. And they discovered it days later, after the employee was long gone and had sold the information to whomever. I think that probably more likely.... And, got to tell you... their apology letter does not replace their liability they accepted when I signed up with them and saw their details on how they would protect my privacy. I think there may be a law suit in the making here. I protected that information for over 50 years; yet they could not protect for three years. WHY should I pay for their Get-R-Done decisions in security and hiring of personnel?

Is Your Web Site SEO Ready?

Many people ask me what it takes to make their web site and pages SEO Ready?

What Does It Take To Make My Site SEO Ready?
1. Get your MetaTags in shape per the SEO guidelines. You should at least have the primary MetaTags in every web page pertainent to that page content.
2. Refine your content so it has meaning to the reader, like a good story. It should have good format, like a story. And the keywords in the MetaTag should be found in the content.
3. Do not create unnecessary or unrelated links to other sites; unrelated that is to the content of that page.
4. QUIT listening to the speculations of Marketing Groups and make believe WEB or MARKETING GURUS. Believe me when I tell you, they are marketing to you, MOST! Go to the sources, like the example below.

And finally, listen to this conversation (interview) with the Product Manager of Live Search Webmaster Tools, Jeremiah Andrick. This interview is extremely informative of how MSN views the world.

Looking for Web Developers?

At Dick Wilson Productions, we are happy to receive your web application specifications and build your pages to that specification. The world is literally at your fingertips. We can produce anything from a basic framework, to a site that includes movies, to a customized web application offering database transactions and web analysis stats. NEED A GOOGLE READY, SEO ready web site? We have the framework and code already built. We can even host it for you.

Let me remind you, You Get What You Pay For, in this world. If you need an attorney to represent you and you know he charges $150 per hour plus a consulting fee, I doubt that his cousin (the paralegal) could do the same job that would make you proud or successful, even though he only charges $10 or $20 per hour. I am not sure that I would trust it.

Email us. Take a look at our work. http://dickwilsonproductions.com
Ask questions. We are happy to share the resume.

They Are Selling WARM Water...

But then, maybe you are in the market for a warm water product. Let me explain.

What Are Warm Water Products
When a software development company, uses the .NET languages to create a product that could easily be written by your in-house developers within a reasonably budgeted time, then they are selling you, what I call, warm water production. I do not care to name these products or vendors but if you apply the rule I have just stated to your company situation, then you will quickly know who is producing water, water targeted at you. Many of these products are well thoughtout, offer great demonstrations, and all are WAY over-priced for what you get.

Sometimes, that is just what the doctor ordered. Your development staff are already knee deep in products and assignments that make your company income, so adding one more thing to your plate is one too many. So purchasing the a-for-mentioned products looks inviting and may even offer a solution to give your staff a head start on the next project.

Then it happens! .NET Framework v2.0 turns into .NET Framework 3.0 and 3.5. And you are stuck, waiting for the (Warm Water Product Company) WWPC to release their new version for the new Framework before you can upgrade your company's products. Your Director is calling you daily asking, is it done yet. Marketing says they cannot compete with our competition if we don't have the latest, greatest technologies.... WHERE IS IT? It is costing us money, daily.

And if your WWPC company runs into a bug of some sort that cannot be fixed or is not compatible with the new Framework, NOW WHAT DO YOU DO? WELL, you bone it up. You get your best developers together. And you start writing your own solutions, TOTALLY in-house; so you have the code according to your coding standards.

I don't know about you, but if I am going to answer to my director for the output of our product that we resell for company profit, I WANT TOTAL CONTROL OVER THE CODE; ALL OF IT!

Now there are always exceptions. It is not likely that I will ever have access to the code to many of the applications my office staff use daily (i.e. Microsoft Office Suite, Corel Suite). But there are good solutions around that now too, thanks to Google and others like them.

Monday, January 28, 2008

In-LINE SQL Statements vs Stored Procedures

The Processes of SQL Server
Since SQL Server v6.0/6.5, the primary function of SQL Server was to house data in databases and tables with user generated fields of enumerable types. The user could submit a query to SQL Server of a SELECT, UPDATE, DELETE, INSERT type to manage records as well as a variety of other commands to manage users, tables, and databases. SQL Server has always managed its own security on a table basis. So even though a user may log into their Active Directory account for a given domain, that user may also have to log into SQL Server with a different creditials for various accesses to required data.

When a query is submitted to SQL Server, SQL Server receives the query, reviews it to see if it is an inline request or the name of a stored procedure. If it is inline, the server compiles the statement and executes the query, returning the data requested. This request then remains in the SQL Server command cache for a short time in case it is requested again before the timeout period. Likewise while the query is being executed and data retrieved, the table housing the data is locked for the duration of the query, so other users cannot change the data while it is being retrieved. The same is true if the data is being changed, the table will not be available for data requests. And hopefully all this will take place so quickly that multiple requests on a table will only result in millisecond pauses before data is changed or returned. Of course zero pauses is the ideal result.

Stored Procedures are basically inline queries that are pre-compiled on SQL Server. In theory, this should result in a faster executed query since the first step of SQL processing is already done. However, if a stored procedure is written to have multiple parameters or worse yet, use dynamic XML tables for parameters, then the stored procedure is really nothing more than another method residing on SQL Server for execution and re-compiling when executed. There is great benefit in using stored procedures that house methods that are called often, since all the coding required to gather the correct data does not have to make the trip from the calling client making the query via the network to SQL Server. The network will always be the weakest link in the chain of returning data.

But there are times and designs when dynamic SQL is required. And to start writing stored procedures that address every possible query, results in hundreds of SQL Stored Procedures that quickly become impossible to manage and maintain. In a previous contract I served, the DBA had something like 250 tables of primary data to manage and maintain. Then he added a plug-in module to SQL Server that generated all possible queries (SELECT, INSERT, UPDATE, DELETE) based on the primary key of each table. So now he had 1000 stored procedures to maintain. And because some of the tables using natural primary keys, and some, even multiples of natural primary keys, the generated stored procedures were useless. Natural Primary Keys are where actual data are used as the primary key column for a table.

My Suggestions:
Stored Procedures, Triggers, DTS, and user based security can all become a nightmare instantly if any one of these starts to grow tremendously. Developing a schema that works for security and generates the least amount of any of these is always best. As well, if you have pages requesting dynamic SQL that would otherwise require passing of XML to SQL Server, then I have no problems with INLINE SQL. The amount of data passing through the network in comparison during the query is typically unconsequential. Many times it is easier to write the code creating the INLINE SQL query than it is to write the code that generates the XML in a prearranged format. Transact-SQL language is a little too immature for my coding standards. And I have yet to meet a DBA who will accept, much less encourages, extended SQL procedures (C# compiled DLLs). I can understand where these too might become difficult to manage if they too grew tremendously. But I do like the C# language, especially compared to Transact-SQL. The difference between the two to me is like the difference between classic ASP v3.0 and ASP.NET. I prefer ASP.NET anyday and I have written extensively in both languages.

Friday, January 25, 2008

New Specification Documentation

In some development houses, this document is known as an RFS (request for specification). It is typical for the LEAD Developer of the group or Project Manager or Development Manager to create this document after an interview with a client making the development request. It records the actual request for production made by the client and should describe a beginning and an end to the production phase. There may even be a deadline date associated with the end or testing phase of the production. And ALL should physically sign the document, stating they understand the request and are assuming liability for the request in resources. In other words, the client agrees to pay for it while the developer agrees to build it within the given timeline and to requested specifcation. If your company does not have a general form for this purpose, then develop one for them; they need it.

If you are asking WHY do I need an RFS, here is the answer. The RFS is a map to new production giving us the details of what is to be produced and by when. The signature of the client can be considered a legal document protecting your production company. If the client starts making demands or requests at review sessions that are outside the scope of the current RFS, you can simply state, let's document those new ideas for a future RFS, but let's finish this current RFS to your satisfaction and per the specification; then we can start another RFS to further enhance or buildout the current with the new suggested features or functionality. And if the client goes to court saying they refuse to pay for the work, your legal defense councel have the RFS to state the work was done according to specification, on time, therefore meeting your obligations of production. The client is obligated to the RFS, a contract for production. Hopefully, you have a good working relationship with your client; he loves your work; so payment is never an issue and the continued RFS documents just keep coming, one after another.

Compensation versus Experience

For talent on this topic, there is not much you can do except keep reading, keep up on the latest going on in the industry, and keep practicing your skills, everyday. A great guitar player gets great by practicing, everyday. You can be assertive about your career. If you have a desire to be a great gamer, find out where the great gamers companies are and go apply to work in those shops. Go after what you seek and what you enjoy. Don't wait for a career to happen to you or come your way, by chance.

For managers, you get what you pay for. Here is a story to prove my point. In a previous contract, I was hired along with three others of various programming levels to complete an already late project for the government. Two of us were senior level programmers (15 years or more in the business doing it), one was mid-level (10 years or less out of school), and the other a junior (5 years or less out of school). Each of us were given our piece of the total solution to be finished in the next four months. Each of us finished our pieces of puzzle within the first 30 days and made sure they fit together and communicated well with a good overall theme of appearance. And then on one day in the second 30 day cycle of changes, the junior programmer decided the database tables were not right or to his liking. So he called up the DBA/Architect of SQL database, requested major tables be recreated per his personal specifications, and the DBA (thinking all was right with the world and this guy wouldn't request something without knowledge and approval of his manager), made all the changes; no questions asked. It literally broke ALL the work the other three programmers had done to date, sending us back into coding phases (on what we thought were completed projects) for another 60 days. Think about it this way. Each programmer (Lets say, on the average) receives $5k per month for 160 hours work. This one decision sent all four of us into coding for 60 days at the cost of $20k per month or a total of $40k programming costs for a project that was already declared completed. What was the actual cost of hiring that junior programmer? He was too inexperienced to know that he shouldn't have done what he did. Of course he found out very quickly when the other programmers discovered the decision. And the manager, who once encouraged this junior to go-go-go, get-r-done; now was saying, NO, STOP. You can't do that without my permission! He didn't know. And what was the cost of the Manager, his first management role, who hired the junior programmer and then didn't manage him?

I am told of late by a friend that this same group, managed to loose the million dollar contract because of bad management decisions and poor designs to meet the RFS. Now what did that inexperience cost that company?

Here is a great article you should review which speaks to the State of the Industry by one of the top Consultant Agencies, world-wide. It is worth the read: TCS/Gardner Report.

Contracting Agencies and Contracting vs Employment

When I started my own company in 1984, being the owner meant I wore ALL the hats in this company. I would go out each day, follow up on leads given to me by the guys at the coffee club (a bunch of business owners who got together for coffee at the local restaurant several times a week), or just get the telephone book out and start visiting folks and businesses making cold calls. And when I closed a sale, I would sign a contract for hardware purpose, software sales, and maintenance or support. I considered that contracting. I was determining my own profit margin based on what the market would bare and what I deemed profitable by what it cost me to do business with that particular client or selling that particular hardware or software. My handshake was my word and my reputation. And I always used to say, only takes one bad weed to destroy a field full of profitable flowers. The business I did with others, the way I served them, especially in times of critical mass for them, and the numbers I charged all made up the network of referrals that lead to more good business. And if even one of them was upset with my services, it cost me dearly in that community I served. Having my own business meant the world was my boss because I was always seeking that next account.

Contracting today is not anything like that. Here is how the business works today. A company has a need for another developer (and this may apply across many industries who use contracting agencies to find talent but for the purposes of this discussion, I will focus on programmers). Kansas City, for instance, has hundreds of contracting agencies, all sending out their sales staff who seek the company in need of talent. A company on the other hand may choose to do business with selected contracting agencies for various reasons. And in this way restrict the number of contracting agencies that can approach them about new talent. But once a contracting agency has scored a new company (their new client), they do everything within their resources to try and find the talent requested. A typical contract offered to talent (the programmer) is a 3 or 6 month contract to hire. What this really means is the company will employ the talent for that 3 or 6 month period and if the talent does good work, fits the culture or community of the company, and generally gets good reviews for behavior and performance, then the company may offer a full time position to the talent. During the contractual period, the contracting agency pays the talent, may provide benefits, and generates a W2 for the talent. If the talent does not work out for any reason (and I MEAN any reason), the company is not liable for the dismissal or firing of the talent and typically the talent has signed an agreement with the contracting agency for employment saying the talent accepts anything that comes without regrets.

Understand that the nature of this business arrangement is the contracting agency is providing the talent (of their choice, first) to the company and generating a W2 for the talent when the company accepts the talent. The agency pays the talent one rate, as agreed (and everyone cuts their own deal), then charges the company typically 30% to 50% above that set hourly rate for the use of the talent. If the company decides to hire (or make an offer to) the talent and the talent accepts, then the w2 and benefits for that talent are then the liability of the company and the agency is out of the picture.

Let me also make the point that the agency typically can only present so many talent to the company so they must choose what talent to submit. And if more than one agency submits the same talent, typically the talent is thrown out as a candidate. The company just simply does not take the time to ask the talent what agency they would like representing them. So it can be a real problem is agencies submit your name (as talent) without your knowledge or permission.
And finally, as talent, you should realize that the company is the client of the agency first, you are the contracted worker bee. If there is a disagreement between client and agency or between you and the client (company); you loose; end of story.

Language Choices

Language Choices
Microsoft did an outstanding job on this issue of mixed languages in a single environment or project. Or the mixing of projects for a solution of mixed languages. The 2005 IDE knows when I load a C# file that I will be using the C# coding conventions; or when I load a VB.NET file that I will be using the VB.NET coding conventions. And the compiler has no problems with putting it all together to form one assembly and solution. That is awesome. No longer do I need to worry about going to the DOS command mode and writing LINKER assembly lines for the compiler. And if I am doing that, there is something probably questionable in my architecture or project layout. So choice of language is really more of management issue than anything else. In other words, how much are you paying for C# coders versus VB.NET coders? How available are C# or VB.NET coders? And are you finding coders with the experience to get the job done quickly and done right at the same time.

Coding Standards

by Dick Wilson, Friday, January 25, 2008

Coding Standards
I have had several contracts where the first days of employment are spent setting up a computer, getting the languages, libraries, and all latest, greatest patches installed; and taking time to read their set of coding standards. Typically these coding standards talk about the correct way to name variables per their expectations and what not to do. For instance, the last coding standards book (approximately 250 pages) passed to me in a government contract development position stated to never use underscore in variable names. And variable names should always be first letter uppercase or each major word first letter uppercase (i.e. MyVariableName). This same document also stated that control names should be as variable names with the control type (i.e. MyVariableNameListBox). And finally it stated that all private class properties should be of the format (i.e. x_MyPropertyName) while the public class property name associated with this private property would be (i.e. MyPropertyName).

Here Is What I Know To Be True
If you choose a variable name the compiler does not like for some reason, the compiler will bark at you about it. Until then, I couldn't care less what variable names you choose. I can read the code because I program in it daily. I try to use variable names that make sense in terms of the functionality or values they house or the purpose they serve. So my code reads much like a book. If I do a good job of this, then it minimizes documentation needed to describe the whys and wherefores of the current coding block. I will give you one tip that makes life easier for a coder. Intellisense lists the possible methods in alphabetical order. So if you name your own private properties starting with an underscore (i.e. _myPrivatePropertyName) and give your public property name like (i.e. myPublicPropertyName), when you coding and intellisense is trying to help you save keystrokes by suggesting what methods you might wish to use next, your private properties will be at the top of the list everytime. While if you use the naming conventions previously described (i.e. x_MyPropertyName), you will hit the page down key a few times, every time, in the intellisense box to get to your properties; and I don't need to wear out my keyboard because of bad choices and added key strokes.

So if you are the person assigned to write the new code standards guide for your development group, think about these small delicate issues as you compose. You can be sure the guys who fix keyboards in your company can probably tell you all about the software programming guide and what keys they are fixing all the time. Every keystroke and every key that has to be fixed as keyboards wear out, is overhead and cost to the company based on your designs starting with this guide.

The Documentation of Development

by Dick Wilson, Friday, January 25, 2008

The Documentation, for User, for Developer
In a short checklist, here are documentation tasks for any developer:
  1. ALWAYS use the XML summary tags for every method in your classes. This lends instructions to other developers who follow you in production. Look at other examples from the Microsoft Namespaces methods for good words, descriptions, or formats.
  2. I like to take the first 25 lines (or so, as required) as a comment area, describing the need for this class and how to use it or any business logic leading to the need for this class. Again, this can be the XML Summary tag of the Class. You are not restricted to the number of lines you may use for any single summary tag; although intellisense can only display so much text. But it can be read in the object browser of the IDE regardless its length.
  3. When you have completed your web application pages or winforms application, create a user's guide on how to use your pages; even if you think your design so intuitive that a monkey could operate it.

The Physical vs The Logical

by Dick Wilson, Thursday, January 24, 2008

The Physical vs The Logical
In a recent IT meeting, I had a development manager pose the question to me: what is the difference between the physical aspects and the logical aspects of a web site? I answered him in that meeting in the most simplest of terms I could find at the time so the meeting could move on; since in that meeting it had little bearing on the current topics. But I wish to address it here and talk a little in detail about its importance to the web site. Note that while I mention the term, web site, over and over again; I also include web services and most winforms projects in my meanings for this conversation (or writing).

Basic Definitions and Usage
The purposes of this discussion, the physical the actual layout or locations of the root web folder and all its subfolders and all their subfolders and files. The logical is the flow of business processes that sequentially trigger or execute to complete a business task. In my preferred web site layout, I like the physical layout to endorse the logical flow. For instance, if I have a business process called Time Reporting, then I have a folder called TimeReporting. If TimeReporting requires support configuration or data files that are not already available to the root level or found elsewhere; then there are subfolders to TimeReporting called configuration and data_files. And the design practice and pattern goes on and on, mirroring all business functionality of the web site. If we have to give this design pattern and practice a name, then let's call it Business Mirroring Practices (just what we need, another acronym from someone's dilusional thought processes). The reality of the situation is that the physical follows the flow of the logical. So to learn the business, its processes and logical flow, makes sense when the physical layout is reviewed in the Expolorer window on the IIS server. Likewise, if you, as an administrator, insist that your IIS server and folders are first secured by Active Directory access rights, this pattern makes it easier to secure a group of related folders under the security of the parent (or primary folder of the process under the root of your web site).

I concur that there likely examples where this pattern would not fit nor make good sense. In the same meeting it was announced that this business was taking on 100,000 new accounts per month. Now this would be a perfect example of total trauma. Forget adding these accounts to Active Directory or creating individual groups for each set based on origination. These accounts will be a nightmare to manage on SQL Server inside of the first year. And depending on the concurrency user usage of the application pages, may create a server farm for both IIS and SQL servers almost overnight. YES, an exception to all rules or design patterns. We will just give that a name to remind us and call it TRAUMA Design Patterns.

Wednesday, January 23, 2008

Best Practices, Part II, My Way

by Dick Wilson, Wednesday, January 23, 2008

Best Practices in Software Design

Doing It My Way
I have always been an engineer, developer, builder that appreciates the simpler things in life. Although I pay great attention to details, it has always been my experience that the simpler, the better, the easier to maintain. While it is true that a architectural foundation of your business web site should mirror the business model (or layout of departments), in my opinion. The layering and classifications are another aspect of the model that should apply the general layout of the web site.

The Basics
The root folder of your web site should contain those basic HTML or ASPX files. Typically these are the navigational pages. Most web sites, in this configuration, only have one default.aspx file that may redirect the user to any number of other folders or base files based on the user request or user security. In otherwords, if a user is joe public coming from the internet with guest clearance, default.aspx may redirect joe to the public folder which houses a default.aspx web application or bunch of generic HTML pages promoting the business, business services, or products. If the user logs into the system and is found in the users database to be a subscriber with membership status, then they are redirected to user accounts pages. And if the logged in user is found to be a staff member of our company, then they are taken to the content manager system pages so they may conduct business related functions per access group and department. This description, in a nutshell, is how our FRAMEWORKS product is laid out.

Lets assume the guest user selects a link that goes to the products catalog pages; another folder with a separate web application for catalog pages. And the user elects to create an eCommerce shopping cart, add products to it, and will eventually checkout, purchasing the products (we hope). The shopping cart is another folder, another web application project, and the cart pages are included with products pages. This can be of your design in the product pages to include cart pages when the cart has been selected by the user; or it could also be part of the master pages used by product pages and available only when the user creates the cart. Again, design choices to suit your needs and business model practices.

The overall layout is to break down each piece or part of the processes into their own folders with their own project. It makes it much easier to design them, build them, and debug them. Once you know each project (or piece) is working, you can implement it within the overall web site.

Classification, Layering, and Layout
I will tell you right up front, I do not subscribe to the MVC (Model-View-Controller), Data-Transfer Objects, Business Entities, or any other type of MODEL. I like the good old standard client-server relationship with n'tiers where my business rules reside in the main middle tiers. I think of the backend, those objects or classes living beyond the middle tiers, as a 3-D object oriented world; like juggling balls, each with its own classification and maybe even distinct namespace. If the front end (the GUI) needs to speak with some object or get some functionality from the backend, typically it is done through the middle tiers. Although there maybe exceptions, the GUI NEVER speaks directly to the back end library objects or classes. That would walk around the layer of business rules. And even though I may not require a business rule for all requested functionality coming from the GUI, if I do not follow this PATTERN of Coding, then I will certainly end up playing the exceptions game for every possible functionality requested from the GUI that may need to change. That is a mouth full. I hope it makes sense to you.

The middle tiers are a central point for application communications where all backend classes meet and where the GUI can make ONE CALL methods to acquire all the funcationality of the backend without direct interaction. This isolates the back end from the front end while making a very nice plateau (class) where I can write intermediate code to form business rules; or just make generic methods that utilize the back end methods as I wish in this web site; or describe the relationships and amount of interaction I wish to allow in the backend between backend classes.

Here is the magic of this layout. You can have many middle tiers, designed for a purpose, grouped by folder location, grouped by namespaces, and distinct to a business process or rule. You should always have a container class that carries the application configuration data and a container class for user security. These classes can be implemented, just like the back end classes, in the middle tier. So there is typically at least one main middle tier with these kinds of implemented classes. This is also the cental point class for error handling and event logging. So if any of the back end classes results in an error, the middle class is informed about, processes it accordingly and notifies the GUI if required. In a winforms application, the instantiation of the middle tier is always available while the program is running. In a web application, you can save the middle tier classes to the session object to carry between pages posting and navigating. In fact I typically implement the main middle tier in such a way that it asks if the class exists in the session object, if so, then get it. If not then implement it new.

For pages that require user login, if the user is not logged into my system, then I redirect (via the middle tier) to the login page. In this way I do not have to rely on the security of IIS, SQL, or other. I decide what pages are available to what group of users and to what degree. If I need to pass critical data between pages (either get or post), I encrypt it. If I suspect that others might like to hack these pages or do a man-in-the-middle attack on my pages, then I devise a security schema that changes per page and checks for verification on every submission so I know origination. If security descriptors do not match, the page is redirected automatically via the middle tier to the login page, default page, or somewhere in the galaxy; including the users own machine via IP address.

In this layout that I call the n-tier-3D Object Oriented Programming, you may add as many middle tiers for processes as you wish or back end functionality as you wish without ever breaking current functionality. And if you stick hard and fast to these design concepts and keep the exceptions to a minimum, I think you too, will find it easily supportable and extensible.

A Bonus... GENERICS
First off, let me tell you that I am a great believer in GENERICS methodology. That is the idea that you may create a method of class that offers some functionality or processing of data while passing a data container class the use for the processing. And I have NO PROBLEMS with the idea of also telling the processing class what type of output object I expect via enumerable choices. So while the List function offered in the System.Collections.Generic namespace is the new method of choice in FRAMEWORK 2.0 (strongly typed because we tell it how to cast the object in the call); I have NO PROBLEMS with ArrayList as long as I, THE DEVELOPER, know what the casted output should be. GEE, I was smart enough as a developer to get to the IDE and start coding... I think I am smart enough to figure out the casting of an object via ArrayList. And actually I find the List functions to be sometimes restrictive for my purposes and coding. YES, I do use them, alot. But I have NO PROBLEMS with ArrayList and find little agreement with those that argue for STRONGLY TYPED methods. The strongly type DataSet with its XML data schema is baggage I need NOT carry around in my pages. If I do not use SQL as my business rules, then I will never have to wait on SQL Server to tell me whether I have requested a valid request before telling my user they can or cannot do some requested function. In my pages, if the user cannot do something, we don't EVER take him to a page to make it available in the first place. That makes it impossible to hack something the user can never see and does not waste CPU on any of the servers waiting for error results to tell the security.

Strongly Typed vs Loosely Coupled
In the textbooks I have read on the topic, any declaration that does not return the type of object, is considered strongly typed because it returns a well defined type. Again referring to the DataSets mentioned above. If you, as a developer, drag a table object from the server explorer view of an available SQL Server database; you end with a Data Transfer Object in your web page (for instance). This operation also creates a couple other files in XML format describing the details of the table, its attributes, and its associated security. And in creating all this information for one data adapter, tightly coupled to the database-table; it is considered strongly typed. Anything else that does not have the associated files and XML information, is considered loosely coupled. Likewise, if something changes about the table after the creation of the DTO (data transfer object), then your page is BROKEN. And the only way to fix it is to go back and repeat the process of creation. While this may or may not be the case for loosely coupled designs depending on how you implemented the coding for coupling.

Now this might be fine for a single page coupled to a table that will NEVER EVER change in the history of this web site, but I would not want this problem across 700 pages in an enterprise web application doing reporting.