Right now, programmers have it pretty good. Tools have evolved to the point where even pre-beta CTP languages have great environments to work in, and the community aspect of coding has been emphasized such that any developer has resources that they can turn to when they encounter some quirk in a language. Of course, there are still plenty of quirks to be found. This transparency and direct access to the pre-beta bits means that developers can get started with something like cloud computing with Azure, see if it does what they want, and be ready to run with it when the final bits are released. It also means that you’ll likely have to re-work some of your code when a better way to do something replaces the way you were doing it, or a security concern is raised that you then have to comply with.
My first project had a very tight release window. We were releasing a new version of another software that it would be bundled with, and that release date was set. My project was making use of C# 2.0 and SQL Server 2005 Express, both of which were planned for release within weeks of the launch date of the other software package. Microsoft had given a “Go-Live” license, which meant that while the code might change, and certain things be deprecated, it would still be available in the language, so nothing should break in the project. I kept up as best I could with the changes that were going to be made, and only had a few updates after they launched, most of which I didn’t strictly have to change, as they were only giving me warnings, not true errors. Overall, I’ve had a good record with working with pre-release software lately. It does require you to stay on top of things, though, and have a willingness to rewrite your code if it comes to it.
If you’d rather not take the chance though, there’s loads of languages that you can pick that are a bit more tried and true. Personally, I appreciate living on the cutting edge and being able to take advantage of the new features they present.
Programming conventions are important, even when if you’re the only developer on a project. When you’re right in the middle of writing some code, you totally understand what you’re doing. You can list off the variables you’re using, how you’re going to put everything together, and most importantly, why you’re doing it. When you come back months later, you’re no longer in that state of mind, and suddenly it seems like the you of three years ago had no idea what they were doing, because now you can’t understand the code at all. Even worse, though, is when you’re working on a project with a team, and your team isn’t following the same conventions. In one of the first projects that I worked on, the programmer would create a variable that was going to be used temporarily for something, and since it was never going to be used outside of the scope of a private method, he would name them something inane, like bleh or blah. I actually ran across a method that used the variable names temp, blah, bleh, blegh, and blagh. One of my tasks as junior developer was to go in to these methods, figure out what they were used for, and name them something that actually made sense.
Luckily, there are some great resources out there to get you started on developing your projects coding standards. I based my standards off of a document put out by Joel Spolsky while he was working with a group of interns on the project that was to be CoPilot. Since then, one of my coworkers clued me in to a great pair of documents on VB and C# coding standards. I don’t agree with everything in them, but I don’t think you’re expected to. It’s mostly used as a starting point to get your own standards rolling.
The choice of the programming language you use for a project has the potential to help or hinder your progress greatly. For a new project, you have the luxury of examining the project’s requirements and choosing a language that fits. However, many development jobs out there deal with legacy code, meaning that this choice has already been made. As I mentioned in my previous post, my first professional development job was working with legacy code that was written in Visual Basic 6. I was chosen for this position based on my experience with VB6, since that would mean that I would have less time ramping up on the language, and more time getting right into the code. As the book points out, familiarity with a language can have huge benefits in productivity. My experience tends to agree with the idea that it takes around three years to get truly familiar with a language, though knowledge with a similar language can cut this down quite a bit.
One of the great things about VB6 was that it was such a high level language, it read a lot like English. If you named your variables right, you could tell exactly what a block of code was doing. Some things, though, just weren’t present in the language, and so were made very difficult to access, often requiring direct calls to the Windows API. This difficulty reminded me of the book 1984, and the concept of Newspeak. The idea behind Newspeak was to remove the ability of the general population to think of concepts like freedom and rebellion by removing the words that describe them. Without the words, it is very difficult to express something, or even to think that it would even be possible to describe.
If you aren’t familiar with some of the languages presented in the last part of this section, you should take a moment and read up on them. Wikipedia has a great set of resources about programming languages, and if you’re interested in seeing some of them in action, head on over to 99 Bottles of Beer, a website that currently contains 1281 different programming languages and variations. A couple of languages that you absolutely do not want to start a project in are Cow, and Whitespace. Check them out, and you’ll see why.
Code Complete, takes me back to the days when I was in the trenches, slinging code. My first job in the industry was working as a software developer for a very small software company, where I started off as a junior software developer maintaining legacy code in Visual Basic 6. When the company failed at an attempt to develop an online directory application in .NET, falling short on both deadlines and requirements, it was scrapped. This left management unhappy with new development and with developers in general. I was eventually able to convince management to give it another go by taking on full responsibility for a project, which gave me a change to experience project management first hand. Since that time, I’ve worked on a couple of other projects, and have kept up with technology through books, classes, and user groups.
While Hilary is away, I will be leading the conversation around the Technical Book Club, and will try to include as much of my personal take on the topics we will be covering. I hope that this will help to expose the relevance for the topics as we encounter them. I look forward to communicating with you through this blog, and hope that you will let me know how I’m doing as we progress.
This week, I will be covering Chapter four, Key Construction Decisions, which covers the following topics:
Choice of Programming Language
Programming Conventions
Your Location on the Technology Wave
Programming into a Language
Selection of Major Construction Practices
Consider getting a call from someone to ask if you can send them a dress. When you hang up you realize that in the context of the situation you assumed it was “a dress” but later you realize that there was some ambiguity and perhaps they meant “address”. Software projects have confusion like this at every level, how do you ensure you’re on target?
Carefully defining problem and requirements ensure you’re software solution is on target. As Code Complete puts it: “Know what you’re aiming at before you shoot” and “don’t miss the mark on specific aspects of the problem”.
While these aspects focus on the right problem, architecture ensures that software construction focuses on the right solution. This section focuses on the many aspects that are commonly found in good architecture documents.
- Program Organization
- Major Classes/Hierarchies/State Transitions
- Organization of Data
- Business Rules and Design Impact
- User Interface (UI) Design
- Resource Management
- Security
- Performance
- Scalability
- Interoperability
- Internationalization and Localization
- Input and Output (I/O)
- Error Processing
- Fault-Tolerance
- Core Decisions and Decision Processes such as:
- Feasibility
- Buy vs. Build
- Reuse
- Change Strategy
Let’s consider a few examples and how these core architectural pieces have a downstream effect on software construction.
Example 1: Software for High School Class
Ed’s SWC is constructing an application for a high school class to learn about and create research reports. When scoping out his architecture he didn’t include a section on the permissions/entitlements that a user would need to run the application. His development team assumed that the user of the application would have administrative privileges on the machine. The developers took license to launch process only available to an administrator. Luckily when they tested a prototype for the high school class, they discovered the reduction in privileges and were able to make the update before their initial release.
When the class used the first release of the product, they discovered that certain searches used keywords that were blocked by the high school systems. Searches such as the XXXI Olympics caused the program to crash due to the restriction of XXX content for high school students.
What critical piece was Ed missing from his Architecture to address these problems earlier in the software development lifecycle?
Example 2: Voice-enabled timesheet application
Sherry was working with her local governor's office to create a timesheet application. She visited the office to talk with some of the temporary employees who would use the application. Upon her visit she discovered that many of the workers had poor eyesight and would rely on the voice-enablement of the application for guidance. She included this in the problem definition. Which architecture elements are critical in addressing this requirement?
Answer 1: One key aspect of this architecture will be the ability for errors to be read off to the users. This requires that all error statements be enclosed in separate text documents for the voice engine to effectively process the error messages. This is a key architectural component that would cost a lot to change if it was not addressed by both the problem definition, requirements and architectural documents.
What other architectural elements are critical for this requirement?
Spend your summer with Software for Students’ Technical Book Club to give yourself a competitive edge in the job market:
Great clip from The Daily Tube: Remember life before Facebook, Twitter, what about before ‘the internet’? Tom Brokaw introduces America to the Internet --- including an
exchange with Bill Gates --- during the early 1990s.
Steve discusses costs associated with iterative and sequential development approaches. He presents many good best practices and charts in Chapter 3 worth reviewing but comes down to these 6 factors that influence software methodology for the project.
Deciding between a mix of iterative and sequential techniques can hinge on the following:
- stability of the requirements
- clarity of the design
- development team’s familiarity with the applications area
- how much risk the project contains
- importance of long-term productivity
- cost of changing requirements, design, and code downstream
For most software projects, having some degree of iteration is valuable. Here are a couple scenarios I’ve seen. Would you choose an iterative or sequential approach for these projects? How do you rank them according to the above criteria?
1) A large company is interested in exploring up and coming web initiatives. They decide to create a mash-up tool. The team contains a handful of programmers that are all familiar with JavaScript, web services, with an average of 3 years experience.
2) A small automation engineering firm is hired for a project to automate the paint production process. Currently this process is completely manual, but very functional. The steps are well understood. The team consists of a number of specialists including a UI specialist, customer consultant, Database Administrator, and 2 teams of programmers.
3) A company is embarking on the 3rd release of a timesheet application. This release will focus on a prioritized set of feedback provided from their user base, including incorporation of web services. The team contains a group of members from the last release and a new team they acquired from banking.
Spend your summer with Software for Students’ Technical Book Club to give yourself a competitive edge in the job market:
Help!! I permanently deleted an email I need, I need to find an email I deleted, how to restore a deleted email. If you’re in trouble, here’s a quick solution for retrieving email from the dumpster in Outlook 2007.
When you delete an email from one of your folders it first goes into the Deleted Items folder. To permanently delete an item, it has to be deleted from the Deleted Items folder and is sent to the dumpster. If you’ve sent an important item to the dumpster, hope is not lost. You can restore the items using the following procedure:
1. Highlight the folder that originally contained the item. (If you’re not sure which folder, than you have to repeat these steps for each possible folder). In this example, we’ll restore something to the Inbox.
2. From the menu bar choose Tools –> Recover Deleted Items. Keyboard shortcut (hold down ALT and press ‘t’ and then ‘t’ again)
3. A window will pop up with the most recently deleted items:
4. Highlight the message you want to restore and select the icon with a message with an arrow on top, ‘Recover Selected Items’
5. To restore multiple messages, hold down ‘CTRL’ and select the items you want to restore
This came in handy for me when one of my rules got corrupted. Hope this helps, Happy mail finding!
The next sections are fairly straight-forward. Here’s a summary of some of the keypoints:
- Without a good problem definition, you might spend a lot of time solving the wrong problem … and never solve the right one.
- Requirements enable the user to agree/disagree before programming begins, which keeps the programmer from making decisions while programming and the cost of changes low.
- 25% of change in requirements accounts for 70-85% of the rework on a project
Cost of errors in requirements detected in
- the requirements stage: 1 unit
- the architecture stage: 3 units
- the coding stage: 5-10 units
- system test: 10 units
- post-release: 10-100 units (closer to 10 for smaller projects with low overhead)
How to best accommodate changes in requirements:
- ensure high quality requirements
- be transparent about the cost of requirement change
- have a change-control procedure
- choose a development approach that is a good fit for the project
- dump the project
- keep a business focus
Your Turn: Here’s an example project, what improvements would you suggest to improve the project?
Company WebsitesRUs creates websites and recently completed the first revision of a website. The website is ready to launch for the target deadline in 2 weeks. They meet with the customer for their first review of the website. The website creates a stream of family/friend information for recovering surgery patients to catch up on the time they missed.
The customer is excited at their work and after the meeting 8 different emails are received by the company with 24 requests for changes. Sarah receives the messages and is overwhelmed by both the response and the number of requests. She knows the work requested would require significant re-work and would take 6-8 weeks to complete.
Spend your summer with Software for Students’ Technical Book Club to give yourself a competitive edge in the job market:
The How Do I? Series has extended their reach to YouTube with their DeveloperVideo Channel. This is a great one-stop shopping for short how-to videos on whatever your interested (or stuck on) for the moment. They have a number of series of videos to grow your knowledge on specific developer tasks like ASP.NET AJAX. Here are a couple to check out:
How Do I: Get Started with LINQ
How Do I: Create and Run Unit Tests in Visual C++?
In answer to the question from last week’s section, according to Code Complete, software construction can account for up to 65% of the total project cost!
One of the challenges we all face is working on a team with others. Typically others on your team will have a different background and set of expertise than you, which is even more true when it comes to technology. As students, you may be introduced to concepts that weren’t even around when your co-workers were in school. Chapter 3 focuses not only on the importance of pre-requisites in the software process, but also how to influence and educate others around you about the development process.
Steve recommend’s these key strategies for influencing your team:
- Appeal to Logic
- Appeal to Analogy
- Appeal to Data
The last one is particularly useful. As developers, we have two challenges:
1) Our first inclination isn’t to think about budgets or the cost of software development. This is a huge decision factor, however, for managers and others who are evaluating the risk and cost associated with a software project.
2) Let the coding begin! We like to dive in and get coding, managers like to see coding because it looks like progress. Everyone tends to view things ‘running’ as measurable progress. As described in chapter 3, this phenomenon is know as WISCA or WIMP syndrome. Why Isn’t Sam Coding Anything? Why Isn’t Mary Programming?
High quality practices and prerequisites reduce cost, risk, and frustration. The remainder of this chapter discusses how to determine if you have established the right prerequisites for your project.
Pop Quiz from Code Complete:
Technorati Tags: books, software, School, Microsoft
Random .NET Ramblings talks about Terrarium, a game created to learn .NET programming. He used this game at UCSD to get students a head start with .NET.
“Back in the day Microsoft created a code base to be used to help people learn .NET programming. The format was a cool game called Terrarium, the concept was that using .NET code you would build creatures of different types. You had to build each creature within a range of specifications if your animal met the specifications you could put in in to the Terrarium environment and see how it manages with the goal that your creatures take over the Terrarium.
…
If you want to learn .NET or know someone who dose you might point them to the new version on CodePlex. The URL is http://www.codeplex.com/terrarium2, just don’t get too sucked in to it! :)”
Thanks for the great post! and thanks Bill Simser for supporting this project. Bill is a Microsoft MVP and blogs about Terrarium and many other .NET experiences.
The release of ASP.NET MVC Preview 3, included improved support for NUNIT Templates. A Coder’s Life walks through a tutorial on How to setup NUnit with Visual Web Developer Express 2008 edition using ASP.NET MVC 1.0.
Read the full article here which includes links to all the software which is free!
If you’re not quite up to date with all this technology, start with some how-to videos to get started with Visual Web Developer Express 2008.
Pictures of technical moms with their pictures are starting to arrive! Check them out at:
http://oreilly.com/go/techmoms
O’Reilly is collecting pictures of Technical Moms for their O’Reilly Mother’s Day Page and discount. Take a pic with your O’Reilly books and send it into press@oreilly.com.
Read this great story about
O’Reilly responding to my Tweet and celebrate Mother’s Day with a 40% discount on tech books at
http://oreilly.com Here’s my picture with some of my O’Reilly books! I always wonder how they pick the animals for the front covers.
Technorati Tags: Mother’s Day, Women in Tech
Our Technical Book Club is underway with our first book Code Complete, but it’s never too late to join! Some people have written to ask how to get involved, so I thought I’d pull together a post.
- Buy, beg, or borrow: Code Complete: A Practical Handbook of Software Construction 2nd edition
- Subscribe to the blog via RSS (or favorite this page): http://feeds.feedburner.com/SpringboardFromMortarboardToOnboard using Outlook, Google Reader, or anywhere you follow feeds. RSS provides the blog posts to you when they are posted.
- Read along. I’m starting at a pace of one chapter a week, although the first chapters are shorter.
- Each Thursday I’ll post an entry summarizing some of the main points from the chapter and asking some questions. Read over and let me know what you took out of the chapter.
- Post comments. I love to hear what you’re thinking as you read through. We all have different experiences with software and different points of view.
Having trouble? Email me and I can help
We’re just getting started, please join in you haven’t missed anything yet. Here are the posts so far: