It is easy to create a website, but a production-grade website is far more difficult. All of the [app.production] rules apply to production websites, but the following table lists some additional examples of how a robust website can be developed.
|  			 Amateur website  | 
		 			 Production grade web application  | 
	
|  			 None of the pages are compliant with W3C standards  | 
		 			 All pages are W3C XHTML standards compliant where possible  | 
	
|  			 Parts of the site only work on Internet Explorer  | 
		 			 The site handles most major browsers due to its compliance to W3C XHTML standards  | 
	
|  			 The site pushes Javascript to its limits.  | 
		 			 The site uses minimal javascript, only when absolutely neccessary, and when it does so, all browsers are tested and verified.  | 
	
|  			 It is impossible to use the web server in a load balanced environment  | 
		 			 The application can be used in a load balanced environment without software redesign  | 
	
|  			 A fixed deployment domain or IP address is assumed, so if the site is deployed elsewhere, it won't work  | 
		 			 The site is deployment domain agnostic  | 
	
|  			 Site is complex to use because developers invented their own UI  | 
		 			 Site is simple to use because developers consulted with (sensible) UI experts. They created a site that uses common, well-recognized navigation concepts.  | 
	
|  			 The site only works if users click on the usual standard options. Please do not click the [Cancel] button.  | 
		 			 Both sunny and rainy day user activities are covered. Every link on every page works.  | 
	
|  			 Fatal unexpected errors (such as being unable to connect to a database) result in a crash dump screen or a “page not found” screen that the user sees.  | 
		 			 Fatal, unexpected errors result in a nice user screen with an error reference number or at least a “try again later” message.  | 
	
|  			 Each page opens a new database connection for the duration of the request and closes it afterwards. Therefore, it will not scale because it needs a ratio of 1:1 for database connections to concurrent requests.  | 
		 			 The web application uses a connection pool to re-use existing database connections, for performance. Therefore it can have many more concurrent users than there are database connections.  | 
	
|  			 Hackers can use a SQL injection attack to obtain data or drop tables without logging in. This is usually accomplished by entering SQL text in login forms. For example they could type.. ' OR ''=' ..in the password field to make the database do a query: SELECT user FROM usertable WHERE username='fred' AND password='' OR ''='';  | 
		 			 SQL injection is protected against on all fields by explicit detection.  | 
	
|  			 Users can modify the record numbers in the URL to gain access to data that does not belong to them.  | 
		 			 URL rewriting is protected against. Permissions are checked on every request, including form submits. Even if it makes the application a little slower.  | 
	
|  			 Errors and information messages display differently depending on what screen it is.  | 
		 			 Users get the same kinds of errors and information messages across the entire application.  | 
	
|  			 The application relies on the browser back button or javascript back(); for navigating to previous pages.  | 
		 			 A programmatic back button is provided (eg. “<< back to my bills”)  | 
	
|  			 Paginated screens hold open result sets in the database between client requests.  | 
		 			 Pagination does not consume database cursors or result sets.  | 
	
|  			 The application cannot execute without passing variables through to the web client and back again. Server values can be seen as hidden form fields by selecting “view source” on a web page.  | 
		 			 The session is utilized to persist sensitive information between screens.  | 
	
|  			 Javascript is used for navigation. Navigation does not function when javascript is switched off, and.  | 
		 			 All URLs are calculated by the server and are shown as links without javascript where possible.  | 
	
|  			 The site has one server.  | 
		 			 The site uses clustering and load balancing with sticky sessions to manage load.  | 
	
|  			 The server runs only on WebLogic 6.1, using the specific Weblogic extensions and tools that come free with Weblogic licenses.  | 
		 			 The server runs on any application server with minimal tweaking provided it is a compliant servlet container.  | 
	
|  			 User Sessions are loaded full of information. No screen can execute without a session in a finely tuned Session that was created using a number of previous screens. The application memory requirements are huge.  | 
		 			 User Sessions contain hardly any information, perhaps just a flag to indicate if the user is logged in or not. Screens are generally independent, passing small amounts of information back and forth in the request.  | 
	
|  			 A single login does two thousand physical database queries in order to display the first screen.  | 
		 			 A single login does five physical database queries in order to display the first screen.  | 
	
|  			 Class or JSP files are allowed to be changed directly on the production server without updating the source code or having to do a full release. All developers, even those who joined the company a week ago have full write access to production servers and the database.  | 
		 			 The only way to do a release is by following a defined release process from DEV => TEST => STAGING => PRODUCTION. The test team must approve the release. Senior Developers have read-only access to production servers and the database.  | 
	
