Click here to Skip to main content
14,458,109 members

Chris Maunder - Professional Profile


Follow on Twitter LinkedIn      Blog RSS
Chris is the Co-founder, Administrator, Architect, Chief Editor and Shameless Hack who wrote and runs CodeProject. He is also co-founder of Developer Media and ContentLab.IO. He's been programming since the 80's and has been, in various guides, an astrophysicist, bacyard mechanic, mathematician, physicist, breeder of carnivorous plants, hydrologist, geomorphologist, defence intelligence researcher and then, when all that got a bit rough on the nerves, a web developer.

His programming experience includes C/C++, C#, SQL, MFC, ASP.NET, TypeScript and far, far too much FORTRAN. He has worked on PocketPCs, Old mainframes, new Macs, cheap phones, and a CRAY YMP C90 behemoth but finds notebooks take up less desk space.

He is kind to small animals and has a soft spot for cheesecake.

Chris was born and bred in Australia but splits his time between Toronto and Melbourne, depending on the weather. For relaxation he is obsessively into road cycling, physiology, occasionally snowboarding and rock climbing, and wishes he were a storm chaser.
31 Dec 2004 CodeProject MVP 2005

Articles 115 (Legend)
Tech Blogs 0
Messages 35,059 (Master)
Q&A Questions 24
Q&A Answers 88
Tips/Tricks 11
Reference 2
Projects 0
Comments 260


Below is the list of groups in which the member is participating

ASP.NET Community
United States United States
The ASP.NET Wiki was started by Scott Hanselman in February of 2008. The idea is that folks spend a lot of time trolling the blogs, googlinglive-searching for answers to common "How To" questions. There's piles of fantastic community-created and MSFT-created content out there, but if it's not found by a search engine and the right combination of keywords, it's often lost.

The ASP.NET Wiki articles moved to CodeProject in October 2013 and will live on, loved, protected and updated by the community.
Group type: Collaborative Group
This member has Member status in this group

759 members

No Biography provided
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

2 members

The CodeProject focus group is an informal and changeable group of long-suffering CodeProject members willing to give their time and patience to discussing product, branding and marketing ideas with those looking to actually understand what developers think.

To apply to join this group simply hit the "Apply to join this group" button.

To seek the wisdom, guidance, and hopefully a little enlightenment, email and we'll work out a time to discuss your thoughts.
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

39 members

Intel Corporation
United States United States
You may know us for our processors. But we do so much more. Intel invents at the boundaries of technology to make amazing experiences possible for business and society, and for every person on Earth.

Harnessing the capability of the cloud, the ubiquity of the Internet of Things, the latest advances in memory and programmable solutions, and the promise of always-on 5G connectivity, Intel is disrupting industries and solving global challenges. Leading on policy, diversity, inclusion, education and sustainability, we create value for our stockholders, customers and society.
Group type: Organisation
This member has Administrator, Manager, Author, Member status in this group

42 members

The CodeProject Authors are a group of talented technical writers who create articles and whitepapers for some of the biggest companies in the industry. Under our unit we reach out to those who need content written but lack the time, expertise or resources to complete the work.

Looking to earn a little extra and get connected to, and be featured on, the websites of the companies whose technologies you know and love? If you can write well and are efficient with time then send us an email at
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

90 members

CodeProject Advisors
Publisher CodeProject
Canada Canada
The CodeProject Advisors group is comprised of CodeProject members specifically chosen to advise the CodeProject on new products related to helping the community answer technical questions. This group participates in beta testing and feedback of products designed to help connect members with experts.
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

28 members

Advisory Board
United States United States
No Biography provided
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

8 members

The Insider
Publisher The Code Project
United States United States
Sign up to get the news you didn't even know you needed to know in the most valuable 5 minutes of reading of your day.

The Code Project Daily Insider keeps you up to date with what is happening around the industry. From the continue saga of the Big Boys to Scott Guthrie's blog ramblings and Steve Jobs' latest, you will find it here.
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

3 members

The Ultimate Toolbox
Web Developer
Canada Canada
In January 2005, David Cunningham and Chris Maunder created, a new group dedicated to the continued development, support and growth of Dundas Software’s award winning line of MFC, C++ and ActiveX control products.

Ultimate Grid for MFC, Ultimate Toolbox for MFC, and Ultimate TCP/IP have been stalwarts of C++/MFC development for a decade. Thousands of developers have used these products to speed their time to market, improve the quality of their finished products, and enhance the reliability and flexibility of their software.
Group type: Organisation
This member has Administrator, Manager, Author, Member status in this group

466 members

Chinese Forum Moderators
United States United States
No Biography provided
Group type: Collaborative Group
This member has Administrator, Manager, Author, Member status in this group

1 members


For more information on Reputation please see the FAQ.


Members need to achieve at least one of the given member levels in the given reputation categories in order to perform a given action. For example, to store personal files in your account area you will need to achieve Platinum level in either the Author or Authority category. The "If Owner" column means that owners of an item automatically have the privilege. The member types column lists member types who gain the privilege regardless of their reputation level.

ActionAuthorAuthorityDebatorEditorEnquirerOrganiserParticipantIf OwnerMember Types
Have no restrictions on voting frequencysilversilversilversilver
Bypass spam checks when posting contentsilversilversilversilversilversilvergoldSubEditor, Mentor, Protector, Editor
Store personal files in your account areaplatinumplatinumSubEditor, Editor
Have live hyperlinks in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Have the ability to include a biography in your profilebronzebronzebronzebronzebronzebronzesilverSubEditor, Protector, Editor
Edit a Question in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Edit an Answer in Q&AsilversilversilversilverYesSubEditor, Protector, Editor
Delete a Question in Q&AYesSubEditor, Protector, Editor
Delete an Answer in Q&AYesSubEditor, Protector, Editor
Report an ArticlesilversilversilversilverSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending ArticlegoldgoldgoldgoldSubEditor, Mentor, Protector, Editor
Edit other members' articlesSubEditor, Protector, Editor
Create an article without requiring moderationplatinumSubEditor, Mentor, Protector, Editor
Approve/Disapprove a pending QuestionProtector
Approve/Disapprove a pending AnswerProtector
Report a forum messagesilversilverbronzeProtector, Editor
Approve/Disapprove a pending Forum MessageProtector
Create a new tagsilversilversilversilver
Modify a tagsilversilversilversilver

Actions with a green tick can be performed by this member.

GeneralPerformance Tuning Pin
Chris Maunder12-Mar-05 16:49
cofounderChris Maunder12-Mar-05 16:49 
GeneralRe: Performance Tuning Pin
Shog914-Mar-05 9:33
sitebuilderShog914-Mar-05 9:33 
GeneralRe: Performance Tuning Pin
Chris Maunder14-Mar-05 17:05
cofounderChris Maunder14-Mar-05 17:05 
GeneralRe: Performance Tuning Pin
ACorbs15-Mar-05 12:07
MemberACorbs15-Mar-05 12:07 
GeneralRe: Performance Tuning Pin
Chris Maunder17-Mar-05 6:16
cofounderChris Maunder17-Mar-05 6:16 
GeneralRe: Performance Tuning Pin
Chris Richardson23-Mar-05 23:01
MemberChris Richardson23-Mar-05 23:01 
GeneralRe: Performance Tuning Pin
SinbaQL13-Jan-06 2:40
MemberSinbaQL13-Jan-06 2:40 
GeneralDiary of a rewrite: Prioritising efforts Pin
Chris Maunder13-Jan-05 15:46
cofounderChris Maunder13-Jan-05 15:46 
After what seems like weeks of testing, meetings, research, fire-fighting, brawls, quick fixes, and major reworkings we're getting to the business end of site upgrades.

We made the decision to stop trying to keep up with site expansion with incremental upgrades and instead let things ride for a few months while we undertook a major overhaul of our systems. This includes:

0. Testing
1. Upgrading all servers to be running the most efficient platform (in this case Win 2003)
2. Optimising load balancing, session management and network topology
3. Upgrading the physical hardware where necessary
4. Optimising the database schema and queries
5. Moving the ASP legacy code to ASP.NET
6. Ensuring that application logic is efficient
7. Testing. Go to 6.

Before you do anything you need to know where you are. Test. You may find something so blindingly obvious, so simple, that a month of upgrades turns into a day of tweaking or bug fixing.

Step 1 is important, but high load sites ran on Win NT and Windows 2000 for years. Windows 2003 does make things better in terms of process recycling and HTTP compression but we have our own in-house health monitoring processes that can kick a system when its failing, and we use Port 80 Software's HttpZip for compression.

Step 2 is a matter of juggling: you want load to be spread across server but you need to ensure session state is maintained and that in doing so you don't introduce unnecessary chatter across the network. We used to use Windows load balancing and enforce IP affinity so that when a user hit the site they were guaranteed to always hit the same server in any given session. This meant Session state could be managed using the ASP session object. In practice, however, we saw that users tended to cluster on one or two servers leaving the remaining running under capacity. We turned off IP affinity so that requests were spread across different servers within a single session, and rewrote the session handling to use SQL server. With a corresponding session object for ASP.NET we can now work concurrently with the ASP state, meaning we can mix and match ASP and ASP.NET pages with zero fuss. (remind me to post the classes as an article).

The next step is to remove WLBS from the equation and use our firewall for load balancing, freeing up network chatter. Once that is done then step 5 (moving to ASP.NET) will allow us to move seamlessly over to ASP.NET session state removing SQL load and giving a useful perf boost.

Step 3, upgrading the hardware, is a constant battle. We want to scale out but have resigned ourselves to scaling up as much as practical and then relying on the remaining steps to see us through. Hardware is cheap, but it's not a simple equation. There's definitely a sweet spot where two boxes are cheaper and more powerful than 1 single box. But that's double the cost of licences plus man hours in reworking your system to support clustering or replication or partitioning.

For our part we're looking at good, solid hardware for the SQL box. 64 bit processrrs so we can take advantage of new technology, fast SCSI drives with separation of data and logs, and lots of RAM. But again, RAM is cheap. A version SQL server that can handle lots of RAM isn't.

Step 4 is, to me, the second most important step. If your data is stored inefficiently, or if you ask the server for more than you need, or ask in a circuotous round-about fashion that just bogs the server down with needless work then everything's slow. Allow the database to find its data properly, ask it to return as little data as possible, take advantage of connection pooling and keep an eye on locks. And: don't get hung about normalising everything.

Let me give you an example: We have a messages table and a membership table. The messages table has a field that holds the member's ID, and the member's table holds the name and email of the member. To get messages we could do this:

SELECT Messages.Subject, Members.Name <br />
FROM Messages <br />
INNER JOIN Members ON Members.ID = Messages.MemberID

But we have 1.6 million members, and over a million messages posted. That's a big, bad join. So instead we denormalise and store the Member's name, at the time of posting, in the messages table to get:

SELECT Messages.Subject, Messages.Name FROM Messages

The data is old, but it doesn't matter. At the very worst we can have a background process go through and update the Messages.Name field based on changes to Member.Name.

The golden rule is that data is always old. Denormalise and cache where you can get away with it.

Step 5, upgrading to ASP.NET, is more for the convenience of being able to plug in new features easier, as well as getting the benefits of ADO.NET over ADO. It also allows us to rework many of the basic algorithms we're using in order to use and access data more efficiently and better manage caching.

ASP.NET runs faster than ASP, but we're not webserver limited, we're database limited.

It's step 6 that is the most important. It doesn't matter how fast your hardware is, or how clean your database schema, or how much optimisation you do. If, fundamentally, you're approaching the problem from the wrong angle then this could overshadow all other efficiencies made, time spent and money burned.

The best way to make a database run faster is to stop asking it dumb questions. Do you really need all that data? Do you really need to expose functionality that may be nice, but is horrendously expensive? Do you really need to keep asking for the same data or can you cache it on the webserver? Do you need to get data one piece at a time or can you save up your queries and get the response back in one hit?

A great example of the benefits of this is caching for the forums. We estimate the read to write ration in the forums to be around 100:1 to 1000:1, so over the last 2 days I implemented quick n' easy ASP caching system (again, remind me to post this) that allows a forum to cache the first N messages, only clearing this cache after 10 minutes or after a post is added or deleted. Previously at extremely high load it could take over 10 seconds (or result in a timeout) to view the first page of a forum. With the change it now took 0.1 seconds.

Make sure the manner in which you approach a problem is sensible and that you haven't overlooked something obvious. Make sure you allow the systems handling your applications to have the best chance possible at running efficiently. Where possible and practical, take advantage of systems such as inbuilt connection pooling, efficient load balancing, session state, compression, web caching (both client and server), data caching (both web server and database server).

If you do this then you're most of the way there. You can get easy perf boosts if you have the opportunity to upgrade server hardware and use the latest server software. Once you've done the obvious then test and profile and then dig in and attack the bits that are broken.

Chris Maunder
GeneralRe: Diary of a rewrite: Prioritising efforts Pin
Mike Dimmick20-Jan-05 1:16
MemberMike Dimmick20-Jan-05 1:16 
GeneralRe: Diary of a rewrite: Prioritising efforts Pin
Mike Dimmick2-Feb-05 4:32
MemberMike Dimmick2-Feb-05 4:32 
GeneralRe: Diary of a rewrite: Prioritising efforts Pin
Chris Maunder2-Feb-05 16:52
cofounderChris Maunder2-Feb-05 16:52 
GeneralWhat's been happening here? Pin
Chris Maunder21-Dec-04 0:33
cofounderChris Maunder21-Dec-04 0:33 
GeneralRe: What's been happening here? Pin
Brian Delahunty21-Dec-04 5:33
MemberBrian Delahunty21-Dec-04 5:33 
GeneralRe: What's been happening here? Pin
Shog912-Jan-05 6:17
sitebuilderShog912-Jan-05 6:17 
GeneralDecisions, decisions Pin
Chris Maunder12-Dec-04 15:11
cofounderChris Maunder12-Dec-04 15:11 
GeneralRe: Decisions, decisions Pin
Michael P Butler12-Dec-04 22:43
MemberMichael P Butler12-Dec-04 22:43 
GeneralVS.NET Debug issues + new features Pin
Chris Maunder11-Dec-04 19:10
cofounderChris Maunder11-Dec-04 19:10 
GeneralRe: VS.NET Debug issues + new features Pin
Paul Watson12-Dec-04 6:18
sitebuilderPaul Watson12-Dec-04 6:18 
GeneralHardware manufacturers and their drivers Pin
Chris Maunder9-Dec-04 15:07
cofounderChris Maunder9-Dec-04 15:07 
GeneralSQL graveyard Pin
Chris Maunder2-Dec-04 15:05
cofounderChris Maunder2-Dec-04 15:05 
GeneralRe: SQL graveyard Pin
Brian Delahunty3-Dec-04 0:23
MemberBrian Delahunty3-Dec-04 0:23 
GeneralRe: SQL graveyard Pin
Chris Maunder3-Dec-04 4:04
cofounderChris Maunder3-Dec-04 4:04 
GeneralRe: SQL graveyard Pin
Brian Delahunty3-Dec-04 4:36
MemberBrian Delahunty3-Dec-04 4:36 
GeneralClick here if you get an empty page Pin
Chris Maunder18-Oct-04 2:11
cofounderChris Maunder18-Oct-04 2:11 
GeneralRe: Click here if you get an empty page Pin
ELY M.6-Nov-04 1:53
MemberELY M.6-Nov-04 1:53 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.